使用 shuffle=True 的“正常”k 折交叉验证和重复的 k 折交叉验证有什么区别?

问题描述

谁能解释使用 shuffle 函数的“正常”k 折交叉验证之间的区别,例如

kf = KFold(n_splits = 5,shuffle = True)

和重复的 k 折交叉验证?他们不应该返回相同的结果吗?

很难理解其中的差异。

感谢任何提示

解决方法

顾名思义,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',['red',['yellow','banana'],'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,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]