#python #scikit-learn #cross-validation #shuffle #k-fold
#python #scikit-learn #перекрестная проверка #перемешать #k-кратная
Вопрос:
может ли кто-нибудь объяснить разницу между «обычной» k-кратной перекрестной проверкой с использованием функции shuffle, например
kf = KFold(n_splits = 5, shuffle = True)
и повторной k-кратной перекрестной проверкой? Разве они не должны возвращать одинаковые результаты?
Трудно понять разницу.
Любой намек приветствуется.
Ответ №1:
Как следует из его названия, RepeatedKFold
повторяется KFold
. Он выполняет это n_repeats
несколько раз. Когда n_repeats=1
первое выполняется точно так же, как и последнее, когда shuffle=True
. Они не возвращают одинаковые разбиения, потому random_state=None
что по умолчанию, то есть вы его не указали. Поэтому они используют разные начальные значения для (псевдо-) случайного перемешивания данных.
Когда они одинаковы random_state
и повторяются один раз, то оба приводят к одинаковым разделениям. Для более глубокого понимания попробуйте следующее:
import pandas as pd
from sklearn.model_selection import KFold, RepeatedKFold
data = pd.DataFrame([['red', 'strawberry'], # color, fruit
['red', 'strawberry'],
['red', 'strawberry'],
['red', 'strawberry'],
['red', 'strawberry'],
['yellow', 'banana'],
['yellow', 'banana'],
['yellow', 'banana'],
['yellow', 'banana'],
['yellow', 'banana']])
X = data[0]
# KFold
for train_index, test_index in KFold(n_splits=2, shuffle=True, random_state=1).split(X):
print("TRAIN:", train_index, "TEST:", test_index)
# RepeatedKFold
for train_index, test_index in RepeatedKFold(n_splits=2, n_repeats=1, random_state=1).split(X):
print("TRAIN:", train_index, "TEST:", test_index)
Вы должны получить следующее:
TRAIN: [1 3 5 7 8] TEST: [0 2 4 6 9]
TRAIN: [0 2 4 6 9] TEST: [1 3 5 7 8]
TRAIN: [1 3 5 7 8] TEST: [0 2 4 6 9]
TRAIN: [0 2 4 6 9] TEST: [1 3 5 7 8]