Как LassoCV в scikit-изучает данные раздела?

#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 . Это редактирование было отклонено достаточным количеством рецензентов для принятия решения, но не является ложным. Я оставлю ответ как есть, потому что я думаю, что он все еще работает (хотя и с предупреждением об устаревании), но если кто-нибудь хочет внести еще один вклад в редактирование, пожалуйста, продолжайте.