机器学习算法从数据中学习。为你想要解决的问题提供正确的数据至关重要。
即使你有好的数据,也需要确保它的尺度、格式都有用,甚至包含了有意义的特征。
在这篇文章中,你将学习如何为机器学习算法准备数据。这是一个很大的主题,本文将涵盖其要点。
通过我的新书《机器学习的数据准备》来**启动你的项目**,书中包含了所有示例的*分步教程*和*Python源代码*文件。
让我们开始吧。

海量数据
照片归属于 cibomahto,保留部分权利
数据准备过程
你在处理数据时越有纪律,你可能获得的结果就越一致和越好。为机器学习算法准备数据的过程可以总结为三个步骤:
- 步骤 1:选择数据
- 步骤 2:预处理数据
- 步骤 3:转换数据
你可以线性地遵循这个过程,但它很可能是一个包含许多循环的迭代过程。
想开始学习数据准备吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
步骤 1:选择数据
这一步涉及从所有可用数据中选择你将要使用的数据子集。人们总有一种强烈的愿望,想要包含所有可用的数据,认为“越多越好”的格言是成立的。这可能成立,也可能不成立。
你需要考虑你实际需要哪些数据来解决你正在处理的问题。对所需数据做出一些假设,并注意记录这些假设,以便以后需要时可以进行检验。
以下是一些问题,可以帮助你思考这个过程:
- 你可用的数据范围是什么?例如,时间跨度、数据库表、连接的系统。确保你清楚地了解所有可以使用的资源。
- 你希望拥有但目前没有的数据是什么?例如,未记录或无法记录的数据。你或许能够推导或模拟这些数据。
- 解决问题不需要哪些数据?排除数据几乎总是比包含数据更容易。记下你排除了哪些数据以及原因。
只有在小型问题中,比如竞赛或玩具数据集,数据才已经为你选好了。
步骤 2:预处理数据
选择数据后,你需要考虑如何使用这些数据。这个预处理步骤旨在将选定的数据转换成你可以使用的形式。
三个常见的数据预处理步骤是格式化、清洗和采样。
- 格式化:你选择的数据可能不是适合你使用的格式。数据可能在关系数据库中,而你希望它是一个平面文件;或者数据可能是一种专有文件格式,而你希望它在关系数据库或文本文件中。
- 清洗:数据清洗是移除或修复缺失数据的过程。可能存在不完整的数据实例,它们不包含你认为解决问题所需的数据。这些实例可能需要被移除。此外,某些属性中可能包含敏感信息,这些属性可能需要进行匿名化处理或从数据中完全移除。
- 采样:可用的选定数据可能远远超过你的需要。更多的数据可能导致算法运行时间更长,以及更大的计算和内存需求。你可以从选定的数据中抽取一个较小的代表性样本,这对于探索和原型化解决方案可能会快得多,然后再考虑整个数据集。
你用于处理数据的机器学习工具很可能会影响你需要执行的预处理工作。你很可能会重新审视这一步。

如此多的数据
照片归属于 Marc_Smith,保留部分权利
步骤 3:转换数据
最后一步是转换已处理的数据。你正在使用的具体算法和问题领域的知识将影响这一步,在你处理问题的过程中,你很可能需要重新审视对预处理数据的不同转换方式。
三种常见的数据转换是缩放、属性分解和属性聚合。这一步也被称为特征工程。
- 缩放:预处理的数据可能包含具有不同尺度混合的属性,例如美元、千克和销售量等各种数量。许多机器学习方法喜欢数据属性具有相同的尺度,例如对于给定特征的最小值和最大值在 0 和 1 之间。考虑你可能需要执行的任何特征缩放。
- 分解:可能有些特征代表一个复杂的概念,当将其拆分为组成部分时,对机器学习方法可能更有用。一个例子是日期,它可能有日期和时间部分,而这些部分又可以进一步拆分。也许只有一天中的小时与所要解决的问题相关。考虑你可以执行哪些特征分解。
- 聚合:可能有些特征可以聚合成一个单一的特征,这对你试图解决的问题更有意义。例如,可能存在客户每次登录系统的数据实例,这些实例可以聚合成登录次数的计数,从而可以丢弃额外的实例。考虑你可以执行哪种类型的特征聚合。
你可以在从数据中工程化特征上花费大量时间,这对算法的性能非常有益。从小处着手,并在此基础上发展你学到的技能。
总结
在这篇文章中,你了解了为机器学习准备数据的精髓。你发现了一个包含三个步骤的数据准备框架以及每个步骤中的策略。
- 步骤 1:数据选择 考虑哪些数据可用,哪些数据缺失,以及哪些数据可以被移除。
- 步骤 2:数据预处理 通过格式化、清洗和采样来组织你选择的数据。
- 步骤 3:数据转换 通过使用缩放、属性分解和属性聚合等特征工程方法,转换预处理数据,为机器学习做好准备。
数据准备是一个庞大的课题,可能涉及大量的迭代、探索和分析。精通数据准备将使你成为机器学习大师。目前,在准备数据时,只需考虑本文中提出的问题,并始终寻找更清晰的方式来表示你正在尝试解决的问题。
资源
如果你希望深入研究这个主题,可以在下面的资源中学习更多内容。
- 从数据挖掘到数据库中的知识发现, 1996
- 使用开源工具进行数据分析,第一部分
- 黑客的机器学习,第二章:数据探索
- 数据挖掘:实用的机器学习工具和技术,第七章:转换:输入和输出的工程化
你有什么数据准备过程的技巧和窍门吗?请留下评论分享你的经验。
Jason,我喜欢你简洁的概述。
也许你可以稍微深入探讨一下你第二步:清洗阶段中的危险/机遇。
根据我的经验,那些你可能想移除的数据,往往包含了客户更感兴趣的数据(可能只有在解决了客户提出的问题之后才会发现)。
Fraser
嗨,Fraser,好问题。
确实,很难判断数据是否是坏数据,而且你身边不一定总有领域专家可以提供意见。但有时情况很明显,比如在血压这样的领域中不可能出现的 0 值。我也见过用 -999 来表示“未提供”。在这些情况下,我们可以将属性标记为缺失,并考虑是否需要制定规则来填充这些值。
但界限在哪里呢?严重的异常值应该被标记为缺失吗?有时是这样。我喜欢尝试很多方法,例如,我会尝试移除某个维度上具有大异常值的实例,看看这会对我的模型产生什么影响;我也会尝试移除有缺失值的实例,并在填充了值的不同数据变体上尝试模型。几乎总是,建模的最终目标不是还原真实情况,而是优化像分类准确率或 AUC 这样的性能指标。
不过你说得对,有时损坏的数据可能代表着非常有趣的事情——这些异常本身就预示着领域内某些有用的信息。
是的,确实如此。它是一个异常值,还是一个编码错误的结果,或是一个校准异常的结果,或者它代表了一种独特而真实的自然条件组合……
我经常处理水和沉积物中的化学浓度数据,并且经常遇到审查数据。大部分来自 1000 mg/L。这种特定类型的审查数据由不同的人以不同的方式处理,正如你所建议的,如果一个多参数时间样本结果的其余部分要保留在分析中,就需要对值进行插补(使用适当的抽样分布)。
对我来说,这就是数据分析的乐趣所在。
我刚来到你的网站,看到了很多感兴趣的文章。谢谢你提供这些内容。
Fraser
我上一条帖子里的尖括号用法丢失了。
“主要是‘小于’.01 pg/L 类型,但偶尔也有另一面,比如‘大于’1000 mg/L。”
Fraser,你的评论很有见地,谢谢。如果你想在一个难题上交流想法,随时联系我。
谢谢,Jason。我会的。Fraser
我喜欢“精通数据准备将使你成为机器学习大师”。这确实是一篇好文章。
谢谢 Jason 博士。
能分享一下这篇文章的链接吗?
我相信 Surajit 引用的是这篇文章的内容。
一系列很棒的文章!
我遇到的一个问题是数据有时缺乏语义完整性。这不是缺失值的问题,而是存在不恰当的值。当一列中的值有不同的数据类型时,很容易检测和修复。
然而,当数据类型相同但含义改变时,问题就变得困难得多。例如,我见过销售数据中,一个名为‘营销计划代码’的列本应是字符串类型的营销计划代码,但在少数情况下,用户输入了供应商代码,因为他们没有其他字段来记录该信息。
关于这个问题有什么见解和轶事吗?
嘿,你能给我发送机器学习中轴向荷载下钢管混凝土柱的数据吗?
Jason,如果在准备过程中,我将行列表(比如表格,其中关键列重复出现)转换为数据透视表,其中关键列只显示一次,而大量的列(比如数百列)包含不同条件下的部分总和或计数(比如一月的销售额在一列,二月的销售额在第二列,依此类推),这会影响算法吗?
这会导致多重共线性吗,因为有些列可以聚合成一列?
感谢您在这个重要领域——机器学习——提供了宝贵的信息,从数据结构开始,并进一步构建使其完整。
我如何在数据集中将一个属性设为决策属性,以便分类模型依赖于所选的属性?
嗨,Ali,
不同的算法会选择使用哪些变量以及如何使用它们。你可以通过删除所有其他变量来强制模型使用一个变量。
嗨,Jason,
感谢您为这篇精彩文章付出的努力。
我目前正在处理一个政府数据集项目,目的是确定一个实体(个人或个体)是以积极还是消极的方式参与其中。我使用了一个包含一些测试数据的平面文件,并准备了代码,利用 NLTK Python 模块的朴素贝叶斯算法进行情感分析。
– 在大多数情况下,我们有一个已定义的训练数据集,标记为‘积极’或‘消极’(例如电影评论、推特数据集)。但在我的案例中,没有现成的已训练的政府数据集。
-- 训练数据是有的,但我需要将训练数据集分类为‘积极’或‘消极’。
-- 我这里的问题是,我们如何将我的政府数据分类为‘积极’或‘消极’。
我期待您就如何将我的政府训练数据分类为积极或消极提供建议。这对我以最高可能的准确度进行情感分析至关重要。
嗨,Avin,我建议你找一位主题专家来为你准备一个高质量的训练数据集(手动分类)。
处理大量数据进行机器学习的最佳方法是什么?
嗨,Mayur,
这取决于问题以及数据当前的表示和存储方式。没有万能的解决方案,抱歉。
我目前和第一个机器学习项目的输入是自然语言,我花了大量时间来准备它。
一旦数据达到一个“合理”的水平,我就停下来了,以便可以继续项目,也就是说,我放弃了那些难以解析的案例,可能会在整个流程准备好测试后再回来处理它们。
牢记 80/20 法则。
干得不错,Ivan。
感谢您宝贵的帖子,我的问题是如何将机器学习应用于癌症登记数据集?
我有两个数据集
1. 数据集1
大约 18000 条观测记录和 22 个变量:这五年期的数据集包括
人口统计学、诊断和治疗,
2. 数据集2
基于种族分组的汇总生命体征:按地区、分期、生命体征
感谢您的帮助
Ted
Ted,很好的问题,看看这个流程,它能帮助你解决你的问题。
https://machinelearning.org.cn/start-here/#process
嗨,Jason,感谢您在所有这些帖子中投入的巨大努力和知识!
我的问题可能很傻,但既然我是一个完全的新手,我还是会问。
数据准备、特征分析和工程会让你得到一个与原始数据格式完全不同的数据集。这些数据转换步骤可能很难自动完成。我的问题与分类有关,我正在使用神经网络,这可能不是最佳选择,但嘿,就当是满足我吧 😉
所以,长话短说。最初,我得到原始数据,我对其进行准备和转换。转换后的数据将用于训练和测试“我的”神经网络。现在,“现实世界”将用原始数据来挑战我的模型,这些数据大概与我的原始训练集格式相同,只是没有分类(当然……)。现在,我想我必须在训练好的模型被输入数据之前,对数据进行同样的数据转换。对吗?这是否意味着必须格外小心,以使数据转换过程(至少在理想情况下)本身是自动的?
抱歉问题有点长,希望能听到您对这些观点的看法。再次感谢您!
很好的问题,José!
是的。任何在用于拟合模型的数据上执行的数据转换,都必须在进行预测时对数据执行。
这意味着我们需要一个非常清晰的转换方案,最好是自动化的,并且在回归问题中,它必须是可逆的,这样我们才能将预测转换回它们的预测尺度以供使用。
非常感谢你,Jason。请继续你出色的工作!
谢谢,José。
学习如何为机器学习模型准备数据集的最佳书籍是什么?
我想建议一下,在您“选择数据”的主题中,可以提供更多关于评估和表征数据质量的明确指导。虽然是老生常谈,但“垃圾进,垃圾出”是一个基本概念。我经常遇到一些高级分析项目,它们一开始就对“选定”数据的质量做了假设,然后就继续推进了——结果几个月后才发现,一切都得回到数据采集和管理的基本原则上重新开始。
在你选择的数据库之前的系统对源数据应用了哪些转换?
如果涉及到传感器数据,那么应用了哪些格式化、精度、转换、信号处理等?
如果数据是从多个异构系统获取的,那么你选择的数据库系统掩盖了哪些格式、尺度和精度的差异?
仅举几个例子。
Eric,你说得很有道理。
很难就数据准备给出普适性的建议,因为具体数据的细节都很重要。
这不像算法,你可以说“尝试所有方法,看看哪个在你的数据上效果好”。
我们如何将预处理过的数据保存到数据库中,以及如何使用这些数据来训练模型。
你可以把它保存到CSV文件中。Pandas 和 Python 标准库提供了实现这个功能的函数。
保存情感数据,使用 csv 是更好的方式,还是使用一些 nosql 数据库来存储?
没有最好的方法。也许选择一个最适合你项目的方法。
先生,请给我推荐一个使用深度学习进行推特情感分析的方法。
也许这个教程能帮助你入门
https://machinelearning.org.cn/predict-sentiment-movie-reviews-using-deep-learning/
嗨,Jason,
当我浏览 UCI 机器学习库时,出现了以下疑问:
1. 在自行车共享数据集中,我看到了两个.csv文件(一个是day.csv,另一个是hour.csv)。所以,我不明白如何使这个数据集适合我,以便在其上应用机器学习算法,通过将整个数据集拆分为训练集和测试集来构建预测模型?
2. 在这个仓库里,我看到数据集的特征被描述为多变量和单变量,这是什么意思?
3. 在这个仓库里,每当我探索任何一个数据集时,都没有说明提到通过应用机器学习算法要预测哪个特征?
4. 如果数据集中任何一个特征同时存在两种数值类型(浮点型和整型)的值,我们应该将特征值(整型)缩放到浮点型以获得更好的预测模型吗?
请帮忙解答……
每个数据集都是不同的。你需要小心并探索如何准备每一个。
单变量指一个变量、特征或列(都是一回事),多变量指多个。
你可能需要检查数据或阅读相关论文。
根据所使用的算法,你可能需要将所有特征转换为数值型。
那么,这意味着我们必须将数据集中所有特征的整数值转换为浮点值,以提高我们模型的准确性吗?如果我错了,请纠正我。
如果一个数据集中有两个 .csv 文件,你认为我们应该如何准备这种类型的数据集?请给我推荐一种方法。
谢谢…
也许吧,这取决于所使用的算法。我建议你试一试。
如果有两个文件,我建议将数据合并到一个文件中。
你好 Jason,
当我在UCI机器学习数据集中看到自行车共享数据集时,UCI将其数据集特征描述为单变量,尽管它总共有16个特征(列)。为什么会这样呢?难道不应该是多变量吗?
其次,正如您建议的将两个.csv文件合并成一个,但当我使用这个数据集时,我注意到两个文件都有相同的特征(除了hr(小时)只在hour.csv文件中有,而day.csv文件中没有),并且每个相同特征在两个文件中的值都不同。在这种情况下,如果我合并这两个文件,值会变得冗余,特征也是如此。那么,您建议在这种情况下我该如何准备我的数据集呢?
感谢您对上一个问题的快速回复……
也许他们只根据输出变量来定义单变量。
抱歉,也许我没有足够的信息来给你关于如何准备数据的好建议。
感谢您在这个主题上的帮助,但请您在知道如何准备这类数据集的时候,也告诉我或向我推荐一下。
非常感谢您通过创建这篇精彩的文章来指导我如何准备任何数据集。
如果我使用的数据不服从正态分布会怎么样?
有些机器学习算法是否只适用于假设为正态分布的数据?
我如何识别一个算法是适用于正态/非正态数据,还是只适用于正态数据?
在实践中,打破这些规则常常能得到好的结果。
我建议在你的数据上测试一套算法,然后加倍投入到看起来有效的算法上。
谢谢你的帮助。你能不能建议一下处理一个包含大量文本列的数据集的最佳方法是什么?而且这些列的值也有大量不同的值。
我这里有一些想法可能会有帮助
https://machinelearning.org.cn/start-here/#nlp
嗨,Jason 博士,
感谢您的工作,我非常感激您为帮助我们所做的努力。
我是你的超级粉丝。
首先,我计划在一个多变量时间序列问题中使用LSMT-RNN。
我刚开始学习机器学习,我的问题可能很傻,但对我来说是个大问题。
我有一个时间序列数据库,有221个尚未监督的特征,我想把它转换成一个包含6到10个特征的输入。之后,我想用1个特征来监督最多10个时间步长的输出。
我已经对我的数据库进行了预处理:清洗、去趋势、归一化、相关性分析和按亲和度聚类。我从我的221个特征中得到了27个聚类。
我的问题是
现在我想我可以选择我的输入数据了,但该怎么做呢?我应该从与我的输出有亲和度的同一聚类中挑选,还是应该从与我的输出没有亲和度的其他聚类中挑选?
谢谢你的时间,抱歉文字太长了。
或许可以尝试几种方法,看看哪种更容易建模。
抱歉,我没明白你的回答。
好文章,Jason。
如今常用的另一种数据处理技术,尤其是在计算机视觉领域,是数据增强,我们基本上通过对图像进行旋转、着色和平移等微小改变来模拟不同的条件。
这里有一些例子
https://machinelearning.org.cn/image-augmentation-deep-learning-keras/
你好,
实际上,我是机器学习的新手,我想知道当我们在一个数据集上应用数据预处理时,我们是必须改变现有的数据集,还是必须为修改后的数据创建一个新的数据集?也就是说,预处理完成后,我们是会有两个数据集,一个是原始数据集,另一个是预处理过的数据集,还是只会有一个包含预处理数据的数据集?
在您的原始数据上创建并保存一个新的数据集或视图。
嗨,先生,实际上我想为一个说话人识别项目准备一个数据集,为此我想准备录音数据,您能告诉我最佳的程序吗?
抱歉,我没有关于准备音频数据的材料。我希望将来能涵盖这个内容。
嗨,
我是vikash,我想了解关于假设,即数据的预验证和后验证。例如,对于线性回归,我们有预验证或诊断,比如
1.数据的正态分布
2.无多重共线性
3.线性关系
和
4.缺失值
对于创建线性回归模型后的后验证或诊断,有
1.误差的正态性
2.同方差性
3.异常值和杠杆点
5.自相关性。
这些是线性回归的假设。那么其他算法的假设是什么呢?你能指导我了解其他算法的假设吗?
谢谢你。
通常,如果你忽略这类假设,可以得到好的甚至更好的结果。原因是在预测建模中,模型的技能比理论上的正确性更重要。
我有一个CSV文件,包含时间戳、主机名、指标(CPU、内存、页面扫描)、指标值(0.7)。我需要找出由于CPU、内存或页面扫描导致的指标值增加。
如果CPU增加,哪个主机最大化地利用了CPU,从而找到根本原因。
数据集包含分类值和数值。我是否需要将主机名和指标值等分类数据转换为数值?
我需要进行数据转换吗?
哪种机器学习技术能很好地预测根本原因?是哪种算法?
我正在尝试使用 Spark ML。
有什么建议吗?
谢谢
是的,我建议在建模前将分类数据转换为整数,甚至进行独热编码。
我建议在你的数据上测试一套方法,看看哪种效果最好。然后加倍投入在那上面。
抱歉,我没有Spark的例子。
你好,
我是机器学习的新手,所以有个问题。输入数据的大小必须相同吗?
我的意思是,我有10个数据矩阵,但这些矩阵的大小例如是[60, 120], [60, 460], [60, 340]等等。我想使用Tensorflow引擎。
如果您能回答我的问题,我将不胜感激。
此致!
是的,通常数据必须具有相同的形状。
你好 Jason,
我请求您在我的项目“数据科学项目的数据准备技术”方面提供文献支持。我读了不同的评论,但我的项目需要更多关于不同方法和技术的优势。他们要求我
对数据准备的技术和工具进行文献综述,并根据所使用的方法和技术对各种方法进行分组。
对文献综述中最相关方法的优缺点进行总结,并提出一个数据准备流程。
我真的需要指导和文献资料。谢谢
嗨,Adama,如果你在作业项目上遇到困难,我最好的建议是和你的教授和助教谈谈。你付钱给他们就是为了让他们教你。
数据准备确实非常具体,取决于特定的数据类型和预测建模问题。也许你可以更集中注意力,让项目变得更容易。
嗨,Jason,
我非常喜欢这个网站,这里有很多非常有用的东西,我目前面临一个问题。
我正在尝试根据扫描的PDF中的机器读取文本对它们进行分类,我已经到了有一个相对较大的测试集的地步。
这些文件本身有非常可预测的句子,与分类紧密相关,然而我真正找到的关于这方面的内容只有使用词袋(BoW)模型。
使用神经网络来实现这个目标是一个可行的选择吗?另外,我在数据预处理方面遇到了一些问题。我不太确定从长文本字符串中移除‘\n’字符和其他标点符号的最佳方法是什么。
任何帮助或指点都将不胜感激。
非常感谢,
Cheyne
我很难说。我通常会建议测试一套方法,看看哪种最适合你的具体数据。
告诉我进展如何。
嗨,Jason,我非常喜欢你解释机器学习的方式。
我正在研究结合机器学习技术,我的问题是:有没有机器学习问题,其中有足够的数据集来验证我的工作。
这里有一些可以获取数据集的地方
https://machinelearning.org.cn/faq/single-faq/where-can-i-get-a-dataset-on-___
嗨,Jason 博士,
这是一个非常好的指南。
我有一个问题,我正在从头开始编写一个神经网络(反向传播算法),使用sigmoid函数,所以我将我的数据缩放在-1到1的范围内]-1,1[,但sigmoid函数给出的结果在0到1之间。所以我想知道,对于sigmoid函数,我是否必须将我的数据缩放在0到1的范围内[0,1]?或者,Jason博士能否给我澄清一下,在使用sigmoid函数时,是否有推荐的数据缩放范围?或者说,sigmoid函数的推荐缩放范围是什么?
此致。
也许这篇文章会有所帮助
https://machinelearning.org.cn/implement-backpropagation-algorithm-scratch-python/
谢谢你。
致以最诚挚的问候。
嗨,Jason 博士,
我读了推荐的文章,真的很有帮助,非常感谢。
致以最诚挚的问候。
很高兴它有帮助。
嗨,亲爱的 Jason,
感谢您的这次概述。我想知道我应该以何种格式为非支配排序遗传算法 2(MATLAB)准备我的数据。谢谢!
我相信那是一个优化算法,而不是监督学习算法。我不太明白你的意思?
嗨,Jason,我正在处理一个包含许多相似数据项的数据集(例如手机数据)。所以,我想进行基于多样性的抽样。最好的方法和工具是什么?
或许可以进行聚类,然后根据到聚类中心的距离进行筛选?
也许可以查阅相关文献?
嗨,Jason,
我正在尝试创建一个分类 LSTM 模型。除了我的预测变量外,我还有三个分类变量。我已经对这三个变量进行了标签编码。我需要对这些变量进行缩放,还是可以按原样使用它们。
都试试,看哪个效果最好。
嗨,jason
我需要使用任一机器学习算法从问答数据集中提取问题……你能告诉我哪种算法最好吗?还有流程……?
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/what-algorithm-config-should-i-use
亲爱的 Jason,
首先,感谢这个很棒的网站。
我正在为我的理学硕士学位做一个情感分析应用,而我在这方面还是个新手。
我从推特上收集了数据,但我想知道我应该在标注之前还是之后清理数据?顺序会有影响吗?
这里是一个很好的起点
https://machinelearning.org.cn/start-here/#nlp
亲爱的 Jason,
我有一些非结构化的json文件,需要预处理作为我的机器学习算法的输入,请问有什么关于如何用非结构化的json文件创建特征向量的帮助吗?
你可能需要编写一些自定义代码。
你好 Jason,感谢你的教程,我有一个关于 softmax 函数的问题,这个函数的推导过程
也许这会有帮助。
https://en.wikipedia.org/wiki/Softmax_function
嗨,Jason,
再次感谢您的精彩文章。在没有文献支持的固有类别/分类的情况下,您认为使用平均值作为分类的截止点是否可以?例如,假设我们试图根据一项调查结果区分工作场所中的高绩效者和低绩效者。现在这项调查没有一个确切的截止点,说谁在20分中得到10分以上就是高绩效者,低于就是低绩效者。我想我们可以做的一件事是先用聚类将数据集分成两个簇,然后用它们作为类别。除此之外,计算所有参与者的平均分,然后用它作为截止点将样本分为高绩效和低绩效类别,这样做可以吗?然后用这个来训练/测试?您认为这有道理吗?这是假设数据是正态分布的。如果不是,基于百分位数的方法可能不错。总之,您认为基于平均分来创建类别可以吗?如果不行,如果没有固有的类别,还有哪些其他方法可以根据数值来划分类别?提出这个问题是因为我正试图将一个回归问题转换为一个分类问题,但不确定基于平均值进行分类是否是个好主意。
谢谢!
你的方法听起来是个不错的开始。
我建议测试几种不同的问题框架,并发现哪种对你的特定数据集效果好/最好。
嗨,Jason,
你如何处理数据集中的缺失数据,是直接把它们设为NA吗?我正在使用电影数据,有缺失数据的变量是演员姓名。我把这个变量里的缺失值设为NA,结果14800条记录里有2829个NA,我觉得这可能是个问题,但不确定该如何处理。
谢谢
Jennifer
你有很多选择,比如移除有缺失数据的记录(列或行),通过均值/中位数或模型来插补值,或者用特殊值标记并在建模时忽略。
或许可以尝试用几种不同的变体进行建模,看看哪种最适合你的特定数据。
嗨,Jason,非常感谢您精彩的网站,对我非常有帮助。
我有一个训练数据集(已标记),包含许多实例,我将用它来进行分类。现在我想知道,我是否可以使用只包含一个实例的测试数据集(当然是未标记的)?
谢谢
Halima
一个只包含一个实例的测试集没有意义。
或者,如果你只是想对新数据进行预测,那么也许这个能帮助你。
https://machinelearning.org.cn/make-predictions-scikit-learn/
非常感谢。确切地说,我想对新数据进行预测,但用的是 weka 而不是 python。
在weka中我该怎么做呢?
这里有一个例子
https://machinelearning.org.cn/save-machine-learning-model-make-predictions-weka/
嗨,Jason,
1. 我的应用程序数据集是 json 格式,我把它转换成扁平的 csv 文件以便在 r 中处理,因为其中有嵌套字段,这种方法正确吗?
2. 在数据中,有些记录有不止一个申请人,但最多是两到三个,少数超过三个。在这种情况下,在扁平文件中,不属于超过三个申请人的变量列大多是NULL,因为只有少数记录有这些数据。请问我该如何处理这种情况?(例如,记录信息是:申请人姓名、电话、公司、薪水、资产金额、年龄、性别……)
提前感谢
听起来是正确的方法。
或许你可以将这些值标记为缺失。
https://machinelearning.org.cn/faq/single-faq/how-do-i-handle-missing-data
那么我走在正确的道路上了,谢谢 Jason
嗨,博士。
我是一名理学硕士生,正在研究机器学习,特别是利用卷积神经网络来预测使用基因组数据的表型。我的数据集编码为{0 1 2}。我的问题是:
1. 是否可以使用相同的格式代码进行预测,还是我应该将其转换为{0 1}?
2 如果我要转换,该怎么做?
是的,你可以将一个问题建模为多类别分类,也许这个会有帮助。
https://machinelearning.org.cn/multi-class-classification-tutorial-keras-deep-learning-library/
关于数据清理的一点
“此外,某些属性中可能包含敏感信息,这些属性可能需要进行匿名化处理或从数据中完全移除。”
我们在一个包含原始系统数据的数据湖上运行机器学习。
根据业务功能的访问权限及其确定的“处理的法律依据”(例如,根据GDPR),需要提供匿名化数据集来构建数据模型的问题有多普遍?
这真的要看具体情况,取决于用户给予的同意类型。
现在的世界与90年代/2000年代大不相同,那时数据稀缺,而且是一场混战。
嗨,Jason,如何对单个测试记录进行预处理,以遵循训练模型时使用的相同程序?
如果你有一个管道,它会为你执行准备工作。
嗨,Jason博士
您能提及一下学习分解和聚合转换的资料吗?我对这个概念还不是很清楚。
谢谢
当然可以。
分解:一个日期可以被拆分为日/月/年。
聚合:客户交易可以被聚合以得出总和与平均值。
嗨,Jason,
谢谢你这篇有帮助的文章。
我有一个关于数据准备的问题。我正在做文本到代码的任务,我有一个包含我的数据集的csv文件,它包含两列:文本和代码。
为了在训练中使用数据,我将 X-Train 编码为整数并填充到最大长度。但是对于 Y-Train,我该如何处理呢?用和 X-train 同样的方法吗?
同样的方法,将符号编码为整数,然后补零至固定长度。最后再将整数映射回符号以给出最终输出。
啊,好的,再次感谢您的帮助!!
不客气。
你好,Jason,首先我非常感谢您与我们分享的信息。我想问您;我是一个机器学习的初学者。
我们如何将基因组转换为特征,以便输入到机器学习算法中?
另外,如果训练集严重不平衡,会对我的结果产生什么影响?我该如何解决这个问题?
非常感谢
抱歉,我不知道如何表示基因组。或许可以查阅相关文献,看看别人是怎么做的?
有很多方法可以解决类别不平衡问题,也许可以从这里开始:
https://machinelearning.org.cn/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
非常感谢,我会继续研究的……
嗨,Jason,我非常喜欢您关于机器学习的书籍和邮件。我正在为我的大学毕业设计做一个关于人脸识别的项目,但是很难找到一个大型的照片数据库来从头开始训练网络。为了保证准确性,您建议每个人需要多少张照片?您知道我可以从哪里获取人脸图像的来源吗?
诚挚的问候
Michael
谢谢!
或许可以测试一下模型对每个人脸部照片数量的敏感度?
另外,对于人脸识别,可以使用 facenet 或 vggface2 来获取嵌入(embedding),然后再用另一个模型进行实际分类。
嗨,Jason,
我有一个疑问,如果我对训练数据进行了预处理,那我该如何预处理测试数据呢……比如说,如果我的测试数据在编码时有不同的标签,我该怎么办?>>
测试数据必须使用与准备训练数据时相同的方法进行处理。
谢谢您的回复,Jason,
如果训练集和测试集在同一个公共列中有不同的标签
例如:训练集中的 col1 的唯一值是 a, b, c
而测试集中的 col1 的唯一值是 a, b, d
如果出现未知标签错误,该如何进行编码?
如果您事先知道分类值的范围,可以将其指定给 onehotencoder,这样它就能处理所有可能的情况。
或者,如果您不知道,可以设置 “handle_unknown” 为 “ignore”。
https://scikit-learn.cn/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
谢谢您的回复,Jason,很有启发!!!
不客气。
如果我有一个高基数(有很多唯一值)的分类变量需要编码,
哪种是最好的编码方法?您能帮忙解答吗!
我建议先看这个教程:
https://machinelearning.org.cn/how-to-prepare-categorical-data-for-deep-learning-in-python/
然后看这个:
https://machinelearning.org.cn/faq/single-faq/how-do-i-handle-a-large-number-of-categories
但是那些哈希和其他技术只适用于文本数据……如果我的数据是用于分类或聚类的数值分析呢?
同样的方法也可以使用。单词只不过是很多类别而已。
谢谢您!!!
不客气。
您好,Jason博士,
我有一个问题,采样(sampling)是否也可以被称为特征选择/提取(feature selection/extraction)?我见过一些论文,他们使用了一个特征的某些特性(比如AUC、最大值、曲线拟合系数)来代替原始数据。
我一直在研究对9个传感器在240秒内响应的分类问题。也就是说,对于我实验的每个样本,我有一个240个观测值和9个特征的数据矩阵(240*9)。之后,我选择了一些代表性点,比如(最大值、第75、50和25百分位值),以使系统运行更快,同时保持分类性能与使用整个数据集时相当。
我该如何在论文的一个章节中呈现这项工作(特征提取还是采样)?
此致
这听起来像是特征工程(feature engineering)。
https://machinelearning.org.cn/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
非常感谢,您的解释真的很有帮助。
此致
不客气。
先生,关于我之前在这个话题里的问题,我还有一个疑问。原始数据集每个样本的维度是240*9,46个样本的整个数据集大小是46*(240*9),即大约11000*9。在进行了上述的特征工程后,我的数据集减少到了188*9。我对新的数据集应用了一个分类器算法,并取得了很好的准确率。
我的问题是,这种数据大小的差异是否需要考虑进去。现在训练集和测试集的大小都变小了。由于我之前对原始数据集使用了bagging KNN和AdaBoost决策树分类器(决策树桩),所以在这里也应用了同样的方法。
先生,我必须说,您是这个领域里我唯一能接触到的专家,我非常感谢您的指导。
此致
我不确定能否帮上忙。听起来您需要调试一下您的数据准备过程,以理解它们具体做了什么。
谢谢您
不客气。
嗨,Jason。您有没有一篇文章是关于如何为机器学习准备规范化(normalized)数据的?如果一个父观察值对于某个给定的特征有很多子值,我们该如何在单行中表示呢?如果我们只是将每个值分配给不同的列,模型会把每一列都看作是一个不同的特征,而且每个观察值的值的顺序可能与其他观察值不同。感谢您的见解。
是的,有很多,或许可以从这里开始:
https://machinelearning.org.cn/faq/single-faq/when-should-i-standardize-and-normalize-data
是的,这可能是个不错的初步尝试,其他想法在这里:
https://machinelearning.org.cn/how-to-prepare-categorical-data-for-deep-learning-in-python/
谢谢您的回复,Jason。我想我在问题中用了错误的术语。我说的“规范化”是指关系型数据库结构中的规范化。换句话说,一个分类特征的观察值可以有多个不同类别值的实例。看起来解决方案仍然是使用独热编码(dummy encoding),但在这种情况下,一个观察值可能会在多个列中都有1。我只需要找到能在独热编码时考虑多个表的Pandas方法。
或许在数据准备之前,将数据反规范化(de-normalize)成每个样本一行?
先生,什么时候应该执行异常值检测,请上传一篇关于如何使用python在多变量分类和回归中移除异常值的文章。
也许从这里开始
https://machinelearning.org.cn/how-to-use-statistics-to-identify-outliers-in-data/
我的数据集包含一个通过两个属性相减计算得出的派生属性,那么这样做是好的,还是在构建模型时我应该移除这个属性?
比较包含和不包含该变量时的模型性能。
你好,我仍然在想如何处理我的数据。我准备了一个excel数据文件,用于深度学习模型。我不知道如何将所有特征标记为‘data’,并将类别特征标记为‘target’!
请帮我解决这个问题。
祝好
这个会有帮助:
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
谢谢您的回复,但里面没有提到我的问题!我已经根据定义的问题准备了一个数据库。
链接的文章将帮助您识别预测建模问题中的输入和输出部分。
感谢您所有的文章,非常有帮助 🙂
不客气。
嗨,Jason,
我不知道这个问题是否被提过,但在这个过程中
为了避免数据泄露,您建议何时将数据集划分为训练集和验证集?
在避免数据泄露方面?
好问题,先划分。
另外,这个也会有帮助:
https://machinelearning.org.cn/difference-test-validation-datasets/
嗨 Jason
我发现您的文章非常有趣。我正在为著名的‘泰坦尼克号’数据集建立一个模型。我发现即使使用了XGBoost,我的准确率也无法超过77%。我意识到这可能是因为数据准备得不好,所以我开始寻找准备数据的最佳方法。由于我是这个领域的新手,我不知道分解和聚合。
我的问题是,如何判断何时分解/聚合一个特征?另外,您有关于数据准备的文章或教程的链接吗?那将会有很大帮助。
Piyush
好问题——试试看它是否能提高性能。如果能,就保留它并继续尝试其他方法。
嗨,Jason,
非常清晰和好的文章!我有两个困惑的点:
1. 数据预处理和特征工程之间有什么关系?从您的文章来看,如果我理解正确的话,似乎数据预处理的范围比特征工程更大,特征工程包含在数据预处理中,我说的对吗?
2. 我从一些网站上发现,有些人会先将数据划分为训练集和测试集,然后再分别进行数据预处理(例如,缩放和中心化)。我想知道这样的顺序是否正确?因为我理解我们应该先对整个数据集进行数据预处理(包括特征工程),然后再进行数据划分,对吗?
提前感谢您,期待您的回答和建议!
谢谢!
很好的问题!
有些人把数据准备称为“特征工程”。有些人把特征工程看作是数据准备的一个子集,专注于从现有输入中创建新输入。我更喜欢后一种定义。
正确的做法是在训练集上准备数据处理方法,然后将它们应用于训练集、测试集、验证集和其他数据集。这是为了避免数据泄露。
谢谢Jason的回复!所以为了避免数据泄露,我们应该先将数据划分为训练集和测试集;然后在训练集上进行数据预处理(例如缩放、中心化),并将这个预处理方法传递并应用到测试集上,对吗?
是的,或者如果使用交叉验证,就在训练折上进行数据准备,然后应用到训练/测试折上。
明白了,非常感谢!
不客气。
嗨,Jason!
非常好的文章,我正在做一个测量设备压力的项目,如果我从设备中获取的原始数据是二进制形式的(一次测量有很多值),您认为我应该预处理这些数据吗?我的意思是,比如得到一个总压力的数值,还是我可以将原始数据作为一个特征(列)存储在数据库中用作训练数据?
提前感谢!🙂
谢谢!
或许可以尝试在原始数据上拟合一个模型,并与使用不同数据准备方法的结果进行比较,看看是否能提升模型性能。
谢谢先生提供这么好的内容
我总是在等待您的帮助邮件,您的内容为我提供了机器学习的逐步过程。
谢谢!
我很理解在构建模型时在数据子集上运行机器学习算法的感受。我记得我的第一个机器学习项目。我当时正在跟着一个教程学习,用了一个有1亿行的数据集。结果我花了很长时间才完成那个教程 😛
谢谢。