У меня есть простой конвейер, который я использую для подачи некоторых данных в несколько различных линейных моделей для сравнения.Это просто стандартный скейлер, за которым следует регрессор.Когда я делаю это для регрессии Лассо или Риджа, все это прекрасно работает:
lassocv = Pipeline([('scaler', StandardScaler()), ('lasso', linear_model.LassoCV(n_jobs=-1, cv=5))])
lassocv.fit(X_train, y_train)
y_hat_lasso_train = lassocv.predict(X_train)
Приведенный выше код дает мне такую форму:
Iтакже повторил это для RidgeCV
регрессии и получил очень похожий результат.Если я делаю в основном то же самое с ElasticNetCV, я получаю, казалось бы, хорошее соответствие, но входные данные (X_train
) выглядят сжатыми, и поэтому мои показатели RMS огромны:
eln = Pipeline([('scaler', StandardScaler()), ('eln',
linear_model.ElasticNetCV(normalize=False, n_jobs=-1, cv=5))])
eln.fit(X_train, y_train)
y_hat_elastic_train = eln.predict(X_train)
Если я уберу StandardScaler
и сохраню настройку normalize=False
, проблема исчезнет, но я не понимаю, почему.В соответствии с документами ,
Если вы хотите стандартизировать, пожалуйста, используйте sklearn.preprocessing.StandardScaler, прежде чем вызывать подгонку на оценщике с normalize = False.
Так почему мой StandardScaler
не работает?У меня также, кажется, возникает та же проблема при использовании SVR
регрессора, но даже если я удаляю StandardScaler
, проблема остается.
Я думаю, что я довольно хорошо знаком с регрессией LASSO и Ridge, номеньше с Elastic Net и SVM.Так что это может быть просто недоразумение, как работают алгоритмы.