从标题来看,我想了解的是
StratifiedKFold 和参数 shuffle=True
StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
与
StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=0)
之间的区别,以及使用StratifiedShuffleSplit的优势是什么
回答:
在stratKFolds
中,每个测试集之间不应该有重叠,即使包含了shuffle
参数。使用stratKFolds
和shuffle=True
时,数据会在开始时进行一次洗牌,然后根据所需的分割数进行划分。测试数据总是其中的一个分割,训练数据则是剩余的部分。
在ShuffleSplit
中,每次都会对数据进行洗牌,然后进行分割。这意味着不同分割之间的测试集可能会有重叠。
请看下面的代码块以了解两者的区别。注意ShuffleSplit
中测试集元素的重叠情况。
splits = 5tx = range(10)ty = [0] * 5 + [1] * 5from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFoldfrom sklearn import datasetsstratKfold = StratifiedKFold(n_splits=splits, shuffle=True, random_state=42)shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)print("stratKFold")for train_index, test_index in stratKfold.split(tx, ty): print("TRAIN:", train_index, "TEST:", test_index)print("Shuffle Split")for train_index, test_index in shufflesplit.split(tx, ty): print("TRAIN:", train_index, "TEST:", test_index)
输出结果:
stratKFoldTRAIN: [0 2 3 4 5 6 7 9] TEST: [1 8]TRAIN: [0 1 2 3 5 7 8 9] TEST: [4 6]TRAIN: [0 1 3 4 5 6 8 9] TEST: [2 7]TRAIN: [1 2 3 4 6 7 8 9] TEST: [0 5]TRAIN: [0 1 2 4 5 6 7 8] TEST: [3 9]Shuffle SplitTRAIN: [8 4 1 0 6 5 7 2] TEST: [3 9]TRAIN: [7 0 3 9 4 5 1 6] TEST: [8 2]TRAIN: [1 2 5 6 4 8 9 0] TEST: [3 7]TRAIN: [4 6 7 8 3 5 1 2] TEST: [9 0]TRAIN: [7 2 6 5 4 3 0 9] TEST: [1 8]
关于何时使用它们,我倾向于在任何交叉验证中使用stratKFolds
,而在训练/测试集分割时使用ShuffleSplit
,分割数为2。但我相信这两者还有其他使用场景。