许多机器学习算法对您的数据都有假设。
通常,最好以某种方式准备数据,以便最大限度地向您打算使用的机器学习算法展示问题的结构。
在这篇文章中,您将了解如何使用 scikit-learn 在 Python 中为机器学习准备数据。
使用我的新书《使用 Python 进行机器学习精通》启动您的项目,其中包括逐步教程和所有示例的Python 源代码文件。
让我们开始吧。
- **2018 年 3 月更新**:添加了下载数据集的备用链接,因为原始链接似乎已被删除。

如何使用 Scikit-Learn 在 Python 中为机器学习准备数据
图片由 Vinoth Chandar 提供,保留部分权利。
数据预处理的必要性
您几乎总是需要预处理数据。这是一个必需的步骤。
一个难点是不同的算法对您的数据有不同的假设,可能需要不同的转换。此外,当您遵循所有规则并准备好数据时,有时算法在不进行预处理的情况下反而能提供更好的结果。
通常,我建议创建数据的许多不同视图和转换,然后在数据集的每个视图上运行一些算法。这将帮助您找出哪些数据转换可能更擅长总体上揭示问题的结构。
需要 Python 机器学习方面的帮助吗?
参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
预处理机器学习食谱
本节列出了 4 种不同的机器学习数据预处理方法。
所有方法都被设计成完整且独立的。
您可以直接复制粘贴到您的项目中并开始工作。
每种方法都使用 Pima 印第安人糖尿病数据集。这是一个二元分类问题,所有属性都是数值型且具有不同的尺度。这是可以从预处理中受益的绝佳数据集示例。
每个方法都遵循相同的结构
- 从 URL 加载数据集。
- 将数据集分为机器学习的输入和输出变量。
- 对输入变量应用预处理转换。
- 总结数据以显示变化。
转换的计算方式使得它们可以应用于您的训练数据和您未来可能拥有的任何数据样本。
scikit-learn 文档中包含有关如何使用各种不同预处理方法的一些信息。您可以在此处查看 scikit-learn 中的预处理 API。
1. 重新缩放数据
当您的数据由具有不同尺度的属性组成时,许多机器学习算法可以受益于将属性重新缩放到相同的尺度。
这通常被称为归一化,属性通常被重新缩放到 0 到 1 之间。这对于机器学习算法核心(如梯度下降)中使用的优化算法很有用。它也适用于像回归和神经网络这样对输入进行加权的算法,以及像 K-近邻这样使用距离度量的算法。
您可以使用 scikit-learn 中的 MinMaxScaler 类重新缩放数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 重新缩放数据(在 0 到 1 之间) import pandas import scipy import numpy 从 sklearn.预处理 导入 MinMaxScaler url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = pandas.read_csv(url, 名称=名称) array = dataframe.values # 将数组分离为输入和输出组件 X = 数组[:,0:8] Y = 数组[:,8] 缩放器 = MinMaxScaler(特征范围=(0, 1)) rescaledX = 缩放器.fit_transform(X) # 总结转换后的数据 numpy.set_printoptions(精度=3) 打印(rescaledX[0:5,:]) |
重新缩放后,您可以看到所有值都在 0 到 1 之间。
1 2 3 4 5 |
[[ 0.353 0.744 0.59 0.354 0. 0.501 0.234 0.483] [ 0.059 0.427 0.541 0.293 0. 0.396 0.117 0.167] [ 0.471 0.92 0.525 0. 0. 0.347 0.254 0.183] [ 0.059 0.447 0.541 0.232 0.111 0.419 0.038 0. ] [ 0. 0.688 0.328 0.354 0.199 0.642 0.944 0.2 ]] |
2. 标准化数据
标准化是一种有用的技术,可以将具有高斯分布以及不同均值和标准差的属性转换为均值为 0,标准差为 1 的标准高斯分布。
它最适合那些假设输入变量具有高斯分布并与重新缩放数据更好地配合使用的技术,例如线性回归、逻辑回归和线性判别分析。
您可以使用 scikit-learn 和 StandardScaler 类来标准化数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 标准化数据(0 均值,1 标准差) from sklearn.preprocessing import StandardScaler import pandas import numpy url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = pandas.read_csv(url, 名称=名称) array = dataframe.values # 将数组分离为输入和输出组件 X = 数组[:,0:8] Y = 数组[:,8] 缩放器 = StandardScaler().fit(X) rescaledX = 缩放器.transform(X) # 总结转换后的数据 numpy.set_printoptions(精度=3) 打印(rescaledX[0:5,:]) |
现在每个属性的值的平均值为 0,标准差为 1。
1 2 3 4 5 |
[[ 0.64 0.848 0.15 0.907 -0.693 0.204 0.468 1.426] [-0.845 -1.123 -0.161 0.531 -0.693 -0.684 -0.365 -0.191] [ 1.234 1.944 -0.264 -1.288 -0.693 -1.103 0.604 -0.106] [-0.845 -0.998 -0.161 0.155 0.123 -0.494 -0.921 -1.042] [-1.142 0.504 -1.505 0.907 0.766 1.41 5.485 -0.02 ]] |
3. 归一化数据
scikit-learn 中的归一化指的是将每个观测值(行)重新缩放,使其长度为 1(在线性代数中称为单位范数)。
这种预处理对于稀疏数据集(很多零),以及当使用神经网络等对输入值进行加权的算法和 K-近邻等使用距离度量的算法时,其中具有不同尺度的属性可能很有用。
您可以使用 scikit-learn 中的 Normalizer 类在 Python 中对数据进行归一化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 归一化数据(长度为 1) 从 sklearn.预处理 导入 Normalizer import pandas import numpy url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = pandas.read_csv(url, 名称=名称) array = dataframe.values # 将数组分离为输入和输出组件 X = 数组[:,0:8] Y = 数组[:,8] 缩放器 = Normalizer().fit(X) normalizedX = 缩放器.transform(X) # 总结转换后的数据 numpy.set_printoptions(精度=3) 打印(normalizedX[0:5,:]) |
这些行的长度被归一化为 1。
1 2 3 4 5 |
[[ 0.034 0.828 0.403 0.196 0. 0.188 0.004 0.28 ] [ 0.008 0.716 0.556 0.244 0. 0.224 0.003 0.261] [ 0.04 0.924 0.323 0. 0. 0.118 0.003 0.162] [ 0.007 0.588 0.436 0.152 0.622 0.186 0.001 0.139] [ 0. 0.596 0.174 0.152 0.731 0.188 0.01 0.144]] |
4. 二值化数据
您可以使用二值阈值转换数据。所有高于阈值的值都标记为 1,所有等于或低于阈值的值都标记为 0。
这被称为数据二值化或数据阈值化。当您有希望变为清晰值的概率时,这可能很有用。当进行特征工程并希望添加表示有意义的新特征时,这也很实用。
您可以使用 scikit-learn 中的 Binarizer 类在 Python 中创建新的二值属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 二值化 从 sklearn.预处理 导入 Binarizer import pandas import numpy url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = pandas.read_csv(url, 名称=名称) array = dataframe.values # 将数组分离为输入和输出组件 X = 数组[:,0:8] Y = 数组[:,8] 二值化器 = Binarizer(阈值=0.0).fit(X) binaryX = 二值化器.transform(X) # 总结转换后的数据 numpy.set_printoptions(精度=3) 打印(binaryX[0:5,:]) |
您可以看到所有等于或小于 0 的值被标记为 0,所有大于 0 的值被标记为 1。
1 2 3 4 5 |
[[ 1. 1. 1. 1. 0. 1. 1. 1.] [ 1. 1. 1. 1. 0. 1. 1. 1.] [ 1. 1. 1. 0. 0. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1.] [ 0. 1. 1. 1. 1. 1. 1. 1.]] |
总结
在这篇文章中,您了解了如何使用 scikit-learn 在 Python 中为机器学习准备数据。
您现在掌握了以下方法:
- 重新缩放数据。
- 标准化数据。
- 归一化数据。
- 二值化数据。
这篇文章的行动步骤是输入或复制粘贴每个食谱,并熟悉 scikit-learn 中的数据预处理。
您对 Python 中的数据预处理或本文有任何疑问吗?请在评论中提问,我将尽力回答。
嗨,Jason,
关于归一化,如果您打算使用欧几里得或余弦距离度量来查找数据框中的相似项,还需要这样做吗?
例如,您有一个向量,其中每一列都包含有关产品的一些属性,并且您想找到具有相似属性的其他产品。
期待您的想法
谢谢
SM
太棒了!
谢谢你,欧内斯特。
嗨,Jason,
感谢您的文章和整个网站。它真的解释了很多。
我有一个关于数据准备的问题,如果我要对输入数据进行归一化,值的精度是否会产生影响?如果训练数据不是很高,在训练时更高的精度是否会使权重矩阵更稀疏?
在这种情况下,我应该根据训练数据的数量限制精度吗?
我感兴趣的是 EEG 的序列分类,在这种情况下我打算尝试 RNN。我计划对数据进行归一化,因为我希望对每个单独的输入序列执行缩放。
希望能收到您的回复,谢谢!
好问题,阿克沙伊。
我没有明确的答案。它可能会。我没有看到它产生影响,但我也不会排除这种可能性。
如果您担心,我建议使用不同精度和不同转换的数据样本进行测试,并评估其效果。
我预计您的模型配置将对性能产生更大的影响。
嗨,贾森,谢谢你的回复。
我打算从头开始为类似情感分析的应用构建一个 RNN(多对一)。我有点困惑最后阶段。在训练时,当我向训练集输入一个序列(属于某个类别)时,我是否只对网络的最后一个输出应用 softmax 并计算损失,而其余的则不处理?
多对“一”到底体现在哪里?
抱歉,阿克沙伊,我没有从头开始实现 RNN 的示例。
我的建议是查看 Keras 等标准深度学习库的源代码。
是否应该分别对测试集和训练集进行归一化?还是必须在分割之前对整个数据集进行归一化?
是的。对训练数据集进行归一化,并使用训练集中的最小/最大值来归一化测试集。
在这种情况下,测试集的最小/最大值可能小于或大于训练集的最小/最大值。如果出现这种情况,会导致验证问题吗?
如果可能,您应该使用领域知识估算它们,否则,从训练集估算,如果它们超出已知范围,则裁剪测试数据。
嗨,贾森,我经常读到人们对输入特征进行归一化,而不是对输出进行归一化,为什么?
如果输出也有很宽的尺度范围,从 1e-3 到 1e3,我们是否也应该对输出特征进行归一化?
顺便说一句,这是为了解决回归问题。
在回归中也可以对输出变量进行归一化,但是您需要反转预测的缩放以利用它们或以有意义的方式引用错误分数(例如,对您的问题有意义)。
当我对输出变量不应用归一化时,MSE 损失非常高(1e8),而当应用归一化时,MSE 损失很小(0.0xxx)。
我的实现有问题吗?当输出变量没有归一化时,我应该运行大量 epoch(可能是 50000?)吗?(目前使用归一化运行 500 epoch)。
也许吧。继续尝试不同的方法,看看您是否能更多地了解您的系统/问题。
@罗伊,
– 如果不进行归一化,并且特征的尺度不相似,那么梯度下降需要很长时间才能收敛 [1]
– 如果 Root MSE 远小于预测向量的平均值/中位数,我认为您的模型足够好
[1] Stranford.edu: https://www.youtube.com/watch?v=yQci-wS0iMw&list=PLZ9qNFMHZ-A4rycgrgOYma6zxF4BZGGPW&index=21https://www.youtube.com/watch?v=yQci-wS0iMw&list=PLZ9qNFMHZ-A4rycgrgOYma6zxF4BZGGPW&index=21
归一化输入变量旨在使输入和输出变量之间的潜在关系更易于建模。
您的教程太棒了。🙂
我已将 rescaledX 转换为数据框,并绘制了重新缩放、标准化和归一化的直方图。它们似乎都将属性的幅度缩小到很小的范围——重新缩放和归一化情况下为 0 到 1。
——它们是否正在进行类似的转换,即将属性缩小以便它们变得可比较?
——在任何给定情况下,您是否只应用一种方法?
——在什么情况下哪种方法更合适?
提前感谢。
好问题。
这篇文章解释了它们的工作原理和何时使用它们
https://machinelearning.org.cn/how-to-scale-data-for-long-short-term-memory-networks-in-python/
嗨,杰森,我真的很喜欢你的帖子。我正在寻找一些关于对数据进行幂变换(例如使用对数和指数等)的解释。我真的很想了解它对数据做了什么,以及我们数据科学家如何成为这些缩放技术的强大用户。
最好的建议是尝试一系列转换,看看哪种方法能产生更具预测性的模型。
我有一些关于对数和 Box-Cox 变换的帖子,请尝试搜索功能。
嗨 Jason,感谢您的所有帖子,我有一个关于多层感知器分类算法的问题
如果我们想将此算法应用于混合数据集(数值和标称)。
例如(23,125,75,black,green)此数据分别表示年龄、长度、重量、发色、眼睛颜色。
对于数值属性,我们将数据归一化到相同的范围。
标称属性怎么办?
我们需要将标称属性转换为二元属性吗?
我建议使用整数编码或独热编码。
通常使用独热编码。
我有很多关于这个主题的帖子。
你好 Jason,很棒的帖子
然而,
我有一个问题(可能和 Dimos 的问题差不多)。
预处理(我指的是使用四种解释中的一种)最常见的方法是什么?
您将多少值归一化?
所有特征 (X)
fit_transform 训练特征 (X_train_std=model.fit_trainsform(X_train)) 并从中转换 X_test (X_test_std=model.transform(X_test))
然后
如果我们必须预测今天获得的新特征(例如:糖尿病模型中的 0,95,80,45,92,36.5,0.330,26,0),
我们是否需要预处理该特征,或者它是否不相关且无需预处理即可预测
感谢您的帮助
用于训练模型的任何数据准备过程都必须在用最终模型对新数据进行预测时执行。
这意味着缩放中使用的系数(例如最小/最大值)实际上是模型的一部分,必须谨慎选择。
谢谢你的回答
嗨 Jason
我正在对网络攻击者数据应用归一化。我使用了最小/最大归一化。但在真实数据中,有些特征具有很大的值。如果我想应用标准差归一化。我应该只应用一种归一化类型吗?或者我可以对所有数据应用最小/最大值,然后对所有数据应用标准差。顺序是什么?如果我只对大值特征应用标准差归一化,这是否错误?
我建议尝试这两种方法,看看哪种方法最适合您的数据和模型。
我不明白这两个命令。
X = dataset[:,0:8]
Y = dataset[:,8]
这被称为数组切片,我明天会在博客上发表关于这个主题的文章。
这里,我们选择列 0-7 作为输入,列 8 作为输出。
尊敬的 Jason Brownlee 博士,我已经准备好自己的不同人的手写数据集,并且将图像准备为 28X28 像素,所以问题是我如何准备训练和测试数据集,以便我随后编写代码来识别数据?
听起来很棒。
我的想法是你能帮我怎么做吗?以及我如何使用 TensorFlow 读取我的图像数据集和训练数据集?
也许这个例子会有帮助
https://machinelearning.org.cn/object-recognition-convolutional-neural-networks-keras-deep-learning-library/
那是一个很棒的链接,展示了如何使用现有的 CIFAR-10,谢谢你,但正如我上面提到的,我有 28x28 像素的手写图像,所以如何准备训练集(如何标记我的数据集)?它可以是 .csv 或 .txt 文件,我需要如何准备训练集并像 MNIST 一样在 TensorFlow 中访问它?
图像将是标准的图像格式,如 jpg 或 png,标签将保存在 csv 文件中,可能与每个文件名关联。
嗨,贾森。首先,教程做得很好。
不过,我有一点不明白。重新缩放数据和归一化数据有什么区别?它们似乎都在确保所有值都在 0 到 1 之间?
那么区别是什么?
谢谢。
请将答案也通过电子邮件发送给我,因为我不常查看此博客
jourdandgo@gmail.com
归一化是一种重新缩放。
你好先生!我正在计划一项关于音乐流派分类的研究工作。我的工作包括为我想使用的音乐类型准备数据集,因为目前还没有公开的数据集。我的问题是我不知道如何准备音乐数据集。我读了很多关于声谱图的资料。但是,准备音乐数据集的最佳机制是什么?我只能使用声谱图,还是有其他选择?
抱歉,我无法帮助您处理音乐数据集。我希望将来能涵盖这个主题。
你好,如果我想缩放一个尺寸为 3x64x64 的图像。如何使用 StandardScaler() 来实现?谢谢你
抱歉,标准缩放器不用于缩放图像。
那么,为了提高训练图像的性能,我们应该使用哪种缩放方法?或者,只是将训练集除以一个值,例如 train_x/255,……?
尝试一系列转换,看看哪种最适合您的数据。
嗨,贾森,谢谢你的帖子。
我有一个关于数据预处理的问题。我们能否有多个不同形状的输入?例如,两个不同的文件,一个包含位向量,一个包含矩阵?
如果可以,我们如何将它们用于机器学习算法?
基本上,我想向数据添加额外信息,以便分类器可以用于更好的预测。
对于大多数算法,输入数据必须重新整形和填充以保持同质性。
感谢您的回复。是的,我明白了。这些额外信息就像元数据一样,提供了有关生成数据结构的信息。因此,它是一种单独的类型,提供了更多关于系统的信息。有没有办法将其应用于机器学习算法?
当然,也许您可以使用多输入模型或模型集成。
您有什么链接/参考资料建议我阅读更多相关内容吗?我还没有找到好的资源。提前感谢。
嗨,Jason,
Y 是用来做什么的?我知道评论和描述说它是输出列,但是在将“class”列切片给它之后,我没有看到 Y 在四个示例中用于任何地方。将其注释掉似乎没有任何效果。它只是一个稍后的占位符吗?如果是这样,我们为什么要将“class”数据分配给它而不是创建一个空数组?
谢谢,
约翰
在这些示例中,我们没有准备类变量。在建模过程中需要它。
感谢您的精彩文章。我想问一个关于使用 scikit learn 库的简单最近邻算法和标准设置的问题。我有一个来自销售线索表的销售线索数据列列表,其中包含页面停留总时间、电子邮件打开总数等指标,以及字母值,例如销售线索来源(值有注册、联系我们等),以及原产国信息。
到目前为止,我已将所有非数值数据以简单的方式(每个唯一值使用 0、1、2、3、4)转换为数值形式。使用这种方法,评分准确率似乎最高达到 70%。现在我想更进一步,对数据集进行归一化或标准化,但无法真正决定采取哪条路线。到目前为止,我已决定遵循最安全的建议,对所有数据进行标准化。但随后我担心某些情况,例如某些字段将具有较长的数值范围,即那些代表每个国家或显示发送电子邮件数量的字段。另一方面,其他字段,如来源,将具有数值 0、1、2、3,不再有,但该字段本身与赢得或失去销售线索的结果具有非常高的相关性。
如果您能给我指明正确的方向,并且也许不用过多深入细节,告诉我常识性的方法,我将不胜感激。
另外,是否可以对数据集同时使用两种方法,即先标准化数据,然后归一化。
谢谢,
多纳塔斯
好问题。
数据准备方法必须与数据一起缩放。对于计数,您可以估计可以用来归一化计数的最大可能/合理计数,或者反转计数,例如 1/n。
嗨 @jason 您能告诉我为什么归一化器结果和重新缩放 (0-1) 结果不同吗?难道没有一种标准方法可以做到这一点,无论使用哪个类(即 MinMaxScaler 或 normalizer)都应该给出相同的结果吗?
我不明白,抱歉。你能提供更多上下文吗?
嗨,先生。我有一个住房数据集,其目标变量呈正偏态分布。到目前为止,这是我见过的唯一偏态变量,尽管我认为会有更多。现在我读到需要使用对数变换使这个分布近似于正态分布。但我现在面临的挑战是如何对住房数据集中的价格特征进行对数变换。我想知道 scikit-learn 是否有库可以做到这一点,如果没有,我应该如何做?此外,我计划使用线性回归来预测这个数据集的房价。
您可以使用 Box-Cox 变换来修正偏度
https://machinelearning.org.cn/power-transform-time-series-forecast-data-python/
嗨 Jason
我使用 MinMaxScaler 预处理技术来归一化我的数据。我有 200 名患者的数据,每个患者的单个电极数据为 20 秒,即 10240 个样本。那么,我的数据的维度是 200*10240。我想按行重新缩放我的数据,但 MinMaxScaler 按列缩放数据,这对于我的数据可能不正确,因为我想将我的数据相应地重新缩放为 1*10240。
为了独立于其他电极按行操作,需要进行哪些更改?
通常,数据的每一列代表一个单独的特征,可能与其他列具有不同的尺度或单位。
因此,按列缩放数据是良好的实践。
这有帮助吗?
哈啰先生,
我收集了 1000 条关于废钞的推文。然后我提取了不同的特征,如基于词性、基于词典的特征、形态特征、N-gram 特征。因此,每种类型都创建了不同的特征向量,然后它们按列堆叠。我将 1000 条推文的数据集分为 80% 作为训练集,20% 作为测试集。我已经训练了 SVM 分类器,但准确率不超过 60%。
我应该如何提高准确率,或者我需要使用哪种特征选择?
谢谢
这里有一些想法
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
对我来说最大的问题是。为什么我们要使用随机值作为权重和偏置值?
好问题。
神经网络对权重使用随机初始值。这是设计使然。它允许学习算法(批次/小批次/随机梯度下降)每次评估模型时从不同的起点探索权重空间,从而消除训练过程中的偏差。
这就是为什么通过训练模型的多个实例来评估神经网络是一个好主意的原因。
https://machinelearning.org.cn/evaluate-skill-deep-learning-models/
这有帮助吗?
X = array[:,0:8]
Y = array[:,8] 我在这里有疑问,X 只是右侧特征的 0,Y 是目标第 8 列,对吗?
通过检查数据来确认,它是正确的。
在此处了解有关 Python 数组切片和范围的更多信息
https://machinelearning.org.cn/index-slice-reshape-numpy-arrays-machine-learning-python/
非常感谢您的帮助——我从您的所有帖子中学到了很多!
我有一个项目,其中有 54 个输入变量和 8 个输出变量。我从您那里学到的知识获得了不错的结果。但是,我已经标准化了所有输入变量,我认为如果我只标准化其中一些,我可以获得更好的性能。这意味着,5 个输入列与输出具有相同的变量类型,我认为最好不要缩放它们。此外,其中一个输入是年份中的月份——我认为这也不需要标准化。
我进行选择性预处理的思路有意义吗?这可能吗?
谢谢你
不客气,山姆。
也许吧。我建议设计并运行仔细的实验来测试您的想法。让结果指导您,而不是“最佳实践”。
嗨,Jason,
非常有用的文章。我尝试访问 Pima 印第安人糖尿病数据集,但由于权限限制,该链接已无法下载。
请注意,我提供了文章中的另一个链接。
它又来了
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv
不知怎的,我错过了。谢谢!🙂
没问题。
我有 n 维二进制数据。请为二进制数据集推荐一些好的分类器。
尝试一系列方法,看看哪种最适合您的特定数据集。
您好 Jason,我正在自学机器学习,因此非常关注您的帖子。关于数据缩放/归一化,我总是左右为难。什么时候用什么?有没有办法预先知道哪些回归/分类模型将受益于数据缩放或归一化?哪些模型不需要缩放或归一化数据?
好问题,我在这里回答
https://machinelearning.org.cn/faq/single-faq/when-should-i-standardize-and-normalize-data
嗨,Jason,
感谢您的这篇文章。这非常有帮助。我有一个关于归一化/标准化方法的问题,当数据集包含数值和类别特征时。我正在将类别特征转换为虚拟值(包含 0 或 1)。数值特征是否应该与虚拟变量一起标准化?
或者,2)数值特征是否应该只进行标准化?
请提供您的想法。
无需缩放虚拟变量。
你好 Jason,
感谢您分享您的专业知识!我是一个完全的 Python 新手,但以前在 EViews 等统计软件中编写过程序。sklearn.database 中的数据集格式是否不同?我尝试运行以下代码
# 加载数据
from sklearn.datasets import load_iris
iris = load_iris()
from matplotlib import pyplot as plt
# 我们正在绘制的特征的索引
x_index = 0
y_index = 1
# 此格式化程序将用正确的标签名称标记颜色条
formatter = plt.FuncFormatter(lambda i, *args: iris.target_names[int(i)])
plt.figure(figsize=(5, 4))
plt.scatter(iris.data[:, x_index], iris.data[:, y_index], c=iris.target)
plt.colorbar(ticks=[0, 1, 2], format=formatter)
plt.xlabel(iris.feature_names[x_index])
plt.ylabel(iris.feature_names[y_index])
plt.tight_layout()
plt.show()
对于 sklearn 中的数据集,它运行良好。但是一旦我使用 pandas.read_csv 从 URL 加载 iris 数据集,然后运行代码,它就会给我一堆愤怒的文本。如果我使用 pandas.read_csv,我应该如何格式化和存储数据,以便上述 scipy 代码可以工作?非常感谢!
也许可以尝试这个教程来学习如何加载 CVS 文件
https://machinelearning.org.cn/load-machine-learning-data-python/
嗨!贾森,感谢您的精彩教程。我有一个问题,很想听听您的看法。
根据统计学知识,我们使用以下公式来归一化数据
[ X – min(X) ]/( [max(X) – min(X) ] )。
使用这个公式,当我尝试计算归一化数据时,我得到的结果与 Normalizer 类得到的结果不同。这是为什么呢?
我相信 Normalizer 正在归一化向量长度。
请改用 MinMax 缩放器。
如何构建一个可以重新缩放数据、标准化数据、归一化数据、二值化数据的单一模块?请解释。
您可以创建一个管道
https://machinelearning.org.cn/automate-machine-learning-workflows-pipelines-python-scikit-learn/
非常感谢。
我很高兴它能帮到你。
我是一个 Python 新手,你的评论非常有帮助,Jason。
你能指导我如何评论类别分布是平衡的还是不平衡的,并且可以打印训练和测试数据中 1 和 0 的总数吗?
我这里有一些处理不平衡数据的建议
https://machinelearning.org.cn/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
嗨,Jason,
你的文章太棒了,非常感谢,我会一直订阅。
我有一个问题,在对回归模型的输入进行缩放并创建模型后,当我使用这个 ckpt 文件时,我需要再次缩放我的输入数据,我如何将这个缩放传递到我将使用模型的地方?通过 TF 会话吗?
也许更清楚地说明我想做什么
训练时我这样做(我的数据是 csv 文件中的多个样本)
scaler = StandardScaler().fit(X_train)
X_standard = scaler.transform(X_train)
验证时我这样做(我的数据是 csv 文件中的多个样本)
scaler = StandardScaler().fit(X_validate)
X_standard = scaler.transform(X_validate)
但这里出现了问题,使用保存的模型,我想用一个样本作为输入来恢复模型
X_scaler = preprocessing.StandardScaler()
X_test_test = X_scaler.fit_transform(X_test)
但它给我输出 [[0,0,0,0,0,]],因此我无法用模型对象预测任何东西。你能告诉我我哪里做错了吗?
抱歉,我不确定我是否理解这个问题。您想做什么?
我正在使用 TensorFlow 构建一个模型,在批量处理数据进行训练之前,我正在使用 StandardScaler 对其进行缩放。
模型创建后,我想恢复检查点并进行预测,但输入的未经缩放。
所以我的问题是,在恢复模型时如何以相同的方式缩放数据?
因为在训练数据时,我正在对所有数据,即整个 data.csv 文件进行缩放,但稍后恢复模型时,我的输入是一个单一的样本。
我希望现在更清楚了。
您也必须保存缩放器,或者缩放器使用的系数。
你能给我一个例子吗?我用 pickle 进行了序列化,然后再次使用它,但这看起来不是最优雅的选择。
您可以使用 pickle。
我想我在一些 NLP 教程中看到过保存缩放器和标记器的示例。
嗨,Jason,
我正在使用 sklearn StandardScaler(copy = False, with_mean = True, with_std= True) 对 CIFAR-10 数据进行预处理。然后我通过 PCA 降维,再在主成分上进行 LDA。问题是,如果我在没有预处理的情况下进行降维,一切正常;但是,如果在预处理之后这样做,我就会遇到“内存错误”。我正在使用 SVD 求解器进行 PCA,并使用带有自动收缩的特征求解器进行 LDA(线性判别)。您对可能导致此问题的原因有什么想法吗?
** 我尝试了最小最大缩放,但没有调用库函数。即使那样,我仍然得到相同的错误。
谢谢你
不知道,抱歉。也许可以把你的代码和错误发布到 Stack Overflow 上?
嗨,Jason。我最近通过直接微分推导出了用于训练前馈神经网络的 LM 算法的精确 Hessian 和梯度。我还使用你建议的两种技术——缩放和归一化——对输入数据进行了数据预处理。在某些数据集中,我观察到比 MATLAB 中的神经网络工具箱更快的收敛速度。你也可以在以下链接查看已发表的论文:
https://www.omicsonline.org/open-access/direct-differentiation-based-hessian-formulation-for-training-multilayerfeed-forward-neural-networks-using-the-lm-algorithmperform-2229-8711-1000223.pdf
我是否可以在我的论文完成后发送给你审阅?
谢谢并致以最诚挚的问候,
Najam
干得不错。
抱歉,我没有时间审阅你的论文。
很棒的文章!你有什么见解关于是否可以连续使用多个缩放器/归一化器吗?我的意思是将它们依次应用于原始数据集。
我在这里有一些关于它们顺序的建议
https://machinelearning.org.cn/machine-learning-data-transforms-for-time-series-forecasting/
有没有办法通过邮件报告机器学习结果集?
你具体指的是什么?
你可以编写代码发送电子邮件,但那是一个工程问题,而不是机器学习问题。
尊敬的布朗利博士,
请您回答我这个相对简单的问题
在 ANN 中,输入数据被缩放,ANN 的输出在 (0) 和 (1) 之间。如何将输出转换回实数,例如功率、阻抗、电压、电流等。
非常感谢您的回复,
诚挚的问候
Ahmad Allawi
顾问电气工程师
PTC 社区成员-Mathcad 部,
在 scikit-learn 中,你可以使用:encoder.inverse_transform() 来实现这一点
嘿,Jason,感谢你的教程。
我尝试了所有给定的预处理技术,然后使用 SVC 训练数据
我发现 MinMaxScale 提供了最高的准确度
所以我的问题是,我们是否应该始终选择能提供最高准确度的预处理技术?
准确度?
是的,正是如此。
使用能提供最佳模型性能的预处理技术。
嗨,jason
我可以在预测问题中这样做吗?
这是在 python 中
data_set = data_set_ / 100000
在预测之前我这样做了
之后我做了 predict*100000
这是对的吗
是的,如果曾经出现的最大值是 10 万。
这意味着如果先除以 100000,最后再乘以预测结果,这是可以的吗?。先缩放数据,最后再反缩放。我不明白“to see data 100K”的意思。
你能解释一下或者分享一些链接吗?谢谢。
不进行缩放和反缩放,误差很大。我曾认为如果不缩放和反缩放,结果应该相同,但误差很大。
是的,听起来不错。
重新缩放和数据归一化有什么区别?
归一化是一种重新缩放。
嗨,Jason,
一个快速问题。我应该对输入和标签都进行 standardscaler 吗?还是只对输入进行即可?它们之间有什么区别?你推荐哪种?谢谢。
Sang-Ho
哎呀!类似的问题上面已经回答了。请忽略这个问题。谢谢
不客气。
对于回归,是的,这可能是一个好主意。
我建议测试对输入和输出进行缩放和不缩放的情况,以确认它能提升模型技能。
我查阅的大多数参考文章都使用了数据集中某种数值数据。我如何处理非数值数据来构建推荐系统?我非常期待您的帮助。提前谢谢。
如果数据是分类的,你可以将其编码为整数、one-hot 编码或使用嵌入。
这有帮助吗?
你能分享一个包含推荐系统创建的例子吗?
感谢您的建议,我希望将来能涵盖这个话题。
有没有可能/情况,我们得到的评分预测值高于实际评分?比如说我使用的数据集包含 1-5 分的评分,一旦我应用协同过滤技术,我发现某些项目的预测评分是 5.349++?
也许,这取决于你选择的模型。
如果你的模型这样做,例如神经网络,你可能需要编写一些代码来帮助解释预测,例如将其向下取整。
我最初以为推荐系统中出现高于预测值的实际结果可能是错误的。非常感谢您的解释。
maxVal = max(data_set[0:num, 0]).astype(‘float32’)
predict, len(test)+1-i) – maxVal
嗨 Jason,我可以问你上面这两行代码如果我这样做是对的吗?因为如果我不减去 maxVal,真实值和预测值之间有很大的差异,一条曲线接近最大值,另一条曲线接近低值
也许可以发布到 stackoverflow?
我想是的。因为数据集中的最大值是 55000,如果不减去 maxVal 函数,最大预测值会达到 10000,并且预测值显示在 10000 附近,真实值显示在 55000 附近。另外,请推荐一些链接,说明如何在 CNN 中使用一周或一年前的预测值来预测未来 24 小时或一周的数据?
我有没有办法在使用以下代码重新采样数据集的过程中检测并忽略异常值?
df1= df.resample('3T').agg(dict(Tme='first', Vtc='mean', Stc='mean'))
这一行通过“Tme”对数据进行分组,并使用落在特定“Tme”的所有“Vtc”值计算“Vtc”和“Stc”的平均值。但其中一些数据点是异常值。我能在 .agg() 中做些什么来在评估平均值时忽略异常值吗?
请在此处查看我在 stackoverflow 上的问题
https://stackoverflow.com/questions/56276509/detect-and-exclude-outliers-when-resampling-by-mean-pandas
也许在收集样本后使用统计方法?
在为机器学习准备数据时,我们有 3 种选择:我们应该重新缩放数据、标准化数据或归一化数据。对于 Pima Indian 糖尿病数据集,我应该选择哪种选项?因为数据可视化显示,有些属性接近高斯分布,有些则呈指数分布。因此,当属性具有混合分布时,如果我选择标准化,这对具有高斯分布的属性有利,但对指数分布的属性不利,因为这些属性我们应该选择对数或立方根。那么我们如何处理这个问题呢??
这取决于所使用的模型。
我建议使用不同的模型测试不同的数据准备方法,以快速找到效果好的组合。
这很巧妙,但都应用于训练数据。如果我们创建了这个模型并对其感到满意,但每晚都会收到一批新数据需要评分,该怎么办?有没有办法以一种可以将所有这些预处理方法直接应用于新数据集的方式保存,最好只需几行代码。(例如,R 中的 vtreat 包可以进行一些数据处理,你可以保存“处理计划”,然后在对任何新数据进行评分时应用它)。
在 Python 中有没有简单的实现方法?
是的,你可以使用管道。
https://machinelearning.org.cn/automate-machine-learning-workflows-pipelines-python-scikit-learn/
你可以每晚重新训练模型,并与旧模型进行比较,看看哪种效果最好。
嗨,Jason先生,
我正在处理包含“JavaScript 代码样本”的数据集。我必须对数据集进行预处理,以便它可以用于后续模型。对于这种类型的数据集,我应该使用哪种类型的编码?
也许比较一下词袋模型和词嵌入?
谢谢你的回复。我想,由于数据集不是用于文档分析的,所以我怀疑 BOW 是否会起作用。你能不能稍微澄清一下?
或许可以试试看?
ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64’).
我需要你的帮助来解决这个错误,我是初学者。
也许在建模之前尝试从数据中删除 NaN 值?
你也可以包含 RobustScaler(),它使用对异常值具有鲁棒性的统计数据来缩放特征。
https://scikit-learn.cn/stable/modules/generated/sklearn.preprocessing.RobustScaler.html
好建议!
非常感谢您,先生。从您的帖子中学到了很多知识。但我的问题是,数据预处理对于机器学习创建预测模型有什么好处
谢谢。
更好地向学习算法展示问题的结构。
我有一个 400001x16 不同类型传感器的数据。如何选择输入形状并对一个类神经网络进行分类??
训练和测试不同的数据.....
这些是不同类型的传感器数据,如何设置输入形状??
如何在神经网络中分类??
如果这些是时间序列,那么这将向你展示如何重塑数据。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
这些是无标签数据,所以如何进行分类??
如果你想将数据建模为分类,你必须有标签才能学习。
如何自动创建特定对象的数据集,而无需手动输入
我不知道。
如果我的数据集中有太多的 0 和 1,我应该使用哪种方法?
我建议测试一系列数据准备和建模算法,以发现最适合你的特定数据集的方法。
嗨
我非常喜欢你的帖子。我有一个问题。请帮帮我
我有一个数据集。我想用 Kmeans 对客户进行聚类。所以我预处理了我的数据
Recency Frequency Monetary (近因、频率、货币)
302 312 5288.63
31 196 3079.1
2 251 7187.34
95 28 948.25
数据重新缩放、数据归一化、数据标准化。在上述三种方法中。我应该选择哪种方法来预处理我的数据集
也许从归一化开始。
非常非常感谢你。我读了很多你的帖子。真的很棒
谢谢!
嗨
请帮帮我
我有一个数据集。我想通过 Kmeans 对客户进行聚类。所以我预处理了我的数据。我使用了“归一化方法”,然后对仅预处理过的数据进行了 Kmeans。但是结果与其他聚类方法相差很大。所以我不能确定。我的代码在我使用“归一化方法”进行预处理时是对还是错。(我刚开始学习 Python,很抱歉我的英语不好)
Recency Frequency Monetary (近因、频率、货币)
302 312 5288.63
31 196 3079.1
2 251 7187.34
95 28 948.25
#预处理 ———————————————–
col_names = ['R','F', 'M']
#步骤3:归一化数据
from sklearn.preprocessing import Normalizer
normalizer = Normalizer()
tx_user[col_names] = normalizer.fit_transform(tx_user[col_names])
是的,结果将取决于输入数据的规模。
谢谢。祝你有个美好的一天。
不客气。
干得好...
谢谢!
你能解释一下数据归一化和数据重新缩放之间的区别吗?
和数据重新缩放之间的区别?
我的疑问在于当我们重新缩放到 0 到 1 之间时。为什么它们不相同?
另外
“在 scikit-learn 中,归一化是指将每个观测(行)重新缩放为长度为 1(在线性代数中称为单位范数)。”
“行被归一化为长度 1。”
我没懂这些话。
请解释一下。
归一化是一种特定类型的重新缩放。重新缩放是一个更广泛的术语,可能包括标准化和其他技术。
“归一化”这个词令人困惑。在线性代数中,它意味着将向量的幅度设为 1,这也是 sklearn 获取名称并将其称为“minmaxscaler”来缩放每一列的原因。
在统计学中,我们将特征(列)的归一化称为标准化。这是我用于 minmaxscaler 的通用名称。
使用“NORMALIZER”后如何反转值,我的意思是如何恢复原始值?
使用
好的。谢谢。
我如何可视化单词数据。例如,我有一个包含单词的 csv 文件,但我无法可视化它。
我不知道如何可视化单词,抱歉。
嗨 Jason,我使用 LHS 采样的数据已经归一化,所以它的直方图看起来是均匀分布而不是正态分布,那么还需要进行数据转换吗?如果需要,我应该为我的问题进行什么样的转换。
嗨 Abhishek……关于各种变换的概述可以在以下资源中找到
https://www.analyticsvidhya.com/blog/2020/07/types-of-feature-transformation-and-scaling/