如何实现n次重复k-folds交叉验证,在sklearn中产生n * k个折叠?

时间:2017-04-25 14:37:55

标签: python scikit-learn keras

我在实现我在论文中看到的交叉验证设置时遇到了一些麻烦。基本上在附图中对此进行了解释: enter image description here

所以,它说他们使用5倍,这意味着k = 5。但随后,作者表示,他们重复交叉验证20次,共创造了100倍。这是否意味着我可以使用这段代码:

kfold = StratifiedKFold(n_splits=100, shuffle=True, random_state=seed)

因为基本上我的代码也产生了100倍。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我很确定他们在谈论RepeatedStratifiedKFold。你有两种简单的方法可以创建5倍的20倍。

方法1:

对于您的情况,n_splits=5, n_repeats=20。下面的代码只是来自scikit-learn网站的样本。

from sklearn.model_selection import RepeatedStratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 1, 1])

rskf = RepeatedStratifiedKFold(n_splits=2, n_repeats=2,
...     random_state=42)
>>> for train_index, test_index in rskf.split(X, y):
...     print("TRAIN:", train_index, "TEST:", test_index)
...     X_train, X_test = X[train_index], X[test_index]
...     y_train, y_test = y[train_index], y[test_index]
...
TRAIN: [1 2] TEST: [0 3] # n_repeats==1: the folds are [1 2] and [0 3]
TRAIN: [0 3] TEST: [1 2]
TRAIN: [1 3] TEST: [0 2] # n_repeats==2: the folds are [1 3] and [0 2]
TRAIN: [0 2] TEST: [1 3]

方法2:

  

循环可以达到相同的效果。请注意,random_state不能是固定数字,否则您将获得相同的5倍,持续20次。

for i in range(20):
    kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=i)

为什么它与您的代码不同?

假设您有10000个数据点并且您创建了100个折叠。大小1倍= 100.您的训练集= 9900,而验证集= 100。

RepeatedStratifiedKFold为您的模型创建5倍,每个折叠为2000.然后它再次重复5次,再次重复20次。这意味着您可以实现100倍,但具有更大的验证集。根据您的目标,您可能需要更大的验证集,例如。有足够的数据来正确验证,RepeatedStratifiedKFold使您能够以不同的方式创建相同数量的折叠(具有不同的培训验证比例)。 除此之外,我不确定是否还有其他目标。

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RepeatedStratifiedKFold.html

谢谢RepeatedStratifiedKFold

答案 1 :(得分:1)

怎么样

for i in range(100):
    kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=i)