机器学习模型融合
模型融合方式:
· 均值法Averaging:適用于回歸類算法,將每個評估器的輸出做平均,類似于Bagging中回歸的做法。
· 投票法Voting: 適用于分類算法,將每個評估器的輸出進行投票, 類似于Bagging中分類的做法
· 堆疊法Stacking: 使用一個/多個算法在訓練集上輸出的某種結果作為下一個算法的訓練數據。
· 改進堆疊法Blending: 一種特殊的stacking, 使用一個/多個算法在驗證集上輸出的某種結果作為下一個算法的訓練數據。
一 投票法Voting:
1 五大類投票方法
(1)相對多數投票
只要有一個類別占比較多即可
(2)絕對多數投票
要求至少有50%或者以上的分類器都輸出了同一類別,否則拒絕預測。
(3)硬投票
將不同類別的出現次數進行計數,出現次數最多的類別就是投票結果。
(4)軟投票
將不同類別下的概率進行加和,概率最高的類別就是投票結果?;诟怕实能浲镀笨梢院饬客镀钡闹眯懦潭?#xff0c; 某一類別下的概率越高, 說明該模型對該類別的預測結果越有信心。
(5)加權投票
加權投票是在投票過程中賦予不同分類器權重的投票,具體表現在:
· 對于硬投票,加權投票可以改變每一個分類器所擁有的票數。
· 對于軟投票,加權投票可以改變每一個分類器所占的權重,令概率的普通加和變成加權求和。
2 模型融合流程(分類問題)
(1)建立基于交叉驗證的benchmark、做模型選擇
在模型融合前,需將可能有用的算法簡單運行一次,從中調選出表現較好的算法作為融合的基礎。找到單一算法可以實現的最好分數來作為benchmark,然后將融合后的模型與benchmark進行比較。
(2)構建多組分類器, 進行融合
進行投票或者平均融合后,結果反而沒有單個算法好,可能是以下原因:
1. 評估器之間的學習能力/模型表現差異太大。 在融合中,一個表現很差的模型會拉低整個融合模型的上限,尤其是回歸類算法,所以應當剔除差得模型。
2. 評估器在類型上過于相似。比如都是樹模型、都是Boosting算法,如果平均/投票的評估器都一致,那融合模型最終得出的結果也會與單個評估器一致。
3. 對評估器進行了過于精密的調優。經過粗略調優的評估器融合能夠提升模型表現, 但如果對評估器進行過于精密的調優, 可能會讓融合后的算法處于嚴重過擬合的狀態。
3 構建多樣性
在模型融合中,獨立性被稱為多樣性,評估器之間的差別越大、彼此之間就越獨立,因此評估器越多樣,獨立性就越強。
以下方法,用來讓評估器變得更多樣,讓評估器之間相互獨立:
· 訓練數據多樣性: 完成多組有效的特征工程,使用不同的特征矩陣訓練不同的模型。但如何找出多組有效的特征工程是難題。
· 樣本多樣性: 使用相同的特征矩陣, 但每次訓練時抽樣出不同的樣本子集進行訓練。
· 特征多樣性: 使用相同特征矩陣, 但每次訓練時抽樣出不同的特征子集進行訓練。
· 隨機多樣性/訓練多樣性: 使用相同的算法,但使用不同的隨機數種子(會導致使用不同的特征、樣本、起點)、或使用不同的損失函數、使用不同的不純度下降量等。
· 算法多樣性: 增加類型不同的算法,如集成、樹、概率、線性模型相混合。
二 堆疊法Stacking
1 Stacking基本思想
Stacking集模型效果好、可解釋性強、適用復雜數據
Stacking由兩層組成,分別為level 0和level 1,level 0中包含一個或多個強學習器,而level 1只能包含一個學習器。在訓練過程中,level 0先進行訓練,level 0中的每個算法會輸出相應的預測結果(驗證集),將這些預測結果拼湊成新特征矩陣,再輸入level 1的算法進行訓練。融合模型最終輸出的預測結果就是level 1的學習器輸出的結果。
?在訓練過程中,level 0輸出的預測結果一般如下排布:
?注意:
level 0上的學習器是復雜度高、學習能力強的學習器,如繼承算法。而level 1上的學習器是可解釋性強、較為簡單的學習器,如決策樹、線性回歸、邏輯回歸等。
有這樣的要求是因為level 0上的算法目的是找出原始數據與標簽的關系、建立原始數據與標簽之間的假設,因此需要強大的學習能力。level 1上的算法的職責是融合個體學習器做出的假設、并且最終輸出融合模型的結果,相當于在尋找“最佳融合規則”。
2 Stacking細節問題
(1)要不要對融合的算法進行精密的調參?
個體學習器粗調,元學習器精調,如果不過擬合的話,可以兩類學習器都精調
(2)個體學習器算法要怎么樣選擇才能最大化stacking的效果?
控制過擬合、增加多樣性、注意算法整體的運算時間。
(3)個體學習器可以是復雜度較低的算法嗎?元學習器可以是Xgboost這種復雜度很高的算法嗎?
都可以,以模型效果為準。
(4)level 0和level 1的算法可不可以使用不同的損失函數?
可以,不同的損失函數衡量的是類似的差異,不過不同的損失對于差異的敏感性不同,盡量使用相似的損失函數。
(5)level 0和level 1的算法可不可以使用不同的評估指標?
必須使用相同的模型評估指標
3 Stacking中的交叉驗證
(1)元學習器的特征矩陣的兩個問題:
· 元學習器的特征矩陣中的特征一定很少
特征矩陣中的特征數就等于個體學習器的個數
·元學習器的特征矩陣中樣本量也不太多
因為元學習器的特征矩陣為level 0在驗證集上的輸出結果,驗證集的樣本量有限
因此可使用交叉驗證來造特征矩陣
對任意個體學習器來說,假設執行5折交叉驗證,會將訓練數據分成5份,并按照4份訓練、1份驗證的方式總共建立5個模型,訓練5次,注意每個學習器都要執行一次5折交叉驗證,注意是一個學習器分別執行這5次驗證,并不是正常的迭代訓練執行,因此不會泄露數據。
某個 個體學習器的訓練過程如下圖所示:
?個體學習器最終輸出的列為上圖中的5個預測結果拼接:
?最終,任意個體學習器的輸出的預測值數量 = 樣本量
數據量夠大,使用過多的交叉驗證折數并不會帶來好處,更可能讓訓練時間降低。
4 Stratified K折交叉驗證
Stratified K折驗證會考慮標簽中每個類別占比的交叉驗證,每次訓練時交叉驗證會保證
原始標簽中的類別比例 = 訓練標簽的類別比例 = 驗證標簽的類別比例。
5 特征太少的解決方案
?sklearn中StackingClassifier的參數stack_method(這個參數只用于分類問題,因為回歸問題輸出的只能是標簽):
正常情況下,一個個體學習器只能輸出一列的預測結果,但如果把輸出的結果類型更換為概率值、置信度等內容,輸出結果的結構就可以從一列擴展為多列。
這個操作由參數stack_method控制,stack_method里面可以輸入四種字符串:
"auto","predict_proba","decision_function","predict"
· predict_proba?是輸出概率值
????????對n分類,輸出樣本的真實標簽為[0,1,2,3...n]的概率,一共n列
· decision_function?是每個樣本點到分類超平面的距離,可以衡量置信度
????????對n分類,輸出樣本的真實標簽為[0,1,2,3...n]的置信度,一共n列
· predict?輸出具體的預測標簽
? ? ? ? 對任何分類形式,輸出算法在樣本上的預測標簽,一列
6 Stacking融合的訓練/測試流程
*測試流程:
(1)細節問題:
· 最終輸出預測結果的是元學習器,直覺上來說測試數據集或許應該被輸入到元學習器當中。然而,元學習器是使用新特征矩陣進行預測的,新特征矩陣的結構與規律都與原始數據不同。所以元學習器不可能接受從原始數據中分割出來的測試數據,正確的做法應該是讓測試集輸入level 0的個體學習器。
· level 0 的個體學習器們在訓練過程中做的是交叉驗證,而交叉驗證只會輸出驗證結果,不會留下被訓練的模型。因此在level 0中沒有可以用于預測的、已經訓練完畢的模型。
解決方法:
訓練時,在交叉驗證完成后,使用全部訓練數據對所有個體學習器進行訓練,為測試做好準備
stacking的測試:
1.將測試集輸入level 0的個體學習器,分別在每個個體學習器上預測出相應結果,拼接起來作為標簽。
2.將新特征矩陣放入元學習器進行預測。
因此在stacking中,不僅要對個體學習器完成全部交叉驗證,還需要在交叉驗證結束后,重新使用全部訓練數據來訓練所有的模型。
需要注意:想要對原生代碼下的模型進行融合,必須自己手寫融合過程。
三 改進后的堆疊法: Blending
Blending在訓練過程中,level 0輸出的是驗證集的結果,并沒有做K折交叉驗證,即level 1的特征矩陣就是驗證集對應的大小,學習的東西少一些,模型抗過擬合能力越強。(數據量龐大的情況下可用)
數據量很小的情況下,stacking和blending都無法有效使用,實際中,stacking的應用比blending廣泛。
總結
- 上一篇: P2607 [ZJOI2008]骑士
- 下一篇: 入行时间序列预测必读的4篇论文(附代码)