2017-09-13 142 views
0

我想确定为什么每次我重新运行模型时我获得了一个略有不同的分数。我定义:每次我运行与random_state设置sklearn模型不同的分数

# 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这条线在分数差异上有很大差异,但即使包含这条线,我仍然有微小的差异。

回答

0

随机森林,是一组决策树,它使用随机性来选择这些树的高度和分割。当你运行你的程序两次时,你很可能不会获得相同的随机森林。我想,因为这个,你会得到这个微小的变化。

+0

虽然我设置了'rf_test.random_state = 42'。这个设置不是为了你提到的目的吗? – Austin

+0

根据随机森林文档,你是对的Jake“如果int,random_state是随机数生成器使用的种子”。请忽略上述答案。 – supgodge

1

您在测试您的RandomForest Regressor时正在使用cv2。你是否设置了随机种子?否则,在测试你的回归器时分裂会有所不同。

+0

哎呀好抓,但是CVV2也有相同的随机种子 – Austin