學習機器學習有很多方法,大多數人選擇從理論開始。
通過本文你可以學習到程式設計師初學機器學習的四種方式。這是給技術人員設計的實用方法,並以實驗為依據,你需要做調研並且完成實驗才能建立自己的感性知識。
這四種方法分別是:
1、學習一個機器學習工具
2、學習一個機器學習資料集
3、學習一個機器學習演算法
4、實現一個機器學習演算法
你應該通讀一下這些方法的策略,然後選擇你覺得最適合自己的一個,並且有選擇性地執行。
1. 學習一個機器學習工具
選一個你喜歡的工具或者類庫,然後學著用好它。
我推薦你從一個自帶資料預處理工具,機器學習演算法並且能呈現結果的工作平臺開始學習。學習這樣一個工作平臺能讓你更熟悉機器學習從頭到尾的整個過程,這比學習一個特定的資料處理技術或者一個機器學習演算法更有價值。
或者,也許你感興趣的是一個特定技術或者一類技術。你可以利用這個機會更深入地學習一個提供這些方法的類庫或工具,掌握了提供這些技術的類庫能幫助你掌握相應的技術。
一些你可以採取的策略有:
- 比較一些可選的工具。
- 總結你選定的那個工具的能力。
- 閱讀並總結這個工具的文件。
- 完成學習這個工具的文字或視訊教程,並且總結每個教程中你重點學到了什麼。
- 製作關於這個工具的功能或者特性的教程。選一些你不太瞭解的功能,然後寫下得到結果的過程,或者把如何使用這個功能的過程錄個五分鐘的截圖視訊。
一些值得考慮的工作平臺有:R, Weka, scikit-learn, waffles, 和 orange.
2. 學習一個機器學習資料集
選一個資料集,然後深入地理解它,發掘究竟哪類演算法最適合處理它。
我推薦你選擇一箇中等大小的,記憶體能放下的,可能被很多人研究過的資料集。現在有很多非常好的包含資料的類庫,你可以瀏覽它們並且從中選擇。你的目的是嘗試理解這個資料集背後的問題,它的結構,和哪些種類的解決方法最適合這個問題。
用一個機器學習或者統計的工作平臺來研究這個資料集。這樣你能專心解答關於這個資料集你要研究的問題,而不是分心去學習某個特定的技術或者如何寫程式碼來實現它。
一些可以幫助你學習實驗性的機器學習資料集的策略有:
- 清晰地描述這個資料集所呈現的問題。
- 用描述性的統計資料來總結資料。
- 描述你從資料中觀察到的結構,並且提出對資料間關係的假設。
- 簡單地在這個資料集上測試一些常用的機器學習演算法,然後發掘哪些類別的演算法比其他的表現好
- 調整表現好的演算法的引數,然後發掘什麼演算法及演算法引數設定在這個問題上表現得好
你可以從這些包含高質量資料集的庫中選擇: UCI ML Repository,Kaggle 和 data.gov.
3. 學習一個機器學習演算法
選擇一個演算法,深入理解它,發掘什麼樣的引數設定在不同資料集上都穩定。
我推薦你從一箇中等複雜度的演算法開始學起。選一個已經被人充分理解了的,有許多可選的開源實現,並且需要你探索的引數數目較少的演算法。你的目的是建立有關這個演算法在不同問題和不同引數設定下表現如何的直覺。
使用一個機器學習平臺或者類庫。這樣能讓你把這個演算法當成一個“系統”,專心研究它的表現,而不是分心研究數學公式描述或者相關論文。
一些學習你選定的機器學習演算法時可採取的策略有:
- 總結系統的引數,及它們對演算法可能有什麼影響
- 選一系列適合這個演算法,可能導致不同表現的資料庫
- 選擇一些你認為能導致不同結果的演算法的引數設定,然後列出你認為系統可能的表現
- 考慮在迭代過程或不同時間段內能被監察到的演算法表現
- 用一個或多個資料集,演算法設定和結果衡量方式來設計解決特定問題的小實驗,並且彙報結果
你可以學簡單點,也可以學複雜點。想多學一點的話,你可以探索所謂的啟發式規則或經驗法則來使用演算法,並且以實驗為依據來展示它們好不好用,及如果好用的話在什麼條件下他們與成功的結果有關聯。
一些你可以考慮學習的演算法有:最小平方線性迴歸,邏輯迴歸,K最近鄰分類演算法,感知器演算法。
4. 實現一個機器學習演算法
選一個演算法,然後選一個程式語言來實現它,或者把一個已有的實現移植到你選定的程式語言上。
你應選擇一箇中等複雜度的演算法來實現。我推薦你仔細研究你想要實現的演算法,或選擇一個你喜歡的已有實現然後把它移植到你選定的程式語言。
從頭開始實現一個演算法,是學習那些關於把演算法描述轉換成一個可行的系統的過程中必須要做的無數的小決定的好方法。在不同演算法上重複這個過程,很快你就能對讀懂論文和書裡面演算法的數學描述有感覺了。
五個能幫助你從頭開始實現機器學習演算法的策略有:
- 從程式碼移植開始。把開源的演算法實現從一種語言移植到另外一種語言能教會你演算法是如何實現的,並且你能擁有並掌握它。這是開始學習的最快的途徑,非常值得推薦。
- 從一個演算法描述開始,然後採集一些其他的描述來幫助你排除歧義並且理解主要的那個參考材料。
- 多讀該演算法的不同實現。學習不同程式設計師是如何理解演算法描述並且如何把它轉換成程式碼的。
- 不要陷入過炫的方法太深。許多機器學習演算法的核心用的都是高階優化演算法。不要嘗試重新實現這些方法,除非這就是你做這個專案的本意。你應該用一個提供優化演算法的類庫,或者用一個更容易實現的或者類庫裡就有的簡單點的優化演算法(如梯度下降演算法)。
小型專案方法論
以上四個策略屬於我稱為“小型專案”的方法論。你用這個方法可以很快建立在技術領域(比如機器學習)方面的實用技能。大意就是你設計並且親手完成解決特定問題的小專案。
小型專案在幾個方面應該足夠小,才能保證你能完成它們並且從中學習,然後好步入到下一個專案中去。下面是一些你應該考慮加在專案上的一些限制:
- 時間短:一個專案從頭到最後能有可展現的結果不應超過5-15小時。這樣利用一週中不上班的晚上和週末時間你就能完成一個小專案。
- 範圍小:一個專案應該有意義,但同時應該是你感興趣的問題的範圍最小的版本。舉個例子,與其解決廣義的“寫一個能告訴我微博是否會被轉發的程式”,還不如去研究這個問題在一個特定的賬號在一個特定的時間段內的表現。
- 所需資源少:一個專案應該能用你的可聯網的臺式或者膝上型電腦完成。你不應該需要奇葩的軟體,網路架構,或者第三方資料或者服務。你應蒐集需要的資料,讀入記憶體,用開源工具來解決你那個小問題。
額外有關專案的小貼士
這些策略的原則是讓你利用你的程式設計師技能開始行動。下面是三條幫助你調整思維模式,有助你開始行動的小貼士:
- 寫下你學到的東西。我推薦你每個步驟都產生一個有形的勞動成果。它可以是本子裡的筆記,微博,部落格文章或者是開源專案。每個勞動成果都可以作為一個里程碑或錨。
- 除非專案的目的是寫程式碼,否則不要寫。這條不是那麼顯而易見,但卻是最能幫助你加快理解機器學習的速度的建議。
- 目的是學到東西,而不是產生獨一無二的資源。不要管是否有人讀你關於一個演算法的研究、教程或是筆記。這些都是你的觀點,是你的勞動成果,他們證明你現在掌握到了知識。
總結
下面是這些策略的一句話清晰總結,可以幫助你選擇適合自己的那個。
- 學習一個機器學習工具:選擇一個你喜歡的工具或類庫,學習如何很好的使用它。。
- 學習一個機器學習資料集:選擇一個資料集,深入地離家它,發掘哪類演算法處理它最有效。
- 學習一個機器學習演算法:選擇一個演算法,深入理解它,發掘什麼樣的引數設定在不同資料集上都穩定。
- 實現一個機器學習演算法:選擇一個演算法,用你選定的語言實現它或者是把已有的實現移植到你選定的語言上。