#python #scikit-learn #regression #cross-validation
#python #scikit-learn #регрессия #перекрестная проверка
Вопрос:
Я выполняю линейную регрессию, используя метод Лассо в sklearn.
В соответствии с их руководством и тем, что я видел в другом месте, вместо простого проведения перекрестной проверки всех обучающих данных рекомендуется разделить их на более традиционные разделы обучающего набора / набора проверки.
Таким образом, лассо обучается на обучающем наборе, а затем гиперпараметр alpha настраивается на основе результатов перекрестной проверки набора проверки. Наконец, принятая модель используется в тестовом наборе, чтобы дать реалистичное представление о том, как она будет работать в реальности. Разделение проблем здесь является превентивной мерой против переоснащения.
Актуальный вопрос
Соответствует ли Lasso CV вышеуказанному протоколу или он просто каким-то образом обучает параметры модели и гиперпараметры на одних и тех же данных и / или во время одних и тех же циклов CV?
Спасибо.
Ответ №1:
Если вы используете sklearn.cross_validation.cross_val_score
с sklearn.linear_model.LassoCV
объектом, то вы выполняете вложенную перекрестную проверку. cross_val_score
разделит ваши данные на обучающие и тестовые наборы в соответствии с тем, как вы указываете сгибы (что можно сделать с такими объектами, как sklearn.cross_validation.KFold
). Набор поездов будет передан LassoCV
, который сам выполняет другое разделение данных, чтобы выбрать правильный штраф. Похоже, это соответствует настройке, которую вы ищете.
import numpy as np
from sklearn.cross_validation import KFold, cross_val_score
from sklearn.linear_model import LassoCV
X = np.random.randn(20, 10)
y = np.random.randn(len(X))
cv_outer = KFold(len(X), n_folds=5)
lasso = LassoCV(cv=3) # cv=3 makes a KFold inner splitting with 3 folds
scores = cross_val_score(lasso, X, y, cv=cv_outer)
Ответ: нет, LassoCV
не будет выполнять всю работу за вас, и вы должны использовать его в сочетании с cross_val_score
, чтобы получить то, что вы хотите. В то же время это разумный способ реализации таких объектов, поскольку мы также можем быть заинтересованы только в подборе оптимизированного гиперпараметра LassoCV
, не обязательно оценивая его непосредственно на другом наборе предоставленных данных.
Комментарии:
1. просто для подтверждения: единственная цель внутреннего разделения — выбрать «лучший» гиперпараметр C в LassoCV? И если модель отсутствует в этом списке, то рекомендуемый способ настройки гиперпараметров (скажем, для SVR) — использовать GridSearchCV или RandomizedSearchCV? Таким образом, внешний CV не улучшает модель, а просто проверяет, как работает с невиданными ранее данными? Если использовать простую множественную линейную регрессию (без гиперпараметров), модель не может быть настроена на общую производительность?
2. Утвердительно отвечаю на все эти вопросы. Что касается последнего вопроса: способ настроить модель — включить столбцы / функции или нет. Если вы используете a
sklearn.pipeline.Pipeline
, вы можете добавить селектор функций, напримерsklearn.prepreprocessing.SelectKBest
, к вашим OLS в конвейере, и использовать этот конвейер вGridSearchCV
, где последний проверяет разные числаk
.3. Эй, после того, как вы вложите
LassoCV
его внутрьcross_val_score
и запустите в обучающем наборе, есть ли какой-нибудь способ проверить установленные параметры, чтобы повторно запустить их в тестовом наборе?4. Кроме того, если вы хотите использовать оценку RMSE, следует ли использовать
cross_val_score
Lasso
GridSearchCV
вместоcross_val_score
LassoCV
для вложенной перекрестной проверки?5. Примечание: Кто-то пытался отредактировать этот пост, чтобы отразить текущий
sklearn
API, который используетsklearn.model_selection.cross_val_score/KFold
вместоsklearn.cross_validation.cross_val_score/KFold
и используетn_splits
вместоn_folds
. Это редактирование было отклонено достаточным количеством рецензентов для принятия решения, но не является ложным. Я оставлю ответ как есть, потому что я думаю, что он все еще работает (хотя и с предупреждением об устаревании), но если кто-нибудь хочет внести еще один вклад в редактирование, пожалуйста, продолжайте.