整合學習,通過構建並結合多個學習器來完成學習任務,主要分以下兩個種類:
個體學習器間存在強依賴關係、必須序列生成的序列化方法。代表為boosting,如adaboost。
個體學習器間不存在強依賴關係、可同時生成的並行化方法。代表為bagging和隨機森林(rf)。
本質上就是三個臭皮匠頂個諸葛亮,將有限個弱分類器組合成為乙個強分類器,從而增強分類效果。弱分類器的構建是序列的,也就是說有了上乙個分類器的錯誤率才會構建下乙個分類器,直到強分類器能夠達到要求。如果想要了解具體數學演算法,可搜尋加法模型,損失函式(使用的是指數損失函式),前向分步函式,可參閱李航《統計學習方法》,講的較清楚。
演算法流程:
給定初始樣本資料權重(1/m),權重相等
放入基礎弱學習器學習,得到乙個弱分類器
計算該分類器錯誤率,根據錯誤率計算分類器權重alpha(注意此處權重為分類器權重)
根據分類器權重計算樣本權重矩陣d(分類錯誤的權重增加,分類正確的權重減少,注意此處的權重為樣本的權重)
將所有的弱分類器按權重alpha線性組合得到最終的強分類器
判斷強分類器的錯誤率是否為零,或者迭代次數是否到達閾值,否則重複步驟2,3,4,5
1from numpy import *23
#1.新建資料
4def
loadsimpdata():
5 datmat=mat([[1,2.1],
6 [2,1.1],
7 [1.3,1],
8 [1,1],
9 [2,1]])
10 classlabels=[1.0,1.0,-1.0,-1.0,1.0]
11return
datmat,classlabels
1213
#2. 通過閾值比較對資料進行分類
14def
stumpclassify(datamatrix,dimen,threshval,threshineq):
15 retarray=ones((shape(datamatrix)[0],1))
16if threshineq=='lt'
:17 retarray[datamatrix[:,dimen]<=threshval]=-1.0
18else
:19 retarray[datamatrix[:,dimen]>threshval]=-1.0
20return
retarray
2122
#3. 單層決策樹,是決策樹的乙個弱化版本23#
遍歷stumpclassify()函式所有的可能輸入值,並找到資料集上的最佳單層決策樹
24def
buildstump(dataarr,classlabels,d):
25 datamatrix=mat(dataarr)
26 labelmat=mat(classlabels).t
27 m,n=shape(datamatrix)
28 numsteps=10.0;beststump={};bestclassest=mat(zeros((m,1)))
29 minerror=inf #
初始最小錯誤為正無窮30#
資料集上的所有特徵進行迴圈
31for i in
range(n):
32 rangemin =datamatrix[:,i].min()
33 rangemax =datamatrix[:,i].max()
34 stepsize=(rangemax-rangemin)/numsteps35#
在每個特徵裡(即每一列數),從最小值到最大值之間按照固定步長遍歷,尋找到乙個最小分類錯誤率
36for j in range(-1,int(numsteps)+1):37#
在大於和小於之間切換不等式
38for inequal in ['
lt','gt'
]:39 threshval=(rangemin+float(j)*stepsize)
40 predictedvals=stumpclassify(datamatrix,i,threshval,inequal) #
按閾值分類
41 errarr=mat(ones((m,1)))
42 errarr[predictedvals==labelmat]=0 #
分類錯誤為1
43 weightederror=d.t*errarr44#
print("split: dim %d,thresh %.2f,thresh inequal: %s,the weighted error is %.3f"%\45#
(i,threshval,inequal,weightederror))
46if weightederror47 minerror=weightederror
48 bestclassest=predictedvals.copy()
49 beststump['
dim']=i
50 beststump['
thresh
']=threshval
51 beststump['
ineq
']=inequal
52return
beststump,minerror,bestclassest
5354
#4. adaboost演算法,返回各弱分類器
55def adaboosttrainds(dataarr,classlabels,numit=40):
56 weakclassarr=
57 m=shape(dataarr)[0]
58 d=mat(ones((m,1))/m)
59 aggclassest=mat(zeros((m,1)))
60for i in
range(numit):
61 beststump,error,classest=buildstump(datmat,classlabels,d) #
弱分類器,單層決策樹62#
print("d:",d.t)
63 alpha=float(0.5*log((1.0-error)/max(error,1e-16))) #
計算分類器權重alpha值,此處乙個分類器就是一次單層決策樹
64 beststump['
alpha
']=alpha
6566
#print("classest:",classest.t)67#
計算expon, 正確分類的樣本為exp(-alpha),錯誤分類的樣本為為exp(alpha)68#
d為權重矩陣,這裡的權重是樣本的權重,由alpha計算而來
69 expon=multiply(-1*alpha*mat(classlabels).t,classest)
70 d=multiply(d,exp(expon))
71 d=d/d.sum()
72 aggclassest+=alpha*classest #
記錄每個資料點的類別估計累計值,也就是分類器加權求和73#
print("aggclassest:",aggclassest.t)74#
分類錯誤結果置1 sign取數字符號,正數為1,負數為-1,0為0
75 aggerrors=multiply(sign(aggclassest)!=mat(classlabels).t,ones((m,1)))
76 errorrate=aggerrors.sum()/m
77print("
total error:
",errorrate,"\n"
)78if errorrate==0.0:
79break
80return weakclassarr
機器學習實戰 adaboost
adaboost基於錯誤提公升分類器效能 def stumpclassify datamatrix,dimen,threshval,threshineq 根據閾值分類 retarray ones shape datamatrix 0 1 if threshineq lt retarray datam...
機器學習實戰之adaboost
adaboost,是英文 adaptive boosting 自適應增強 的縮寫。它的自適應在於 前乙個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下乙個基本分類器。同時,在每一輪中加入乙個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數。1.演算法流程 ...
機器學習實戰之AdaBoost元演算法
今天學習的機器學習演算法不是乙個單獨的演算法,我們稱之為元演算法或整合演算法 ensemble 其實就是對其他演算法進行組合的一種方式。俗話說的好 三個臭皮匠,賽過諸葛亮 整合演算法有多種形式 對同一資料集,使用多個演算法,通過投票或者平均等方法獲得最後的 模型 同一演算法在不同設定下的整合 同一演...