我正在尝试确定为什么每次重新运行模型时都会获得略有不同的分数。我已经定义了:
# numpy seed (don't know if needed, but figured it couldn't hurt)
np.random.seed(42)
# Also tried re-seeding every time I ran the `cross_val_predict()` block, but that didn't work either
# cross-validator with random_state set
cv5 = KFold(n_splits=5, random_state=42, shuffle=True)
# scoring as RMSE of natural logs (to match Kaggle competition I'm trying)
def custom_scorer(actual, predicted):
actual = np.log1p(actual)
predicted = np.log1p(predicted)
return np.sqrt(np.sum(np.square(actual-predicted))/len(actual))
然后我用 cv=cv5
运行了这个:
# Running GridSearchCV
rf_test = RandomForestRegressor(n_jobs = -1)
params = {'max_depth': [20,30,40], 'n_estimators': [500], 'max_features': [100,140,160]}
gsCV = GridSearchCV(estimator=rf_test, param_grid=params, cv=cv5, n_jobs=-1, verbose=1)
gsCV.fit(Xtrain,ytrain)
print(gsCV.best_estimator_)
运行它以获取gsCV.best_estimator_
后,我重新运行了几次,每次获得略有不同的分数:
rf_test = gsCV.best_estimator_
rf_test.random_state=42
ypred = cross_val_predict(rf_test, Xtrain, ytrain, cv=cv2)
custom_scorer(np.expm1(ytrain),np.expm1(ypred))
(极小)得分差异的示例:
0.13200993923446158
0.13200993923446164
0.13200993923446153
0.13200993923446161
我正在尝试设置种子,因此我每次都获得相同的分数,以便能够比较不同的模型。在Kaggle比赛中,分数的很小差异似乎很重要(尽管肯定不是那么小),但我只是想了解原因。进行计算时,它与我的机器中的四舍五入有关吗?任何帮助都非常感谢!
编辑:我忘记了线rf_test.random_state=42
,这使得分数差异差异更大,但即使包含在此行中,我仍然具有微不足道的差异。
随机森林是一组决策树,它使用随机性选择这些树的高度和拆分。当您两次运行程序时,您真的不可能获得相同的随机森林。我想,您因此而得到这种轻微的变化。
您在测试您的RandomForest回归器时使用cv2
。您是否也设置为随机种子?否则测试回归器时的拆分将有所不同。