資料探勘 Adaboost

2021-10-07 00:07:49 字數 3577 閱讀 6079

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演算法起源和發展歷...