《Python數據分析與機器學習實戰-唐宇迪》讀書筆記第8章--集成算法

python數據分析個人學習讀書筆記-目錄索引

第8章集成算法

   集成學習(ensemble learning)是目前非常流行的機器學習策略,基本上所有問題都可以借用其思想來得到效果上的提升。基本出發點就是把算法和各種策略集中在一起,說白了就是一個搞不定大家一起上!集成學習既可以用於分類問題,也可以用於迴歸問題,在機器學習領域會經常看到它的身影,本章就來探討一下幾種經典的集成策略,並結合其應用進行通俗解讀。

 

8.1Bagging算法

   集成算法有3個核心的思想:baggingboostingstacking,這幾種集成策略還是非常好理解的,下面向大家逐一介紹。

8.1.1並行的集成

   Bagging即boostrap aggregating,其中boostrap是一種有放回的抽樣方法,抽樣策略是簡單的隨機抽樣。其原理很直接,把多個基礎模型放到一起,最後再求平均值即可,這裏可以把決策書當作基礎模型,其實基本上所有集成策略都是以樹模型爲基礎的,公式如下:

 邀月工作室

  首先對數據集進行隨機採樣,分別訓練多個樹模型,最終將其結果整合在一起即可,思想還是非常容易理解的,其中最具代表性的算法就是隨機森林。

8.1.2隨機森林

   隨機森林是機器學習中十分常用的算法,也是bagging集成策略中最實用的算法之一。那麼隨機和森林分別是什麼意思呢?森林應該比較好理解,分別建立了多個決策樹,把它們放到一起不就是森林嗎?這些決策樹都是爲了解決同一任務建立的,最終的目標也都是一致的,最後將其結果來平均即可,如圖8-1所示。

 邀月工作室

  想要得到多個決策樹模型並不難,只需要多次建模就可以。但是,需要考慮一個問題,如果每一個樹模型都相同,那麼最終平均的結果也相同。爲了使得最終的結果能夠更好,通常希望每一個樹模型都是有個性的,整個森林才能呈現出多樣性,這樣再求它們的平均,結果應當更穩定有效。

  如何才能保證多樣性呢?如果輸入的數據是固定的,模型的參數也是固定的,那麼,得到的結果就是唯一的,如何解決這個問題呢?此時就需要隨機森林中的另一部分—隨機。這個隨機一般叫作二重隨機性,因爲要隨機兩種方案,下面分別進行介紹。

  首先是數據採樣的隨機,訓練數據取自整個數據集中的一部分,如果每一個樹模型的輸入數據都是不同的,例如隨機抽取80%的數據樣本當作第一棵樹的輸入數據,再隨機抽取80%的樣本數據當作第二棵樹的輸入數據,並且還是有放回的採樣,這就保證兩棵樹的輸入是不同的,既然輸入數據不同,得到的結果必然也會有所差異,這是第一重隨機。

  如果只在數據層面上做文章,那麼多樣性肯定不夠,還需考慮一下特徵,如果對不同的樹模型選擇不同的特徵,結果的差異就會更大。例如,對第一棵樹隨機選擇所有特徵中的60%來建模,第二棵再隨機選擇其中60%的特徵來建模,這樣就把差異放大了,這就是第二重隨機。

 邀月工作室

  圖8-1 bagging集成策略

  如圖8-2所示,由於二重隨機性使得創建出來的多個樹模型各不相同,即便是同樣的任務目標,在各自的結果上也會出現一定的差異,隨機森林的目的就是要通過大量的基礎樹模型找到最穩定可靠的結果,如圖8-3所示,最終的預測結果由全部樹模型共同決定。

 邀月工作室

  ▲圖8-2 樹模型的多樣性

 邀月工作室

  ▲圖8-3 隨機森林預測結果

  解釋隨機森林的概念之後,再把它們組合起來總結如下:

  • 1.隨機森林首先是一種並聯的思想,同時創建多個樹模型,它們之間是不會有任何影響的,使用相同參數,只是輸入不同。
  • 2.爲了滿足多樣性的要求,需要對數據集進行隨機採樣,其中包括樣本隨機採樣與特徵隨機採樣,目的是讓每一棵樹都有個性。
  • 3.將所有的樹模型組合在一起。在分類任務中,求衆數就是最終的分類結果;在迴歸任務中,直接求平均值即可。

  對隨機森林來說,還需討論一些細節問題,例如樹的個數是越多越好嗎?樹越多代表整體的能力越強,但是,如果建立太多的樹模型,會導致整體效率有所下降,還需考慮時間成本。在實際問題中,樹模型的個數一般取100~200個,繼續增加下去,效果也不會發生明顯改變。圖8-4是隨機森林中樹模型個數對結果的影響,可以發現,隨着樹模型個數的增加,在初始階段,準確率上升很明顯,但是隨着樹模型個數的繼續增加,準確率逐漸趨於穩定,並開始上下浮動。這都是正常現象,因爲在構建決策樹的時候,它們都是相互獨立的,很難保證把每一棵樹都加起來之後會比原來的整體更好。當樹模型個數達到一定數值後,整體效果趨於穩定,所以樹模型個數也不用特別多,夠用即可。

  在集成算法中,還有一個很實用的參數——特徵重要性,如圖8-5所示。先不用管每一個特徵是什麼,特徵重要性就是在數據中每一個特徵的重要程度,也就是在樹模型中,哪些特徵被利用得更多,因爲樹模型會優先選擇最優價值的特徵。在集成算法中,會綜合考慮所有樹模型,如果一個特徵在大部分基礎樹模型中都被使用並且靠近根節點,它自然比較重要。

 邀月工作室

▲圖8-4 隨機森林中樹模型個數對結果的影響

 邀月工作室

▲圖8-5 特徵重要性

當使用樹模型時,可以非常清晰地得到整個分裂過程,方便進行可視化分析,如圖8-6所示,這也是其他算法望塵莫及的,在下一章的實戰任務中將展示繪製樹模型的可視化結果的過程。

 邀月工作室

  圖8-6 樹模型可視化展示

  最後再來總結一下bagging集成策略的特點:

    1.並聯形式,可以快速地得到各個基礎模型,它們之間不會相互干擾,但是其中也存在問題,不能確保加進來的每一個基礎樹模型都對結果產生促進作用,可能有個別樹模型反而拉後腿。

    2.可以進行可視化展示,樹模型本身就具有這個優勢,每一個樹模型都具有實際意義。

    3.相當於半自動進行特徵選擇,總是會先用最好的特徵,這在特徵工程中一定程度上省時省力,適用於較高維度的數據,並且還可以進行特徵重要性評估。

 

8.2Boosting算法

   上一節介紹的bagging思想是,先並行訓練一堆基礎樹模型,然後求平均。這就出現了一個問題:如果每一個樹模型都比較弱,整體平均完還是很弱,那麼怎樣才能使模型的整體戰鬥力更強呢?這回輪到boosting算法登場了,boosting算法可以說是目前比較厲害的一種策略。

8.2.1串行的集成

   Boosting算法的核心思想就在於要使得整體的效果越來越好,整體隊伍是非常優秀的,一般效果的樹模型想加入進來是不行的,只要最強的樹模型。怎麼才能做到呢?先來看一下boosting算法的基本公式:

 邀月工作室

  通俗的解釋就是把Fm−1(x)當作前一輪得到的整體,這個整體中可能已經包含多個樹模型,當再往這個整體中加入一個樹模型的時候,需要滿足一個條件——新加入的h(xi)與前一輪的整體組合完之後,效果要比之前好。怎麼評估這個好壞呢?就是看整體模型的損失是不是有所下降。

  Boosting算法是一種串聯方式,如圖8-7所示,先有第一個樹模型,然後不斷往裏加入一個個新的樹模型,但是有一個前提,就是新加入的樹模型要使得其與之前的整體組合完之後效果更好,說明要求更嚴格。最終的結果與bagging也有明顯的區別,這裏不需要再取平均值,而是直接把所有樹模型的結果加在一起。那麼,爲什麼這麼做呢?

 邀月工作室

  圖8-7 提升思想

  回到銀行貸款的任務中,假設數據的真實值等於1000,首先對樹A進行預測,得到值950,看起來還不錯。接下來樹B登場了,這時出現一個關鍵點,就是它在預測的時候,並不是要繼續預測銀行可能貸款多少,而是想辦法彌補樹A還有多少沒做好,也就是1000−950=50,可以把50當作殘差,這就是樹B要預測的結果,假設得到30。現在需要把樹A和樹B組合成爲一個整體,它們一起預測得950+30=980。接下來樹C要完成的就是剩下的殘差(也就是20),那麼最終的結果就是樹A、B、C各自的結果加在一起得950+30+18=998,如圖8-8所示。說到這裏,相信大家已經有點感覺了,boosting算法好像開掛了,爲了達到目標不擇手段!沒錯,這就是boosting算法的基本出發點。

 邀月工作室

  圖8-8 提升算法中的樹模型

8.2.2Adaboost算法

   下面再來介紹一下boosting算法中的一個典型代表——Adaboost算法。簡單來說,Adaboost算法還是按照boosting算法的思想,要建立多個基礎模型,一個個地串聯在一起。

  圖8-9是Adaboost算法的建模流程。當得到第一個基礎樹模型之後,在數據集上有些樣本分得正確,有些樣本分得錯誤。此時需要考慮這樣一個問題,爲什麼會分錯呢?是不是因爲這些樣本比較難以判斷嗎?那麼更應當注重這些難度較大的,也就是需要給樣本不同的權重,做對的樣本,權重相對較低,因爲已經做得很好,不需要太多額外的關注;做錯的樣本權重就要增大,讓模型能更重視它。以此類推,每一次劃分數據集時,都會出現不同的錯誤樣本,繼續重新調整權重,以對數據集不斷進行劃分即可。每一次劃分都相當於得到一個基礎的樹模型,它們要的目標就是優先解決之前還沒有劃分正確的樣本。

 邀月工作室

  圖8-9 Adaboost算法建模流程

  圖8-10是Adaboost算法需要把之前的基礎模型都串在一起得到最終結果,但是這裏引入了係數,相當於每一個基礎模型的重要程度,因爲不同的基礎模型都會得到其各自的評估結果,例如準確率,在把它們串在一起的時候,也不能同等對待,效果好的讓它多發揮作用,效果一般的,讓它參與一下即可,這就是係數的作用。

 邀月工作室

  圖8-10 Adaboost集成結果

  Adaboost算法整體計算流程如圖8-11所示,在訓練每一個基礎樹模型時,需要調整數據集中每個樣本的權重分佈,由於每次的訓練數據都會發生改變,這就使得每次訓練的結果也會有所不同,最終再把所有的結果累加在一起。

 邀月工作室

  圖8-11 Adaboost算法計算流程

 

8.3Stacking模型

   前面討論了bagging和boosting算法,它們都是用相同的基礎模型進行不同方式的組合,而stacking模型與它們不同,它可以使用多個不同算法模型一起完成一個任務,先來看看它的整體流程,如圖8-12所示。

  首先選擇m個不同分類器分別對數據進行建模,這些分類器可以是各種機器學習算法,例如樹模型、邏輯迴歸、支持向量機、神經網絡等,各種算法分別得到各自的結果,這可以當作第一階段。再把各算法的結果(例如得到了4種算法的分類結果,二分類中就是0/1值)當作數據特徵傳入第二階段的總分類器中,此處只需選擇一個分類器即可,得到最終結果。

其實就是把無論多少維的特徵數據傳入各種算法模型中,例如有4個算法模型,得到的結果組合在一起就可以當作一個4維結果,再將其傳入到第二階段中得到最終的結果。

 邀月工作室

  圖8-12 stacking算法計算流程

  圖8-13是stacking策略的計算細節,其中Model1可以當作是第一階段中的一個算法,它與交叉驗證原理相似,先將數據分成多份,然後各自得到一個預測結果。那麼爲什麼這麼做呢?直接拿原始數據進行訓練不可以嗎?其實在機器學習中,一直都遵循一個原則,就是不希望訓練集對接下來任何測試過程產生影響。在第二階段中,需要把上一步得到的結果當作特徵再進行建模,以得到最終結果,如果在第一階段中直接使用全部訓練集結果,相當於第二階段中再訓練的時候,已經有一個先驗知識,最終結果可能出現過擬合的風險。

 邀月工作室

  圖8-13 stacking策略計算細節

  藉助於交叉驗證的思想,在第一階段中,恰好可以避免重複使用訓練集的問題,這個時候得到的結果特徵就是不帶有訓練集信息的結果。第二階段就用Model2指代,只需簡單完成一次建模任務即可。

 

本章小結:本章介紹了機器學習中非常實用的策略——集成算法,分別講解了其中三大核心模塊:bagging、boosting和stacking。雖然都是集成策略,但不同算法的側重點還是有所差異,在實際應用中,算法本身並沒有高低之分,還需根據不同任務選擇最合適的方法。

 

第8章完。

python數據分析個人學習讀書筆記-目錄索引

 

該書資源下載,請至異步社區:https://www.epubit.com

 

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