拆分数据前后的 StandardScaler

数据挖掘 机器学习 scikit-学习 预处理
2021-09-24 20:49:57

当我阅读有关 using的信息StandardScaler时,大多数建议都说您应该在将数据拆分为训练/测试StandardScaler 之前使用,但是当我检查在线发布的一些代码(使用 sklearn)时,有两个主要用途。

1- 使用StandardScaler所有数据。例如

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_fit = sc.fit(X)
X_std = X_fit.transform(X)

或者

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit(X)
X = sc.transform(X)

或者干脆

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_std = sc.fit_transform(X)

2-StandardScaler在拆分数据上使用。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

我想标准化我的数据,但我很困惑哪种方法最好!

3个回答

为了防止有关测试集分布的信息泄漏到您的模型中,您应该选择选项 #2 并将缩放器仅适用于您的训练数据,然后使用该缩放器对训练集和测试集进行标准化。通过在拆分之前在完整数据集上拟合缩放器(选项#1),有关测试集的信息用于转换训练集,然后将其传递到下游。

例如,了解整个数据集的分布可能会影响您检测和处理异常值的方式,以及您如何参数化模型。尽管数据本身没有公开,但有关数据分布的信息却公开了。因此,您的测试集性能并不是对未见数据性能的真实估计。在Cross Validated上您可能会发现一些有用的进一步讨论

您不应该fit_transform(X_test)对测试数据进行操作。
拟合已经在上面发生了。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

以下情况如何:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

因为如果X_test = sc.transform(X_test),它返回错误X_test尚未安装。还是我在这里错过了什么?