Неожиданные оценки перекрестной проверки с помощью scikit-learn LinearRegression

Я пытаюсь научиться использовать scikit-learn для некоторых базовых задач статистического обучения. Я думал, что успешно создал модель LinearRegression, подходящую для моих данных:

X_train, X_test, y_train, y_test = cross_validation.train_test_split( X, y, test_size=0.2, random_state=0) model = linear_model.LinearRegression() model.fit(X_train, y_train) print model.score(X_test, y_test) 

Который дает:

 0.797144744766 

Затем я хотел сделать несколько подобных разделов 4: 1 с помощью автоматической перекрестной проверки:

 model = linear_model.LinearRegression() scores = cross_validation.cross_val_score(model, X, y, cv=5) print scores 

И я получаю вывод следующим образом:

 [ 0.04614495 -0.26160081 -3.11299397 -0.7326256 -1.04164369] 

Как оценки перекрестной проверки могут отличаться от оценки одного случайного разделения? Предполагается, что они будут использовать оценку r2, и результаты будут одинаковыми, если я cross_val_score параметр scoring='r2' в cross_val_score .

Я попробовал несколько различных параметров для параметра random_state для cross_validation.train_test_split , и все они дают аналогичные оценки в диапазоне от 0,7 до 0,9.

Я использую sklearn версии 0.16.1

2 Solutions collect form web for “Неожиданные оценки перекрестной проверки с помощью scikit-learn LinearRegression”

Кажется, что train_test_split генерирует случайные расщепления набора данных, в то время как cross_val_score использует последовательные множества, т.е.

«Когда аргумент cv является целым числом, cross_val_score по умолчанию использует стратегии KFold или StratifiedKFold»

http://scikit-learn.org/stable/modules/cross_validation.html

В зависимости от характера вашего набора данных, например, данные, сильно скоррелированные по длине одного сегмента, последовательные множества будут давать значительно разные настройки, чем, например, случайные выборки из всего набора данных.

Оказывается, мои данные упорядочивались в блоках разных классов, и по умолчанию cross_validation.cross_val_score выбирает последовательные расщепления, а не случайные (перетасованные) расщепления. Я смог решить это, указав, что перекрестная проверка должна использовать перетасованные расщепления:

 model = linear_model.LinearRegression() shuffle = cross_validation.KFold(len(X), n_folds=5, shuffle=True, random_state=0) scores = cross_validation.cross_val_score(model, X, y, cv=shuffle) print scores 

Который дает:

 [ 0.79714474 0.86636341 0.79665689 0.8036737 0.6874571 ] 

Это соответствует ожиданиям.

  • sklearn selectKbest: какие переменные были выбраны?
  • Как извлечь уравнение из полинома?
  • Ошибка при попытке установить sklearn из Pycharm | arrayobject.h не может быть абсолютным
  • Scikit Learn: Логистические коэффициенты модели регрессии: Уточнение
  • В чем разница между cross_val_score с scoring = 'roc_auc' и roc_auc_score?
  • ImportError: невозможно импортировать имя inplace_column_scale
  • путают о random_state в дереве решений scikit learn
  • Приведение классификатора в производство
  • Используя scikit-learn (sklearn), как обрабатывать отсутствующие данные для линейной регрессии?
  • Регрессия OLS: Scikit против Statsmodels?
  • sklearn LogisticRegression и изменение порога по умолчанию для классификации
  • Python - лучший язык программирования в мире.