как по-настоящему понять перекрестную проверку kfold в sklearn - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь использовать kfold в sklearn и действительно пытаюсь понять, что он делает. Я читаю Python машинное обучение 3-е издание Себастьяном Рашкой.

В главе 6 https://github.com/rasbt/python-machine-learning-book-3rd-edition/blob/master/ch06/ch06.ipynb

У него есть код для StraifiedKFold

kfold = StratifiedKFold(n_splits=10).split(X_train, y_train)
scores = []
for k, (train, test) in enumerate(kfold):
    pipe_lr.fit(X_train[train], y_train[train])
    score = pipe_lr.score(X_train[test], y_train[test])
    scores.append(score)
    print('Fold: %2d, Class dist.: %s, Acc: %.3f' % (k+1,
          np.bincount(y_train[train]), score))

print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
  1. Я не уверен, когда он создает экземпляр, kfold использует только набор поездов? почему не весь набор?

Итак, взглянув на документацию перекрестной проверки kfold https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html, на этот раз они разбили весь набор, но только набор данных X.

Почему на этот раз разбит весь набор данных, но только X?

Итак, я пытаюсь использовать 10-кратную перекрестную проверку, ниже приведен мой код

gbr_onehot = GradientBoostingRegressor(
n_estimators  = 1000,
learning_rate = 0.1,
random_state  = 0
)

kfold = KFold(n_splits=10, shuffle=True, random_state=0).split(X)

train_score = []
test_score  = []

for k, (train, test) in enumerate(kfold):
    gbr_onehot.fit(X[train], y[train])

    train_pred = gbr_onehot.predict(X[train])
    train_score.append(metrics.mean_squared_error(train_pred, y[train]))

    test_pred  = gbr.onehot.predict(X[test])
    test_score.append(metrics.mean_squared_error(test_pred, y[test]))

, который дает мне KeyError: "None of [Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 9,\n 10,\n ...\n 18313, 18314, 18315, 18316, 18317, 18318, 18319, 18320, 18321,\n 18322],\n dtype='int64', length=16490)] are in the [columns]

Я использую cross_val_score, однако хочу получить mse набора поездов.

Я прочитал много SO вопросов, а другие, однако, все еще в замешательстве.

1 Ответ

0 голосов
/ 11 марта 2020

Я не уверен, когда он создает экземпляр, kfold использует только набор поездов? почему не весь набор?

Правильный способ - оставить образец для проверки, хорошо ли обобщается ваша модель. Тем не менее, KFold предназначен для усреднения производительности модели во время обучения, поэтому ошибка будет усреднена путем удержания одного сплита за раз. Таким образом, каждое разделение будет проводиться для проверки и усреднения производительности в выборке . Затем разделение, которое вы держите (скажем, 0,25 от всего набора данных и которое не включено в KFold), будет использовано для проверки вне выборки (для целей обобщения).

Почему на этот раз разделен весь набор данных, но только X?

Поскольку они приводят пример использования функция, ради примера, ничего больше. Если они пробьют один сплит для тестирования вне образца, они могут запутать чтение о внутренней функциональности KFold.

Ошибка

Кажется, X ! = Y в качестве первоначального предположения. Тем не менее, используйте IDE, чтобы указать точное местоположение проблемы.

...