No, sklearn
不做fit_transform
与整个数据集。
为了检查这一点,我将其子类化StandardScaler
打印发送给它的数据集的大小。
class StScaler(StandardScaler):
def fit_transform(self,X,y=None):
print(len(X))
return super().fit_transform(X,y)
如果您现在更换StandardScaler
在您的代码中,您会看到第一种情况下传递的数据集大小实际上更大。
但为什么准确率保持完全相同呢?我认为这是因为LogisticRegression
对特征尺度不是很敏感。如果我们使用对规模非常敏感的分类器,例如KNeighborsClassifier
例如,您会发现两种情况之间的准确性开始有所不同。
X,y = load_breast_cancer(return_X_y=True)
X_sc = StScaler().fit_transform(X)
lr = KNeighborsClassifier(n_neighbors=1)
cross_val_score(lr, X_sc,y, cv=5)
输出:
569
[0.94782609 0.96521739 0.97345133 0.92920354 0.9380531 ]
而第2个案例,
pipe = Pipeline([
('sc', StScaler()),
('lr', KNeighborsClassifier(n_neighbors=1))
])
print(cross_val_score(pipe, X, y, cv=5))
Outputs:
454
454
456
456
456
[0.95652174 0.97391304 0.97345133 0.92920354 0.9380531 ]
准确性方面变化不大,但仍然发生了变化。