Classification

隨機森林過擬合?

  • August 4, 2013

我正在用 scikit-learn 試驗隨機森林,我的訓練集得到了很好的結果,但我的測試集的結果相對較差……

這是我試圖解決的問題(靈感來自撲克):給定玩家 A 的底牌、玩家 B 的底牌和翻牌(3 張牌),哪個玩家的手牌最好?從數學上講,這是 14 個輸入(7 張牌——一個等級和一個花色)和一個輸出(0 或 1)。

以下是我到目前為止的一些結果:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

以下是使用的相關代碼:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

似乎無論使用多少樹,訓練集的性能都比測試集好得多,儘管訓練集相對較大且特徵數量相當少……

這是使用 RF 模型時常見的新手錯誤(我會舉手作為以前的肇事者)。當整體考慮時,您使用訓練集構建的森林在許多情況下將幾乎完美地擬合訓練數據(如您所發現的)。然而,當算法構建森林時,它會記住袋外 (OOB) 預測誤差,這是它對泛化誤差的最佳猜測。

如果您將訓練數據發送回預測方法(正如您所做的那樣),您將得到這個幾乎完美的預測(非常樂觀),而不是正確的 OOB 錯誤。不要這樣做。相反,經過訓練的 Forest 對象應該在其中記住 OOB 錯誤。我不熟悉 scikit-learn 的實現,但是看這裡的文檔看起來你需要oob_score=True在調用 fit 方法時指定,然後泛化錯誤將存儲為oob_score_在返回的對像中。在 R 包“randomForest”中,在返回的對像上調用不帶參數的 predict 方法將返回訓練集上的 OOB 預測。這使您可以使用其他度量來定義錯誤。將訓練集發送回預測方法會給你一個不同的結果,因為這將使用所有的樹。我不知道scikit-learn實施是否會這樣做。

將訓練數據發送回預測方法以測試準確性是錯誤的。不過,這是一個非常常見的錯誤,所以不要擔心。

引用自:https://stats.stackexchange.com/questions/66543

comments powered by Disqus