机器学习算法对您正在建模的数据集做出假设。
通常,原始数据由具有不同尺度的属性组成。例如,一个属性可能是千克,另一个可能是计数。虽然不是必需的,但通常可以通过仔细选择方法来重新缩放数据,从而提高性能。
在这篇文章中,您将发现如何重新缩放数据,使所有数据都具有相同的尺度。
阅读本文后,您将了解
- 如何在0到1的范围内归一化您的数值属性。
- 如何将您的数值属性标准化为具有0均值和单位方差。
- 何时选择归一化或标准化。
用我的新书Weka机器学习精通来启动您的项目,包括所有示例的分步教程和清晰的屏幕截图。
让我们开始吧。
- 2018年3月更新:添加了替代链接以下载数据集,因为原始链接似乎已被删除。
预测糖尿病发病
本示例中使用的数据集是Pima Indians糖尿病发作数据集。
这是一个分类问题,每个实例代表一个患者的医疗详细信息,任务是预测该患者是否会在未来五年内患上糖尿病。
这是一个很好的用于缩放实践的数据集,因为8个输入变量都具有不同的尺度,例如患者怀孕次数的计数(preg)和患者体重指数的计算(mass)。
下载数据集并将其放置在您的当前工作目录中。
你还可以在Weka安装的`data/`目录下找到名为`diabetes.arff`的此数据集。

Weka加载糖尿病数据集
关于Weka中的数据过滤器
Weka提供了用于转换数据集的过滤器。查看支持哪些过滤器以及在数据集上使用它们的最佳方法是使用Weka Explorer。
“Filter”(过滤器)窗格允许您选择一个过滤器。

Weka用于选择数据过滤器的过滤器窗格
过滤器分为两种类型
- 监督过滤器:可以应用但需要用户以某种方式控制。例如,重新平衡类的实例。
- 无监督过滤器:可以以无引导方式应用。例如,将所有值重新缩放为0到1的范围。
就我个人而言,我认为这两种过滤器之间的区别有点武断和令人困惑。尽管如此,它们就是这样布置的。
在这两组中,过滤器进一步分为属性过滤器和实例过滤器
- 属性过滤器:一次对属性或一个属性执行操作。
- 实例过滤器:一次对实例或一个实例执行操作。
这种区别更有意义。
选择过滤器后,其名称将显示在“Choose”(选择)按钮旁边的框中。
您可以通过单击过滤器的名称来配置过滤器,这将打开配置窗口。您可以更改过滤器的参数,甚至可以保存或加载过滤器本身的配置。这对于可再现性非常有用。

Weka数据过滤器配置
您可以将鼠标悬停在每个配置选项上并阅读工具提示,以了解有关它的更多信息。
您还可以通过单击“More”(更多)按钮,阅读有关过滤器的所有详细信息,包括配置、供进一步阅读的论文和书籍以及有关过滤器工作原理的更多信息。

Weka数据过滤器更多信息
您可以通过单击“OK”(确定)按钮关闭帮助并应用配置。
您可以通过单击过滤器名称旁边的“Apply”(应用)按钮将过滤器应用于已加载的数据集。
在Weka机器学习方面需要更多帮助吗?
参加我为期14天的免费电子邮件课程,逐步探索如何使用该平台。
点击注册,同时获得该课程的免费PDF电子书版本。
归一化您的数值属性
数据归一化是将一个或多个属性重新缩放到0到1范围的过程。这意味着每个属性的最大值为1,最小值为0。
当您不知道数据的分布或当您知道分布不是高斯分布(钟形曲线)时,归一化是一种很好的技术。
您可以通过选择Normalize过滤器并将其应用于数据集,在Weka中归一化数据集中的所有属性。
您可以使用以下方法归一化您的数据集
1. 打开 Weka Explorer。
2. 加载您的数据集。

Weka Explorer 已加载糖尿病数据集
3. 单击“Choose”(选择)按钮选择一个过滤器,并选择unsupervised.attribute.Normalize。

Weka选择归一化数据过滤器
4. 单击“Apply”(应用)按钮归一化您的数据集。
5. 单击“Save”(保存)按钮并输入文件名以保存数据集的归一化副本。
查看“Selected attribute”(选定属性)窗口中每个属性的详细信息将使您确信过滤器成功,并且每个属性都重新缩放到0到1的范围。

Weka归一化数据分布
您可以使用其他尺度,例如-1到1,这在使用支持向量机和AdaBoost时非常有用。
当您的数据具有不同的尺度并且您使用的算法不假设您的数据分布时,例如K近邻和人工神经网络,归一化非常有用。
标准化您的数值属性
数据标准化是将一个或多个属性重新缩放,使其平均值为0,标准差为1的过程。
标准化假设您的数据具有高斯(钟形曲线)分布。这不一定严格正确,但如果您的属性分布是高斯分布,该技术会更有效。
您可以通过选择Standardize过滤器并将其应用于您的数据集,在Weka中标准化数据集中的所有属性。
您可以使用以下方法标准化您的数据集
1. 打开Weka Explorer
2. 加载您的数据集。
3. 单击“Choose”(选择)按钮选择一个过滤器,并选择unsupervised.attribute.Standardize。

Weka选择标准化数据过滤器
4. 单击“Apply”(应用)按钮归一化您的数据集。
5. 单击“Save”(保存)按钮并输入文件名以保存数据集的标准化副本。
查看“Selected attribute”(选定属性)窗口中每个属性的详细信息将使您确信过滤器成功,并且每个属性的平均值为0,标准差为1。

Weka标准化数据分布
当您的数据具有不同的尺度并且您使用的算法确实假设您的数据具有高斯分布时,例如线性回归、逻辑回归和线性判别分析,标准化非常有用。
总结
在这篇文章中,您了解了如何在Weka中重新缩放数据集。
具体来说,你学到了:
- 如何将数据集归一化到0到1的范围。
- 如何将数据标准化为平均值为0和标准差为1。
- 何时使用归一化和标准化。
您对数据缩放或这篇文章有任何疑问吗?在评论中提出您的问题,我将尽力回答。
你好。我觉得这篇文章很有趣也很清楚,但让我给你举个例子
我有一个包含不同特征的数据集,6个数值型和3个名义型。
数值特征是
工资、佣金和hvalue(欧元)
年龄和hyears(年)以及
邮政编码(一个4位数字)
我可以只标准化这些特征吗?因为它们确实有不同的尺度。
我的意思是,我的分类任务(类别特征=组),使用标准化数据集获得的结果(测试集准确率)远优于非标准化数据集。
你好,Mark,
通常,最好标准化具有高斯(钟形曲线)分布的数据,否则进行归一化。
并非所有算法都需要这种类型的数据预处理,有些算法则需要。
如果有疑问,创建3份数据副本(原始、标准化、归一化),并对所有3份数据评估多种算法。您可以稍后深入研究更细微的数据准备,但这种暴力技术将快速获得良好结果。
我知道分类变量不应该进行标准化,因为它具有最低值0和最高值1,而连续变量应该进行标准化。我困惑的是,计数数据是否应该通过相同的减去均值并除以标准差的方法进行标准化?我还听说因变量和自变量都应该进行标准化,以便对所有数据进行中心化和缩放。
只有当数据分布是高斯分布时,它才真正有意义。计数数据很少是高斯分布,更可能是幂律分布。
Python 中的 StandardScaler() – 我在网上看到的所有示例都将标准化应用于整个 x 特征。如果我的特征是名义值和实数值的混合呢?例如:如果一个特征是性别,编码为 0 和 1,另一个特征是年龄,范围从 0 到 100。如果我将 StandardScaler 应用于整个训练数据集,它将同时缩放这两个变量。是否应该同时缩放?如果不是,我如何有选择地将其应用于实数值特征而不是名义特征?
好问题,Lily,
我相信 PartitionedMultiFilter 是一种在行的子集上使用过滤器的方法,更多详细信息请看这里
http://weka.sourceforge.net/doc.dev/weka/filters/unsupervised/attribute/PartitionedMultiFilter.html
听起来上面的问题是关于在Python中过滤列的子集,而不是Weka中行的子集。@Jason,虽然您的文章是关于Weka过滤的,但您能否对Lily关于在Python中过滤不同列类型的问题提供更详尽的答案?谢谢。
我想这篇文章可能会帮助 Amanda
https://machinelearning.org.cn/data-preparation-gradient-boosting-xgboost-python/
感谢您的精彩解释。
所以如果我的理解是正确的,您是在其值范围内(基于您拥有的数据集)对每个变量进行归一化/标准化吗?而不是跨实例或整个数据集的数值?
如果您只想归一化少数几个数值变量,而希望保留其他一些主要变量的原始值范围,该怎么办?
——MP
嗨,MP,
您可以有选择地归一化属性的子集。
应用过滤器(归一化)后,值是如何分布的?
相同的分布,只是一个新的比例。
你好。如果我对训练和测试数据进行归一化,然后得到预测模型。我是否必须始终在新数据输入模型进行预测之前对其进行归一化?
是的。
我如何只选择一个属性进行归一化?我选择了一个属性,但它归一化了所有属性。
您可以提取该列,对其进行归一化,然后使用其他列和归一化后的列创建一个新数据集。
简单的numpy工具,如hstack(),可用于从列创建数据集
https://machinelearning.org.cn/gentle-introduction-n-dimensional-arrays-python-numpy/
Jason,非常棒的讲解,谢谢——问题是……我正在处理一个包含5千多个观测值和500多个变量的庞大数据集。其中有数值型、整数型和名义型,并且混合了连续型、离散型和有序型。预测变量是连续型的。我需要执行PCA,但在执行PCA之前,我很难理解是否需要标准化或归一化每个变量的观测值……显然有些需要,但我不确定是否全部需要。
https://www.eia.gov/consumption/residential/data/2015/xls/codebook2015_public_v3.xlsx
您能提供的任何建议或指导都将非常有帮助!
PCA可能只对数值数据有意义。您应该事先或作为PCA的一部分进行标准化和归一化。
另外,确认您是否需要使用PCA,或许可以先尝试一些特征选择方法以发现基线性能。然后,如果PCA能提升技能,再采用PCA。
你好 Jason,
特征的方差在选择归一化/标准化中起作用吗?如果起作用,您能就我们还需要考虑的其他因素提供一些启示吗?
谢谢
并不是真的。
请问新的数据(例如一个观测值)应该如何归一化?(例如,在标准化情况下,我应该使用训练数据集的均值和标准差吗?)
新数据应该使用与准备训练数据相同的方法进行准备。
我如何从Weka Java代码而不是GUI中归一化和标准化数据?
抱歉,我没有使用 Weka API 的示例。
尊敬的先生,
如何对训练集和测试集数据进行标准化。我已将数据分割为训练集和测试集,现在想执行标准化。我认为单独执行标准化是不行的。谢谢
您可以在训练集上拟合标准化过程,并将其应用于训练集和测试集。
我用 Keras 构建了一个神经网络。
1. 通过实验,我发现如果不对特定列(温度)应用缩放器,我总是能得到更好的预测结果。这有道理吗?不对所有列应用缩放器是否可以接受?
2. 尽管您推荐神经网络使用归一化,但我是否理解正确,例如在温度情况下,最好使用标准化,因为明天的温度可能比今天的最高温度高,反之亦然。
是的,缩放并非总是必需的,但它可以提高稳定性。Weka 模型通常会自动为您缩放。
是的,如果数据是高斯分布,则优先选择标准化。
嗨,Jason,我正在做一个比较转换性能的项目,我将数据归一化和标准化了,但是当它们进行分类时,它们都给出了相同的结果。(我认为这不可能给出相同的结果,因为数据完全不同)您认为我在转换过程中做错了什么吗?或者您有关于数据转换然后分类的教程吗?
不,这听起来是合理的。
你是说结果相同是正常的,对吗?
因为我最初认为归一化和标准化的过程是不同的,所以结果也应该不同。
无论如何,非常感谢您。
你好,
在使用线性回归时,您是否也对标签y进行归一化?还是只对特征X进行归一化?
我通常建议尝试对所有内容进行归一化。
非常感谢,我学到了很多有益的概念
不客气。
嗨,Jason,
我想听听您对我问题的看法。
我有一个大约100个特征的数据集,我可以归一化或标准化并选择正确的算法。但是由于我的限制,我只能从数据中选择6个相关特征。
有没有办法确定哪些特征会给我最好的结果?
Shay。
是的,尝试不同的组合,并找出哪种组合能带来最佳性能。
或者使用特征选择评分方法
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
如果我错了,请纠正我,Weka 不会在训练测试分割之前缩放整个数据集吗?我们难道不应该只在训练数据上进行缩放,然后将该缩放应用于测试数据吗?
是的,理想情况下,我们应该在训练数据上拟合缩放,并将其应用于训练和测试。
Jason,我们该怎么做呢?我搞不清楚。
好问题,我暂时不记得如何在Weka中实现,也许可以尝试向支持/邮件列表发送消息
https://machinelearning.org.cn/help-with-weka/
你好,Jason!
我的问题是,如果有一列包含期刊全称,那么我们如何根据ISO缩写方法标准化期刊值?
或许可以尝试将问题建模为seq2seq问题,使用编码器-解码器。
这将帮助您入门
https://machinelearning.org.cn/start-here/#nlp
你好,
Weka 中的归一化过滤器如何考虑最小值和最大值?
是考虑每个特征的最小值和最大值来归一化该特征,还是考虑整个数据集的最小值和最大值?
理想情况下,每个特征(列)具有单独的最小值和最大值在测试集上效果不佳,对吗?
提前感谢。
最小值和最大值是从可用数据中估算的,特别是从数据的每一列中估算的。
有没有办法改变所考虑的最小值和最大值?
具体来说,如果我正在分割数据,然后想要归一化测试数据中的属性值,我需要考虑训练数据的最小值和最大值。
这在Weka上可能吗?如果可能,怎么做?
谢谢帮助。
是的,如果你自己实现它,你可以指定范围。
Weka的实现可能支持你指定范围,我不确定。
也许可以尝试在weka用户组上提问?
您好,我觉得您的文章非常有趣。感谢分享。我有一个病人数据集(700名病人)。每位病人在就诊时有10~20行的实验室检查结果。我的任务是预测病人在下次就诊时需要哪种药物。我正在尝试使用LSTM模型。我的问题是
1. 我需要缩放数据吗?
2. 如果需要,我应该按病人、按特征缩放数据吗?还是应该在训练集上按列拟合缩放器?
任何建议都会非常有帮助!谢谢
谢谢。
也许可以评估您的模型在使用和不使用缩放数据的情况下的结果,并进行比较。
通常数据是按特征(列)缩放的,尽管在您的情况下按患者缩放可能也合理。