Изменение размера теста и поезда во время перекрестной проверки

#python-3.x #scikit-learn #cross-validation

#python-3.x #scikit-learn #перекрестная проверка

Вопрос:

Я выполняю регрессионную модель с перекрестной проверкой в 10 раз.

 for train, test in kf.split(X, Y):
   print ("Fold ", cv)
   print("Train", X[train].shape)
   print("Test", X[test].shape)
   # define the model
   Breg = BayesianRidge(n_iter = 500, tol=0.0000000001)
   # fit the data to the model
   Breg.fit(X[train], Y[train])
   # calculate R2 for each fold and save the value into a file
   R2.append(Breg.score(X[test], Y[test]))
   # predict in test set
   ypred_test = Breg.predict(X[test])
   Y_pred_test.append(ypred_test)
   # calculate mean squared error for each fold and save into a list
   mae.append(mean_absolute_error(Y[test], ypred_test))
  

Когда я запускал модель, я наблюдал изменение размера обучения и теста.

 Fold  1
Train (14754, 9)
Test (1640, 9)
Fold  2
Train (14754, 9)
Test (1640, 9)
Fold  3
Train (14754, 9)
Test (1640, 9)
Fold  4
Train (14754, 9)
Test (1640, 9)
Fold  5
Train (14755, 9)
Test (1639, 9)
Fold  6
Train (14755, 9)
Test (1639, 9)
Fold  7
Train (14755, 9)
Test (1639, 9)
Fold  8
Train (14755, 9)
Test (1639, 9)
Fold  9
Train (14755, 9)
Test (1639, 9)
Fold  10
Train (14755, 9) 
Test (1639, 9)
  

Вы можете видеть, что после сгиба 5 размер обучения увеличился на 1, а размер теста уменьшился на 1
Есть идеи, как это может произойти и может быть исправлено?
Заранее спасибо

Ответ №1:

Ответ можно найти в документации KFold , которая, как я полагаю, соответствует вашему kf in kf.split .

В примечаниях говорится:

Первые n_samples % n_splits сгибы имеют размер n_samples // n_splits 1 , другие сгибы имеют размер n_samples // n_splits , где n_samples — это количество выборок.

Вставляя числа, вы можете видеть, что первые 4 разделения будут иметь размер n_samples // n_splits 1 , а остальные — размер n_samples // n_splits , так что разница в размерах будет равна 1 .

Комментарии:

1. Спасибо, Ким, я прочитал это, и в нем упоминалось об этом. Но как я могу это решить?

2. Что вы хотите решить? Причина, по которой он обрабатывается таким образом, заключается в том, что вы не можете создать 10 сгибов одинакового размера, поскольку ваши результаты n_samples % n_splits равны 4, что означает, что вы можете разделить его только на 10 (10-кратные) с остальными 4. Чтобы затем иметь дело с этими 4 оставшимися точками данных и сохранить разницу в размере сгибов небольшой, у первых четырех сгибов есть еще одна точка данных, чтобы использовать остальные 4.

3. Хорошо, теперь я понимаю, что вы имеете в виду. когда мы делим на 10, остается 4. Большое спасибо за разъяснения