sklearn StandardScaler,不允许直接变换,我们需要fit_transform

Posted

技术标签:

【中文标题】sklearn StandardScaler,不允许直接变换,我们需要fit_transform【英文标题】:sklearn StandardScaler, doesn't allow direct transform, we need to fit_transform 【发布时间】:2019-01-29 23:09:21 【问题描述】:

fit_transform 和 transform 有什么区别? 为什么直接转换不起作用?

from sklearn.preprocessing import StandardScaler

 X_scaler = StandardScaler()
 X_train = X_scaler.fit_transform(X_train)
 X_test = X_scaler.transform(X_test)

如果直接转换,则会出现以下错误

NotFittedError:此 StandardScaler 实例尚未安装。称呼 在使用此方法之前,“适合”适当的参数。

【问题讨论】:

【参考方案1】:

StandardScaler,如per documentation:

通过去除均值和缩放到单位方差来标准化特征

因此,它首先需要以某种方式了解数据的均值和方差。 因此需要fit()fit_transform(),以便StandardScaler 可以遍历所有数据以找到均值和方差。那些可以访问 按属性:

mean_:训练集中每个特征(列)的平均值。

var_ :训练集中每个特征的方差。

请注意,这些数据将针对数据中的每一列单独计算。

transform() 中,它只会使用meanvariance 的值来缩放数据。

现在你可能会说为什么它在transform() 期间不计算这些属性。这样做是为了使测试数据的缩放方式与训练数据的缩放方式相同(来自fit_transform())。如果您在每次调用transform() 时计算数据的均值和方差,那么所有传递的数据将具有不同的比例,这不是您想要的。

这适用于所有 scikit 转换器。

1) fit() - 只会遍历数据并保存所有需要的数据属性

2) transform() - 使用fit() 中保存的属性来更改数据

3) fit_transform() - fit()transform() 相同数据的实用函数。

通常你会在训练数据上调用fit_transform(),而在测试数据上只调用transform()

【讨论】:

谢谢,有道理。 @PARASNIGAM 因为答案解决了您的问题,请接受它 - 请参阅What should I do when someone answers my question?

以上是关于sklearn StandardScaler,不允许直接变换,我们需要fit_transform的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 笔记:数据归一化(StandardScaler)

sklearn.preprocessing.StandardScaler数据标准化

意外的结果sklearn StandardScaler

用于 R 的可训练 sklearn StandardScaler

sklearn StandardScaler 返回全零

sklearn StandardScaler 似乎无法正常工作