python - scikit-learn 线性回归的意外交叉验证分数

标签 python python-2.7 scikit-learn

我正在尝试学习使用 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,结果是相同的。

我已经为 cross_validation.train_test_splitrandom_state 参数尝试了很多不同的选项,它们都在 0.7 到 0.9 的范围内给出了相似的分数。

我正在使用 sklearn 版本 0.16.1

最佳答案

事实证明,我的数据是按不同类别的 block 排序的,默认情况下 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 ]

这符合我的预期。

关于python - scikit-learn 线性回归的意外交叉验证分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33641088/

相关文章:

Python:标准函数和上下文管理器?

python - Anaconda 找不到 OpenCV

python - 如何在Python线程中使用qtwebkit?

python - 如何确定 matplotlib 轴是否已使用 axes.axis ('off' 关闭)?

python - 为什么我的元类实现失败并出现关于无法创建 NoneType 实例的 TypeError

python - SciKit-Learn 随机森林子样本大小如何等于原始训练数据大小?

python - 给定选项时为 optionparser 设置默认选择

python - 令人费解的python索引错误

python - 将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

python - 类子集的 scikit-learn 指标