1

我正在尝试使用 StandardScaler() 和 LogisticRegression() 构建管道。当我使用和不使用管道进行编码时,我会得到不同的结果。这是我没有管道的代码:

clf_LR = linear_model.LogisticRegression()
scalar = StandardScaler()
X_train_std = scalar.fit_transform(X_train)
X_test_std = scalar.fit_transform(X_test)
clf_LR.fit(X_train_std, y_train)
print('Testing score without pipeline: ', clf_LR.score(X_test_std, y_test))

我的管道代码:

pipe_LR = Pipeline([('scaler', StandardScaler()), 
                    ('classifier', linear_model.LogisticRegression())
                   ])
pipe_LR.fit(X_train, y_train)
print('Testing score with pipeline: ', pipe_LR.score(X_test, y_test))

这是我的结果:

Testing score with pipeline:  0.821917808219178
Testing score without pipeline:  0.8767123287671232

在尝试调试问题时,数据似乎正在标准化。但是使用管道的结果与在我的原始 X_train 数据上训练模型的结果相匹配(不应用 StandardScaler())。

clf_LR_orig = linear_model.LogisticRegression()
clf_LR_orig.fit(X_train, y_train)
print('Testing score without Standardization: ', clf_LR_orig.score(X_test, y_test))

Testing score without Standardization:  0.821917808219178

在管道的建设中我缺少什么吗?非常感谢!

4

1 回答 1

1

正如 szymon-bednorz 评论的那样,通常我们不会 fit_transform 对测试数据进行拟合,而是使用fit_transform(X_train)and transform(X_test)。当您的训练和测试数据来自相同的分布并且大小X_train大于时,这非常有效X_test

此外,正如您在调试时发现的那样,通过管道进行拟合提供了与拟合逻辑回归提示相同的精度,X_train并且X_test已经缩放。虽然我不确定这一点。

于 2020-08-26T10:25:05.900 回答