資料競賽入門-金融風控(貸款違約預測)五、模型融合

越前浩波發表於2020-09-27

前言

本次活動為datawhale與天池聯合舉辦,為金融風控之貸款違約預測挑戰賽(入門)
比賽地址:https://tianchi.aliyun.com/competition/entrance/531830/introduction

為什麼要進行模型融合

這裡得談到整合學習
整合學習可以分為兩類,一種是把強分類器進行強強聯合,使得融合後的模型效果更強,稱為模型融合。另一種是將弱分類器通過學習演算法整合起來變為很強的分類器,稱為機器學習元演算法。

這裡我們把用來進行融合的學習器稱為個體學習器。

模型融合的代表有:投票法(Voting)、線性混合(Linear Blending)、Stacking。

而機器學習元演算法又可以根據個體學習器之間是否存在依賴關係分為兩類,稱為Bagging和Boosting:

  • Bagging: 個體學習器不存在依賴關係,可同時對樣本隨機取樣並行化生成個體學習器。代表作為隨機森林(Random Forest)
  • Boosting: 個體學習器存在依賴關係,基於前面模型的訓練結果誤差生成新的模型,必須序列化生成。代表的演算法有:Adaboost、GBDT、XGBoost

模型融合
在進行模型融合的時候,也不是說隨意的融合就能達到好的效果。進行融合時,所需的整合個體(就是用來整合的模型)應該好而不同。好指的是個體學習器的效能要好,不同指的是個體模型的類別不同。

在這裡舉個西瓜書的例子,在介紹例子之前,首先提前介紹簡單投票法,以分類問題為例,就是每個分類器對樣例進行投票,哪個類別得到的票數最多的就是融合後模型的結果。
在這裡插入圖片描述
在上面的例子中,採用的就是簡單的投票法。中間的圖b各個模型輸出都一樣,因此沒有什麼效果。第三個圖c每個分類器的精度只有33%,融合後反而更糟。也就是說,想要模型融合有效果,個體學習器要有一定的準確率,並且要有多樣性,學習器之間具有差異,即”好而不同“。

如何做到好而不同呢?可以由下面幾個方面:

  • 針對輸入資料:使用取樣的方法得到不同的樣本(比如bagging方法採用自助法進行抽樣)
  • 針對特徵:對特徵進行抽樣
  • 針對演算法本身:
    • 個體學習器 h t h_{t} ht來自不同的模型集合
    • 個體學習器 h t h_{t} ht來自於同一個模型集合的不同超引數,例如學習率η不同
    • 演算法本身具有隨機性,例如用不同的隨機種子來得到不同的模型
  • 針對輸出:對輸出表示進行操縱以增強多樣性
    • 如將多分類轉化為多個二分類任務來訓練單模型
    • 將分類輸出轉化為迴歸輸出等

那麼進行模型融合為什麼比較好呢?雖然有俗話說:三個臭皮匠賽過諸葛亮,但是我們還是想知道,究竟是如何“賽過諸葛亮”的。這裡摘錄西瓜書如下:

學習器的結合可能會從三個方面帶來好處:

  • 首先,從統計的方面來看,由於學習任務的假設空間往往很大,可能有多個假設在訓練集上達到相同的效能,此時若使用單學習器,可能因誤選而導致泛化效能不佳,結合多個學習器則會減少這一風險;

  • 第二,從計算的方面來看,學習演算法往往會陷入區域性極小,有的區域性極小點所對應的泛化效能可能很糟糕,而通過多次執行之後進行結合,可降低陷入糟糕區域性極小點的風險;

  • 第三,從表示的方面來看,某些學習任務的真實假設可能不在當前學習演算法所考慮的假設空間中,此時若使用單學習器則肯定無效,而通過結合多個學習器,由於相應的假設空間有所擴大,有可能學得更好的近似。

在這裡插入圖片描述

模型融合方法:

平均

簡單平均法

  • 簡單加權平均,結果直接融合 求多個預測結果的平均值。pre1-pren分別是n組模型預測出來的結果,將其進行加權融

      pre = (pre1 + pre2 + pre3 +...+pren )/n
    

加權平均法

  • 加權平均法 一般根據之前預測模型的準確率,進行加權融合,將準確性高的模型賦予更高的權重。

      pre = 0.3pre1 + 0.3pre2 + 0.4pre3 
    

投票

簡單投票

from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
 
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))

加權投票

在VotingClassifier中加入引數 voting=‘soft’, weights=[2, 1, 1],weights用於調節基模型的權重

from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
 
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)], voting='soft', weights=[2, 1, 1])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))

綜合:

排序融合

log融合

stacking:

構建多層模型,並利用預測結果再擬合預測。

blending:

選取部分資料預測訓練得到預測結果作為新特徵,帶入剩下的資料中預測。

boosting/bagging

參考:
細語呢喃

相關文章