我正在努力学习使用scikit-learn进行一些基本的统计学习任务 . 我以为我已经成功创建了一个适合我的数据的LinearRegression模型:
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
X, y,
test_size=0.2, random_state=0)
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
print model.score(X_test, y_test)
产量:
0.797144744766
然后我想通过自动交叉验证做多个类似的4:1拆分:
model = linear_model.LinearRegression()
scores = cross_validation.cross_val_score(model, X, y, cv=5)
print scores
我得到这样的输出:
[ 0.04614495 -0.26160081 -3.11299397 -0.7326256 -1.04164369]
交叉验证分数如何与单个随机分组的分数如此不同?他们都应该使用r2评分,如果我将 scoring='r2'
参数传递给 cross_val_score
,结果是相同的 .
我已经尝试了 random_state
参数的许多不同选项到 cross_validation.train_test_split
,它们都在0.7到0.9范围内给出相似的分数 .
我使用的是sklearn版本0.16.1
3 回答
train_test_split似乎生成数据集的随机拆分,而cross_val_score使用连续集,即
“当cv参数是一个整数时,cross_val_score默认使用KFold或StratifiedKFold策略”
http://scikit-learn.org/stable/modules/cross_validation.html
根据数据集的性质,例如在一个片段的长度上高度相关的数据,连续的集合将给出与例如来自整个数据集的随机样本 .
事实证明,我的数据是按不同类的块排序的,默认情况下
cross_validation.cross_val_score
选择连续拆分而不是随机(混乱)拆分 . 我能够通过指定交叉验证应该使用混乱拆分来解决这个问题:这使:
这符合我的预期 .
伙计们,感谢这个帖子 .
上面答案中的代码(施耐德)已经过时了 .
从scikit-learn == 0.19.1开始,这将按预期工作 .
最好,
M.