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

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

本人是一名數學系研究生,於2017年底第一次接觸python和機器學習,作為一名新手,歡迎與大家交流。

我主要給大家講解程式碼,理論部分給大家推薦3本書:

《機器學習實戰中文版》

《機器學習》周志華

《統計學習方法》李航

以上3本書,第一本是基於python2的程式碼實現;剩餘兩本主要作為第一本書理論省略部分的補充,理論大部分都講得很細。

部落格上關於機器學習實戰理論解釋都很多,參差不齊,好作品也大都借鑑了以上3本書,網上有很多電子版的書。

與其看看一些沒用的部落格,真心不如以上3本書有收穫。

說實話,學習一定要靜下心來,切忌浮躁。不懂可以每天看一點,每天你懂一點,天天積累就多了。

作業系統:windows8.1

python版本:python3.6

執行環境:spyder(anaconda)

# -*- coding: utf-8 -*-
"""
Created on Wed Mar  7 15:53:24 2018

@author: Loulch C.C
"""

from numpy import *
import matplotlib.pyplot as plt

#建立單層決策樹的資料集
def loadSimpData():
    datMat = matrix([[ 1. ,  2.1],
        [ 1.5,  1.6],
        [ 1.3,  1. ],
        [ 1. ,  1. ],
        [ 2. ,  1. ]])
    classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]
    return datMat,classLabels

#資料視覺化
def showDataSet(dataMat, labelMat):
    data_plus = []                                  #正樣本
    data_minus = []                                 #負樣本
    for i in range(len(dataMat)):
        if labelMat[i] > 0:
            data_plus.append(dataMat[i])
        else:
            data_minus.append(dataMat[i])
    data_plus_np = array(data_plus)                        #轉換為numpy矩陣
    data_minus_np = array(data_minus)                      #轉換為numpy矩陣
    plt.scatter(data_plus_np.T[0], data_plus_np.T[1])      #正樣本散點圖
    plt.scatter(data_minus_np.T[0],data_minus_np.T[1])     #負樣本散點圖
    plt.show()
"""
if __name__ == '__main__':
    dataArr,classLabels = loadSimpData()
    showDataSet(dataArr,classLabels)
#"""

#單層決策樹生成函式
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
    """
    函式說明:單層決策樹分類函式
    Parameters:
        dataMatrix - 資料矩陣
        dimen - 第dimen列,也就是第幾個特徵
        threshVal - 閾值
        threshIneq - 標誌,不等號
    Returns:
        retArray - 分類結果
    """
    retArray = ones((shape(dataMatrix)[0],1))                #初始化retArray為1
    if threshIneq == 'lt':                                   #lt:less than
        retArray[dataMatrix[:,dimen] <= threshVal] = -1.0   
        #通過陣列過濾,如果小於等於閾值,則賦值為-1
    else:
        retArray[dataMatrix[:,dimen] > threshVal] = -1.0    
        #通過陣列過濾,如果大於閾值,則賦值為-1
    return retArray

def buildStump(dataArr,classLabels,D):
    """
    函式說明:找到資料集上"最佳"的單層決策樹
    Parameters:
        dataArr - 資料矩陣
        classLabels - 資料標籤
        D - 樣本權重
    Returns:
        bestStump - 最佳單層決策樹資訊
        minError - 最小誤差
        bestClasEst - 最佳的分類結果
    """
    dataMatrix = mat(dataArr); labelMat = mat(classLabels).T
    m,n = shape(dataMatrix)
    numSteps = 10.0; bestStump = {}; bestClasEst =mat(zeros((m,1)))
    minError = float('inf')                  #最小誤差初始化為正無窮大
    for i in range(n):                       #第一層迴圈遍歷資料集上所有特徵
        rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max() 
        #找到特徵中最小的值和最大值
        stepSize = (rangeMax - rangeMin) / numSteps         #計算步長
        for j in range(-1, int(numSteps) + 1):  #用來j控制閾值threshVal,然後遍歷                        
            for inequal in ['lt', 'gt']:  
                #遍歷大於和小於。lt:less than,gt:greater than
                threshVal = (rangeMin + float(j) * stepSize)#計算閾值
                predictedVals = stumpClassify(dataMatrix, i, threshVal, inequal)
                #計算分類結果
                errArr = mat(ones((m,1)))                #初始化誤差矩陣
                errArr[predictedVals == labelMat] = 0        
                #通過陣列過濾,分類正確的,賦值為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
"""
if __name__ == '__main__':
    dataArr,classLabels = loadSimpData()
    D = mat(ones((5, 1)) / 5)
    bestStump,minError,bestClasEst = buildStump(dataArr,classLabels,D)
    print('bestStump:\n', bestStump)
    print('minError:\n', minError)
    print('bestClasEst:\n', bestClasEst)
#"""
#基於單層決策樹的AdaBoost訓練過程
def adaBoostTrainDS(dataArr, classLabels, numIt = 40):   #numIt迭代次數
    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))) 
        #計算弱學習演算法權重alpha,使error不等於0,因為分母不能為0
        bestStump['alpha'] = alpha                       #儲存弱學習演算法權重
        weakClassArr.append(bestStump)                   #儲存單層決策樹
        #print("classEst: ", classEst.T)
        expon = multiply(-1 * alpha *mat(classLabels).T, classEst)#計算e的指數項
        D = multiply(D, exp(expon))                                      
        D = D / D.sum()                           #根據樣本權重公式,更新樣本權重
        aggClassEst += alpha * classEst        
        #alpha是每個弱分類器的權重值,每個弱分類器給出預測值都會與相應的alpha進行加權,最後輸出值                         
        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                   #誤差為0,退出迴圈
    return weakClassArr, aggClassEst
"""
if __name__ == '__main__':
    dataArr,classLabels = loadSimpData()
    weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, classLabels)
    print(weakClassArr)
    print(aggClassEst)
#"""

#測試演算法:基於AdaBoost的分類


def adaClassify(datToClass,classifierArr):
    """
    函式說明:AdaBoost分類函式
    Parameters:
        datToClass - 待分類樣例
        classifierArr - 訓練好的分類器
    Returns:
        分類結果
    """
    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)
"""
if __name__ == '__main__':
    dataArr,classLabels = loadSimpData()
    weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, classLabels)
    print(adaClassify([[0,0],[5,5]], weakClassArr))
#"""  
    
#示例:在一個難資料集——馬疝病資料集上應用AdaBoost
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
"""
if __name__ == '__main__':
    dataArr, LabelArr = loadDataSet('horseColicTraining2.txt')
    weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, LabelArr)
    testArr, testLabelArr = loadDataSet('horseColicTest2.txt')
    print(weakClassArr)
    predictions = adaClassify(dataArr, weakClassArr)
    errArr = mat(ones((len(dataArr), 1)))
    print('訓練集的錯誤率:%.3f%%' % float(errArr[predictions !=\
                                          mat(LabelArr).T].sum() / len(dataArr) * 100))
    predictions = adaClassify(testArr, weakClassArr)
    errArr = mat(ones((len(testArr), 1)))
    print('測試集的錯誤率:%.3f%%' % float(errArr[predictions !=\
                                          mat(testLabelArr).T].sum() / len(testArr) * 100))
"""



相關推薦

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

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

機器學習實戰---adaboost

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

python3實現K-鄰近演算法(機器學習實戰程式碼)

from numpy import * import operator #inx:待預測資料 dateSet:訓練樣本集 labels:訓練樣本的標籤 k:k鄰近演算法的k值 def classify0(inX, dateSet, labels, k):

機器學習:Peter Harrington《機器學習實戰程式碼jupyter notebook整理

個人使用jupyter notebook整理的peter的《機器學習實戰》程式碼,使其更有層次感,更加連貫,也根據自己的程式碼習慣,加了一些自己的修改,以及註釋。 既是為了給自己做一個筆記,如果有人需要,也是希望大家一起學習。 adaBoost資料夾:A

機器學習實戰——AdaBoost

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

機器學習實戰筆記6AdaBoost

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

機器學習實戰—第4章:基於概率論的分類方法:樸素貝葉斯】程式碼報錯(python3)

1、報錯:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xae in position 199: illegal multibyte sequence 原因:這是檔案編碼的問題,檔案中有非法的多位元組字元。 解決辦法:開啟Ch04\

機器學習實戰》原書資料與程式碼基於Python3)彙總

這次做的系列是《機器學習實戰》,原書比較久遠了,且程式碼和練習都是基於Python2,我個人是升級到了Python3,因此使用最新的版本來寫這些習題。具體2和3其實在基礎語法上並沒有太多差別,一些高階特性比如裝飾器工廠,協程,IO等Python3的新用法,一般機器學習也用不上

機器學習實戰》第6章支援向量機(程式碼)

'''Created on Nov 4, 2010Chapter 5 source file for Machine Learing in Action@author: Peter'''from numpy import *from time import sleepdef

讀書筆記:機器學習實戰(5)——章6的支援向量機程式碼和個人理解與註釋

時隔好久,前幾章部落格是去年看的時候寫的,後來只看書沒有繼續寫,再後來忙著專案,連書都很少看了。然後是忙完專案後的空白期的瘋狂看書,看了很多資料結構演算法,設計模式,程式碼整潔,專案可重構方面的書。年後重新把《機器學習實戰》後面的章節讀完,現在開始整理筆記。

大數據-基於Spark的機器學習-智能客戶系統項目實戰

spark大數據-基於Spark的機器學習-智能客戶系統項目實戰 網盤地址:https://pan.baidu.com/s/19-U_XwIUZUENNgmz6VysMQ 密碼: j288 備用地址(騰訊微雲):https://share.weiyun.com/90d4d9196a9d86c74aabe8df

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

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

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

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

分享《機器學習實戰基於Scikit-Learn和TensorFlow》高清中英文PDF+原始碼

下載:https://pan.baidu.com/s/1kNN4tDt58ckFoD_OWH5sGw 更多資料分享:http://blog.51cto.com/3215120 《機器學習實戰:基於Scikit-Learn和TensorFlow》高清中文版PDF+高清英文版PDF+原始碼 高清中文版PDF

分享《機器學習實戰基於Scikit-Learn和TensorFlow》高清中英文PDF+源代碼

ESS alt mark 構建 image 機器學習實戰 dff com 化學 下載:https://pan.baidu.com/s/1kNN4tDt58ckFoD_OWH5sGw 更多資料分享:http://blog.51cto.com/3215120 《機器學習實戰:基

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

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

機器學習實戰書籍和程式碼分享 | 【PCA簡介】

開頭先上圖 機器學習是人工智慧研究領域中的一個極其重要的方向。在現今大資料時代的背景下捕獲資料並從中萃取有價值的資訊或模式使得這一過去為分析師與數學家所專屬的研究領域越來越為人們矚目。 本書第一部分主要介紹機器學習基礎,以及如何利用演算法進行分類,並逐步介紹了多種經典的監督學習演

C++單刷《機器學習實戰》——kNN演算法完整程式碼

#include <iostream> #include <cmath> #include<map> #include<string> #include<sstream> #include<fstream> #include&l

分享《機器學習實戰基於Scikit-Learn和TensorFlow》+PDF+Aurelien

ext https oss 模型 img kit 復制 mage 更多 下載:https://pan.baidu.com/s/127EzxtY9zdBU2vOfxEgIjQ 更多資料分享:http://blog.51cto.com/14087171 《機器學習實戰:基於Sc

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

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