Python sklearn交叉验证R^2分数与使用培训模型对培训和验证数据进行的手动检查不匹配

Python sklearn交叉验证R^2分数与使用培训模型对培训和验证数据进行的手动检查不匹配,python,machine-learning,scikit-learn,random-forest,cross-validation,Python,Machine Learning,Scikit Learn,Random Forest,Cross Validation,如果您对以下问题有任何帮助,我们将不胜感激。下面,X是输入描述符(大小为(10000,72)),Y是输出标签,一个列向量。采用随机森林模型。简单来说,网格搜索只在一个迭代器上进行,并执行一次交叉验证拆分。在最后训练模型之前,将收集训练和测试(=更准确地说,验证数据)数据点 param_grid = {'randomforestregressor__min_samples_split':[5]} clf = pipeline.make_pipeline(RandomForestRegressor

如果您对以下问题有任何帮助,我们将不胜感激。下面,X是输入描述符(大小为(10000,72)),Y是输出标签,一个列向量。采用随机森林模型。简单来说,网格搜索只在一个迭代器上进行,并执行一次交叉验证拆分。在最后训练模型之前,将收集训练和测试(=更准确地说,验证数据)数据点

param_grid = {'randomforestregressor__min_samples_split':[5]}

clf = pipeline.make_pipeline(RandomForestRegressor(random_state=1))
cv = modsel.ShuffleSplit(n_splits=1, test_size=0.5, random_state=1)
gs = modsel.GridSearchCV(clf, cv=cv, param_grid=param_grid, scoring='r2', return_train_score=True, verbose=False)

for train_index, test_index in cv.split(X):
  Xtrain=X[train_index]; Ytrain=Y[train_index]
  Xtest=X[test_index]; Ytest=Y[test_index]

gs.fit(X, Y)
print(gs.cv_results_)
根据cv_结果,平均_训练_分数为0.85863713,平均_测试_分数(应为验证分数)为0.41913632。然后将训练后的模型应用于Xtrain和Xtest

predictedYtrain=gs.best_estimator_.predict(Xtrain)
predictedYtest=gs.best_estimator_.predict(Xtest)

从predictedYtrain vs Ytrain或predictedYtest vs Ytest线性图中,我观察到两种情况下R^2都在0.9左右。情况如何?我希望找到~0.85和0.42。有人能解释一下差异的来源吗?

您没有控制
ShuffleSplit
对象的随机状态,因此每次都可能得到不同的结果。从您发布的示例来看,不清楚python解释器是否在培训阶段和测试阶段之间重新启动,但您正在酸洗的事实让我相信是这样的

尝试控制模型的随机状态:

cv = modsel.ShuffleSplit(n_splits=1, test_size=0.5, random_state=1)

或者调整脚本,使其在不停止解释器的情况下一次性运行

谢谢您的回复。我编辑了我的问题以引入随机_状态,并按照您的建议一次性运行。还是一样的问题。你认为这是随机森林模型的一些怪癖,还是我误解了什么?