拆分数据前后的StandardScaler


20

当我阅读有关使用的内容时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)

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

Answers:


25

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

例如,了解整个数据集的分布可能会影响检测和处理异常值的方式以及参数化模型的方式。尽管没有公开数据本身,但是有关数据分布的信息却公开了。结果,您的测试集性能并不是对看不见的数据的真实评估。您可能会发现有用的其他讨论在“ 交叉验证”中


验证集是否也一样?换句话说,如果我将训练集分为训练集和验证集,我是否只学习训练,然后再应用于验证集和测试集?还是我学习包含验证和训练示例的整个数据集的拟合度,而仅担心稍后将其应用于测试集。
Phil Glau

嗨-没错,只适合在火车上-不能进行验证或测试
没错

0

怎么样:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

因为if X_test = sc.transform(X_test),它还X_test没有返回错误。还是我想念这里的东西?


2
只需从X_test中移除合适的位置
tsumaranaina

0

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

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

抱歉,这是对以下内容的答复:)
starsini,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.