【零基础入门数据挖掘】-模型融合
?Datawhale?
作者:田楊軍?,Datawhale優(yōu)秀學(xué)習(xí)者
摘要:對于數(shù)據(jù)挖掘項(xiàng)目,本文將學(xué)習(xí)如何進(jìn)行模型融合?常見的模型融合的方法有哪些?針對不同的問題類型,應(yīng)該選擇哪種方法呢?
模型融合:通過融合多個(gè)不同的模型,可能提升機(jī)器學(xué)習(xí)的性能。這一方法在各種機(jī)器學(xué)習(xí)比賽中廣泛應(yīng)用, 也是在比賽的攻堅(jiān)時(shí)刻沖刺Top的關(guān)鍵。而融合模型往往又可以從模型結(jié)果,模型自身,樣本集等不同的角度進(jìn)行融合。
數(shù)據(jù)及背景
https://tianchi.aliyun.com/competition/entrance/231784/information(阿里天池-零基礎(chǔ)入門數(shù)據(jù)挖掘)
模型融合
如果你打算買一輛車,你會(huì)直接走進(jìn)第一家4S店,然后在店員的推銷下直接把車買了嗎?大概率不會(huì),你會(huì)先去網(wǎng)站,看看其他人的評(píng)價(jià)或者一些專業(yè)機(jī)構(gòu)在各個(gè)維度上對各種車型的對比;也許還會(huì)取咨詢朋友和同事的意見。最后,做出決策。
模型融合采用的是同樣的思想,即多個(gè)模型的組合可以改善整體的表現(xiàn)。集成模型是一種能在各種的機(jī)器學(xué)習(xí)任務(wù)上提高準(zhǔn)確率的強(qiáng)有力技術(shù)。
模型融合是比賽后期一個(gè)重要的環(huán)節(jié),大體來說有如下的類型方式:
1. 簡單加權(quán)融合:
回歸(分類概率):算術(shù)平均融合(Arithmetic mean),幾何平均融合(Geometric mean);
分類:投票(Voting);
綜合:排序融合(Rank averaging),log融合。
2. stacking/blending:
構(gòu)建多層模型,并利用預(yù)測結(jié)果再擬合預(yù)測。
3. boosting/bagging:
多樹的提升方法,在xgboost,Adaboost,GBDT中已經(jīng)用到。
平均法(Averaging)
基本思想:對于回歸問題,一個(gè)簡單直接的思路是取平均。稍稍改進(jìn)的方法是進(jìn)行加權(quán)平均。權(quán)值可以用排序的方法確定,舉個(gè)例子,比如A、B、C三種基本模型,模型效果進(jìn)行排名,假設(shè)排名分別是1,2,3,那么給這三個(gè)模型賦予的權(quán)值分別是3/6、2/6、1/6。
平均法或加權(quán)平均法看似簡單,其實(shí)后面的高級(jí)算法也可以說是基于此而產(chǎn)生的,Bagging或者Boosting都是一種把許多弱分類器這樣融合成強(qiáng)分類器的思想。
簡單算術(shù)平均法:Averaging方法就多個(gè)模型預(yù)測的結(jié)果進(jìn)行平均。這種方法既可以用于回歸問題,也可以用于對分類問題的概率進(jìn)行平均。
加權(quán)算術(shù)平均法:這種方法是平均法的擴(kuò)展。考慮不同模型的能力不同,對最終結(jié)果的貢獻(xiàn)也有差異,需要用權(quán)重來表征不同模型的重要性importance。
其中,且
投票法(voting)
基本思想:假設(shè)對于一個(gè)二分類問題,有3個(gè)基礎(chǔ)模型,現(xiàn)在我們可以在這些基學(xué)習(xí)器的基礎(chǔ)上得到一個(gè)投票的分類器,把票數(shù)最多的類作為我們要預(yù)測的類別。
絕對多數(shù)投票法:最終結(jié)果必須在投票中占一半以上。
相對多數(shù)投票法:最終結(jié)果在投票中票數(shù)最多。
加權(quán)投票法:其原理為
其中,且
硬投票:對多個(gè)模型直接進(jìn)行投票,不區(qū)分模型結(jié)果的相對重要度,最終投票數(shù)最多的類為最終被預(yù)測的類。
軟投票:增加了設(shè)置權(quán)重的功能,可以為不同模型設(shè)置不同權(quán)重,進(jìn)而區(qū)別模型不同的重要度。
from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import VotingClassifiermodel1 = LogisticRegression(random_state=2020) model2 = DecisionTreeClassifier(random_state=2020) model = VotingClassifier(estimators=[('lr', model1), ('dt', model2)], voting='hard') model.fit(x_train, y_train) model.score(x_test,?y_test)堆疊法(Stacking)
基本思想
stacking 就是當(dāng)用初始訓(xùn)練數(shù)據(jù)學(xué)習(xí)出若干個(gè)基學(xué)習(xí)器后,將這幾個(gè)學(xué)習(xí)器的預(yù)測結(jié)果作為新的訓(xùn)練集,來學(xué)習(xí)一個(gè)新的學(xué)習(xí)器。對不同模型預(yù)測的結(jié)果再進(jìn)行建模。
將個(gè)體學(xué)習(xí)器結(jié)合在一起的時(shí)候使用的方法叫做結(jié)合策略。對于分類問題,我們可以使用投票法來選擇輸出最多的類。對于回歸問題,我們可以將分類器輸出的結(jié)果求平均值。
上面說的投票法和平均法都是很有效的結(jié)合策略,還有一種結(jié)合策略是使用另外一個(gè)機(jī)器學(xué)習(xí)算法來將個(gè)體機(jī)器學(xué)習(xí)器的結(jié)果結(jié)合在一起,這個(gè)方法就是Stacking。
在stacking方法中,我們把個(gè)體學(xué)習(xí)器叫做初級(jí)學(xué)習(xí)器,用于結(jié)合的學(xué)習(xí)器叫做次級(jí)學(xué)習(xí)器或元學(xué)習(xí)器(metalearner),次級(jí)學(xué)習(xí)器用于訓(xùn)練的數(shù)據(jù)叫做次級(jí)訓(xùn)練集。次級(jí)訓(xùn)練集是在訓(xùn)練集上用初級(jí)學(xué)習(xí)器得到的。
如何進(jìn)行Stacking
Stacking算法:
過程1-3 是訓(xùn)練出來個(gè)體學(xué)習(xí)器,也就是初級(jí)學(xué)習(xí)器。
過程5-9是 使用訓(xùn)練出來的個(gè)體學(xué)習(xí)器來得預(yù)測的結(jié)果,這個(gè)預(yù)測的結(jié)果當(dāng)做次級(jí)學(xué)習(xí)器的訓(xùn)練集。
過程11 是用初級(jí)學(xué)習(xí)器預(yù)測的結(jié)果訓(xùn)練出次級(jí)學(xué)習(xí)器,得到我們最后訓(xùn)練的模型。
Stacking方法詳解
Stacking模型本質(zhì)上是一種分層的結(jié)構(gòu),這里簡單起見,只分析二級(jí)Stacking.假設(shè)我們有2個(gè)基模型 Model1_1、Model1_2 和 一個(gè)次級(jí)模型Model2。
Step 1. 基模型 Model1_1,對訓(xùn)練集train訓(xùn)練,然后用于預(yù)測 train 和 test 的標(biāo)簽列,分別是P1,T1,Model1_1 模型訓(xùn)練:
訓(xùn)練后的模型 Model1_1 分別在 train 和 test 上預(yù)測,得到預(yù)測標(biāo)簽分別是P1,T1
Step 2. 基模型 Model1_2 ,對訓(xùn)練集train訓(xùn)練,然后用于預(yù)測train和test的標(biāo)簽列,分別是P2,T2,model1_2 模型訓(xùn)練:
訓(xùn)練后的模型 Model1_2 分別在 train 和 test 上預(yù)測,得到預(yù)測標(biāo)簽分別是P2,T2
Step 3. 分別把P1,P2以及T1,T2合并,得到一個(gè)新的訓(xùn)練集和測試集train2,test2。
再用次級(jí)模型 Model2 以真實(shí)訓(xùn)練集標(biāo)簽為標(biāo)簽訓(xùn)練,以train2為特征進(jìn)行訓(xùn)練,預(yù)測test2,得到最終的測試集預(yù)測的標(biāo)簽列 。
這就是我們兩層堆疊的一種基本的原始思路想法。在不同模型預(yù)測的結(jié)果基礎(chǔ)上再加一層模型,進(jìn)行再訓(xùn)練,從而得到模型最終的預(yù)測。
Stacking本質(zhì)上就是這么直接的思路,但是直接這樣有時(shí)對于如果訓(xùn)練集和測試集分布不那么一致的情況下是有一點(diǎn)問題的,其問題在于用初始模型訓(xùn)練的標(biāo)簽再利用真實(shí)標(biāo)簽進(jìn)行再訓(xùn)練,毫無疑問會(huì)導(dǎo)致一定的模型過擬合訓(xùn)練集,這樣或許模型在測試集上的泛化能力或者說效果會(huì)有一定的下降,因此現(xiàn)在的問題變成了如何降低再訓(xùn)練的過擬合性,這里我們一般有兩種方法:
次級(jí)模型盡量選擇簡單的線性模型
利用K折交叉驗(yàn)證
訓(xùn)練:
預(yù)測:
混合法(Blending)
基本思想:Blending采用了和stacking同樣的方法,不過只從訓(xùn)練集中選擇一個(gè)fold的結(jié)果,再和原始特征進(jìn)行concat作為元學(xué)習(xí)器meta learner的特征,測試集上進(jìn)行同樣的操作。
把原始的訓(xùn)練集先分成兩部分,比如70%的數(shù)據(jù)作為新的訓(xùn)練集,剩下30%的數(shù)據(jù)作為測試集。
第一層,我們在這70%的數(shù)據(jù)上訓(xùn)練多個(gè)模型,然后去預(yù)測那30%數(shù)據(jù)的label,同時(shí)也預(yù)測test集的label。
在第二層,我們就直接用這30%數(shù)據(jù)在第一層預(yù)測的結(jié)果做為新特征繼續(xù)訓(xùn)練,然后用test集第一層預(yù)測的label做特征,用第二層訓(xùn)練的模型做進(jìn)一步預(yù)測。
Blending訓(xùn)練過程:
整個(gè)訓(xùn)練集劃分成訓(xùn)練集training sets和驗(yàn)證集validation sets兩個(gè)部分;
在training sets上訓(xùn)練模型;
在validation sets和test sets上得到預(yù)測結(jié)果;
將validation sets的原始特征和不同基模型base model預(yù)測得到的結(jié)果作為新的元學(xué)習(xí)器meta learner的輸入,進(jìn)行訓(xùn)練 ;
使用訓(xùn)練好的模型meta learner在test sets以及在base model上的預(yù)測結(jié)果上進(jìn)行預(yù)測,得到最終結(jié)果。
Stacking與Blending的對比:
優(yōu)點(diǎn)在于:
blending比stacking簡單,因?yàn)椴挥眠M(jìn)行k次的交叉驗(yàn)證來獲得stacker feature
blending避開了一個(gè)信息泄露問題:generlizers和stacker使用了不一樣的數(shù)據(jù)集
缺點(diǎn)在于:
blending使用了很少的數(shù)據(jù)(第二階段的blender只使用training set10%的量)
blender可能會(huì)過擬合
stacking使用多次的交叉驗(yàn)證會(huì)比較穩(wěn)健
Bagging
基本思想:Bagging基于bootstrap(自采樣),也就是有放回的采樣。訓(xùn)練子集的大小和原始數(shù)據(jù)集的大小相同。Bagging的技術(shù)使用子集來了解整個(gè)樣本集的分布,通過bagging采樣的子集的大小要小于原始集合。
采用bootstrap的方法基于原始數(shù)據(jù)集產(chǎn)生大量的子集
基于這些子集訓(xùn)練弱模型base model
模型是并行訓(xùn)練并且相互獨(dú)立的
最終的預(yù)測結(jié)果取決于多個(gè)模型的預(yù)測結(jié)果
Bagging是一種并行式的集成學(xué)習(xí)方法,即基學(xué)習(xí)器的訓(xùn)練之間沒有前后順序可以同時(shí)進(jìn)行,Bagging使用“有放回”采樣的方式選取訓(xùn)練集,對于包含m個(gè)樣本的訓(xùn)練集,進(jìn)行m次有放回的隨機(jī)采樣操作,從而得到m個(gè)樣本的采樣集,這樣訓(xùn)練集中有接近36.8%的樣本沒有被采到。按照相同的方式重復(fù)進(jìn)行,我們就可以采集到T個(gè)包含m個(gè)樣本的數(shù)據(jù)集,從而訓(xùn)練出T個(gè)基學(xué)習(xí)器,最終對這T個(gè)基學(xué)習(xí)器的輸出進(jìn)行結(jié)合。
算法流程:
Boosting
基礎(chǔ)思想:Boosting是一種串行的工作機(jī)制,即個(gè)體學(xué)習(xí)器的訓(xùn)練存在依賴關(guān)系,必須一步一步序列化進(jìn)行。Boosting是一個(gè)序列化的過程,后續(xù)模型會(huì)矯正之前模型的預(yù)測結(jié)果。也就是說,之后的模型依賴于之前的模型。
其基本思想是:增加前一個(gè)基學(xué)習(xí)器在訓(xùn)練訓(xùn)練過程中預(yù)測錯(cuò)誤樣本的權(quán)重,使得后續(xù)基學(xué)習(xí)器更加關(guān)注這些打標(biāo)錯(cuò)誤的訓(xùn)練樣本,盡可能糾正這些錯(cuò)誤,一直向下串行直至產(chǎn)生需要的T個(gè)基學(xué)習(xí)器,Boosting最終對這T個(gè)學(xué)習(xí)器進(jìn)行加權(quán)結(jié)合,產(chǎn)生學(xué)習(xí)器委員會(huì)。
下面給出加州大學(xué)歐文分校Alex Ihler教授的兩頁P(yáng)PT:
Boosting訓(xùn)練過程:
基于原始數(shù)據(jù)集構(gòu)造子集
初始的時(shí)候,所有的數(shù)據(jù)點(diǎn)都給相同的權(quán)重
基于這個(gè)子集創(chuàng)建一個(gè)基模型
使用這個(gè)模型在整個(gè)數(shù)據(jù)集上進(jìn)行預(yù)測
基于真實(shí)值和預(yù)測值計(jì)算誤差
被預(yù)測錯(cuò)的觀測值會(huì)賦予更大的權(quán)重
再構(gòu)造一個(gè)模型基于之前預(yù)測的誤差進(jìn)行預(yù)測,這個(gè)模型會(huì)嘗試矯正之前的模型
類似地,構(gòu)造多個(gè)模型,每一個(gè)都會(huì)矯正之前的誤差
最終的模型(strong learner)是所有弱學(xué)習(xí)器的加權(quán)融合
參考
【1】《機(jī)器學(xué)習(xí)》(西瓜書) 【2】《數(shù)據(jù)挖掘?qū)д摗?【3】《統(tǒng)計(jì)學(xué)習(xí)方法》 【4】集成學(xué)習(xí)-Voting 【5】模型融合方法概述往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看
總結(jié)
以上是生活随笔為你收集整理的【零基础入门数据挖掘】-模型融合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 特殊时期之下的 AI 成功“逆行”,技术
- 下一篇: 【零基础入门数据挖掘】-特征工程