scikit-learn 线性回归的意外交叉验证分数
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
选择连续拆分而不是随机(随机)拆分。我能够通过指定交叉验证应该使用随机拆分来解决这个问题:
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 使用连续集,即
"When the cv argument is an integer, cross_val_score uses the KFold or StratifiedKFold strategies by default"
http://scikit-learn.org/stable/modules/cross_validation.html
取决于数据集的性质,例如数据在一个段的长度上高度相关,连续的集合将给出与例如来自整个数据集的随机样本。
伙计们,感谢您的关注。
上述答案中的代码 (Schneider) 已过时。
从 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)
最佳,
男.
我正在尝试学习使用 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
选择连续拆分而不是随机(随机)拆分。我能够通过指定交叉验证应该使用随机拆分来解决这个问题:
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 使用连续集,即
"When the cv argument is an integer, cross_val_score uses the KFold or StratifiedKFold strategies by default"
http://scikit-learn.org/stable/modules/cross_validation.html
取决于数据集的性质,例如数据在一个段的长度上高度相关,连续的集合将给出与例如来自整个数据集的随机样本。
伙计们,感谢您的关注。
上述答案中的代码 (Schneider) 已过时。
从 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)
最佳,
男.