99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀簡單易學的機器學習算法—AdaBoost
簡單易學的機器學習算法—AdaBoost
2017-03-28
收藏

簡單易學的機器學習算法—AdaBoost

一、集成方法(Ensemble Method)

集成方法主要包括Bagging和Boosting兩種方法,隨機森林算法是基于Bagging思想的機器學習算法,在Bagging方法中,主要通過對訓練數據集進行隨機采樣,以重新組合成不同的數據集,利用弱學習算法對不同的新數據集進行學習,得到一系列的預測結果,對這些預測結果做平均或者投票做出最終的預測。AdaBoost算法和GBDT(Gradient Boost Decision Tree,梯度提升決策樹)算法是基于Boosting思想的機器學習算法。在Boosting思想中是通過對樣本進行不同的賦值,對錯誤學習的樣本的權重設置的較大,這樣,在后續(xù)的學習中集中處理難學的樣本,最終得到一系列的預測結果,每個預測結果有一個權重,較大的權重表示該預測效果較好,詳細的思想可見博文“簡單易學的機器學習算法——集成方法(Ensemble Method)”。

二、AdaBoost算法思想

AdaBoost算法是基于Boosting思想的機器學習算法,其中AdaBoost是Adaptive Boosting的縮寫,AdaBoost是一種迭代型的算法,其核心思想是針對同一個訓練集訓練不同的學習算法,即弱學習算法,然后將這些弱學習算法集合起來,構造一個更強的最終學習算法。
為了構造出一個強的學習算法,首先需要選定一個弱學習算法,并利用同一個訓練集不斷訓練弱學習算法,以提升弱學習算法的性能。在AdaBoost算法中,有兩個權重,第一個數訓練集中每個樣本有一個權重,稱為樣本權重,用向量D表示;另一個是每一個弱學習算法具有一個權重,用向量A表示。假設有N個樣本的訓練集,初始時,設定每個樣本的權重是相等的,即,利用第一個弱學習算法對其進行學習,學習完成后進行錯誤率的統(tǒng)計:

其中,表示被錯誤分類的樣本數目,表示所有樣本的數目。這樣便可以利用錯誤率計算弱學習算法的權重

在第一次學習完成后,需要重新調整樣本的權重,以使得在第一分類中被錯分的樣本的權重,使得在接下來的學習中可以重點對其進行學習:

其中,表示對第個樣本訓練正確,表示對第個樣本訓練錯誤。是一個歸一化因子:

這樣進行第二次的學習,當學習t輪后,得到了t個弱學習算法及其權重。對新的分類數據,分別計算t個弱分類器的輸出,最終的AdaBoost算法的輸出結果為:

其中,是符號函數。具體過程可見下圖所示:

(圖片來自參考文件1)
三、AdaBoost算法流程

上述為AdaBoost的基本原理,下面給出AdaBoost算法的流程:

(來自參考文獻2)

四、實際的例子

AdaBoost算法是一種具有很高精度的分類器,其實AdaBoost算法提供的是一種框架,在這種框架下,我們可以使用不同的弱分類器,通過AdaBoost框架構建出強分類器。下面我們使用單層決策樹構建一個分類器處理如下的分類問題:

決策樹算法主要有ID3,C4.5和CART,其中ID3和C4.5主要用于分類,CART可以解決回歸問題。ID3算法可見博文“簡單易學的機器學習算法——決策樹之ID3算法”,CART算法可見博文“簡單易學的機器學習算法——CART之回歸樹”。對于單層決策樹是無法求解上面這樣的問題的。
Python代碼

python] view plain copy
#coding:UTF-8  
'''''
Created on 2015年6月15日
 
@author: zhaozhiyong
 
'''  
 
from numpy import *  
 
def loadSimpleData():  
    datMat = mat([[1., 2.1],  
                  [2., 1.1],  
                  [1.3, 1.],  
                  [1., 1.],  
                  [2., 1.]])  
    classLabels = mat([1.0, 1.0, -1.0, -1.0, 1.0])  
    return datMat, classLabels  
 
def singleStumpClassipy(dataMat, dim, threshold, thresholdIneq):  
    classMat = ones((shape(dataMat)[0], 1))  
    #根據thresholdIneq劃分出不同的類,在'-1'和'1'之間切換  
    if thresholdIneq == 'left':#在threshold左側的為'-1'  
        classMat[dataMat[:, dim] <= threshold] = -1.0  
    else:  
        classMat[dataMat[:, dim] > threshold] = -1.0  
      
    return classMat  
 
def singleStump(dataArr, classLabels, D):  
    dataMat = mat(dataArr)  
    labelMat = mat(classLabels).T  
    m, n = shape(dataMat)  
    numSteps = 10.0  
    bestStump = {}  
    bestClasEst = zeros((m, 1))  
    minError = inf  
    for i in xrange(n):#對每一個特征  
        #取第i列特征的最小值和最大值,以確定步長  
        rangeMin = dataMat[:, i].min()  
        rangeMax = dataMat[:, i].max()  
        stepSize = (rangeMax - rangeMin) / numSteps  
        for j in xrange(-1, int(numSteps) + 1):  
            #不確定是哪個屬于類'-1',哪個屬于類'1',分兩種情況  
            for inequal in ['left', 'right']:  
                threshold = rangeMin + j * stepSize#得到每個劃分的閾值  
                predictionClass = singleStumpClassipy(dataMat, i, threshold, inequal)  
                errorMat = ones((m, 1))  
                errorMat[predictionClass == labelMat] = 0  
                weightedError = D.T * errorMat#D是每個樣本的權重  
                if weightedError < minError:  
                    minError = weightedError  
                    bestClasEst = predictionClass.copy()  
                    bestStump['dim'] = i  
                    bestStump['threshold'] = threshold  
                    bestStump['inequal'] = inequal  
      
    return bestStump, minError, bestClasEst  
 
def adaBoostTrain(dataArr, classLabels, G):  
    weakClassArr = []  
    m = shape(dataArr)[0]#樣本個數  
    #初始化D,即每個樣本的權重  
    D = mat(ones((m, 1)) / m)  
    aggClasEst = mat(zeros((m, 1)))  
      
    for i in xrange(G):#G表示的是迭代次數  
        bestStump, minError, bestClasEst = singleStump(dataArr, classLabels, D)  
        print 'D:', D.T  
        #計算分類器的權重  
        alpha = float(0.5 * log((1.0 - minError) / max(minError, 1e-16)))  
        bestStump['alpha'] = alpha  
        weakClassArr.append(bestStump)  
        print 'bestClasEst:', bestClasEst.T  
          
        #重新計算每個樣本的權重D  
        expon = multiply(-1 * alpha * mat(classLabels).T, bestClasEst)  
        D = multiply(D, exp(expon))  
        D = D / D.sum()  
          
        aggClasEst += alpha * bestClasEst  
        print 'aggClasEst:', aggClasEst  
        aggErrors = multiply(sign(aggClasEst) != mat(classLabels).T, ones((m, 1)))  
        errorRate = aggErrors.sum() / m  
        print 'total error:', errorRate  
        if errorRate == 0.0:  
            break  
    return weakClassArr  
 
def adaBoostClassify(testData, weakClassify):  
    dataMat = mat(testData)  
    m = shape(dataMat)[0]  
    aggClassEst = mat(zeros((m, 1)))  
    for i in xrange(len(weakClassify)):#weakClassify是一個列表  
        classEst = singleStumpClassipy(dataMat, weakClassify[i]['dim'], weakClassify[i]['threshold'], weakClassify[i]['inequal'])  
        aggClassEst += weakClassify[i]['alpha'] * classEst  
        print aggClassEst  
    return sign(aggClassEst)  
              
if __name__ == '__main__':  
    datMat, classLabels = loadSimpleData()  
    weakClassArr = adaBoostTrain(datMat, classLabels, 30)  
    print "weakClassArr:", weakClassArr  
    #test  
    result = adaBoostClassify([1, 1], weakClassArr)  
    print result  


最終的決策樹序列:
weakClassArr: [{'threshold': 1.3, 'dim': 0, 'inequal': 'left', 'alpha': 0.6931471805599453}, {'threshold': 1.0, 'dim': 1, 'inequal': 'left', 'alpha': 0.9729550745276565}, {'threshold': 0.90000000000000002, 'dim': 0, 'inequal': 'left', 'alpha': 0.8958797346140273}]


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數1:配置參數 // 參數2:回調,回調的第一個參數驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }