3 回答

TA貢獻1900條經驗 獲得超5個贊
對于數據集中的每一行,OOB_score僅使用隨機森林中樹的子集計算。因此,它并不能真正反映完全隨機森林模型在任何特定數據行上的表現。所以簡短的回答是:你仍然需要一個明確的驗證集,因為在該集上計算的模型分數(無論是 R2,均方誤差等)是基于完整模型的預測。
我將用一個(過度簡化的)例子來說明:
假設我們正在做回歸預測房價。你有一個數據集5行(每行會包含一個特定的房子的功能,如它YearBuilt,LivingArea,NumberOfGarages例如),以及隨機森林具有3棵樹。
Tree 1 Tree 2 Tree 3
------ ------ ------
1 1
2 2
3 3
4
5 5
其中數字 1-5 表示用于訓練樹的數據集行號(通過引導選擇)。然后例如,第 3 行和第 5 行不用于訓練樹 1,依此類推。無論您是否OOB_score在 sklearn 的 RandomForest 中設置為true,到此為止的所有內容都已完成。
面向對象
如果OOB_score設置為 true:我們遍歷數據集中的每一行,并執行以下操作。
第 1 行:只有樹 2 未將其用于擬合/訓練。因此,我們僅使用樹 2預測并獲得第 1 行的分數。
第 2 行:只有 Tree 3 沒有使用它進行訓練。因此,我們僅使用樹 3預測并獲得第 2 行的分數。
...
第 4 行:樹 2 和 3 未將其用于訓練。這所房子的預測售價將是樹 2 和樹 3 預測的平均值,而不是樹 1。
這OOB_score只是所有行的預測分數的平均值。
驗證集
將此行為與您是否使用了顯式驗證集進行比較。您將(例如)在驗證數據集中有 5 個新行,對于每一行,您將通過森林中的所有3 棵樹,獲取它們各自的預測并將平均值報告為該行的銷售價格的最終預測.
然后,您可以通過取所有行的誤差平均值來報告整個驗證集的均方誤差(或任何其他指標)。
概括
總結一下,
在計算 時OOB_score,每一行僅在森林中的一個樹子集上進行預測。
而在顯式驗證集上報告的分數是對森林中所有樹木的每一行進行預測的結果,這更能代表測試集中實際發生的情況。所以,這個選項就是你想要的。
平均而言,您會期望OOB_score比在顯式驗證集上做的稍微差一些,因為在前者中使用較少的樹進行預測。
評論
也就是說,這兩個分數(OOB 與驗證)在實踐中通常非常接近。如果你有一個小數據集并且買不起驗證集,OOB 提供了一個很好的選擇。
但是,如果您的數據集足夠大,我建議無論如何都要留出一個顯式驗證集(或進行交叉驗證)。在這種情況下,這OOB_score只是判斷模型的附加指標,但您應該將驗證分數放在更高的優先級上。努力提高這個分數。
第二個原因
還有另一種情況,其中顯式驗證集比使用 OOB 更合適:當涉及時間序列時。
一個例子是名為Corporación Favorita Grocery Sales Forecasting的 Kaggle 競賽,您的目標是根據過去 4 年的給定數據預測未來 2 周內每家商店每件商品的雜貨價格。
在這種情況下,您的模型(完成后)將預測測試集中的未來價格。因此,您希望在驗證模型時盡可能地模擬這一點。這意味著:
您希望將驗證集構造為盡可能最新(例如,使用前 2 周的數據)。然后,您的訓練數據集是從 4 年前到“今天”之前的 2 周。并且您在“未來”驗證集上進行驗證,從 2 周前到“今天”。
如果您使用,則無法執行此操作OOB_score:它隨機生成偽驗證集(引導的結果),因此您從 OOB 獲得的分數將沒有意義,因為您沒有模擬上述“未來”效果。生成顯式驗證集將允許您自由選擇您擁有的最新數據進行驗證,而不是隨機選擇。

TA貢獻1806條經驗 獲得超8個贊
“我很困惑隨機森林是否需要明確的交叉驗證?”
答:隨機森林的工作不需要交叉驗證。但是,交叉驗證將證明您的模型是否可以很好地泛化。將交叉驗證性能指標包含在管道中然后使用 cv 的參數是一種很好的做法。缺點是交叉驗證需要資源和時間來完成,對于小數據集,回報可能并不顯著。
添加回答
舉報