Machine-Learning

在 sklearn.RandomForestClassifier 中不使用引導時會發生什麼?

  • July 3, 2018

我一直在優化從 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棵樹?

不。

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

comments powered by Disqus