在使用 Scikit-learn 調整隨機森林模型時,我注意到它的準確度分數在不同的運行后是不同的,即使我使用相同的 RandomForestClassifier 實體和相同的資料作為輸入。我嘗試了谷歌搜索和 stackExchange 搜索功能,但我能找到的與此類似的唯一情況是這篇文章,但問題是在沒有適當隨機狀態的情況下實體化分類器,這不是我的問題的情況。
我正在使用以下代碼:
clf = RandomForestClassifier( n_estimators=65, max_features = 9, max_depth= 'sqrt', random_state = np.random.RandomState(123) )
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state = np.random.RandomState(159) )
clf.fit(X_train, y_train)
y_pred=clf.predict(X_test)
X 和 y 是我的資料和相應的標簽,但我發現資料集沒有影響問題。當我運行 train_test_split 線時,我每次都得到相同的分割,所以沒有隨機性。使用相同的擬合模型運行 predict() 每次也會給出相同的結果,這表明我的問題與我上面鏈接的帖子不同。但是,每次運行 fit() 后,predict() 都會給出不同的預測!即使我不觸摸 X_train 和 y_train,也會發生這種情況。所以只需運行這兩行
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
每次都會給出不同的結果。據我從檔案中可以看出 .fit() 不應該做任何隨機的事情。如果沒有可重現的輸出,就不可能調整模型,所以我很確定某處存在錯誤。我錯過了什么?以前有沒有人遇到過這種情況,或者有沒有人知道為什么會這樣?
uj5u.com熱心網友回復:
RandomState如果您要重新運行擬合并期望得到相同的結果,請不要使用 numpy物件。只使用一個整數random_state代替。
從 sklearn 的Glossary,使用 numpy RandomState:
多次呼叫該函式將重用同一個實體,并會產生不同的結果。
該RandomState物件被播種(使用您的 123),但隨后會在每次呼叫 時fit持續存在,繼續獲取新的亂數,而不會被重置。
快速檢查:
clf = RandomForestClassifier(random_state=314)
preds = {}
for i in range(10):
preds[i] = clf.fit(X, y).predict_proba(X)
all(np.allclose(preds[i], preds[i 1]) for i in range(9))
# > True
clf = RandomForestClassifier(random_state=np.random.RandomState(314))
preds = {}
for i in range(10):
preds[i] = clf.fit(X, y).predict_proba(X)
all(np.allclose(preds[i], preds[i 1]) for i in range(9))
# > False
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/341176.html
標籤:Python 机器学习 随机的 scikit-学习 随机森林
