我目前正在处理一个分类问题,并对sklearn
/scikit-learn
Python模块的交叉验证功能有疑问。考虑以下调用:
cv_scores = cross_validation.cross_val_score(rfc, X, y, cv=self.cv_folds, n_jobs = 1)
其中self.cv_folds
是一个数字,例如5。该函数实际上返回一个数组,其中包含交叉验证的每个折叠的分数。但现在我需要了解函数是如何执行拆分的。这意味着,在每次迭代中,哪些记录被分配给测试和训练集。为了更清楚,让我们考虑一个小的数据集示例:
(1) 0 1:9151.57142857 2:158.0 3:0.0136674259681 4:5.0 5:438.0 6:6.0 7:9.25388888889
(2) 1 1:3884.8 2:20338.0 3:0.0280373831776 4:194.0 5:320.0 6:9.0 7:42.8808333333
(3) 0 1:5219.5 2:241.0 3:0.00171821305842 4:55.0 5:1745.0 6:3.0 7:42.8808333333
(4) 0 1:1386.0 2:2125.0 3:0.0161290322581 4:315.0 5:309.0 6:5.0 7:14.8722222222
(5) 1 1:5508.375 2:27.0 3:0.00302245250432 4:1231.0 5:2315.0 6:7.0 7:591.213611111
(6) 1 1:12488.0 2:404.0 3:0.020942408377 4:31.0 5:190.0 6:4.0 7:9.25388888889
(7) 1 1:1748.4 2:0.0 3:0.00293685756241 4:376.0 5:1361.0 6:4.0 7:96.5372222222
(8) 1 1:3401.25 2:476.0 3:0.0714285714286 4:16.0 5:41.0 6:3.0 7:3.19722222222
(9) 1 1:2748.4 2:614.0 3:0.25 4:3.0 5:15.0 6:4.0 7:3.19722222222
(10) 1 1:1386.0 2:2125.0 3:0.0161290322581 4:47.0 5:309.0 6:5.0 7:14.8722222222
(X) 表示行号,类标签的第一个值和1-7中的值是特征索引,每个值后面都跟着它的值。现在我想知道函数的精确拆分策略。为了更清楚地说明,以下示例显示了如何在每次迭代中将数据拆分为测试集和训练集的两种不同方式:
示例1:
迭代1:(1)-(2)测试
迭代2:(3)-(4)测试
迭代3:(5)-(6)测试
示例2
迭代1:(1)和(3)测试
迭代2:测试的(2)和(4)
迭代3:测试的(5)和(7)
有人知道该函数使用的确切拆分策略吗?或者,任何人都可以声明一个函数来查看这些拆分,而不仅仅是结果?
提前感谢您的时间和精力。
如果cv_folds
是一个cv对象,那么查看list(self.cv_folds)
,您会发现一个元组列表[(train1, test1), (train2, test2), ...]
。
如果self.cv_folds
只是一个数字,那么考虑明确设置交叉验证迭代器,例如:
from sklearn.cross_validation import KFold, StratifiedKFold
## Choose one of the two next lines
cv = KFold(self.cv_folds) # for regression
cv = StratifiedKFold(y, self.cv_folds) # for classification
cv_scores = cross_validation.cross_val_score(rfc, X, y, cv=cv)
现在,使用list(cv)
,您可以恢复训练/测试拆分的所有索引。
请注意,默认的交叉验证迭代器取决于您的估计器(分类器或回归器)的性质,因此如果您需要这种级别的详细信息,最好是明确说明。