将具有数字的列转换为 0 到 1 之间的范围是一种好习惯吗?

数据挖掘 数据清理
2021-09-21 23:22:47

数据科学相对较新。我听说过将包含整数的列转换为 0 到 1 之间的范围。我认为原因是所有列在它们的范围内都会更加相似。我认为,可能还有一个步骤是删除异常值(非常高的整数),这样它们不会导致所有其他结果被偏斜为低分数。

这是准确的吗?

如果是,是否有一个简单的命令可以使用 Pandas 数据集实现它?

4个回答

这种转换称为 min-max-scaling,通常也称为标准化。

Scikit learn 提供了MinMaxScaler()这个(见这里)。这是一个改编自 Mueller 和 Guido 的“Python 机器学习简介”的示例:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

cancer = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
random_state=1)

scaler = MinMaxScaler()

scaler.fit(X_train)

X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

(旁注:请记住,仅在训练数据而不是测试数据上拟合缩放器!)

在 Raschka 的《Python 机器学习》一书中,作者提供了 min-max-scaling/standardization 与 normalization 的简要实用比较(后者意味着减去均值并除以方差):

尽管通过 min-max 缩放进行标准化是一种常用的技术,当我们需要有界区间内的值时很有用,但标准化对于许多机器学习算法可能更实用。原因是许多线性模型,例如逻辑回归和 SVM,[...] 将权重初始化为 0 或接近 0 的小随机值。使用标准化,我们将特征列的中心在均值 0 处,标准差为 1,因此特征列采用正态分布的形式,这使得学习权重更容易。此外,标准化保留了有关异常值的有用信息,并使算法对它们不太敏感,这与将数据缩放到有限值范围的 min-max 缩放相比。

我认为分位数转换器有些混淆:https ://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.QuantileTransformer.html#sklearn.preprocessing.QuantileTransformer它实际上将值缩放为0-1范围。目标是获得均匀分布。它的用途与 minmax scaler imho 不同。值得注意的是,如果你得到异常值,它可能会有所帮助。

要更全面地了解不同缩放器的功能: https ://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py

首先,您决定转换变量的方式应该取决于您使用它们的目的。

一般来说,我不建议你做你所说的。

然而,通常用来处理变量不在“相似范围”内的问题是标准化。要标准化,您只需从值中减去平均值并除以标准偏差。这导致变量均具有均值 0 和标准差 1。

是否要进行数据转换,实际上取决于您使用的算法。基于树的算法(决策树、随机森林、梯度提升算法)是尺度不变的,因此不会从转换中受益。而对于 K-Nearest Neighbors,您可能希望缩放您的特征,否则具有较大值的特征会受到不成比例的影响。