我正在运行RandomForestRegressor()。我正在使用R平方进行评分。为什么使用.score和cross_val_score会得到截然不同的结果?这是相关代码:
X = df.drop(['y_var'], axis=1)
y = df['y_var']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
# Random Forest Regression
rfr = RandomForestRegressor()
model_rfr = rfr.fit(X_train,y_train)
pred_rfr = rfr.predict(X_test)
result_rfr = model_rfr.score(X_test, y_test)
# cross-validation
rfr_cv_r2 = cross_val_score(rfr, X, y, cv=5, scoring='r2')
我知道交叉验证的得分是.score的得分多次,但是结果却截然不同,以至于有些明显的错误。结果如下:
R2-dot-score: .99072
R2-cross-val: [0.5349302 0.65832268 0.52918704 0.74957719 0.45649582]
我在做什么错?或什么可以解释这种差异?
编辑:
好的,我可能已经解决了。似乎cross_val_score不会对数据进行混洗,当将数据分组在一起时,这可能会导致更糟的预测。我找到的最简单的解决方案(通过this answer)是在运行模型之前简单地对数据帧进行洗牌:
shuffled_df = df.reindex(np.random.permutation(df.index))
这样做之后,我开始在.score和cross_val_score之间得到相似的结果:
R2-dot-score: 0.9910715555903232
R2-cross-val: [0.99265184 0.9923142 0.9922923 0.99259524 0.99195022]
答案 0 :(得分:1)
好的,我可能已经解决了。似乎cross_val_score不会随机化数据,当将相似的数据分组在一起时,这可能会导致更糟的预测。我找到的最简单的解决方案(通过this answer)是在运行模型之前简单地对数据帧进行洗牌:
shuffled_df = df.reindex(np.random.permutation(df.index))
这样做之后,我开始在.score和cross_val_score之间得到相似的结果:
R2-dot-score: 0.9910715555903232
R2-cross-val: [0.99265184 0.9923142 0.9922923 0.99259524 0.99195022]