Неожиданные оценки перекрестной проверки с помощью 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 ] 

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

  • Использование срезов в Python
  • TypeError: только целые массивы с одним элементом могут быть преобразованы в индекс
  • как анализировать и прогнозировать (машинное обучение) набор данных временных рядов, используя scikit-learn для python
  • Использование косинусного расстояния с помощью scikit learn KNeighborsClassifier
  • scidit GridSearch и Python вообще не освобождают память
  • Как использовать sklearn CountVectorizer с анализатором «word» и «char»? - python
  • Разница между коэффициентами линейной регрессии между Python и R
  • Python 3 ImportError: невозможно импортировать имя «выбор модели» OS X 10.11.3, Anconda
  • Python - лучший язык программирования в мире.