2017-09-13 10 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

ランダムフォレストは、決定木の集合であり、乱数を使用してこれらの木の高さと分割を選択します。プログラムを2回実行すると、同じランダムフォレストを取得することはほとんどありません。私は、あなたがそれのためにこのわずかな変化を得ていると思います。

+0

私は 'rf_test.random_state = 42'を設定しました。あなたが言及した目的のためにこの設定をしないでしょうか? – Austin

+0

ランダムなフォレストの文書「intの場合、random_stateは乱数ジェネレータによって使用されるシードです」に従ってJakeが正しいです。上記の答えは無視してください。 – supgodge

1

cv2を使用して、ランダムフォレストリグレッサーをテストしています。あなたはそれも乱数の種を設定しましたか?それ以外の場合は、回帰分析のテストは異なるでしょう。

+0

良いキャッチだけど、ええcv2も同じランダムな種を持っています – Austin

関連する問題