機器學習演算法 之Adaboost

2021-07-09 09:55:38 字數 3687 閱讀 7527

《統計學習方法》對adaboost演算法進行了相當精彩的介紹,尤其是後面證明adaboost演算法是前向分布加法演算法的特例,這就將adaboost演算法拉入到 統計學習=模型+策略+演算法這一框架中。

1.模型:

加法模型:

adaboost演算法期望用一系列不同權重的基函式的和來構成最終的分類器。

2.策略

採用指數損失函式

3.演算法

採用逐層逼近的演算法,每次尋求乙個alpha 和 g(x)。具體的選取策略詳見教材。

按我的理解,adaboost演算法生效的前提是問題是可學習問題,即每次都能選取到乙個分類誤差率大於0.5(隨機猜測應當是一半對一半的誤差率)的弱分類器。只有這樣,才能保證權重的更新有實際意義

em是該弱分類器的分類誤差,em<0.5時,alpha會大與0

當alpha大於0時,才會擴大誤分類訓練樣本的權重。

單層決策樹生成程式

#這個函式要構建的是乙個單層的決策樹,但是輸入特徵向量是二維的,所以需要遍歷每一維的特徵。對於這裡尋找得到的單層決策樹,其誤差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

print

"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

adaboost的訓練過程

#每次迭代都會在當前權重下再訓練乙個弱分類器,然後級聯進去

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

#print

"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

#print

"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

#print

"aggclassest: ",aggclassest.t

aggerrors = multiply(sign(aggclassest) != mat(classlabels).t,ones((m,1)))

errorrate = aggerrors.sum()/m

print

"total error: ",errorrate

if errorrate == 0.0: break

return weakclassarr,aggclassest

隨著訓練的進行,在訓練新的一輪分類器時,那些分類正確的樣本點的權重會越來越小。所以當迭代次數很大的時候,會出現過擬合現象。當弱分類器數目很多的時候,此時得到的強分類器模型已經很複雜了,所以會出現過擬合現象。而對於像loistic回歸這樣的分類器,其分類平面就是乙個超平面,應當是不可能出現過擬合現象。

機器學習演算法 adaboost

adaboost 1.簡述原理 2.例項 3.演算法流程和公式推導 4.優點和缺點 5.問題 adaboost 1.簡述原理 形式 弱學習器學習方法 弱學習器權值 adaboost就是加法模型 前向分步演算法 指數損失函式 任意基學習器演算法 boosting框架 指數損失函式 任意基學習器演算法 ...

機器學習 演算法 Adaboost

寫在前面 說到adaboost,公式與 網上到處都有,統計學習方法 裡面有詳細的公式原理,github上面有很多例項,那麼為什麼還要寫這篇文章呢?希望從一種更容易理解的角度,來為大家呈現adaboost演算法的很多關鍵的細節。基本原理 adaboost演算法基本原理就是將多個弱分類器 弱分類器一般選...

機器學習之AdaBoost

機器學習之adaboost adaboost是一種組合學習的提公升演算法,能將多個弱學習演算法 甚至只比隨機猜測好一點 組合起來,構成乙個足夠強大的學習模型。組合學習是將多個假說組合起來,並整合它們的 比如對於乙個問題,我們可以生成20棵決策樹,讓它們對新樣例的分類進行 最後通過投票決定最終的 這樣...