8.1 個體與集成
集成學習是通過構(gòu)建并結(jié)合多個學習器來完成任務(wù)凑保。
集成學習的一般結(jié)構(gòu):一組"個體學習器"通過某種策略將它們結(jié)合起來。
集成學習的種類:
1)同質(zhì)集成
個體學習器通過某種算法訓練而成辐怕,此時集成中只包含同種類型的個體學習器倔约,這就是同質(zhì)集成。如生均,每個個體學習器通過C4.5決策樹算法訓練而成,最終組成"決策樹集成";再如"神經(jīng)網(wǎng)絡(luò)集成"中都是神經(jīng)網(wǎng)絡(luò)讥蟆。
同質(zhì)集成中的個體學習器稱為"基學習器",相應(yīng)算法稱為"基學習算法"纺阔。
2)異質(zhì)集成
集成中包含不同算法訓練而成的個體學習器瘸彤,如集成中同時包含決策樹和神經(jīng)網(wǎng)絡(luò),這樣的集成就是異質(zhì)集成笛钝。異質(zhì)集成中的個體學習器稱為"組件學習器"质况。
要獲得好的集成,個體學習器應(yīng)當"好而不同"结榄。
"好"即個體學習器要有一定的"準確性"臼朗,不能太差绣否;
"不同"即要有"多樣性"蒜撮,學習器之間要有差異。
圖a中捷枯,每個分類器h的精度是66.6%,但是集成中的精度提升到100%攀痊;圖b中蚕苇,每個分類器的結(jié)果都是一樣的嚼吞,因此集成中沒有變化舱禽;圖c中誊稚,每個分類器的精度只有33.3%,集成中的精度降低為0疾瓮。從上面可以看出狼电,圖a的三個分類器滿足了"好而不同","好"即有66.6%的精度凸椿,"不同"即每個分類器的結(jié)果不同髓抑;而圖b雖然"好"叙凡,但是分類器結(jié)果相同握爷;圖c雖然結(jié)果不同追城,但是精度太低座柱。
假設(shè)基學習器的誤差相互獨立戏锹,則集成的錯誤率為從集成錯誤率中可以看出,個體學習器的數(shù)目T越大奈搜,集成錯誤率越低馋吗,直至為0。
然而商架,現(xiàn)實中,基學習器不是相互獨立的灿巧,所以個體學習器的"準確性"和"多樣性"本身就存在沖突饿肺。一般的,準確性很高之后溉跃,要增加多樣性就需犧牲準確性撰茎。
如何產(chǎn)生
并結(jié)合
"好而不同"的個體學習器逆粹,是集成學習研究的核心枯饿。
對于產(chǎn)生好而不同的學習器的方式
根據(jù)個體學習器的生成方式,目前的集成學習方法大致可分為兩大類:
第一類:個體學習器問存在強依賴關(guān)系蟋字、必須串行生成的序列化方法。代表是Boosting
第二類:個體學習器間不存在強依賴關(guān)系忠聚、可同時生成的并行化方法。代表是Bagging和"隨機森林" (Random Forest)赂毯。結(jié)合學習器的方式党涕。
1)平均法
2)投票法
3)學習法
上面的產(chǎn)生和結(jié)合方式將在下面講到晌该。
8.2 Boosting
弱學習器常指泛化性略優(yōu)于隨機猜測的學習器次企。
例如在二分類問題上精度略高于50%的分類器目。
Boosting是可以將弱學習器提升為強學習器的算法谭期。
Boosting主要關(guān)住降低偏差踏志,因此Boosting能基于泛化性能相當弱的學習器構(gòu)建出很強的集成针余。
工作機制:
先從初始訓練集訓練出一個基學習器帆谍;
再根據(jù)基學習器的表現(xiàn)對訓練樣本分布進行調(diào)整烈涮,使得先前基學習器做錯的訓練樣本的權(quán)重變高,在后續(xù)受到更多關(guān)注;
然后基于調(diào)整權(quán)重后的樣本分布來訓練下一個基學習器绘雁;
如此重復進行住拭,直至基學習器數(shù)目達到事先指定的值T杠娱;
最終將這T個基學習器進行加權(quán)結(jié)合摊求。
關(guān)于Boosting的兩個核心問題:
1)每一輪如何改變訓練數(shù)據(jù)的權(quán)值或概率分布?
通過提高那些在前一輪被弱分類器分類錯誤樣例的權(quán)值野来,減小前一輪分類正確樣例的權(quán)值踪旷,來使得分類器對誤分的數(shù)據(jù)有較好的效果曼氛。
2)通過什么方式來組合弱分類器?
通過加法模型將弱分類器進行線性組合令野。
Boosting族中最著名的是AdaBoost算法搪锣。
剛開始訓練時對每一個訓練例賦相等的權(quán)重,然后用該算法對訓練集訓練t輪彩掐,每次訓練后,對訓練失敗的訓練例賦以較大的權(quán)重朴下,也就是讓學習算法在每次學習以后更注意學錯的樣本竿屹,從而得到多個預測函數(shù)。通過擬合殘差的方式逐步減小殘差甲喝,將每一步生成的模型疊加得到最終模型。
以下是AdaBoost的推導
基于基學習器的線性組合狈定,來最小化指數(shù)損失函數(shù)。
第一個基學習器h1是通過基學習算法用于初始數(shù)據(jù)發(fā)布獲得揭糕。
之后迭代產(chǎn)生αt和ht冰更,當學習器ht基于發(fā)布Dt產(chǎn)生后,ht的權(quán)重αt官册,要使得αtht最小化指數(shù)損失函數(shù)拴事。對于每個αtht有,
推導之后吗坚,可以再次鞏固AdaBoost算法的流程。
算法流程:https://blog.csdn.net/qq_37960402/article/details/88426900
AdaBoost算法的實現(xiàn)代碼
import pdb
import numpy as np
import operator
import math
def dataset():
data=[0,1,2,3,4,5,6,7,8,9]
labels=[1,1,1,-1,-1,-1,1,1,1,-1]
return data,labels
def mytree(data,label,D1): #生成最優(yōu)決策樹
point=(np.array(data[:-1])+np.array(data[1:]))/2 #取data中相鄰兩者之間的平均值
dic={}
sign={}
for i in point: #遍歷平均值
predict1=np.array(data<i) #判斷左邊為1
predict1=(predict1+0)+(predict1-1) #將結(jié)果轉(zhuǎn)換為[1,-1]
result1=sum(abs(predict1-label)/2*D1) #誤差
predict2 = np.array(data > i) #判斷右邊為1
predict2 = (predict2 + 0) + (predict2 - 1)
result2 = sum(abs(predict2 - label) / 2 * D1)
if result1<=result2: #保存符號和左右邊哪個結(jié)果更好
dic[i]=result1
sign[i]='<'
else:
dic[i]=result2
sign[i]='>'
bestpoint = sorted(dic.items(),key=operator.itemgetter(1))
return bestpoint[0],sign[bestpoint[0][0]]
def Zm1(label,Gm,a,D1): #返回當前樣本的權(quán)重
sum=0
for i in range(len(label)):
sum+=D1[i]*math.e**(-a*label[i]*Gm[i])
newD1=[]
for i in range(len(label)):
w=D1[i]/sum*math.e**(-a*label[i]*Gm[i])
newD1.append(w)
return newD1
def adaboot1():
data,label=dataset() #獲取數(shù)據(jù)集和標簽文件
D1=[1/len(data)]*len(data) #求每一個樣本的初始權(quán)重孽文,0.1
bestpoint=[] #保存目前最佳的分割點
besta=[] #保存每一棵基決策樹對應(yīng)的權(quán)重
signall=[] #保存每一個最佳分割點對應(yīng)的符號(大于或小于)
result=[] #保存每個基決策樹對樣本分類的結(jié)果
for i in range(20):
ht,sign=mytree(data,label,D1) #當前最好的樹
signall.append(sign) #保存記號
bestpoint.append(ht[0]) #保存當前最佳分割點
if sign==str('>'):
Gm= np.array(data > ht[0])
Gm = (Gm+0) + (Gm-1)
else:
Gm= np.array(data < ht[0])
Gm = (Gm+ 0) + (Gm- 1) #樣本帶入樹中得到當前樣本結(jié)果
a=0.5*(math.log((1-ht[1])/ht[1])) #通過誤差計算得到基決策樹權(quán)值
besta.append(a)
result.append(Gm)
D1=Zm1(label,Gm,a,D1) #計算得到每個樣本點的權(quán)值
sum1=[0]*len(data) #以下循環(huán)計算當前結(jié)果是否達到最優(yōu)
for i in range(len(result)):
sum1+=result[i]*besta[i] #result=w1f(x1)+w2f(x2)+..
sum1 = np.array(sum1>=0)
sum1 = (sum1 + 0) + (sum1- 1)
if sum(sum1==label)==len(data): #如果結(jié)果相等,則輸出以下語句
print("一種生成{}棵基函數(shù)".format(len(result)))
for i in range(len(result)):
dic = {}
print ("第{}棵決策樹是".format(i+1))
if signall[i]==str('>'):
dic['num'+'>' + str(bestpoint[i])]=1
dic['num'+'<' + str(bestpoint[i])] = -1
if signall[i] == str('<'):
dic['num'+'<' + str(bestpoint[i])] = 1
dic['num'+'>' + str(bestpoint[i])] = -1
print(dic)
print ("權(quán)值是{}".format(besta[i]))
print()
break
adaboot1()
代碼來源:https://blog.csdn.net/qq_37960402/article/details/88539253
8.3 Bagging與隨機森林
為了提高泛化能力夺艰,要盡可能使基學習器相對獨立芋哭,對訓練樣本進行采樣以產(chǎn)生若干個不同的子集,對每一個子集訓練一個基學習器郁副;又為了進行有效的學習獲得較好的集成减牺,子集不能完全不同,因此使用子集之間相互有交疊的采樣方法存谎。
1. Bagging
bagging 是一種個體學習器之間不存在強依賴關(guān)系拔疚、可同時生成的并行式集成學習方法。
bagging基于自助采樣法(bootstrap sampling)既荚,即給定包含m個樣本的數(shù)據(jù)集稚失,先隨機從樣本中取出一個樣本放入采樣集中,再把該樣本返回初始數(shù)據(jù)集恰聘,使得下次采樣時該樣本仍可以被選中句各。這樣吸占,經(jīng)過m次隨機采樣,就可以得到包含m個樣本的采樣集诫钓,初始數(shù)據(jù)集中有的樣本多次出現(xiàn)旬昭,有的未出現(xiàn)。訓練集中約有63.2%的樣本出現(xiàn)在采樣集中菌湃。
上面的操作進行T次得到T個每個含m個樣本的采樣集问拘,基于每個采樣集訓練一個基學習器,一共訓練出T個惧所,再將基學習器進行組合骤坐。這就是Bagging的基本流程。在對輸出進行預測時下愈,Bagging通常對分類進行簡單投票法纽绍,對回歸使用簡單平均法。在分類中势似,若出現(xiàn)票數(shù)相同的情況拌夏,則隨機取一個。
Bagging的優(yōu)點:
- Bagging 是一個很高效的集成學習算務(wù)履因。
- 與標準 AdaBoost 只適用于二分類任務(wù)不間障簿,Bagging能不經(jīng)修改地用于多分類、回歸等任務(wù)栅迄。
- 每個基學習器使用63.2%的數(shù)據(jù)站故,所以剩下36.8%的數(shù)據(jù)可以用來做驗證集來對泛化性能進行“包外估計”(out-of-bag estimate)。
進行包外估計毅舆,需要記錄每個基學習器所使用的樣本西篓。
令Dt表示ht實際使用的訓練樣本集,令Hoob(x)表示對樣本x的包外預測憋活,即僅考慮剩余未使用的x訓練的基學習器在x上的預測
當基學習器是決策樹時岂津,可以使用包外樣本來輔助剪枝;
當基學習器是神經(jīng)網(wǎng)絡(luò)悦即,可用包外樣本來輔助早停以減少過擬合吮成。
從偏差-方差的角度來說,boosting主要關(guān)注減小偏差盐欺,而Bagging主要關(guān)注降低方差赁豆,也就說明boosting在弱學習器上表現(xiàn)更好,而降低方差可以減小過擬合的風險冗美,所以Bagging通常在強分類和復雜模型上表現(xiàn)得很好魔种。舉個例子:bagging在不減枝決策樹、神經(jīng)網(wǎng)絡(luò)等易受樣本擾動的學習器上效果更為明顯粉洼。
2. 隨機森林
隨機森林是Bagging算法的進化版节预,對bagging進行了改進叶摄。
隨機森林RF以決策樹為基學習器構(gòu)建Bagging集成的基礎(chǔ)上,進一步在決策數(shù)訓練過程中引入了隨機屬性選擇安拟。
具體來說蛤吓,傳統(tǒng)決策樹在選擇劃分屬性時是在當前結(jié)點的屬性集合(假定有d個屬性)中選擇一個最優(yōu)屬性;
而在RF中,對基決策樹的每個結(jié)點糠赦,先從該結(jié)點的屬性集合中隨機選擇一個包含k個屬性的子集会傲,然后再從子集中選擇一個最優(yōu)屬性用于劃分。
k描述了隨機性的引入程度拙泽。若k=d淌山,則決策樹的構(gòu)建與傳統(tǒng)決策樹相同;若k=1顾瞻,則隨機選擇一個屬性用于劃分泼疑;一般情況,k=long2d荷荤。
RF的優(yōu)點
隨機森林中基學習器的多樣性不僅來自樣本擾動退渗,還來自屬性擾動,這就使得最終集成的泛化性能可通過個體學習器之間差異度的增加而進一步提升蕴纳。
RF與Bagging的比較
8.4 結(jié)合策略
通過上面對個體學習器產(chǎn)生的方式了解之后颖低,我們來看一下個體學習器的結(jié)合。
結(jié)合有以下三個好處:
1)結(jié)合多個學習器可以提升泛化性能弧烤。
2)多個學習器結(jié)合可以降低陷入槽糕局部極小點的風險忱屑。
3)結(jié)合多個學習器,可以擴大假設(shè)空間暇昂,學得更好的近似莺戒。
結(jié)合策略如下
假定集成包含T個基學習器{h1,h2,……,hT},其中hi在樣例x上的輸出為hi(x)急波。
1. 平均法
對數(shù)值型輸出hi(x)∈R从铲,常用的是平均法。
-
簡單平均法
-
加權(quán)平均法
加權(quán)平均法不一定優(yōu)于簡單平均法澄暮。一般在個體學習器性能相差較大時宜使用加權(quán)平均法名段,而在個體學習器性能相近時宜使用簡單平均法阱扬。
2. 投票法
對分類來說,學習器hi將從類別集合C={c1,c2,……,cN}中預測出一個類別標記伸辟,最常用的是投票法麻惶。為便于討論,我們將hi在樣本x上的預測輸出表示為一個N維向量(hi1(x),hi2(x),……,hiN(x))信夫,其中hij(x)是hi在類別標記cj上的輸出窃蹋。
-
絕對多數(shù)投票法
-
相對多數(shù)投票法
-
加權(quán)投票法
3. 學習法
當數(shù)據(jù)很多時,可以通過另一個學習器來結(jié)合静稻,即學習法脐彩。其中典型代表為Stacking,在stacking中我們把個體學習器稱為初級學習器姊扔,用于結(jié)合的學習器稱為次學習器或者元學習器惠奸。
Stacking的主要思想為:先從初始數(shù)據(jù)集訓練出初級學習器,然后“生成”一個新的數(shù)據(jù)集用于訓練次級學習器恰梢。生成的新數(shù)據(jù)中佛南,初級學習器的輸出被當做樣例輸入特征,而初始樣本的標記仍被當做樣例標記嵌言。
在訓練階段嗅回,次級學習器的訓練數(shù)據(jù)集是利用初級學習器來產(chǎn)生的,若直接用初級學習器的訓練集來產(chǎn)生訓練數(shù)據(jù)集摧茴,則很有可能會出現(xiàn)過擬合绵载;所以一般在使用Stacking時,采用交叉驗證或留一法的方式苛白,用訓練初級學習器未使用的樣本來產(chǎn)生次級學習器的訓練樣本娃豹。
如以k折交叉驗證法為例。初始訓練集D被隨機分為k個大小相同的子集D1,D2,……,Dk购裙。令Dj和D^j=D/Dj(Dj的補集)分別表示第j折的測試集和訓練集懂版。
給定T個初級學習算法,初級學習器htj 在訓練集D^j 上使用第t個學習算法而得躏率。對測試集Dj中每個樣本xi躯畴,令zit=htj(xi),即xi在初始學習器ht上的輸出記為zit薇芝,則由xi產(chǎn)生的次級訓練集的樣例部分為zi=(zi1,zi2,……,ziT)蓬抄,而標記部分為yi。那么在整個過程結(jié)束之后夯到,從T個初級學習器產(chǎn)生的次級訓練集就是D'={(zi,yi)}mi=1嚷缭,最后將次級訓練集用于訓練次級學習器。
8.5 多樣性
1. 誤差-分歧分解
上面的推導只適用于回歸學習黄娘,難以推廣到分類學習峭状。
2. 多樣性度量
多樣性度量(diversity measure)是用于度量集成中個體分類器的多樣性克滴,即估算個體學習器的多樣化程度。
-
不合度量
-
相關(guān)系數(shù)
-
Q-統(tǒng)計量
-
k-統(tǒng)計量
3. 多樣性增強
增強多樣性的方法有:
-
數(shù)據(jù)樣本擾動
給定初始數(shù)據(jù)集优床,可從中產(chǎn)生出不同的數(shù)據(jù)子集劝赔,再利用不同的數(shù)據(jù)子集訓練出不同的個體學習器。如boosting 和bagging胆敞,這種方法對“不穩(wěn)定學習器”(例如着帽,決策樹,神經(jīng)網(wǎng)絡(luò))很有效移层。對于穩(wěn)定基學習器仍翰,如 線性學習器,支持向量機观话,樸素貝葉斯往往使用輸入屬性擾動予借。 -
輸入屬性擾動
訓練樣本通常由一組屬性描述,不同的“子空間”提供了觀察數(shù)據(jù)的不同視角频蛔。從不同子空間訓練出的個體學習器必然有所不同灵迫。子空間一般指從初始的高維屬性空間投影產(chǎn)生的低維屬性空間。若數(shù)據(jù)只包含少量屬性晦溪,或者冗余屬性很少瀑粥,則不宜使用輸入屬性擾動法. -
輸出表示擾動
基本思路是對輸出表示進行操縱以增強多樣性∪玻可對訓練樣本
的類標記稍作變動狞换,如翻轉(zhuǎn)法(Flipping Output),隨機改變一些訓練樣本的標記舟肉;也可對輸出表示進行轉(zhuǎn)化修噪,如“輸出調(diào)制法”(Output Smearing)。 -
算法參數(shù)擾動
通過隨機設(shè)置不同的參數(shù)可以產(chǎn)生不同的基學習器度气。對參數(shù)較少的算法割按,可通過將其學習過程中某些環(huán)節(jié)用其他類似方式代替?從而達到擾動的目的膨报,例如可將決策樹使用的屬性選擇機制替換成其他的屬性選擇機制磷籍。