2017-04-25 63 views
-1

我在实现交叉验证设置时遇到了一些麻烦,我在论文中看到了这个设置。基本上这是在附图中解释: enter image description here如何实施n次重复的k-fold交叉验证,在sklearn中产生n * k倍的折叠?

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

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

原因基本上,我的代码也产生100倍。任何建议?

+0

是的,你可以使用它。此代码片段与@Abhishek Thakur的答案具有相同的效果。 –

回答

0

我敢肯定,他们在谈论什么RepeatedStratifiedKFold。你有两个简单的方法来创建20次5次。

方法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不能是一个固定的数字,否则您将获得20次相同的5次折叠。

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

0

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

你的意思是'我在范围内(20):'?但它会做什么?是不是只会一次又一次地重新分配kfold变量? –

+0

@AryoPradiptaGema是的,它会。你需要在k循环中实现你的剩余代码。 'random_state'将确保大部分时间你会得到不同的数据分割。 –

+0

我有另一个麻烦,我得到'bad_alloc'错误。任何想法如何释放一些内存后的一些迭代? –