1. 程式人生 > >如何入門機器學習

如何入門機器學習

本篇文章,我將從過來的人角度介紹下機器學習如何從入門到精通,這裡我們談經驗,談工具,更談方法論。

1.入門

作為初入機器學習的小白,你可能除了一顆好奇的心和一番熱血外什麼都不沒有,當然最好還是希望你能有線性代數、微積分和概率論的基礎。你可能會心存顧慮:學過但忘了。不用擔心,這種東西不用就會忘,但只要用到,學一學便會;或者說你可能真的沒學過,這個也不用擔心,只要你真的想學現在也來得及。

好了廢話不多說,我們進入入門階段的正題。入門階段主要有三個任務:

  1. 快速看完周志華的《西瓜書》;
  2. 看吳恩達 Coursera 上的《機器學習》;
  3. 調包跑演算法。

看完這個後可能大家會有很多不解或者很多疑惑。不著急,我們一個一個解答。

1.1 快速看完《西瓜書》

問題一:為什麼要選《機器學習》?

因為這本書真的很不錯,作為入門書籍非常合適。同樣有名的《統計學習方法》雖然也很不錯,但是其對小白來說相對較難。雖然《西瓜書》上面也有公式,但我們在初學的時候太複雜的完全可以先跳過去,並且書中還配有西瓜的例子,可以很好的幫助同學們理解演算法的工作過程。

問題二:為什麼要快速看完?

我這裡強調快速,是因為快速真的很重要。因為如果戰線拉得太長,如果一開始看的太細又讀哪兒哪不懂,人是很容易有排斥心理的。最簡單的一個例子,你想想你背英語單詞的時候,多少次是從“abandon”開始背起的。每次快要期末考試了,或者四六級,又或者突然想學英語了,就拿起單詞書來背,多少次是還沒背到 “b” 就 abandon 了。出現這種情況的一大原因是成就感不足,由於在枯燥無味的知識海洋裡沒能得到及時的正反饋激勵自己繼續前行而出現了 abandon 的情況。特別是對於延遲滿足感不強的同學來說,很容易在開始入門的時候就栽起了跟頭。

問題三:怎麼快速看完?要有多塊?

我們這裡強調的快速閱讀並不是說隨便翻一番,更不是說“量子波動速讀”(手動狗頭)。我們閱讀前要帶著問題去讀,比如說演算法能用來幹什麼,演算法的輸入輸出是什麼等等。比較好的一種方法是用思維導圖來記錄每一章的脈絡或者主線。以決策樹為例,看完《西瓜書》後,我們可能有以下筆記:

通過記錄思維導圖的方式除了可以幫我們記筆記、理清自己思路外,還有兩個非常重要的好處。其中一個是:學完不至於感覺很虛。試想一下,如果你快速看完一本書而不記筆記的話,是不是會有一種豬八戒吃人參果的感覺?(內心OS:西瓜書講的啥?)如果你有思維導圖了,一看就知道決策樹是基於多個if判斷語句組成分類器(當然,也可能會知道決策樹可以用於迴歸),有多種屬性劃分可以選擇,在生成樹的時候可以通過剪枝策略降低過擬合,處理連續值的時候有兩種演算法,處理缺失值的時候會遇到兩個問題等等。

另一個好處是:幫助自己迭代知識。我們知道產品是需要迭代的,知識當然也是要迭代的。這也是為什麼我們要分為入門、進階和精通三步走的一大原因。羅馬不是一日建成的,一口也吃不成胖子。

當然作為初學者,我們的思維導圖可能沒有那麼詳細,比如說看完《西瓜書》線性分類那一章,我們可能只有:

不多這樣也沒有關係,知識是不斷迭代的,思維導圖只是輔助我們學習的一個工具。

至於時間,大家可以自己把握,我是花了不到一個星期看完,每天 3~4 個小時的樣子。

1.2 吳恩達Coursera上的《Machine Learning》

問題一:為什麼是這門課?

這裡要注意,是 Coursera 的《Machine Learning》,不是 CS229 的《Machine Learning》。推薦原因有以下幾點:

  • 內容基礎,雖然是英文,但是有中文字幕;
  • 質量很棒,12 萬個評分,平均得分 4.9,要知道滿分才 5 分;
  • 每節課時間不長,且課後都有小練習;
  • 除了自己記筆記外,還可以再網上找到其他同學上課記的筆記,可以作為自己筆記的補充;
  • 《任務一》“太爽了”,可以稍微痛苦點,跟著吳恩達推推公式,加深理解,為進階做準備。

可能有同學還會推薦其他老師的課,甚至手機了一堆資料。我只想說,別這樣。我們要拒絕倉鼠病(倉鼠喜歡囤東西),東西太多會分散我們的注意力,還會讓我們有一種感覺學了好多的錯覺。Less is more,學精品就行。

問題二:這門課也要快速嗎?

千萬別快!一定要認真做筆記(或思維導圖)!做完筆記還要去檢視別人的筆記,補充下自己遺漏的點。對待好的課程一定要懷著虔誠的心態去看,千萬別浪費第一次看視訊的機會,後面再看可能就沒那麼有耐心了。

問題三:那我要花多久時間?

總共十一門課程,沒門課程都有預估時間,加上整理筆記看其他人的筆記,自己可以預估一下。建議在兩個星期以內完成。

這門課雖然是英文的,而且還有公式,但是由於吳恩達老師講的很好,所以其難度是比我們看西瓜書要低的。

1.3 調包跑演算法

問題一:為什麼要調包跑演算法?

原因三有:

  • 提高感性認識:我記得剛學計算機的時候,老師特別喜歡對我們說一句話:自己寫一寫、跑一跑、感受一下。只有動手操作一下,才能切身感受;
  • 提高程式碼能力:計算機是一門工程性很強的學科,不僅要學理論知識,更要有不錯的程式碼實現能力;
  • 成就感:大家不覺得能夠“預測”未知的事情本身就是一件很有成就感的事嗎?

問題二:資料從哪兒來?

資料集來源太多了,但還是那句話:不要有倉鼠病,我們需要什麼資料去拿什麼資料即可。比較建議的資料來源有 Kaggle 和阿里天池,可以去看看那些入門級的競賽,跑跑裡面的資料集。

問題三:跑哪些演算法?

既然是調包,大部分都會用到 Sklearn,裡面的演算法都可以試一試,能跑通一個,再換另一個的速度也挺快的,最好覆蓋常用的演算法如:LR、SVM、Random Forest等。

問題四:花多久時間?

這個要看自己的基礎了,如果程式碼能力還行的話,一天就能搞定了,如果程式碼能力不ok,可能要兩三天。如果程式碼能力不行的話,記得去看別人寫好的程式碼,而不是自己瞎搗鼓。

1.4 總結

總結一下入門階段三個任務的目的:

  1. 《西瓜書》:瞭解並認識演算法,對機器學習有個大概的瞭解;
  2. 《Machine Learning》:在吳恩達老師的帶領下推推公式,加深對演算法的理解,為進階學習做準備;
  3. 調包跑演算法:對演算法有一個感性的認識,並提高動手能力。

預計時間:3~4 個星期。

第一階段所用到的:

  • 工具:《西瓜書》;《統計學習方法》;思維導圖;做筆記推薦 Markdown 或者手寫筆記;
  • 方法論:及時正反饋;拒絕倉鼠病。

PS:如果有多餘的時間也可以看一下《集體智慧程式設計》,這本書很簡單並且有很完整的程式碼實現,可以根據自己的喜好選擇閱讀還是動手實踐。

2.進階

完成入門階段的學習後,我們成功從機器學習小白晉升到機器學習入門,在看到 SVM,LR 之類的詞時再也不會陌生了。但是革命尚未成功,同志仍需努力。

那在進階階段,我們學什麼呢?以及如何學習呢?

我們來看下進階學習的任務:

  1. 學習《統計學習方法》《西瓜書》;
  2. 學習書本以外的常用演算法;
  3. 學習特徵工程,打比賽。

同樣的,我們來解答下同學們的疑惑。

2.1 學習《統計學習方法》《西瓜書》

問題一:為什麼又學習《西瓜書》?

因為我們第一遍學的不仔細,我們第一遍只是簡單的過一遍了。尚且,好的書不應該只看一遍。要相信每次閱讀都會給我帶來不一樣的體驗。

問題二:兩本誰先誰後?

建議先讀《統計學習方法》(建議看第二版),並以《統計學習方法》的目錄來重新整理自己的知識體系,以《西瓜書》為輔,《統計學習方法》看到什麼演算法了,就去《西瓜書》裡面看一看,補充一下。這樣做的原因很簡單:以《統計學習方法》的目錄構建我們的知識體系更加合理。

問題三:該怎麼去學習?

這個階段不能再像入門階段那樣看到複雜的公式就跳過了。但是我也知道很多同學的數學基礎不好,而書中的部分公式又有很多跳過的步驟,讀起來比較困難。這時候我們就要借用群體智慧了:

  • 首先,我們要學會利用 CSDN/知乎等專業的平臺,這些平臺上的那些高贊高閱讀量的博文都是經過時間的篩選出來的高質量文章,很多很不錯的博文寫的比書上寫得更加有利於人理解,當然也可以看看一些論文,非常經典比如說:吳信東的《資料探勘十大演算法》;
  • 其次,github 上有一個比較有名的《南瓜書》,這本書是對《西瓜書》中公式推導的補充,周志華老師也推薦過;
  • 最後,利用好我們的思維導圖,在閱讀書或部落格的時候,記得完善自己的筆記,這個真的很重要!

另外,《統計學習方法》比較厚,特別是第二版的,我們要學會取捨,要分清哪些演算法需要看,哪些演算法可以放一放。比如說,我以後是想做推薦、廣告 CTR、風控之類的事情,那我們就可以把 MCMC、LDA 之類的演算法先放一放,而把有限的時間放在 LR、SVM、決策樹上。

學習的時候涉及到大量的數學原理,缺啥補啥即可,千萬別放下機器學習去學數學去了。不是說數學不重要,而是我們要明白,每個階段的目標和任務,目標導向性有助於我們學習。

問題五:學到什麼程度?

我覺得進階學習的程度至少要包括:

  1. 對需要學習的演算法,掌握其數學原理,學會公式推導,掌握演算法的優缺點;
  2. 對不需要學習的演算法,瞭解演算法的作用,使用場景;
  3. 掌握演算法細節,比如說 SVM 的 SMO 和核函式;K-means 的調優與改進,如何確定 k 值,如何證明其收斂性;LR 的引數更新方法,L1 和 L2 兩種正則化,引數求解如何優化等;

以 LR 為例,學完後的思維導圖可以是這樣的:

雖然看起來內容沒之前多,但仔細看的話,內容深度還是和入門階段的有明顯區別的。

問題六:大概花多久?

這個要根據每個人選擇的演算法個數而定,平均一個演算法可以花兩到四天去學習掌握。

2.2 學習書本以外的常用演算法

問題一:有哪些演算法?

比較有名的有 Boosting 三兄弟: XGBoost、LightGBM 和 CatBoost;

其次,FM、FFM 及其衍生的演算法也很有名;

問題二:為什麼要學習?

首先,這些演算法是比較常用的演算法,效能好,魯棒性強,經常用於各大小公司,和各大比賽(Kaggle、阿里天池等);

其次,我們可以學一學這些演算法的思想,有助於我們演算法調優,比如說我們用 XGBoost 的時候,因為學習了 LightGBM 所以知道對連續特徵離散化有助於 XGBoost 提升泛化性;

問題三:如何學習?

首先,建議先去看高質量的博文,對三個演算法有個大概的瞭解後再去看論文,這樣做的好處在於讀完部落格可以對演算法有個大概的瞭解,再去看論文也更容易入手,此外原汁原味的論文讀起來也是一種享受;

其次,不建議每個都學,學有餘力的同學可以多學一點,時間緊張的東西挑重點的來學,要懂得取捨。

2.3 打比賽

問題一:為什麼要打比賽?

首先,打比賽是我們從理論通往實踐的重要一步,比賽的資料相對工作後的資料來說會乾淨很多,在從理論過渡到實際工作的過程中有很大的幫助。

其次,“沒有免費的午餐”,即沒有演算法能完美的解決所有的問題。通過打比賽,我們可以加深對演算法的理解,熟悉演算法的擅長領域。

最後,打比賽的時候,我們還會學到機器學習中一個非常重要的領域——特徵工程。我們常說,特徵決定上限,而演算法只是去逼近這個上界,從這句話就能看出特徵的重要性。所以只會演算法是遠遠不夠的,還要學會做特徵工程。而且,不同的演算法可能需要不同的特徵工程,這也會加深我們對演算法的理解。

問題二:如何學習?

首先,強烈推薦 Kaggle,因為 Kaggle 上有很多大佬分享的經驗帖子,不僅有 baseline 演算法,還會有資料分析、特徵工程的經驗和心路歷程,非常建議大家去學習實踐;

其次,特徵工程是一個比較偏經驗的,作為剛接觸特徵工程的同學來說,可以一遍打比賽,一遍看看相關書籍和部落格:有一些比較有名的特徵工程書《特徵工程入門與實踐》,還有很多同學整理的特徵工程相關部落格也可以看看;

最後,還是那句話,記得整理筆記!因為部落格和書籍中有很多重複的內容,只有認真梳理了後才能形成我們自己的學習體系。

問題三:預計時間

短則看幾本書看看 Demo 跑跑演算法幾個星期就搞定了,長則打幾場比賽需要大半年的時間。

2.4 總結

總結一下進階階段三個任務的目的:

  1. 學習《統計學習方法》《西瓜書》:通過推公式加深對演算法的理解,掌握演算法細節;
  2. 學習書本以外的常用演算法:對書本內容的一個補充,學習和掌握目前比較流行的演算法;
  3. 打比賽:將演算法學習從理論過渡到實踐,同時學習特徵工程。

預計時間:這個時間波動會比較大,但無論花多長時間,這個階段能獲取到的知識都是非常多的。

工具:《統計學習方法》;《西瓜書》;《南瓜書》;《特徵工程入門與實踐》;部落格;思維導圖;論文;

方法論:目標導向性;學會取捨;當然也要記得正反饋。

3.精通

這一階段就不太好談了,因為目前我也在這個階段裡遨遊,但我個人角度來說,有以下幾個任務:

  1. 深入瞭解演算法細節,對比各大演算法差異;
  2. 學習演算法在工業中的應用,看原始碼;
  3. 看論文;
  4. 寫部落格。

同理,我們一個一個的來解釋。

3.1 深入瞭解演算法細節,對比各大演算法差異

問題一:我都會推公式了,還不夠細嗎?

首先,我們說的推公式很多時候都是看得懂公式,而不是知道為什麼要這麼推,即知其然而不知其所以然。比如說,我們會用拉格朗日乘子法來求解 SVM 的對偶問題,但是我們可能不知道拉格朗日乘子法原本是求解燈飾優化問題的,而不是 SVM 中的不等式優化問題,如果從將拉格朗日乘子法從不等式優化擴充套件到等式優化呢?

除此之外還有:為什麼一定要轉換成對偶問題呢?為什麼要把 SVM 從 min\; max\; f(x) 轉化到 max\; min\; f(x) 呢?原來的公式不香嗎?所以推公式只是加深了對演算法的理解,這個階段的的學習還要多問為什麼。為什麼要這麼做,為什麼問多了之後可能我們就知道了:首先轉化為對偶問題後可以簡化問題複雜度,原來是和樣本維度和樣本數量有關的問題,現在只和樣本數量有關了;其次轉換為對偶問題可以方便的引入核函式,將資料從低維對映到高維,更容易求得最優解。。

其次,很多看似很簡單的東西,如我們在進階階段學習到的:LR 引入 L1 和 L2 正規化可以通過約束權重值來減少過擬合風險。但我們有沒有想過為什麼權重小就能減少過擬合風險?為什麼 L1 和 L2 正規化有效?

到這個階段後,我們可能就知道了:降低權重是為了降低演算法的複雜度,防止出現變數值波動引起的預測精度問題。我們也會知道,L1 和 L2 正規化之所以有效,是因為引入了“零均值的拉普拉斯分佈”和“零均值的正態分佈”這種先驗知識。

總之,這個階段的任務就是要多問自己為什麼。為什麼是這樣的?為什麼這樣行?那樣不行嗎?只有多問自己為什麼,帶著辯證的思維去學習,才能更加深刻的瞭解演算法細節。

問題二:為什麼要對比各大演算法的差異?

獨木不成林,我們要將學習到的零零散散的知識從點練成線,再將線拼接成面,甚至堆積成三維立體。

在進階學習的過程中,我們知道 XGBoost 比 LR 效果要好,SVM 就算數學理論很完備工業界還是不常用。但我們不知道其為什麼?為什麼 XGBoost 比 LR 好?為什麼 SVM 不常用?LR 和 貝葉斯為什麼會應用於不同的領域?為什麼“沒有免費的午餐”?

瞭解不同演算法之間的差異,及優缺點,比說 LR 與 SVM 的區別與聯絡、LR 與最大熵演算法的區別與聯絡等等。

通過學習各大演算法的差異與聯絡,可以幫助我們更加深刻的瞭解各類演算法。

問題三:要學習到什麼程度?

這個不好說,精通階段仁者見仁智者見智,以 LR 為例,我覺得至少應該學到這種階段:

3.2 學習工業應用,看原始碼

問題一:為什麼要學習工業應用?

因為我們大多數人最終還是要去工業界的,而工業界的思維和我們在學校的思維是有差距的。

首先,工業界更加強調落地,而非精度。平常我們打比賽、發論文之類的,都把演算法搞的非常複雜,但是在工業介面對千萬級甚至億級的資料,太複雜的演算法不利於我們演算法落地。所以工業界是需要在精度和算力中取一個平衡點的;

其次,工業界看中速度,演算法一定要快。這個時候演算法如何並行化實現就顯得尤為重要。比較通用的方法是:資料並行和特徵並行,大家可以自行了解下。

問題二:為什麼要看原始碼?

看原始碼一來是為了加深自己對演算法的理解,二來是學習下演算法在落地時的優化策略或是一些小 Trick,比如說如何排序?用O(nlogn)的快排嗎?如何取樣?如何加權取樣?隨機數怎麼算?等等問題。這些都是需要從原始碼中學到的。

3.3 看論文

這個應該不用問為什麼了吧,很多先進的機器學習/深度學習演算法都來源於論文,稍微老一點的類似 GDBT+LR、GDBT+FM 這種組合(GDBT 可以換成 XGBoost),年輕一點的有 DIN、DIEN 等。

看論文有助於我們瞭解最新的演算法的模型,跟上前沿的研究軌跡。

3.4 寫部落格

其實寫部落格進階的時候也可以寫,甚至入門的時候也可以寫。無非就是把筆記整理一下發出去。但需要注意,我們這裡說的部落格是寫給別人看的,如果是寫給自己看的隨便你怎麼寫。但現在你的目標受眾是其他讀者,你就要本著負責任的心態,把你的博文寫好。

這個寫好部落格說的是,至少要讓讀者明白你在說什麼吧。很多會覺得麻煩,但其實不是,你之前的學習是一個輸入,消化了多少你並不知道,而寫部落格是一種輸出,你寫出來多少就代表你會了多少。

有同學可能要說了:”我會但我寫不出,我是茶壺裡煮餃子。“

抱歉,千萬別這麼想,其實你就是不會,有這種思想很大程度上是因為自己眼高手低,沒有腳踏實地的原因。

另外,寫部落格也是整理思路的一個過程,可以很好的幫助我們學習整理歸納,加深自己對演算法的瞭解。

3.5 總結

最後,我們來總結下精通階段的幾個任務:

  1. 深入瞭解演算法細節,對比各大演算法差異:將點串成面,加深演算法理解;
  2. 學習工業應用,看原始碼:瞭解工業應用和演算法落地時的優化,加深演算法理解;
  3. 看論文:瞭解前沿演算法;
  4. 寫部落格:梳理知識,加深演算法瞭解。

工具:原始碼;部落格;論文;

方法論:以點串線帶面;知識的輸入輸出;

4.學習資料推薦

貪心學院aijiaoai《機器學習》,這個課程覆蓋了16大經典演算法講解,20個實操案例,8大專案作業。並且是玩遊戲通關的輕鬆學習模式,讓你在2個月的時間快速入門機器學習。

 

更多幹貨分享,請關注“貪心科技AI”公眾