数据准备可以成就或破坏模型的预测能力。
在他们的书《应用预测建模》的第3章中,Kuhn和Johnson介绍了数据准备过程。他们将其称为训练集数据的添加、删除或转换。
在这篇文章中,您将了解可用于提高模型预测能力的数据预处理步骤。
使用我的新书《机器学习数据准备》启动您的项目,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

我爱电子表格
摄影:Craig Chew-Moulding,保留部分权利
数据准备
在对问题进行建模之前,您必须对原始数据进行预处理。具体的准备可能取决于您可用的数据和要使用的机器学习算法。
有时,数据预处理可以带来模型准确性的意外改进。这可能是因为数据中的关系已被简化或变得清晰。
数据准备是一个重要的步骤,您应该尝试适合您数据的预处理步骤,看看是否能获得模型准确性的理想提升。
您可以为数据考虑三种类型的预处理
- 向数据添加属性
- 从数据中删除属性
- 转换数据中的属性
我们将深入探讨这三种预处理类型,并回顾一些可以执行的特定操作示例。
想开始学习数据准备吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
添加数据属性
高级模型可以从复杂属性中提取关系,尽管有些模型要求这些关系明确地表达出来。从训练数据中导出新属性以包含在建模过程中可以提高模型性能。
- 虚拟属性:分类属性可以转换为n个二元属性,其中n是属性具有的类别(或级别)的数量。这些非标准化或分解的属性称为虚拟属性或虚拟变量。
- 转换属性:可以将属性的转换变体添加到数据集中,以允许线性方法利用属性之间可能的线性和非线性关系。可以使用对数、平方和平方根等简单转换。
- 缺失数据:可以使用可靠的方法(例如k-近邻)估算具有缺失数据的属性中的缺失数据。
删除数据属性
有些方法在存在冗余或重复属性时表现不佳。通过从数据中删除属性,您可以提高模型准确性。
- 投影:训练数据可以投影到较低维空间中,但仍能表征数据中固有的关系。一种流行的方法是主成分分析(PCA),其中该方法找到的主成分可以作为一组简化的输入属性。
- 空间符号:数据的空间符号投影会将数据转换到多维球体的表面。结果可用于突出显示离群值的存在,这些离群值可以从数据中修改或删除。
- 相关属性:某些算法在存在高度相关属性时重要性会降低。可以识别具有高相关性的成对属性,并从数据中删除最相关的属性。
转换数据属性
训练数据的转换可以减少数据的偏度和数据中离群值的突出程度。许多模型期望在应用算法之前对数据进行转换。
- 居中:转换数据使其均值为零,标准差为一。这通常称为数据标准化。
- 缩放:一种标准的缩放转换是将数据从原始尺度映射到零和一之间的尺度。这通常称为数据归一化。
- 消除偏度:偏斜数据是指其分布偏向一侧(较大或较小的值)而不是正态分布的数据。有些方法假设数据正态分布,如果消除了偏度,则可以表现更好。尝试用值的对数、平方根或倒数替换属性。
- Box-Cox:Box-Cox变换或变换族可用于可靠地调整数据以消除偏度。
- 分箱:数值数据可以通过将值分组到箱中来实现离散化。这通常称为数据离散化。这个过程可以手动执行,但如果使用在领域中有意义的启发式方法系统地自动执行,则更可靠。
总结
数据预处理是准备原始数据进行建模、满足特定机器学习算法对数据的期望以及可以意外提高模型准确性的重要步骤。
在这篇文章中,我们发现了三组数据预处理方法
- 添加属性
- 删除属性
- 转换属性
下次您寻求提高模型准确性时,请考虑您可以为模型探索和利用的数据带来哪些新视角。
您能更详细地解释属性和虚拟属性的概念吗?
好的,Juhyoung Lee,
您可以将“color”之类的分类属性,其值为“red”和“blue”,转换为两个二元属性has_red和has_blue。
这些新的二元变量是虚拟变量。
你可以在这里了解更多
https://en.wikipedia.org/wiki/Dummy_variable_(statistics)
这是一篇很棒的文章,尽管我有一个问题,假设有一个数据集包含均值、众数、最小值、最大值等。我们如何将所有这些值表示在同一尺度上,或者概括这些值,例如,假设一组人的身高均值为x,众数为y,最小值为z,还有另一组数据相同,这些值能否表示在同一尺度上?
你好 Kay,
您可以将每列(数据类型或特征)单独缩放到 0-1 的范围。
您可以使用公式
其中 x 是给定值,min 和 max 是列值的限制。
希望这能有所帮助。
感谢您的文章,Jason!
如果我有一些正态分布的特征和一些偏斜的特征,我可以直接转换偏斜数据而保留正态分布数据不变吗?例如,我可以对某些特征进行对数变换而保留其他特征吗?
此致!
当然可以。
嗨!
您还可以在列表中添加聚合特征,或者一般的统计特征(5数概括),以及离群值移除。
好建议。
关于您在这篇文章中提到的“相关属性”
我想知道您是否有关于如何使用它(例如在sklearn中)的帖子,这样我就可以阅读并了解更多。
我可能在R书中有一个例子。也许可以搜索博客?
我有一个关于缩放的问题。如果我们的二元分类是 (0,1)。是保持原样好还是更改为 (-1,1) 例如?还是取决于数据?
当我阅读关于机器学习的帖子时,我不确定这些注意事项是否总是正确的。
我注意到在许多情况下,答案取决于数据类型。我们如何判断一个注释/规则/点是否依赖于数据类型?
这真的取决于数据和所使用的算法。
当您说“相关属性:某些算法在存在高度相关属性时重要性会降低。可以识别具有高相关性的成对属性,并从数据中删除最相关的属性。”时
我完全相信相反的说法 :O
我的意思是:我通常会删除那些不相关的属性,并保留那些高度相关的属性……这可以解释为什么我无法太多地优化我的模型。
您有更多关于这个特定主题的文档吗?
谢谢!
多个相关输入特征确实会干扰大多数模型,最坏的情况下会导致技能下降,最好的情况下会在模型中产生大量冗余。
形式上,这个问题通常被称为多重共线性
https://en.wikipedia.org/wiki/Multicollinearity
在所有这些步骤中,哪些是最重要的?例如,如果我应用PCA进行降维并创建两个新特征,我是否可以期望数据中的其他问题(例如异常值、多重共线性、偏态分布)将不再存在?
对于“添加数据属性”部分中的“转换属性”,我如何选择对数、平方和平方根中最适合的转换?我可以应用这些转换中的每一个并将它们全部保留在数据集中吗?我觉得这可能会导致冗余和多重共线性。
感谢您的精彩帖子!!
问题的框架提供了最大的杠杆作用。
带有异常值的 PCA 可能会导致问题,最好先将其删除。
尝试维护数据的多个“视图”,并在每个视图上尝试模式,以探索视图/模型/配置的最佳组合。
嗨,Jason,
对于高度相关的成对属性,可接受的水平是多少?相关性可以从 -1 到 +1。
也许低于 0.5。我建议您进行测试,看看哪种方法最适合您的数据和算法。
你好 jason,
我参加了一场 Kaggle 竞赛,需要对森林覆盖类型进行分类,
我尝试了一切,例如堆叠各种模型、特征工程、特征提取
但我的模型准确率没有超过 80%。
我还发现有 2 种覆盖类型非常难以分离,所以我尝试构建一个模型来分离这 2 种覆盖类型。
什么都无效,所以我很沮丧,感觉我不知道别人知道的东西。
如果您能提供一些见解,那将非常有帮助,我已经为此工作了 2 周,现在非常沮丧。
很抱歉问了这样一个愚蠢而冗长的问题。
我在这里有一些建议可能会有所帮助
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
还有这里
https://machinelearning.org.cn/start-here/#better
嗨,Jason,
我有一个 .csv 文件,有 10 列,大约 6000 行。我的数据只以 0 和 1 的形式表示。每行代表视频的一个时间帧。
假设我想在不丢失信息的情况下将行数从 6000 减少到 1000 行。我的情况下什么方法是可靠的?以及如何实现?
不丢失信息?恐怕我帮不上忙。
嗨,先生,
由于kNN是基于距离的算法,因此数据归一化可能会对此算法产生影响。但是,归一化是否有可能对kNN模型的准确性产生负面影响。
(在kNN算法中,我在没有归一化的情况下RMSE=50,在归一化的情况下RMSE=70)
这可能吗?还是我犯了一些逻辑错误?
数据缩放确实可能对您的模型没有帮助。
谢谢你的回复
不客气。
我非常喜欢你写的东西,非常清晰。你能把PDF版本发给我吗?
rustam@ui.ac.id
我相信您可以使用浏览器将网页打印成PDF。