日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

發(fā)布時(shí)間:2024/6/1 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎大家來(lái)到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學(xué)習(xí)和玩耍,看看Python這個(gè)有趣的世界。所有文章都將結(jié)合案例、代碼和作者的經(jīng)驗(yàn)講解,真心想把自己近十年的編程經(jīng)驗(yàn)分享給大家,希望對(duì)您有所幫助,文章中不足之處也請(qǐng)海涵。Python系列整體框架包括基礎(chǔ)語(yǔ)法10篇、網(wǎng)絡(luò)爬蟲30篇、可視化分析10篇、機(jī)器學(xué)習(xí)20篇、大數(shù)據(jù)分析20篇、圖像識(shí)別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關(guān)注、點(diǎn)贊和轉(zhuǎn)發(fā)就是對(duì)秀璋最大的支持,知識(shí)無(wú)價(jià)人有情,希望我們都能在人生路上開心快樂(lè)、共同成長(zhǎng)。

前一篇文章講述了聚類算法的原理知識(shí)級(jí)案例,包括K-Means聚類、BIRCH算法、PCA降維聚類、均值漂移聚類、文本聚類等。。本文將詳細(xì)講解分類算法的原理知識(shí)級(jí)案例,包括決策樹、KNN、SVM,并通過(guò)詳細(xì)的分類對(duì)比實(shí)驗(yàn)和可視化邊界分析與大家總結(jié)。四萬(wàn)字基礎(chǔ)文章,希望對(duì)您有所幫助。

文章目錄

  • 一.分類
    • 1.分類模型
    • 2.常見分類算法
    • 3.回歸、聚類和分類的區(qū)別
    • 4.性能評(píng)估
  • 二.決策樹
    • 1.算法實(shí)例描述
    • 2.DTC算法
    • 3.決策樹分析鳶尾花
    • 4.數(shù)據(jù)集劃分及分類評(píng)估
    • 5.區(qū)域劃分對(duì)比
  • 三.KNN分類算法
    • 1.算法實(shí)例描述
    • 2.KNeighborsClassifier
    • 3.KNN分析紅酒類型
  • 四.SVM分類算法
    • 1.SVM基礎(chǔ)知識(shí)
    • 2.SVM分析紅酒數(shù)據(jù)
    • 3.優(yōu)化SVM分析紅酒數(shù)據(jù)集
  • 五.各模型分類對(duì)比實(shí)驗(yàn)
    • 1.決策樹
    • 2.KNN
    • 3.SVM
    • 4.邏輯回歸
    • 5.樸素貝葉斯
    • 6.隨機(jī)森林
    • 7.AdaBoost
    • 8.GradientBoosting
    • 9.實(shí)驗(yàn)結(jié)果對(duì)比
  • 六.本章小結(jié)

下載地址:

  • https://github.com/eastmountyxz/Python-zero2one

前文賞析:

第一部分 基礎(chǔ)語(yǔ)法

  • [Python從零到壹] 一.為什么我們要學(xué)Python及基礎(chǔ)語(yǔ)法詳解
  • [Python從零到壹] 二.語(yǔ)法基礎(chǔ)之條件語(yǔ)句、循環(huán)語(yǔ)句和函數(shù)
  • [Python從零到壹] 三.語(yǔ)法基礎(chǔ)之文件操作、CSV文件讀寫及面向?qū)ο?/li>

第二部分 網(wǎng)絡(luò)爬蟲

  • [Python從零到壹] 四.網(wǎng)絡(luò)爬蟲之入門基礎(chǔ)及正則表達(dá)式抓取博客案例
  • [Python從零到壹] 五.網(wǎng)絡(luò)爬蟲之BeautifulSoup基礎(chǔ)語(yǔ)法萬(wàn)字詳解
  • [Python從零到壹] 六.網(wǎng)絡(luò)爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解
  • [Python從零到壹] 七.網(wǎng)絡(luò)爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲(chǔ)
  • [Python從零到壹] 八.數(shù)據(jù)庫(kù)之MySQL基礎(chǔ)知識(shí)及操作萬(wàn)字詳解
  • [Python從零到壹] 九.網(wǎng)絡(luò)爬蟲之Selenium基礎(chǔ)技術(shù)萬(wàn)字詳解(定位元素、常用方法、鍵盤鼠標(biāo)操作)
  • [Python從零到壹] 十.網(wǎng)絡(luò)爬蟲之Selenium爬取在線百科知識(shí)萬(wàn)字詳解(NLP語(yǔ)料構(gòu)造必備技能)

第三部分 數(shù)據(jù)分析和機(jī)器學(xué)習(xí)

  • [Python從零到壹] 十一.數(shù)據(jù)分析之Numpy、Pandas、Matplotlib和Sklearn入門知識(shí)萬(wàn)字詳解(1)
  • [Python從零到壹] 十二.機(jī)器學(xué)習(xí)之回歸分析萬(wàn)字總結(jié)全網(wǎng)首發(fā)(線性回歸、多項(xiàng)式回歸、邏輯回歸)
  • [Python從零到壹] 十三.機(jī)器學(xué)習(xí)之聚類分析萬(wàn)字總結(jié)全網(wǎng)首發(fā)(K-Means、BIRCH、層次聚類、樹狀聚類)
  • [Python從零到壹] 十四.機(jī)器學(xué)習(xí)之分類算法三萬(wàn)字總結(jié)全網(wǎng)首發(fā)(決策樹、KNN、SVM、分類算法對(duì)比)

作者新開的“娜璋AI安全之家”將專注于Python和安全技術(shù),主要分享Web滲透、系統(tǒng)安全、人工智能、大數(shù)據(jù)分析、圖像識(shí)別、惡意代碼檢測(cè)、CVE復(fù)現(xiàn)、威脅情報(bào)分析等文章。雖然作者是一名技術(shù)小白,但會(huì)保證每一篇文章都會(huì)很用心地撰寫,希望這些基礎(chǔ)性文章對(duì)你有所幫助,在Python和安全路上與大家一起進(jìn)步。


分類(Classification)屬于有監(jiān)督學(xué)習(xí)(Supervised Learning)中的一類,它是數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)中一個(gè)重要的研究領(lǐng)域。分類模型類似于人類學(xué)習(xí)的方式,通過(guò)對(duì)歷史數(shù)據(jù)或訓(xùn)練集的學(xué)習(xí)得到一個(gè)目標(biāo)函數(shù),再用該目標(biāo)函數(shù)預(yù)測(cè)新數(shù)據(jù)集的未知屬性。本章主要講述分類算法基礎(chǔ)概念,并結(jié)合決策樹、KNN、SVM分類算法案例分析各類數(shù)據(jù)集,從而讓讀者學(xué)會(huì)使用Python分類算法分析自己的數(shù)據(jù)集,研究自己領(lǐng)域的知識(shí),從而創(chuàng)造價(jià)值。

一.分類

1.分類模型

與前面講述的聚類模型類似,分類算法的模型如圖1所示。它主要包括兩個(gè)步驟:

  • 訓(xùn)練。給定一個(gè)數(shù)據(jù)集,每個(gè)樣本包含一組特征和一個(gè)類別信息,然后調(diào)用分類算法訓(xùn)練分類模型。
  • 預(yù)測(cè)。利用生成的模型或函數(shù)對(duì)新的數(shù)據(jù)集(測(cè)試集)進(jìn)行分類預(yù)測(cè),并判斷其分類后的結(jié)果,并進(jìn)行可視化繪圖顯示。

通常為了檢驗(yàn)學(xué)習(xí)模型的性能,會(huì)使用校驗(yàn)集。數(shù)據(jù)集會(huì)被分成不相交的訓(xùn)練集和測(cè)試集,訓(xùn)練集用來(lái)構(gòu)造分類模型,測(cè)試集用來(lái)檢驗(yàn)多少類標(biāo)簽被正確分類。

下面舉一個(gè)分類實(shí)例進(jìn)行講解。假設(shè)存在一個(gè)垃圾分類系統(tǒng),將郵件劃分為“垃圾郵件”和“非垃圾郵件”,現(xiàn)在有一個(gè)帶有是否是垃圾郵件類標(biāo)的訓(xùn)練集,然后訓(xùn)練一個(gè)分類模型,對(duì)測(cè)試集進(jìn)行預(yù)測(cè),步驟如下:

  • (1) 分類模型對(duì)訓(xùn)練集進(jìn)行訓(xùn)練,判斷每行數(shù)據(jù)是正向數(shù)據(jù)還是負(fù)向數(shù)據(jù),并不斷與真實(shí)的結(jié)果進(jìn)行比較,反復(fù)訓(xùn)練模型,直到模型達(dá)到某個(gè)狀態(tài)或超出某個(gè)閾值,模型訓(xùn)練結(jié)束。
  • (2) 利用該模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè),判斷其類標(biāo)是“垃圾郵件”還是“非垃圾郵件”,并計(jì)算出該分類模型的準(zhǔn)確率、召回率和F特征值。

經(jīng)過(guò)上述步驟,當(dāng)收到一封新郵件時(shí),我們可以根據(jù)它郵件的內(nèi)容或特征,判斷其是否是垃圾郵件,這為我們提供了很大的便利,能夠防止垃圾郵件信息的騷擾。


2.常見分類算法

監(jiān)督式學(xué)習(xí)包括分類和回歸。其中常見的分類算法包括樸素貝葉斯分類器、決策樹、K最近鄰分類算法、支持向量機(jī)、神經(jīng)網(wǎng)絡(luò)和基于規(guī)則的分類算法等,同時(shí)還有用于組合單一類方法的集成學(xué)習(xí)算法,如Bagging和Boosting等。

(1) 樸素貝葉斯分類器
樸素貝葉斯分類器(Naive Bayes Classifier,簡(jiǎn)稱NBC)發(fā)源于古典數(shù)學(xué)理論,有著堅(jiān)實(shí)的數(shù)學(xué)基礎(chǔ)和穩(wěn)定的分類效率。該算法是利用Bayes定理來(lái)預(yù)測(cè)一個(gè)未知類別的樣本屬于各個(gè)類別的可能性,選擇其中可能性最大的一個(gè)類別作為該樣本的最終類別。其中,樸素貝葉斯(Naive Bayes)法是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的方法 ,是一類利用概率統(tǒng)計(jì)知識(shí)進(jìn)行分類的算法,該算法被廣泛應(yīng)用的模型稱為樸素貝葉斯模型(Naive Bayesian Model,簡(jiǎn)稱NBM)。

根據(jù)貝葉斯定理,對(duì)于一個(gè)分類問(wèn)題,給定樣本特征x,樣本屬于類別y的概率如下:

其中p(x)表示x事件發(fā)生的概率,p(y)表示y事件發(fā)生的概率,p(x|y)表示事件y發(fā)生后事件x發(fā)生的概率。由于貝葉斯定理的成立本身需要一個(gè)很強(qiáng)的條件獨(dú)立性假設(shè)前提,而此假設(shè)在實(shí)際情況中經(jīng)常是不成立的,因而其分類準(zhǔn)確性就會(huì)下降,同時(shí)它對(duì)缺失的數(shù)據(jù)不太敏感。本書沒(méi)有詳細(xì)介紹樸素貝葉斯分類實(shí)例,希望讀者下來(lái)自行研究學(xué)習(xí)。

(2) 決策樹算法
決策樹(Decision Tree)是以實(shí)例為基礎(chǔ)的歸納學(xué)習(xí)(Inductive Learning)算法,它是對(duì)一組無(wú)次序、無(wú)規(guī)則的實(shí)例建立一棵決策判斷樹,并推理出樹形結(jié)果的分類規(guī)則。決策樹作為分類和預(yù)測(cè)的主要技術(shù)之一,其構(gòu)造目的是找出屬性和類別間的關(guān)系,用它來(lái)預(yù)測(cè)未知數(shù)據(jù)的類別。該算法采用自頂向下的遞歸方式,在決策樹的內(nèi)部節(jié)點(diǎn)進(jìn)行屬性比較,并根據(jù)不同屬性值判斷從該節(jié)點(diǎn)向下的分支,在決策樹的葉子節(jié)點(diǎn)得到反饋的結(jié)果。

決策樹算法根據(jù)數(shù)據(jù)的屬性采用樹狀結(jié)構(gòu)建立決策模型,常用來(lái)解決分類和回歸問(wèn)題。常見的算法包括:分類及回歸樹、ID3 、C4.5、隨機(jī)森林等。

(3) K最近鄰分類算法
K最近鄰(K-Nearest Neighbor,簡(jiǎn)稱KNN)分類算法是一種基于實(shí)例的分類方法,是數(shù)據(jù)挖掘分類技術(shù)中最簡(jiǎn)單常用的方法之一。所謂K最近鄰,就是尋找K個(gè)最近的鄰居,每個(gè)樣本都可以用它最接近的K個(gè)鄰居來(lái)代表。該方法需要找出與未知樣本X距離最近的K個(gè)訓(xùn)練樣本,看這K個(gè)樣本中屬于哪一類的數(shù)量多,就把未知樣本X歸為那一類。

K-近鄰方法是一種懶惰學(xué)習(xí)方法,它存放樣本,直到需要分類時(shí)才進(jìn)行分類,如果樣本集比較復(fù)雜,可能會(huì)導(dǎo)致很大的計(jì)算開銷,因此無(wú)法應(yīng)用到實(shí)時(shí)性很強(qiáng)的場(chǎng)合。

(4) 支持向量機(jī)
支持向量機(jī)(Support Vector Machine,簡(jiǎn)稱SVM)是數(shù)學(xué)家Vapnik等人根據(jù)統(tǒng)計(jì)學(xué)習(xí)理論提出的一種新的學(xué)習(xí)方法,其基本模型定義為特征空間上間隔最大的線性分類器,其學(xué)習(xí)策略是間隔最大化,最終轉(zhuǎn)換為一個(gè)凸二次規(guī)劃問(wèn)題的求解。

SVM算法的最大特點(diǎn)是根據(jù)結(jié)構(gòu)風(fēng)險(xiǎn)最小化準(zhǔn)則,以最大化分類間隔構(gòu)造最優(yōu)分類超平面來(lái)提高學(xué)習(xí)機(jī)的泛化能力,較好地解決了非線性、高維數(shù)、局部極小點(diǎn)等問(wèn)題,同時(shí)維數(shù)大于樣本數(shù)時(shí)仍然有效,支持不同的內(nèi)核函數(shù)(線性、多項(xiàng)式、s型等)。

(5) 神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)(Neural Network,也稱之為人工神經(jīng)網(wǎng)絡(luò))算法是80年代機(jī)器學(xué)習(xí)界非常流行的算法,不過(guò)在90年代中途衰落。現(xiàn)在又隨著“深度學(xué)習(xí)”之勢(shì)重新火熱,成為最強(qiáng)大的機(jī)器學(xué)習(xí)算法之一。圖2是一個(gè)神經(jīng)網(wǎng)絡(luò)的例子,包括輸入層、隱藏層和輸出層。

人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Network,簡(jiǎn)稱ANN)是一種模仿生物神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和功能的數(shù)學(xué)模型或計(jì)算模型。在這種模型中,大量的節(jié)點(diǎn)或稱“神經(jīng)元”之間相互聯(lián)接構(gòu)成網(wǎng)絡(luò),即“神經(jīng)網(wǎng)絡(luò)”,以達(dá)到處理信息的目的。神經(jīng)網(wǎng)絡(luò)通常需要進(jìn)行訓(xùn)練,訓(xùn)練的過(guò)程就是網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)的過(guò)程,訓(xùn)練改變了網(wǎng)絡(luò)節(jié)點(diǎn)的連接權(quán)的值使其具有分類的功能,經(jīng)過(guò)訓(xùn)練的網(wǎng)絡(luò)就可用于對(duì)象的識(shí)別。

常見的人工神經(jīng)網(wǎng)絡(luò)有BP(Back Propagation)神經(jīng)網(wǎng)絡(luò)、徑向基RBF神經(jīng)網(wǎng)絡(luò)、Hopfield神經(jīng)網(wǎng)絡(luò)、隨機(jī)神經(jīng)網(wǎng)絡(luò)(Boltzmann機(jī))、深度神經(jīng)網(wǎng)絡(luò)DNN、卷積神經(jīng)網(wǎng)絡(luò)CNN等。

(6) 集成學(xué)習(xí)
集成學(xué)習(xí)(Ensemble Learning)是一種機(jī)器學(xué)習(xí)方法,它使用一系列學(xué)習(xí)器進(jìn)行學(xué)習(xí),并使用某種規(guī)則把各個(gè)學(xué)習(xí)結(jié)果進(jìn)行整合從而獲得比單個(gè)學(xué)習(xí)器更好的學(xué)習(xí)效果。由于實(shí)際應(yīng)用的復(fù)雜性和數(shù)據(jù)的多樣性往往使得單一的分類方法不夠有效,因此,學(xué)者們對(duì)多種分類方法的融合即集成學(xué)習(xí)進(jìn)行了廣泛的研究,它已儼然成為了國(guó)際機(jī)器學(xué)習(xí)界的研究熱點(diǎn)。

集成學(xué)習(xí)試圖通過(guò)連續(xù)調(diào)用單個(gè)的學(xué)習(xí)算法,獲得不同的基學(xué)習(xí)器,然后根據(jù)規(guī)則組合這些學(xué)習(xí)器來(lái)解決同一個(gè)問(wèn)題,可以顯著的提高學(xué)習(xí)系統(tǒng)的泛化能力。組合多個(gè)基學(xué)習(xí)器主要采用投票(加權(quán))的方法,常見的算法有裝袋(Bagging)、推進(jìn)(Boosting)等。


3.回歸、聚類和分類的區(qū)別

在第12篇文章中我們?cè)敿?xì)講解了回歸分析,13篇詳細(xì)講解了聚類分析,本章著重講解分類分析,而它們之間究竟存在什么區(qū)別和關(guān)系呢?

  • 分類(Classification)和回歸(Regression)都屬于監(jiān)督學(xué)習(xí),它們的區(qū)別在于:回歸是用來(lái)預(yù)測(cè)連續(xù)的實(shí)數(shù)值,比如給定了房屋面積,來(lái)預(yù)測(cè)房屋價(jià)格,返回的結(jié)果是房屋價(jià)格;而分類是用來(lái)預(yù)測(cè)有限的離散值,比如判斷一個(gè)人是否患糖尿病,返回值是“是”或“否”。即明確對(duì)象屬于哪個(gè)預(yù)定義的目標(biāo)類,預(yù)定義的目標(biāo)類是離散時(shí)為分類,連續(xù)時(shí)為回歸。
  • 分類屬于監(jiān)督學(xué)習(xí),而聚類屬于無(wú)監(jiān)督學(xué)習(xí),其主要區(qū)別是:訓(xùn)練過(guò)程中是否知道結(jié)果或是否存在類標(biāo)。比如讓小孩給水果分類,給他蘋果時(shí)告訴他這是蘋果,給他桃子時(shí)告訴他這是桃子,經(jīng)過(guò)反復(fù)訓(xùn)練學(xué)習(xí),現(xiàn)在給他一個(gè)新的水果,問(wèn)他“這是什么?”,小孩對(duì)其進(jìn)行回答判斷,整個(gè)過(guò)程就是一個(gè)分類學(xué)習(xí)的過(guò)程,在訓(xùn)練小孩的過(guò)程中反復(fù)告訴他對(duì)應(yīng)水果真實(shí)的類別。而如果采用聚類算法對(duì)其進(jìn)行分析,則是給小孩一堆水果,包括蘋果、橘子、桃子,小孩開始不知道需要分類的水果是什么,讓小孩自己對(duì)水果進(jìn)行分類,按照水果自身的特征進(jìn)行歸納和判斷,小孩分成三堆后,再給小孩新的水果,比如是蘋果,小孩把它放到蘋果堆的整個(gè)過(guò)程稱之為聚類學(xué)習(xí)過(guò)程。

總之,分類學(xué)習(xí)在訓(xùn)練過(guò)程中是知道對(duì)應(yīng)的類標(biāo)結(jié)果的,即訓(xùn)練集是存在對(duì)應(yīng)的類標(biāo)的;而聚類學(xué)習(xí)在訓(xùn)練過(guò)程中不知道數(shù)據(jù)對(duì)應(yīng)的結(jié)果,根據(jù)數(shù)據(jù)集的特征特點(diǎn),按照“物以類聚”的方法,將具有相似屬性的數(shù)據(jù)聚集在一起。


4.性能評(píng)估

分類算法有很多,不同的分類算法又有很多不同的變種,不同的分類算法有不同的特點(diǎn),在不同的數(shù)據(jù)集上表現(xiàn)的效果也不同,我們需要根據(jù)特定的任務(wù)來(lái)選擇對(duì)應(yīng)的算法。選擇好了分類算法之后,我們?nèi)绾卧u(píng)價(jià)一個(gè)分類算法的好壞呢?

本書主要采用精確率(Precision)、召回率(Recall)和F值(F-measure或F-score)來(lái)評(píng)價(jià)分類算法。

(1) 精確率(Precision)和召回率(Recall)
精確率定義為檢索出相關(guān)文檔數(shù)與檢索出的文檔總數(shù)的比率,衡量的是檢索系統(tǒng)的查準(zhǔn)率;召回率定義為檢索出的相關(guān)文檔數(shù)和文檔庫(kù)中所有相關(guān)文檔數(shù)的比率,衡量的是檢索系統(tǒng)的查全率。公式如下:

其中,參數(shù)N表示實(shí)驗(yàn)結(jié)果中正確識(shí)別出的聚類類簇?cái)?shù),S表示實(shí)驗(yàn)結(jié)果中實(shí)際識(shí)別出的聚類類簇?cái)?shù),T表示數(shù)據(jù)集中所有真實(shí)存在的聚類相關(guān)類簇?cái)?shù)。

(2) F值(F-measure或F-score)
精確率和召回率兩個(gè)評(píng)估指標(biāo)在特定的情況下是相互制約的,因而很難使用單一的評(píng)價(jià)指標(biāo)來(lái)衡量實(shí)驗(yàn)的效果。F-值是準(zhǔn)確率和召回率的調(diào)和平均值,它可作為衡量實(shí)驗(yàn)結(jié)果的最終評(píng)價(jià)指標(biāo),F值更接近兩個(gè)數(shù)中較小的那個(gè)。F值指的計(jì)算公式如下公式所示:

(3) 其他指標(biāo)
其他常用的分類算法的評(píng)價(jià)指標(biāo)包括:

  • 準(zhǔn)確率(Accuracy)
  • 錯(cuò)誤率(Error Rate)
  • 靈敏度(Sensitive)
  • 特效度(Specificity)
  • ROC曲線

二.決策樹

1.算法實(shí)例描述

下面通過(guò)一個(gè)招聘的案例講述決策樹的基本原理及過(guò)程。假設(shè)一位程序員與面試官的初次面試的簡(jiǎn)單對(duì)話,我們利用決策樹分類的思想來(lái)構(gòu)建一棵樹形結(jié)構(gòu)。對(duì)話如下:

面試官:多大年紀(jì)了? 程序員:25歲。 面試官:本科是不是已經(jīng)畢業(yè)呢? 程序員:是的。 面試官:編程技術(shù)厲不厲害? 程序員:不算太厲害,中等水平。 面試官:熟悉Python語(yǔ)言嗎? 程序員:熟悉的,做過(guò)數(shù)據(jù)挖掘相關(guān)應(yīng)用。 面試官:可以的,你通過(guò)了。

這個(gè)面試的決策過(guò)程就是典型的分類樹決策。相當(dāng)于通過(guò)年齡、學(xué)歷、編程技術(shù)和是否熟悉Python語(yǔ)言將程序員初試分為兩個(gè)類別:通過(guò)和不通過(guò)。假設(shè)這個(gè)面試官對(duì)程序員的要求是30歲以下、學(xué)歷本科以上并且是編程厲害或熟悉Pyhon語(yǔ)言中等以上編程技術(shù)的程序員,這個(gè)面試官的決策邏輯過(guò)程用圖3表示。

第二個(gè)實(shí)例是典型的決策樹判斷蘋果的例子,假設(shè)存在4個(gè)樣本,2個(gè)屬性判斷是否是好蘋果,其中第二列1表示蘋果很紅,0表示蘋果不紅;第三列1表示蘋果很大,0表示蘋果很小;第4列結(jié)果1表示蘋果好吃,0表示蘋果不好吃。

樣本中有2個(gè)屬性,即蘋果紅色屬性和蘋果大小屬性。這里紅蘋果用A0表示,大蘋果用A1表示,構(gòu)建的決策樹如圖19.4所示。圖中最頂端有四個(gè)蘋果(1、2、3、4),然后它將顏色紅的蘋果放在一邊(A0=紅),顏色不紅的蘋果放在另一邊,其結(jié)果為1、2是紅蘋果,3、4是不紅的蘋果;再根據(jù)蘋果的大小進(jìn)行劃分,將大的蘋果判斷為好吃的(A1=大),最終輸出結(jié)果在圖中第三層顯示,其中1和3是好吃的蘋果,2和4是不好吃的蘋果,該實(shí)例表明蘋果越大越好吃。

決策樹算法根據(jù)數(shù)據(jù)的屬性并采用樹狀結(jié)構(gòu)構(gòu)建決策模型,常用來(lái)解決分類和回歸問(wèn)題。常見的決策樹算法包括:

  • 分類及回歸樹(Classification And Regression Tree,簡(jiǎn)稱CART)
  • ID3算法(Iterative Dichotomiser 3)
  • C4.5算法
  • 隨機(jī)森林算法(Random Forest)
  • 梯度推進(jìn)機(jī)算法(Gradient Boosting Machine,簡(jiǎn)稱GBM)

決策樹構(gòu)建的基本步驟包括4步,具體步驟如下:

  • 第一步:開始時(shí)將所有記錄看作一個(gè)節(jié)點(diǎn)。
  • 第二步:遍歷每個(gè)變量的每一種分割方式,找到最好的分割點(diǎn)。
  • 第三步:分割成兩個(gè)節(jié)點(diǎn)N1和N2。
  • 第四步:對(duì)N1和N2分別繼續(xù)執(zhí)行第二步和第三步,直到每個(gè)節(jié)點(diǎn)足夠“純”為止。

決策數(shù)具有兩個(gè)優(yōu)點(diǎn):

  • 模型可以讀性好,描述性強(qiáng),有助于人工分析。
  • 效率高,決策樹只需要一次構(gòu)建,可以被反復(fù)使用,每一次預(yù)測(cè)的最大計(jì)算次數(shù)不超過(guò)決策樹的深度。

2.DTC算法

Sklearn機(jī)器學(xué)習(xí)包中,實(shí)現(xiàn)決策樹(DecisionTreeClassifier,簡(jiǎn)稱DTC)的類是:

  • sklearn.tree.DecisionTreeClassifier

它能夠解決數(shù)據(jù)集的多類分類問(wèn)題,輸入?yún)?shù)為兩個(gè)數(shù)組X[n_samples,n_features]和y[n_samples],X為訓(xùn)練數(shù)據(jù),y為訓(xùn)練數(shù)據(jù)標(biāo)記值。DecisionTreeClassifier構(gòu)造方法為:

sklearn.tree.DecisionTreeClassifier(criterion='gini' , splitter='best' , max_depth=None , min_samples_split=2 , min_samples_leaf=1 , max_features=None , random_state=None , min_density=None , compute_importances=None , max_leaf_nodes=None)

DecisionTreeClassifier類主要包括兩個(gè)方法:

  • clf.fit(train_data, train_target)
    用來(lái)裝載(train_data,train_target)訓(xùn)練數(shù)據(jù),并訓(xùn)練分類模型。
  • pre = clf.predict(test_data)
    用訓(xùn)練得到的決策樹模型對(duì)test_data測(cè)試集進(jìn)行預(yù)測(cè)分析。

3.決策樹分析鳶尾花

前面第12篇文章介紹過(guò)邏輯回歸分析鳶尾花的實(shí)例,這里再次講解決策樹分析鳶尾花實(shí)例,從而加深讀者印象。

(1) 數(shù)據(jù)集回顧
在Sklearn機(jī)器學(xué)習(xí)包中,集成了各種各樣的數(shù)據(jù)集,包括糖尿病數(shù)據(jù)集、鳶尾花數(shù)據(jù)集、新聞數(shù)據(jù)集等。這里使用的是鳶尾花卉Iris數(shù)據(jù)集,它是一個(gè)很常用的數(shù)據(jù)集,共150行數(shù)據(jù),包括四個(gè)特征變量:

  • 萼片長(zhǎng)度
  • 萼片寬度
  • 花瓣長(zhǎng)度
  • 花瓣寬度。

同時(shí)包括一個(gè)類別變量,將鳶尾花劃分為三個(gè)類別,即:

  • 山鳶尾(Iris-setosa)
  • 變色鳶尾(Iris-versicolor)
  • 維吉尼亞鳶尾(Iris-virginica)

表2為鳶尾花數(shù)據(jù)集,詳細(xì)信息如下表所示。

iris是鳶尾植物,這里存儲(chǔ)了其萼片和花瓣的長(zhǎng)寬,共4個(gè)屬性,鳶尾植物分三類。 iris數(shù)據(jù)集中包括兩個(gè)屬性iris.data和iris.target。其中,data數(shù)據(jù)是一個(gè)矩陣,每一列代表了萼片或花瓣的長(zhǎng)寬,一共4列,每一行數(shù)據(jù)代表某個(gè)被測(cè)量的鳶尾植物,一共采樣了150條記錄。載入鳶尾花數(shù)據(jù)集代碼如下所示:

from sklearn.datasets import load_iris iris = load_iris() print(iris.data) print(iris.target)


(2) 決策樹簡(jiǎn)單分析鳶尾花
下述代碼實(shí)現(xiàn)了調(diào)用Sklearn機(jī)器學(xué)習(xí)包中DecisionTreeClassifier決策樹算法進(jìn)行分類分析,并繪制預(yù)測(cè)的散點(diǎn)圖。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06#導(dǎo)入數(shù)據(jù)集iris from sklearn.datasets import load_iris iris = load_iris() print(iris.data) #輸出數(shù)據(jù)集 print(iris.target) #輸出真實(shí)標(biāo)簽 print(len(iris.target)) print(iris.data.shape) #150個(gè)樣本 每個(gè)樣本4個(gè)特征#導(dǎo)入決策樹DTC包 from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() clf.fit(iris.data, iris.target) #訓(xùn)練 print(clf) predicted = clf.predict(iris.data) #預(yù)測(cè)#獲取花卉兩列數(shù)據(jù)集 X = iris.data L1 = [x[0] for x in X] L2 = [x[1] for x in X]#繪圖 import numpy as np import matplotlib.pyplot as plt plt.scatter(L1, L2, c=predicted, marker='x') #cmap=plt.cm.Paired plt.title("DTC") plt.show()

輸出結(jié)果如圖5所示,可以看到?jīng)Q策樹算法將數(shù)據(jù)集預(yù)測(cè)為三類,分別代表著數(shù)據(jù)集對(duì)應(yīng)的三種鳶尾花,但數(shù)據(jù)集中存在小部分交叉結(jié)果。預(yù)測(cè)的結(jié)果如下:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2] 150 (150, 4)DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,max_features=None, max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, presort=False,random_state=None, splitter='best')

下面對(duì)上述核心代碼進(jìn)行簡(jiǎn)單描述。

  • from sklearn.datasets import load_iris
  • iris = load_iris()

該部分代碼是導(dǎo)入sklearn機(jī)器學(xué)習(xí)包自帶的鳶尾花數(shù)據(jù)集,調(diào)用load_iris()函數(shù)導(dǎo)入數(shù)據(jù),數(shù)據(jù)共分為數(shù)據(jù)(data)和類標(biāo)(target)兩部分。

  • from sklearn.tree import DecisionTreeClassifier
  • clf = DecisionTreeClassifier()
  • clf.fit(iris.data, iris.target)
  • predicted = clf.predict(iris.data)

該部分代碼導(dǎo)入決策樹模型,并調(diào)用fit()函數(shù)進(jìn)行訓(xùn)練,predict()函數(shù)進(jìn)行預(yù)測(cè)。

  • import matplotlib.pyplot as plt
  • plt.scatter(L1, L2, c=predicted, marker=‘x’)

該部分代碼是導(dǎo)入matplotlib繪圖擴(kuò)展包,調(diào)用scatter()函數(shù)繪制散點(diǎn)圖。

但上面的代碼中存在兩個(gè)問(wèn)題:

  • 代碼中通過(guò)“L1 = [x[0] for x in X]”獲取了第一列和第二列數(shù)據(jù)集進(jìn)行了分類分析和繪圖,而真實(shí)的iris數(shù)據(jù)集中包括四個(gè)特征,那怎么繪制四個(gè)特征的圖形呢? 這就需要利用PCA降維技術(shù)處理,參考前一篇文章。
  • 第二個(gè)問(wèn)題是在聚類、回歸、分類模型中,都需要先進(jìn)行訓(xùn)練,再對(duì)新的數(shù)據(jù)集進(jìn)行預(yù)測(cè),這里卻是對(duì)整個(gè)數(shù)據(jù)集進(jìn)行分類分析,而真實(shí)情況是需要把數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集的,例如數(shù)據(jù)集的70%用于訓(xùn)練、30%用于預(yù)測(cè),或80%用于訓(xùn)練、20%用于預(yù)測(cè)。

4.數(shù)據(jù)集劃分及分類評(píng)估

這部分內(nèi)容主要是進(jìn)行代碼優(yōu)化,將數(shù)據(jù)集劃分為80%訓(xùn)練集-20%預(yù)測(cè)集,并對(duì)決策樹分類算法進(jìn)行評(píng)估。由于提供的數(shù)據(jù)集類標(biāo)是存在一定規(guī)律的,前50個(gè)類標(biāo)為0(山鳶尾)、中間50個(gè)類標(biāo)為1(變色鳶尾)、最后50個(gè)類標(biāo)為2(維吉尼亞鳶)。即:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2]

這里調(diào)用NumPy庫(kù)中的 concatenate() 函數(shù)對(duì)數(shù)據(jù)集進(jìn)行挑選集成,選擇第0-40行、第50-90行、第100-140行數(shù)據(jù)作為訓(xùn)練集,對(duì)應(yīng)的類標(biāo)作為訓(xùn)練樣本類標(biāo);再選擇第40-50行、第90-100行、第140-150行數(shù)據(jù)作為測(cè)試集合,對(duì)應(yīng)的樣本類標(biāo)作為預(yù)測(cè)類標(biāo)。

代碼如下,“axis=0”表示選取數(shù)值的等差間隔為0,即緊挨著獲取數(shù)值。

#訓(xùn)練集 train_data = np.concatenate((iris.data[0:40, :], iris.data[50:90, :], iris.data[100:140, :]), axis = 0) #訓(xùn)練集樣本類別 train_target = np.concatenate((iris.target[0:40], iris.target[50:90], iris.target[100:140]), axis = 0) #測(cè)試集 test_data = np.concatenate((iris.data[40:50, :], iris.data[90:100, :], iris.data[140:150, :]), axis = 0) #測(cè)試集樣本類別 test_target = np.concatenate((iris.target[40:50], iris.target[90:100], iris.target[140:150]), axis = 0)

同時(shí),調(diào)用sklearn機(jī)器學(xué)習(xí)包中metrics類對(duì)決策樹分類算法進(jìn)行評(píng)估,它將輸出準(zhǔn)確率(Precison)、召回率(Recall)、F特征值(F-score)、支持度(Support)等。

#輸出準(zhǔn)確率 召回率 F值 from sklearn import metrics print(metrics.classification_report(test_target, predict_target)) print(metrics.confusion_matrix(test_target, predict_target))

分類報(bào)告的核心函數(shù)為:

sklearn.metrics.classification_report(y_true, y_pred, labels=None,target_names=None,sample_weight=None, digits=2)

其中y_true參數(shù)表示正確的分類類標(biāo),y_pred表示分類預(yù)測(cè)的類標(biāo),labels表示分類報(bào)告中顯示的類標(biāo)簽的索引列表,target_names參數(shù)顯示與labels對(duì)應(yīng)的名稱,digits是指定輸出格式的精確度。評(píng)價(jià)公式如下:

調(diào)用 metrics.classification_report() 方法對(duì)決策樹算法進(jìn)行評(píng)估后,會(huì)在最后一行將對(duì)所有指標(biāo)進(jìn)行加權(quán)平均值,詳見下面完整代碼。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn import metrics import numpy as np import matplotlib.pyplot as plt#導(dǎo)入數(shù)據(jù)集iris ''' 重點(diǎn):分割數(shù)據(jù)集 構(gòu)造訓(xùn)練集/測(cè)試集,80/2070%訓(xùn)練 0-40 50-90 100-14030%預(yù)測(cè) 40-50 90-100 140-150 ''' iris = load_iris() train_data = np.concatenate((iris.data[0:40, :], iris.data[50:90, :], iris.data[100:140, :]), axis = 0) #訓(xùn)練集 train_target = np.concatenate((iris.target[0:40], iris.target[50:90], iris.target[100:140]), axis = 0) #訓(xùn)練集樣本類別 test_data = np.concatenate((iris.data[40:50, :], iris.data[90:100, :], iris.data[140:150, :]), axis = 0) #測(cè)試集 test_target = np.concatenate((iris.target[40:50], iris.target[90:100], iris.target[140:150]), axis = 0) #測(cè)試集樣本類別#導(dǎo)入決策樹DTC包 clf = DecisionTreeClassifier() clf.fit(train_data, train_target) #注意均使用訓(xùn)練數(shù)據(jù)集和樣本類標(biāo) print(clf) predict_target = clf.predict(test_data) #測(cè)試集 print(predict_target)#預(yù)測(cè)結(jié)果與真實(shí)結(jié)果比對(duì) print(sum(predict_target == test_target))#輸出準(zhǔn)確率 召回率 F值 print(metrics.classification_report(test_target, predict_target)) print(metrics.confusion_matrix(test_target, predict_target))#獲取花卉測(cè)試數(shù)據(jù)集兩列數(shù)據(jù) X = test_data L1 = [n[0] for n in X] L2 = [n[1] for n in X]#繪圖 plt.scatter(L1, L2, c=predict_target, marker='x') #cmap=plt.cm.Paired plt.title("DecisionTreeClassifier") plt.show()

輸出結(jié)果如下,包括對(duì)數(shù)據(jù)集40-50、90-100、140-150的預(yù)測(cè)結(jié)果,接下來(lái)輸出的“30”表示整個(gè)30組類標(biāo)預(yù)測(cè)結(jié)果和真實(shí)結(jié)果是一致的,最后輸出評(píng)估結(jié)果。

[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2] 30precision recall f1-score support0 1.00 1.00 1.00 101 1.00 1.00 1.00 102 1.00 1.00 1.00 10avg / total 1.00 1.00 1.00 30[[10 0 0][ 0 10 0][ 0 0 10]]

同時(shí)輸出圖形如圖6所示。

讀者可以自行深入研究,調(diào)用sklearn.tree.export_graphviz類實(shí)現(xiàn)導(dǎo)出決策樹繪制樹形結(jié)構(gòu)的過(guò)程,比如鳶尾花數(shù)據(jù)集輸出如圖7所示的樹形結(jié)構(gòu)。

  • https://www.freesion.com/article/894048252/


5.區(qū)域劃分對(duì)比

下面講述區(qū)域劃分對(duì)比實(shí)驗(yàn)(前面已經(jīng)出現(xiàn)過(guò)),它是指按照數(shù)據(jù)集真實(shí)的類標(biāo),將其劃分為不同顏色區(qū)域,這里的鳶尾花數(shù)據(jù)集共分為三個(gè)區(qū)域,最后進(jìn)行散點(diǎn)圖繪制對(duì)比。每個(gè)區(qū)域?qū)?yīng)一類散點(diǎn),表示預(yù)測(cè)結(jié)果和真實(shí)結(jié)果一致,如果某個(gè)區(qū)域混入其他類型的散點(diǎn),則表示該點(diǎn)的預(yù)測(cè)結(jié)果與真實(shí)結(jié)果不一致。

完整代碼如下所示,代碼首先調(diào)用“iris.data[:, :2]”代碼獲取其中兩列數(shù)據(jù)(兩個(gè)特征),再進(jìn)行決策樹分類分析。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier #載入鳶尾花數(shù)據(jù)集 iris = load_iris() X = X = iris.data[:, :2] #獲取花卉前兩列數(shù)據(jù) Y = iris.target lr = DecisionTreeClassifier() lr.fit(X,Y)#meshgrid函數(shù)生成兩個(gè)網(wǎng)格矩陣 h = .02 x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5 y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#pcolormesh函數(shù)將xx,yy兩個(gè)網(wǎng)格矩陣和對(duì)應(yīng)的預(yù)測(cè)結(jié)果Z繪制在圖片上 Z = lr.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.figure(1, figsize=(8,6)) plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)#繪制散點(diǎn)圖 plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa') plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor') plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica') plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.xticks(()) plt.yticks(()) plt.legend(loc=2) plt.show()

下面作者對(duì)區(qū)域劃分對(duì)比代碼進(jìn)行詳細(xì)講解。

  • x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
  • y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
  • xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

獲取的鳶尾花兩列數(shù)據(jù),對(duì)應(yīng)為萼片長(zhǎng)度和萼片寬度,每個(gè)點(diǎn)的坐標(biāo)就是(x,y)。先取X二維數(shù)組的第一列(長(zhǎng)度)的最小值、最大值和步長(zhǎng)h(設(shè)置為0.02)生成數(shù)組,再取X二維數(shù)組的第二列(寬度)的最小值、最大值和步長(zhǎng)h生成數(shù)組,最后用meshgrid()函數(shù)生成兩個(gè)網(wǎng)格矩陣xx和yy,如下所示:

[[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ][ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]..., [ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ][ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]] [[ 1.5 1.5 1.5 ..., 1.5 1.5 1.5 ][ 1.52 1.52 1.52 ..., 1.52 1.52 1.52]..., [ 4.88 4.88 4.88 ..., 4.88 4.88 4.88][ 4.9 4.9 4.9 ..., 4.9 4.9 4.9 ]]
  • Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])

調(diào)用ravel()函數(shù)將xx和yy的兩個(gè)矩陣轉(zhuǎn)變成一維數(shù)組,再進(jìn)行預(yù)測(cè)分析。由于兩個(gè)矩陣大小相等,因此兩個(gè)一維數(shù)組大小也相等。np.c_[xx.ravel(), yy.ravel()]是生成矩陣,即:

xx.ravel() [ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ] yy.ravel() [ 1.5 1.5 1.5 ..., 4.9 4.9 4.9] np.c_[xx.ravel(), yy.ravel()] [[ 3.8 1.5 ][ 3.82 1.5 ][ 3.84 1.5 ]..., [ 8.36 4.9 ][ 8.38 4.9 ][ 8.4 4.9 ]]

總之,上述操作是把第一列萼片長(zhǎng)度數(shù)據(jù)按h取等分作為行,并復(fù)制多行得到xx網(wǎng)格矩陣;再把第二列萼片寬度數(shù)據(jù)按h取等分,作為列,并復(fù)制多列得到y(tǒng)y網(wǎng)格矩陣;最后將xx和yy矩陣都變成兩個(gè)一維數(shù)組,調(diào)用np.c_[]函數(shù)組合成一個(gè)二維數(shù)組進(jìn)行預(yù)測(cè)。

調(diào)用predict()函數(shù)進(jìn)行預(yù)測(cè),預(yù)測(cè)結(jié)果賦值給Z。即:

Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()]) [1 1 1 ..., 2 2 2] size: 39501
  • Z = Z.reshape(xx.shape)
    調(diào)用reshape()函數(shù)修改形狀,將其Z轉(zhuǎn)換為兩個(gè)特征(長(zhǎng)度和寬度),則39501個(gè)數(shù)據(jù)轉(zhuǎn)換為171*231的矩陣。Z = Z.reshape(xx.shape)輸出如下:
[[1 1 1 ..., 2 2 2][1 1 1 ..., 2 2 2][0 1 1 ..., 2 2 2]..., [0 0 0 ..., 2 2 2][0 0 0 ..., 2 2 2][0 0 0 ..., 2 2 2]]
  • plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

調(diào)用pcolormesh()函數(shù)將xx、yy兩個(gè)網(wǎng)格矩陣和對(duì)應(yīng)的預(yù)測(cè)結(jié)果Z繪制在圖片上,可以發(fā)現(xiàn)輸出為三個(gè)顏色區(qū)塊,分別表示三類區(qū)域。cmap=plt.cm.Paired表示繪圖樣式選擇Paired主題。輸出的區(qū)域如下圖所示:

  • plt.scatter(X[:50,0], X[:50,1], color=‘red’,marker=‘o’, label=‘setosa’)

調(diào)用scatter()繪制散點(diǎn)圖,第一個(gè)參數(shù)為第一列數(shù)據(jù)(長(zhǎng)度),第二個(gè)參數(shù)為第二列數(shù)據(jù)(寬度),第三、四個(gè)參數(shù)為設(shè)置點(diǎn)的顏色為紅色,款式為圓圈,最后標(biāo)記為setosa。

最終輸出如圖9所示,經(jīng)過(guò)決策樹分析后劃分為三個(gè)區(qū)域,左上角部分為紅色的圓點(diǎn),對(duì)應(yīng)setosa鳶尾花;右邊部分為綠色方塊,對(duì)應(yīng)virginica鳶尾花;中間靠下部分為藍(lán)色星形,對(duì)應(yīng)versicolor鳶尾花。散點(diǎn)圖為各數(shù)據(jù)點(diǎn)真實(shí)的花類型,劃分的三個(gè)區(qū)域?yàn)閿?shù)據(jù)點(diǎn)預(yù)測(cè)的花類型,預(yù)測(cè)的分類結(jié)果與訓(xùn)練數(shù)據(jù)的真實(shí)結(jié)果結(jié)果基本一致,部分鳶尾花出現(xiàn)交叉。


三.KNN分類算法

1.算法實(shí)例描述

KNN分類算法是最近鄰算法,字面意思就是尋找最近鄰居,由Cover和Hart在1968年提出,它簡(jiǎn)單直觀易于實(shí)現(xiàn)。下面通過(guò)一個(gè)經(jīng)典例子來(lái)講解如何尋找鄰居,選取多少個(gè)鄰居。圖10需要判斷右邊這個(gè)動(dòng)物是鴨子、雞還是鵝?這就涉及到了KNN算法的核心思想,判斷與這個(gè)樣本點(diǎn)相似的類別,再預(yù)測(cè)其所屬類別。由于它走路和叫聲像一只鴨子,所以右邊的動(dòng)物很可能是一只鴨子。

KNN分類算法的核心思想是從訓(xùn)練樣本中尋找所有訓(xùn)練樣本X中與測(cè)試樣本距離(常用歐氏距離)最近的前K個(gè)樣本(作為相似度),再選擇與待分類樣本距離最小的K個(gè)樣本作為X的K個(gè)最鄰近,并檢測(cè)這K個(gè)樣本大部分屬于哪一類樣本,則認(rèn)為這個(gè)測(cè)試樣本類別屬于這一類樣本。

KNN分類的算法步驟如下:

  • 計(jì)算測(cè)試樣本點(diǎn)到所有樣本點(diǎn)的歐式距離dist,采用勾股定理計(jì)算
  • 用戶自定義設(shè)置參數(shù)K,并選擇離帶測(cè)點(diǎn)最近的K個(gè)點(diǎn)
  • 從這K個(gè)點(diǎn)中,統(tǒng)計(jì)各個(gè)類型或類標(biāo)的個(gè)數(shù)
  • 選擇出現(xiàn)頻率最大的類標(biāo)號(hào)作為未知樣本的類標(biāo)號(hào),反饋?zhàn)罱K預(yù)測(cè)結(jié)果

假設(shè)現(xiàn)在需要判斷圖11中的圓形圖案屬于三角形還是正方形類別,采用KNN算法分析步驟如下:

  • 當(dāng)K=3時(shí),圖中第一個(gè)圈包含了三個(gè)圖形,其中三角形2個(gè),正方形一個(gè),該圓的則分類結(jié)果為三角形。
  • 當(dāng)K=5時(shí),第二個(gè)圈中包含了5個(gè)圖形,三角形2個(gè),正方形3個(gè),則以3:2的投票結(jié)果預(yù)測(cè)圓為正方形類標(biāo)。
  • 同理,當(dāng)K=11原理也是一樣,設(shè)置不同的K值,可能預(yù)測(cè)得到結(jié)果也不同。所以,KNN是一個(gè)非常簡(jiǎn)單、易于理解實(shí)現(xiàn)的分類算法。

最后簡(jiǎn)單講述KNN算法的優(yōu)缺點(diǎn)。KNN分類算法存在的優(yōu)點(diǎn)包括:

  • 算法思路較為簡(jiǎn)單,易于實(shí)現(xiàn)。
  • 當(dāng)有新樣本要加入訓(xùn)練集中時(shí),無(wú)需重新訓(xùn)練,即重新訓(xùn)練的代價(jià)低。
  • 計(jì)算時(shí)間和空間線性于訓(xùn)練集的規(guī)模。

其缺點(diǎn)主要表現(xiàn)為分類速度慢,由于每次新的待分樣本都必須與所有訓(xùn)練集一同計(jì)算比較相似度,以便取出靠前的K個(gè)已分類樣本,所以時(shí)間復(fù)雜度較高。整個(gè)算法的時(shí)間復(fù)雜度可以用O(m*n)表示,其中m是選出的特征項(xiàng)的個(gè)數(shù),而n是訓(xùn)練集樣本的個(gè)數(shù)。同時(shí),如果K值確定不好,也會(huì)影響整個(gè)實(shí)驗(yàn)的結(jié)果,這也是KNN算法的另一個(gè)缺點(diǎn)。


2.KNeighborsClassifier

Sklearn機(jī)器學(xué)習(xí)包中,實(shí)現(xiàn)KNN分類算法的類是neighbors.KNeighborsClassifier。構(gòu)造方法如下:

KNeighborsClassifier(algorithm='ball_tree', leaf_size=30, metric='minkowski',metric_params=None, n_jobs=1, n_neighbors=3, p=2, weights='uniform')

其中最重要的參數(shù)是n_neighbors=3,設(shè)置最近鄰K值。同時(shí),KNeighborsClassifier可以設(shè)置3種算法:brute、kd_tree、ball_tree。具體調(diào)用方法如下:

from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=3, algorithm="ball_tree")

KNN算法分析時(shí)也包括訓(xùn)練和預(yù)測(cè)兩個(gè)方法。

  • 訓(xùn)練:knn.fit(data, target)
  • 預(yù)測(cè):pre = knn.predict(data)

下面這段代碼是簡(jiǎn)單調(diào)用KNN分類算法進(jìn)行預(yù)測(cè)的例子,代碼如下。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 import numpy as np from sklearn.neighbors import KNeighborsClassifier X = np.array([[-1,-1],[-2,-2],[1,2], [1,1],[-3,-4],[3,2]]) Y = [0,0,1,1,0,1] x = [[4,5],[-4,-3],[2,6]] knn = KNeighborsClassifier(n_neighbors=3, algorithm="ball_tree") knn.fit(X,Y) pre = knn.predict(x) print(pre)

定義了一個(gè)二維數(shù)組用于存儲(chǔ)6個(gè)點(diǎn),其中x和y坐標(biāo)為負(fù)數(shù)的類標(biāo)定義為0,x和y坐標(biāo)為正數(shù)的類標(biāo)定義為1。調(diào)用knn.fit(X,Y)函數(shù)訓(xùn)練模型后,再調(diào)用predict()函數(shù)預(yù)測(cè)[4,5]、[-4,-3]、[2,6]三個(gè)點(diǎn)的坐標(biāo),輸出結(jié)果分別為:[1, 0, 1],其中x和y坐標(biāo)為正數(shù)的劃分為一類,負(fù)數(shù)的一類。

同時(shí)也可以計(jì)算K個(gè)最近點(diǎn)的下標(biāo)和距離,代碼和結(jié)果如下,其中,indices表示點(diǎn)的下標(biāo),distances表示距離。

distances, indices = knn.kneighbors(X) print(indices) print(distances)>>> [1 0 1] [[0 1 3][1 0 4][2 3 5][3 2 5][4 1 0][5 2 3]] [[ 0. 1.41421356 2.82842712][ 0. 1.41421356 2.23606798][ 0. 1. 2. ][ 0. 1. 2.23606798][ 0. 2.23606798 3.60555128][ 0. 2. 2.23606798]] >>>

下面通過(guò)一個(gè)完整的實(shí)例結(jié)合可視化技術(shù)進(jìn)行講解,加深讀者的印象。


3.KNN分析紅酒類型

(1) 數(shù)據(jù)集
該實(shí)驗(yàn)數(shù)據(jù)集是UCI Machine Learning Repository開源網(wǎng)站提供的MostPopular Data Sets(hits since 2007)紅酒數(shù)據(jù)集,它是對(duì)意大利同一地區(qū)生產(chǎn)的三種不同品種的酒,做大量分析所得出的數(shù)據(jù)。這些數(shù)據(jù)包括了三種類別的酒,酒中共13種不同成分的特征,共178行數(shù)據(jù),如圖13所示。

該數(shù)據(jù)集包括了三種類型酒中13種不同成分的數(shù)量,13種成分分別是:Alcohol、Malicacid、Ash、Alcalinity of ash、Magnesium、Total phenols、Flavanoids、Nonflavanoid phenols、Proanthocyanins、Color intensity、Hue、OD280/OD315 of diluted wines和Proline,每一種成分可以看成一個(gè)特征,對(duì)應(yīng)一個(gè)數(shù)據(jù)。三種類型的酒分別標(biāo)記為“1”、“2”、“3”。數(shù)據(jù)集特征描述如表3所示。

數(shù)據(jù)存儲(chǔ)在wine.txt文件中,如圖14所示。每行數(shù)據(jù)代表一個(gè)樣本,共178行數(shù)據(jù),每行數(shù)據(jù)包含14列,即第一列為類標(biāo)屬性,后面依次是13列特征。其中第1類有59個(gè)樣本,第2類有71個(gè)樣本,第3類有48個(gè)樣本。

注意:前面講述了如何讀取CSV文件數(shù)據(jù)集或Sklearn擴(kuò)展包所提供的數(shù)據(jù)集,但現(xiàn)實(shí)分析中,很多數(shù)據(jù)集會(huì)存儲(chǔ)于TXT或DATA文件中,它們采用一定的符號(hào)進(jìn)行分隔,比如圖中采用逗號(hào)分隔,如何獲取這類文件中的數(shù)據(jù),也是非常重要的知識(shí)。所以接下來(lái)先教大家讀取這類文件的數(shù)據(jù)。


(2) 讀取數(shù)據(jù)集
從圖14可以看到整個(gè)數(shù)據(jù)集采用逗號(hào)分隔,常用讀取該類型數(shù)據(jù)集的方法是調(diào)用open()函數(shù)讀取文件,依次讀取TXT文件中所有內(nèi)容,再按照逗號(hào)分割符獲取每行的14列數(shù)據(jù)存儲(chǔ)至數(shù)組或矩陣中,從而進(jìn)行數(shù)據(jù)分析。這里講述另一種方法,調(diào)用loadtxt()函數(shù)讀取逗號(hào)分隔的數(shù)據(jù),代碼如下:

# -*- coding: utf-8 -*- import os import numpy as np path = "wine/wine.txt" data = np.loadtxt(path,dtype=float,delimiter=",") print(data)

輸出如下所示:

loadtxt()讀入文件函數(shù)原型如下:

  • loadtxt(fname, dtype, delimiter, converters, usecols)

其中參數(shù)fname表示文件路徑,dtype表示數(shù)據(jù)類型,delimiter表示分隔符,converters將數(shù)據(jù)列與轉(zhuǎn)換函數(shù)進(jìn)行映射的字段,如{1:fun},usecols表示選取數(shù)據(jù)的列。


(3) 數(shù)據(jù)集拆分訓(xùn)練集和預(yù)測(cè)集
由于Wine數(shù)據(jù)集前59個(gè)樣本全是第1類,中間71個(gè)樣本為第2類,最后48個(gè)樣本是第3類,所以需要將數(shù)據(jù)集拆分成訓(xùn)練集和預(yù)測(cè)集。步驟如下:

  • 調(diào)用split()函數(shù)將數(shù)據(jù)集的第一列類標(biāo)(Y數(shù)據(jù))和13列特征(X數(shù)組)分隔開來(lái)。該函數(shù)參數(shù)包括data數(shù)據(jù),分割位置,其中1表示從第一列分割,axis為1表示水平分割、0表示垂直分割。
  • 由于數(shù)據(jù)集第一列存儲(chǔ)的類標(biāo)為1.0、2.0或3.0浮點(diǎn)型數(shù)據(jù),需要將其轉(zhuǎn)換為整型,這里在for循環(huán)中調(diào)用int()函數(shù)轉(zhuǎn)換,存儲(chǔ)至y數(shù)組中,也可采用np.astype()實(shí)現(xiàn)。
  • 最后調(diào)用np.concatenate()函數(shù)將0-40、60-100、140-160行數(shù)據(jù)分割為訓(xùn)練集,包括13列特征和類標(biāo),其余78行數(shù)據(jù)為測(cè)試集。

代碼如下:

# -*- coding: utf-8 -*- import os import numpy as np path = "wine/wine.txt" data = np.loadtxt(path,dtype=float,delimiter=",") print(data)yy, x = np.split(data, (1,), axis=1) print(yy.shape, x.shape) y = [] for n in yy:y.append(int(n))train_data = np.concatenate((x[0:40,:], x[60:100,:], x[140:160,:]), axis = 0) #訓(xùn)練集 train_target = np.concatenate((y[0:40], y[60:100], y[140:160]), axis = 0) #樣本類別 test_data = np.concatenate((x[40:60, :], x[100:140, :], x[160:,:]), axis = 0) #測(cè)試集 test_target = np.concatenate((y[40:60], y[100:140], y[160:]), axis = 0) #樣本類別print(train_data.shape, train_target.shape) print(test_data.shape, test_target.shape)

輸出結(jié)果如下:

(178L, 1L) (178L, 13L) (100L, 1L) (100L, 13L) (78L, 1L) (78L, 13L)

下面補(bǔ)充一種隨機(jī)拆分的方式,調(diào)用 sklearn.model_selection.train_test_split 類隨機(jī)劃分訓(xùn)練集與測(cè)試集。代碼如下:

from sklearn.model_selection import train_test_split x, y = np.split(data, (1,), axis=1) x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.7)#Python2調(diào)用方法 #from sklearn.cross_validation import train_test_split

參數(shù)x表示所要?jiǎng)澐值臉颖咎卣骷?#xff1b;y是所要?jiǎng)澐值臉颖窘Y(jié)果;train_size表示訓(xùn)練樣本占比,0.7表示將數(shù)據(jù)集劃分為70%的訓(xùn)練集、30%的測(cè)試集;random_state是隨機(jī)數(shù)的種子。該函數(shù)在部分版本的sklearn庫(kù)中是導(dǎo)入model_selection類,建議讀者下來(lái)嘗試。


(4) KNN分類算法分析
上面已經(jīng)將178個(gè)樣本分成100個(gè)訓(xùn)練樣本和78個(gè)測(cè)試樣本,采用KNN分類算法訓(xùn)練模型,再對(duì)測(cè)試集進(jìn)行預(yù)測(cè),判別出測(cè)試樣本所屬于酒的類型,同時(shí)輸出測(cè)試樣本計(jì)算的正確率和錯(cuò)誤率。KNN核心代碼如下:

from sklearn.neighbors import KNeighborsClassifier clf = KNeighborsClassifier(n_neighbors=3,algorithm='kd_tree') clf.fit(train_data,train_target) result = clf.predict(test_data) print(result)

預(yù)測(cè)輸出結(jié)果如下所示:

[1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 3 2 3 2 2 2 22 2 3 3 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 1 2 3 3 2 2 3 2 3 2 2 2 1 2 2 2 3 11 1 1 3]

(5) 完整代碼
下面代碼實(shí)現(xiàn)了調(diào)用Sklearn機(jī)器學(xué)習(xí)包中KNeighborsClassifier算法進(jìn)行分類分析,并繪制預(yù)測(cè)的散點(diǎn)圖和背景圖,完整代碼如下。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 import os import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn import metrics from sklearn.decomposition import PCA import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap#---------------------------------------------------------------------------- #第一步 加載數(shù)據(jù)集 path = "wine/wine.txt" data = np.loadtxt(path,dtype=float,delimiter=",") print(data)#---------------------------------------------------------------------------- #第二步 劃分?jǐn)?shù)據(jù)集 yy, x = np.split(data, (1,), axis=1) #第一列為類標(biāo)yy,后面13列特征為x print(yy.shape, x.shape) y = [] for n in yy: #將類標(biāo)浮點(diǎn)型轉(zhuǎn)化為整數(shù)y.append(int(n)) x = x[:, :2] #獲取x前兩列數(shù)據(jù),方便繪圖 對(duì)應(yīng)x、y軸 train_data = np.concatenate((x[0:40,:], x[60:100,:], x[140:160,:]), axis = 0) #訓(xùn)練集 train_target = np.concatenate((y[0:40], y[60:100], y[140:160]), axis = 0) #樣本類別 test_data = np.concatenate((x[40:60, :], x[100:140, :], x[160:,:]), axis = 0) #測(cè)試集 test_target = np.concatenate((y[40:60], y[100:140], y[160:]), axis = 0) #樣本類別 print(train_data.shape, train_target.shape) print(test_data.shape, test_target.shape)#---------------------------------------------------------------------------- #第三步 KNN訓(xùn)練 clf = KNeighborsClassifier(n_neighbors=3,algorithm='kd_tree') #K=3 clf.fit(train_data,train_target) result = clf.predict(test_data) print(result)#---------------------------------------------------------------------------- #第四步 評(píng)價(jià)算法 print(sum(result==test_target)) #預(yù)測(cè)結(jié)果與真實(shí)結(jié)果比對(duì) print(metrics.classification_report(test_target, result)) #準(zhǔn)確率 召回率 F值#---------------------------------------------------------------------------- #第五步 創(chuàng)建網(wǎng)格 x1_min, x1_max = test_data[:,0].min()-0.1, test_data[:,0].max()+0.1 #第一列 x2_min, x2_max = test_data[:,1].min()-0.1, test_data[:,1].max()+0.1 #第二列 xx, yy = np.meshgrid(np.arange(x1_min, x1_max, 0.1), np.arange(x2_min, x2_max, 0.1)) #生成網(wǎng)格型數(shù)據(jù) print(xx.shape, yy.shape) #(53L, 36L) (53L, 36L)z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) #ravel()拉直函數(shù) print(xx.ravel().shape, yy.ravel().shape) #(1908L,) (1908L,) print(np.c_[xx.ravel(), yy.ravel()].shape) #合并 (1908L,2)#---------------------------------------------------------------------------- #第六步 繪圖可視化 cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) #顏色Map cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF']) plt.figure() z = z.reshape(xx.shape) print(xx.shape, yy.shape, z.shape, test_target.shape) #(53L, 36L) (53L, 36L) (53L, 36L) (78L,) plt.pcolormesh(xx, yy, z, cmap=cmap_light) plt.scatter(test_data[:,0], test_data[:,1], c=test_target,cmap=cmap_bold, s=50) plt.show()

輸出結(jié)果如下所示,包括預(yù)測(cè)的78行類標(biāo),共預(yù)測(cè)正確58行數(shù)據(jù),準(zhǔn)確率為0.76,召回率為0.74,f特征為0.74。其結(jié)果不太理想,需要進(jìn)一步優(yōu)化算法。

[1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 2 2 3 2 2 2 2 2 3 2 2 2 2 22 1 2 2 2 3 3 3 2 2 2 2 3 2 3 1 1 2 3 3 3 3 3 1 3 3 3 3 3 3 3 1 3 2 1 1 33 3 1 3] 58precision recall f1-score support1 0.68 0.89 0.77 192 0.88 0.74 0.81 313 0.67 0.64 0.65 28avg / total 0.76 0.74 0.74 78

輸出圖形如圖15所示,可以看到整個(gè)區(qū)域劃分為三種顏色,左下角為綠色區(qū)域,右下角為紅色區(qū)域,右上部分為藍(lán)色區(qū)域。同時(shí)包括78個(gè)點(diǎn)分布,對(duì)應(yīng)78行數(shù)據(jù)的類標(biāo),包括綠色、藍(lán)色和紅色的點(diǎn)。可以發(fā)現(xiàn),相同顏色的點(diǎn)主要集中于該顏色區(qū)域,部分藍(lán)色點(diǎn)劃分至紅色區(qū)域或綠色點(diǎn)劃分至藍(lán)色區(qū)域,則表示預(yù)測(cè)結(jié)果與實(shí)際結(jié)果不一致。

最后簡(jiǎn)單總結(jié),整個(gè)分析過(guò)程包括六個(gè)步驟,大致內(nèi)容如下:

  • 1) 加載數(shù)據(jù)集
    采用loadtxt()函數(shù)加載酒類數(shù)據(jù)集,采用逗號(hào)(,)分割。
  • 2) 劃分?jǐn)?shù)據(jù)集
    由于Wine數(shù)據(jù)集第一列為類標(biāo),后面13列為13個(gè)酒類特征,獲取其中兩列特征,并將其劃分成特征數(shù)組和類標(biāo)數(shù)組,調(diào)用concatenate()函數(shù)實(shí)現(xiàn)。
  • 3) KNN訓(xùn)練
    調(diào)用Sklearn機(jī)器學(xué)習(xí)包中KNeighborsClassifier()函數(shù)訓(xùn)練,設(shè)置K值為3類,并調(diào)用clf.fit(train_data,train_target)訓(xùn)練模型,clf.predict(test_data)預(yù)測(cè)分類結(jié)果。
  • 4) 評(píng)價(jià)算法
    通過(guò)classification_report()函數(shù)計(jì)算該分類預(yù)測(cè)結(jié)果的準(zhǔn)確率、召回率和F值。
  • 5) 創(chuàng)建網(wǎng)格
    由于繪圖中,擬將預(yù)測(cè)的類標(biāo)劃分為三個(gè)顏色區(qū)域,真實(shí)的分類結(jié)果以散點(diǎn)圖形式呈現(xiàn),故需要獲取數(shù)據(jù)集中兩列特征的最大值和最小值,并創(chuàng)建對(duì)應(yīng)的矩陣網(wǎng)格,調(diào)用numpy擴(kuò)展包的meshgrid()函數(shù)實(shí)現(xiàn),在對(duì)其顏色進(jìn)行預(yù)測(cè)。
  • 6) 繪圖可視化
    設(shè)置不同類標(biāo)的顏色,調(diào)用pcolormesh()函數(shù)繪制背景區(qū)域顏色,調(diào)用scatter()函數(shù)繪制實(shí)際結(jié)果的散點(diǎn)圖,形成如圖15的效果圖。

四.SVM分類算法

支持向量機(jī)(Support Vector Machine,簡(jiǎn)稱SVM)是常見的一種判別方法。在機(jī)器學(xué)習(xí)領(lǐng)域,是一個(gè)有監(jiān)督的學(xué)習(xí)模型,通常用來(lái)進(jìn)行模式識(shí)別、分類以及回歸分析。該算法的最大特點(diǎn)是根據(jù)結(jié)構(gòu)風(fēng)險(xiǎn)最小化準(zhǔn)則,以最大化分類間隔構(gòu)造最優(yōu)分類超平面來(lái)提高學(xué)習(xí)機(jī)的泛化能力,較好地解決了非線性、高維數(shù)、局部極小點(diǎn)等問(wèn)題。

1.SVM基礎(chǔ)知識(shí)

(1) 基礎(chǔ)概念
由于作者數(shù)學(xué)推算能力不太好,同時(shí)SVM原理也比較復(fù)雜,所以SVM算法基礎(chǔ)知識(shí)推薦大家閱讀CSDN博客著名算法大神“JULY”的文章《支持向量機(jī)通俗導(dǎo)論(理解SVM的三層境界)》,這篇文章由淺入深的講解了SVM算法,而本小節(jié)作者主要講解SVM的用法。

SVM分類算法的核心思想是通過(guò)建立某種核函數(shù),將數(shù)據(jù)在高維尋找一個(gè)滿足分類要求的超平面,使訓(xùn)練集中的點(diǎn)距離分類面盡可能的遠(yuǎn),即尋找一個(gè)分類面使得其兩側(cè)的空白區(qū)域最大。如圖19.16所示,兩類樣本中離分類面最近的點(diǎn)且平行于最優(yōu)分類面的超平面上的訓(xùn)練樣本就叫做支持向量。

(2) SVM導(dǎo)入方法
SVM分類算法在Sklearn機(jī)器學(xué)習(xí)包中,實(shí)現(xiàn)的類是 svm.SVC,即C-Support Vector Classification,它是基于libsvm實(shí)現(xiàn)的。構(gòu)造方法如下:

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',max_iter=-1, probability=False, random_state=None, shrinking=True,tol=0.001, verbose=False)

其中參數(shù)含義如下:

  • C表示目標(biāo)函數(shù)的懲罰系數(shù),用來(lái)平衡分類間隔margin和錯(cuò)分樣本的,默認(rèn)值為1.0;
  • cache_size是制定訓(xùn)練所需要的內(nèi)存(以MB為單位);
  • gamma是核函數(shù)的系數(shù),默認(rèn)是gamma=1/n_features;
  • kernel可以選擇RBF、Linear、Poly、Sigmoid,默認(rèn)的是RBF;
  • degree決定了多項(xiàng)式的最高次冪;
  • max_iter表示最大迭代次數(shù),默認(rèn)值為1;
  • coef0是核函數(shù)中的獨(dú)立項(xiàng);
  • class_weight表示每個(gè)類所占據(jù)的權(quán)重,不同的類設(shè)置不同的懲罰參數(shù)C,缺省為自適應(yīng);
  • decision_function_shape包括ovo(一對(duì)一)、ovr(多對(duì)多)或None(默認(rèn)值)。

SVC算法主要包括兩個(gè)步驟:

  • 訓(xùn)練:nbrs.fit(data, target)
  • 預(yù)測(cè):pre = clf.predict(data)

下面這段代碼是簡(jiǎn)單調(diào)用SVC分類算法進(jìn)行預(yù)測(cè)的例子,數(shù)據(jù)集中x和y坐標(biāo)為負(fù)數(shù)的類標(biāo)為1,x和y坐標(biāo)為正數(shù)的類標(biāo)為2,同時(shí)預(yù)測(cè)點(diǎn)[-0.8,-1]的類標(biāo)為1,點(diǎn)[2,1]的類標(biāo)為2。

import numpy as np from sklearn.svm import SVCX = np.array([[-1, -1], [-2, -2], [1, 3], [4, 6]]) y = np.array([1, 1, 2, 2]) clf = SVC() clf.fit(X, y) print(clf) print(clf.predict([[-0.8,-1], [2,1]]))#輸出結(jié)果:[1, 2]

支持向量機(jī)分類器還有其他的方法,比如NuSVC核支持向量分類,LinearSVC線性向量支持分類等,這里不再介紹。同時(shí),支持向量機(jī)也已經(jīng)推廣到解決回歸問(wèn)題,稱為支持向量回歸,比如SVR做線性回歸。


2.SVM分析紅酒數(shù)據(jù)

接著采用SVM分類算法對(duì)酒類數(shù)據(jù)集Wine進(jìn)行分析,并對(duì)比前面19.3小節(jié)的實(shí)例代碼,校驗(yàn)SVM分類算法和KNN分類算法的分析結(jié)果和可視化分析的優(yōu)劣。其分析步驟基本一致,主要包括如下六個(gè)步驟:

  • 第一步,加載數(shù)據(jù)集。采用loadtxt()函數(shù)加載酒類數(shù)據(jù)集,采用逗號(hào)(,)分割。
  • 第二步,劃分?jǐn)?shù)據(jù)集。將Wine數(shù)據(jù)集劃分為訓(xùn)練集和預(yù)測(cè)集,僅提取酒類13個(gè)特種中的兩列特征進(jìn)行數(shù)據(jù)分析。
  • 第三步,SVM訓(xùn)練。導(dǎo)入Sklearn機(jī)器學(xué)習(xí)包中svm.SVC()函數(shù)分析,調(diào)用fit()函數(shù)訓(xùn)練模型,predict(test_data)函數(shù)預(yù)測(cè)分類結(jié)果。
  • 第四步,評(píng)價(jià)算法。通過(guò)classification_report()函數(shù)計(jì)算該分類預(yù)測(cè)結(jié)果的準(zhǔn)確率、召回率和F值。
  • 第五步,創(chuàng)建網(wǎng)格。獲取數(shù)據(jù)集中兩列特征的最大值和最小值,并創(chuàng)建對(duì)應(yīng)的矩陣網(wǎng)格,用于繪制背景圖,調(diào)用numpy擴(kuò)展包的meshgrid()函數(shù)實(shí)現(xiàn)。
  • 第六步,繪圖可視化。設(shè)置不同類標(biāo)的顏色,調(diào)用pcolormesh()函數(shù)繪制背景區(qū)域顏色,調(diào)用scatter()函數(shù)繪制實(shí)際結(jié)果的散點(diǎn)圖。

完整代碼如下所示:

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 import os import numpy as np from sklearn.svm import SVC from sklearn import metrics import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap#---------------------------------------------------------------------------- #第一步 加載數(shù)據(jù)集 path = "wine/wine.txt" data = np.loadtxt(path,dtype=float,delimiter=",") print(data)#---------------------------------------------------------------------------- #第二步 劃分?jǐn)?shù)據(jù)集 yy, x = np.split(data, (1,), axis=1) #第一列為類標(biāo)yy,后面13列特征為x print(yy.shape, x.shape) y = [] for n in yy: #將類標(biāo)浮點(diǎn)型轉(zhuǎn)化為整數(shù)y.append(int(n)) x = x[:, :2] #獲取x前兩列數(shù)據(jù),方便繪圖 對(duì)應(yīng)x、y軸 train_data = np.concatenate((x[0:40,:], x[60:100,:], x[140:160,:]), axis = 0) #訓(xùn)練集 train_target = np.concatenate((y[0:40], y[60:100], y[140:160]), axis = 0) #樣本類別 test_data = np.concatenate((x[40:60, :], x[100:140, :], x[160:,:]), axis = 0) #測(cè)試集 test_target = np.concatenate((y[40:60], y[100:140], y[160:]), axis = 0) #樣本類別 print(train_data.shape, train_target.shape) print(test_data.shape, test_target.shape)#---------------------------------------------------------------------------- #第三步 SVC訓(xùn)練 clf = SVC() clf.fit(train_data,train_target) result = clf.predict(test_data) print(result)#---------------------------------------------------------------------------- #第四步 評(píng)價(jià)算法 print(sum(result==test_target)) #預(yù)測(cè)結(jié)果與真實(shí)結(jié)果比對(duì) print(metrics.classification_report(test_target, result)) #準(zhǔn)確率 召回率 F值#---------------------------------------------------------------------------- #第五步 創(chuàng)建網(wǎng)格 x1_min, x1_max = test_data[:,0].min()-0.1, test_data[:,0].max()+0.1 #第一列 x2_min, x2_max = test_data[:,1].min()-0.1, test_data[:,1].max()+0.1 #第二列 xx, yy = np.meshgrid(np.arange(x1_min, x1_max, 0.1), np.arange(x2_min, x2_max, 0.1)) #生成網(wǎng)格型數(shù)據(jù) z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) #---------------------------------------------------------------------------- #第六步 繪圖可視化 cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) #顏色Map cmap_bold = ListedColormap(['#000000', '#00FF00', '#FFFFFF']) plt.figure() z = z.reshape(xx.shape) print(xx.shape, yy.shape, z.shape, test_target.shape) plt.pcolormesh(xx, yy, z, cmap=cmap_light) plt.scatter(test_data[:,0], test_data[:,1], c=test_target,cmap=cmap_bold, s=50) plt.show()

代碼提取了178行數(shù)據(jù)的第一列作為類標(biāo),剩余13列數(shù)據(jù)作為13個(gè)特征的數(shù)據(jù)集,并劃分為訓(xùn)練集(100行)和測(cè)試集(78行)。輸出結(jié)果如下,包括78行SVM分類預(yù)測(cè)的類標(biāo)結(jié)果,其中61行數(shù)據(jù)類標(biāo)與真實(shí)的結(jié)果一致,其準(zhǔn)確率為0.78,召回率為0.78,F1特征為0.78。

最后可視化繪圖輸出如下圖所示的結(jié)果。


3.優(yōu)化SVM分析紅酒數(shù)據(jù)集

前面SVM分析紅酒數(shù)據(jù)集的代碼存在兩個(gè)缺點(diǎn),一是采用固定的組合方式劃分的數(shù)據(jù)集,即調(diào)用np.concatenate()函數(shù)將0-40、60-100、140-160行數(shù)據(jù)分割為訓(xùn)練集,其余為預(yù)測(cè)集;二是只提取了數(shù)據(jù)集中的兩列特征進(jìn)行SVM分析和可視化繪圖,即調(diào)用“x = x[:, :2]”獲取前兩列特征,而紅酒數(shù)據(jù)集共有13列特征。

真實(shí)的數(shù)據(jù)分析中通常會(huì)隨機(jī)劃分?jǐn)?shù)據(jù)集,分析過(guò)程也是對(duì)所有的特征進(jìn)行訓(xùn)練及預(yù)測(cè)操作,再經(jīng)過(guò)降維處理之后進(jìn)行可視化繪圖展示。下面對(duì)SVM分析紅酒數(shù)據(jù)集實(shí)例進(jìn)行簡(jiǎn)單的代碼優(yōu)化,主要包括:

  • 隨機(jī)劃分紅酒數(shù)據(jù)集
  • 對(duì)數(shù)據(jù)集的所有特征進(jìn)行訓(xùn)練和預(yù)測(cè)分析
  • 采用PCA算法降維后再進(jìn)行可視化繪圖操作

完整代碼如下,希望讀者也認(rèn)真學(xué)習(xí)該部分知識(shí),更好地優(yōu)化自己的研究或課題。

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 import os import numpy as np from sklearn.svm import SVC from sklearn import metrics import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn.model_selection import train_test_split from sklearn.decomposition import PCA#第一步 加載數(shù)據(jù)集 path = "wine/wine.txt" data = np.loadtxt(path,dtype=float,delimiter=",") print(data)#第二步 劃分?jǐn)?shù)據(jù)集 yy, x = np.split(data, (1,), axis=1) #第一列類標(biāo)yy,后面13列特征為x print(yy.shape, x.shape) y = [] for n in yy: y.append(int(n)) y = np.array(y, dtype = int) #list轉(zhuǎn)換數(shù)組 #劃分?jǐn)?shù)據(jù)集 測(cè)試集40% train_data, test_data, train_target, test_target = train_test_split(x, y, test_size=0.4, random_state=42) print(train_data.shape, train_target.shape) print(test_data.shape, test_target.shape)#第三步 SVC訓(xùn)練 clf = SVC() clf.fit(train_data, train_target) result = clf.predict(test_data) print(result) print(test_target)#第四步 評(píng)價(jià)算法 print(sum(result==test_target)) #預(yù)測(cè)結(jié)果與真實(shí)結(jié)果比對(duì) print(metrics.classification_report(test_target, result)) #準(zhǔn)確率 召回率 F值#第五步 降維操作 pca = PCA(n_components=2) newData = pca.fit_transform(test_data)#第六步 繪圖可視化 plt.figure() cmap_bold = ListedColormap(['#000000', '#00FF00', '#FFFFFF']) plt.scatter(newData[:,0], newData[:,1], c=test_target, cmap=cmap_bold, s=50) plt.show()

輸出結(jié)果如下所示,其準(zhǔn)確率、召回率和F值很低,僅為50%、39%和23%。

(106L, 13L) (106L,) (72L, 13L) (72L,) [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] [1 1 3 1 2 1 2 3 2 3 1 3 1 2 1 2 2 2 1 2 1 2 2 3 3 3 2 2 2 1 1 2 3 1 1 1 33 2 3 1 2 2 2 3 1 2 2 3 1 2 1 1 3 3 2 2 1 2 1 3 2 2 3 1 1 1 3 1 1 2 3] 28precision recall f1-score support1 1.00 0.04 0.07 262 0.38 1.00 0.55 273 0.00 0.00 0.00 19avg / total 0.50 0.39 0.23 72

上述代碼如下采用決策樹進(jìn)行分析,則其準(zhǔn)確率、召回率和F值就很高,結(jié)果如下所示。所以并不是每種分析算法都適應(yīng)所有的數(shù)據(jù)集,不同數(shù)據(jù)集其特征不同,最佳分析的算也會(huì)不同,我們?cè)谶M(jìn)行數(shù)據(jù)分析時(shí),通常會(huì)對(duì)比多種分析算法,再優(yōu)化自己的實(shí)驗(yàn)和模型。

from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() print(metrics.classification_report(test_target, result))# precision recall f1-score support # # 1 0.96 0.88 0.92 26 # 2 0.90 1.00 0.95 27 # 3 1.00 0.95 0.97 19 # #avg / total 0.95 0.94 0.94 72

SVM算法分析后輸出的圖形如下所示。


五.各模型分類對(duì)比實(shí)驗(yàn)

算法評(píng)價(jià)和對(duì)比實(shí)驗(yàn)是深度學(xué)習(xí)重要的知識(shí)點(diǎn),這里作者對(duì)各種機(jī)器學(xué)習(xí)分類算法進(jìn)行對(duì)比,以鳶尾花數(shù)據(jù)集為例,我們從繪制的分類邊界效果以及實(shí)驗(yàn)評(píng)估指標(biāo)(Precision、Recall、F1-socre)分別進(jìn)行對(duì)比。參考文章如下,推薦大家學(xué)習(xí):

  • 機(jī)器學(xué)習(xí)之sklearn基本分類方法 - 萌弟老師

1.決策樹

原始代碼如下:

# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-06 # 該部分參考知乎萌弟老師:https://zhuanlan.zhihu.com/p/173945775 import numpy as np from sklearn import metrics from sklearn import datasets import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn.model_selection import train_test_split from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler#------------------------------------------------------------------------ #第一步 導(dǎo)入數(shù)據(jù) iris = datasets.load_iris() X = iris.data[:,[2,3]] y = iris.target print("Class labels:",np.unique(y)) #打印分類類別的種類 [0 1 2]#30%測(cè)試數(shù)據(jù) 70%訓(xùn)練數(shù)據(jù) stratify=y表示訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)具有相同的類別比例 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1,stratify=y)#------------------------------------------------------------------------ #第二步 數(shù)據(jù)標(biāo)準(zhǔn)化 sc = StandardScaler() #估算訓(xùn)練數(shù)據(jù)中的mu和sigma sc.fit(X_train) #使用訓(xùn)練數(shù)據(jù)中的mu和sigma對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化 X_train_std = sc.transform(X_train) X_test_std = sc.transform(X_test) print(X_train_std) print(X_test_std)#------------------------------------------------------------------------ #第三步 可視化函數(shù) 畫出決策邊界 def plot_decision_region(X,y,classifier,resolution=0.02):markers = ('s','x','o','^','v')colors = ('red','blue','lightgreen','gray','cyan')cmap = ListedColormap(colors[:len(np.unique(y))])# plot the decision surfacex1_min,x1_max = X[:,0].min()-1,X[:,0].max()+1x2_min,x2_max = X[:,1].min()-1,X[:,1].max()+1xx1,xx2 = np.meshgrid(np.arange(x1_min,x1_max,resolution),np.arange(x2_min,x2_max,resolution))Z = classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)Z = Z.reshape(xx1.shape)plt.contourf(xx1,xx2,Z,alpha=0.3,cmap=cmap)plt.xlim(xx1.min(),xx1.max())plt.ylim(xx2.min(),xx2.max())# plot class samplesfor idx,cl in enumerate(np.unique(y)):plt.scatter(x=X[y==cl,0],y = X[y==cl,1],alpha=0.8,c=colors[idx],marker = markers[idx],label=cl,edgecolors='black')#------------------------------------------------------------------------ #第四步 決策樹分類 from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier(criterion='gini',max_depth=4,random_state=1) tree.fit(X_train_std,y_train) print(X_train_std.shape, X_test_std.shape, len(y_train), len(y_test)) #(105, 2) (45, 2) 105 45 res1 = tree.predict(X_test_std) print(res1) print(metrics.classification_report(y_test, res1, digits=4)) #四位小數(shù)plot_decision_region(X_train_std,y_train,classifier=tree,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('DecisionTreeClassifier') plt.legend(loc='upper left') plt.show()

實(shí)驗(yàn)的精確率、召回率和F1值輸出如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示,可以看到分類效果明顯。


2.KNN

核心代碼如下:

  • macro avg: 0.98 0.98 0.98
#第五步 KNN分類 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=2,p=2,metric="minkowski") knn.fit(X_train_std,y_train) res2 = knn.predict(X_test_std) print(res2) print(metrics.classification_report(y_test, res2, digits=4)) #四位小數(shù)plot_decision_region(X_train_std,y_train,classifier=knn,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('KNeighborsClassifier') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示:


3.SVM

核心代碼如下:

#第六步 SVM分類 核函數(shù)對(duì)非線性分類問(wèn)題建模(gamma=0.20) from sklearn.svm import SVC svm = SVC(kernel='rbf',random_state=1,gamma=0.20,C=1.0) #較小的gamma有較松的決策邊界 svm.fit(X_train_std,y_train) res3 = svm.predict(X_test_std) print(res3) print(metrics.classification_report(y_test, res3, digits=4))plot_decision_region(X_train_std,y_train,classifier=svm,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('SVM') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9361 0.9333 0.9340
precision recall f1-score support0 1.0000 0.9333 0.9655 151 0.9333 0.9333 0.9333 152 0.8750 0.9333 0.9032 15accuracy 0.9333 45macro avg 0.9361 0.9333 0.9340 45 weighted avg 0.9361 0.9333 0.9340 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示:

如果使用的核函數(shù)gamma為100,然后實(shí)現(xiàn)非線性分類,則繪制結(jié)果如下圖所示:

  • svm = SVC(kernel=‘rbf’,random_state=1,gamma=100.0,C=1.0,verbose=1)

引用萌弟老師的結(jié)論,非常土建大家去關(guān)注他。
從不同的gamma取值的圖像來(lái)看:對(duì)于高斯核函數(shù),增大gamma值,將增大訓(xùn)練樣本的影響范圍,導(dǎo)致決策邊界緊縮和波動(dòng);較小的gamma值得到的決策邊界相對(duì)寬松。雖然較大的gamma值在訓(xùn)練樣本中有很小的訓(xùn)練誤差,但是很可能泛化能力較差,容易出現(xiàn)過(guò)擬合。


4.邏輯回歸

核心代碼如下:

#第七步 邏輯回歸分類 from sklearn.linear_model import LogisticRegression lr = LogisticRegression(C=100.0,random_state=1) lr.fit(X_train_std,y_train) res4 = lr.predict(X_test_std) print(res4) print(metrics.classification_report(y_test, res4, digits=4))plot_decision_region(X_train_std,y_train,classifier=lr,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('LogisticRegression') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示:


5.樸素貝葉斯

核心代碼如下:

#第八步 樸素貝葉斯分類 from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() gnb.fit(X_train_std,y_train) res5 = gnb.predict(X_test_std) print(res5) print(metrics.classification_report(y_test, res5, digits=4))plot_decision_region(X_train_std,y_train,classifier=gnb,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('GaussianNB') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示,還挺好看的,邊界呈曲線分布。


6.隨機(jī)森林

核心代碼如下:

#第九步 隨機(jī)森林分類 from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier(criterion='gini',n_estimators=25,random_state=1,n_jobs=2,verbose=1) forest.fit(X_train_std,y_train) res6 = gnb.predict(X_test_std) print(res6) print(metrics.classification_report(y_test, res6, digits=4))plot_decision_region(X_train_std,y_train,classifier=forest,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('GaussianNB') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示:


7.AdaBoost

核心代碼如下:

#第十步 集成學(xué)習(xí)分類 from sklearn.ensemble import AdaBoostClassifier ada = AdaBoostClassifier() ada.fit(X_train_std,y_train) res7 = ada.predict(X_test_std) print(res7) print(metrics.classification_report(y_test, res7, digits=4))plot_decision_region(X_train_std,y_train,classifier=forest,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('AdaBoostClassifier') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示:


8.GradientBoosting

核心代碼如下:

#第11步 GradientBoosting分類 from sklearn.ensemble import GradientBoostingClassifier gb = GradientBoostingClassifier() ada.fit(X_train_std,y_train) res8 = ada.predict(X_test_std) print(res8) print(metrics.classification_report(y_test, res8, digits=4))plot_decision_region(X_train_std,y_train,classifier=forest,resolution=0.02) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.title('GradientBoostingClassifier') plt.legend(loc='upper left') plt.show()

輸出結(jié)果如下:

  • macro avg: 0.9792 0.9778 0.9778
precision recall f1-score support0 1.0000 1.0000 1.0000 151 0.9375 1.0000 0.9677 152 1.0000 0.9333 0.9655 15accuracy 0.9778 45macro avg 0.9792 0.9778 0.9778 45 weighted avg 0.9792 0.9778 0.9778 45

繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示:


9.實(shí)驗(yàn)結(jié)果對(duì)比

最后通常需要對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行對(duì)比,由于數(shù)據(jù)集比較少,所有效果都比較好,這里不太好進(jìn)行對(duì)比實(shí)驗(yàn)。簡(jiǎn)單給出兩張對(duì)比結(jié)果圖,但方法是類似的。隨著作者深入會(huì)分享更多相關(guān)文章。


六.本章小結(jié)

寫到這里,這篇文章就結(jié)束了,您是否對(duì)分類更好的認(rèn)識(shí)呢?
聚類是通過(guò)定義一種距離度量方法,表示兩個(gè)東西的相似程度,然后將類內(nèi)相似度高且類間相似度低的數(shù)據(jù)放在一個(gè)類中,它是不需要標(biāo)注結(jié)果的無(wú)監(jiān)督學(xué)習(xí)算法。與之不同,分類是需要標(biāo)注類標(biāo)的,屬于有監(jiān)督學(xué)習(xí),它表示收集某一類數(shù)據(jù)的共有特征,找出區(qū)分度大的特征,用這些特征對(duì)要分類的數(shù)據(jù)進(jìn)行分類,并且由于是標(biāo)注結(jié)果的,可以通過(guò)反復(fù)地訓(xùn)練來(lái)提升分類算法。

常見的分類算法包括樸素貝葉斯、邏輯回歸、決策樹、支持向量機(jī)等。常見應(yīng)用比如通過(guò)分析市民歷史公交卡交易數(shù)據(jù)來(lái)分類預(yù)測(cè)乘客的出行習(xí)慣和偏好;京東從海量商品圖片中提取圖像特征,通過(guò)分類給用戶推薦商品和廣告,比如“找同款”應(yīng)用;基于短信文本內(nèi)容的分類智能化識(shí)別垃圾短信及其變種,防止騷擾手機(jī)用戶;搜索引擎通過(guò)訓(xùn)練用戶的歷史查詢?cè)~和用戶屬性標(biāo)簽(如性別、年齡、愛(ài)好),構(gòu)建分類算法來(lái)預(yù)測(cè)新增用戶的屬性及偏好等。不同的分類算法有不同的優(yōu)劣,希望讀者下來(lái)編寫代碼體會(huì)不同的分類算法的特點(diǎn)。

最后希望讀者能復(fù)現(xiàn)每一行代碼,只有實(shí)踐才能進(jìn)步。同時(shí)更多聚類算法和原理知識(shí),希望讀者下來(lái)自行深入學(xué)習(xí)研究,也推薦大家結(jié)合Sklearn官網(wǎng)和開源網(wǎng)站學(xué)習(xí)更多的機(jī)器學(xué)習(xí)知識(shí)。

該系列所有代碼下載地址:

  • https://github.com/eastmountyxz/Python-zero2one

感謝在求學(xué)路上的同行者,不負(fù)遇見,勿忘初心。這周的留言感慨~

(By:娜璋之家 Eastmount 2021-07-10 夜于武漢 https://blog.csdn.net/Eastmount )


參考文獻(xiàn):

  • [1] 楊秀璋. 專欄:知識(shí)圖譜、web數(shù)據(jù)挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
  • [2] 張良均,王路,譚立云,蘇劍林. Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)[M]. 北京:機(jī)械工業(yè)出版社,2016.
  • [3] (美)Wes McKinney著. 唐學(xué)韜等譯. 利用Python進(jìn)行數(shù)據(jù)分析[M]. 北京:機(jī)械工業(yè)出版社,2013.
  • [4] Jiawei Han,Micheline Kamber著. 范明,孟小峰譯. 數(shù)據(jù)挖掘概念與技術(shù). 北京:機(jī)械工業(yè)出版社,2007.
  • [5] 楊秀璋. [Python數(shù)據(jù)挖掘課程] 四.決策樹DTC數(shù)據(jù)分析及鳶尾數(shù)據(jù)集分析[EB/OL].(2016-10-15)[2017-11-26]. http://blog.csdn.net/eastmount/article/details/52820400.
  • [6] 楊秀璋. [Python數(shù)據(jù)挖掘課程] 五.線性回歸知識(shí)及預(yù)測(cè)糖尿病實(shí)例[EB\OL]. (2016-10-28)[2017-11-26]. http://blog.csdn.net/eastmount/article/details/52929765.
  • [7] jackywu1010. 分類算法概述與比較[EB/OL]. (2011-12-09)[2017-11-26]. http://blog.csdn.net/jackywu1010/article/details/7055561.
  • [8] 百度百科. 鄰近算法[EB/OL]. (2015-09-16)[2017-11-26]. https://baike.baidu.com/item/鄰近算法/1151153?fr=aladdin.
  • [9] 楊秀璋. [python數(shù)據(jù)挖掘課程] 十九.鳶尾花數(shù)據(jù)集可視化、線性回歸、決策樹花樣分析[EB/OL]. (2017-12-02)[2017-12-02]. http://blog.csdn.net/eastmount/article/
    details/78692227.
  • [10]楊秀璋. [python數(shù)據(jù)挖掘課程] 二十.KNN最近鄰分類算法分析詳解及平衡秤TXT數(shù)據(jù)集讀取[EB/OL]. (2017-12-08)[2017-12-08]. http://blog.csdn.net/eastmount/article/
    details/78747128.
  • [11] lsldd. 用Python開始機(jī)器學(xué)習(xí)(4:KNN分類算法)[EB/OL]. (2014-11-23)[2017-11-26]. http://blog.csdn.net/lsldd/article/details/41357931.
  • [12] UCI官網(wǎng). UCI Machine Learning Repository: Wine Data Set[EB/OL]. (2017)[2017-12-08]. http://archive.ics.uci.edu/ml/datasets/Wine.
  • [13]楊秀璋. [python數(shù)據(jù)挖掘課程] 二十一.樸素貝葉斯分類器詳解及中文文本輿情分析[EB/OL]. (2018-01-24)[2018-01-24]. http://blog.csdn.net/eastmount/article/
    details/79128235.
  • [14] scikit-learn官網(wǎng). Nearest Neighbors Classification scikit-learn[EB\OL]. (2017)[2017-12-08]. http://scikit-learn.org/stable/auto_examples/neighbors/
    plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py.
  • [15]July大神. 支持向量機(jī)通俗導(dǎo)論(理解SVM的三層境界)[EB/OL]. http://blog.csdn.net/v_JULY_v/article/details/7624837.

總結(jié)

以上是生活随笔為你收集整理的[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产精品成久久久久三级 | 日韩欧美在线免费 | 亚洲精品久久久久久久不卡四虎 | 久久精品视频播放 | 久久亚洲二区 | 亚洲最大av网站 | 成人黄色片免费 | 国产成人精品久 | 超碰久热 | 2021国产精品视频 | 欧美孕交vivoestv另类 | 波多野结衣一区二区三区中文字幕 | 国产一区二区在线免费视频 | 日本高清免费中文字幕 | 精品免费观看视频 | 天天干夜夜爱 | 亚洲国产成人精品在线 | 国产一区二区不卡视频 | 2019中文| 久久av中文字幕片 | 日日干影院| av日韩精品 | 国产日韩av在线 | 精品国产理论 | 中文字幕日韩av | 欧美久久久一区二区三区 | 亚洲国产网站 | www黄免费 | 久久国产露脸精品国产 | 国产精品刺激对白麻豆99 | 久久理论电影网 | 6080yy精品一区二区三区 | 亚洲国产欧美在线人成大黄瓜 | 日韩在线中文字幕视频 | 激情网站五月天 | 日韩免费看 | 日韩免费播放 | 韩国精品福利一区二区三区 | 国产中文字幕网 | 日韩伦理片一区二区三区 | 成人网444ppp | 黄色日本片 | av电影在线观看完整版一区二区 | 国产最新在线观看 | 国产精品久久久久久妇 | 天天操天天爱天天干 | 在线免费视频一区 | 欧美精品久久久久久久亚洲调教 | 久视频在线 | 一级片色播影院 | 日韩欧美国产免费播放 | 日韩综合一区二区三区 | 97超碰人人澡| 精品久久久久久久久久久久久久久久久久 | 欧美日韩中 | 国产精品久久一卡二卡 | 亚洲人精品午夜 | 狠狠色狠狠色综合日日小说 | 精品9999 | 国产精品麻豆视频 | 极品久久久久 | 亚洲免费精品一区二区 | 午夜av日韩 | 黄色av免费 | 天堂av在线 | 国产原创91| 日韩免费视频在线观看 | 日本三级久久久 | 亚洲狠狠操| 亚洲国产中文在线 | 97天天干 | 欧美日在线 | 免费精品视频在线观看 | 亚洲精品国产精品国自产在线 | 国产黄色看片 | 911国产| 在线观看精品一区 | 午夜精品中文字幕 | 国产在线一区二区 | 国产一级精品视频 | 国产黄色片在线免费观看 | 中文字幕国产一区 | 97看片网| 国产高清专区 | 四虎成人免费观看 | 五月婷婷久久丁香 | 一级免费黄视频 | 天天激情综合网 | 九九热中文字幕 | 久久视频精品在线观看 | 深夜福利视频一区二区 | 午夜精品福利一区二区三区蜜桃 | 国产99久久久欧美黑人 | 国产三级精品三级在线观看 | 99热播精品 | 国产又粗又猛又爽又黄的视频免费 | 久久天天躁夜夜躁狠狠85麻豆 | www日韩视频 | 操操操干干干 | 五月婷婷综合久久 | 日日爽天天爽 | 91在线资源 | 色综合天天 | 国产一区二区精品久久 | 色婷婷99 | 久99久精品视频免费观看 | 久久精品亚洲 | 国模视频一区二区三区 | 91桃色在线免费观看 | 亚洲一区久久 | 1024在线看片 | 国产午夜精品一区二区三区在线观看 | 丁香六月婷婷 | 日韩美一区二区三区 | 一区二区电影网 | 最新超碰在线 | 久久精品国产免费看久久精品 | 黄色视屏在线免费观看 | 欧美性网站 | 免费视频网 | 精品视频免费 | 91丨精品丨蝌蚪丨白丝jk | 国产一区二区三区免费观看视频 | 在线观看黄污 | 久久理论视频 | 国产精品丝袜在线 | 国产视频第二页 | 成人四虎影院 | 综合色婷婷 | 亚洲电影免费 | 成人黄色电影免费观看 | 精品国产一区二区三区在线观看 | 国产亚洲精品久久 | 99re久久资源最新地址 | 成人av中文字幕在线观看 | 精品1区2区3区 | 黄色网大全 | www.天天射| 精品久久久影院 | 中字幕视频在线永久在线观看免费 | 亚洲色图激情文学 | 日韩综合精品 | 99亚洲国产 | 亚洲mv大片欧洲mv大片免费 | 中文字幕在线第一页 | 国产精品久久久久久婷婷天堂 | 五月婷婷操 | 永久免费观看视频 | 欧美日韩国产一区二区在线观看 | 夜夜操夜夜干 | 中文字幕av一区二区三区四区 | 久久黄色影院 | 亚洲国产福利视频 | 日女人免费视频 | 黄色毛片网站在线观看 | adn—256中文在线观看 | www.com黄色| 国产69精品久久app免费版 | 国产精品久久久久久久久久久久久 | 免费观看视频的网站 | 午夜久久久影院 | 亚洲乱码国产乱码精品天美传媒 | 精品国产网址 | 精品美女久久久久 | 中文字幕2021 | 中文字幕乱码在线播放 | 在线观看亚洲 | 99精品视频精品精品视频 | 亚洲国产日韩在线 | 99热超碰| 精品国产一区二区三区久久久 | 日韩电影一区二区三区在线观看 | 中文字幕亚洲精品在线观看 | 91漂亮少妇露脸在线播放 | 久久综合九色综合97婷婷女人 | 亚洲精品视频在线观看免费 | 欧美精品久久久久久久久免 | 亚洲国产成人久久综合 | 日韩欧美电影网 | 国产成人精品亚洲日本在线观看 | 99情趣网视频 | 免费观看9x视频网站在线观看 | 亚洲国产成人精品久久 | 国产高清不卡一区二区三区 | 99精品欧美一区二区蜜桃免费 | 在线小视频 | 日韩免费精品 | 国产成人三级一区二区在线观看一 | 久久久精品欧美一区二区免费 | a天堂免费| 国产精品不卡av | 最近高清中文字幕 | 日本久久99| 成人h在线观看 | 91av视频在线免费观看 | 久久视频这里有久久精品视频11 | 久草在线欧美 | 91人人澡人人爽 | 亚洲国产欧美在线看片xxoo | 婷婷久久综合九色综合 | 四虎在线免费观看 | 97超碰人人| 永久免费毛片在线观看 | 成年人天堂com| 成年人视频免费在线播放 | 亚洲91中文字幕无线码三区 | 中文字幕免费一区二区 | 人人艹视频 | 超碰av在线免费观看 | 欧美一级片免费在线观看 | 91精品国产九九九久久久亚洲 | 中文字幕亚洲欧美日韩2019 | 国产午夜精品一区二区三区四区 | 日韩r级电影在线观看 | 日韩精品一卡 | 欧美日韩高清在线 | 国产剧在线观看片 | 成人在线免费小视频 | 97国产精品视频 | 欧美成人h版 | 夜夜骑首页 | 亚洲成年人av | 最新极品jizzhd欧美 | 国产精品一区二区美女视频免费看 | 免费观看性生活大片 | 99精品色 | 久久精品国产亚洲aⅴ | 色网免费观看 | 久草.com| 国产高清中文字幕 | 99久视频 | 日韩高清免费无专码区 | 激情深爱 | 一区二区三区高清在线观看 | 亚洲综合在线视频 | 97超碰站| 在线看免费 | 免费观看黄色12片一级视频 | 麻豆免费精品视频 | 欧美日韩久久 | 国产色妞影院wwwxxx | www五月| 91传媒91久久久 | 99国产视频 | 国产精品黄色影片导航在线观看 | 麻豆精品在线 | 日韩在线观看第一页 | 激情开心色 | 在线看毛片网站 | 国产黄色一级大片 | 亚洲色图激情文学 | 国产精品私人影院 | 日本一区二区免费在线观看 | 亚洲黄色片一级 | 玖草影院 | 91成人在线看 | 精品资源在线 | 中文国产成人精品久久一 | 日韩精品播放 | 国产精品系列在线观看 | 黄av在线 | 天天操狠狠操夜夜操 | 色网免费观看 | 久久久久成人精品亚洲国产 | 国产精品手机在线播放 | 久久久久久久久毛片精品 | 麻豆久久久久久久 | 韩国精品福利一区二区三区 | 久久综合桃花 | av中文在线 | 一级c片| 人人爽爽人人 | 久久国色夜色精品国产 | 一区二区不卡高清 | 日韩免费成人av | 波多野结衣网址 | 国产精品每日更新 | 日韩av电影手机在线观看 | 91精品国产乱码 | 久久草视频 | 91香蕉国产 | 亚洲国产欧美一区二区三区丁香婷 | 伊人五月天.com | 欧美国产日韩一区二区 | 综合国产视频 | 草久久精品 | 国产视频亚洲视频 | 亚洲人人射| 精品久久久久久亚洲综合网站 | 曰韩精品| 国产精品二区在线观看 | 99久久精品日本一区二区免费 | 亚洲精品国产精品国自产观看浪潮 | 久草a视频 | 天天操天天怕 | 深爱激情五月综合 | 9在线观看免费高清完整版在线观看明 | 久久精品一区八戒影视 | 成人丁香花 | 日韩精品久久久久久久电影99爱 | 99爱爱| 婷婷久久网站 | 国产精品国产三级国产aⅴ入口 | 欧美在线视频一区二区三区 | 国产精品成人一区二区三区 | av免费观看网址 | 黄色毛片视频 | av在线免费观看黄 | 欧美精品一级视频 | 玖玖在线视频观看 | 亚洲激情综合 | 超碰97人人干 | 免费色视频| 天天色天天操综合 | 色综合久久久久网 | 99在线高清视频在线播放 | 亚洲在线a | 国产成人精品久久久久 | 狠狠色狠狠色合久久伊人 | 日韩深夜在线观看 | 欧美成人69av | 在线免费日韩 | 欧美另类视频 | 欧美性视频网站 | 国产黄色理论片 | 激情黄色av| 国产主播大尺度精品福利免费 | 中文在线免费视频 | 国产在线更新 | av千婊在线免费观看 | 成人影片免费 | 国产一级特黄毛片在线毛片 | 欧美性春潮 | 深爱开心激情网 | 久久人人97超碰国产公开结果 | 久久综合五月婷婷 | 国产精品白丝av | 午夜av免费在线观看 | 国产96在线观看 | 91福利视频久久久久 | 最近免费中文字幕 | 欧美俄罗斯性视频 | 日韩av视屏| 亚洲欧美观看 | 天天操天天艹 | 中文字幕在线电影 | 免费观看完整版无人区 | 国产麻豆果冻传媒在线观看 | 亚洲精品久久久久58 | 国产精品免费观看在线 | 久久高清国产 | 在线视频婷婷 | 日韩专区av | 免费视频你懂得 | 奇米网在线观看 | 亚洲一区日韩精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久a级片| 天天操天天干天天综合网 | 欧美最猛性xxxx| 就要干b | 九九日九九操 | 亚洲自拍自偷 | 免费黄色av电影 | 精品国产一区在线观看 | 日韩在线免费播放 | 在线观看视频一区二区三区 | 91久久国产自产拍夜夜嗨 | 97精品在线视频 | 国产亚洲午夜高清国产拍精品 | 亚洲黄色一级电影 | 久久久久免费精品国产小说色大师 | 国产黄色视| 欧美日韩一级久久久久久免费看 | 国产高清视频在线播放 | 成 人 黄 色 视频播放1 | 在线观看视频免费大全 | 免费看麻豆 | 麻豆国产精品va在线观看不卡 | 精品日韩在线 | 99视频精品免费观看, | 国产黄色片在线免费观看 | 精品国产123| 狠狠操狠狠干天天操 | 91麻豆精品国产91久久久久久久久 | 激情视频在线观看网址 | 九九九热精品 | 91高清视频 | 最新av电影网址 | 91精品在线视频 | 香蕉视频在线观看免费 | 国产精品久久久久影院日本 | 欧美一级xxxx | 欧美电影黄色 | 国产高清久久久久 | 免费v片| 日韩精品久久久 | 五月天狠狠操 | 91福利视频网站 | 97av在线视频 | 国产精品中文字幕在线观看 | 999视频网站 | 中文字幕在线视频一区二区三区 | 免费色av | 日韩理论片在线观看 | 日韩av男人的天堂 | 8090yy亚洲精品久久 | 中文字幕中文字幕 | 亚洲1区在线 | 国产精品亚洲片在线播放 | 国产在线观看你懂得 | 一区中文字幕在线观看 | 欧美日韩在线观看一区二区 | 亚洲黄电影| 天天干天天操天天做 | 中文字幕视频播放 | 免费试看一区 | 国产精品白浆 | 91精品视频在线免费观看 | 亚州av网站| 在线视频中文字幕一区 | 在线视频 成人 | 久久国产精品二国产精品中国洋人 | 色综合天天综合网国产成人网 | 欧美日本三级 | 国产 一区二区三区 在线 | 激情深爱五月 | 亚洲成人午夜在线 | 久久免费黄色 | 在线国产中文字幕 | 久久精品99国产 | 9幺看片 | 麻豆av电影 | 视频一区二区免费 | 久久黄色网页 | 色综合国产 | 亚洲精品在线国产 | av成人免费网站 | 黄色一级大片在线免费看产 | 九九热只有精品 | 黄色毛片网站在线观看 | 亚洲人成人99网站 | 国产九九精品视频 | 91网免费看 | 久草在线手机视频 | 高清免费在线视频 | 日本中文字幕在线 | 日韩在线电影 | 三级黄色网址 | 免费看片网址 | 在线黄色免费av | 国产一区二区三精品久久久无广告 | 亚洲精品视频免费在线观看 | 91精品电影| 日韩视频1区 | 婷婷综合亚洲 | 午夜精品一区二区三区免费视频 | 激情五月亚洲 | 国产精品免费观看国产网曝瓜 | 国产精品久久久久久久久久三级 | 最新av免费在线观看 | 最近中文国产在线视频 | 一本一本久久a久久精品牛牛影视 | 中文字幕免费中文 | 日韩精品久久久久 | 五月婷婷综合色拍 | 在线中文字幕电影 | 五月婷婷一区 | 毛片网在线 | 国产中出在线观看 | 91人人网| 精品一区二区6 | 久久久久欠精品国产毛片国产毛生 | 91九色国产蝌蚪 | 精品91在线 | 日本在线h | 国产精品久久久久久一二三四五 | 国产午夜激情视频 | 日韩电影在线视频 | 一级性视频 | 91九色国产视频 | 中文字幕一区二区三区四区视频 | 国产精品久久久久久久久大全 | av 一区二区三区 | 国产精品免费人成网站 | 黄免费在线观看 | 国产一级免费视频 | 国际精品久久久 | 99久久婷婷国产精品综合 | 精品色999 | 在线精品在线 | 日韩欧美在线影院 | 久久在现视频 | 在线高清av | avv天堂| 国产一区二区三区午夜 | 国产综合香蕉五月婷在线 | 99久久99久久精品国产片 | 免费男女羞羞的视频网站中文字幕 | 亚洲三级性片 | 91黄视频在线观看 | 香蕉影院在线观看 | 一区二区视频在线播放 | 国产精品自在欧美一区 | 91xav| 婷婷色在线观看 | 毛片1000部免费看 | 国产精品久久久久久久毛片 | 免费日韩一区二区 | 久久综合婷婷国产二区高清 | 欧美日韩国产在线 | 国产资源精品在线观看 | 中文字幕在线久一本久 | 美女免费视频黄 | 久久久一本精品99久久精品66 | 69av在线视频 | av色一区| 黄色视屏av| 91麻豆网| 又黄又网站 | 99精品欧美一区二区蜜桃免费 | 九九视频精品免费 | 天天爽综合网 | 福利视频精品 | 亚洲综合视频在线 | 精品久久免费看 | 韩国av免费观看 | av在线com| 美女精品国产 | 91视频-88av| 欧美日韩视频在线观看一区二区 | 九九在线视频免费观看 | 日韩在线播放视频 | 欧美福利视频一区 | 99久久精品免费看国产 | 国产精品69av | 国产人成精品一区二区三 | 五月天激情综合 | 五月天网站在线 | 日韩欧美在线观看一区二区三区 | 亚洲精品国产第一综合99久久 | 香蕉网站在线观看 | 一区二区三区在线免费观看视频 | 亚洲黄污 | www婷婷 | 91精品色 | 久久综合久久综合九色 | 国产少妇在线观看 | 中文资源在线观看 | 在线看国产一区 | 日本久久精品 | 久久激情电影 | 久久丁香网 | 992tv在线 | 99久久爱 | 色偷偷888欧美精品久久久 | 久草久草视频 | 亚洲激情在线 | 日韩国产欧美视频 | 五月黄色 | 九九亚洲视频 | 国产一区二区三区视频在线 | 久草在线视频资源 | 五月婷网 | 国产高清永久免费 | 精品国产一区二区三区日日嗨 | 美女视频免费一区二区 | 欧美二区视频 | 国产精品免费一区二区三区在线观看 | 亚洲精品一区二区三区四区高清 | 成人黄性视频 | 国产亚洲一区二区三区 | 日韩影视大全 | 日韩av不卡在线播放 | 九九热中文字幕 | 国产69精品久久app免费版 | 99av国产精品欲麻豆 | 手机成人在线 | 久久久美女 | 色综合久久久久综合 | www.91国产| www色网站 | 色多多视频在线观看 | 免费在线观看一级片 | 日本激情视频中文字幕 | 色综合天天做天天爱 | 九九免费精品视频在线观看 | 日韩最新中文字幕 | 日韩在线观看一区二区三区 | 天天天天色综合 | 久久久久久久久久电影 | av电影在线免费观看 | wwxxxx日本| 中文字幕91在线 | 在线免费91 | 亚洲精品激情 | 伊人天天干 | 国产在线精品一区 | 亚洲午夜久久久久久久久电影网 | 国产精品免费久久久久久 | 色网免费观看 | 日韩精品一区二区在线观看视频 | 操操操综合 | 精品免费一区二区三区 | 国产成人精品福利 | 天天射网 | 九九免费精品视频在线观看 | www九九热 | 色综合天天做天天爱 | 麻豆系列在线观看 | 久久久久看片 | 国产黄色a | 成人国产精品一区 | 日韩欧美国产精品 | 99久久精品免费看国产 | 国产精品久久久久久吹潮天美传媒 | 久久精品中文字幕免费mv | 免费看91的网站 | 亚洲我射av| 国产网红在线观看 | 97免费| 亚洲三级影院 | 国产精品情侣视频 | 国产精品久久电影观看 | 国产精品美女视频网站 | 久久影院中文字幕 | 中文字幕在线播出 | 亚洲丁香日韩 | 色一级片 | 伊人婷婷综合 | 中文字幕亚洲欧美日韩 | 伊人五月综合 | 色婷婷骚婷婷 | 免费三级骚 | 国产精品高潮呻吟久久av无 | 日韩免费播放 | 天天干天天摸天天操 | 国产精品九九久久99视频 | 亚洲一区二区视频在线 | 色多视频在线观看 | 夜夜躁狠狠躁日日躁视频黑人 | 特级a老妇做爰全过程 | 啪啪精品| 亚洲资源片 | 久久久久黄 | 999久久久久久久久6666 | 国产精品成人免费精品自在线观看 | 亚洲精品xxx | 日韩免费视频线观看 | 国产一区二区在线免费播放 | 国产裸体视频网站 | 日韩精品一区二区在线观看 | 国产色视频| 精品国产aⅴ麻豆 | 国产精品成人免费精品自在线观看 | 欧美精品乱码久久久久久按摩 | 免费亚洲成人 | 激情黄色一级片 | 国产色小视频 | 国产精品爽爽久久久久久蜜臀 | 伊人五月综合 | 日韩免费观看高清 | av福利免费 | 亚洲一区久久 | 亚洲精品在线播放视频 | 久草久草在线观看 | 日韩一二区在线观看 | av一区二区三区在线 | av福利免费| 亚洲一级免费电影 | 国产精品一区一区三区 | 最近免费中文字幕大全高清10 | 成人免费91 | 久久免费视频1 | 一级黄色a视频 | 久久久久久久久久电影 | 日韩成人免费观看 | 国产精品一区二区免费看 | 少妇性bbb搡bbb爽爽爽欧美 | 久久久 精品 | 一区二区三区在线观看 | 91av久久| 色噜噜日韩精品一区二区三区视频 | 欧美日本在线视频 | av片中文 | 国产韩国日本高清视频 | 亚洲成色 | 日韩免费电影网站 | 国产高清一 | 在线观看中文字幕第一页 | 91麻豆精品国产91久久久久久 | 久久久久久久久久久网 | av黄色免费看 | 国产福利久久 | 四虎影视精品 | 久久久免费视频播放 | 免费看色的网站 | 欧美日韩精 | 久久成人视屏 | 成人av直播 | 五月天伊人 | 久久久久久久久影院 | 欧洲精品久久久久毛片完整版 | 五月开心综合 | 亚洲国产免费看 | 欧美日韩免费观看一区=区三区 | 天天插天天干天天操 | 另类老妇性bbwbbw高清 | 蜜臀av网址| 日本在线观看黄色 | www.夜夜操.com| 国产在线色视频 | 一区av在线播放 | 久久综合九色综合97_ 久久久 | 激情五月开心 | 久久成人免费 | 日韩毛片在线免费观看 | 天天草综合| 黄色软件在线观看免费 | 国产黄色观看 | 黄色精品一区二区 | 日韩精品一卡 | 日日干美女 | 激情偷乱人伦小说视频在线观看 | 日韩免费播放 | 亚洲韩国一区二区三区 | 亚洲综合在 | 日韩精品高清视频 | 国产 中文 日韩 欧美 | 日本精品久久久久久 | 午夜影院一级片 | 91九色视频在线观看 | 欧美一级电影在线观看 | 狠狠精品| 天天干婷婷| 91看片在线 | www.啪啪.com| 久久国产成人午夜av影院宅 | 欧美夫妻生活视频 | 麻豆视频在线观看 | 亚洲作爱视频 | 国产资源中文字幕 | 亚洲精品欧美专区 | 激情婷婷丁香 | 日韩中文字幕91 | 国产精品色在线 | 综合中文字幕 | 免费在线观看日韩欧美 | 349k.cc看片app | 天天操欧美 | www.久久久.com| 中文字幕精品久久 | 亚洲一级黄色av | 中文十次啦 | 欧美日韩在线精品 | 亚洲精品资源在线观看 | 亚洲国产精品影院 | 亚色视频在线观看 | 天天做天天干 | av短片在线观看 | 成人黄色大片网站 | 亚洲国产经典视频 | 久久激情视频 | 免费看v片 | 精品在线免费视频 | 91成人午夜| 激情中文字幕 | 亚洲永久在线 | 天天干人人 | 在线免费观看黄色小说 | 亚洲电影第一页av | 欧美日韩一级视频 | 91av视频在线免费观看 | 婷五月激情 | 国产精品免费在线播放 | 久久国产精品免费观看 | 美女网站在线观看 | 日韩成人在线一区二区 | 亚洲国产网站 | 国产精品美女www爽爽爽视频 | 成人久久久久久久久久 | 亚洲成人软件 | 免费看91的网站 | 99精品国产福利在线观看免费 | 玖玖综合网 | 亚洲精品乱码久久久久久写真 | 九九热av | 91精品国产高清自在线观看 | 国产精品网红直播 | 天天射天天操天天干 | 久久九九影视 | 久久99视频免费观看 | 中文资源在线观看 | 日韩av在线小说 | 91秒拍国产福利一区 | 国产日本在线播放 | 97高清免费视频 | 碰超在线97人人 | 人人干,人人爽 | 亚洲精品影视在线观看 | 毛片的网址| 精品久久美女 | 国产一区二区播放 | 97精品国产97久久久久久免费 | 伊人伊成久久人综合网小说 | 欧美激精品 | 亚洲高清视频在线播放 | 九九免费观看全部免费视频 | 日韩三级在线观看 | 国产一二区视频 | 精品福利视频在线观看 | 久久久久久片 | 91亚洲在线观看 | 亚洲韩国一区二区三区 | 久久99国产精品自在自在app | 久久精品高清视频 | 免费一级黄色 | 亚洲91精品 | 国产精品亚洲人在线观看 | 九九精品无码 | 激情欧美一区二区三区免费看 | 国产手机在线播放 | 久久精品国产一区 | 免费黄av| 欧美日韩高清一区二区 国产亚洲免费看 | 久久人人做 | 亚洲一级久久 | 亚洲经典中文字幕 | 在线观看黄网站 | 99999精品 | 午夜国产一区二区 | 国语精品免费视频 | 天天综合成人网 | 中文字幕麻豆 | 亚洲 精品在线视频 | 欧美中文字幕久久 | 91爱看片 | 亚洲成人av电影在线 | 久久久久久久福利 | 99色免费视频| 午夜精品久久久久久久99 | 丝袜精品视频 | 中文字幕在线中文 | 亚洲国产日韩精品 | 亚洲精品在线视频播放 | 一区二区电影网 | 91精品久久香蕉国产线看观看 | 蜜臀91丨九色丨蝌蚪老版 | 日本久久久久久久久久 | 亚洲影视九九影院在线观看 | 中文字幕在线观看的网站 | 一级免费看视频 | 日韩一级电影在线观看 | 国产精品1区2区3区在线观看 | 欧美激情视频一区二区三区免费 | 九九热在线视频免费观看 | 在线视频福利 | 免费黄色av | 美女网站视频免费黄 | 免费成人在线视频网站 | 五月婷婷综合在线观看 | 一级精品视频在线观看宜春院 | 亚洲色综合| 欧美aaaxxxx做受视频 | 四虎在线免费观看 | 亚洲一级片av | 欧美日韩亚洲在线 | 亚洲精品在线观看的 | 永久黄网站色视频免费观看w | 碰天天操天天 | 日韩中文字幕免费 | 97中文字幕 | 欧美一级电影在线观看 | 国内精品视频一区二区三区八戒 | 日韩 在线a | 国产无吗一区二区三区在线欢 | 在线播放一区二区三区 | 狠狠的操狠狠的干 | 免费看污的网站 | 天天操天天是 | 久久久麻豆精品一区二区 | 国产成人一级电影 | 国产日产欧美在线观看 | 成人avav| 日韩精品一区二区在线观看 | 热热热热热色 | 中文字幕在线观看网址 | 成人动漫精品一区二区 | 欧美视频国产视频 | 免费观看一级成人毛片 | 日韩乱码中文字幕 | 亚洲精品在线观看视频 | 在线观看播放av | 国产又粗又硬又长又爽的视频 | 在线观看视频日韩 | 97成人精品视频在线观看 | 亚洲国产人午在线一二区 | 黄色小说网站在线 | 亚洲黄色三级 | 国产精品欧美日韩在线观看 | 久久午夜影院 | 国产高清不卡av | 国产一级电影 | 欧美精品在线一区 | 亚洲一区二区三区在线看 | 成人在线中文字幕 | 色综合中文综合网 | 欧美成人猛片 | 激情开心站 | 久久与婷婷 | 少妇精品久久久一区二区免费 | www.亚洲精品在线 | 99久久久国产精品免费观看 | 日韩av看片 | 亚洲japanese制服美女 | 欧美精品久久久 | 91在线精品播放 | 国产区高清在线 | 日韩中文字幕视频在线 | 久久久三级视频 | 西西44人体做爰大胆视频 | 日韩精品一区二区久久 | 国产精品青青 | www.天天射 | 不卡的av在线 | 亚洲91中文字幕无线码三区 | 亚洲黄色小说网址 | 五月婷婷视频 | 黄网站免费久久 | 国产一二三区av | 国产精品久久久久一区二区国产 | 狠狠色伊人亚洲综合网站色 | 五月天国产精品 | 最近免费中文视频 | 又黄又爽又刺激视频 | 久久久久久综合网天天 | 国产精品一区二区久久国产 | 亚洲精品综合一二三区在线观看 | 日韩簧片在线观看 | www.超碰97.com | 九九久久久久久久久激情 | 欧美网址在线观看 | 久久久久久久网站 | www久久国产 | 99色在线视频 | 国内偷拍精品视频 | 日本久久久久久久久 | 亚洲爱爱视频 | 色婷婷激情电影 | 天天射综合网站 | 亚洲国产精品推荐 | 99c视频高清免费观看 | 在线观看视频亚洲 | 国产日本亚洲 | 久久五月激情 | 日本电影黄色 | 亚洲va韩国va欧美va精四季 | 免费观看一级特黄欧美大片 | 狠狠五月婷婷 | 午夜精品一二区 | 蜜臀av免费一区二区三区 | 91成人在线网站 | 五月婷婷亚洲 | 另类五月激情 | 精品久久一| 免费影视大全推荐 | 激情综合色播五月 | 国产一区二区三区在线免费观看 | 久久精品国产精品 | 亚洲成人av电影在线 | 日韩在线观看视频一区二区三区 | 伊人网av| 中文字幕精品一区久久久久 | 国产一二区在线观看 | 最新中文字幕在线观看视频 | 在线播放日韩 | 狠狠躁日日躁夜夜躁av | 成年人av在线播放 | 超碰在线最新网址 | 日日插日日干 | 国产高清综合 | 特黄色大片| av大片免费在线观看 | 亚洲精品女人久久久 | 久久极品 | 97视频人人澡人人爽 | 免费毛片一区二区三区久久久 | 黄色大片免费网站 | 精品一区二区在线观看 | 久青草视频在线观看 | 国产98色在线 | 日韩 | 天天玩夜夜操 | 久久伊人精品天天 | 人人精品久久 | av在线超碰 | 国产精品video | 亚洲精品理论片 | 国产精品第 |