1. 程式人生 > >大白話5分鐘帶你走進人工智慧-第二十九節整合學習之隨機森林隨機方式 ,out of bag data及程式碼(2)

大白話5分鐘帶你走進人工智慧-第二十九節整合學習之隨機森林隨機方式 ,out of bag data及程式碼(2)

          大白話5分鐘帶你走進人工智慧-第二十九節整合學習之隨機森林隨機方式 ,out  of  bag  data及程式碼(2)

上一節中我們講解了隨機森林的基本概念,本節的話我們講解隨機森林的隨機方式,以及一些程式碼。

目錄

1-隨機森林隨機方式

2-out  of   baf data

3-程式碼


1-隨機森林隨機方式

           我們先來回顧下隨機森林中都有哪些隨機?

                第一:用Bagging生成用來訓練小樹的樣本時,進行有放回的隨機抽樣。

                第二:抽樣資料之後,對feature也進行隨機的抽樣。

                第三:這個東西雖然沒有實現,在樹模型中,如果隨機的將feature進行一些線性組合,作為新的feature,是對它有幫助的。

假如資料集如下

這個情況下它是一個線性的可分的問題,邏輯迴歸很簡單,畫這麼一條線,它肯定能找到這組w把這兩個東西完美的分開。對於決策樹它當然能分開,它非線效能夠處理好,線性自然也能處理。但是在只有x1和x2的時候,那麼此時你要是這棵決策樹的話,你只能按照x1或者x2維度切一刀,你的分列條件要挑一個X1要麼挑一個X2,小於多少或者大於多少,反映在圖形上,第一刀判斷所有x2小於橫虛線是X這個數,

第二刀判斷小於豎虛線是O這個數,

剩下一堆還亂著,同樣的方法,會得到這麼一個邊界。

這個樹有多深?每一條虛線就代表它一次分裂,非常深,明明是一個線性可分的問題,但是因為它只能針對x1或x2獨立的去做切割的情況下,會導致樹分的很深,效率低下。

但是如果我們得到了一個x1+x2,構造了一個新的維度,也就是說這棵樹在判斷的時候,能拿x1+x2等於多少去做分配條件的話,就可以直接畫出一條斜線了。 假如x1+x2<5是下面條直線

僅僅通過一次分裂,就可以把這種在空間中座標軸不垂直的這種線性可分的問題解決掉了。 

對於剛才這種問題,只要通過對原有的維度進行一系列線性組合,就賦予了決策樹畫斜線能力,能讓它用更少的分裂次數,就能夠把原來純度怎麼分都分不太高的那些資料集,一步就給分好了。但是這個東西在隨機森林裡面並沒有實現,這只是一個思路,它的問題就是當維度足夠多的時候,你用誰去做線性組合,這個東西不好確定,又維度爆炸了,所以它只是一個思路。

        2-out  of   baf data

隨機森林會衍生出另外一個福利,就是out  of   baf data,隨機森林在構造若干弱分類器的時候會進行又放回的均勻抽樣,因為是有放回的,所以在進行抽樣的時候, 有很多條資料並沒有被選到。那能不能利用這些沒有抽到的資料,反正訓練的時候也沒用到這些資料,利用它們去做test set,然後用來調參?直觀上應該是可以的,但是有一個問題是,因為我們調的是整個隨機森林的引數,隨機森林裡面每棵小樹你沒用到的資料,有可能另一個用到了,它能用到的有可能另一個也用到。所以不可以直接找到誰都沒用到的資料,用來做測試,需要給它做一個小的變化。

原來是每一個弱分類器有若干沒用到的資料點,我們換一個角度考慮,以一個數據點去觀察。比如(x1,y1)它被1,3,T號弱分類器用到了,而2號沒有用到它,那麼單獨評估2號的時候可以用它來看(x1,y1)表現的怎麼樣,x1,y1就相當於2號弱分類器的測試集。這是1個弱分類器沒有用到(x1,y1)資料集的,假如(x1,y1)在2號弱分類器和4號弱分類器上沒有用到,可不可以把第一條資料交給2號和4號分別預測出來一個結果?這會2號和4號給出的結果是有驗證意義的,因為2號4號在訓練的時候沒用到它。

那麼假如樹足夠多,我們管所有沒有用到第一條資料的叫 ,代表所有的沒有用到第一條資料的弱分類器的投票結果。原來是一片大森林,有好多棵樹,現在從裡邊挑上幾棵沒有碰到第一條資料進行訓練的這些樹,讓它們組成一個小森林,能夠評測一下小森林預測的是正確,還是錯誤。那麼對於2號資料點來說,也有一個小森林完全沒有用到過,也可以用它扔到沒有用到它的 小森林裡邊,得到一個預測結果。總共有N條資料,就會整出N個小森林,每一個是預測對了還是預測錯了,可以統計出來一個ACC正確率。

這種驗證資料集的方式稱為out of bag data。在袋子之外,什麼意思呢?Bagging更像一個裝袋的意思,原來有這麼一個訓練集,準備了一百個袋子,你每個袋子都從訓練集裡邊有放回的隨機抽樣,給它裝成一個小袋子,在每一個袋子上面生成出一棵樹。但是對於每一個bag都有一些資料沒有裝到這個裡面,我們就叫它out of bag,在袋外的這些資料。它的問題主要是 不是每一個弱分類器,它的out of bag data都是一樣的,甚至可以說每一個弱分類器out of bag(簡稱oob)資料都不一樣。於是就切換到了以資料為維度,哪些弱分類器沒有用到,就去驗證一下這些弱分類器是否正確。

通過上面oob資料統計出來的ACC正確率越高越好,它也是隨機森林中幫助我們調參的引數,叫oob_score,當訓練好了一個隨機森林之後,它的物件裡面就帶了一個屬性叫oob_score。每次調引數輸出一下oob_score,看一下是高了還是低了,如果變高了說明調的方向正確,如果變低了說明調的方向不對。 

3-程式碼

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
if __name__ == '__main__':

    iris = load_iris()
    X = iris.data[:, :2]  # 花萼長度和寬度
    y = iris.target
    # X, y = make_moons()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

    rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1)
    rnd_clf.fit(X_train, y_train)

    bag_clf = BaggingClassifier(
        DecisionTreeClassifier(splitter="random", max_leaf_nodes=16),
        n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1
    )
    bag_clf.fit(X_train, y_train)
    gbdt_clf = GradientBoostingClassifier(n_estimators=500)
    gbdt_clf.fit(X_train, y_train)
    y_pred_rf = rnd_clf.predict(X_test)
    y_pred_bag = bag_clf.predict(X_test)
    y_pred_gbdt = gbdt_clf.predict(X_test)
    print(accuracy_score(y_test, y_pred_rf))
    print(accuracy_score(y_test, y_pred_bag))
    print(accuracy_score(y_test,y_pred_gbdt))


    # Feature Importance
    iris = load_iris()
    rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1)
    rnd_clf.fit(iris["data"], iris['target'])
    for name, score in zip(iris['feature_names'], rnd_clf.feature_importances_):
        print(name, score)

    iris = load_iris()







解釋下上面程式碼:因為隨機森林最原始的定義是若干個DecisionTree通過Bagging的形式組合在一起,所以我們可以通過兩種API的形式產生一個隨機森林的物件,分別是RandomForestClassifier,和BaggingClassifier(DecisionTreeClassifier)。我們來看下RandomForestClassifier都有哪些引數:

n_estimators,估計器,意思是需要多少個弱分類器。bootstrap是否又放回的抽象,n_jobs因為咱們的決策樹可以支援並行操作,所以這裡代表多少個執行緒去跑,-1代表使用所有的執行緒。

我們總結下隨機森林的優點: 1. 表現良好 2. 可以處理高維度資料(維度隨機選擇)3. 輔助進行特徵選擇4. 得益於bagging, 可以進行並行訓練    缺點:對於噪聲過大的資料容易過擬合。

&n