1. 程式人生 > >機器學習實戰——AdaBoost

機器學習實戰——AdaBoost

書籍:《機器學習實戰》中文版
IDE:Spyder

環境:Adaconda3  python3.6

(Spyder相對pycharm來說,比較簡潔,而且對於常用matlab的人,感覺更親切。它可以方便的觀察變數值,檢視執行結果等。但是spyder沒有程式碼摺疊!程式碼提示方面也遠不如pycharm!)

Ensemble方法:集合方法,將弱分類器變成一個強分類器。

可以是不同演算法的整合、同一演算法在不同設定下的整合、資料集不同部分分配給不同分類器之後的整合。

一、基本概念 

1、bagging方法

Bagging即套袋法,其演算法過程如下:

1)從原始樣本集中抽取訓練集。每輪從原始樣本集中使用Bootstraping的方法抽取n個訓練樣本(在訓練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中)。共進行k輪抽取,得到k個訓練集。(k個訓練集之間是相互獨立的)

2)每次使用一個訓練集得到一個模型,k個訓練集共得到k個模型。(注:這裡並沒有具體的分類演算法或迴歸方法,我們可以根據具體問題採用不同的分類或迴歸方法,如決策樹、感知器等)

3)對分類問題:將上步得到的k個模型採用投票的方式得到分類結果;對迴歸問題,計算上述模型的均值作為最後的結果。(所有模型的重要性相同)


2、boosting

不同分類器通過序列訓練獲得,每個新分類器根據已訓練出的分類器的效能來進行訓練。boosting每一輪的訓練集不變,通過集中關注被已有分類器錯分的那些資料(改變樣本權重)來獲得新的分類器。

boosting分類結果是基於所有分類器的加權求和結果的,而bagging中的分類器權重是相等的。

最流行的是AdaBoost(adaptive boosting):訓練資料中的每個樣本被賦予一個權重D。下一次的訓練權重根據上一次的訓練結果進行調整,其中上一次分隊的樣本的權重降低,而上一次分錯的樣本的權重會提高。為了從所有弱分類器中得到最終的分類結果,AdaBoost為每個分類器分配一個權重alpha



3、兩者比較:

https://www.cnblogs.com/liuwu265/p/4690486.html

二、AdaBoost程式碼     弱分類器:單層決策樹

from numpy import *

def loadSimpData():
    datMat = matrix([[ 1. ,  2.1],
        [ 2. ,  1.1],
        [ 1.3,  1. ],
        [ 1. ,  1. ],
        [ 2. ,  1. ]])
    classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]
    return datMat,classLabels
datMat,classLabels = loadSimpData()
#根據設定的閾值,針對給定維,對資料進行分類
def stumpClassify(dataMat,dimen,threshVal,threshIneq):#just classify the data
    retArr = ones((shape(dataMat)[0],1))
    if threshIneq == 'lt':
        retArr[dataMat[:,dimen]<=threshVal] = -1.0
    else:
        retArr[dataMat[:,dimen]>threshVal] = -1.0
    return retArr
# 單節點決策樹,根據adaboost權重D判斷最佳的維度
# 確保標籤是+1和-1
def buildStump(dataArr,classLabels,D):
    dataMat = mat(dataArr)
    labelMat = mat(classLabels).T
    m,n = shape(dataMat)
    numSteps = 10.0;bestStump={};bestClasEst=mat(zeros((m,1)))
    minError = inf #init error sum, to +infinity
    for i in range(n):  #loop over all dimensions
        rangeMin = dataMat[:,i].min();
        rangeMax = dataMat[:,i].max();
        stepSize = (rangeMax-rangeMin)/numSteps
        for j in range(-1,int(numSteps)+1):#loop over all range in current dimension
            for inequal in ['lt','gt']:
                threshVal = rangeMin + float(j) * stepSize
                predictedVals = stumpClassify(dataMat,i,threshVal,inequal)
                errArr = mat(ones((m,1)))
                errArr[predictedVals == labelMat] = 0
                weightedError = D.T * errArr #calc total error multiplied by D
                #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                
#D = mat(ones((5,1))/5)      
#bestStump,minError,bestClasEst=buildStump(datMat,classLabels,D)  

#基於單層決策樹的AdaBoost訓練過程
def adaboostTrainDS(dataMat,classLabels,numIt=40):
    weakClassArr = []
    m = shape(dataMat)[0]
    D = mat(ones((m,1))/m)  #init D to all equal
    aggClassEst = mat(zeros((m,1)))
    for i in range(numIt):
        bestStump,error,classEst = buildStump(dataMat,classLabels,D)  #build Stump
#        print('D:',D.T)
        #calc alpha, throw in max(error,eps) to account for error=0
        alpha = float(0.5*log((1.0-error)/max(error,1e-16))) 
        bestStump['alpha'] = alpha
        weakClassArr.append(bestStump)
#        print ("classEst: ",classEst.T)
        expon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messy
        D = multiply(D,exp(expon))
        D = D/D.sum()
        #calc training error of all classifiers, if this is 0 quit for loop early (use break)
        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)
        if errorRate == 0.0: break
    return weakClassArr
#AdaBoost分類函式
def adaClassify(datToClass,classifierArr):
    dataMatrix = mat(datToClass) 
    m = shape(dataMatrix)[0]
    aggClassEst = mat(zeros((m,1)))
    for i in range(len(classifierArr)):
        classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],\
                                 classifierArr[i]['thresh'],\
                                 classifierArr[i]['ineq']) 
        aggClassEst += classifierArr[i]['alpha']*classEst
        print (aggClassEst)
    return sign(aggClassEst)
#自適應資料載入函式
def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split('\t'))
    dataMat=[];labelMat=[]
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat-1):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

dataArr,labelArr = loadDataSet('horseColicTraining2.txt')
classifierArray = adaboostTrainDS(dataArr,labelArr,10)
testArr,testLabelArr = loadDataSet('horseColicTest2.txt')
errArr = mat(ones((67,1)))
errNum = errArr[predictedVals != mat(testLabelArr).T].sum()


注:

1、主要是權重D和alpha的計算、類別估計累計值

weightedError = D.T * errArr

expon = multiply(-1*alpha*mat(classLabels).T,classEst)

aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))

2、執行問題 ufunc 'multiply' did not contain a loop with signature matching types

原因:labelMat.append(float(curLine[-1]))  中float漏寫。

因為從檔案中讀取的每個資料都是字串即 'XXX'形式,因此需要float()或int()。

相關推薦

機器學習實戰---adaboost

一、介紹 AdaBoost是一種迭代型的演算法,其核心思想是針對同一個訓練集訓練不同的學習演算法,即弱學習演算法,然後將這些弱學習演算法集合起來,構造一個更強的最終學習演算法 adaboost希望在下一輪訓練時被上一個子分類器正確分類的樣本權重和與被錯誤分類的樣本權重和相

基於pyhton3.6-機器學習實戰-AdaBoost程式碼解釋

本人是一名數學系研究生,於2017年底第一次接觸python和機器學習,作為一名新手,歡迎與大家交流。我主要給大家講解程式碼,理論部分給大家推薦3本書:《機器學習實戰中文版》《機器學習》周志華《統計學習方法》李航以上3本書,第一本是基於python2的程式碼實現;剩餘兩本主要

機器學習實戰——AdaBoost

書籍:《機器學習實戰》中文版 IDE:Spyder 環境:Adaconda3  python3.6 (Spyder相對pycharm來說,比較簡潔,而且對於常用matlab的人,感覺更親切。它可以方便的觀察變數值,檢視執行結果等。但是spyder沒有程式碼摺疊!程式碼提

機器學習實戰第7章——利用AdaBoost元算法提高分類性能

nes 重要性 function mine spl 技術 可能 copy elar 將不同的分類器組合起來,這種組合結果被稱為集成方法或元算法(meta-algorithm)。 使用集成方法時會有多種形式:(1)可以是不同算法的集成(2)可以是同一種算法在不同設置下的集成

機器學習實戰(六)AdaBoost元演算法

目錄 0. 前言 1. AdaBoost 2. 單層決策樹 3. 非均衡資料 4. 實戰案例 4.1. 馬病死亡案例 學習完機器學習實戰的AdaBoost元演算法,簡單的做個筆記。文中部分描述屬於個人消化後的理解,僅

機器學習實戰——利用AdaBoost元演算法提高分類效能 實現記錄

問題:TypeError: __new__() takes from 2 to 4 positional arguments but 6 were given def loadSimpData(): datMat = matrix([1. ,2.1],

機器學習實戰筆記6—AdaBoost

注:此係列文章裡的部分演算法和深度學習筆記系列裡的內容有重合的地方,深度學習筆記裡是看教學視訊做的筆記,此處文章是看《機器學習實戰》這本書所做的筆記,雖然演算法相同,但示例程式碼有所不同,多敲一遍沒有壞處,哈哈。(裡面用到的資料集、程式碼可以到網上搜索,很容易找到。)。Python版本3.6

機器學習實戰》第七章----AdaBoost元演算法

元演算法 元演算法是對其他演算法進行組合的一種方法,其背後的思路就是組合多個專家的經驗來得到最終的結論,類似於我們的投票.而提升方法是其中最常用的方法,在分類問題中,它通過改變訓練樣本的權重,學習多個分類器,並將這些這些分類器進行線性組合. 弱分類器和強分類器 關於Ad

機器學習實戰學習筆記(六)之提升和Adaboost(上)基礎理論以及演算法推導

轉載請註明作者和出處:http://blog.csdn.net/john_bh/ CSDN部落格專欄:## Github程式碼獲取:## 執行平臺: Windows Python版本: Python3.6 IDE: Sublime text3

機器學習實戰AdaBoost方法的演算法原理與程式實現

一、引言提升(boosting)方法是一種常用的統計學習方法,應用廣泛且有效,在分類問題中,它通過改變訓練樣本的權重,學習多個分類器,並將這些分類器進行線性組合,提高分類的效能。對於分類問題,給定一個訓練樣本集,比較粗糙的分類規則(弱分類器),要比精確分類規則(強分類器)容易

機器學習實戰系列】讀書筆記之AdaBoost演算法公式推導和例子講解(一)

最近在看整合演算法AdaBoost,推薦先看李航的統計學習方法第8章,然後再看機器學習實戰第7章,李航的書上的公式推導講的很詳細了,但是很多地方對於初學者來說,還是需要時間去理解和消化的。本文將從以下幾個方面來介紹AdaBoost演算法。一、AdaBoost演算法公式推導二、

機器學習實戰筆記7(Adaboost)

1:簡單概念描述        Adaboost是一種弱學習演算法到強學習演算法,這裡的弱和強學習演算法,指的當然都是分類器,首先我們需要簡單介紹幾個概念。 1:弱學習器:在二分情況下弱分類器的錯誤率會低於50%。其實任意的分類器都可以做為弱分類器,比如之前介紹的KNN、決

機器學習實戰----利用AdaBoost元演算法的實現

整理一下寫的非常好的關於AdaBoost演算法的部落格:1.1 基於第一步,因此外層迴圈即為資料集特徵的迴圈;1.1.1 如果是按照第一個特徵來劃分類別,那麼第一個特徵點中存在節點,即樹的左右分支,這個時候怎樣判斷是左還是右呢?1.1.2 首先根據資料大小跟定一個閾值T,這裡

機器學習實戰adaboost

1.概念定義 (1)元演算法(meta-algorithm)/整合方法(ensemble method): 是對其他演算法進行組合的一種方式.有多種整合方式: 不同演算法的整合;同一演算法在不同設定下

py2.7 : 《機器學習實戰Adaboost 2.24號:ROC曲線的繪製和AUC計算函式

前言:可以將不同的分類器組合,這種組合結果被稱為整合方法  、 元演算法 使用:1.不同演算法的整合 2.同一演算法下的不同設定整合 3.不同部分分配給不同分類器的整合 演算法介紹:AdaBoost 優點:泛華錯誤率低,易編碼,可以應用在大部分的分類器上,無引數調整 缺點:

機器學習實戰》第七章學習筆記(AdaBoost

一、整合學習整合學習(ensemble learning)通過構建並結合多個學習器來完成學習任務,有時也被稱為多分類器系統(multi-classifier system)、基於委員會的學習(committee-based learning)等。整合學習將多個學習器進行結合,

機器學習實戰之PCA

數據預處理 每一個 numpy 矩陣 分享 topn 文本 bsp 偽代碼 一,引言   降維是對數據高維度特征的一種預處理方法。降維是將高維度的數據保留下最重要的一些特征,去除噪聲和不重要的特征,從而實現提升數據處理速度的目的。在實際的生產和應用中,降維在一定的信息損失範

[機器學習實戰] Logistic回歸

.... log 運算 blog 死亡率 在線 實戰 批處理 參數更新 1. Logistic回歸:   1)優點:計算代價不高,易於理解和實現;   2)缺點:容易欠擬合,分類精度可能不高;   3)適用數據類型:數值型和標稱型數據; 2. 分類思想:   根據現有數

python機器學習實戰(三)

方法 baidu classes getter 全部 ken array數組 app 產生 python機器學習實戰(三) 版權聲明:本文為博主原創文章,轉載請指明轉載地址 www.cnblogs.com/fydeblog/p/7277205.html 前言 這篇博客是

決策樹代碼《機器學習實戰

必須 nbsp getter 什麽 key 畫圖 不支持 spl name 22:45:17 2017-08-09 KNN算法簡單有效,可以解決很多分類問題。但是無法給出數據的含義,就是一頓計算向量距離,然後分類。 決策樹就可以解決這個問題,分類之後能夠知道是問什麽被劃分到