cross_val_score和train_test_split之间的得分不同

时间:2017-01-26 07:20:02

标签: python

当我使用scikitlearn 0.18

的python3.6时,我遇到了一个问题

我使用随机森林进行回归并且回归非常好,但是当我尝试计算交叉验证时,我遇到了一个问题,即得分来自cross_val_score和train_test_split真的不同。 train_test_split的得分为0.9,但cross_val_score得分的平均值约为0.3。

你能告诉我原因吗? 或者我的代码有什么问题?

代码是

import numpy as np
import cv2
import itertools

from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor     
from sklearn.cross_validation import cross_val_score,cross_val_predict,ShuffleSplit,KFold
from sklearn.model_selection import train_test_split 
train= np.loadtxt('.txt')
traindata=train[0:,38:]
traintarget=train[0:,j]

rf=RandomForestRegressor(n_estimators=20)   
rf.fit(traindata,traintarget)

X=traindata
Y=traintarget
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
print (rf.score(X_test, Y_test))
score3 = cross_val_score(rf, X, Y, scoring= 'r2',      cv=ShuffleSplit(n=len(X),test_size=0.3,train_size=0.6))
score4 = cross_val_score(rf, X, Y, scoring= 'neg_mean_absolute_error', cv=ShuffleSplit(n=len(X),test_size=0.3,train_size=0.6))
score5 = cross_val_score(rf, X, Y, scoring= 'neg_mean_squared_error', cv=ShuffleSplit(n=len(X),test_size=0.3,train_size=0.6))
print (score3)
print (score4)
print (score5)

1 个答案:

答案 0 :(得分:1)

当您使用train_test_split时,您将数据集拆分为火车并随机进行测试。

Shufflesplit并没有太大的不同。问题可能是因为班级分布非常不均衡。 (顺便说一句,记住一件事,你一直使用的离开交叉验证总是会给我的经验带来不好的结果)。而是使用5倍交叉验证。

如果类分布不均匀,您还可以使用分层交叉验证。它保留了每个类中样本的百分比。例如,查看http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html