帶你讀機器學習經典(三): Python機器學習(Chapter 1&2)

很抱歉又挖了一個大坑,上一本讀書筆記(ISL)還沒更完。不過有鑒於ISL是用R舉例,對於使用Python的朋友來說可能不大方便,所以特此同時介紹一本專註於Python機器學習的書。我會盡量保證能同時更新兩本書:)

0. 前言 - 我為什麼要寫這一系列文章?

自從五月回答了【如何看待「機器學習不需要數學,很多演算法封裝好了,調個包就行」這種說法?】以後,我收到了很多朋友的評論和私信,希望我能談談新手如何快速入門機器學習。

為了給大家一個比較客觀公正的建議,我特地去買了幾本廣受好評的機器學習入門書籍:

  1. An Introduction to Statistical Learning with Applications in R - Gareth J. et al.
  2. Python Machine Learning - Sebastian Raschka <-這次介紹的書
  3. Programming Collective Intelligence (集體編程智慧) - Toby Segaran
  4. 機器學習 - 周志華
  5. 統計學習方法 - 李航

閱讀了這些書籍以後,想和大家分享一下我的主觀評價。在每本書的總評後,我會對每一本書分章節進行一個梳理,並提供一些自己的感悟,希望能對大家的入門帶來一些幫助。

這一系列的文章形式為閱讀筆記,需要結合教材一起閱讀。我對知識點的順序進行了一些調整,將相關的內容合併到了一起。有疑問的小夥伴可以評論或者私信我

作為系列文章的第一篇,我會先帶著大家梳理Python機器學習的前兩章。

1. 綜合評價 - Python Machine Learning

嚴格意義上來說,Python Machine Learning的作者Sebastian Raschka並不是一位科班出身的計算機科學家,或者統計學家。他現在正在讀計算生物的博士,但這絲毫不妨礙他在Github成為一個非常出名的極客,也並不影響整本書的實用性。這本書出版於2015年,並多次再版,今年國內也推出了翻譯版。在亞馬遜中國上我們可以找到影印版和翻譯版,大家可以根據自己的英文水平和具體情況來選擇。由此不難看出這本書的暢銷,以及廣受讀者好評(我真的沒有拿到推廣費,塞巴斯蒂安看到文章請向我匯款5毛)。

根據網友@知之為知之 和 @test的提醒,這本書的中文譯本錯誤較多,請謹慎考慮購買。

客觀的說,這本書的內容比較淺,偏向於實踐,只在第二章的感知機涉及到一些微積分、第三章的邏輯回歸中涉及到少量的概率相關推導,以及第五章維度壓縮和核函數中涉及到少量的線性代數。如果我們把Elements of Statistical的閱讀難度定義為5星,Introduction to Statistical Learning定義為3星,那麼本書的難度大概只能算1.5星,和很多人機器智慧啟蒙書《集體編程智慧》相仿。如果你閱讀《集體編程智慧》沒有任何問題,那麼閱讀這本書應該遊刃有餘

本書的優點

  1. 去掉了大量的數學推導的部分,僅保留了機器學習的核心應用。閱讀本書可以快速對如何使用Python機器學習框架Sklearn有一個基本的了解,可以很快上手開始工作。
  2. 每章都輔以配套的Python實例,而且代碼庫一直在積極維護當中,讀者可以在掌握理論後迅速在配套的數據上進行實踐。多說一句,作者本人非常平易近人,非常喜歡和讀者交流和解惑。
  3. 本書很強調工程性,裡面甚至講了如何將機器學習模型嵌入到Python Flask的網路程序中(第十一章),這在大量的經典教科書中是從未出現過的。同理,對於如何可視化分析數據也有介紹,這是寶貴的工程經驗,理論性教科書一般不會涉及。
  4. 本書涉及的內容很廣泛,雖然只有400多頁,但內容涉及了數據預處理(Data Preprocessing), 維度壓縮和核函數(Dimension Reduction & Kernel),評估方法如交叉驗證,集成學習,情感分析,聚類,甚至還包括了神經網路和Theano。
  5. 介紹了一些比較新穎的方法,如流形學習(Manifold Learning), 這估計是因為寫作時間較近,所以作者介紹了一些近年來逐漸走紅的演算法。
  6. 在很多不起眼的地方有神來一筆,分享了很多實際使用中的小技巧,有些技巧甚至都不太得到主流機器學習界的認可,屬於作者的個人感悟。
  7. 作者作為一個資深Python用戶,用他的代碼介紹了很多Python ML的好習慣和傳統,值得閱讀代碼。另一個有這個優點的是吳恩達教授的代碼風格,也很簡潔清晰。

本書的缺點

  1. 考慮到本書的工程性,章節沒有任何配套習題,對於學生讀者來說不是非常友好。
  2. 同第一點,本書大量的使用了Sklearn的API,因此可能僅能幫助大家學會很好的使用機器學習包,對於深入理解演算法幫助有限。不同的機器學習框架雖有相似性,但可能對使用其他機器學習框架幫助不大。
  3. 書中收錄了太多的源代碼,我個人覺得用偽代碼足夠了,源碼放在Github上來參考就可以。
  4. 作為優點的「覆蓋性廣」,同時導致了一個重大缺陷就是深度不夠,大部分內容都是點到為止。如果說和同為以廣度取勝的周志華教授的《機器學習》相比,這本書的深度也遠遠不及。
  5. 因為沒有涉及數學部分,導致部分重要理論的引出顯得非常隨意。我理解作者是為了照顧讀者的閱讀感,但對於數學部分的保留顯得該書得到某些結論非常不嚴謹。個人感覺可以至少加上從何處引入該公式,讓有能力的讀者可以在課後繼續閱讀。
  6. 和統計學習先對比,本書更強調一個結果是否有效,統計學習的嚴謹性可能會使某些統計/數學背景讀者覺得這本書的方法有些隨意了。不過根本上來說,這本身就是機器學習和統計學習的不同。
  7. 和ESL和ISL不同,本書沒有開源因此通過正規渠道獲得是收費的,翻譯版售價在60人民幣,影印版在120人民幣左右。另外一點值得吐槽的是,作為一本機器學習參考書,它的印刷竟然是黑白的,這導致了閱讀體驗不佳。

總結&推薦人群

綜合評價下來該書是一本不錯的書,但只建議想使用Python的工程師們來閱讀對於在讀學生朋友來說我還是建議先打好基礎,可以閱讀ISL。當然,願意使用Python來練手的話,這本書介紹了很多工程中的小技巧,如如何使用並行計算和Pipeline。全書背景要求比較低,閱讀起來速度很快,大部分內容都可以一閃而過。

因為本書不像我介紹的其他書有較多數學部分,因此關於本書的讀書筆記以文字為主,數學為輔(沒有太多值得額外推導的部分)...

2. 書籍導讀 - Chapter 1 - Giving Computers the Ability to Learn from Data

該書的第一章主要是科普和做好準備工作,歸納來說主要做了四件事情:

  1. 介紹基本概念: 什麼是 a. 監督學習 b. 無監督學習 c. 強化學習,以及在監督學習中 a. 對於離散值的預測叫做分類(classification) b. 對於連續值的預測叫做回歸(regression)。
  2. 介紹該書中使用的符號傳統。
  3. 介紹了一般機器學習的三步驟: a. 數據預處理 b. 訓練和選擇學習模型 c. 評估和預測。
  4. 介紹如何安裝必備的機器學習工具包: SciPy, NumPy, Pandas, Sklearn等。我自己推薦直接使用Anaconda來整體安裝Python和以上工具包,省去了維護和更新的痛苦。

第一章的確沒有太多深入內容,只是給出了一些基本的概念和思路。行百里者半九十,我覺得了解基本概念還是很有幫助的。此處我想推薦大家使用Anaconda進行Python和這些數據包的安裝,同時Anaconda裡面還包含了兩個非常好用的Python IDE: Spyder和Jupyter Notebook(以前叫做IPython Notebook)。Spyder的使用和Matlab非常相似,非常好上手且免費。

2. 書籍導讀 - Chapter 2 - Training Machine Learning Algo for Classification

從第二章開始,我們終於開始接觸到了一些演算法。在本章的開頭,作者不可免俗的又將神經元(neuron)和感知機(perceptron)進行了類比。這個是無可厚非的,但請讀者注意,神經網路和人的腦神經相似度是非常有限的。現在很多新聞都說深度學習是根據人腦原理開發的,這個有待商榷,甚至可以說只是個噱頭。

在第二章的一開始,作者以單層感知機為切入點(神經網路也一度被叫做multi-layer perceptron 多層感知機),逐步介紹了如何對一個單層感知機進行訓練,如何用來進行預測。特別值得一提的是,作者在第28頁提到了如何將一個感知機從二分類任務(binary classification)擴展用於多分類任務(multi-class classification),他介紹了one-vs-rest這個演算法。有興趣的小夥伴可以稍微多了解一下這個演算法,因為在支持向量機(SVM)中我們會再見到這個演算法,而單層感知機往往不會用於多分類因為其功能局限性

在介紹了單層感知機的訓練後,作者馬上介紹了代價函數(cost function)和優化方法即梯度下降法(gradient descent - GD)。因為這些都屬於常規的教科書內容,我不在此贅述。而本章最出彩的部分就是介紹為什麼要在大規模機器學習(Large Scale Machine Learning)中使用隨機梯度下降(Stochastic Gradient Descent - SGD),總結作者的觀點並補充一點我的看法:

  1. 梯度下降法有3種:a. Stochastic Gradient Descent b. Mini-batch learning c. Batch Learning(使用普通的gradient descent)。簡單來說,從左至右,a每次隨機挑選訓練數據集中的1個訓練數據對參數進行更新,b每次從整個訓練數據集中挑選一個固定數量的數據點對參數進行更新, c每次用整個訓練集對參數進行優化。因此,a->b->c中每次更新參數時所使用的數據點逐步遞增。此處特別想說,在深度學習中,我們一般使用b. Mini-batch learning,一般選擇64或者128個數據點作為b的大小。
  2. 不難看出,從a->b->c,因為每次參數更新時使用訓練集越來越大,因此損失函數(loss function)的下降逐步越來越平滑。SGD中波動較大,普通GD的下降比較平滑。
  3. 既然普通GD更加平滑,那何必使用SGD呢?作者給出的原因是因為SGD收斂速度快,訓練快,同時避免了陷入局部最優(local optima)。對於前兩點原因我是贊同的,但第三點其實在深度學習中已經很少出現了,Bengio在《Deep Learning》一書中也指出了深度網路不大容易陷入到局部最優,有興趣的讀者可以思考一下為什麼

因此總結來說,在大規模機器學習中,優化演算法我們一般不使用最普通的梯度下降(Gradient Descent),也不怎麼使用SGD,而是Mini Batch learning,這樣可以平衡訓練速度和效果。同時工程經驗告訴我們,比較建議使用64或者128作為你的batch size,當然如果你的每個訓練數據都很大你還需要調整batch size,使得你的GPU可以內存可以容納當下batch中的數據大小。

這一章的代碼還指出了感知機,神經網路,甚至是深度學習中的代碼哲學-向量化(Vectorization)。使用向量化可以大幅度的提高我們的運算速度,同時代碼也更簡潔,具體的實現請參考原書內容:)

3. 後記

寫這篇文章的時候,我正處於知乎社區輿論的「風口浪尖」上。我曾有想過很多途徑去解釋去證明,但我又何苦「自證其罪」。就像很多朋友跟我說的,理解我的人總理解我,誤解我的人永遠無法原諒我。

好吧,與其和野蠻人互毆,還是讓我們把精力放在有意義的事情上吧~Let us get back to work now buddy!

* 封面配圖: Python Machine Learning英文版封面,版權歸出版商和作者所有,僅為推廣展示用途。


推薦閱讀:

大數據時代的精準推薦,會影響人的自由選擇的能力和自由選擇的自由么?
計算機科學家的土豪人生:人工智慧人物譜(二)

TAG:人工智能 | 数据挖掘 | 机器学习 |