【问题标题】:difference between StratifiedKFold and StratifiedShuffleSplit in sklearnsklearn中StratifiedKFold和StratifiedShuffleSplit的区别
【发布时间】:2018-02-08 16:44:57
【问题描述】:

从标题我想知道有什么区别

StratifiedKFold 带参数 shuffle = True

StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

StratifiedShuffleSplit

StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=0)

以及使用 StratifiedShuffleSplit 的优势是什么

【问题讨论】:

  • 一个是k-fold迭代器,将数据拆分k次,其他只拆分一次
  • mmm 在 StratifiedShuffleSplit 中,您可以设置拆分次数...从 sklearn 网页: StratifiedShuffleSplit :此交叉验证对象是 StratifiedKFold 和 ShuffleSplit 的合并,它返回分层随机折叠。通过保留每个类的样本百分比来进行折叠。
  • 啊,是的,我的错。但它仍然写在您链接的 StratifiedShuffleSplit 文档中,“这个交叉验证对象是 StratifiedKFold 和 ShuffleSplit 的合并,它返回分层随机折叠。折叠是通过保留每个类的样本百分比来实现的。”
  • 差异在于折叠之间(数据在折叠中不重叠)。而在 StratifiedShuffleSplit 中,它可以并且将会重叠。请参阅文档页面上给出的示例以更好地理解它。具体测试数据。在 StratifiedKFold 中,每次折叠总是不同的。而在 StratifiedShuffleSplit 中,它可以是重复的。
  • 听起来像 StratifiedKFold 没有替换的样本,而 StratifiedShiffleSplit 随机播放。因此,StratifiedShiffleSplit 的一个优势是您可以随意采样多次。当然,单个样本会有重叠——因此样本上的任何拟合模型都会相互关联——但您可以拟合更多模型,并且每个模型包含更多数据。

标签: python scikit-learn cross-validation


【解决方案1】:

在 KFolds 中,每个测试集都不应重叠,即使是 shuffle。使用 KFolds 和 shuffle 时,数据在开始时被 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 进行训练/测试集拆分。但我敢肯定两者都有其他用例。

【讨论】:

  • +1 为您提供出色的答案。请你回答my question
【解决方案2】:

@Ken Syme 已经有了一个很好的答案。我只是想补充一点。

  • StratifiedKFoldKFold 的变体。首先,StratifiedKFold 打乱您的数据,然后将数据拆分为n_splits 部分并完成。 现在,它将使用每个部分作为测试集。请注意,它只会并且总是在拆分前将数据洗牌一次

使用shuffle = True,数据由您的random_state 打乱。否则, 数据由np.random 打乱(默认)。 例如,使用n_splits = 4,您的数据有y(因变量)的3 个类(标签)。 4 个测试集覆盖所有数据,没有任何重叠。

  • 另一方面,StratifiedShuffleSplitShuffleSplit 的变体。 首先,StratifiedShuffleSplit 打乱您的数据,然后它还将数据拆分为 n_splits 部分。但是,它还没有完成。在这一步之后,StratifiedShuffleSplit 选择一个部分用作测试集。 然后它重复相同的过程n_splits - 1 其他时间,以获得n_splits - 1 其他测试集。看下图,数据一样,但这一次,4个测试集并没有覆盖所有数据,即测试集之间存在重叠。

所以,这里的区别在于StratifiedKFold 只是洗牌和分裂一次,因此测试集不重叠,而StratifiedShuffleSplit 每次在分裂前洗牌,然后分裂n_splits 次,测试集可以重叠

  • 注意:这两种方法都使用“分层折叠”(这就是为什么“分层”出现在两个名称中)。这意味着每个部分都保留了与原始数据相同百分比的每个类(标签)的样本。你可以在cross_validation documents阅读更多内容

【讨论】:

  • 完美解释!!
【解决方案3】:

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)

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 2016-10-04
    • 2021-06-19
    • 2020-04-27
    • 2020-12-07
    • 2018-07-02
    • 1970-01-01
    • 2016-12-08
    • 2015-03-21
    相关资源
    最近更新 更多