[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
歡迎大家來(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)圖。
輸出結(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)輸出如下:
- 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ù),代碼如下:
輸出如下所示:
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核心代碼如下:
預(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)圖和背景圖,完整代碼如下。
輸出結(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)造方法如下:
其中參數(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 72SVM算法分析后輸出的圖形如下所示。
五.各模型分類對(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
繪制的訓(xùn)練數(shù)據(jù)分類效果如下圖所示,可以看到分類效果明顯。
2.KNN
核心代碼如下:
- macro avg: 0.98 0.98 0.98
輸出結(jié)果如下:
- macro avg: 0.9792 0.9778 0.9778
繪制的訓(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
繪制的訓(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
繪制的訓(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
繪制的訓(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
繪制的訓(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
繪制的訓(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
繪制的訓(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)題。
- 上一篇: [Python从零到壹] 十三.机器学习
- 下一篇: [Python人工智能] 三十.Kera