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

Есть ли что-то, что я упускаю при строительстве трубопровода? Спасибо большое!


person Dona Ray    schedule 25.08.2020    source источник
comment
Я не уверен, но я думаю, что проблема в вашем первом фрагменте. Попробуйте изменить метод X_test_std = scalar.fit_transform(X_test) на метод transform. Вы никогда не должны подгонять свои трансформаторы к вашим тестовым данным. Дайте мне знать, если это работает, поэтому я опишу это более подробно.   -  person Szymon Bednorz    schedule 25.08.2020
comment
Ваши тестовые данные стандартизируются без конвейерного кода. Пока не в с трубопроводом. Это привело к тому, что результат стал другим. Используйте одинаковые тестовые данные в обоих тестах.   -  person Muhammad Hamza Sabir    schedule 25.08.2020


Ответы (1)


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

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

person Sanyam Lakhanpal    schedule 26.08.2020