繁体   English   中英

使用scikit-learn LinearRegression进行意外的交叉验证评分

[英]Unexpected cross-validation scores with scikit-learn LinearRegression

我正在努力学习使用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

事实证明,我的数据是按不同类的块排序的,默认情况下, cross_validation.cross_val_score选择连续拆分而不是随机( cross_validation.cross_val_score )拆分。 我能够通过指定交叉验证应该使用混乱拆分来解决这个问题:

model = linear_model.LinearRegression()
shuffle = cross_validation.KFold(len(X), n_folds=5, shuffle=True, random_state=0)
scores = cross_validation.cross_val_score(model, X, y, cv=shuffle)
print scores

这使:

[ 0.79714474  0.86636341  0.79665689  0.8036737   0.6874571 ]

这符合我的预期。

train_test_split似乎生成数据集的随机拆分,而cross_val_score使用连续集,即

“当cv参数是一个整数时,cross_val_score默认使用KFold或StratifiedKFold策略”

http://scikit-learn.org/stable/modules/cross_validation.html

根据数据集的性质,例如,在一个段的长度上高度相关的数据,连续集将给出与例如来自整个数据集的随机样本非常不同的拟合。

伙计们,感谢这个帖子。

上面答案中的代码(施耐德)已经过时了。

从scikit-learn == 0.19.1开始,这将按预期工作。

from sklearn.model_selection import cross_val_score, KFold
kf = KFold(n_splits=3, shuffle=True, random_state=0)
cv_scores = cross_val_score(regressor, X, y, cv=kf)

最好,

M.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM