Python機(jī)器學(xué)習(xí)基礎(chǔ)PPT完整全套教學(xué)課件_第1頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)PPT完整全套教學(xué)課件_第2頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)PPT完整全套教學(xué)課件_第3頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)PPT完整全套教學(xué)課件_第4頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)PPT完整全套教學(xué)課件_第5頁
已閱讀5頁,還剩534頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Python機(jī)器學(xué)習(xí)基礎(chǔ)第1章概述第2章Python機(jī)器學(xué)習(xí)的使用第3章監(jiān)督學(xué)習(xí)第4章無監(jiān)督學(xué)習(xí)第5章數(shù)據(jù)預(yù)處理與特征工程第6章模型評估及改進(jìn)第7章算法鏈第8章文本數(shù)據(jù)處理全套PPT課件第1章概述1.1什么是機(jī)器學(xué)習(xí)1.2機(jī)器學(xué)習(xí)的算法1.3監(jiān)督學(xué)習(xí)1.4無監(jiān)督學(xué)習(xí)1.5數(shù)據(jù)集1.6機(jī)器學(xué)習(xí)項(xiàng)目的流程1.7小結(jié)1.1什么是機(jī)器學(xué)習(xí)

機(jī)器學(xué)習(xí)(machinelearning)它屬于人工智能的一個(gè)分支,因由統(tǒng)計(jì)學(xué)發(fā)展而來,算法中包含了大量的統(tǒng)計(jì)學(xué)知識(shí)和理論,所以又被稱為統(tǒng)計(jì)學(xué)習(xí)(statisticallearning)。

北方人理想體重=(身高cm-150)×0.6+50(kg)南方人理想體重=(身高cm-150)×0.6+48(kg)

機(jī)器學(xué)習(xí)還可以利用機(jī)器來模擬人類的思維進(jìn)行工作,來適應(yīng)不同環(huán)境下的各種工作,以實(shí)現(xiàn)人類難以完成的工作。通過機(jī)器學(xué)習(xí)來處理問題,不但減少了錯(cuò)誤率,還省去了人力,機(jī)器全面取代人類的夢想必然會(huì)向前邁出實(shí)質(zhì)性的一步。這就是研究機(jī)器學(xué)習(xí)的目的和意義。1.2機(jī)器學(xué)習(xí)的算法

監(jiān)督學(xué)習(xí)(SupervisedLearning)無監(jiān)督學(xué)習(xí)(UnsupervisedLearning)。

監(jiān)督學(xué)習(xí)

監(jiān)督學(xué)習(xí)是通過已經(jīng)訓(xùn)練的數(shù)據(jù)來訓(xùn)練模型。如果一組訓(xùn)練數(shù)據(jù),已知輸入和對應(yīng)的輸出,通過算法訓(xùn)練,從而可以得到一個(gè)最優(yōu)的模型。然后在輸入一個(gè)新的數(shù)據(jù),監(jiān)督學(xué)習(xí)算法就會(huì)根據(jù)模型做出相應(yīng)的預(yù)測,這樣就能得到一個(gè)最優(yōu)的預(yù)測。這類算法往往用于預(yù)測性研究。

無監(jiān)督學(xué)習(xí)

無監(jiān)督學(xué)習(xí)被稱為“沒有老師的學(xué)習(xí)”,沒有訓(xùn)練的過程,同時(shí)數(shù)據(jù)也只有輸入,沒有對應(yīng)的輸出,直接通過數(shù)據(jù)根據(jù)算法進(jìn)行建模分析,意味著這些都是要通過機(jī)器學(xué)習(xí)自行學(xué)習(xí)探索。這聽起來似乎有點(diǎn)不可思議,但是在我們自身認(rèn)識(shí)世界的過程中也會(huì)用到無監(jiān)督學(xué)習(xí)。這類算法往往用于探究性研究,去用于尋找各種方法。

半監(jiān)督學(xué)習(xí)

半監(jiān)督學(xué)習(xí)是監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)相結(jié)合而產(chǎn)生的一種學(xué)習(xí)方法。它主要考慮如何利用少量的標(biāo)注數(shù)據(jù)和大量的未標(biāo)注數(shù)據(jù)進(jìn)行訓(xùn)練和分類的問題,其算法主要是在監(jiān)督學(xué)習(xí)上進(jìn)行擴(kuò)展,半監(jiān)督學(xué)習(xí)對于提高學(xué)習(xí)機(jī)器性能具有非常重大的實(shí)際意義。

1.3監(jiān)督學(xué)習(xí) 分類(Classification)算法 回歸(Regression)算法

分類與回歸的差異就是分類預(yù)測的標(biāo)簽往往是間斷的,也就是說我們將輸入變量映射到離散類別。

回歸問題預(yù)測的標(biāo)簽往往是連續(xù)的,也就是說我們將輸入數(shù)據(jù)映射到一些連續(xù)函數(shù)上。

1.4無監(jiān)督學(xué)習(xí)

聚類算法

降維

聚類算法是無監(jiān)督學(xué)習(xí)中典型的一種算法,聚類算法可以根據(jù)數(shù)據(jù)的特征來進(jìn)行建模。

降維的原理就是將數(shù)據(jù)從高維空間映射到低維空間。1.5數(shù)據(jù)集 數(shù)據(jù)集的集合。在監(jiān)督學(xué)習(xí)中,會(huì)將數(shù)據(jù)集劃分為訓(xùn)練集和測試集,有時(shí)也會(huì)分為訓(xùn)練集、驗(yàn)證集和測試集。

訓(xùn)練集是用來擬合模型,通過設(shè)置分類器的參數(shù),訓(xùn)練分類模型。后續(xù)結(jié)合驗(yàn)證集作用時(shí),會(huì)選出同一參數(shù)的不同取值,擬合出多個(gè)分類器。

驗(yàn)證集用是當(dāng)通過訓(xùn)練集訓(xùn)練出多個(gè)模型后,為了能找出效果最佳的模型,使用各個(gè)模型對驗(yàn)證集數(shù)據(jù)進(jìn)行預(yù)測,并記錄模型準(zhǔn)確率。選出效果最佳的模型所對應(yīng)的參數(shù)。

測試集用來最終評估模式識(shí)別系統(tǒng)的性能和分類能力。即可以把測試集當(dāng)做從來不存在的數(shù)據(jù)集,當(dāng)已經(jīng)確定模型參數(shù)后,可以使用測試集進(jìn)行模型預(yù)測并評估模型的性能。三者本質(zhì)無任何區(qū)別,但劃分的作用是為了能夠泛化(generalize)出更好的模型。泛化、過擬合、欠擬合

泛化是指一個(gè)算法通過數(shù)據(jù)集對新數(shù)據(jù)的預(yù)測能力的好壞,在監(jiān)督學(xué)習(xí)中,我們知道算法訓(xùn)練數(shù)據(jù)后會(huì)構(gòu)建模型,如果我們此時(shí)通過構(gòu)建的模型來預(yù)測一些測試集數(shù)據(jù)的標(biāo)簽,如果對于每一個(gè)測試集數(shù)據(jù)都能精確預(yù)測,就說這個(gè)模型能夠從訓(xùn)練集泛化到測試集。

過擬合就是根據(jù)數(shù)據(jù)構(gòu)建的模型的復(fù)雜度過高,對于應(yīng)用于實(shí)際的問題,太多不必要的特征,從而導(dǎo)致機(jī)器并沒有沒有理解數(shù)據(jù)間存在的規(guī)律。

欠擬合就是構(gòu)建模型的復(fù)雜度過低,不能很好的解決實(shí)際問題。

1.6機(jī)器學(xué)習(xí)項(xiàng)目的流程分析問題,獲取數(shù)據(jù)數(shù)據(jù)預(yù)處理特征工程訓(xùn)練模型與調(diào)優(yōu)模型評估模型融合上線運(yùn)行一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目含有以上步驟,但不一定含有所有以上步驟

分析問題,獲取數(shù)據(jù) 當(dāng)?shù)玫揭粋€(gè)問題的時(shí)候,首先要將問題轉(zhuǎn)化為機(jī)器學(xué)習(xí)能夠處理的問題,機(jī)器學(xué)習(xí)訓(xùn)練的過程非常耗時(shí),所以我們仔細(xì)尋找合適的數(shù)據(jù)和選擇機(jī)器學(xué)習(xí)的目標(biāo)是分類、回歸還是聚類。此時(shí)得到的數(shù)據(jù)經(jīng)決定了我們機(jī)器學(xué)習(xí)結(jié)果的上限,所以數(shù)據(jù)要選擇具有代表性的否則會(huì)產(chǎn)生過擬合。

數(shù)據(jù)預(yù)處理 在實(shí)際中我們得到的數(shù)據(jù),并不像庫中或者比賽中的數(shù)據(jù),得到數(shù)據(jù)之后還需人工分析數(shù)據(jù)的格式是否符合要求,是否存在空值、缺失值,是否需要該特征等,然后進(jìn)行歸一化、離散化、缺失值處理、去除共線性等,這些工作簡單可復(fù)制,收益穩(wěn)定可預(yù)期,是機(jī)器學(xué)習(xí)的基礎(chǔ)必備步驟。

特征工程 數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個(gè)上限而已。特征工程在機(jī)器學(xué)習(xí)中也起著非常重要的作用,它也是在做數(shù)據(jù)處理,只不過是通過特征提取、特征選擇、降維把數(shù)據(jù)處理成更為直接的被使用的數(shù)據(jù)。

訓(xùn)練模型與調(diào)優(yōu) 真正考驗(yàn)水平的根據(jù)對算法的理解調(diào)節(jié)參數(shù),使模型達(dá)到最優(yōu)。模型診斷中至關(guān)重要的是判斷過擬合、欠擬合,常見的方法是繪制學(xué)習(xí)曲線,交叉驗(yàn)證。通過增加訓(xùn)練的數(shù)據(jù)量、降低模型復(fù)雜度來降低過擬合的風(fēng)險(xiǎn),提高特征的數(shù)量和質(zhì)量、增加模型復(fù)雜來防止欠擬合。診斷后的模型需要進(jìn)行進(jìn)一步調(diào)優(yōu),調(diào)優(yōu)后的新模型需要重新診斷,這是一個(gè)反復(fù)迭代不斷逼近的過程,需要不斷的嘗試,進(jìn)而達(dá)到最優(yōu)的狀態(tài)。

模型評估 模型驗(yàn)證和誤差分析也是機(jī)器學(xué)習(xí)中非常重要的一步,通過測試數(shù)據(jù),驗(yàn)證模型的有效性,觀察誤差樣本,分析誤差產(chǎn)生的原因,由算法訓(xùn)練建立的模型,作用到測試集上檢驗(yàn)?zāi)P偷木_度。若檢驗(yàn)不合格,重新返回到算法進(jìn)行學(xué)習(xí),直至得到的模型比較精確,往往能使得我們找到提升算法性能的突破點(diǎn)。誤差分析主要是分析出誤差來源與數(shù)據(jù)、特征、算法。

模型融合

一般來說實(shí)際中,成熟的機(jī)器算法也就那么些,提升算法的準(zhǔn)確度主要方法是模型的前端(特征工程、清洗、預(yù)處理、采樣)和后端的模型融合。在機(jī)器學(xué)習(xí)比賽中模型融合非常常見,基本都能使得效果有一定的提升。

上線運(yùn)行 這一部分內(nèi)容主要跟工程實(shí)現(xiàn)的相關(guān)性比較大。工程上是結(jié)果導(dǎo)向,模型在線上運(yùn)行的效果直接決定模型的成敗。不單純包括其準(zhǔn)確程度、誤差等情況,還包括其運(yùn)行的速度(時(shí)間復(fù)雜度)、資源消耗程度(空間復(fù)雜度)、穩(wěn)定性是否可接受。1.7小結(jié)

通過本章的學(xué)習(xí),我們應(yīng)該對機(jī)器學(xué)習(xí)有了一定的認(rèn)識(shí),本章要求掌握機(jī)器學(xué)習(xí)的相關(guān)概念,并對機(jī)器學(xué)習(xí)項(xiàng)目的流程能有一定的了解。THANKS第2章Python機(jī)器學(xué)習(xí)的使用2.1Python語言介紹2.2Python平臺(tái)搭建2.3Python入門2.4Python庫的使用2.5小結(jié)2.1Python語言介紹

Python作為一門開源語言使用廣泛,入手非??煺Z法簡單,簡單易讀,是一種解釋性強(qiáng)、交互式、面向?qū)ο?、跨平臺(tái)的語言。Python被稱為“膠水語言”,不僅可以使用Python編程,還可以使用C語言、C++編寫,他把耗時(shí)的代碼交給C/C++等高效率的語言進(jìn)行實(shí)現(xiàn),然后通過粘合來使用,這樣就使得Python運(yùn)行時(shí)間得到簡化。Python還具有列表、元組、字典等核心數(shù)據(jù)類型,以及集合、隊(duì)列等無需進(jìn)一步編程就能直接使用。由于Python可以應(yīng)用到多個(gè)領(lǐng)域,功能比較廣泛,可擴(kuò)展性強(qiáng),所以基于Python生成了非常多的第三方庫,這些庫Python本身不帶,運(yùn)用時(shí)需要先安裝,然后才能導(dǎo)入,Python包含了大量的第三方庫可以運(yùn)用到機(jī)器學(xué)習(xí),比如:圖形庫,數(shù)學(xué)函數(shù)庫,機(jī)器學(xué)習(xí)算法庫等。2.2Python平臺(tái)搭建Python適用于多個(gè)平臺(tái),并且擁有多個(gè)版本,可以根據(jù)平臺(tái)選擇合適的版本Python可以通過官方網(wǎng)站下載:/Python下載軟件安裝第三方庫的安裝2.3Python入門數(shù)據(jù)類型基本運(yùn)算控制語句復(fù)雜數(shù)據(jù)類型函數(shù)數(shù)據(jù)類型數(shù)值型a=123print(a)a=3.14print(a)a=1.23456890print("{:0.2f}".format(a))字符串str='thisisaprogram'print(str[0])print(str[-1])print(str[0:4])print(len(str))print(str)print("{2}{1}{3}".format("this","is","a","program"))在Python中有兩種索引方式,一種是正索引,一種是負(fù)索引,我們既可以通過正索引進(jìn)行查詢,也可以通過負(fù)索引進(jìn)行查詢。在進(jìn)行切片操作時(shí),一般通過如下方式:object[start_index:end_index:step]step:步數(shù),其正負(fù)值決定了切片方向。start_index:開始索引(包括自身)。end_index:結(jié)束索引(不包括自身)。布爾類型 空值true=True a=Nonefalse=False

print(a)print(true)print(false)基本運(yùn)算基本運(yùn)算符a=1+2print(a)a=1-2print(a)a=1*2print(a)a=1/2print(a)a=1//2print(a)a=1%2print(a)a=10**32print(a)多變量賦值a=1b=2a,b=b,a+bprint(a,b)控制語句條件控制語句year=int(input("請輸入年份:"))ifyear%4==0andyear%100!=0:print("{}年isleap".format(year))elifyear%400==0:print("{}年isleap".format(year))else:print("{}年isn'tleap".format(year))循環(huán)控制語句foriinrange(5):print(i)條件循環(huán)n=5while(n):print(n)n=n-1復(fù)雜數(shù)據(jù)類型列表(list)、元組(tuple)、字典(dict)、集合(set)列表:列表是可變的數(shù)據(jù)類型,在創(chuàng)建列表后可以添加、刪除或者搜索數(shù)據(jù),在Python中用[]表示。list=['a','b','c']print(list)list.append('d')print(list)list.extend('e')print(list)list.remove('e')print(list)元組:元祖和列表相似,但元組不可變。即不能添加或刪除元組內(nèi)的信息,但元組可以嵌套。在Python中用()表示。list=['b','c']tuple=('a',list,'d')print(tuple)list.remove('c')print(tuple)tuple[1].append('c')print(tuple)字典:字典是可變的,其數(shù)據(jù)類型包括鍵和值,鍵和值之間用“:”隔開,每個(gè)元素間以“,”隔開。且字典中的鍵是唯一的。在Python中用{}表示。dict={'a':1,'b':2,'c':'three'}print(dict.keys())print(dict.values())print(dict['c'])dict['c']=3print(dict['c'])dict.setdefault('d',4)print(dict)dict.pop('a')print(dict)dict.clear()print(dict)集合:集合與字典類似,但只包含鍵,沒有對應(yīng)的值,且包含的鍵不能重復(fù)。在Python中用set()或{}表示,set()中可以是列表、元組、字符串等。s=set([1,2,3])print(s)s={1,2,3}print(s)s=set("aabbc")print(s)函數(shù):函數(shù)在任何時(shí)候都非常重要,能夠自己建立函數(shù)解決機(jī)器學(xué)習(xí)問題,是一件不容易的事。我們先介紹Python中函數(shù)的語法:Python中建立函數(shù)利用def作為關(guān)鍵字開頭,然后后面跟函數(shù)名、參數(shù)、“()”、“:”等,通過縮進(jìn)表示函數(shù)內(nèi)的內(nèi)容。deffun(n):ifn==1orn==0:return1else:returnn*fun(n-1)print(fun(5))2.4Python庫的使用scikit-learnmglearnnumpyscipypandasmatplotlibGraphvizscikit-learnscikit-learn簡稱為sklearn,是機(jī)器學(xué)習(xí)最重要的一個(gè)機(jī)器學(xué)習(xí)庫,包括了大量的機(jī)器學(xué)習(xí)算法,而且還包括了大量的小型數(shù)據(jù)集,節(jié)省了獲取數(shù)據(jù)集所花費(fèi)的時(shí)間,使新手很容易上手,因而成為了廣泛應(yīng)用的重要的機(jī)器學(xué)習(xí)庫。sklearn還包括了許多功能,例如:分類任務(wù)、回歸任務(wù)、聚類任務(wù)、降維任務(wù)、模型選擇和數(shù)據(jù)的預(yù)處理。mglearn機(jī)器學(xué)習(xí)主要運(yùn)用到這個(gè)庫的兩個(gè)方面,一是利用matlotlib作圖時(shí),庫中有配置好的cm2、cm3配色方案,二是庫中有加載和獲取常用數(shù)據(jù)集、人工生成數(shù)據(jù)集的模板load,可以引用sklearn.datasets模塊。numpynumpy支持高級大量的維度數(shù)組與矩陣運(yùn)算,它要求列表中所有元素類型都是相同的,然后將列表轉(zhuǎn)化成相對應(yīng)的數(shù)組進(jìn)行運(yùn)算。而且具有矢量運(yùn)算能力,快速、節(jié)省空間。此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫。建立列表importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]print(data)將列表轉(zhuǎn)換為數(shù)組importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]ndarray=np.array(data)print(ndarray.shape)print(ndarray)比較兩者的運(yùn)算importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]ndarray=np.array(data)print("data數(shù)據(jù):\n{}".format(data*2))print("ndarray數(shù)據(jù):\n{}".format(ndarray*2))對數(shù)組進(jìn)行切片importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]ndarray=np.array(data)print(ndarray[1,2])print(ndarray[1,:])print(ndarray[:,2])scipyscipy建立在numpy的基礎(chǔ)之上,用于數(shù)學(xué)、科學(xué)、工程領(lǐng)域的第三方庫。它主要用于用于有效計(jì)算numpy矩陣,使numpy和scipy協(xié)同工作,高效解決問題。如統(tǒng)計(jì)、優(yōu)化、數(shù)值積分、圖像處理、信號(hào)處理以及常微分方程數(shù)值解的求解功能。建立稀疏矩陣importnumpyfromscipyimportsparsea=[[1,0,0,2],[0,0,3,0],[0,3,0,0]]a=numpy.array(a)print(a)轉(zhuǎn)換importnumpyfromscipyimportsparsea=[[1,0,0,2],[0,0,3,0],[0,3,0,0]]a=numpy.array(a)array=sparse.csr_matrix(a)print(array)pandaspandas也是基于numpy創(chuàng)建的一個(gè)為了解決數(shù)據(jù)分析任務(wù)的一種數(shù)據(jù)處理工具。pandas是一款最具有統(tǒng)計(jì)意義的統(tǒng)計(jì)包,它納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具和大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。pandas常用的是series,dataframe,panel等,分別用來處理一維、二維和三維數(shù)據(jù),應(yīng)用最多的是dataframe,它能將numpy數(shù)組或者字典轉(zhuǎn)化為類似于表格的類型,有行標(biāo)簽和列標(biāo)簽。importnumpyasnpimportpandasaspdarray=[[1,2],[3,4]]array=np.array(array)row=['r1','r2']col=['c1','c2']dataframe=pd.DataFrame(array,row,col)print(dataframe)importpandasaspddic={'name':["zhao","qian","sun","li"],'sex':['m','f','f','m']}dic=pd.DataFrame(dic)print(dic)matplotlibmatplotlib是一款繪圖工具,用于繪制散點(diǎn)圖、直方圖、線型圖等,類似于matlab,有matlab基礎(chǔ)的同學(xué)能夠快速上手matplotlib。importmatplotlib.pyplotaspltimportnumpyasnpdata=np.random.randn(200)plt.hist(data)plt.xlabel("XLabel")plt.ylabel("YLabel")plt.title("Title")plt.show()importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(-10,10)y=np.abs(x)plt.plot(x,y)plt.xlabel("XLabel")plt.ylabel("YLabel")plt.title("Title")plt.show()importmatplotlib.pyplotaspltimportnumpyasnpx=np.random.random(20)y=np.random.random(20)plt.scatter(x,y)plt.show()GraphvizGraphviz和matplotlib一樣是圖形繪制工具。在做數(shù)據(jù)可視化的時(shí)候用到了Graphviz庫,往往用于生成決策樹、流程圖。2.5小結(jié)通過本章的學(xué)習(xí),我們應(yīng)該對Python有了一定的了解。本章要求掌握Python的基本語法規(guī)則,了解各種庫的基本功能。THANKS第2章監(jiān)督學(xué)習(xí)3.1K近鄰算法3.2線性回歸3.3嶺回歸3.4LASSON回歸3.5邏輯回歸3.6樸素貝葉斯算法3.7決策樹3.8隨機(jī)森林3.9核支持向量機(jī)3.10神經(jīng)網(wǎng)絡(luò)3.11分類器的不確定性3.12小結(jié)3.1K近鄰算法

K近鄰(K-NearestNeighbor,KNN)算法是分類算法中最簡單的算法,也是一種理論很成熟的機(jī)器學(xué)習(xí)算法,算法的核心思想是“近朱者赤,近墨者黑”。即KNN算法會(huì)根據(jù)訓(xùn)練集的數(shù)據(jù)構(gòu)建一個(gè)模型,然后對于輸入的新數(shù)據(jù),算法會(huì)將新數(shù)據(jù)的特征與訓(xùn)練集中對應(yīng)的特征進(jìn)行比對匹配,在訓(xùn)練集中找到與之相對較為相似的k個(gè)數(shù)據(jù),判斷未知樣本的標(biāo)簽。如果一個(gè)樣本在特征空間中的k個(gè)最相鄰的樣本中的大多數(shù)屬于某一個(gè)標(biāo)簽,則該樣本也屬于這個(gè)類別,并具有這個(gè)類別上樣本的特性。

那么問題來了,這k個(gè)臨近的樣本是如何計(jì)算出來的,當(dāng)樣本中一半屬于A標(biāo)簽,一半屬于B標(biāo)簽的情況下如何處理呢?

KNN算法有多個(gè)參數(shù),但算法中主要有三個(gè)參數(shù)比較重要,分別是算法中的k值n_neighbors,權(quán)重weights,度量距離方法的選擇p、metric,只要這三個(gè)要素確定了,算法的預(yù)測方式也就確定了。分類決策

算法的分類決策規(guī)則通常采用多數(shù)表決法,即由樣本中k個(gè)鄰近最多的類別決定輸入數(shù)據(jù)的類別。如果存在恰好臨近多種類別的個(gè)數(shù)相同,這時(shí)權(quán)重weights就起到了作用,通過給臨近距離加權(quán)從中選擇一個(gè),這也是算法風(fēng)險(xiǎn)較小的原因。由于一般不改變,遇到相同的情況比較小或者可以改變k值再次預(yù)測,所以我們把重點(diǎn)放在距離度量方式和k值選擇上。距離度量

在KNN算法中,常用的距離度量方式有三種,分別為曼哈頓距離、歐式距離和閔可夫斯基距離,默認(rèn)使用歐氏距離,最常用的也是歐式距離。下面是三種距離度量的公式,其中x1,x2,……,xn,y1,y2,……,yn分別是兩個(gè)數(shù)據(jù)點(diǎn)的特征值。

距離的選擇有兩個(gè)參數(shù)控制,一個(gè)是p值,一個(gè)是metric。當(dāng)metric=“minkowski”,p為2時(shí)是歐氏距離,p是1時(shí),是曼哈頓距離,p為其他值時(shí)是閔可夫斯基距離,從公式可以看出,歐氏距離、曼哈頓距離是閔可夫斯基的特例。k值選擇

k值大小的選擇是非常重要的要素之一。當(dāng)k=1時(shí),稱算法為最近鄰算法。

當(dāng)選擇的k值較小時(shí),就相當(dāng)于用較小的領(lǐng)域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測,訓(xùn)練誤差近似誤差小,泛化誤差會(huì)增大。預(yù)測結(jié)果對近鄰的實(shí)例點(diǎn)非常敏感,若此時(shí)近鄰的實(shí)例點(diǎn)是噪聲,預(yù)測就會(huì)出錯(cuò)。換句話說,k值較小就意味著整體模型變得復(fù)雜,容易發(fā)生過擬合。

k值較大,就相當(dāng)于用較大領(lǐng)域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測,泛化誤差小,但缺點(diǎn)是近似誤差大。一個(gè)極端是k等于樣本數(shù)m,則完全沒有分類,此時(shí)無論輸入實(shí)例是什么,都只是簡單的預(yù)測它屬于在訓(xùn)練實(shí)例中最多的類,模型過于簡單。換句話說,K值較大就意味著整體模型變得簡單,容易發(fā)生欠擬合。工作原理k=1k=3鳶尾花數(shù)據(jù)集

鳶尾花數(shù)據(jù)集是一個(gè)三分類問題,返回類型的是一個(gè)bunch對象,類似于Python中的字典,所以可以實(shí)現(xiàn)Python中字典的功能,例如利用鍵來查看相應(yīng)的值。數(shù)據(jù)集內(nèi)包含3個(gè)種類共150條數(shù)據(jù),每類各50個(gè)數(shù)據(jù)。數(shù)據(jù)集有4項(xiàng)特征:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這4個(gè)特征預(yù)測鳶尾花卉屬于setosa,versicolour,virginica中的哪一個(gè)標(biāo)簽,即類別。fromsklearn.datasetsimportload_irisiris=load_iris()print(iris.keys())filename的功能是輸出數(shù)據(jù)集所在位置。DESCR中是該數(shù)據(jù)集的詳細(xì)解釋,里面說明了數(shù)據(jù),特征的數(shù)目,特征信息,分類信息等。feature_names里是鳶尾花數(shù)據(jù)集的所有特征名。data里面包括了數(shù)據(jù)集中的數(shù)據(jù)。target_names保存了目標(biāo)名。target里面保存了目標(biāo)值。#利用KKNN算法的簡單實(shí)例#導(dǎo)入相關(guān)包fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifier#加載數(shù)據(jù)集iris=load_iris()#劃分?jǐn)?shù)據(jù)集X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=0)#加載算法knn=KNeighborsClassifier(n_neighbors=1)#訓(xùn)練數(shù)據(jù)集knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("預(yù)測結(jié)果:{}".format(knn.predict(X_test)))print("預(yù)測精度={}".format(score))#KNN算法用于二分類importnumpyasnpfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.model_selectionimporttrain_test_splitdata=[[-3,-4],[-2,-2],[-5,-4],[-4,-2],[-1,-3],[1,3],[2,3],[1,2],[2,5],[3,4]]target=[0,0,0,0,0,1,1,1,1,1]X=np.array(data)y=np.array(target)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)knn=KNeighborsClassifier(n_neighbors=1)knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("knn.score={}".format(score))對二分類數(shù)據(jù)可視化決策邊界可視化importmglearnimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifierimportmatplotlib.pyplotaspltdata=[[-3,-4],[-2,-2],[-5,-4],[-4,-2],[-1,-3],[1,3],[2,3],[1,2],[2,5],[3,4]]target=[0,0,0,0,0,1,1,1,1,1]X=np.array(data)y=np.array(target)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)knn=KNeighborsClassifier(n_neighbors=1)fit=knn.fit(X,y)fig,axes=plt.subplots(figsize=(6,6))mglearn.plots.plot_2d_separator(fit,X,fill=True,eps=0.5,ax=axes,alpha=0.4)mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=axes)plt.legend(["Class0","Class1"],loc=4)axes.set_xlabel("firstfeature")axes.set_ylabel("secondfeature")plt.show()

KNN算法雖然使分類算法,但是還可以用于回歸問題。在分類任務(wù)中可使用投票法,選擇這K個(gè)樣本中出現(xiàn)最多的類別標(biāo)記作為預(yù)測結(jié)果;在回歸任務(wù)中可使用平均法,將這K個(gè)樣本的實(shí)值輸出標(biāo)記的平均值作為預(yù)測結(jié)果。當(dāng)然還可以基于距離遠(yuǎn)近程度進(jìn)行加權(quán)平均等方法。工作原理回歸問題我們將用到sklearn中make_regression函數(shù)

n_samples表示生成數(shù)據(jù)集的數(shù)據(jù)數(shù)量,n_features表示特征數(shù),n_informative表示有信息的特征數(shù)量,也就是用來構(gòu)造線性模型,生成輸出的特征數(shù)量,n_targets表示回歸目標(biāo)的數(shù)量,也就是對應(yīng)于一個(gè)樣本輸出向量y的維度,默認(rèn)輸出是標(biāo)量,noise代表數(shù)據(jù)中噪聲數(shù)量。fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=11)knn=KNeighborsRegressor(n_neighbors=1)knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("knn.score={}".format(score))對knn算法參數(shù)進(jìn)行調(diào)整fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=11)knn=KNeighborsRegressor(n_neighbors=3)knn.fit(X_train,y_train)train_score=knn.score(X_train,y_train)test_score=knn.score(X_test,y_test)print("knn.train_score={}".format(train_score))print("knn.test_score={}".format(test_score))可視化決策邊界fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpimportmatplotlib.pyplotaspltX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y)knn=KNeighborsRegressor(n_neighbors=3)fit=knn.fit(X,y)fig,axes=plt.subplots(figsize=(6,6))line=np.linspace(-3,3,100).reshape(-1,1)axes.plot(line,knn.predict(line))axes.plot(X,y,"^")plt.show()優(yōu)點(diǎn)1、KNN可以處理分類問題,同樣也可以處理多分類問題,比如鳶尾花的分類。2、簡單好用,容易理解,精度高,理論成熟。同時(shí)也很強(qiáng)大,對于手寫數(shù)字的識(shí)別,鳶尾花這一類問題來說,準(zhǔn)確率很高。3、可以用來做分類也可以用來做回歸,可用于數(shù)值型數(shù)據(jù)和離散型數(shù)據(jù),無數(shù)據(jù)輸入假定,對異常值不敏感。缺點(diǎn)1、時(shí)間復(fù)雜度和空間復(fù)雜性高。因?yàn)槊恳淮畏诸惢蛘呋貧w,都要把訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)都算一遍,如果數(shù)據(jù)量很大的話,需要的算力會(huì)很驚人,但是在機(jī)器學(xué)習(xí)中,大數(shù)據(jù)處理又是很常見的一件事。2、對訓(xùn)練數(shù)據(jù)依賴度特別大,雖然所有機(jī)器學(xué)習(xí)的算法對數(shù)據(jù)的依賴度很高,但是KNN尤其嚴(yán)重,因?yàn)槿绻覀兊挠?xùn)練數(shù)據(jù)集中,有一兩個(gè)數(shù)據(jù)是錯(cuò)誤的,剛剛好又在我們需要分類的數(shù)值的旁邊,這樣就會(huì)直接導(dǎo)致預(yù)測的數(shù)據(jù)的不準(zhǔn)確,對訓(xùn)練數(shù)據(jù)的容錯(cuò)性太差。3、一般數(shù)值很大的時(shí)候不用這個(gè),計(jì)算量太大。但是單個(gè)樣本又不能太少,否則容易發(fā)生誤分。最大的缺點(diǎn)是無法給出數(shù)據(jù)的內(nèi)在含義。3.2線性回歸

線性回歸屬于回歸算法,回歸算法是一種根據(jù)數(shù)據(jù)構(gòu)建模型,再利用這個(gè)模型訓(xùn)練其中的數(shù)據(jù)進(jìn)行處理的算法,其標(biāo)簽是連續(xù)的?;貧w算法主要以線性模型為主。線性模型指的不是一個(gè)模型,而是一類模型,包括線性回歸、嶺回歸、LASSO回歸,邏輯回歸等。本節(jié)先對線性回歸、多項(xiàng)式回歸做一下介紹。對于線性模型,其公式一般是如下所示:公式中,X[0]-X[n]表示特征,w[0]-w[n]和b表示模型的參數(shù)。當(dāng)我們的數(shù)據(jù)集特征為1時(shí),此時(shí)的線性模型公式是這樣的:

假如我們給出一些數(shù)據(jù),線性模型可以做出相應(yīng)的決策:

通過模型可以看到,滿足上述一個(gè)特征的公式。在一次函數(shù)中,自變量前面的w代表斜率,b代表截距。對于多個(gè)特征線性模型仍能做出決策:線性回歸

線性回歸,又被稱為最小二乘法。在線性回歸中,特征值與目標(biāo)值之間存在著線性關(guān)系。線性回歸算法指的是在認(rèn)為數(shù)據(jù)滿足線性關(guān)系的時(shí)候,根據(jù)訓(xùn)練數(shù)據(jù)構(gòu)建出一個(gè)模型,并用此模型進(jìn)行預(yù)測。

線性回歸就是求線性回歸方程,尋找參數(shù)w和b,使得對訓(xùn)練集的預(yù)測值與真實(shí)的回歸目標(biāo)值y之間的損失函數(shù)最小。線性回歸模型的損失函數(shù)一般有兩種,絕對損失和平方損失。

絕對損失函數(shù),即

平方損失函數(shù),即

因?yàn)槠椒秸`差利于算法的運(yùn)算,通常將平方誤差作為線性回歸模型的損失函數(shù),線性回歸模型求解就是為了使損失函數(shù)最小。

在線性回歸中,沒有需要調(diào)節(jié)的參數(shù)。但存在兩個(gè)參數(shù)coef_和intercept_用來保存回歸模型的系數(shù)和截距。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LinearRegression()reg.fit(X_train,y_train)score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("線性回歸模型:{}".format(ercept_))print("score={}".format(score))

線性回歸在線性可分的情況下表現(xiàn)得非常出色,但對于線性不可分的情況下,會(huì)表現(xiàn)得束手無策,比如對于以下數(shù)據(jù):從圖中可以看出該數(shù)據(jù)的決策邊界應(yīng)該是個(gè)二次函數(shù),接下來我們通過線性回歸進(jìn)行決策。importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionX=np.array([1,3,5,7,9,11,13,15,17,19,21])X=X.reshape(-1,1)y=np.array([80,64,52,36,59,24,66,79,72,89,100])plt.scatter(X,y)plt.show()liner=LinearRegression()liner.fit(X,y)#預(yù)測結(jié)果展示#生成待預(yù)測的數(shù)據(jù)y_predict=liner.predict(X)#預(yù)測數(shù)據(jù)plt.scatter(X,y)plt.plot(X,y_predict,c="r")plt.show()

可以看到效果差強(qiáng)人意。那么既然線性不可分,利用線性回歸無法進(jìn)行劃分,應(yīng)該怎么處理呢?下面就是就線性不可分?jǐn)?shù)據(jù)的處理,多項(xiàng)式回歸。多項(xiàng)式回歸

線性回歸適合于線性可分的數(shù)據(jù),當(dāng)我們處理非線性可分的數(shù)據(jù)時(shí)可以使用多項(xiàng)式回歸。在這種回歸中,我們是要找到一條曲線來擬合數(shù)據(jù)點(diǎn),在特征工程公有多項(xiàng)式特征類似于這個(gè)算法。

如果我們在用線性回歸劃分的話無從下手,可以嘗試多項(xiàng)式回歸。算法式子可用下式表示:importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegression#生成原始數(shù)據(jù)X=np.array([1,3,5,7,9,11,13,15,17,19,21])#重塑數(shù)據(jù),使其變?yōu)槎SX=X.reshape(-1,1)y=np.array([80,64,52,36,59,24,66,79,72,89,100])plt.scatter(X,y)plt.show()#多項(xiàng)式特征轉(zhuǎn)換poly=PolynomialFeatures(degree=2)X1=poly.fit_transform(X)#下面與線性回歸步驟相同建立模型,開始訓(xùn)練liner=LinearRegression()liner.fit(X1,y)#預(yù)測結(jié)果展示#生成待預(yù)測的數(shù)據(jù)y_predict=liner.predict(X1)#預(yù)測數(shù)據(jù)plt.scatter(X,y)plt.plot(X,y_predict,c="r")plt.show()可以看到多項(xiàng)式回歸對數(shù)據(jù)擬合的比較完美。線性回歸優(yōu)點(diǎn):1、回歸分析法在分析多因素模型時(shí),建模速度快,不需要很復(fù)雜的計(jì)算,在數(shù)據(jù)量大的情況下依然運(yùn)行速度很快。更加簡單和方便;2、回歸分析可以準(zhǔn)確地計(jì)量各個(gè)因素之間的相關(guān)程度與回歸擬合程度的高低,提高預(yù)測方程式的效果;3、可以根據(jù)系數(shù)給出每個(gè)變量的理解和解釋缺點(diǎn):1、回歸方程式只是一種推測,這影響了因子的多樣性和某些因子的不可測性,使得回歸分析在某些情況下受到限制。2、對異常值很敏感。多項(xiàng)式回歸優(yōu)點(diǎn)1、能夠擬合非線性可分的數(shù)據(jù),更加靈活的處理復(fù)雜的關(guān)系

2、因?yàn)樾枰O(shè)置變量的指數(shù),所以它是完全控制要素變量的建模

缺點(diǎn)1、需要一些數(shù)據(jù)的先驗(yàn)知識(shí)才能選擇最佳指數(shù)

2、如果指數(shù)選擇不當(dāng)容易出現(xiàn)過擬合3.3嶺回歸

嶺回歸是由最小二乘法改進(jìn)而來,雖然利用了最小二乘法,但放棄了其無偏性,以降低精度來獲得回歸系數(shù)更為符合實(shí)際的回歸方法,這種方法要強(qiáng)于最小二乘法。在嶺回歸中,不但要求模型特征系數(shù)w要表現(xiàn)的好,而且會(huì)添加約束,盡量減小特征的系數(shù)值大小,使之接近于0,這種約束方式被稱為L2正則化,其目的是為了避免過擬合。

在嶺回歸中還添加了參數(shù),其中最重要的莫過于alpha,通過調(diào)整alpha的值來降低特征系數(shù)的大小。在本例中,對嶺回歸與線性回歸進(jìn)行對比,觀察其特點(diǎn)fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LinearRegression()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("線性回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=Ridge()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("嶺回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

可以從嶺回歸得到的精度發(fā)現(xiàn),訓(xùn)練集的精度有所下降,而測試集的精度卻提高了,說明了存在過擬合問題。

通過對alpha參數(shù)的調(diào)整,發(fā)現(xiàn)測試集上的分?jǐn)?shù)上升了。而那么alpha的改變到底改變了什么呢?又是如何改變的呢?下面通過可視化觀察其特征變化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionfromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)lr=LinearRegression().fit(X_train,y_train)r1=Ridge().fit(X_train,y_train)r01=Ridge(alpha=0.1).fit(X_train,y_train)plt.plot(lr.coef_,'o',label='Linearregression')plt.plot(r1.coef_,'^',label='Ridgealpha=1')plt.plot(r01.coef_,'v',label='Ridgealpha=0.1')plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.hlines(0,0,len(lr.coef_))plt.legend()plt.show()

從圖中我們可以看到,線性模型沒有經(jīng)過正則化的處理,特征系數(shù)的數(shù)值都比較大,而嶺回歸中的系數(shù)幾乎都接近于零。當(dāng)嶺回歸的alpha值為1時(shí),特征系數(shù)幾乎都在零在一條線上,當(dāng)alpha值為0.1時(shí),特征系數(shù)有所增加。對于alpha值,當(dāng)alpha值增大時(shí),數(shù)據(jù)集的特征系數(shù)會(huì)減小,從而降低訓(xùn)練集的性能,但是會(huì)提升測試集的性能,也就是泛化性能,當(dāng)alpha減小時(shí),特征系數(shù)則會(huì)增大,如果alpha值非常小時(shí),則會(huì)消除正則化,建立的模型也會(huì)趨向于線性回歸。優(yōu)點(diǎn)1、嶺回歸可以解決特征數(shù)量比樣本量多的問題。2、嶺回歸作為一種縮減算法可以判斷哪些特征重要或者不重要,有點(diǎn)類似于降維的效果3、嶺回歸可以解決變量間存在共線性問題。缺點(diǎn)1、不能降低樣本特征數(shù)計(jì)算量大。2、犧牲了一定的精確度。3.4LASSON回歸

與嶺回歸相似,套索(LASSO)回歸也是用于限制數(shù)據(jù)的特征系數(shù),防止過擬合。不同的是LASSO回歸中用絕對值偏差作為算法的正則化項(xiàng)。即在LASSO回歸中,會(huì)使某些特征系數(shù)恰好為0。LASSO回歸處理后,某些特征被完全忽略,從而研究重要特征對數(shù)據(jù)的影響,這種稱為L1正則化。

LASSO系數(shù)也與嶺回歸類似,比較重要的是alpha。

既然有了一種正則化的方式,為什么還要出現(xiàn)另一種呢?

這是因?yàn)長1正則化用于處理高維數(shù)據(jù),高維數(shù)據(jù)就是指數(shù)據(jù)的維度很高,也就是說特征變量十分多的情況。在處理高維數(shù)據(jù)過程中碰到最大的問題就是維數(shù)過高,因?yàn)榫S數(shù)越高計(jì)算量會(huì)增加,還有就是不能可視化,無法觀察工作原理,還會(huì)導(dǎo)致過擬合,無法精確預(yù)測。L2正則化會(huì)保留特征來降低系數(shù),這樣并不會(huì)減少計(jì)算量,而L1正則化會(huì)直接刪掉一些特征系數(shù)。因此L1正則化在高維數(shù)據(jù)集中的優(yōu)勢尤其明顯。

在LASSO回歸中,我們?nèi)允褂镁€性回歸和嶺回歸中的數(shù)據(jù)集fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLassocanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=Lasso(alpha=0.001)reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("LASSO回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

經(jīng)過LASSO回歸處理后,系數(shù)矩陣中有的特征系數(shù)為零。下面通過可視化觀察系數(shù)改變后特征的變化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLassofromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)r1=Ridge(alpha=0.1).fit(X_train,y_train)l1=Lasso().fit(X_train,y_train)l01=Lasso(alpha=0.01).fit(X_train,y_train)l001=Lasso(alpha=0.00001).fit(X_train,y_train)plt.plot(l1.coef_,'o',label='Lassoalpha=1')plt.plot(l01.coef_,'^',label='Lassoalpha=0.01')plt.plot(l001.coef_,'v',label='Lassoalpha=0.00001')plt.plot(r1.coef_,'.',label="Ridgealpha=0.1")plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.legend()plt.show()

通過圖中數(shù)據(jù)可以看到,當(dāng)LASSO系數(shù)較大時(shí),數(shù)據(jù)集的特征幾乎全為0,隨著alpha值的減小,特征系數(shù)才逐漸增大,當(dāng)alpha等于0.00001時(shí),幾乎沒有了正則化的約束,而Ridge回歸中,雖然有特征系數(shù)很小的點(diǎn),但都不為0。在LASSO回歸和Ridge回歸中,雖然都是alpha系數(shù),但意義完全不同,在嶺回歸中,隨著alpha值的增大,數(shù)據(jù)集的特征系數(shù)會(huì)減小,隨著alpha值的減小,數(shù)據(jù)集的特征系數(shù)會(huì)增大,而LASSO回歸中,隨著alpha值的增大,特征系數(shù)會(huì)增大,隨著alpha值的減小,特征系數(shù)會(huì)減小。而且?guī)X回歸中,特征系數(shù)不會(huì)為0,LASSO回歸中會(huì)。1、Lasso回歸的出現(xiàn)能夠有效的解決線性回歸出現(xiàn)的過擬合。2、嶺回歸與Lasso回歸最大的區(qū)別在于嶺回歸引入的是L2正則化,Lasso回歸引入的是L1正則化,Lasso回歸能夠使得許多特征變量變成0,這點(diǎn)要優(yōu)于嶺回歸,是得運(yùn)算素的變快。缺點(diǎn)3、不適用一般情況,僅適用于特征非常多和對模型解釋。3.5邏輯回歸

在分類算法中,有的可以用于回歸問題,同樣對于回歸算法,有的適用于分類問題。而邏輯回歸就屬于線性模型中的一種,用于解決分類問題。邏輯回歸是用來處理自變量和結(jié)果的回歸問題,雖然被叫做回歸,但卻是一種分類方法。主要有兩個(gè)使用場景,第一,用于研究二分類或者多分類問題,第二尋找因變量的影響因素。

邏輯回歸算法與線性回歸算法最大的差異是,邏輯回歸中的

被當(dāng)做決策邊界,而對于線性回歸等模型中是一條直線、平面或者超平面。邏輯回歸建立的模型如下面這個(gè)公式:

在公式中0代表閾值,但是對于現(xiàn)實(shí)數(shù)據(jù),閾值的設(shè)置也是一個(gè)問題,如果采取平均值,假設(shè)正常數(shù)據(jù)點(diǎn)都處于0左右,而出現(xiàn)一個(gè)異常值非常大,則會(huì)出現(xiàn)錯(cuò)誤。

于是需要建立的一個(gè)函數(shù)來映射概率,sigmoid函數(shù):

該函數(shù)將所有數(shù)據(jù)都映射到0-1之間,對于異常值進(jìn)行了處理,其圖像這樣的:

與訓(xùn)練線性回歸模型類似,為了邏輯回歸模型的參數(shù)w和b需要一個(gè)代價(jià)函數(shù),算法的代價(jià)函數(shù)是對m個(gè)樣本的損失函數(shù)求和然后除以m,因?yàn)閷τ诰€性模型損失函數(shù)對于模型的影響不是很大,所以不作詳細(xì)介紹。邏輯回歸的原理是:根據(jù)一個(gè)問題,建立代價(jià)函數(shù),然后通過迭代優(yōu)化求解出最優(yōu)的模型參數(shù),然后測試驗(yàn)證我們這個(gè)求解的模型的好壞。

邏輯回歸有一個(gè)重要的參數(shù)C,C值越大正則化越弱。與前面類似如果參數(shù)C值較大,那么特征系數(shù)也將會(huì)越大,邏輯回歸可能將訓(xùn)練集擬合到最好,而如果C值較小,那么模型更強(qiáng)調(diào)使特征系數(shù)接近于0,正則化越強(qiáng)。我們繼續(xù)對乳腺癌數(shù)據(jù)集進(jìn)行建模。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LogisticRegression()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("邏輯回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

可以看到精確度非常高,因?yàn)樵摂?shù)據(jù)集本身就是分類問題,恰好也說明了線性模型中的邏輯回歸適用于分類。對C值進(jìn)行調(diào)節(jié),并通過可視化觀察特征系數(shù)的變化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLogisticRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)lg01=LogisticRegression(C=0.1).fit(X_train,y_train)lg1=LogisticRegression().fit(X_train,y_train)lg10=LogisticRegression(C=10).fit(X_train,y_train)plt.plot(lg01.coef_.T,'x',label='LogisticC=0.1')plt.plot(lg1.coef_.T,'o',label='LogisticC=1')plt.plot(lg10.coef_.T,'.',label='LogisticC=10')plt.xticks(range(canner.data.shape[1]),canner.feature_names,rotation=90)plt.hlines(0,0,canner.data.shape[1])plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.legend()plt.show()因?yàn)檫壿嫽貧w使用L2正則化,可以看到隨著C值增大特征系數(shù)也會(huì)變大,可以看到隨著C值減小特征系數(shù)也會(huì)變小,但是不會(huì)為0。優(yōu)點(diǎn):

1、簡單、速度快,適用于二分類問題。2、易于理解,能直接看到各個(gè)特征的權(quán)重。3、容易吸收新的數(shù)據(jù)更新模型。缺點(diǎn):

1、適應(yīng)能力弱,對數(shù)據(jù)適應(yīng)能力有局限性。3.6樸素貝葉斯算法

貝葉斯算法是一類分類算法的總稱,來源于統(tǒng)計(jì)學(xué)。它是由18世紀(jì)英國數(shù)學(xué)家貝葉斯學(xué)派創(chuàng)始人塔馬斯·貝葉斯所提出的利用概率統(tǒng)計(jì)知識(shí)進(jìn)行分類的方法演變而來,貝葉斯學(xué)派很古老,但是從誕生到一百年前一直不是主流。

樸素貝葉斯分類與我們介紹的線性模型十分相似,是一種十分簡單的分類算法,叫它樸素貝葉斯分類是因?yàn)檫@種方法的思想真的很樸素,樸素貝葉斯的原理是:對于給出的待分類項(xiàng),求解在此項(xiàng)出現(xiàn)的條件下各個(gè)類別出現(xiàn)的概率,哪個(gè)最大,就認(rèn)為此待分類項(xiàng)屬于哪個(gè)類別。即如果一個(gè)事物在一些屬性條件發(fā)生的情況下,事物屬于A的概率>屬于B的概率,則判定事物屬于A。樸素貝葉斯算法較為簡單、高效,在處理分類問題上,是值得優(yōu)先考慮的方法之一,但是泛化能力比分類模型較差。

樸素貝葉斯分類算法,核心是下面這個(gè)貝葉斯公式:

樸素貝葉斯算法同樣有多種算法,分別是高斯樸素貝葉斯(GaussianNaiveBayes),伯努利樸素貝葉斯(BernoulliNaiveBayes),多項(xiàng)式樸素貝葉斯(MultinomialNaiveBayes)。高斯樸素貝葉斯其實(shí)就是正態(tài)分布用于解決一些連續(xù)數(shù)據(jù)的問題,伯努利樸素貝葉斯就是應(yīng)用于二分類,多項(xiàng)式樸素貝葉斯文本計(jì)數(shù)中經(jīng)常使用。接下來對這三種貝葉斯算法進(jìn)行模型的構(gòu)建。

在對KNN算法處理回歸問題中,用到了sklearn庫中的make_regression函數(shù),該函數(shù)可通過設(shè)置得到想要的數(shù)據(jù)集,同時(shí)在sklearn庫中還有一個(gè)手動(dòng)設(shè)置的分類數(shù)據(jù)集,make_blobs。

n_samples表示數(shù)據(jù)的數(shù)量。

n_features表示特征的數(shù)量。

centers表示類別的數(shù)量。

首先函數(shù)生成數(shù)據(jù)為300個(gè)、特征為2、類別為7的數(shù)據(jù)集,然后利用三種樸素貝葉斯算法觀察其精度。#高斯樸素貝葉斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportGaussianNBX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)bayes=GaussianNB()bayes.fit(X_train,y_train)train_score=bayes.score(X_train,y_train)test_score=bayes.score(X_test,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))#伯努利樸素貝葉斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportBernoulliNBX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)bayes=BernoulliNB()bayes.fit(X_train,y_train)train_score=bayes.score(X_train,y_train)test_score=bayes.score(X_test,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))因?yàn)槎囗?xiàng)式樸素貝葉斯只適用于處理非負(fù)離散數(shù)值,所以在下面對數(shù)據(jù)進(jìn)行了歸一化。#多項(xiàng)式樸素貝葉斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportMultinomialNBimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportMinMaxScalerX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)scaler=MinMaxScaler()scaler.fit(X_train)X_train_scaler=scaler.transform(X_train)X_test_scaler=scaler.transform(X_test)bayes=MultinomialNB()bayes.fit(X_train_scaler,y_train)train_score=bayes.score(X_train_scaler,y_train)test_score=bayes.score(X_test_scaler,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))

因?yàn)橛械乃惴ú贿m用該數(shù)據(jù)集的緣故,可以看到評分越來越低。列下來通過決策可視化觀察其決策邊界。

伯努利樸素貝葉斯主要解決的是二項(xiàng)分布,多項(xiàng)式樸素貝葉斯多用于轉(zhuǎn)化為對文本的處理,所以效果不是很好。優(yōu)點(diǎn)1、樸素貝葉斯算法分類效率穩(wěn)定,不僅能處理二分類還能處理多分類,適用于小規(guī)模數(shù)據(jù),而且還能做增量式訓(xùn)練,即數(shù)據(jù)量過多超出內(nèi)存時(shí),我們可以分批的去增量訓(xùn)練。2、對缺失數(shù)據(jù)不太敏感,算法也比較簡單,常用于文本分類。3、當(dāng)屬性相關(guān)性較小時(shí),樸素貝葉斯性能最好。缺點(diǎn)1、在屬性個(gè)數(shù)比較多或者屬性之間相關(guān)性較大時(shí),分類效果不好,往往無法預(yù)測精確的數(shù)據(jù)。2、需要知道先驗(yàn)概率,且先驗(yàn)概率很多時(shí)候取決于假設(shè),因此在某些時(shí)候會(huì)由于假設(shè)的先驗(yàn)?zāi)P偷脑驅(qū)е骂A(yù)測效果不佳。3、由于我們是通過先驗(yàn)和數(shù)據(jù)來決定后驗(yàn)的概率從而決定分類,所以分類決策存在一定的錯(cuò)誤率,并且對輸入數(shù)據(jù)的表達(dá)形式很敏感。3.7決策樹

決策樹是一種相對普遍的機(jī)器學(xué)習(xí)算法,常用于分類和回歸。在機(jī)器學(xué)習(xí)中,決策樹是一個(gè)預(yù)測模型,他代表的是對象屬性與對象值之間的一種映射關(guān)系,它在對數(shù)據(jù)進(jìn)行分類的同時(shí),還可以給出各個(gè)特征的重要性評分。決策樹在決策過程中,會(huì)根據(jù)數(shù)據(jù)的特征來劃分?jǐn)?shù)據(jù)的類別。

對于上表數(shù)據(jù),如果做出劃分你會(huì)怎么做?決策樹可能會(huì)做出以下劃分:

當(dāng)然可能也會(huì)有其他劃分方法,總而言之,在使用決策樹分類的時(shí)候,從根結(jié)點(diǎn)開始,對數(shù)據(jù)集的某一個(gè)特征進(jìn)行測驗(yàn),選擇最優(yōu)特征,然后每一個(gè)數(shù)據(jù)被對應(yīng)著分配到子結(jié)點(diǎn)。如此循環(huán)繼續(xù)進(jìn)行,當(dāng)?shù)竭_(dá)葉結(jié)點(diǎn)時(shí),循環(huán)停止,這時(shí)每個(gè)數(shù)據(jù)都被分到一個(gè)類別。如果還有子集不能夠被正確的分類,那么就對這些子集選擇新的最優(yōu)特征,繼續(xù)對其進(jìn)行分割,構(gòu)建相應(yīng)的節(jié)點(diǎn),如此遞歸進(jìn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論