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

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

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

目錄python

1-隨機森林隨機方式bootstrap

2-out  of   baf dataapp

3-代碼dom


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號在訓練的時候沒用到它。

那麼假如樹足夠多,咱們管全部沒有用到第一條數據的叫$\mathrm{G}_{1}^{-}(\mathrm{x})$,表明全部的沒有用到第一條數據的弱分類器的投票結果。原來是一片大森林,有好多棵樹,如今從裏邊挑上幾棵沒有碰到第一條數據進行訓練的這些樹,讓它們組成一個小森林,可以評測一下小森林預測的是正確,仍是錯誤。那麼對於2號數據點來講,也有一個小森林徹底沒有用到過,也能夠用它扔到沒有用到它的$\mathrm{G}_{2}^{-}(\mathrm{x})$小森林裏邊,獲得一個預測結果。總共有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, 能夠進行並行訓練    缺點:對於噪聲過大的數據容易過擬合。

相關文章
相關標籤/搜索