Sklearn.pipeline дает неверный результат

Я пытаюсь построить конвейер с помощью 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

Что-то мне не хватает при строительстве трубопровода? Огромное спасибо!

1 ответ

Как прокомментировал Шимон-Беднорц, обычно мы не используем fit_transform для тестовых данных, мы скорее используем fit_transform(X_train) а также transform(X_test)Это работает очень хорошо, когда ваши обучающие и тестовые данные относятся к одному и тому же распределению, а размер X_train больше, чем X_test.

Кроме того, как вы обнаружили при отладке, эта подгонка через конвейер дает ту же точность, что и подгонка логистической регрессии намекает, что X_train а также X_testуже масштабировано. Хотя я в этом не уверен.

Другие вопросы по тегам