從隨機森林到極端隨機森林,再到深度森林

隨機森林

再介紹隨機森林之前有必要介紹下集成算法的一些理論

集成學習算法本身不算一種單獨的機器學習算法,而是通過構建並結合多個機器學習器來完成學習任務。可以說是集百家之所長,能在機器學習算法中擁有較高的準確率,不足之處就是模型的訓練過程可能比較複雜,效率不是很高。

目前常見的集成學習算法主要有2種:基於Bagging的算法和基於Boosting的算法,基於Bagging的代表算法有隨機森林,而基於Boosting的代表算法則有Adaboost、GBDT、XGBOOST等。

Bagging和Boosting都是將已有的分類或迴歸算法通過一定方式組合起來,形成一個性能更加強大的分類器,更準確的說這是一種分類算法的組裝方法。即將弱分類器組裝成強分類器的方法。(我們要說的隨機森林就是Bagging的方法,也叫套袋法或者裝袋法)

Bagging算法是bootstrap aggregating的縮寫,它主要對樣本訓練集合進行隨機化抽樣,通過反覆的抽樣訓練新的模型,最終在這些模型的基礎上取平均。

bagging的算法過程

從原始樣本集中使用Bootstraping方法隨機抽取n個訓練樣本,共進行k輪抽取,得到k個訓練集。(k個訓練集之間相互獨立,元素可以有重複)
對於k個訓練集,我們訓練k個模型(這k個模型可以根據具體問題而定,比如決策樹,knn等)
對於分類問題:由投票表決產生分類結果;對於迴歸問題:由k個模型預測結果的均值作爲最後預測結果。(所有模型的重要性相同)
bagging就是並聯的思想,如下圖:

在這裏插入圖片描述

Boosting(提升法)

boosting的算法過程如下:
對於訓練集中的每個樣本建立權值wi,表示對每個樣本的關注度。當某個樣本被誤分類的概率很高時,需要加大對該樣本的權值。
進行迭代的過程中,每一步迭代都是一個弱分類器。我們需要用某種策略將其組合,作爲最終模型。(例如AdaBoost給每個弱分類器一個權值,將其線性組合最爲最終分類器。誤差越小的弱分類器,權值越大)

boosting就是串聯的思想,舉個例子:
比如實際一個人的最終的借款金額是10000元,我們根據一些變量去預測,就是每一次根據預測誤差再去改善提升準確率

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iDUpJHuC-1592559990836)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p80)]

Bagging,Boosting的主要區別
樣本選擇上:Bagging採用的是Bootstrap隨機有放回抽樣;而Boosting每一輪的訓練集是不變的,改變的只是每一個樣本的權重。
樣本權重:Bagging使用的是均勻取樣,每個樣本權重相等;Boosting根據錯誤率調整樣本權重,錯誤率越大的樣本權重越大。
預測函數:Bagging所有的預測函數的權重相等;Boosting中誤差越小的預測函數其權重越大。
並行計算:Bagging各個預測函數可以並行生成;Boosting各個預測函數必須按順序迭代生成。
下面是將決策樹與這些算法框架進行結合所得到的新的算法:
1)Bagging+ 決策樹 =隨機森林
2)AdaBoost+ 決策樹 =提升樹
3)GradientBoosting + 決策樹 =GBDT

PS:集成算法裏面還有一個比較厲害的就是Stacking模型,
Stacking:聚合多個分類或迴歸模型,就是堆疊算法,可以堆疊各種各樣的分類器(KNN,SVM,RF等等) ;
分兩個階段:第一階段得出各自結果,第二階段再用前一階段結果訓練
說白了就是用多種模型訓練,再把多種訓練的結果當作樣本再來訓練一遍。

隨機森林(Random Forests)

首先介紹下隨機森林:
隨機森林是一種重要的基於Bagging的集成學習方法,可以用來做分類、迴歸等問題。
隨機森林由LeoBreiman(2001)提出,從原始訓練樣本集N中有放回地重複隨機抽取k個樣本生成新的訓練樣本集合,然後根據自助樣本集生成k個分類樹組成隨機森林,新數據的分類結果按分類樹投票多少形成的分數而定。其實質是對決策樹算法的一種改進,將多個決策樹合併在一起,每棵樹的建立依賴於一個獨立抽取的樣品,森林中的每棵樹具有相同的分佈,分類誤差取決於每一棵樹的分類能力和它們之間的相關性。特徵選擇採用隨機的方法去分裂每一個節點,然後比較不同情況下產生的誤差。能夠檢測到的內在估計誤差、分類能力和相關性決定選擇特徵的數目。單棵樹的分類能力可能很小,但在隨機產生大量的決策樹後,一個測試樣品可以通過每一棵樹的分類結果經統計後選擇最可能的分類。

過程
  • 從訓練數據中選取n個數據作爲訓練數據輸入,一般情況下n是遠小於整體的訓練數據N的,這樣就會造成有一部分數據是無法被取到的,這部分數據稱爲袋外數據,可以使用袋外數據做誤差估計。
  • 選取了輸入的訓練數據的之後,需要構建決策樹,具體方法是每一個分裂結點從整體的特徵集M中選取m個特徵構建,一般情況下m遠小於M。
  • 在構造每棵決策樹的過程中,按照選取最小的基尼指數進行分裂節點的選取進行決策樹的構建。決策樹的其他結點都採取相同的分裂規則進行構建,直到該節點的所有訓練樣例都屬於同一類或者達到樹的最大深度。
  • 重複第2步和第3步多次,每一次輸入數據對應一顆決策樹,這樣就得到了隨機森林,可以用來對預測數據進行決策。
  • 輸入的訓練數據選擇好了,多棵決策樹也構建好了,對待預測數據進行預測,比如說輸入一個待預測數據,然後多棵決策樹同時進行決策,最後採用多數投票的方式進行類別的決策。

說白了,隨機森林的隨機主要是兩個方面,一個是隨機有放回的抽取樣本,一個是隨機選取特徵變量

總結

隨機森林有許多優點
•具有極高的準確率
•隨機性的引入,使得隨機森林不容易過擬合
•隨機性的引入,使得隨機森林有很好的抗噪聲能力
•能處理很高維度的數據,並且不用做特徵選擇
•既能處理離散型數據,也能處理連續型數據,數據集無需規範化
•訓練速度快,可以得到變量重要性排序
•容易實現並行化

隨機森林的缺點
•當隨機森林中的決策樹個數很多時,訓練時需要的空間和時間會較大
•隨機森林模型還有許多不好解釋的地方,有點算個黑盒模型


極端隨機森林

極端隨機森林同樣是一種多棵決策樹集成的分類器,與隨機森林分類器比較,主要有兩點不同:

  1. 對於每個決策樹的訓練集,RF採用的是隨機採樣bootstrap來選擇採樣集作爲每個決策樹的訓練集,而extra tree一般不採用隨機採樣,即每個決策樹採用原始訓練集。RandomForest應用的是Bagging模型,ExtraTree使用的所有的樣本,只是特徵是隨機選取的,因爲分裂是隨機的,所以在某種程度上比隨機森林得到的結果更加好.

  2. 在選定了劃分特徵後,RF的決策樹會基於信息增益,基尼係數,均方差之類的原則,選擇一個最優的特徵值劃分點,這和傳統的決策樹相同。但是Extra tree比較的激進,會隨機的選擇一個特徵值來劃分決策樹。

從第二點可以看出,由於隨機選擇了特徵值的劃分點位,而不是最優點位,這樣會導致生成的決策樹的規模一般會大於RF所生成的決策樹。也就是說,模型的方差相對於RF進一步減少,但是bias相對於RF進一步增大。在某些時候,Extra tree的泛化能力比RF更好.

一般情況下,
極端隨機森林分類器在分類精度和訓練時間等方面都要優於隨機森林分類器。


孤立森林

iForest(IsolationForest)孤立森林是一個基於Ensemble的快速異常檢測方法,具有線性時間複雜度和高精準度,是符合大數據處理要求的state-of-the-art算法。
其可以用於網絡安全中的攻擊檢測,金融交易欺詐檢測,疾病偵測,和噪聲數據過濾等。
iForest 適用與連續數據的異常檢測,將異常定義爲“容易被孤立的離羣點 ”——可以理解爲分佈稀疏且離密度高的羣體較遠的點。用統計學來解釋,在數據空間裏面,分佈稀疏的區域表示數據發生在此區域的概率很低,因而可以認爲落在這些區域裏的數據是異常的。

iForest即不用定義數學模型也不需要有標記的訓練。對於如何查找哪些點是否容易被孤立,iForest使用了一套非常高效的策略。

假設我們用一個隨機超平面來切割數據空間, 切一次可以生成兩個子空間。之後我們再繼續用一個隨機超平面來切割每個子空間,循環下去,直到每子空間裏面只有一個數據點爲止。直觀上來講,我們可以發現那些密度很高的簇是可以被切很多次纔會停止切割,但是那些密度很低的點很容易很早的就停到一個子空間了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2Xdv4mSE-1592559990837)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p81)]
上圖裏面紅色的點就很容易被切幾次就停到一個子空間,而白色點和綠色點聚集的地方可以切很多次才停止。

怎麼來切這個數據空間是iForest的設計核心思想,我們僅介紹最基本的方法。由於切割是隨機的,所以需要用ensemble的方法來得到一個收斂值(蒙特卡洛方法),即反覆從頭開始切,然後平均每次切的結果。iForest由t個iTree(Isolation Tree)孤立樹 組成,每個iTree是一個二叉樹結構,其實現步驟如下:

  1. 從訓練數據中隨機選擇ΨΨ個點樣本點作爲子樣本,放入樹的根節點。
  2. 隨機指定一個維度,在當前節點數據中隨機產生一個切割點p——切割點產生於當前節點數據中指定維度的最大值和最小值之間。
  3. 以此切割點生成了一個超平面,然後將當前節點數據空間劃分爲2個子空間:把指定維度裏小於p的數據放在當前節點的左邊,把大於等於p的數據放在當前節點的右邊。
  4. 在子節點中遞歸步驟2和3,不斷構造新的子節點,直到子節點中只有一個數據(無法再繼續切割)或子節點已到達限定高度。

獲得t個iTree之後,iForest訓練就結束,然後我們可以用生成的iForest來評估測試數據了。對於一個訓練數據x,我們令其遍歷每一棵iTree,然後計算x最終落在每個樹第幾層(x在樹的高度)。然後我們可以得出x在每棵樹的高度平均值。

獲得每個測試數據的高度平均值後,我們可以設置一個閾值(邊界值),高度平均值低於此閾值的測試數據即爲異常。也就是說異常在這些樹中只有很短的平均高度。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OuJNhuAM-1592559990839)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p82)]

可以看到b\c的高度是3,a的高度是2,d的高度是1,所以d很有可能是異常值,因爲它最早就被孤立了

iForest目前在分類聚類和異常檢測中都取得顯著效果,但是孤立森林也有自身的缺點:

  1. iForest僅對全局稀疏點敏感,不擅長處理局部的相對稀疏點;
  2. iForest不適用於特別高維的數據。由於每次切數據空間都是隨機選取一個維度,建完樹後仍然有大量的維度信息沒有被使用,導致算法可靠性降低。高維空間還可能存在大量噪音維度或無關維度(irrelevant attributes),影響樹的構建。
  3. iForest屬於無監督問題,這是區別於其他森林系的。所以iForest預測結果爲異常值的樣本需要進行人工檢查。比如:我們用的樣本數據是城市個維度的數據,最終檢查的結果是北上廣深發達城市和西北的一些落後城市,也就是說iForest只能檢查出異常,但是不能區分異常的好壞。所以大家運用的時候還要謹慎。

深度森林

深度森林(Deep Forest)是周志華教授和馮霽博士在2017年2月28日發表的論文《Deep Forest: Towards An Alternative to Deep Neural Networks》中提出來的一種新的可以與深度神經網絡相媲美的基於樹的模型,其結構如圖所示。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-c4AexLIK-1592559990840)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENNote/p45?hash=c6977f22b36f609dbf65e432d6bb2a76)]

級聯森林

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LPQeOMbL-1592559990841)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p84)]

上圖表示gcForest的級聯結構。

每一層都由多個隨機森林組成。通過隨機森林學習輸入特徵向量的特徵信息,經過處理後輸入到下一層。爲了增強模型的泛化能力,每一層選取多種不同類型的隨機森林,上圖給了兩種隨機森林結構,分別爲completely-random tree forests(藍色)和random forests(黑色),每種兩個。其中,每個completely-random tree forests包含1000棵樹,每個節點通過隨機選取一個特徵作爲判別條件,並根據這個判別條件生成子節點,直到每個葉子節點只包含同一類的實例而停止;每個random forests同樣包含1000棵樹,節點特徵的選擇通過隨機選擇d\sqrt d個特徵(d爲輸入特徵的數量),然後選擇基尼係數最大特徵作爲該節點劃分的條件。

級聯森林的迭代終止條件:迭代到效果不能提升就停止!!!

級聯森林中每個森林是如何決策的呢?

每個森林中都包括好多棵決策樹,每個決策樹都會決策出一個類向量結果(以3類爲例,下面也是),然後綜合所有的決策樹結果,再取均值,生成每個森林的最終決策結果——一個3維類向量!每個森林的決策過程如下圖所示。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ey8QtHvt-1592559990843)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENNote/p45?hash=e6d9526814700f7136b768ffb1b44eda)]
這樣,每個森林都會決策出一個3維類向量,回到圖1中,級聯森林中的4個森林就都可以決策出一個3維類向量,然後對4個*3維類向量取均值,最後取最大值對應的類別,作爲最後的預測結果!

爲降低過擬合風險,每個森林產生的類向量由k折交叉驗證產生,即每個樣本會被訓練k-1次,產生k-1個類向量,然後對其求平均值,以產生作爲級聯中下一級的增強特徵的最終類向量。需要注意的是,在擴展一個新的級後,整個級聯的性能將在驗證集上進行評估,如果沒有顯著的性能增益,則訓練過程終止。因此,級聯中級的數量是自動確定的。與模型的複雜度固定的大多數神經網絡相反,gcForest能夠適當的終止訓練來決定其模型的複雜度。所以gcForest適用於不同規模的訓練數據。

多粒度掃描

多粒度掃描是爲了增強級聯森林,爲了對特徵做更多的處理的一種技術手段,具體掃描過程如下圖所示。
在這裏插入圖片描述
上圖表示對輸入特徵使用多粒度掃描的方式產生級聯森林的輸入特徵向量。

對於400維的序列數據,採用100維的滑動窗對輸入特徵進行處理,得到301(400 - 100 + 1)個100維的特徵向量。對於20×20的圖像數據,採用10×10的滑動窗對輸入特徵進行處理,得到121((20-10+1)*(20-10+1))個10×10的二維特徵圖。然後將得到的特徵向量(或特徵圖)分別輸入到一個completely-random tree forest和一個random forest中(不唯一,也可使用多個森林),以三分類爲例,會得到301(或121)個3維類分佈向量,將這些向量進行拼接,得到1806(或726)維的特徵向量。

在這裏插入圖片描述
第一步:使用多粒度掃描對輸入特徵進行預處理。以使用三個尺寸的滑動窗爲例,分別爲100-dim,200-dim和300-dim。輸入數據爲400-dim的序列特徵,使用100-dim滑動窗會得到301個100-dim向量,然後輸入到一個completely-random tree forest和一個random forest中,兩個森林會分別得到的301個3-dim向量(3分類),將兩個森林得到的特徵向量進行拼接,會得到1806-dim的特徵向量。同理,使用200-dim和300-dim滑動窗會分別得到1206-dim和606-dim特徵向量。

第二步:將得到的特徵向量輸入到級聯森林中進行訓練。首先使用100-dim滑動窗得到的1806-dim特徵向量輸入到第一層級聯森林中進行訓練,得到12-dim的類分佈向量(3分類,4棵樹)。然後將得到的類分佈向量與100-dim滑動窗得到的特徵向量進行拼接,得到1818-dim特徵向量,作爲第二層的級聯森林的輸入數據;第二層級聯森林訓練得到的12-dim類分佈向量再與200-dim滑動窗得到的特徵向量進行拼接。作爲第三層級聯森林的輸入數據;第三層級聯森林訓練得到的12-dim類分佈向量再與300-dim滑動窗得到的特徵向量進行拼接,做爲下一層的輸入。一直重複上述過程,直到驗證收。

相比深度神經網絡,gcForest有如下若干有點:

  1. 容易訓練,計算開銷小
  2. 天然適用於並行的部署,效率高
  3. 超參數少,模型對超參數調節不敏感,並且一套超參數可使用到不同數據集
  4. 可以適應於不同大小的數據集,模型複雜度可自適應伸縮
  5. 每個級聯的生成使用了交叉驗證,避免過擬合
  6. 在理論分析方面也比深度神經網絡更加容易。

代碼

https://mp.weixin.qq.com/s/bz_yYD4zvFQ0J-y0ce5E7A
https://blog.csdn.net/Andy_shenzl/article/details/105683388

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章