在进行特征缩放时,如果没有将StandardScaler()
赋值给一个变量,而是像下面这样编码:
from sklearn.preprocessing import StandardScalerx_train = StandardScaler().fit_transform(x_train)x_test = StandardScaler().transform(x_test)
会出现以下错误:
NotFittedError: This StandardScaler instance is not fitted yet. Call’fit’with appropriate arguments before using this method.
而下面的代码(给StandardScaler()
赋予了一个标识符)运行正常:
from sklearn.preprocessing import StandardScalersc_x = StandardScaler()x_train = sc_x.fit_transform(x_train)x_test = sc_x.transform(x_test)
这里,x_train
是训练数据集,x_test是测试数据集。
能有人解释一下这是为什么吗?
回答:
当你调用StandardScaler()
时,你创建了一个新的(也就是未拟合的)StandardScaler类对象。如果你想使用它,你必须先对其进行拟合,然后才能用它来转换任何数据。
你实际上“告诉”代码做的步骤是(伪代码):
- 创建一个新的缩放器对象
- 用你的训练数据对其进行拟合
- 创建另一个新的缩放器对象
- 不对其进行任何拟合,直接用它来转换一些数据
在第二个例子中,你创建了一个单一的缩放器对象,对其进行了数据拟合,然后使用同一个对象来转换你的测试数据(这是正确的使用方法)