機器學習實戰筆記 整合學習

2021-08-20 11:29:53 字數 4968 閱讀 7632

整合學習分為兩類:

個體學習器間存在強依賴關係,必須序列生成的序列方法:boosting

個體學習器之間不存在強一賴關係,可同時生成的並行方法:bagging和隨機森林

boosting:

adaboost演算法:

採用指數損失函式,yi∈,f是真實函式。

adaboost的一般流程:

收集資料;

準備資料:依賴於所使用的弱分類器型別,這裡我們採用的是單層決策樹

分析資料;

訓練演算法:分類器將多次在同一資料集上訓練弱分類器

測試演算法:計算分類的錯誤率

使用演算法;

基於單層決策樹構建弱分類器:

單層決策樹:簡單的決策樹,僅基於單個特徵來做決策,只有一側**過程。故一般性資料集是無法通過 乙個單層決策樹正確分類的,必須使用多個單層決策樹。

首先構建如下的簡單資料集

"""構建簡單的資料集"""

def loadsimpdata():

datmat=matrix(

[[1.0,2.1],

[2.0,1.1],

[1.3,1.0],

[1.0,1.0],

[2.0,1.0]]

)classlabels=[1.0,1.0,-1.0,-1.0,1.0]

return datmat,classlabels

通過以下函式建立單層決策樹:

偽**如下:

將minerror設定為無窮大

對資料集中每乙個特徵:

對每個步長:

對每個不等號:

建立一棵單層決策樹並利用加權資料集對其進行測試

if 錯誤率threshval] = -1.0 #>閾值的置為-1

return retarray

"""遍歷stumpclassify的所有可能輸入值,並找到資料集上最佳的單層決策樹"""

def buildstump(dataarr,classlabels,d):

datamatrix=mat(dataarr)

labelmat=mat(classlabels).t

m,n=shape(datamatrix) #m個樣本,n個特徵

numsteps=10.0 #用於在特徵的所有可能值上進行遍歷

beststump={} #定義乙個字典,用於儲存給定權重向量d時所得到的的最佳單層決策樹的相關資訊

bestclasest=mat(zeros((m,1)))

minerror=inf #最小錯誤率,初始化為無窮大

for i in range(n): #在所有特徵上遍歷(第一次迴圈),即按照第i個特徵來劃分類別

rangemin=datamatrix[:,i].min() #找出所有樣本中在特徵i上的最小值

rangemax=datamatrix[:,i].max() #找出所有樣本中在特徵i上的最大值

stepsize=(rangemax-rangemin)/numsteps #確定步長(步長是用於比較特徵值和閾值的)

for j in range(-1,int(numsteps)+1): #在特徵i的所有可能取值上遍歷,每次講特徵值加j*stepsize的大小(第二層迴圈)

for inequal in ['lt','gt']:

threshval=(rangemin+float(j)*stepsize) #根據步長設定閾值

predictedvals=stumpclassify(datamatrix,i,threshval,inequal) #對樣本進行**分類

errarr=mat(ones((m,1))) #構建乙個錯誤統計列向量

errarr[predictedvals==labelmat]=0 #如果**和真實標籤一致置為0,不一致置為1

weightederror=d.t*errarr #根據錯誤向量*權重向量得到數值weightederror

if weightederror測試輸出如下:

完整的adaboost學習器構建:

利用上述**構建的單層決策樹來實現adaboost學習器,偽**如下:

對每次迭代:

利用buildstump()找到最佳的單層決策樹

將最佳單層決策樹加入到單層決策樹陣列

計算alpha

計算新的權重向量d

更新累計類別估計值

如果錯誤率等於0.0,退出迴圈

其中:

d:訓練資料中的每個樣本擁有乙個權重,這些權重構成向量d,初始時所有權重相等,分類錯的樣本下一次分類時權重增加,分類正確的權重在下次分類時會降低

adaboost為每個分類器分配乙個權重alpha,alpha基於每個弱分類器的錯誤率進行計算:    

錯誤率ε=為正確分類的樣本數目/所有樣本數目

alpha=1/2ln(1-ε/ε)

某個樣本被正確分類,該樣本權重更改為:di(t+1)=di(t)*e^-alpha/sum(d)

某個樣本被錯誤分類,該樣本權重更改為:di(t+1)=di(t)*e^alpha/sum(d)

計算出新的d之後,adaboost開始進入下一輪迭代。

adaboost的訓練就是訓練出若干弱分類器以及這些弱分類器相應的權重。               

"""基於單層決策樹的adaboost訓練過程"""

def adaboosttrainds(dataarr,classlabels,numit=40): #資料集,類別標籤以及迭代次數(若小於迭代次數時錯誤率已經為0則直接退出)

weakclassarr= #弱分類器列表

m=shape(dataarr)[0] #m為樣本數

d=mat(ones((m,1))/m) #初始化每個樣本的權值,初始化所有權重均為1/m

aggclassest=mat(zeros((m,1))) #向量aggclassest,記錄每個資料點的類別估計累計值

for i in range(numit): #迭代

beststump,error,classest=buildstump(dataarr,classlabels,d) #建立乙個當前效能最優的單層決策樹

print("各樣本權值向量d為:{}".format(d.t)) #列印此時的各樣本權重

alpha=float(0.5*log((1.0-error)/max(error,1e-16))) #計算alpha

beststump['alpha']=alpha #將測試的alpha加入單層決策樹資訊中

print("分類**結果向量classest:{}".format(classest.t))

#以下三步均為更新d的步驟

expon=multiply(-1*alpha*mat(classlabels).t,classest)

d=multiply(d,exp(expon))

d=d/d.sum()

aggclassest+=alpha*classest

print("aggclassest:{}".format(aggclassest.t))

aggerrors=multiply(sign(aggclassest)!=mat(classlabels).t,ones((m,1))) #通過aggclassest來計算總的錯誤率

errorrate=aggerrors.sum()/m

print("總錯誤率:{}".format(errorrate))

if errorrate==0.0: #當總的錯誤率為0.0時退出迭代

break

return weakclassarr

根據弱分類器和權重進行樣本分類:

"""基於adaboost的分類函式"""

def adaclassify(dattoclass,classifierarr): #dattoclass為待分類樣本,classifierarr是訓練出來的弱分類器集合

datamatrix=mat(dattoclass)

m=shape(datamatrix)[0] #要分類的樣本數

aggclassest=mat(zeros((m,1)))

for i in range(len(classifierarr)): #遍歷所有的弱分類器,通過stumpclassify對每個分類器得到乙個類別的估計值

classest=stumpclassify(datamatrix,classifierarr[i]['dim'],classifierarr[i]['thresh'],classifierarr[i]['ineq'])

aggclassest+=classifierarr[i]['alpha']*classest #然後得到各弱分類器的加權和,就是**值

print(aggclassest)

return sign(aggclassest)

樣本[0,0]和[5,5]分類測試結果如下:

機器學習筆記 整合學習

1 什麼時候用整合學習?整合學習有利於減少模型方差,因此當模型複雜度複雜度太高時可以用整合學習方法 參加kaggle等比賽的時候 2 bagging和boosting的基學習器有一樣的特點?bagging的基學習器更強一些,它們學習的物件都是目標任務,最終的 模型是直接拿子模型的決策結果投票或者做平...

《機器學習實戰》學習筆記

很久沒寫過部落格了,一重開就給自己挖了這麼乙個大坑 最近一段時間看了 機器學習實戰 這本書,感覺寫得不錯,認真看了看。關於這本書的書評及購買事宜請移步豆瓣 京東 亞馬遜等 這裡不多說。不過有一點,感覺這本書有個很好的地方是給出了各個演算法的python實現 和講解,要求不高的話可以拿來用了 懶 在這...

《機器學習實戰》學習筆記

目錄 第2章 k 近鄰演算法 第3章 決策樹 第4章 基於概率論的分類方法 樸素貝葉斯 第5章 logistic回歸 第7章 利用adaboost元演算法提高分類效能 第8章 數值型資料 回歸 1.python console匯入knn.py檔案 import knn1.reload的使用方法 fr...