交叉验证 sklearn - 如何执行拆分?
Cross Validation sklearn - How the splits are performed?
我目前正在处理一个 class 化问题,并且对 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. 该函数实际上 returns 一个数组,其中包含交叉验证的每个折叠的分数。但现在我需要知道函数如何执行拆分。这意味着,哪些记录已分配给每次迭代的测试和训练集。为了更清楚,让我们考虑一个小的示例数据集:
(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) 表示行号,class标签的第一个值和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-object,那么看看 list(self.cv_folds)
,你会发现一个元组列表 [(train1, test1), (train2, test2), ...]
.
如果 self.cv_folds
只是一个数字,则考虑明确设置 cross-validation 迭代器,例如如下:
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)
您可以恢复 train/test 拆分的所有索引。
请注意,默认的 cross-validation 迭代器取决于您的估计器(分类器或回归器)的性质,因此如果您需要这种详细程度,最好明确说明它。
我目前正在处理一个 class 化问题,并且对 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. 该函数实际上 returns 一个数组,其中包含交叉验证的每个折叠的分数。但现在我需要知道函数如何执行拆分。这意味着,哪些记录已分配给每次迭代的测试和训练集。为了更清楚,让我们考虑一个小的示例数据集:
(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) 表示行号,class标签的第一个值和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-object,那么看看 list(self.cv_folds)
,你会发现一个元组列表 [(train1, test1), (train2, test2), ...]
.
如果 self.cv_folds
只是一个数字,则考虑明确设置 cross-validation 迭代器,例如如下:
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)
您可以恢复 train/test 拆分的所有索引。
请注意,默认的 cross-validation 迭代器取决于您的估计器(分类器或回归器)的性质,因此如果您需要这种详细程度,最好明确说明它。