adaboost就是通過迭代訓練若干個弱分類器,直到錯誤率為零,所有分類器的加權(d)和的sign值就是結果。每一次迭代之後的下乙個分類器都更加關注分錯類的個體(每乙個弱分類器都是通過閾值劃分確定的,找到使總體的錯誤最小的切分方式,
即min(d.t*(判斷錯誤為1,正確為0的矩陣)),這一次劃分錯誤的個體權值就會在下乙個分類器裡權值加強,為了使min(d.t*(判斷錯誤為1,正確為0的矩陣)),所以上乙個錯誤的這次肯定對,根據前幾次的分類器加權,但是總體的錯誤率會降低,所以這個弱分類器的權值會逐步的贈大。
裡面有很好的例子,看完就明白啦
具體步驟,看**吧,跑一遍,啥都明白了
from numpy import *
def loadasampldata():
datamat=matrix([[1,2.1],[1.3,1.],[2.,1.1],[1.,1.],[2.,1.]])
classlabels=[1.0,1.0,-1.0,-1.0,1.0]
# m, n = shape(datamat)
# print(n)
return datamat,classlabels
def stumpclassify(datamatrix,dimen,threshval,threshineq):
"""根據threshineq的兩個值及進行判斷,threshinq為it時大於threshval的一邊為+1,另一邊為-1,另一種情況與他相反
dimen 是輸入的第dimen+1個特徵,這裡共有兩個特徵 dimen最大為1
"""retarray=ones((datamatrix.shape[0],1))
if threshineq=="it":
retarray[datamatrix[:,dimen]<=threshval]=-1.0
else:
retarray[datamatrix[:, dimen] > threshval] = -1.0
return retarray
def buildstump(dataarr,classlabels,d):
"""進行三重迴圈:
for 每乙個特徵:
for 每乙個步長
for 每乙個不等號
返回最佳單層決策樹
:param dataarr:
:param classlabels: 真實的y
:param d: 權值列表
:return:beststump,minerror,bestclassest
"""datamatrix=mat(dataarr)
labelmat=mat(classlabels).t
m,n=shape(datamatrix)
numsteps=10.0
beststump={}
bestclassest=mat(zeros((m,1)))
minerror=inf
for i in range(n):##n代表特徵,遍歷每乙個特徵這裡是2
rangemin=datamatrix[:,i].min()#datamax每一列的最小值
rangemax=datamatrix[:,i].max()#datamax每一列的最大值
stepsize=(rangemax-rangemin)/numsteps
for j in range(-1,int(numsteps)+1):#對每乙個步長進行遍歷
for inequal in ['it','gt']:
threshval=rangemin+j*stepsize
predictedvals=stumpclassify(datamatrix,i,threshval,inequal)
errarr=ones((m,1))
errarr[predictedvals==labelmat]=0#與真正的label相同的為0,不同的為1
weightedeorror=d.t*errarr#根據權值計算損失函式
if weightedeorrorminerror=weightedeorror
beststump['thresh']=threshval#根據thresh及進行特徵劃分
beststump['dim']=i#根據第dim+1個特徵劃分
beststump['ineq']=inequal#根據第'it'或者不是'it'進行特徵劃分
bestclassest=predictedvals.copy()
return beststump,minerror,bestclassest
# #進行檢驗
# d=mat(ones((5,1))/5)
# a,b=loadasampldata()
## beststump,minerror,bestclassest=buildstump(a,b,d)
# print(beststump,minerror,bestclassest)
##結果
# # [[0.4]]
# [[1.]
# [1.]
# [1.]
# [1.]
# [1.]]
#datamatrix[:0]<0.9的為-1,所以判斷都為+1,第三和第四個錯誤,0.2*2=0.4
def adaboosttrainds(dataarr,classlabels,numit=40):
""":param dataarr: 資料標籤
:param classlabels: 類別標籤
:param numit: 迭代次數,需要使用者指定
:return:
"""weakclassarr=
m=shape(dataarr)[0]
d=mat(ones((m,1))/m)
aggclassest=mat(zeros((m,1)))
for i in range(numit):
beststump,error,classest=buildstump(dataarr, classlabels, d)
alpha=float((1/2)*log((1-error)/max(error,1e-16)))#根據錯誤率算出每個弱分類器的權重大小,分類效果差的權重佔的小
beststump['alpha']=alpha
c=-1*alpha*mat(classlabels).t
expon=multiply(c,classest)#把估計的標籤與真實的標籤相乘相同為1,不同為-1
d=multiply(d,exp(expon))
d=d/sum(d)
aggclassest+=alpha*classest
aggerrors=multiply(sign(aggclassest)!=mat(classlabels).t,ones((m,1)))
errorrate=aggerrors.sum()/m
if(errorrate==0):
break
return weakclassarr
a,b=loadasampldata()
#print(mat(b).t.shape)
print(adaboosttrainds(a,b,40))
資料探勘之Adaboost學習筆記
所謂 眾人拾柴火焰高 三個臭皮匠抵個諸葛亮 整合學習機的泛化能力一般明顯好於單一的學習器。那麼adaboost演算法就是基於這樣的思想產生的。boosting方法的代表adaboost是乙個以單層決策樹分類器為弱分類器基礎,將他們組合在一起,從而組成乙個高效能的可與svm相提並論的分類器。它的自適應...
資料探勘學習筆記 AdaBoost演算法 一
宣告 這篇筆記是自己對adaboost原理的一些理解,如果有錯,還望指正,俯謝 adaboost演算法,這個演算法思路簡單.adaboost演算法,是一種組合演算法 通過多個弱分類器,組合成乙個強分類器 關於adaboost演算法的流程,簡單的描述,我們以 short introduction to...
Adaboost學習資料
1 adaboost演算法介紹 描述 介紹了主要思想和偽碼 2 adaboost演算法原理和推導 描述 介紹了原理 演算法流程 舉例 誤差界的推導 3 adaboost 從原理到實現 描述 介紹原理 演算法過程 python實現 4 adaboost 演算法 描述 boosting演算法起源和發展歷...