【问题标题】:Unexpected cross-validation scores with scikit-learn LinearRegressionscikit-learn LinearRegression 的意外交叉验证分数
【发布时间】:2016-02-11 23:39:17
【问题描述】:

我正在尝试学习使用 scikit-learn 来完成一些基本的统计学习任务。我以为我已经成功创建了适合我的数据的线性回归模型:

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

【问题讨论】:

    标签: python python-2.7 scikit-learn


    【解决方案1】:

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

    这符合我的预期。

    【讨论】:

      【解决方案2】:

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

      "当cv参数为整数时,cross_val_score默认使用KFold或StratifiedKFold策略"

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

      取决于您的数据集的性质,例如数据在一个段的长度上高度相关,连续集的拟合将与例如来自整个数据集的随机样本。

      【讨论】:

        【解决方案3】:

        各位,感谢本帖。

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

        从 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.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-02
          • 2016-04-25
          • 2017-06-23
          • 2017-09-02
          • 2015-12-11
          • 2015-11-06
          • 2014-07-30
          • 2017-06-12
          相关资源
          最近更新 更多