在 sklearn.RandomForestClassifier 中不使用引導時會發生什麼?
我一直在優化從 sklearn 實現構建的隨機森林模型。此隨機森林實現中的參數之一允許您設置 Bootstrap = True/False。在將我的模型的超參數調整到我的數據集時,隨機搜索和遺傳算法都一致地發現,設置 bootstrap=False 會產生更好的模型(準確度增加 >1%)。我在最後使用 3-fold CV 和一個單獨的測試集來確認所有這些。調整後的模型始終讓我達到約 98% 的準確率。數據集有幾千個示例,分為兩個類。
我的問題是:如果關閉引導程序,隨機森林是否仍然是隨機的?我認為隨機森林的整個前提是,與單個決策樹(隨著它的增長而看到整個數據集)不同,RF 隨機劃分原始數據集並將這些分區劃分為幾個決策樹。如果 bootstrapping 被關閉,那是不是意味著你只有n 個決策樹從同一個原始數據語料庫中生長出來?或者當引導關閉時,數據集被均勻地分成n個分區並以非隨機的方式分佈到n棵樹?
此外,從算法中去除隨機性的主要前提會提高準確性是沒有意義的。
注意:使用隨機數據集進行了快速測試,設置 bootstrap = False 再次獲得了更好的結果。
from sklearn.ensemble import RandomForestClassifier as rfc from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split X, y = make_classification(n_samples=10000, n_features=4000, n_informative=3000, n_redundant=600, random_state=0, shuffle=True) X_train, X_test, y_train, y_test = train_test_split(X, y) clf_True = rfc(bootstrap=True, random_state=0) clf_False = rfc(bootstrap=False, random_state=0) clf_True.fit(X_train, y_train) clf_False.fit(X_train, y_train) scoreTrue = clf_True.score(X_test, y_test) scoreFalse = clf_False.score(X_test, y_test) >>>scoreTrue = 0.5232; scoreFalse = 0.5336
引擎蓋下發生了什麼?
**編輯:**我在上面的這個示例腳本中增加了特徵的數量,因為在我正在使用的數據集(大型文本語料庫)中,我有數十萬個獨特的術語,只有幾千個訓練/測試實例。我相信引導從訓練階段省略了大約 1/3的數據集。是不是因為我的訓練階段缺乏數據,所以禁用引導程序會給我帶來更好的結果?
我的問題是:如果關閉引導程序,隨機森林是否仍然是隨機的?
是的,它仍然是隨機的。在沒有引導的情況下,所有數據都用於擬合模型,因此對於每個階段的所選示例,樹之間沒有隨機變化。然而,隨機森林有第二個變異來源,即在每次拆分時嘗試的隨機特徵子集。
我認為隨機森林的整個前提是,與單個決策樹(隨著它的增長而看到整個數據集)不同,RF 隨機劃分原始數據集並將這些分區劃分為幾個決策樹。
這是不正確的。隨機森林引導程序s 每棵樹的數據,然後生成一棵決策樹,該決策樹在每次拆分時只能使用樣本的隨機子集。文檔指出“子樣本大小始終與原始輸入樣本大小相同,但如果 bootstrap=True(默認),則抽取樣本以替換”,這意味著
bootstrap=False
抽取的樣本大小等於訓練示例的數量無需替換,即始終使用相同的訓練集。有關隨機森林過程及其統計特性的詳細說明,請參見 Leo Breiman,“隨機森林”,機器學習第 45 卷第 1 期(2001 年)以及 Hastie 等人的相關章節,統計學習要素。
我們還可以檢查源,這表明原始數據在
bootstrap=False
if forest.bootstrap: ...irrelevant... elif class_weight == 'balanced_subsample': ...irrelevant... else: tree.fit(X, y, sample_weight=sample_weight, check_input=False)
如果 bootstrapping 被關閉,那是不是意味著你只有 n 個決策樹從同一個原始數據語料庫中生長出來?
是的,需要理解的是,每次拆分只能選擇隨機的特徵子樣本。在 sklearn 中,隨機森林被實現為一個或多個實例的集合
sklearn.tree.DecisionTreeClassifier
,它實現了隨機特徵子採樣。或者當引導關閉時,數據集被均勻地分成n個分區並以非隨機的方式分佈到n棵樹?
不。