《統計學習方法》對adaboost演算法進行了相當精彩的介紹,尤其是後面證明adaboost演算法是前向分布加法演算法的特例,這就將adaboost演算法拉入到 統計學習=模型+策略+演算法這一框架中。
1.模型:
加法模型:
adaboost演算法期望用一系列不同權重的基函式的和來構成最終的分類器。
2.策略
採用指數損失函式
3.演算法
採用逐層逼近的演算法,每次尋求乙個alpha 和 g(x)。具體的選取策略詳見教材。
按我的理解,adaboost演算法生效的前提是問題是可學習問題,即每次都能選取到乙個分類誤差率大於0.5(隨機猜測應當是一半對一半的誤差率)的弱分類器。只有這樣,才能保證權重的更新有實際意義
em是該弱分類器的分類誤差,em<0.5時,alpha會大與0
當alpha大於0時,才會擴大誤分類訓練樣本的權重。
單層決策樹生成程式
adaboost的訓練過程#這個函式要構建的是乙個單層的決策樹,但是輸入特徵向量是二維的,所以需要遍歷每一維的特徵。對於這裡尋找得到的單層決策樹,其誤差error為0.2是小於0.5的,這跟我自己的理解應當是一致的。
defbuildstump
(dataarr,classlabels,d):
datamatrix = mat(dataarr); labelmat = mat(classlabels).t
m,n = shape(datamatrix)
numsteps = 10.0; beststump = {}; bestclasest = mat(zeros((m,1)))
minerror = inf #init error sum, to +infinity
for i in range(n):#loop over all dimensions,遍歷每一維的特徵
rangemin = datamatrix[:,i].min(); rangemax = datamatrix[:,i].max();
stepsize = (rangemax-rangemin)/numsteps
#遍歷大量可能的決策樹,尋找其中加權誤差最小的
for j in range(-1,int(numsteps)+1):#loop over all range in current dimension
for inequal in ['lt', 'gt']: #go over less than and greater than
threshval = (rangemin + float(j) * stepsize)
predictedvals = stumpclassify(datamatrix,i,threshval,inequal)#call stump classify with i, j, lessthan
errarr = mat(ones((m,1)))
errarr[predictedvals == labelmat] = 0
weightederror = d.t*errarr #calc total error multiplied by d
"split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshval, inequal, weightederror)
if weightederror < minerror:
minerror = weightederror
bestclasest = predictedvals.copy()
beststump['dim'] = i
beststump['thresh'] = threshval
beststump['ineq'] = inequal
return beststump,minerror,bestclasest
隨著訓練的進行,在訓練新的一輪分類器時,那些分類正確的樣本點的權重會越來越小。所以當迭代次數很大的時候,會出現過擬合現象。當弱分類器數目很多的時候,此時得到的強分類器模型已經很複雜了,所以會出現過擬合現象。而對於像loistic回歸這樣的分類器,其分類平面就是乙個超平面,應當是不可能出現過擬合現象。#每次迭代都會在當前權重下再訓練乙個弱分類器,然後級聯進去
def adaboosttrainds(dataarr,classlabels,numit=40):
weakclassarr =
m = shape(dataarr)[0]
d = mat(ones((m,1))/m) #init d to all equal
aggclassest = mat(zeros((m,1)))
for i in range(numit):
beststump,error,classest = buildstump(dataarr,classlabels,d)#build stump
"d:",d.t
alpha = float(0.5
*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in
max(error,eps) to account for
error=0
beststump['alpha'] = alpha
"classest: ",classest.t
expon = multiply(-1
*alpha
*mat(classlabels).t,classest) #exponent for d calc, getting messy
d = multiply(d,exp(expon)) #calc new d for next iteration
d = d/d.sum()
#calc training error of all classifiers, if this is 0
quit
for loop early (use break)
aggclassest += alpha*classest
"aggclassest: ",aggclassest.t
aggerrors = multiply(sign(aggclassest) != mat(classlabels).t,ones((m,1)))
errorrate = aggerrors.sum()/m
"total error: ",errorrate
if errorrate == 0.0: break
return weakclassarr,aggclassest
機器學習演算法 adaboost
adaboost 1.簡述原理 2.例項 3.演算法流程和公式推導 4.優點和缺點 5.問題 adaboost 1.簡述原理 形式 弱學習器學習方法 弱學習器權值 adaboost就是加法模型 前向分步演算法 指數損失函式 任意基學習器演算法 boosting框架 指數損失函式 任意基學習器演算法 ...
機器學習 演算法 Adaboost
寫在前面 說到adaboost,公式與 網上到處都有,統計學習方法 裡面有詳細的公式原理,github上面有很多例項,那麼為什麼還要寫這篇文章呢?希望從一種更容易理解的角度,來為大家呈現adaboost演算法的很多關鍵的細節。基本原理 adaboost演算法基本原理就是將多個弱分類器 弱分類器一般選...
機器學習之AdaBoost
機器學習之adaboost adaboost是一種組合學習的提公升演算法,能將多個弱學習演算法 甚至只比隨機猜測好一點 組合起來,構成乙個足夠強大的學習模型。組合學習是將多個假說組合起來,並整合它們的 比如對於乙個問題,我們可以生成20棵決策樹,讓它們對新樣例的分類進行 最後通過投票決定最終的 這樣...