Python機器學習開發(fā)實戰(zhàn)PPT完整全套教學課件_第1頁
Python機器學習開發(fā)實戰(zhàn)PPT完整全套教學課件_第2頁
Python機器學習開發(fā)實戰(zhàn)PPT完整全套教學課件_第3頁
Python機器學習開發(fā)實戰(zhàn)PPT完整全套教學課件_第4頁
Python機器學習開發(fā)實戰(zhàn)PPT完整全套教學課件_第5頁
已閱讀5頁,還剩329頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Python機器學習開發(fā)實戰(zhàn)第1章環(huán)境配置與學前知識第2章Python基礎知識第3章Numpy第4章Pandas第5章Matplotlib第6章scikit-learn第7章機器學習常用數(shù)據集第8章回歸算法第9章邏輯回歸第10章神經網絡第11章線性判別算法第12章K最近鄰分類第13章決策樹與隨機森林第14章樸素貝葉斯第15章支持向機第16章PCA降維第17章SVD奇異值分解第18章聚類第19章深度學習框架應用第1章環(huán)境配置與學前知識本章將帶領大家一起配置機器學習的開發(fā)環(huán)境。環(huán)境的配置包含了Python的安裝,IDE的選擇以及相關依賴包的安裝。其次我們會對機器學習的相關術語進行一些介紹,比如什么是機器學習,深度學習和人工智能,它們的關系是什么。1.1環(huán)境的安裝本書的寫作過程中使用的python版本是3.x。大家可以登陸python的官方網站(/)進行下載。而代碼的運行我則全部放在了Spyder里面。Spyder的安裝可以參考/spyder/網站。圖1.1spyder界面另外在本書中還用到了第三方的工具包,比如numpy和pandas等,這些都可以通過pip命令進行安裝。假如我們需要安裝pandas包,我們只需在命令行窗口中輸入pip

install

pandas即可。但我并建議大家按照上述的方法一步一步進行配置,因為有更好的方法,那就是Anaconda。Anaconda是一個python的庫的集合,它包含了幾乎所有我們進行科學計算所需要的庫,并提供了spyder這樣的工具。事實上本書就是在Anaconda的基礎上來完成的。Anaconda的網址是/download/,大家可以下載python3.x的安裝包進行安裝。1.2機器學習相關概念在我們正式進入學習之前,首先對機器學習的相關概念做一個梳理,這些概念將貫穿之后所有的學習過程之中。根據是否有明確的學習目標(因變量Y)我們將機器學習分為有監(jiān)督學習(supervisedlearning)和無監(jiān)督學習。有監(jiān)督學習常被稱為分類,而無監(jiān)督學習常被稱為聚類。1.2.1機器學習中的數(shù)據在機器學習中,處理的數(shù)據格式和excel表格或者結構化數(shù)據表格相同,只是對細節(jié)的叫法有所差異。假設我們有以下的表格,首先如果在excel中,我們會簡單的使用行和列來對應相應的數(shù)據。而在結構化數(shù)據庫中我們將行稱為一條記錄,將列稱為一個字段,如表1.1所示。在此表中,我們看到一共有三行四列數(shù)據。在機器學習中,我們將行,稱為一個樣本(sample)或者實例(instance)。我們將列稱為特征(feature)或者屬性()。如何理解特征或者屬性呢?特征和屬性其實就是每個樣本的特點,比如在表1.1中,每個樣本都會性別,體重,升高三個特征。如果再給出一組數(shù)據,只有身高和體重,那么我們就可以根據身高和體重,來判斷這個同學是男生還是女生。在本書中我們統(tǒng)一將行稱為樣本,將列稱為特征。然而在我們實際的工作中,數(shù)據并補總像表1.1中那么的工整,這需要我們對原始的數(shù)據進行一系列的清洗和轉換。這個清洗和轉換的過程我們稱之為數(shù)據的預處理。數(shù)據的預處理包含了以下幾個步驟。(1)數(shù)據清洗在我們所得到的數(shù)據,有時會很臟,比如有缺失值,有異常值,如表1.2所示。我們看到學號100001學號的同學,體重是空值。學號100003同學的身高異常的高。當我們遇到這樣的樣本的時候,最簡單的方法就是將這些樣本點去掉,但是這樣會浪費了該樣本點其他已有的信息,特別是在只有少量的樣本的情況下。除了刪除異常樣本點之外,我們還可以進行插值的操作,就是將空值和異常值插補為一個比較合適的指。比如我們可以用該特征的均值進行插值。(2)特征提取假設我們有表1.3的數(shù)據。我們想通過每個人的喜好,體重,身高來預測性別。這里我們不會將“籃球”,“乒乓球”,“足球”直接輸入給模型,而是要將他們轉換成數(shù)字。在文本處理過程中,我們也會將文本處理成這樣的結構化數(shù)據表。將每個詞作為一個特征。在圖像處理中,我們會將一個像素作為一個特征來處理。具體方法可以參考本書的相關章節(jié)。1.2.2訓練集和測試集那我們拿到數(shù)據之后我們并不是將所有的數(shù)據都用來進行模型訓練,因為這樣訓練出來的模型,我們并不知道他的優(yōu)劣。如果等到投入生產中,才知道為時已晚。所以我們要將數(shù)據分為訓練集和測試集。訓練集顧名思義就是訓練模型用的數(shù)據,一般我們在整體數(shù)據中隨機采樣獲得訓練集。而測試集則是整體數(shù)據中出去訓練集的部分。測試集和訓練集的大小并沒有固定的說法,9:1,8:2,這樣的分法都是可以的。甚至我們可以只用一個樣本作為測試集。具體的操作方法可以參考本書的相關章節(jié)。1.2.3欠擬合與過度擬合欠擬合是指所訓練的模型在訓練集中表現(xiàn)的就很差,既準確度很低。過度擬合則是指在模型在訓練集上表現(xiàn)的非常優(yōu)秀,可以有效的區(qū)分每一個樣本。但是在測試集上則表現(xiàn)的十分糟糕。所以我們在訓練模型的時候,不能一味的追求訓練集上的好的模型指標,要在測試集上不斷的調試。1.2.4人工智能、機器學習、深度學習人工智能(artificialintelligence,AI)、機器學習(machine

learn)和深度學習(deep

learn)是最近火熱的詞語。但是很多同學并不清楚他們之間的關系,我們可以簡單的認為人工智能包含了機器學習,而機器學習又包含了深度學習。人工智能更偏向于應用方面,比如語音識別,圖像識別,聊天機器人等。而機器學習則更偏向于理論,比如圖像識別技術用到的是CNN(卷積神經網絡)的機器學習算法,在本書中也會用到機器學子中的最近鄰算法來做簡單的字體識別。深度學習則是機器學習的一個分支。所謂的深度學習就是有多個隱藏層的神經網絡算法。深度學習咋一聽是十分高深的學問,在學習本書之后,你就會知道它其實就是簡單算法的堆疊,由此可見起一個好的名字是十分有必要的。第2章Python基礎知識本章將介紹Python的基礎知識,其中包含了變量,操作符,字符串,列表,集合,字典,循環(huán)語句,判斷語句,方法和對象。因為本書編寫的目的并不是介紹python語言本身,而是把python當作一個工具,所以相關的內容只是簡單的列舉和說明。如果讀者對這些內容十分感興趣,市面上有很多介紹如何使用python的書籍,可以參閱。2.1helloworld!在控制臺輸入helloworld!然后打印。這種輸出又稱為標準輸出,當然我們還可以將結果保存至硬盤。In[1]:print("helloworld!")helloworld!2.2變量其中變量是為了存儲數(shù)值,這就像是代數(shù)一樣,比如我們有方程,我們將帶入方程就可求得。同樣的我們還可以令。在下面的代碼中,我們分別將1賦值給了a,b。我們就可以直接打印它們,并且用他們做基本的運算。字符串不僅能存儲數(shù)值,還能存儲字符串,這個在下面的章節(jié)會詳細講解。2.3操作符操作符我們可以理解為數(shù)學中的運算符號,它包含了我們常用的加減乘除的基本方法,另外還有取余數(shù),取整數(shù)的方法。此外還有進行邏輯運算的方法,比如邏輯或,邏輯與和邏輯非。當然在進行邏輯運算前,我們首先要判斷一個命題的真假,所以Python也提供了一些判斷真假的操作符。2.3.1基本運算符基本運算符包含了我們常用到的加減乘除等幾個常用的方法。1.+加法加法直接使用加號“+”連接兩個數(shù)字。2.-減法減法使用減號“-”連接兩個數(shù)字。3.*乘法乘法使用星號“*”連接兩個數(shù)字。4./除法除法使用“/”號連接兩個數(shù)字。5.//除法,取整數(shù)部分“//”雙斜杠表示除法取整的運算,它會直接舍棄余數(shù)部分。6.%除法,取余數(shù)部分“%”則和“//”運算相對,它是取余數(shù),舍棄整數(shù)部分。7.**指數(shù)運算(乘方與開方)“**”雙星號表示指數(shù)運算,我們很容易聯(lián)想到雙“**”號是單“*”乘法的加強版,這樣就好記憶了。2.3.2比較運算符比較運算符的特點是返回的都是布爾類型的數(shù)據(真或假),它主要分為三類:判斷是否、判斷大小、判斷包含。這里是和我們在高中所學習基礎知識是相統(tǒng)一的。1.is是判斷是否相同。如果相同則返回True,如果不相同則返回False。2.isnot不是判斷是否不同。如果不同則返回True,如果相同則返回True。3.<小于判斷是否小于。如果小于則返回True,如果大于或等于則返回False。4.<=小于等于判斷是否小于等于。如果小于等于則返回True,如果大于則返回False。5.>大于判斷是否大于。如果大于則返回True,如果小于等于則返回False。6.>=大于等于判斷是否大于等于,如果大于等于則返回True,如果小于則返回False。7.!=不等于判斷是否不等于。如果不等于則返回True,如果等于的返回False。8.==等于判斷是否等于。如果等于則返回True,如果不等于則返回False。一般在判斷兩個數(shù)值是否相同的時候我們使用“==”來判斷,“is”主要判斷是否是相同的,可以判斷是字符串是否相同,對象地址是否相同。9.in在里面判斷是否包含。如果包含則返回True,如果不包含則返回False。10.notin不在里面判斷是否包含。如果不包含則返回True,如果包含則返回False。2.3.3邏輯運算符邏輯運算符可以理解為是對布爾值的運算。我們在中學時就已經學習過的與、或、非是相通的。1.not邏輯非非真返回False,非假返回Ture。2.or邏輯或有一個為真則返回真,兩個同時為假則返回假。3.and邏輯與兩個同時為真返回真,一真一假則返回假,兩個同時為假返回假。2.4字符串字符串是所有編程語言中處理最多的一個對象。如果操作符主要對應了現(xiàn)實中數(shù)學問題,那么我們就可以把字符串的操作當成現(xiàn)實中的語文問題來對待。不過和現(xiàn)實世界中的語文不一樣的地方是在現(xiàn)實世界中我們可以很容易的換行,而不需要任何標注。但是在編程的世界中我們則需要特殊的字符來標注——“這里需要換行“。這樣的標注字符在編程的世界里,我們稱之為轉義字符。轉義字符除了能標明換行外,還有很多其他的作用。2.4.1基礎字符串可以用雙引號,單引號和三引號表示。其中雙引號和單引號效果一樣,三引號可以多行。單引號,雙引號和三引號可以復用。2.4.2轉義字符使用反斜杠對特殊字符進行轉義。所謂的轉義字符就是指那些我們不可以直接寫出的符號。比如換行,在真實書寫的時候,我們可以直接換行。但是在電腦中,電腦讀取的始終是一連串的編碼,所以需要用特殊的字符來告訴電腦那些地方需要換行。由于所有的字符都已經有了它自己的含義所以,我們又沒有必要新造出字符來特別的表示這些特殊的符號。所以我們使用“\”來表示特殊的符號。比如“\n”就表示了換行。如果不想轉義可以在字符串前面使用r,表示原始字符串。原始字符串的含義就是不識別轉義字符。\n表示換行,還有一些其他的特殊轉義字符,如表2.1所示。2.4.3索引和切片可以通過索引獲得字符串單個字符的值,也可通過切片獲得子字符串的值。1.索引字符串索引從0開始,至長度-1為止,長度可以通過內置函數(shù)len()來獲得,可以通過負數(shù)索引。2.切片在使用切片的時候需要注意的是,切片的右邊是取不到的。2.4.4字符串方法字符串大概是是所有編程語言處理的最多的對象。因為編程語言之間的交互很多都需要通過字符串。1.大小寫轉換2.補全3.索引4.替換5.分割字符串6.其他2.5列表列表可以存放多個元素,其實字符串就是一個特殊的列表——既存放字符的列表。所以列表也可以像字符串一樣索引。最常用的列表的生成方法有兩種,一種是使用list()方法,另外一種是直接使用中括號。筆者在編程過程中,最喜歡使用第二種方法。知道了如何創(chuàng)建列表,接下來就要學會如何使用列表。列表的處理在編程過程中是十分重要的。(1)尾部添加元素(2)添加另一個列表(3)刪除第一個符合要求的值(4)刪除最后一個元素并返回(5)清空列表(6)索引(7)計數(shù)(8)排序(9)反轉(10)復制元組可以看成列表的特殊形式,它和列表的差別主要是他不能改變,比如不能使用append,insert等方法。其他則和列表一樣。元組的創(chuàng)建有兩種方法,如下:a=tuple()a=()2.6集合集合的元素不會重復并且沒有順序,所以不能索引。集合主要的作用是去重,以及進行求交集,并集,差集。創(chuàng)建集合的方法只有一種,就是使用set()方法。在python中集合的使用,雖然不如列表和元組那么常見,但是在處理集合關系時確是十分的方便。2.7字典字典是鍵:值對的集合。鍵是唯一的,且不能索引。創(chuàng)建字典的方法有兩種,一種是使用dict()方法,另外一種是使用大括號。筆者也特別喜歡第二種方法來創(chuàng)建字典。字典在編程中的使用頻次和列表是一樣的高。特別是在與其他的語言交互過程中,比如在網絡通訊中我們經常使用到json格式的數(shù)據,json的數(shù)據結合和字典就是一樣的。1.查看所有鍵2.查看所有值3.查看所有鍵值,列表嵌套元組的形式返回4.查看字典某個元素5.刪除字典所有元素6.刪除指定元素7.彈出指定鍵8.彈出任意鍵值9.拷貝字典10.更新值2.8循環(huán)語句循環(huán)語句的作用是讓某個代碼塊循環(huán)執(zhí)行,包括以下幾種:for語句、while語句、break語句、continue。2.8.1for語句For語言可以理解為遍歷,下面的這兩行代碼的意思是遍歷[1,2,3]中的每一個元素,然后打印它。2.8.2while語句While語句可以理解為“當……條件成立,則一直執(zhí)行”。下面的代碼演示了while的作用,當x大于3的時候就一直執(zhí)行。2.8.3break語句break的作用是跳出循環(huán),以后的循環(huán)也將不再執(zhí)行。接下來的代碼在第一次循環(huán)執(zhí)行到print(x)時,跳出循環(huán),print(x*x)不再執(zhí)行,以后的循環(huán)也不再執(zhí)行。2.8.4continuecontinue的作用是跳出本次循環(huán),以后的循環(huán)將繼續(xù)執(zhí)行。接下來的代碼在第一次虛幻執(zhí)行到print(x)時,跳出本次循環(huán),print(x*x)不再執(zhí)行,繼續(xù)執(zhí)行下一次循環(huán)。2.9判斷語句判斷語句是控制程序的執(zhí)行流程的,比如我們想讓某一行在某個條件下執(zhí)行,就可以用if語句:2>1為真,所以執(zhí)行了print("2>1")。1>2為假,所以沒有執(zhí)行了print("1>2"),也可以使用多重判斷語句elif:2.10函數(shù)函數(shù)的出現(xiàn)是為了將常用的代碼塊打包,從而減少了代碼的編寫。有些時候,某些代碼塊要反復使用這個時候我們可以把它封裝成函數(shù)。通過函數(shù)我們可以把他們整合到一起。這時我們只需要調用一次該函數(shù)就行。另外還可以往函數(shù)里面賦值。函數(shù)還可以有返回值。要注意的是,函數(shù)里面的變量只屬于函數(shù),不和函數(shù)外面的同名變量沖突。我們主要介紹python常用的內置函數(shù)2.11面向對象編程面向對象是現(xiàn)在比較常見的編程思想,大家可以把對象簡單理解為變量和函數(shù)的組合。在對象里,變量又稱為屬性,函數(shù)又稱為方法。第3章NumpyNumpy是一個Python生態(tài)環(huán)境中重要的科學計算工具,接來下所學到的pandas,matplotlib以及scikit都能見到他的身影。通過Numpy我們可以生成模擬數(shù)據,比如隨機生生一個數(shù),隨機生成一個服從正太分布的隨機數(shù)。另外Numpy中還提供了一些數(shù)學的計算方法,相較于Python自帶的Math模塊,它更高效。此外還提供了統(tǒng)計學和線性代數(shù)常用的函數(shù)。3.1創(chuàng)建數(shù)組在進行數(shù)學運算之前我們首先要創(chuàng)建數(shù)組,數(shù)組就是數(shù)的集合,他們按照一定的規(guī)則排序,我們比較常見的就是二維數(shù)組,二維數(shù)組包含了行和列。numpy中創(chuàng)建數(shù)組的方式主要有兩種:1)創(chuàng)建元素為0或1的數(shù)組。2)將已有的數(shù)據轉換為數(shù)組,比如將列表轉換為數(shù)組。3.1.1創(chuàng)建元素為0或1的數(shù)組Numpy提供了一些方法讓我們創(chuàng)建元素全為1和0,或者任意指定的數(shù)的數(shù)組。其中empty方法生成的元素是隨機數(shù)。3.1.2將列表轉換為數(shù)組有些時候,我們得到的數(shù)據并不是Numpy中的數(shù)組的形式,此時我們可以通過Numpy中的array方法將其他形式的數(shù)據轉換為Numpy中的數(shù)組的形式,比如我們可以將python中內置的list列表結構轉換為數(shù)組。3.1.3生成一串數(shù)字在有些情況下,我們需要生成一些連續(xù)的數(shù)字,numpy也提供了相應的方法。注意這里我們稱“生成一串數(shù)字”,而不是“生成一維數(shù)組”,因為生成的結果并沒有維度的信息。3.1.4生成特殊數(shù)組我們還可以生成一些特殊的數(shù)組,比如根據對角線元素生成數(shù)組,或者提取數(shù)組的對角線元素等。3.2數(shù)組索引數(shù)組的索引主要是用來獲得數(shù)組中的數(shù)據。在numpy中數(shù)組的索引可以分為兩大類:一是一維數(shù)組的索引,二是二維數(shù)組的索引。其中一維數(shù)組的索引和列表的索引幾乎是相同的,二維數(shù)組的索引則會有很大的不同。一維數(shù)組的索引和python中l(wèi)ist結構索引十分相似,還是需要注意在切片索引的時候末尾的小標是取不到的。二維數(shù)組的索引格式是在中括號中,逗號前是選擇行,逗號后是選擇列。而在選擇行和列的時候可以傳入列表,或者使用冒號來進行切片索引。3.3排序與查詢在進行數(shù)組操作的時候我們可能需要對數(shù)組進行排序和查詢。排序中我們需要注意的是按行排序,還是按列排序,或者是整體排序。這里需要特別注意的是sort方法中axis參數(shù)指的是排序的方向,0指按行進行操作,1指按列進行操作。在查詢數(shù)組的過程中,我們最常用到的是where方法,該方法返回的是符合條件的值的坐標。另外我們還可以通過argmax等方法獲得數(shù)組中最大值和最小值的坐標,注意axis參數(shù)的設定。3.4隨機數(shù)生成器在做某些實驗,或者驗證某些算法的時候,我們需要模擬一些數(shù)據,而numpy中就提供了這樣的方法。常用隨機數(shù)生成可以生成單個數(shù)或者任意維度的數(shù)組。而且我們還可以使用choice方法隨機抽取數(shù)值,或者使用permutation方法對數(shù)組進行重新排序。分布隨機數(shù)生成主要是根據一些特殊的分布,比如正態(tài)分布,幾何分布等生成隨機分布數(shù)組。3.5數(shù)學函數(shù)Numpy提供了我們常用的數(shù)學計算函數(shù),通過這些函數(shù)我們可以進行三角函數(shù)的運算,指數(shù)對數(shù)的運算,以及其他基本的數(shù)學運算。3.5.1三角函數(shù)這里列舉了常用的正弦,余弦和正切函數(shù),以及角度和弧度的轉換函數(shù)。Numpy中的這些函數(shù)都可以傳入列表類型的參數(shù),會自動對列表中的各個元素進行計算,而不需要寫循環(huán)。3.5.2指數(shù)與對數(shù)這一小節(jié)主要列舉了Numpy中提供的指數(shù)與對數(shù)運算函數(shù)。需要注意的是在計算指數(shù)的時候只提供了以自然常數(shù)和2為底的方法,而在對數(shù)中只提供了自然常數(shù),2和10為底的方法。3.5.3約數(shù)這一小節(jié)介紹Numpy求約數(shù)的方法。約數(shù)可以分為四舍五入,向0取整,向上取整和向下取整。3.5.4數(shù)組自身加乘這一小節(jié)介紹數(shù)組的自身的加乘。自身的加乘是指對數(shù)組的內部的元素進行求和和求乘積。比如計算所有行的和,或者計算所有列的和。方向仍然是由axis參數(shù)來設定的。3.5.5算術運算這一小節(jié)介紹numpy中提供的算術運算符方法。需要注意的是這些方法都是可以對數(shù)組進行操作的,操作時會對數(shù)組內的每個元素進行計算。3.6統(tǒng)計函數(shù)Numpy中提供了常用的數(shù)學統(tǒng)計函數(shù)。通過這些統(tǒng)計函數(shù)我們可以很容的求得最大值,最小值,分位數(shù),均值方差等。另外我們還可以計算兩個向量的相關性?;窘y(tǒng)計函數(shù)主要是求最大值,最小值,分位數(shù)。基本統(tǒng)計函數(shù)返回的是對該數(shù)組整體的描述。Numpy中提供了求均值與方差的函數(shù)。均值和方差反映了數(shù)組的波動程度,這兩個指標是非常重要的。Numpy中提供了計算密度的相關函數(shù)。數(shù)據的密度可以幫助我們很好的理解數(shù)組的大致的分布。簡單的理解就是看哪些數(shù)值出現(xiàn)的次數(shù)比較多,大多數(shù)的數(shù)值集中分布在哪個區(qū)間。Numpy中提供了計算序列相關性的相關函數(shù)。相關性可以幫助我們理解兩個數(shù)組是否具有一定的一致性。3.7線性代數(shù)本小節(jié)中介紹線性代數(shù)中常用的計算函數(shù)。線性代數(shù)在機器學習中由重要的應用。比如在PCA降維中,我們可以使用特征值和特征向量找到降維的空間。另外線性代數(shù)也增強了計算的性能,可以提高我們的計算速度。第4章PandasPandas工具包是在Numpy工具包上的進一步封裝,它提供了更豐富的數(shù)據處理方法。相較于Numpy,Pandas更適合做數(shù)據的預處理。而Numpy則更適合做數(shù)據的運算。所以拿到數(shù)據后一般都使用Pandas做處理,而實現(xiàn)算法模型則使用Numpy。4.1

序列對象SeriesSeries對象類似于numpy中的一維數(shù)組。接下來的章節(jié)里主要介紹了在數(shù)理統(tǒng)計中的應用,其實series更強大的功能是對字符串以及時間序列的處理,而這些因為和本書的寫作目標不符,故沒有詳細講解,有興趣的讀者可以參考官方文檔學習。4.1.1創(chuàng)建Series對象Pandas中最基礎的對象是Series,可以通過list以及可迭代對象range創(chuàng)建,也可以通過numpy中的array對象創(chuàng)建。4.1.2Series索引Series的索引方法有以下三種。第一種,與list和numpy中的一維數(shù)組的方法不相同,形式相同。但需要注意的是此時的值不是numpy中對應概念的下標,而是pandas中的索引值,所以不能出現(xiàn)負數(shù)。第二種方法,與list和numpy中的一維數(shù)組的方法不相同,形式也不同,要使用.loc,同樣也不能出現(xiàn)負數(shù)。第三種方法,與list和numpy中的一維數(shù)組的方法相同,形式不同,要使用.iloc,可以出現(xiàn)負數(shù)。4.1.3查看Series相關屬性查看series的相關屬性,可以查看或更改該序列元素的類型以及索引。In[1]:importpandasaspdIn[2]:a=pd.Series([0,1,2,3,4,5]).index屬性可以查看series對象的索引,同樣也可以直接賦值更改。我們使用.loc和.iloc對索引修改前后做同樣的處理,體會一下loc和iloc的區(qū)別,代碼如下:In[3]:a.indexOut[3]:RangeIndex(start=0,stop=6,step=1)In[4]:a.loc[1]Out[4]:1In[5]:a.iloc[1]Out[5]:14.1.4二元運算series的二元運算和numpy中一元數(shù)組的運算相似。4.1.5統(tǒng)計方法series中提供了常用的統(tǒng)計方法。除了Numpy中已有的方法外,還增加了一些比較邊界的方法,比如describe方法可以一次性返回多個統(tǒng)計值。4.1.6缺失值處理在我們遇到的一些數(shù)據中會有缺失值的情況,我們會將這些缺失值刪除或者插入其他值替代。series對象提供了相應的方法。4.1.7排序series提供了若干排序的方法。argsort方法是給出了排序的索引,rank方法直接給出了順序,而sort_values和sort_index則分別是按值和索引排序。4.1.8計數(shù)與重復在進行數(shù)據處理過程中,我們常常需要對數(shù)據中的數(shù)字進行計數(shù),查看哪些數(shù)字出現(xiàn)的頻次比較高。獲得對于重復數(shù)據進行刪減。4.1.9其他series還包含了其他一些方法。比如查看部分數(shù)據的head和tail,取樣方法sample,條件篩選where和mask,以及判斷是否在另一個序列中的isin方法。4.2DataFramePangdas中的數(shù)據框對象DataFrame可以看作是Series對象的集合,他們共用同一個索引。所以DataFrame具有Series的相應方法,這里不再贅述,可參考4.1小節(jié)的內容。本小節(jié)主要根據具體的操作對DataFrame對象進行講解。4.2.1創(chuàng)建數(shù)據框一般有兩種方式創(chuàng)建數(shù)據框,一是通過字典,而是通過列表。二者皆可獲得相同的結果。4.2.2行操作Pandas的數(shù)據框可以看成是Numpy中的二維數(shù)組。行操作可以利弊Numpy的二維數(shù)組的方法,特別要注意的是loc和iloc的區(qū)別。4.2.3列操作特別要注意的是在列的交換列的方法要使用.values來獲取數(shù)值,否則會失敗。4.3GroupBy分組統(tǒng)計是一個比較常見的操作,我們需要對不同類別的數(shù)據分別進行觀察。比如在一個班級中,我們想要獲得男生的最大年齡和女生最大的年齡,這個時候我們就需要先按性別進行分組,然后分別統(tǒng)計最大的年齡。4.3.1基本函數(shù)基本函數(shù)可以用來查看分組的具體信息。4.3.2統(tǒng)計函數(shù)分組的最主要的作用就是對各個組別進行分組描述。這里返回的是對各個組別的統(tǒng)計的結果。第5章MatplotlibMatplotlib庫是科學計算中比較出名的可視化展示庫,它與Numpy,Pandas被稱為Python科學計算的三劍客。由于Matplotlib庫的過于復雜,本章節(jié)我們將從應用角度對其進行講解。5.1作圖類命令作圖類命令是matplotlib庫的核心,它直接決定了數(shù)據是如何展示的。5.1.1線圖折線圖是最基礎的圖形,在matplotlib中使用plot來繪制。結果如圖5.1所示。在plot方法中,我們可以通過傳入顏色參數(shù)c,線條寬度參數(shù)lw,線條樣式參數(shù)ls來控制最終的呈現(xiàn)樣式。這三個參數(shù)是我們經常使用到的。5.1.2柱狀圖和條形圖條形圖經常用來展示離散的數(shù)據。結果如圖5.3所示。在bar方法中,我們還可以傳入width參數(shù)控制整體寬度,linewidth控制邊緣寬度,color控制填充顏色,edgecolor控制邊緣顏色。結果如圖5.4所示。圖5.3柱狀圖圖5.4更改樣式后的柱狀圖條形圖和柱狀圖屬于同一類型,不過是一個是垂直方向的,一個是水平方向的,在Matplotlib中使用barh來繪制條形圖。結果如圖5.5所示。圖5.5條形圖5.1.3散點圖散點圖常用來觀察實例。Matplotlib中使用scatter來繪制散點圖。結果如圖5.6所示。在scatter方法中可以傳入參數(shù)s來控制點的大小,參數(shù)marker來控制點的樣式,參數(shù)linewidths控制邊界寬度,edgecolors控制邊界的顏色。結果如圖5.7所示。圖5.6散點圖圖5.7更改參數(shù)的散點圖5.1.4餅圖餅圖主要用來展示整體和部分之間的關系。在matplotlib中主要使用pie()方法來繪制餅圖。結果如圖5.8所示。我們還可以通過參數(shù)explode設置中心偏離,參數(shù)labels設置餅圖的標簽,autopct設置百分比顯示。結果如圖5.9所示。圖5.8餅圖圖5.9更改參數(shù)后的餅圖5.1.5面積圖面積圖是直線圖的一種拓展,在Matplotlib中可以使用fill_between和fill_betweenx來做面積圖。首先我們使用fill_between來繪制垂直方向上的面積圖。結果如圖5.10所示。接著我們使用fill_betweenx繪制水平方向上的面積圖。結果如圖5.11所示。圖5.10垂直方向面積圖圖5.11水平方向面積圖5.2坐標軸控制這一小節(jié)介紹關于x軸與y軸的控制方法,比如控制他們的長度,顯示方式等。5.2.1axis我們可以通過axis方法來控制坐標軸是否顯示。首先我們先畫一張對比圖。結果如圖5.12所示。使用axis方法關閉坐標軸顯示。結果如圖5.13所示。圖5.12對比圖圖5.13關閉坐標軸顯示5.2.2xlim與ylim在matplotlib中可以通過設置xlim與ylim來設置坐標軸的長度。結果如圖5.14所示。圖5.14限制x軸和y軸的長度5.2.3xticks與yticks設置x軸與y軸刻度的顯示。結果如圖5.15所示。圖5.15設置刻度顯示5.2.4xlabel與ylabel設置x軸與y軸的名稱。結果如圖5.16所示。圖5.16x軸與y軸的名稱設置5.3其他設置在之前的作圖過程中,其實我們省略了創(chuàng)建繪圖框的步驟,我們可以通過figure方法對繪圖框進行調整。結果如圖15.17所示。通過title方法來設置圖片的名稱。結果如圖5.18所示。圖15.17設置繪圖框的大小圖5.18給圖片添加標題第6章scikit-learnscikit-learn庫是一個通用型開源機器學習庫,它幾乎涵蓋了所有的機器學習算法,并且搭建了高效的數(shù)據挖掘的框架。我們可以通過/stable/來訪問他,如圖6.1所示。圖6.1

scikit-learn官網我們可以看到官網的宣傳中主要提到到了四點:一個簡單高效的數(shù)據挖掘和數(shù)據分析工具。對于所有人都是易用的,而且可以在各個環(huán)境中使用。它是基于Numpy,Scipy和Matplotlib庫。開源的,可以商用。這個庫另一個最大的優(yōu)點是庫的設計是十分有條理的。我們可以看到scikit-learn主要分為六個板塊,他們分別是:分類(classification)回歸(regression)聚類(clustering)降維(dimensionalityreduction)模型選擇(modelselection)預處理(preprocessing)其中分類和回歸問題又被稱為有監(jiān)督學習,而聚類問題被稱為無監(jiān)督學習。而我們在實際進行機器學習過程的先后次序是1)預處理,2)降維,3)有監(jiān)督和無監(jiān)督學習,4)模型選擇,如圖6.2所示。圖6.2機器學習流程6.1預處理(preprocessing)對數(shù)據進行一些清洗,轉換,使得他們更適合機器學習模型。scikit提供了一些預處理的方法,他們分別是標準化,非線性轉換,歸一化,二值化,分類特征編碼,缺失值插補,生成多項式特征,如圖6.3所示。圖6.3預處理相關分類6.1.1標準化為什么要對數(shù)據進行標準化處理?如表6.1所示,我們可以看到收入這一列數(shù)字特別大,而年齡這一列數(shù)字相比之下就特別小。因此,在某些機器學習過程中,收入特征就會表現(xiàn)的比較“搶眼”,而影響最終的模型效果。所以我們要將其單位去除,讓大家在同一起跑線上。我們需要去除這種影響,將該表轉換成另一種形式,如表6.2所示。在scikit中提供了scale方法來對數(shù)據進行標準化。(1)導入相關模塊。(2)導入相關數(shù)據,這里我們將上述表格導入。(3)將數(shù)據標準化。(4)查看標準化結果。(5)查看標準化后的均值。(6)查看標準化后的標準差。6.1.2非線性轉換類似于標準化處理,它是將數(shù)據映射到[0,1]的均勻分布上。非線性轉換將每個特征轉換為相同的范圍內或者分布內。通過這個變化可以將異常的數(shù)據變得更平滑從而受異常值的影響也會變小,但是它卻一定程度上改變了特征內部和特征之間的距離和相關性。(1)導入相關模塊。(2)創(chuàng)建非線性轉換對象。(3)導入相關數(shù)據。(4)進行線性轉換。(5)查看線性轉換的結果,所有的數(shù)值都被轉換[0,1]區(qū)間內的數(shù)字。6.1.3歸一化歸一化的作用是縮放單個樣本,使其具有單位范數(shù)。有兩種歸一化的方式,分別是范數(shù)“L1”和范數(shù)“L2”。(1)導入相關模塊。(2)導入相關數(shù)據。(3)歸一化數(shù)據。(4)查看歸一化之后的結果,這里要注意,歸一化的是針對每一行做的。6.1.4二值化二值化的作用是將數(shù)值型的特征值轉換為布爾值。(1)導入相關模塊。(2)導入相關數(shù)據。(3)查看最后的編碼結果,我們可以看到所有大于100的數(shù)字都被編碼為1,所有小于100的數(shù)字都被編碼為0。(4)查看相關結果。6.1.5分類特征編碼在機器學習過程中,我們經常會遇到字符串形式的特征。這個時候我們就需要將這些字符串類型的特征,轉換為數(shù)值型的特征。比如說“老師”,“學生”,“主任”,我們需要將這些字符串轉換為整數(shù)。比如講“老師”轉換為0,將“學生”轉換為1,將“主任”轉換為2。這樣的轉換會提高機器學習的效率,但是這樣的轉換還是不夠的,因為這樣連續(xù)數(shù)值的輸入,分類器會認為類別之間是有序的,但實際上“老師”,“學生”,“主任”他們時間是無序的,而且沒有大小的區(qū)別。這個時候我們就需要將這些數(shù)值進一步轉換。我們的解決思路就是將某個特征n個可能,轉換為n個特征,轉換后的特征是0,1二值類型數(shù)據。(1)導入相關模塊。(2)創(chuàng)建One-Hot編碼對象。(3)導入相關數(shù)據。(4)訓練One-Hot編碼對象。(5)查看編碼后的結果。我們可以看到第一列有四種情況,所以第一列會被分為4個列。也就是說原來的。0表示為[1,0,0,0],1表示為[0,1,0,0],2表示為[0,0,1,0],3表示為[0,0,0,1]。同樣的道理,第二列也被分為四個列,4表示為[1,0,0,0],5表示為[0,1,0,0],6表示為[0,0,1,0],7表示為[0,0,0,1]。6.1.6缺失值插補我們所獲得的數(shù)據不一定是完整的數(shù)據,里面可能存在著缺失的情況。這時候就需要對這些缺失的數(shù)據做一些處理,以補全它們。(1)導入相關模塊。(2)創(chuàng)建插值對象。(3)導入相關數(shù)據。(4)訓練插值模塊。(5)進行轉換。在axis=0的情況下,第一列有兩個非空值,他們的均值是1.5,所以空值全部都用1.5填充。6.1.7生成多項式特征在機器學習中,有些時候數(shù)據集的特征很少,這個時候就需要我們自己根據以后的特征構造一些新的特征出來。(1)導入相關模塊。(2)創(chuàng)建多項式特征對象。(3)導入相關數(shù)據。(4)訓練多項式特征對象。(5)將原數(shù)據轉換為多項式,X的特征已經從轉換為。6.2降維在機器學習過程中,我們可能會碰到一些維度非常多的數(shù)據,當使用這些復雜維度做學習時可能會產生兩個問題:維度多會造成過度擬合。維度多會增加機器學習算法的復雜度,從而降低機器學習的效率。scikit-learn庫中提供了三種降低維度的方法,他們分別是PCA,隨機投影和特征凝聚,如圖6.4所示。在本書的第16章PCA降維我們會詳細講解其方法和思想。圖6.4scikit-learn提供的降維方法6.3有監(jiān)督學習、無監(jiān)督學習有監(jiān)督學習是指在訓練模型的過程中,已知正確結果。scikit-learn中提供了多種有監(jiān)督學習的方法,如圖6.5所示。本書的第8章至第15章都屬于有監(jiān)督學習的范疇。無監(jiān)督學習是指在訓練模型過程中,不給出目標變量,讓算法自動找尋訓練集中的規(guī)律,如圖6.6所示。本書的第18章聚類具體會闡述無監(jiān)督學習思想和方法。6.4模型評估當我們對一個數(shù)據集選定模型,并進行訓練之后,我們需要對這個模型進行評估,以判定這個模型的優(yōu)劣。不好的模型通常有以下兩種情況:欠擬合。欠擬合是指模型不能很好的適應和擬合已有的數(shù)據。欠擬合的模型在訓練集和測試集上表現(xiàn)得都會很差。過度擬合。過度擬合是指模型非常完美的適應和擬合已有的數(shù)據,這將導致該模型的泛化能力嚴重下降。過度擬合在訓練集上表現(xiàn)幾乎完美,而在測試集上則表現(xiàn)的很差。所以,最優(yōu)的模型應該是欠擬合和過度擬合的折中,它既較好的擬合了訓練集又具有很好的泛化能力,這種泛化能力主要體現(xiàn)就是在測試集上也會有很好的表現(xiàn)。6.4.1測試集評分在scikit-learn包中,提供了測試集評分的方法。讓我們看一個簡單的例子:(1)導入相關模塊。(2)導入相關數(shù)據,這里導入鳶尾花數(shù)據集。(3)查看數(shù)據集屬性數(shù)據形狀。(4)查看數(shù)據集目標變量數(shù)據形狀。(5)將數(shù)據集分割為訓練集和測試集,分割比例是4:1。(6)查看訓練集數(shù)據。(7)查看訓練集數(shù)據。(8)查看學習集數(shù)據。(9)查看學習集數(shù)據。(10)創(chuàng)建knn分類器對象。(11)訓練模型。(12)對測試結果進行評分??磥磉@個模型的得分不錯。我們可以調整模型不同的參數(shù)對其最后的得分進行比較,然后選擇得分較多的參數(shù)模型作為最終的結果。但是,在不同的實驗過程中,我們的測試集可能在某次實驗上,同訓練集同時出現(xiàn)了過度擬合的情況,從而導致了在真實的應用過程中,泛化能力降低的結果。我們現(xiàn)在對數(shù)據集的劃分,如圖6.7所示。為了避免這個種情況的發(fā)生,我們需要再設置一個“驗證集”,當模型訓練完成以后,現(xiàn)在驗證集上對模型進行評估,然后選擇評估分數(shù)最高的模型,再在測試集上進行最終的測試,如圖6.8所示。圖6.7將數(shù)據分割為訓練集和測試集,可能同時出現(xiàn)過度擬合圖6.8將數(shù)據分割為訓練集,驗證集和測試集這是比較標準的模型評估過程,但是這并不是最優(yōu)的辦法。雖然“驗證集”的選擇,有效的避免的測試集出現(xiàn)過度擬合的情況,但是現(xiàn)在我們已經將元數(shù)據分為了三個部分:“訓練集”、“驗證集”和“測試集”。我們大大減少了“訓練集”的數(shù)據量,這可能造成訓練的模型效果很差。另外一方面,由于驗證集和測試集,仍然是一次選擇的結果,所以最后的模型評估結果有很大的隨機性。交叉驗證(Cross-validation)很好的解決了這兩個問題。交叉驗證多次選擇了測試集做最后的評估,這有效的避免了隨機性所帶來的誤差。而且交叉驗證不需要選擇驗證集,這樣就避免的數(shù)據的浪費,使得訓練集中有足夠的樣本數(shù)量。交叉驗證最基本的方法是k折交叉驗證(k-foldcrossvalidation)。它的原理是,如圖6.9所示。圖6.9交叉驗證,白色是訓練集,黑色是測試集將原始數(shù)據隨機分為k份。每次挑選其中k-1份作為訓練集,剩余的1分作為測試集進行訓練。循環(huán)第2步k次,這樣每一份都會被作為測試集。計算k組測試集評估結果的平均值作為模型的最終得分。當然交叉驗證唯一的缺點就是計算代價相對較高。實現(xiàn)交叉驗證可以調用scikit-learn里面提供的cross_val_score輔助函數(shù)。交叉驗證實例如下:(1)導入相關模塊。(2)導入相關數(shù)據集。(3)創(chuàng)建knn分類器對象。(4)對分類器進行交叉驗證。(5)查看驗證結果。這里是每次迭代的分數(shù),我們可以看到最低的得分只有0.86,而最高的話是1。(6)查看均值。(7)查看標準差。6.4.2交叉驗證迭代器我們已經了解了交叉驗證的基本思想,接下來我們將會介紹幾個不同的交叉迭代器以及它們的使用方法。1.K折KFold會將數(shù)據集劃分為k個分組,成為折疊(fold)。如果k的值等于數(shù)據集實例的個數(shù),那么每次的測試集就只有一個,這種處理方式我們成為“留一”。在sci-kit中提供了KFold方法來進行分組。2.重復K折交叉驗證在KFold方法中,是采用的不放回的抽樣方法,在scikit中還提供了RepeatedKFold方法來進行重復抽樣。3.留一交叉驗證留一交叉驗證是K折的特殊情況,既k的值等于數(shù)據集實例的個數(shù)。留一交叉驗證的優(yōu)點是每次訓練的訓練集都是除了一個樣本之外的所有樣本,所以保證了訓練集樣本盡可能大。4.留P交叉驗證留P交叉驗證是值選定P個樣本做測試集,然后輸出所有可能的訓練-測試集對。與LeaveOneOut和KFold不同的地方是,當P>1時,測試集會有重疊。5.隨機排列交叉驗證這個方法會將數(shù)據集分散,隨機排列,然后劃分為一對測試集和訓練集。6.4.3分層交叉驗證迭代器有些數(shù)據集并不像我們想象的分布那么均勻,這樣在訓練模型后會出現(xiàn)極大的不平衡。這個時候我們就需要采用分層抽樣。6.4.4分組迭代器有些時候,測試集的數(shù)據可能是分組得來的。這個時候有可能出現(xiàn)的情況就是組內的各個變量之間不是獨立的,而組間是獨立的。這個時候再做訓練集和測試集的時候我們就要剔除掉這個影響因素,也就是說測試集中的樣本組別不能來自于訓練集中樣本的組別。1.組K折2.留一組交叉驗證3.留P組交叉驗證4.隨機排列組交叉驗證6.4.5時間序列交叉驗證Scikit中還提供了專門用于時間序列模型的交叉驗證器。第7章機器學習常用數(shù)據集本章將介紹5個機器學習常用的數(shù)據集,他們分別是boston房價數(shù)據集,diabetes糖尿病數(shù)據集,digits手寫字體數(shù)據集,irirs鳶尾花數(shù)據集以及wine紅酒數(shù)據集。7.1boston房價數(shù)據集boston房價數(shù)據集總共有506個樣本,每個樣本有13個特征變量和1個目標變量。每一個樣本代表了波士頓的一個區(qū)域(城鎮(zhèn))。7.1.1數(shù)據集基本信息描述實例個數(shù):506特征個數(shù):14特征信息:--CRIM:城鎮(zhèn)人均犯罪率。--ZN:住宅用地超過25000平方英尺的比例。--INDUS:城鎮(zhèn)非商業(yè)用地的比例。--CHAS:查理斯河空變量(如果邊界是河流,則為1;否則為0)。--NOX:一氧化氮濃度。--RM:住宅平均房間數(shù)。--AGE:1940年之前建成的自用房屋比例。--DIS:到波士頓五個中心的加權距離。--RAD:輻射公路的可達指數(shù)。--TAX:每10000美元的全值財產稅率。--PTRATIO:城鎮(zhèn)師生比例。--B:1000(Bk-0.63)^2,其中Bk指代城鎮(zhèn)中黑人的比例。--LSTAT:人口中地位低下者的比例。--MEDV:自住房的平均房價,以千美元計。丟失特征信息:無創(chuàng)建者:Harrison,D.andRubinfeld,D.L.這個數(shù)據集并沒有給定目標變量,一般我們將“MEDV”特征作為目標變量。7.1.2數(shù)據探索數(shù)據探索具體操作如下:(1)導入相應模塊。(2)導入boston數(shù)據集。(3)查看boston數(shù)據集結構?!癲ata”是特征數(shù)據,“target”是目標變量數(shù)據,“feature_names”是特征名稱(特征名稱)。(4)查看boston數(shù)據集特征數(shù)據結構,總共有506個實例,每個實例有13個特征。(5)查看boston數(shù)據集特征數(shù)據具體數(shù)值。(6)查看boston數(shù)據集特征名稱。(7)查看boston數(shù)據集目標變量結構。(8)查看boston數(shù)據集目標變量具體數(shù)據。這個就是我們上面所提到的MEDV:自住房的平均房價。7.2diabetes糖尿病數(shù)據集這個數(shù)據集是一個關于糖尿病患者病情的數(shù)據集。總共有442位糖尿病患者,11個變量。其中包含了10種因變量,分別是年齡(age),性別(sex),體重指標(bmi),平均血壓(bp)和6中血清測量指標(s1-s6),以及一個目標變量疾病級數(shù)(dp)。其中10種因變量已經做了標準化處理。7.2.1數(shù)據基本信息描述實例個數(shù):442特征個數(shù):10特征名稱:--Age(年齡)--Sex(性別)--Bodymassindex(身體質量指數(shù))--Averagebloodpressure(平均血壓)--S1(血清的化驗數(shù)據)--S2(血清的化驗數(shù)據)--S3(血清的化驗數(shù)據)--S4(血清的化驗數(shù)據)--S5(血清的化驗數(shù)據)--S6(血清的化驗數(shù)據)目標變量:第11列,記錄了從基準時間一年后疾病的進展這個數(shù)據的數(shù)據值都經過了標準化處理。7.2.2數(shù)據探索數(shù)據探索具體操作如下:(1)導入必要的模塊。(2)導入數(shù)據集。(3)查看數(shù)據集的內容。數(shù)據集是一個字典,總共分四部分,因變量數(shù)據(data)、目標變量數(shù)據(target)、數(shù)據集描述(DESCR)、因變量標簽名(feature_names)。(4)查看變量標簽名。(5)查看變量對應的值。(6)查看目標變量,即糖尿病病情的評級。(7)觀察目標變量。(8)觀察體重指標變量。7.3digits手寫數(shù)字光學識別數(shù)據集圖像識別是機器學習的一個重要的分支應用。其實圖像識別對我們來說并不陌生,比如我們隨身攜帶的手機就有一個常用的圖像識別技術的應用——照相機功能。照相機功能中有一個輔助的選項是人臉識別,這個就是圖像識別技術。本小節(jié)所介紹的手寫字體識別是圖像識別的一部分,它主要解決的問題是將我們的手寫字體轉換為電腦可以識別的字符。這個應用使非常廣泛的,比如有大量的文檔資料,轉換為電子資料,然后對這些資料做自然語言處理。那么如何將手寫字體的圖像轉換為字符呢?這個要用到后續(xù)章節(jié)所講到的分類算法。在這之前,我們先看一下,計算機是如何存儲這些手寫字體的。讓我們先看一個手寫字體的圖片,如圖7.1所示。對照著,我們來看一下,計算機是如何通過數(shù)字將這些圖片展示出來的,如表7.1所示,我們可以看到,手寫字體的圖片可以和表一一對應起來,表中是一個8*8的矩陣,矩陣的每個元素的大小代表了圖片中對應的像素點的深淺,比如[2,2]點,數(shù)值是15,那么對應的圖片的相對位置他的顏色也就越深。你是否能直接看表,猜出這個手寫字體是什么呢?同樣的我們給出每個字體對應的圖片以及矩陣。圖7.1手寫字體0,右邊是放大后的效果同樣的我們還可以給出其他手寫字體對應的圖片和矩陣信息,如手寫字體1,如圖7.2、表7.2所示。圖7.2手寫字體1圖片7.3.1數(shù)據集基本信息描述實例個數(shù):5620(本數(shù)據集含有1797)特征個數(shù):64特征信息:每個圖片是8*8的矩陣,像素值的范圍是[0-16]丟失特征值:無創(chuàng)建者:E.Alpaydin(alpaydin'@'.tr)時間:1998年7月這個數(shù)據集是UCIML手寫字體數(shù)據集的一部分。這個數(shù)據集包含了10個類別的手寫字體,他們分別是0,1,2,3,4,5,6,7,8,9。這些數(shù)據集是總共搜集了43個人的手寫字體數(shù)據,其中30個人是作為訓練集,另外的13個人是作為測試集。7.3.2數(shù)據集探索數(shù)據探索具體操作如下:(1)導入相關模塊。(2)獲得手寫字體的數(shù)據集。(3)查看該數(shù)據集的結構。(4)獲得目標變量的種類,以看到這里總共有10類手寫字體。(5)獲得實例的特征數(shù)據。(6)查看第0個實例的數(shù)據。(7)每個實例總共有64個特征值,也就是說一個手寫字體是8*8的矩陣。(8)將每個實例轉換為圖形矩陣。(9)查看圖片具體形狀。(10)查看“images”。我們可以看到數(shù)據已經轉換為矩陣的形式,所以不需要我們再一步一步的轉換,來查看圖片。在做訓練時,我們直接使用“data”,而在查看圖片時我們直接使用“images”。(11)查看目標變量。(12)查看目標變量的個數(shù)。7.4iris鳶尾花數(shù)據集鳶尾花數(shù)據集也許是最廣為人知的數(shù)據集。這個數(shù)據集包含了三個種類,每個種類包含了50個實例,每個種類是鳶尾花的一個分類。其中有一個種類是可以和其它兩類線性可分的。7.4.1數(shù)據集基本信息描述:實例的數(shù)量:150(每個種類分別含有50個實例)特征的數(shù)量:4個數(shù)值型特征特征信息:--sepallengthincm(花萼的長度,單位厘米)--sepalwidthincm(花萼的寬度,單位厘米)--petallengthincm(花瓣的長度,單位厘米)--petalwidthincm(花瓣的寬度,單位厘米)--類別:--Setosa--Versicolour--Virginica丟失的特征值:無類別的分布:每個種類占33.3%創(chuàng)建者:R.A.Fisher時間:1988年7月7.4.2數(shù)據探索數(shù)據探索具體操作如下:(1)導入相關的包。。(2)讀取iris數(shù)據集(3)查看數(shù)據集的結構?!癲ata”是特征數(shù)據,“feature_names”是特征名稱(特征名稱),“target”是目標變量,“target_names”是目標變量名稱,“DESCR”是描述信息。(4)查看“data”的類別。(5)查看“data”的形狀。總共有150行(150個實例),4列(4個特征)。(6)查看“data”的具體數(shù)據。(7)查看“feature_names”,既特征的名稱,對應著“data”的四個列。(8)查看目標變量“target”的類別。(9)查看“target”的形狀。(10)查看“target”的具體數(shù)據。(11)查看目標變量“target”數(shù)值對應的意義也就是說0代表了‘setosa’,1代表了‘versicolor’,2代表了‘virginica’。(12)將iris數(shù)據集轉換為pandas的DataFrame對象13)觀察各個特征之間的關系,結果如圖7.11所示。圖7.11鳶尾花數(shù)據集各個變量之間的關系圖7.11鳶尾花數(shù)據集各個變量之間的關系7.5wine紅酒數(shù)據集這個數(shù)據集是來自意大利同一個地區(qū)的不同的耕種地點的紅酒的化學成分分析。在這個三個不同種類的紅酒中總共發(fā)現(xiàn)13個不同的成分的測量結果。7.5.1數(shù)據集基本信息描述實例個數(shù):178特征個數(shù):13特征信息:(1)1)Alcohol(2)Malicacid(3)Ash(4)Alcalinityofash(5)Magnesium(6)Totalphenols(7)Flavanoids(8)Nonflavanoidphenols(9)Proanthocyanins(10)Colorintensity(11)Hue(12)OD280/OD315ofdilutedwines(13)Proline目標變量:3個種類目標變量:class_0(59),class_1(71),class_2(48)丟失特征值:無創(chuàng)建者:R.A.Fisher創(chuàng)建時間:1988年7月7.5.2數(shù)據探索數(shù)據探索具體操作如下:(1)導入相關模塊。(2)導入wine數(shù)據集。(3)查看wine數(shù)據集的結構。(4)查看wine數(shù)據集特征數(shù)據的結構。總共有178個實例,每個實例有13個特征。(5)查看wine數(shù)據集特征的具體數(shù)據。(6)查看wine數(shù)據集特征的名稱。(7)查看wine數(shù)據集目標變量的形狀。(8)查看wine數(shù)據集目標變量。總共有三類數(shù)據,分別用0,1,2來指代。(9)查看目標變量名稱。第8章回歸算法回歸算法是一種預測連續(xù)型變量的方法。它的根本思想是通過已給樣本點的因變量和自變量的關系,進而設定一個數(shù)學模型,來擬合這些樣本點?;貧w算法就是為了找到最佳的模型?;貧w方法的核心有兩個。第一,假設合適的模型,比如使用一次曲線擬合,還是用二次曲線擬合?第二個是尋找最佳的擬合參數(shù),不同的參數(shù)對應了模型的不同的形態(tài),如何找到最佳的參數(shù)是關鍵的一步。8.1從二次函數(shù)到機器學習在高中的數(shù)學知識體系中,我們尋找二次曲線的最大值和最小值的方法是令導數(shù)為0,這樣的方法也可以用在求解回歸算法的問題中。但是在機器學習領域并不推崇這種思想,因為再實際應用中,使用導數(shù)為0的方法,會增加計算機計算的復雜度,消耗大量計算資源。而機器學習的求解方法則會在高維空間的求解中體現(xiàn)出計算的優(yōu)勢。本章會詳細介紹機器學習中求解回歸曲線的方法——梯度下降。并從求解二次曲線為起點,比較導數(shù)方法與梯度下降方法的異同,從而加深對梯度下降方法的理解。8.1.1二次函數(shù)最優(yōu)求解方法在高中時期,大家經常遇到函數(shù)最大值、最小值的求解問題。比如,給出方程,求其最小值(y值),以及最小值的所在位置(x值)。如圖8.1所示,我們很容易看出的最小值是0,最小值的位置是。在高中我們使用的求解方法是求曲線的導數(shù),令,求得。導數(shù)求解的方法的幾何解釋是最低點的位置是斜率為0的位置,也就是的位置。大家覺得這不就是簡單的高中知識嗎,機器學習有什么聯(lián)系呢?其實現(xiàn)在比較火熱的深度學習和經典的線性回歸、邏輯回歸算法,最根本的思想就是求解類二次曲線的最小值。我們后續(xù)章節(jié)會深入探討深度學習背后的數(shù)學思想。接下來,我們介紹機器學習中,求解二次函數(shù)最小值的方法。圖8.1二次函數(shù)曲線8.1.2梯度下降在已知曲線是,我們很容易通過求導來求得最小值以及它的位置。但如果你不知道曲線的全貌是,又該如何求解呢?如圖8.2所示,現(xiàn)在已知點,6400和這個點周圍曲線的形狀?,F(xiàn)在的任務是找到該曲線的最小值的點,你應該如何做呢?圖8.2二次函數(shù)曲線(部分)設想一下,你站在半山坡上,看不到山頂,也看不到山谷,只能看到周圍的情景,你要下山,你要怎么做呢?對,沿著山坡最大的坡度向下走!當走到下一個位置時,再選擇最大的坡度向下走,這樣不停的走,我們就可以走到山下。讓我們一起來看一下,這個思想在數(shù)學上的解釋?;氐綀D8.2,按照下山的思想,我們應該將點向左移動一點。如圖8.3所示,我們從點(80,6400)移動到了點(72,5184)。同樣的道理,在這個點我們觀察一下,應該繼續(xù)向左移動。如圖8.4所示,我們現(xiàn)在移動了點(64.8,

4199.04)的位置,同樣的道理,繼續(xù)觀察,我們還應該向左移動,這樣循環(huán)往復,我們會不會走到山底呢?圖8.3二次函數(shù)曲線(部分)圖8.4二次函數(shù)曲線(部分)如圖8.5所示,我們移動了93次,最終到達了點(0,0)位置(這里計算精度是小數(shù)點后兩位),也就是說我們已經逼近了最小值(0,0)點。在此過程中每一步下降過程的坐標。我們用梯度下降的方法實現(xiàn)了求解二次函數(shù)的最小值,雖然他不像導數(shù)方法那么完美能直接定位到原點(0,0),但是只要我們增加迭代次數(shù),我們就能無限接近最小值點。接下來,我們需要懂得,梯度下降的一些細節(jié),比如每次步長應該如何選擇呢?如果步長選擇太大,很有可能會越過最小值點。圖8.5二次函數(shù)曲線(部分)8.1.3梯度下降python實現(xiàn)已知函數(shù),以及它的導數(shù)。偽代碼:第1步,隨機初始化一個坐標()第2步,將移動至位置,記為,并求出。這里是所謂的學習速率,是該點的導數(shù)。第3步,重復第二步,獲得()點?!?000步,獲得()點的位置。Python實現(xiàn):8.1.4初始值的選擇與學習速率的選擇初始值的選擇依托于所假設的數(shù)學模型,這里的數(shù)學模型會在今后的章節(jié)討論。不同的數(shù)學模型反映在二次函數(shù)上則會是隨機的初始點。速率的選擇是以梯度下降思想的核心,選擇直接影響了最后結果的好壞以及整個算法的效率。1.過小,將導致無法找到最小值如圖8.6所示,初始點我們選擇(100,100),當時,移動了100次,才到達x=55附近。雖然在這種情況下我們仍可以增加移動次數(shù)最終到達最小值的點,但是卻耗費了大量的時間和算力。特別是在工程應用中,時間和算力決定了一個算法是否有實際價值。而在極端情況下,當足夠小,將無法到達最小值點。圖8.6過小導致迭代速度極慢2.適中,將很快達到最小值如圖8.7所示,初始點我們選擇(100,100),當時,只移動了2次就到達的最小值。圖8.7很快達到最小值3.一定閾值,可能從兩側收斂到最低點如圖8.8,表8.2所示,初始點我們選擇(40,1600),當時,將從兩端收斂到最小值。表8.2從兩端收斂到最小值(保留2位小數(shù))4.一定閾值,可能導致來回震蕩如圖8.9所示,初始點我們選擇(40,1600),當時,移動點將在(40,1600),(-40,1600)來回震動圖8.8從兩端收斂到最小值圖8.9導致來回震蕩5.過大,將導致無法找到最小值,甚至發(fā)散過小,雖然可能到達不了最小值的點,但是移動的方向仍是正確的,既向著最小值方向移動。但過大,則可能造成偏離最小值的情況,既向著最小值的反方向移動。如圖8.10,表8.3所示,初始點我們選擇(20,400),當時,每次移動都跨越了最低值,而且越來越偏離最小值。圖8.10,過大導致發(fā)散,無法收斂到最小值表8.3過大導致無法收斂到最小值(保留2位小數(shù))綜上所述,我們可以總結到的選擇規(guī)律:既隨著學習速率的遞增,學習過程從速度極慢,到兩邊震蕩收斂,再到兩邊震蕩發(fā)散。那么在實際應用中我們應該如何選擇呢?這個要根據不同的應用場景來具體設置。到目前為止,我們已經詳細了解了機器學習中一個很重要的思想,既“梯度下降”。它是線性回歸,邏輯回歸以及神經網絡的核心思想,接下來就讓我們看一下梯度下降是如何應用到這三類算法中的。8.2線性回歸所謂的線性回歸就是已知樣本分布,選擇合適的曲線取擬合它們,然后用擬合曲線預測新的樣本。如圖8.11所示,假設坐標系中有三點[1,2],[3,1],[3,3],我們的目的是找一條經過(0,0)點的直線取擬合它們。圖8.11坐標系中三點[1,2],[3,1],[3,3]如果不使用數(shù)學工具,直接用手畫的話,我們很容易獲得這樣的直線。圖下圖8.12所示。這條曲線最大程度上擬合了三個點。那么如何用數(shù)學方法獲得這個曲線呢?圖8.12手畫擬合曲線8.2.1回歸曲線的數(shù)學解釋

8.2.2梯度下降方法求解最優(yōu)直線

圖8.12初始化直線如圖8.14,我們設置學習速率,直線初始化位置,右邊圖片記錄了每次迭代直線的位置。我們迭代124次,得到了最優(yōu)的直線。迭代過程,具體數(shù)據如表8.4所示。圖8.14梯度下降法求最優(yōu)曲線8.2.3理解“機器學習”中的“學習”至此,我們通過梯度下降方法求解了機器學習中一個重要的問題——線性回歸。您是否已經通過這個過程理解了“機器學習”中“學習”的意思?在求解最優(yōu)直線過程中,我們隨機假設一條直線,然后獲得他與最優(yōu)解的距離(差距),我們找到了到最優(yōu)解的方向(曲線斜率),然后按著這個方向以一定的步長(學習速率)不斷的移動(學習過程),最終得到了最優(yōu)解。這就是所謂的“學習”。8.2.4導數(shù)求解與梯度下降為什么在得到損失函數(shù)后不直接令,而求得最優(yōu)的參數(shù)呢?這樣只要一步,而且可以獲得最優(yōu)解,而不是像梯度下降方法一樣,只能無限接近。因為我們所舉的例子,只有一個參數(shù),而在現(xiàn)實應用中,可能有n個參數(shù),隨著數(shù)量的增加,導數(shù)求解的方法的復雜度會急劇上升,計算的性能會下降。這時梯度下降的優(yōu)勢就展現(xiàn)出來了,梯度下降即使在面對高維空間求解(多個參數(shù)),計算性能也會很好。8.2.5學習速率與迭代次數(shù)如何設置具體情況應該看具體的模型以及損失函數(shù)。在實際應用中我們可以打印出每一次迭代的所有數(shù)據,與8.1.4章節(jié)中的情況相比對,從而得出最優(yōu)的學習速率。一般情況下,取。而迭代次數(shù)也是決定最終模型好壞的關鍵因素,同樣的,在第一次迭代模型的時候可以設置一個比較大的值,每次迭代觀察系數(shù)的變化。根據這些值獲得最優(yōu)的迭代值。一般設置迭代次數(shù)為1000。8.3實戰(zhàn)—糖尿病患者病情預測回歸算法被廣泛應用于醫(yī)學領域。本章節(jié)我們將通過糖尿病患者的體重,預測糖尿病患者接下來病情發(fā)展的情況。在實際應用中,我們就可以根據這樣的預測模型,提前預知病患的病情發(fā)展,從而提前做好應對措施,改善患者的病情。(1)導入必要的模塊。這里我們用到了sklearn中的diabetes數(shù)據集,所以要先導入數(shù)據集模塊。然后我們會使用線性回歸模型,所以導入了linear_model模塊。在最后我們需要對模型進行評估所以需要導入mean_squared_error,r2_score模塊。(2)導入數(shù)據集。(3)觀察目標變量。這里我們導入目標變量,并對它的一些信息進行觀察。(4)觀察體重指標變量。這個模型中,我們主要想通過體重指標來預測目標變量,所以通過numpy的索引方法取得體重相關的數(shù)據。(5)處理訓練集和測試集。分別對因變量和自變量進行分組,通過訓練集來訓練我們的模型,然后通過測試集評價我們的模型。這里取訓練集和測試集是手工的方法,sklearn中還提供了專有的方法來取訓練集和測試集。具體請看第6章。(6)訓練模型并預測。(7)查看模型評價。(8)作圖,如圖8.14所示。通過模型我們可以看出,隨著體重指標的增加,病情的級數(shù)也在增加。通過這個模型我們就可以預測某位患者接下來一年內病情將會如何發(fā)展。當然通過多變量分析我

溫馨提示

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

評論

0/150

提交評論