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()
中,它只会使用mean
和variance
的值来缩放数据。
现在你可能会说为什么它在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数据标准化