看完書可以看看這兩則面試招聘:
面試:5萬字近百頁影涉,數(shù)據(jù)科學(xué)面試終極指南
招聘·OPPO高級爬蟲架構(gòu)師
本書翻譯已加入ApachCN的開源協(xié)作項目,見 https://github.com/apachecn/hands-on-ml-zh/tree/master/docs。
我負(fù)責(zé)翻譯的是前兩章刷允。我在搬運后面章節(jié)的時候割捅,也做了一定修改。
ApacheCN_飛龍轉(zhuǎn)載了所有章節(jié)璧榄,大家可以去他的頁面查看特漩,鏈接吧雹。
(第一部分 機器學(xué)習(xí)基礎(chǔ))
第01章 機器學(xué)習(xí)概覽
第02章 一個完整的機器學(xué)習(xí)項目(上)
第02章 一個完整的機器學(xué)習(xí)項目(下)
第03章 分類
第04章 訓(xùn)練模型
第05章 支持向量機
第06章 決策樹
第07章 集成學(xué)習(xí)和隨機森林
第08章 降維
(第二部分 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))
第9章 啟動和運行TensorFlow
第10章 人工神經(jīng)網(wǎng)絡(luò)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(上)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(下)
第12章 設(shè)備和服務(wù)器上的分布式 TensorFlow
第13章 卷積神經(jīng)網(wǎng)絡(luò)
第14章 循環(huán)神經(jīng)網(wǎng)絡(luò)
第15章 自編碼器
第16章 強化學(xué)習(xí)(上)
第16章 強化學(xué)習(xí)(下)
下載本書和代碼:http://www.reibang.com/p/9efbae6dbf8e
本書自2017年4月9日出版,便長期占據(jù)美國亞馬遜Computer Science前三涂身,評分4.6雄卷,幾乎80%是給的5星好評。CS類里面其實有許多科普書蛤售,真正的技術(shù)類書籍里面丁鹉,就是這本和《Deep Learning》分享第一和第二。
作者Aurélien Géron悴能,法國人揣钦,畢業(yè)于AgroParisTech(1994-1997),曾任Google Youtube視頻分類項目組負(fù)責(zé)人漠酿,創(chuàng)建過多家公司并擔(dān)任CTO冯凹,也曾在AgroParisTech擔(dān)任講師。
Aurélien在谷歌期間(2013年11月 – 2016年4月)炒嘲,正是人工智能發(fā)展最為迅速的時期:2015年11月TensorFlow發(fā)布宇姚,16年3月AlphaGo擊敗李世石。此時夫凸,他的正式職位是 Lead of YouTube's video classification for Search & Discovery空凸,要對海量視頻資源做機器處理,想必第一時間就能接觸新技術(shù)寸痢,是人工智能革命中的一線參與者和見證者呀洲。
大多數(shù)人聽到“機器學(xué)習(xí)”,往往會在腦海中勾勒出一個機器人:一個可靠的管家啼止,或是一個可怕的終結(jié)者道逗,這取決于你問的是誰。但是機器學(xué)習(xí)并不是未來的幻想献烦,它已經(jīng)來到我們身邊了滓窍。事實上,一些特定領(lǐng)域已經(jīng)應(yīng)用機器學(xué)習(xí)幾十年了巩那,比如光學(xué)字符識別 (Optical Character Recognition吏夯,OCR)。但是直到1990年代即横,第一個影響了數(shù)億人的機器學(xué)習(xí)應(yīng)用才真正成熟噪生,它就是垃圾郵件過濾器(spam filter)。雖然并不是一個有自我意識的天網(wǎng)系統(tǒng)(Skynet)东囚,垃圾郵件過濾器從技術(shù)上是符合機器學(xué)習(xí)的(它可以很好地進行學(xué)習(xí)跺嗽,用戶幾乎不用再標(biāo)記某個郵件為垃圾郵件)。后來出現(xiàn)了更多的數(shù)以百計的機器學(xué)習(xí)產(chǎn)品,支撐了更多你經(jīng)常使用的產(chǎn)品和功能桨嫁,從推薦系統(tǒng)到語音識別植兰。
機器學(xué)習(xí)的起點和終點分別是什么呢?確切的講璃吧,機器進行學(xué)習(xí)是什么意思楣导?如果我下載了一份維基百科的拷貝,我的電腦就真的學(xué)會了什么嗎畜挨?它馬上就變聰明了嗎爷辙?在本章中,我們首先會澄清機器學(xué)習(xí)到底是什么朦促,以及為什么你要使用它膝晾。
然后,在我們出發(fā)去探索機器學(xué)習(xí)新大陸之前务冕,我們要觀察下地圖血当,以便知道這片大陸上的主要地區(qū)和最明顯的地標(biāo):監(jiān)督學(xué)習(xí)vs非監(jiān)督學(xué)習(xí),線上學(xué)習(xí)vs批量學(xué)習(xí)禀忆,基于實例vs基于模型學(xué)習(xí)臊旭。然后,我們會學(xué)習(xí)一個典型的機器學(xué)習(xí)項目的工作流箩退,討論可能碰到的難點离熏,以及如何評估和微調(diào)一個機器學(xué)習(xí)系統(tǒng)。
這一章介紹了大量的每個數(shù)據(jù)科學(xué)家需要牢記于心的基礎(chǔ)概念(和習(xí)語)戴涝。第一章只是概覽(唯一不含有代碼的一章)滋戳,相當(dāng)簡單,但你要確保每一點都搞明白了啥刻,再繼續(xù)進行學(xué)習(xí)本書其余章節(jié)奸鸯。端起一杯咖啡,開始學(xué)習(xí)吧可帽!
提示:如果你已經(jīng)知道了機器學(xué)習(xí)的所有基礎(chǔ)概念娄涩,可以直接翻到第2章。如果你不確信映跟,可以嘗試回答本章末尾列出的問題蓄拣,然后再繼續(xù)。
什么是機器學(xué)習(xí)努隙?
機器學(xué)習(xí)是通過編程讓計算機從數(shù)據(jù)進行學(xué)習(xí)的科學(xué)(和藝術(shù))球恤。
下面是一個更廣義的概念:
機器學(xué)習(xí)是讓計算機具有學(xué)習(xí)的能力,無需進行明確編程剃法。 —— 亞瑟·薩繆爾碎捺,1959
和一個工程性的概念:
計算機程序利用經(jīng)驗E學(xué)習(xí)任務(wù)T桂躏,性能是P凤薛,如果針對任務(wù)T的性能P隨著經(jīng)驗E不斷增長,則稱為機器學(xué)習(xí)砸讳。 —— 湯姆·米切爾优构,1997
例如诵叁,你的垃圾郵件過濾器就是一個機器學(xué)習(xí)程序,它可以根據(jù)垃圾郵件(比如钦椭,用戶標(biāo)記的垃圾郵件)和普通郵件(非垃圾郵件拧额,也稱作ham)學(xué)習(xí)標(biāo)記垃圾郵件。用來進行學(xué)習(xí)的樣例稱作訓(xùn)練集彪腔。每個訓(xùn)練樣例稱作訓(xùn)練實例(或樣本)侥锦。在這個例子中,任務(wù)T就是標(biāo)記新郵件是否是垃圾郵件德挣,經(jīng)驗E是訓(xùn)練數(shù)據(jù)恭垦,性能P需要定義:例如,可以使用正確分類的比例格嗅。這個性能指標(biāo)稱為準(zhǔn)確率番挺,通常用在分類任務(wù)中。
如果你下載了一份維基百科的拷貝屯掖,你的電腦雖然有了很多數(shù)據(jù)玄柏,但不會馬上變得聰明起來。因此贴铜,這不是機器學(xué)習(xí)粪摘。
為什么使用機器學(xué)習(xí)?
思考一下绍坝,你會如何使用傳統(tǒng)的編程技術(shù)寫一個垃圾郵件過濾器(圖1-1):
你先觀察下垃圾郵件一般都是什么樣子赶熟。你可能注意到一些詞或短語(比如4U、credit card陷嘴、free映砖、amazing)在郵件主題中頻繁出現(xiàn),也許還注意到發(fā)件人名字灾挨、郵件正文的格式邑退,等等。
你為觀察到的規(guī)律寫了一個檢測算法劳澄,如果檢測到了這些規(guī)律地技,程序就會標(biāo)記郵件為垃圾郵件。
測試程序秒拔,重復(fù)第1步和第2步莫矗,直到滿足要求。
這個問題并不簡單,你的程序很可能會變成一長串復(fù)雜的規(guī)則—— 這樣就會很難維護作谚。
相反的三娩,基于機器學(xué)習(xí)技術(shù)的垃圾郵件過濾器會自動學(xué)習(xí)哪個詞和短語是垃圾郵件的預(yù)測值,通過與普通郵件比較妹懒,檢測垃圾郵件中反常頻次的詞語格式(圖1-2)雀监。這個程序短得多,更易維護眨唬,也更精確会前。
進而,如果發(fā)送垃圾郵件的人發(fā)現(xiàn)所有包含“4U”的郵件都被屏蔽了匾竿,可能會轉(zhuǎn)而使用“For U”瓦宜。使用傳統(tǒng)方法的垃圾郵件過濾器需要更新以標(biāo)記“For U”。如果發(fā)送垃圾郵件的人持續(xù)更改岭妖,你就需要持續(xù)寫入新規(guī)則临庇。
相反的,基于機器學(xué)習(xí)的垃圾郵件過濾器會自動注意到“For U”在用戶手動標(biāo)記垃圾郵件中的反常頻繁性区转,然后就能自動標(biāo)記垃圾郵件而無需干預(yù)了(圖1-3)苔巨。
機器學(xué)習(xí)的另一個優(yōu)點是善于處理對于傳統(tǒng)方法太復(fù)雜或是沒有已知算法的問題。例如废离,對于語言識別:假如想寫一個可以識別“one”和“two”的簡單程序侄泽。你可能注意到“two”起始是一個高音(“T”),所以可以寫一個可以測量高音強度的算法蜻韭,用它區(qū)分one和two悼尾。很明顯,這個方法不能推廣到嘈雜環(huán)境下的數(shù)百萬人的數(shù)千詞匯肖方、數(shù)十種語言闺魏。(現(xiàn)在)最佳的方法是根據(jù)大量單詞的錄音,寫一個可以自我學(xué)習(xí)的算法俯画。
最后析桥,機器學(xué)習(xí)可以幫助人類進行學(xué)習(xí)(圖1-4):可以檢查機器學(xué)習(xí)算法已經(jīng)掌握了什么(盡管對于某些算法,這樣做會有點麻煩)艰垂。例如泡仗,當(dāng)垃圾郵件過濾器被訓(xùn)練了足夠多的垃圾郵件,就可以用它列出垃圾郵件預(yù)測值的單詞和單詞組合列表猜憎。有時娩怎,可能會發(fā)現(xiàn)不引人關(guān)注的關(guān)聯(lián)或新趨勢,有助于對問題更好的理解胰柑。
使用機器學(xué)習(xí)方法挖掘大量數(shù)據(jù)截亦,可以發(fā)現(xiàn)并不顯著的規(guī)律爬泥。這稱作數(shù)據(jù)挖掘。
總結(jié)一下崩瓤,機器學(xué)習(xí)善于:
需要進行大量手工調(diào)整或長串規(guī)則的問題:機器學(xué)習(xí)算法通撑鄯龋可以簡化代碼、提高性能谷遂。
問題復(fù)雜葬馋,傳統(tǒng)方法難以解決:最好的機器學(xué)習(xí)方法可以找到解決方案卖鲤。
環(huán)境有波動:機器學(xué)習(xí)算法可以適應(yīng)新數(shù)據(jù)肾扰。
洞察復(fù)雜問題和大量數(shù)據(jù)。
機器學(xué)習(xí)系統(tǒng)的類型
機器學(xué)習(xí)有多種類型蛋逾,可以根據(jù)如下規(guī)則進行分類:
- 是否在人類監(jiān)督下進行訓(xùn)練(監(jiān)督集晚,非監(jiān)督,半監(jiān)督和強化學(xué)習(xí))
- 是否可以動態(tài)漸進學(xué)習(xí)(線上學(xué)習(xí)vs批量學(xué)習(xí))
- 它們是否只是通過簡單地比較新的數(shù)據(jù)點和已知的數(shù)據(jù)點区匣,或者在訓(xùn)練數(shù)據(jù)中進行模式識別偷拔,以建立一個預(yù)測模型,就像科學(xué)家所做的那樣(基于實例學(xué)習(xí)vs基于模型學(xué)習(xí))
規(guī)則并不僅限于以上的亏钩,你可以將他們進行組合莲绰。例如,一個先進的垃圾郵件過濾器可以使用神經(jīng)網(wǎng)絡(luò)模型動態(tài)進行學(xué)習(xí)姑丑,用垃圾郵件和普通郵件進行訓(xùn)練蛤签。這就讓它成了一個線上、基于模型栅哀、監(jiān)督學(xué)習(xí)系統(tǒng)震肮。
下面更仔細(xì)地學(xué)習(xí)這些規(guī)則。
監(jiān)督/非監(jiān)督學(xué)習(xí)
機器學(xué)習(xí)可以根據(jù)訓(xùn)練時監(jiān)督的量和類型進行分類留拾。主要有四類:監(jiān)督學(xué)習(xí)戳晌、非監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)和強化學(xué)習(xí)痴柔。
監(jiān)督學(xué)習(xí)
在監(jiān)督學(xué)習(xí)中沦偎,用來訓(xùn)練算法訓(xùn)練數(shù)據(jù)包括了答案,稱為標(biāo)簽(圖1-5)咳蔚。
一個典型的監(jiān)督學(xué)習(xí)任務(wù)是分類豪嚎。垃圾郵件過濾器就是一個很好的例子:用許多帶有歸類(垃圾郵件或普通郵件)的郵件樣本進行訓(xùn)練,過濾器必須還能對新郵件進行分類屹篓。
另一個典型任務(wù)是預(yù)測目標(biāo)數(shù)值疙渣,例如給出一些特征(里程數(shù)、車齡堆巧、品牌等等)稱作預(yù)測值妄荔,來預(yù)測一輛汽車的價格泼菌。這類任務(wù)稱作回歸(圖1-6)。要訓(xùn)練這個系統(tǒng)啦租,你需要給出大量汽車樣本哗伯,包括它們的預(yù)測值和標(biāo)簽(即,它們的價格)篷角。
筆記:在機器學(xué)習(xí)中焊刹,一個屬性就是一個數(shù)據(jù)類型(例如,“里程數(shù)”)恳蹲,取決于具體問題一個特征會有多個含義虐块,但通常是屬性加上它的值(例如,“里程數(shù)=15000”)嘉蕾。許多人是不區(qū)分地使用屬性和特征贺奠。
注意,一些回歸算法也可以用來進行分類错忱,反之亦然儡率。例如,邏輯回歸通常用來進行分類以清,它可以生成一個歸屬某一類的可能性的值(例如儿普,20%幾率為垃圾郵件)。
下面是一些重要的監(jiān)督學(xué)習(xí)算法(本書都有介紹):
- K近鄰算法
- 線性回歸
- 邏輯回歸
- 支持向量機(SVM)
- 決策樹和隨機森林
- 神經(jīng)網(wǎng)絡(luò)
非監(jiān)督學(xué)習(xí)
在非監(jiān)督學(xué)習(xí)中掷倔,你可能猜到了眉孩,訓(xùn)練數(shù)據(jù)是沒有加標(biāo)簽的(圖1-7)。系統(tǒng)在沒有老師的條件下進行學(xué)習(xí)今魔。
下面是一些最重要的非監(jiān)督學(xué)習(xí)算法(我們會在第8章介紹降維):
- 聚類
k-均值
層次聚類分析(Hierarchical Cluster Analysis勺像,HCA)
期望最大值 - 可視化和降維
主成分分析(Principal Component Analysis,PCA)
核主成分分析
局部線性嵌入(Locally-Linear Embedding错森,LLE)
t-分布鄰域嵌入算法(t-distributed Stochastic Neighbor Embedding吟宦,t-SNE) - 關(guān)聯(lián)性規(guī)則學(xué)習(xí)
Apriori算法
Eclat算法
例如,假設(shè)你有一份關(guān)于你的博客訪客的大量數(shù)據(jù)涩维。你想運行一個聚類算法殃姓,檢測相似訪客的分組(圖1-8)。你不會告訴算法某個訪客屬于哪一類:它會自己找出關(guān)系瓦阐,無需幫助蜗侈。例如,算法可能注意到40%的訪客是喜歡漫畫書的男性睡蟋,通常是晚上訪問踏幻,20%是科幻愛好者,他們是在周末訪問等等戳杀。如果你使用層次聚類分析该面,它可能還會細(xì)分每個分組為更小的組夭苗。這可以幫助你為每個分組定位博文。
可視化算法也是極佳的非監(jiān)督學(xué)習(xí)案例:給算法大量復(fù)雜的且不加標(biāo)簽的數(shù)據(jù)隔缀,算法輸出數(shù)據(jù)的2D或3D圖像(圖1-9)题造。算法會試圖保留數(shù)據(jù)的結(jié)構(gòu)(即嘗試保留輸入的獨立聚類,避免在圖像中重疊)猾瘸,這樣就可以明白數(shù)據(jù)是如何組織起來的界赔,也許還能發(fā)現(xiàn)隱藏的規(guī)律。
與此有關(guān)聯(lián)的任務(wù)是降維敛惊,降維的目的是簡化數(shù)據(jù)渊鞋、但是不能失去大部分信息绰更。做法之一是合并若干相關(guān)的特征。例如锡宋,汽車的里程數(shù)與車齡高度相關(guān)儡湾,降維算法就會將它們合并成一個,表示汽車的磨損执俩。這叫做特征提取徐钠。
提示:在用訓(xùn)練集訓(xùn)練機器學(xué)習(xí)算法(比如監(jiān)督學(xué)習(xí)算法)時,最好對訓(xùn)練集進行降維役首。這樣可以運行的更快尝丐,占用的硬盤和內(nèi)存空間更少,有些情況下性能也更好衡奥。
另一個重要的非監(jiān)督任務(wù)是異常檢測(anomaly detection) —— 例如爹袁,檢測異常的信用卡轉(zhuǎn)賬以防欺詐,檢測制造缺陷矮固,或者在訓(xùn)練之前自動從訓(xùn)練數(shù)據(jù)集去除異常值失息。異常檢測的系統(tǒng)使用正常值訓(xùn)練的,當(dāng)它碰到一個新實例档址,它可以判斷這個新實例是否像正常值或異常值(圖1-10)盹兢。
最后,另一個常見的非監(jiān)督任務(wù)是關(guān)聯(lián)規(guī)則學(xué)習(xí)守伸,它的目標(biāo)是挖掘大量數(shù)據(jù)以發(fā)現(xiàn)屬性間有趣的關(guān)系绎秒。例如,假設(shè)你擁有一個超市尼摹。在銷售日志上運行關(guān)聯(lián)規(guī)則见芹,可能發(fā)現(xiàn)買了燒烤醬和薯片的人也會買牛排校辩。因此,你可以將這些商品放在一起辆童。
半監(jiān)督學(xué)習(xí)
一些算法可以處理部分帶標(biāo)簽的訓(xùn)練數(shù)據(jù)宜咒,通常是大量不帶標(biāo)簽數(shù)據(jù)加上小部分帶標(biāo)簽數(shù)據(jù)。這稱作半監(jiān)督學(xué)習(xí)(圖1-11)把鉴。
一些圖片存儲服務(wù)故黑,比如Google Photos,是半監(jiān)督學(xué)習(xí)的好例子庭砍。一旦你上傳了所有家庭相片场晶,它就能自動識別相同的人A出現(xiàn)了相片1、5怠缸、11中诗轻,另一個人B出現(xiàn)在了相片2、5揭北、7中扳炬。這是算法的非監(jiān)督部分(聚類)。現(xiàn)在系統(tǒng)需要的就是你告訴這兩個人是誰搔体。只要給每個人一個標(biāo)簽恨樟,算法就可以命名每張照片中的每個人,特別適合搜索照片疚俱。
多數(shù)半監(jiān)督學(xué)習(xí)算法是非監(jiān)督和監(jiān)督算法的結(jié)合劝术。例如,深度信念網(wǎng)絡(luò)(deep belief networks)是基于被稱為互相疊加的受限玻爾茲曼機(restricted Boltzmann machines呆奕,RBMs)的非監(jiān)督組件养晋。RBMs是先用非監(jiān)督方法進行訓(xùn)練,再用監(jiān)督學(xué)習(xí)方法進行整個系統(tǒng)微調(diào)梁钾。
強化學(xué)習(xí)
強化學(xué)習(xí)非常不同绳泉。學(xué)習(xí)系統(tǒng)在這里被稱為執(zhí)行者agent,可以對環(huán)境進行觀察陈轿,選擇和執(zhí)行動作圈纺,獲得獎勵(負(fù)獎勵是懲罰,見圖1-12)麦射。然后它必須自己學(xué)習(xí)哪個是最佳方法(稱為策略policy)蛾娶,以得到長久的最大獎勵。策略決定了執(zhí)行者在給定情況下應(yīng)該采取的行動潜秋。
例如蛔琅,許多機器人運行強化學(xué)習(xí)算法以學(xué)習(xí)如何行走。DeepMind的AlphaGo也是強化學(xué)習(xí)的例子:它在2016年三月?lián)魯×耸澜鐕骞谲娎钍朗ㄗg者注:2017年五月峻呛,AlphaGo又擊敗了世界排名第一的柯潔)罗售。它是通過分析數(shù)百萬盤棋局學(xué)習(xí)制勝策略辜窑,然后自己和自己下棋。要注意寨躁,在比賽中機器學(xué)習(xí)是關(guān)閉的穆碎;AlphaGo只是使用它學(xué)會的策略。
批量和線上學(xué)習(xí)
另一個用來分類機器學(xué)習(xí)的準(zhǔn)則是职恳,它是否能從導(dǎo)入的數(shù)據(jù)流進行持續(xù)學(xué)習(xí)所禀。
批量學(xué)習(xí)
在批量學(xué)習(xí)中,系統(tǒng)不能進行持續(xù)學(xué)習(xí):必須用所有可用數(shù)據(jù)進行訓(xùn)練放钦。這通常會占用大量時間和計算資源色徘,所以一般是線下做的。首先是進行訓(xùn)練操禀,然后部署在生產(chǎn)環(huán)境且不帶學(xué)習(xí)褂策,它只是應(yīng)用學(xué)到的。這稱為離線學(xué)習(xí)颓屑。
如果你想讓一個批量學(xué)習(xí)系統(tǒng)明白新數(shù)據(jù)(例如垃圾郵件的新類型)斤寂,就需要從頭訓(xùn)練一個系統(tǒng)的新版本,使用全部數(shù)據(jù)集(不僅有新數(shù)據(jù)也有老數(shù)據(jù))邢锯,然后停掉老系統(tǒng)扬蕊,換上新系統(tǒng)。
幸運的是丹擎,訓(xùn)練、評估歇父、部署一套機器學(xué)習(xí)的系統(tǒng)的整個過程可以自動進行(見圖1-3)蒂培,所以即便是批量學(xué)習(xí)也可以適應(yīng)改變。只要有需要榜苫,就可以方便地更新數(shù)據(jù)护戳、訓(xùn)練一個新版本。
這個方法很簡單垂睬,通诚被模可以滿足需求,但是用全部數(shù)據(jù)集進行訓(xùn)練會花費大量時間驹饺,所以一般是每24小時或每周訓(xùn)練一個新系統(tǒng)钳枕。如果系統(tǒng)需要快速適應(yīng)變化的數(shù)據(jù)(比如,預(yù)測股價變化)赏壹,就需要一個響應(yīng)更及時的方案鱼炒。
另外,用全部數(shù)據(jù)訓(xùn)練需要大量計算資源(CPU蝌借、內(nèi)存空間昔瞧、磁盤空間指蚁、磁盤I/O、網(wǎng)絡(luò)I/O等等)自晰。如果你有大量數(shù)據(jù)凝化,并讓系統(tǒng)每天自動從頭開始訓(xùn)練,就會開銷很大酬荞。如果數(shù)據(jù)量巨大缘圈,甚至無法使用批量學(xué)習(xí)算法。
最后袜蚕,如果你的系統(tǒng)需要自動學(xué)習(xí)糟把,但是資源有限(比如,一臺智能手機或火星車)牲剃,攜帶大量訓(xùn)練數(shù)據(jù)遣疯、每天花費數(shù)小時的大量資源進行訓(xùn)練是不實際的。
幸運的是凿傅,對于上面這些情況缠犀,還有一個更佳的方案可以進行持續(xù)學(xué)習(xí)。
線上學(xué)習(xí)
在線上學(xué)習(xí)中聪舒,是用數(shù)據(jù)實例持續(xù)地進行訓(xùn)練辨液,可以一次一個或一次幾個實例(稱為小批量)。每個學(xué)習(xí)步驟都很快且廉價箱残,所以系統(tǒng)可以動態(tài)地學(xué)習(xí)到達的新數(shù)據(jù)(見圖1-13)滔迈。
線上學(xué)習(xí)很適合系統(tǒng)接收連續(xù)流的數(shù)據(jù)(比如,股票價格)被辑,且需要自動對改變作出調(diào)整燎悍。如果計算資源有限,線上學(xué)習(xí)是一個不錯的方案:一旦線上學(xué)習(xí)系統(tǒng)學(xué)習(xí)了新的數(shù)據(jù)實例盼理,它就不再需要這些數(shù)據(jù)了谈山,所以扔掉這些數(shù)據(jù)(除非你想滾回到之前的一個狀態(tài),再次使用數(shù)據(jù))宏怔。這樣可以節(jié)省大量的空間奏路。
線上學(xué)習(xí)算法也可以當(dāng)機器的內(nèi)存存不下大量數(shù)據(jù)集時,用來訓(xùn)練系統(tǒng)(這稱作核外學(xué)習(xí)臊诊, out-of-core learning)鸽粉。算法加載部分的數(shù)據(jù),用這些數(shù)據(jù)進行訓(xùn)練妨猩,重復(fù)這個過程潜叛,直到用所有數(shù)據(jù)都進行了訓(xùn)練(見圖1-14)。
警告:這個整個過程通常是離線完成的(即,不在部署的系統(tǒng)上)威兜,所以線上學(xué)習(xí)這個名字會讓人疑惑销斟。可以把它想成持續(xù)學(xué)習(xí)椒舵。
線上學(xué)習(xí)系統(tǒng)的一個重要參數(shù)是蚂踊,它們可以多快地適應(yīng)數(shù)據(jù)的改變:這被稱為學(xué)習(xí)速率。如果你設(shè)定一個高學(xué)習(xí)速率笔宿,系統(tǒng)就可以快速適應(yīng)新數(shù)據(jù)犁钟,但是也會快速忘記老數(shù)據(jù)(你可不想讓垃圾郵件過濾器只標(biāo)記最新的垃圾郵件種類)。相反的泼橘,如果你設(shè)定的學(xué)習(xí)速率低涝动,系統(tǒng)的惰性就會強:即,它學(xué)的更慢炬灭,但對新數(shù)據(jù)中的噪聲或沒有代表性的數(shù)據(jù)點結(jié)果不那么敏感醋粟。
線上學(xué)習(xí)的挑戰(zhàn)之一是,如果壞數(shù)據(jù)被用來進行訓(xùn)練重归,系統(tǒng)的性能就會逐漸下滑米愿。如果這是一個部署的系統(tǒng),用戶就會注意到鼻吮。例如育苟,壞數(shù)據(jù)可能來自失靈的傳感器或機器人,或某人向搜索引擎?zhèn)魅肜畔⒁蕴岣咚阉髋琶的尽R獪p小這種風(fēng)險违柏,你需要密集監(jiān)測,如果檢測到性能下降拓哺,要快速關(guān)閉(或是滾回到一個之前的狀態(tài))勇垛。你可能還要監(jiān)測輸入數(shù)據(jù),對反常數(shù)據(jù)做出反應(yīng)(比如士鸥,使用異常檢測算法)。
基于實例vs基于模型學(xué)習(xí)
另一種分類機器學(xué)習(xí)的方法是判斷它們是如何進行歸納推廣的谆级。大多機器學(xué)習(xí)任務(wù)是關(guān)于預(yù)測的烤礁。這意味著給定一定數(shù)量的訓(xùn)練樣本,系統(tǒng)需要能推廣到之前沒見到過的樣本肥照。對訓(xùn)練數(shù)據(jù)集有很好的性能還不夠脚仔,真正的目標(biāo)是對新實例的性能。
有兩種主要的歸納方法:基于實例學(xué)習(xí)和基于模型學(xué)習(xí)舆绎。
基于實例學(xué)習(xí)
也許最簡單的學(xué)習(xí)形式就是用記憶學(xué)習(xí)鲤脏。如果用這種方法做一個垃圾郵件檢測器,只需標(biāo)記所有和用戶標(biāo)記的垃圾郵件相同的郵件 —— 這個方法不差锌介,但肯定不是最好的吓肋。
不僅能標(biāo)記和已知的垃圾郵件相同的郵件蒋失,你的垃圾郵件過濾器也要能標(biāo)記類似垃圾郵件的郵件卸伞。這就需要測量兩封郵件的相似性温自。一個(簡單的)相似度測量方法是統(tǒng)計兩封郵件包含的相同單詞的數(shù)量淘太。如果一封郵件含有許多垃圾郵件中的詞昌简,就會被標(biāo)記為垃圾郵件部默。
這被稱作基于實例學(xué)習(xí):系統(tǒng)先用記憶學(xué)習(xí)案例沦疾,然后使用相似度測量推廣到新的例子(圖1-15)称近。
基于模型學(xué)習(xí)
另一種從樣本集進行歸納的方法是建立這些樣本的模型,然后使用這個模型進行預(yù)測哮塞。這稱作基于模型學(xué)習(xí)(圖1-16)刨秆。
例如,你想知道錢是否能讓人快樂忆畅,你從OECD網(wǎng)站(http://stats.oecd.org/index.aspx?DataSetCode=BLI)下載了Better Life Index指數(shù)數(shù)據(jù)衡未,還從IMF(http://goo.gl/j1MSKe,這個短鏈接需要翻墻才能打開邻眷,長鏈接又太長)下載了人均GDP數(shù)據(jù)眠屎。表1-1展示了摘要。
用一些國家的數(shù)據(jù)畫圖(圖1-17)改衩。
確實能看到趨勢驯镊!盡管數(shù)據(jù)有噪聲(即葫督,部分隨機),看起來生活滿意度是隨著人均GDP的增長線性提高的板惑。所以橄镜,你決定生活滿意度建模為人均GDP的線性函數(shù)。這一步稱作模型選擇:你選一個生活滿意度的線性模型冯乘,只有一個屬性洽胶,人均GDP(等式1-1)。
這個模型有兩個參數(shù)θ0和θ1裆馒。通過調(diào)整這兩個參數(shù)姊氓,你可以使你的模型表示任何線性函數(shù),見圖1-18喷好。
在使用模型之前翔横,你需要確定θ0和θ1。如何能知道哪個值可以使模型的性能最佳呢梗搅?要回答這個問題禾唁,你需要指定性能的量度效览。你可以定義一個實用函數(shù)(或擬合函數(shù))用來測量模型是否夠好,或者你可以定義一個代價函數(shù)來測量模型有多差荡短。對于線性回歸問題丐枉,人們一般是用代價函數(shù)測量線性模型的預(yù)測值和訓(xùn)練樣本的距離差,目標(biāo)是使距離差最小肢预。
接下來就是線性回歸算法矛洞,你用訓(xùn)練樣本訓(xùn)練算法,算法找到使線性模型最擬合數(shù)據(jù)的參數(shù)烫映。這稱作模型訓(xùn)練沼本。在我們的例子中,算法得到的參數(shù)值是θ0=4.85和θ1=4.91×10–5锭沟。
現(xiàn)在模型已經(jīng)最緊密地擬合到訓(xùn)練數(shù)據(jù)了抽兆,見圖1-19。
最后族淮,可以準(zhǔn)備運行模型進行預(yù)測了辫红。例如,假如你想知道塞浦路斯人有多幸福祝辣,但OECD沒有它的數(shù)據(jù)贴妻。幸運的是,你可以用模型進行預(yù)測:查詢?nèi)致匪沟娜司鵊DP蝙斜,為22587美元名惩,然后應(yīng)用模型得到生活滿意度,后者的值在4.85 + 22,587 × 4.91 × 10-5 = 5.96左右孕荠。
為了激起你的興趣娩鹉,案例1-1展示了加載數(shù)據(jù)、準(zhǔn)備稚伍、創(chuàng)建散點圖的Python代碼弯予,然后訓(xùn)練線性模型并進行預(yù)測。
案例1-1个曙,使用Scikit-Learn訓(xùn)練并運行線性模型锈嫩。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
# 加載數(shù)據(jù)
oecd_bli = pd.read_csv("oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
encoding='latin1', na_values="n/a")
# 準(zhǔn)備數(shù)據(jù)
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
# 可視化數(shù)據(jù)
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()
# 選擇線性模型
lin_reg_model = sklearn.linear_model.LinearRegression()
# 訓(xùn)練模型
lin_reg_model.fit(X, y)
# 對塞浦路斯進行預(yù)測
X_new = [[22587]] # 塞浦路斯的人均GDP
print(lin_reg_model.predict(X_new)) # outputs [[ 5.96242338]]
筆記:如果你之前接觸過基于實例學(xué)習(xí)算法,你會發(fā)現(xiàn)斯洛文尼亞的人均GDP(20732美元)和塞浦路斯差距很小垦搬,OECD數(shù)據(jù)上斯洛文尼亞的生活滿意度是5.7祠挫,就可以預(yù)測塞浦路斯的生活滿意度也是5.7。如果放大一下范圍悼沿,看一下接下來兩個臨近的國家,你會發(fā)現(xiàn)葡萄牙和西班牙的生活滿意度分別是5.1和6.5骚灸。對這三個值進行平均得到5.77糟趾,就和基于模型的預(yù)測值很接近。這個簡單的算法叫做k近鄰回歸(這個例子中,k=3)义郑。
在前面的代碼中替換線性回歸模型為k近鄰模型蝶柿,只需更換下面一行:
clf = sklearn.linear_model.LinearRegression()
為:
clf = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)
如果一切順利,你的模型就可以作出好的預(yù)測非驮。如果不能交汤,你可能需要使用更多的屬性(就業(yè)率、健康劫笙、空氣污染等等)芙扎,獲取更多更好的訓(xùn)練數(shù)據(jù),或選擇一個更好的模型(比如填大,多項式回歸模型)戒洼。
總結(jié)一下:
- 研究數(shù)據(jù)
- 選擇模型
- 用訓(xùn)練數(shù)據(jù)進行訓(xùn)練(即,學(xué)習(xí)算法搜尋模型參數(shù)值允华,使代價函數(shù)最腥健)
- 最后,使用模型對新案例進行預(yù)測(這稱作推斷)靴寂,但愿這個模型推廣效果不差
這就是一個典型的機器學(xué)習(xí)項目磷蜀。在第2章中,你會第一手地接觸一個完整的項目百炬。
我們已經(jīng)學(xué)習(xí)了許多關(guān)于基礎(chǔ)的內(nèi)容:你現(xiàn)在知道了機器學(xué)習(xí)是關(guān)于什么的褐隆,為什么它這么有用,最常見的機器學(xué)習(xí)的分類收壕,典型的項目工作流〖斯啵現(xiàn)在,讓我們看一看會發(fā)生什么錯誤蜜宪,導(dǎo)致不能做出準(zhǔn)確的預(yù)測虫埂。
機器學(xué)習(xí)的主要挑戰(zhàn)
簡而言之,因為你的主要任務(wù)是選擇一個學(xué)習(xí)算法并用一些數(shù)據(jù)進行訓(xùn)練圃验,會導(dǎo)致錯誤的兩件事就是“錯誤的算法”和“錯誤的數(shù)據(jù)”掉伏。我們從錯誤的數(shù)據(jù)開始。
訓(xùn)練數(shù)據(jù)量不足
要讓一個蹣跚學(xué)步的孩子知道什么是蘋果澳窑,需要做的就是指著一個蘋果說“蘋果”(可能需要重復(fù)這個過程幾次)「ⅲ現(xiàn)在這個孩子就能認(rèn)識所有形狀和顏色的蘋果。真是個天才摊聋!
機器學(xué)習(xí)還達不到這個程度鸡捐;需要大量數(shù)據(jù),才能讓多數(shù)機器學(xué)習(xí)算法正常工作麻裁。即便對于非常簡單的問題箍镜,一般也需要數(shù)千的樣本源祈,對于復(fù)雜的問題,比如圖像或語音識別色迂,你可能需要數(shù)百萬的樣本(除非你能重復(fù)使用部分存在的模型)香缺。
數(shù)據(jù)不合理的有效性
在一篇2001年發(fā)表的著名論文(goo.gl/R5enIE)中,微軟研究員Michele Banko和Eric Brill展示了不同的機器學(xué)習(xí)算法歇僧,包括非常簡單的算法图张,一旦有了大量數(shù)據(jù)進行訓(xùn)練,在進行去除語言歧義的測試中幾乎有相同的性能(見圖1-20)诈悍。
論文作者說:“結(jié)果說明祸轮,我們可能需要重新考慮在算法開發(fā)vs語料庫發(fā)展上花費時間和金錢的取舍⌒戳ィ”
對于復(fù)雜問題倔撞,數(shù)據(jù)比算法更重要的主張在2009年由Norvig發(fā)表的論文《The Unreasonable Effectiveness of Data》得到了進一步的推廣。但是慕趴,應(yīng)該注意到痪蝇,小型和中型的數(shù)據(jù)集仍然是非常常見的,獲得額外的訓(xùn)練數(shù)據(jù)并不總是輕易和廉價的冕房,所以不要拋棄算法躏啰。
沒有代表性的訓(xùn)練數(shù)據(jù)
為了更好地進行歸納推廣,讓訓(xùn)練數(shù)據(jù)對新數(shù)據(jù)具有代表性是非常重要的耙册。無論你用的是基于實例學(xué)習(xí)或基于模型學(xué)習(xí)给僵,這點都很重要。
例如详拙,我們之前用來訓(xùn)練線性模型的國家集合不夠具有代表性:缺少了一些國家帝际。圖1-21展示了添加這些缺失國家之后的數(shù)據(jù)。
如果你用這份數(shù)據(jù)訓(xùn)練線性模型饶辙,得到的是實線蹲诀,舊模型用虛線表示∑浚可以看到脯爪,添加幾個國家不僅可以顯著地改變模型,它還說明如此簡單的線性模型可能永遠不會達到很好的性能矿微。貌似非常富裕的國家沒有中等富裕的國家快樂(事實上痕慢,非常富裕的國家看起來更不快樂),相反的涌矢,一些貧窮的國家看上去比富裕的國家還幸福掖举。
使用了沒有代表性的數(shù)據(jù)集,我們訓(xùn)練了一個不可能得到準(zhǔn)確預(yù)測的模型娜庇,特別是對于非常貧窮和非常富裕的國家拇泛。
使用具有代表性的訓(xùn)練集對于推廣到新案例是非常重要的滨巴。但是做起來比說起來要難:如果樣本太小,就會有樣本噪聲(即俺叭,會有一定概率包含沒有代表性的數(shù)據(jù)),但是即使是非常大的樣本也可能沒有代表性泰偿,如果取樣方法錯誤的話熄守。這叫做樣本偏差。
一個樣本偏差的著名案例
也許關(guān)于樣本偏差最有名的案例發(fā)生在1936年蘭登和羅斯福的美國大選:《文學(xué)文摘》做了一個非常大的民調(diào)耗跛,給1000萬人郵寄了調(diào)查信裕照。得到了240萬回信,非常有信心地預(yù)測蘭登會以57%贏得大選调塌。然而晋南,羅斯福贏得了62%的選票。錯誤發(fā)生在《文學(xué)文摘》的取樣方法:
- 首先羔砾,為了獲取發(fā)信地址负间,《文學(xué)文摘》使用了電話黃頁、雜志訂閱用戶姜凄、俱樂部會員等相似的列表政溃。所有這些列表都偏向于富裕人群,他們都傾向于投票給共和黨(即蘭登)态秧。
- 第二董虱,只有25%的回答了調(diào)研。這就又一次引入了樣本偏差申鱼,它排除了不關(guān)心政治的人愤诱、不喜歡《文學(xué)文摘》的人,和其它關(guān)鍵人群捐友。這種特殊的樣本偏差稱作無應(yīng)答偏差淫半。
下面是另一個例子:假如你想創(chuàng)建一個能識別瘋克音樂視頻的系統(tǒng)。建立訓(xùn)練集的方法之一是在YouTube上搜索“瘋克音樂”楚殿,使用搜索到的視頻撮慨。但是這樣就假定了YouTube的搜索引擎返回的視頻集,是對YouTube上的所有瘋克音樂有代表性的脆粥。事實上砌溺,搜索結(jié)果會偏向于人們歌手(如果你居住在巴西,你會得到許多“瘋克卡瑞歐卡”視頻变隔,它們和James Brown的截然不同)规伐。另一方面,怎么還能得到一個大的訓(xùn)練集呢匣缘?
低質(zhì)量數(shù)據(jù)
很明顯猖闪,如果訓(xùn)練集中的錯誤鲜棠、異常值和噪聲(錯誤測量引入的)太多,系統(tǒng)檢測出潛在規(guī)律的難度就會變大培慌,性能就會降低豁陆。花費時間對訓(xùn)練數(shù)據(jù)進行清理是十分重要的吵护。事實上盒音,大多數(shù)據(jù)科學(xué)家的一大部分時間是做清洗工作的。例如:
- 如果一些實例是明顯的異常值馅而,最好刪掉它們或嘗試手工修改錯誤祥诽;
- 如果一些實例缺少特征(比如,你的5%的顧客沒有說明年齡)瓮恭,你必須決定是否忽略這個屬性雄坪、忽略這些實例、填入缺失值(比如屯蹦,年齡中位數(shù))维哈,或者訓(xùn)練一個含有這個特征的模型和一個不含有這個特征的模型,等等颇玷。
不相關(guān)的特征
俗語說:進來的是垃圾笨农,出去的也是垃圾。你的系統(tǒng)只有在訓(xùn)練數(shù)據(jù)包含足夠相關(guān)特征帖渠、非相關(guān)特征不多的情況下谒亦,才能進行學(xué)習(xí)。機器學(xué)習(xí)項目成功的關(guān)鍵之一是用好的特征進行訓(xùn)練空郊。這個過程稱作特征工程份招,包括:
- 特征選擇:在所有存在的特征中選取最有用的特征進行訓(xùn)練。
- 特征提饶酢:組合存在的特征锁摔,生成一個更有用的特征(如前面看到的,可以使用降維算法)哼审。
- 收集新數(shù)據(jù)創(chuàng)建新特征谐腰。
現(xiàn)在,我們已經(jīng)看過了許多壞數(shù)據(jù)的例子涩盾,接下來看幾個壞算法的例子十气。
過擬合訓(xùn)練數(shù)據(jù)
如果你在外國游玩,當(dāng)?shù)氐某鲎廛囁緳C多收了你的錢春霍。你可能會說這個國家所有的出租車司機都是小偷砸西。過度歸納是我們?nèi)祟惤?jīng)常做的,如果我們不小心,機器也會犯同樣的錯誤芹枷。在機器學(xué)習(xí)中衅疙,這稱作過擬合:意思是說,模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)很好鸳慈,但是推廣效果不好饱溢。
圖1-22展示了一個高階多項式生活滿意度模型,它大大過擬合了訓(xùn)練數(shù)據(jù)蝶涩。即使它比簡單線性模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)更好理朋,你會相信它的預(yù)測嗎?
復(fù)雜的模型绿聘,比如深度神經(jīng)網(wǎng)絡(luò),可以檢測數(shù)據(jù)中的細(xì)微規(guī)律次舌,但是如果訓(xùn)練集有噪聲熄攘,或者訓(xùn)練集太小(太小會引入樣本噪聲)彼念,模型就會去檢測噪聲本身的規(guī)律挪圾。很明顯,這些規(guī)律不能推廣到新實例逐沙。例如哲思,假如你用更多的屬性訓(xùn)練生活滿意度模型,包括不包含信息的屬性吩案,比如國家的名字棚赔。如此一來,負(fù)責(zé)的模型可能會檢測出訓(xùn)練集中名字有w字母的國家的生活滿意度大于7:新西蘭(7.3)徘郭,挪威(7.4)靠益,瑞典(7.2)和瑞士(7.5)。你能相信這個W-滿意度法則推廣到盧旺達和津巴布韋嗎残揉?很明顯胧后,這個規(guī)律只是訓(xùn)練集數(shù)據(jù)中偶然出現(xiàn)的,但是模型不能判斷這個規(guī)律是真實的抱环、還是噪聲的結(jié)果壳快。
警告:過擬合發(fā)生在相對于訓(xùn)練數(shù)據(jù)的量和噪聲,模型過于復(fù)雜的情況镇草】籼担可能的解決方案有:
- 簡化模型,可以通過選擇一個參數(shù)更少的模型(比如使用線性模型陶夜,而不是高階多項式模型)凛驮、減少訓(xùn)練數(shù)據(jù)的屬性數(shù)、或限制一下模型
- 收集更多的訓(xùn)練數(shù)據(jù)
- 減小訓(xùn)練數(shù)據(jù)的噪聲(比如条辟,修改數(shù)據(jù)錯誤和去除異常值)
限定一個模型以讓它更簡單黔夭,降低過擬合的風(fēng)險被稱作正規(guī)化(regularization)宏胯。例如,我們之前定義的線性模型有兩個參數(shù)本姥,θ0和θ1肩袍。它給了學(xué)習(xí)算法兩個自由度以讓模型適應(yīng)訓(xùn)練數(shù)據(jù):可以調(diào)整截距θ0和斜率θ1。如果強制θ1=0婚惫,算法就只剩一個自由度氛赐,擬合數(shù)據(jù)就會更為困難:能做的只是將線上下移動,盡可能地靠近訓(xùn)練實例先舷,結(jié)果會在平均值附近艰管。這就是一個非常簡單的模型!如果我們允許算法可以修改θ1蒋川,但是只能在一個很小的范圍內(nèi)修改牲芋,算法的自由度就會介于1和2之間。它要比兩個自由度的模型簡單捺球,比1個自由度的模型要復(fù)雜缸浦。你的目標(biāo)是在完美擬合數(shù)據(jù)和保持模型簡單性上找到平衡,確保算法的推廣效果氮兵。
圖1-23展示了三個模型:虛線表示用缺失部分國家的數(shù)據(jù)訓(xùn)練的原始模型裂逐,短劃線是我們的第二個用所有國家訓(xùn)練的模型,實線模型的訓(xùn)練數(shù)據(jù)和第一個相同泣栈,但進行了正規(guī)化限制卜高。你可以看到正規(guī)化強制模型有一個小的斜率,它對訓(xùn)練數(shù)據(jù)的擬合不是那么好秩霍,但是對新樣本的推廣效果好篙悯。
正規(guī)化的度可以用一個超參數(shù)(hyperparameter)控制。超參數(shù)是一個學(xué)習(xí)算法的參數(shù)(而不是模型的)铃绒。這樣鸽照,它是不會被學(xué)習(xí)算法本身影響的,它優(yōu)于訓(xùn)練數(shù)據(jù)颠悬,在訓(xùn)練中是保持不變的矮燎。如果你設(shè)定的超參數(shù)非常大,就會得到一個幾乎是平的模型(斜率接近于0)赔癌;學(xué)習(xí)算法幾乎肯定不會過擬合訓(xùn)練數(shù)據(jù)诞外,但是也很難得到一個好的解。調(diào)節(jié)超參數(shù)是創(chuàng)建機器學(xué)習(xí)算法非常重要的一部分(下一章你會看到一個詳細(xì)的例子)灾票。
欠擬合訓(xùn)練數(shù)據(jù)
你可能猜到了峡谊,欠擬合是和過擬合相對的:當(dāng)你的模型過于簡單時就會發(fā)生。例如,生活滿意度的線性模型傾向于欠擬合既们;現(xiàn)實要比這個模型復(fù)雜的多濒析,所以預(yù)測很難準(zhǔn)確,即使在訓(xùn)練樣本上也很難準(zhǔn)確啥纸。
解決這個問題的選項包括:
- 選擇一個更強大的模型号杏,帶有更多參數(shù)
- 用更好的特征訓(xùn)練學(xué)習(xí)算法(特征工程)
- 減小對模型的限制(比如,減小正規(guī)化超參數(shù))
回顧
現(xiàn)在斯棒,你已經(jīng)知道了很多關(guān)于機器學(xué)習(xí)的知識盾致。然而,學(xué)過了這么多概念荣暮,你可能會感到有些迷失庭惜,所以讓我們退回去,回顧一下重要的:
- 機器學(xué)習(xí)是讓機器通過學(xué)習(xí)數(shù)據(jù)對某些任務(wù)做得更好穗酥,而不使用確定的代碼規(guī)則蜈块。
- 有許多不同類型的機器學(xué)習(xí)系統(tǒng):監(jiān)督或非監(jiān)督,批量或線上迷扇,基于實例或基于模型,等等爽哎。
- 在機器學(xué)習(xí)項目中蜓席,訓(xùn)練集來收集數(shù)據(jù),然后對學(xué)習(xí)算法進行訓(xùn)練课锌。如果算法是基于模型的厨内,就調(diào)節(jié)一些參數(shù),讓模型擬合到訓(xùn)練集(即渺贤,對訓(xùn)練集本身作出好的預(yù)測)雏胃,然后希望它對新樣本也能有好預(yù)測。如果算法是基于實例的志鞍,就是用記憶學(xué)習(xí)樣本瞭亮,然后用相似度推廣到新實例。
- 如果訓(xùn)練集太小固棚、數(shù)據(jù)沒有代表性统翩、含有噪聲、或摻有不相關(guān)的特征(垃圾進此洲,垃圾出)厂汗,系統(tǒng)的性能不會好。最后呜师,模型不能太簡單(會發(fā)生欠擬合)或太復(fù)雜(會發(fā)生過擬合)娶桦。
還差最后一個主題要學(xué)習(xí):訓(xùn)練完了一個模型,你不只希望將它推廣到新樣本。你想評估它衷畦,作出必要的微調(diào)栗涂。一起來看一看。
測試和確認(rèn)
要知道一個模型推廣到新樣本的效果霎匈,唯一的辦法就是真正的進行試驗戴差。一種方法是將模型部署到生產(chǎn)環(huán)境,觀察它的性能铛嘱。這么做可以暖释,但是如果模型的性能很差,就會引起用戶抱怨 —— 這不是最好的方法墨吓。
更好的選項是將你的數(shù)據(jù)分成兩個集合:訓(xùn)練集合測試集球匕。正如它們的名字,用訓(xùn)練集進行訓(xùn)練帖烘,用測試集進行測試亮曹。對新樣本的錯誤率稱作推廣錯誤(或樣本外錯誤),通過模型對測試集的評估秘症,你可以預(yù)估這個錯誤照卦。這個值可以告訴你,你的模型對新樣本的性能乡摹。
如果訓(xùn)練錯誤率低(即役耕,你的模型在訓(xùn)練集上錯誤不多),但是推廣錯誤率高聪廉,意味著模型對訓(xùn)練數(shù)據(jù)過擬合瞬痘。
提示:一般使用80%的數(shù)據(jù)進行訓(xùn)練,保留20%用于測試板熊。
因此框全,評估一個模型很簡單:只要使用測試集。現(xiàn)在假設(shè)你在兩個模型之間猶豫不決(比如一個線性模型和一個多項式模型):如何做決定呢干签?一種方法是兩個都訓(xùn)練津辩,然后比較在測試集上的效果。
現(xiàn)在假設(shè)線性模型的效果更好筒严,但是你想做一些正規(guī)化以避免過擬合丹泉。問題是:如何選擇正規(guī)化超參數(shù)的值?一種選項是用100個不同的超參數(shù)訓(xùn)練100個不同的模型鸭蛙。假設(shè)你發(fā)現(xiàn)最佳的超參數(shù)的推廣錯誤率最低摹恨,比如只有5%。然后就選用這個模型作為生產(chǎn)環(huán)境娶视,但是實際中性能不佳晒哄,誤差率達到了15%睁宰。發(fā)生了什么呢?
答案在于寝凌,你在測試集上多次測量了推廣誤差率柒傻,調(diào)整了模型和超參數(shù),以使模型最適合這個集合较木。這意味著模型對新數(shù)據(jù)的性能不會高红符。
這個問題通常的解決方案是,再保留一個集合伐债,稱作驗證集合预侯。用測試集和多個超參數(shù)訓(xùn)練多個模型,選擇在驗證集上有最佳性能的模型和超參數(shù)峰锁。當(dāng)你對模型滿意時萎馅,用測試集再做最后一次測試,以得到推廣誤差率的預(yù)估虹蒋。
為了避免“浪費”過多訓(xùn)練數(shù)據(jù)在驗證集上糜芳,通常的辦法是使用交叉驗證:訓(xùn)練集分成互補的子集,每個模型用不同的子集訓(xùn)練魄衅,再用剩下的子集驗證峭竣。一旦確定模型類型和超參數(shù),最終的模型使用這些超參數(shù)和全部的訓(xùn)練集進行訓(xùn)練晃虫,用測試集得到推廣誤差率邪驮。
沒有免費午餐公理
模型是觀察的簡化版本。簡化意味著舍棄無法進行推廣的表面細(xì)節(jié)傲茄。但是,要確定舍棄什么數(shù)據(jù)沮榜、保留什么數(shù)據(jù)盘榨,必須要做假設(shè)哄啄。例如筷黔,線性模型的假設(shè)是數(shù)據(jù)基本上是線性的,實例和模型直線間的距離只是噪音眠寿,可以放心忽略型酥。
在一篇1996年的著名論文(goo.gl/3zaHIZ)中山憨,David Wolpert證明,如果完全不對數(shù)據(jù)做假設(shè)弥喉,就沒有理由選擇一個模型而不選另一個郁竟。這稱作沒有免費午餐(NFL)公理。對于一些數(shù)據(jù)集由境,最佳模型是線性模型棚亩,而對其它數(shù)據(jù)集是神經(jīng)網(wǎng)絡(luò)蓖议。沒有一個模型可以保證效果更好(如這個公理的名字所示)。確信的唯一方法就是測試所有的模型讥蟆。因為這是不可能的勒虾,實際中就必須要做一些對數(shù)據(jù)合理的假設(shè),只評估幾個合理的模型瘸彤。例如修然,對于簡單任務(wù),你可能是用不同程度的正規(guī)化評估線性模型质况,對于復(fù)雜問題愕宋,你可能要評估幾個神經(jīng)網(wǎng)絡(luò)模型。
練習(xí)
本章中拯杠,我們學(xué)習(xí)了一些機器學(xué)習(xí)中最為重要的概念掏婶。下一章,我們會更加深入潭陪,并寫一些代碼雄妥。開始下章之前,確保你能回答下面的問題:
- 如何定義機器學(xué)習(xí)依溯?
- 機器學(xué)習(xí)可以解決的四類問題老厌?
- 什么是帶標(biāo)簽的訓(xùn)練集?
- 最常見的兩個監(jiān)督任務(wù)是什么黎炉?
- 指出四個常見的非監(jiān)督任務(wù)枝秤?
- 要讓一個機器人能在各種未知地形行走,你會采用什么機器學(xué)習(xí)算法慷嗜?
- 要對你的顧客進行分組淀弹,你會采用哪類算法?
- 垃圾郵件檢測是監(jiān)督學(xué)習(xí)問題庆械,還是非監(jiān)督學(xué)習(xí)問題薇溃?
- 什么是線上學(xué)習(xí)系統(tǒng)?
- 什么是核外學(xué)習(xí)缭乘?
- 什么學(xué)習(xí)算法是用相似度做預(yù)測沐序?
- 模型參數(shù)和學(xué)習(xí)算法的超參數(shù)的區(qū)別是什么?
- 基于模型學(xué)習(xí)的算法搜尋的是什么堕绩?最成功的策略是什么策幼?基于模型學(xué)習(xí)如何做預(yù)測?
- 機器學(xué)習(xí)的四個主要挑戰(zhàn)是什么奴紧?
- 如果模型在訓(xùn)練集上表現(xiàn)好特姐,但推廣到新實例表現(xiàn)差,問題是什么黍氮?給出三個可能的解決方案到逊。
- 什么是測試集铣口,為什么要使用它?
- 驗證集的目的是什么觉壶?
- 如果用測試集調(diào)節(jié)超參數(shù)脑题,會發(fā)生什么?
- 什么是交叉驗證铜靶,為什么它比驗證集好叔遂?
練習(xí)答案見附錄A。
(第一部分 機器學(xué)習(xí)基礎(chǔ))
第01章 機器學(xué)習(xí)概覽
第02章 一個完整的機器學(xué)習(xí)項目(上)
第02章 一個完整的機器學(xué)習(xí)項目(下)
第03章 分類
第04章 訓(xùn)練模型
第05章 支持向量機
第06章 決策樹
第07章 集成學(xué)習(xí)和隨機森林
第08章 降維
(第二部分 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))
第9章 啟動和運行TensorFlow
第10章 人工神經(jīng)網(wǎng)絡(luò)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(上)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(下)
第12章 設(shè)備和服務(wù)器上的分布式 TensorFlow
第13章 卷積神經(jīng)網(wǎng)絡(luò)
第14章 循環(huán)神經(jīng)網(wǎng)絡(luò)
第15章 自編碼器
第16章 強化學(xué)習(xí)(上)
第16章 強化學(xué)習(xí)(下)