#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. Большое спасибо за разъяснения