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
уже масштабировано. Хотя я в этом не уверен.