《統計學習方法》對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棵決策樹,讓它們對新樣例的分類進行 最後通過投票決定最終的 這樣...