整合學習分為兩類:
個體學習器間存在強依賴關係,必須序列生成的序列方法: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...