今天學習的機器學習演算法不是乙個單獨的演算法,我們稱之為元演算法或整合演算法(ensemble)。其實就是對其他演算法進行組合的一種方式。俗話說的好:「三個臭皮匠,賽過諸葛亮」。整合演算法有多種形式:對同一資料集,使用多個演算法,通過投票或者平均等方法獲得最後的**模型;同一演算法在不同設定下的整合;同一演算法在多個不同例項下的整合。本文著重講解最後一種整合演算法。
如果訓練集有n個樣本,我們隨機抽取s次,每次有放回的獲取m個樣本,用某個單獨的演算法對s個資料集(每個資料集有m個樣本)進行訓練,這樣就可以獲得s個分類器。最後通過投票箱來獲取最後的結果(少數服從多數的原則)。這就是bagging方法的核心思想,如圖所示。
bagging中有個常用的方法,叫隨機森林(random forest),該演算法基於決策樹,不僅對資料隨機化,也對特徵隨機化。
每棵樹無限生長,最後依舊通過投票箱來獲取最後的結果。
boosting方法在模型選擇方面和bagging一樣:選擇單個機器學習演算法。但boosting方法是先在原資料集中訓練乙個分類器,然後將前乙個分類器沒能完美分類的資料重新賦權重(weight),用新的權重資料再訓練出乙個分類器,以此迴圈,最終的分類結果由加權投票決定。
所以:boosting是序列演算法(必須依賴上乙個分類器),而bagging是並行演算法(可以同時進行);boosting的分類器權重不同,bagging相同(下文中詳細講解)。
boosting也有很多版本,本文只講解adaboost(自適應boosting)方法的原理和**實踐。
如圖所示,為adaboost方法的原理示意圖。
資料**
資料通過**建立:
from numpy import *
def loadsimpdata():
dataarr = array([[1., 2.1], [2., 1.1], [1.3, 1.], [1., 1.], [2., 1.]])
labelarr = [1.0, 1.0, -1.0, -1.0, 1.0]
return dataarr, labelarr
弱決策樹
該資料有兩個特徵,我們只用乙個特徵進行分類(弱分類器),然後選擇精度最高的分類器。
def stumpclassify(datamatrix, dimen, threshval, threshineq):
retarray = ones((shape(datamatrix)[0],1))
if threshineq == 'lt':
retarray[datamatrix[:,dimen] <= threshval] = -1.0
else:
retarray[datamatrix[:,dimen] > threshval] = -1.0
return retarray
def buildstump(dataarr, labelarr, d):
datamat = mat(dataarr)
labelmat = mat(labelarr).t
m, n = shape(datamat)
numsteps = 10.0
beststump = {}
bestclasest = mat(zeros((m, 1)))
minerror = inf
for i in range(n):
rangemin = datamat[:, i].min()
rangemax = datamat[:, i].max()
stepsize = (rangemax-rangemin)/numsteps
for j in range(-1, int(numsteps)+1):
for inequal in ['lt', 'gt']:
threshval = (rangemin + float(j) * stepsize)
predictedvals = stumpclassify(datamat, i, threshval, inequal)
# print predictedvals
errarr = mat(ones((m, 1)))
errarr[predictedvals == labelmat] = 0
weightederror = d.t*errarr
# 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)
aggclassest = mat(zeros((m,1)))
for i in range(numit):
beststump,error,classest = buildstump(dataarr, classlabels, d)
print('d:',d.t)
alpha = float(0.5*log((1.0-error)/max(error,1e-16)))
beststump['alpha'] = alpha
print('classest:',classest.t)
expon = multiply(-1*alpha*mat(classlabels).t,classest)
d = multiply(d, exp(expon))
d = d/d.sum()
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,'\n')
if errorrate == 0:break
return weakclassarr
機器學習實戰之adaboost
adaboost,是英文 adaptive boosting 自適應增強 的縮寫。它的自適應在於 前乙個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下乙個基本分類器。同時,在每一輪中加入乙個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數。1.演算法流程 ...
機器學習實戰 adaboost
adaboost基於錯誤提公升分類器效能 def stumpclassify datamatrix,dimen,threshval,threshineq 根據閾值分類 retarray ones shape datamatrix 0 1 if threshineq lt retarray datam...
機器學習之AdaBoost
機器學習之adaboost adaboost是一種組合學習的提公升演算法,能將多個弱學習演算法 甚至只比隨機猜測好一點 組合起來,構成乙個足夠強大的學習模型。組合學習是將多個假說組合起來,並整合它們的 比如對於乙個問題,我們可以生成20棵決策樹,讓它們對新樣例的分類進行 最後通過投票決定最終的 這樣...