В чем разница между «обычной» k-кратной перекрестной проверкой с использованием shuffle= True и повторной k-кратной перекрестной проверкой?

#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]