sklearn中StratifiedKFold和StratifiedShuffleSplit的区别
difference between StratifiedKFold and StratifiedShuffleSplit in sklearn
从标题看,我想知道
有什么区别
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 的优势是什么
在 KFolds 中,每个测试集不应重叠,即使是随机播放。使用 KFolds 和 shuffle,数据在开始时被打乱一次,然后分成所需的拆分数。测试数据始终是拆分之一,训练数据是其余部分。
在ShuffleSplit中,每次都会对数据进行shuffle,然后进行split。这意味着测试集可能会在拆分之间重叠。
有关差异的示例,请参见此块。注意 ShuffleSplit 测试集中元素的重叠。
splits = 5
tx = range(10)
ty = [0] * 5 + [1] * 5
from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFold
from sklearn import datasets
kfold = StratifiedKFold(n_splits=splits, shuffle=True, random_state=42)
shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)
print("KFold")
for train_index, test_index in kfold.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)
输出:
KFold
TRAIN: [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 Split
TRAIN: [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]
至于何时使用它们,我倾向于使用 KFolds 进行任何交叉验证,并且我将 ShuffleSplit 的拆分为 2 用于我的 train/test 集拆分。但我确信两者还有其他用例。
@Ken Syme 已经有了很好的答案。我只是想补充一点。
StratifiedKFold
是 KFold
的变体。首先,StratifiedKFold
打乱您的数据,然后将数据拆分为 n_splits
部分并完成。
现在,它将使用每个部分作为测试集。请注意,它只会并且总是在拆分之前将数据洗牌一次。
使用 shuffle = True
,数据由您的 random_state
打乱。除此以外,
数据按 np.random
打乱(默认)。
例如,对于 n_splits = 4
,您的数据对于 y
(因变量)有 3 个 classes(标签)。 4个测试集覆盖所有数据,没有任何重叠。
- 另一方面,
StratifiedShuffleSplit
是 ShuffleSplit
的变体。
首先,StratifiedShuffleSplit
打乱您的数据,然后还将数据拆分为 n_splits
部分。然而,这还没有完成。在这一步之后,StratifiedShuffleSplit
选择一个部分作为测试集。
然后它重复相同的过程 n_splits - 1
次,以获得 n_splits - 1
其他测试集。看下图,同样的数据,但是这次4个测试集没有覆盖所有的数据,即测试集之间有重叠。
因此,这里的区别在于StratifiedKFold
只是洗牌和拆分一次,因此测试集不重叠,而StratifiedShuffleSplit
每次拆分前shuffle,拆分n_splits
次,测试集重叠。
- 注意:这两种方法都使用了"stratified fold"(这就是为什么"stratified"出现在两个名称中的原因)。这意味着每个部分保留与原始数据相同百分比的每个 class(标签)样本。您可以在 cross_validation documents
阅读更多内容
KFold、StratifiedKFold、StratifiedShuffleSplit的输出示例:
以上图形输出是@Ken Syme
代码的扩展:
from sklearn.model_selection import KFold, StratifiedKFold, StratifiedShuffleSplit
SEED = 43
SPLIT = 3
X_train = [0,1,2,3,4,5,6,7,8]
y_train = [0,0,0,0,0,0,1,1,1] # note 6,7,8 are labelled class '1'
print("KFold, shuffle=False (default)")
kf = KFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("KFold, shuffle=True")
kf = KFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("\nStratifiedKFold, shuffle=False (default)")
skf = StratifiedKFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("StratifiedKFold, shuffle=True")
skf = StratifiedKFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("\nStratifiedShuffleSplit")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=3)
for train_index, test_index in sss.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("\nStratifiedShuffleSplit (can customise test_size)")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=2)
for train_index, test_index in sss.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
从标题看,我想知道
有什么区别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 的优势是什么
在 KFolds 中,每个测试集不应重叠,即使是随机播放。使用 KFolds 和 shuffle,数据在开始时被打乱一次,然后分成所需的拆分数。测试数据始终是拆分之一,训练数据是其余部分。
在ShuffleSplit中,每次都会对数据进行shuffle,然后进行split。这意味着测试集可能会在拆分之间重叠。
有关差异的示例,请参见此块。注意 ShuffleSplit 测试集中元素的重叠。
splits = 5
tx = range(10)
ty = [0] * 5 + [1] * 5
from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFold
from sklearn import datasets
kfold = StratifiedKFold(n_splits=splits, shuffle=True, random_state=42)
shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)
print("KFold")
for train_index, test_index in kfold.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)
输出:
KFold
TRAIN: [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 Split
TRAIN: [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]
至于何时使用它们,我倾向于使用 KFolds 进行任何交叉验证,并且我将 ShuffleSplit 的拆分为 2 用于我的 train/test 集拆分。但我确信两者还有其他用例。
@Ken Syme 已经有了很好的答案。我只是想补充一点。
StratifiedKFold
是KFold
的变体。首先,StratifiedKFold
打乱您的数据,然后将数据拆分为n_splits
部分并完成。 现在,它将使用每个部分作为测试集。请注意,它只会并且总是在拆分之前将数据洗牌一次。
使用 shuffle = True
,数据由您的 random_state
打乱。除此以外,
数据按 np.random
打乱(默认)。
例如,对于 n_splits = 4
,您的数据对于 y
(因变量)有 3 个 classes(标签)。 4个测试集覆盖所有数据,没有任何重叠。
- 另一方面,
StratifiedShuffleSplit
是ShuffleSplit
的变体。 首先,StratifiedShuffleSplit
打乱您的数据,然后还将数据拆分为n_splits
部分。然而,这还没有完成。在这一步之后,StratifiedShuffleSplit
选择一个部分作为测试集。 然后它重复相同的过程n_splits - 1
次,以获得n_splits - 1
其他测试集。看下图,同样的数据,但是这次4个测试集没有覆盖所有的数据,即测试集之间有重叠。
因此,这里的区别在于StratifiedKFold
只是洗牌和拆分一次,因此测试集不重叠,而StratifiedShuffleSplit
每次拆分前shuffle,拆分n_splits
次,测试集重叠。
- 注意:这两种方法都使用了"stratified fold"(这就是为什么"stratified"出现在两个名称中的原因)。这意味着每个部分保留与原始数据相同百分比的每个 class(标签)样本。您可以在 cross_validation documents 阅读更多内容
KFold、StratifiedKFold、StratifiedShuffleSplit的输出示例:
以上图形输出是@Ken Syme
代码的扩展:
from sklearn.model_selection import KFold, StratifiedKFold, StratifiedShuffleSplit
SEED = 43
SPLIT = 3
X_train = [0,1,2,3,4,5,6,7,8]
y_train = [0,0,0,0,0,0,1,1,1] # note 6,7,8 are labelled class '1'
print("KFold, shuffle=False (default)")
kf = KFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("KFold, shuffle=True")
kf = KFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("\nStratifiedKFold, shuffle=False (default)")
skf = StratifiedKFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("StratifiedKFold, shuffle=True")
skf = StratifiedKFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("\nStratifiedShuffleSplit")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=3)
for train_index, test_index in sss.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)
print("\nStratifiedShuffleSplit (can customise test_size)")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=2)
for train_index, test_index in sss.split(X_train, y_train):
print("TRAIN:", train_index, "TEST:", test_index)