当我使用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)
答案 0 :(得分:1)
当您使用train_test_split时,您将数据集拆分为火车并随机进行测试。
Shufflesplit并没有太大的不同。问题可能是因为班级分布非常不均衡。 (顺便说一句,记住一件事,你一直使用的离开交叉验证总是会给我的经验带来不好的结果)。而是使用5倍交叉验证。
如果类分布不均匀,您还可以使用分层交叉验证。它保留了每个类中样本的百分比。例如,查看http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html。