1. 引言php
最近google的阿爾法狗大戰李世石刷屏了,閒下來時也瞭解點機器學習or深度學習的理論css
2. 機器學習關注問題html
並不是全部的問題都適合用機器學習解決(不少邏輯清晰的問題用規則能很高效和準確地處理),也沒有一個機器學習算法能夠通用於全部問題。我們先來了解了解,機器學習,到底關心和解決什麼樣的問題。前端
從功能的角度分類,機器學習在必定量級的數據上,能夠解決下列問題:java
1.分類問題python
根據數據樣本上抽取出的特徵,斷定其屬於有限個類別中的哪個。好比:linux
垃圾郵件識別(結果類別:一、垃圾郵件 二、正常郵件)程序員
文本情感褒貶分析(結果類別:一、褒 二、貶)算法
圖像內容識別識別(結果類別:一、喵星人 二、汪星人 三、人類 四、草泥馬 五、都不是)。spring
2.迴歸問題
根據數據樣本上抽取出的特徵,預測一個連續值的結果。好比:
星爺《美人魚》票房
大帝都2個月後的房價
隔壁熊孩子一天來你家幾回,寵幸你多少玩具
3.聚類問題
根據數據樣本上抽取出的特徵,讓樣本抱抱團(相近/相關的樣本在一團內)。好比:
google的新聞分類
用戶羣體劃分
咱們再把上述常見問題劃到機器學習最典型的2個分類上。
分類與迴歸問題須要用已知結果的數據作訓練,屬於「監督學習」
聚類的問題不須要已知標籤,屬於「非監督學習」。
若是在IT行業(尤爲是互聯網)裏溜達一圈,你會發現機器學習在如下熱點問題中有普遍應用:
1.計算機視覺
典型的應用包括:人臉識別、車牌識別、掃描文字識別、圖片內容識別、圖片搜索等等。
2.天然語言處理
典型的應用包括:搜索引擎智能匹配、文本內容理解、文本情緒判斷,語音識別、輸入法、機器翻譯等等。
3.社會網絡分析
典型的應用包括:用戶畫像、網絡關聯分析、欺詐做弊發現、熱點發現等等。
4.推薦
典型的應用包括:蝦米音樂的「歌曲推薦」,某寶的「猜你喜歡」等等。
3. 入門方法與學習路徑
OK,不廢話,直接切重點丟乾貨了。看似學習難度大,曲線陡的機器學習,對大多數入門者也有一個比較通用的學習路徑,也有一些優秀的入門資料能夠下降你們的學習門檻,同時激發咱們的學習樂趣。
簡單說來,大概的一個學習路徑以下:
簡單說一點,之因此最左邊寫了『數學基礎』『典型機器學習算法』『編程基礎』三個並行的部分,是由於機器學習是一個將數學/算法理論和工程實踐緊密結合的領域,須要紮實的理論基礎幫助引導數據分析與模型調優,同時也須要精湛的工程開發能力去高效化地訓練和部署模型和服務。
須要多說一句的是,在互聯網領域從事機器學習的人,有2類背景的人比較多,其中一部分(很大一部分)是程序員出身,這類同窗工程經驗相對會多一些,另外一部分是學數學統計領域的同窗,這部分同窗理論基礎相對紮實一些。所以對比上圖,2類同窗入門機器學習,所欠缺和須要增強的部分是不同的。
下面就上述圖中的部分,展開來分別扯幾句:
3.1 數學基礎
有無數激情滿滿大步向前,誓要在機器學習領域有一番做爲的同窗,在看到公式的一刻忽然就以爲本身狗帶了。是啊,機器學習之因此相對於其餘開發工做,更有門檻的根本緣由就是數學。每個算法,要在訓練集上最大程度擬合同時又保證泛化能力,須要不斷分析結果和數據,調優參數,這須要咱們對數據分佈和模型底層的數學原理有必定的理解。所幸的是若是隻是想合理應用機器學習,而不是作相關方向高精尖的research,須要的數學知識啃一啃仍是基本能理解下來的。至於更高深的部分,恩,博主很是願意認可本身是『數學渣』。
基本全部常見機器學習算法須要的數學基礎,都集中在微積分、線性代數和機率與統計當中。下面咱們先過一過知識重點,文章的後部分會介紹一些幫助學習和鞏固這些知識的資料。
3.1.1 微積分
微分的計算及其幾何、物理含義,是機器學習中大多數算法的求解過程的核心。好比算法中運用到梯度降低法、牛頓法等。若是對其幾何意義有充分的理解,就能理解「梯度降低是用平面來逼近局部,牛頓法是用曲面逼近局部」,可以更好地理解運用這樣的方法。
凸優化和條件最優化 的相關知識在算法中的應用隨處可見,若是能有系統的學習將使得你對算法的認識達到一個新高度。
3.1.2 線性代數
大多數機器學習的算法要應用起來,依賴於高效的計算,這種場景下,程序員GG們習慣的多層for循環一般就行不通了,而大多數的循環操做可轉化成矩陣之間的乘法運算,這就和線性代數有莫大的關係了
向量的內積運算更是隨處可見。
矩陣乘法與分解在機器學習的主成分分析(PCA)和奇異值分解(SVD) 等部分呈現刷屏狀地出現。
3.1.3 機率與統計
從廣義來講,機器學習在作的不少事情,和統計層面數據分析和發掘隱藏的模式,是很是相似的。
極大似然思想、貝葉斯模型 是理論基礎,樸素貝葉斯(Na?ve Bayes )、語言模型(N-gram)、隱馬爾科夫(HMM)、隱變量混合機率模型是他們的高級形態。
常見分佈如高斯分佈是混合高斯模型(GMM)等的基礎。
3.2 典型算法
絕大多數問題用典型機器學習的算法都能解決,粗略地列舉一下這些方法以下:
處理分類問題的經常使用算法包括:邏輯迴歸(工業界最經常使用),支持向量機,隨機森林,樸素貝葉斯(NLP中經常使用),深度神經網絡(視頻、圖片、語音等多媒體數據中使用)。
處理迴歸問題的經常使用算法包括:線性迴歸,普通最小二乘迴歸(Ordinary Least Squares Regression),逐步迴歸(Stepwise Regression),多元自適應迴歸樣條(Multivariate Adaptive Regression Splines)
處理聚類問題的經常使用算法包括:K均值(K-means),基於密度聚類,LDA等等。
降維的經常使用算法包括:主成分分析(PCA),奇異值分解(SVD) 等。
推薦系統的經常使用算法:協同過濾算法
模型融合(model ensemble)和提高(boosting)的算法包括:bagging,adaboost,GBDT,GBRT
其餘很重要的算法包括:EM算法等等。
咱們多插一句,機器學習裏所說的「算法」與程序員所說的「數據結構與算法分析」裏的「算法」略有區別。前者更關注結果數據的召回率、精確度、準確性等方面,後者更關注執行過程的時間複雜度、空間複雜度等方面。 。固然,實際機器學習問題中,對效率和資源佔用的考量是不可或缺的。
3.3 編程語言、工具和環境
看了無數的理論與知識,總歸要落到實際動手實現和解決問題上。而沒有工具全部的材料和框架、邏輯、思路都給你,也步履維艱。所以咱們仍是得須要合適的編程語言、工具和環境幫助本身在數據集上應用機器學習算法,或者實現本身的想法。對初學者而言,Python和R語言是很好的入門語言,很容易上手,同時又活躍的社區支持,豐富的工具包幫助咱們完成想法。相對而言,彷佛計算機相關的同窗用Python多一些,而數學統計出身的同窗更喜歡R一些。咱們對編程語言、工具和環境稍加介紹:
3.3.1 python
python有着全品類的數據科學工具,從數據獲取、數據清洗到整合各類算法都作得很是全面。
網頁爬蟲:scrapy
數據挖掘:
1.pandas:模擬R,進行數據瀏覽與預處理。
2.numpy:數組運算。
3.scipy:高效的科學計算。
4.matplotlib:很是方便的數據可視化工具。
機器學習:
1.scikit-learn:遠近聞名的機器學習package。未必是最高效的,可是接口真心封裝得好,幾乎全部的機器學習算法輸入輸出部分格式都一致。而它的支持文檔甚至能夠直接當作教程來學習,很是用心。對於不是很是高緯度、高量級的數據,scikit-learn勝任得很是好(有興趣能夠看看sklearn的源碼,也頗有意思)。
2.libsvm:高效率的svm模型實現(瞭解一下頗有好處,libsvm的係數數據輸入格式,在各處都很是常見)
3.keras/TensorFlow:對深度學習感興趣的同窗,也能很方便地搭建本身的神經網絡了。
天然語言處理:
1.nltk:天然語言處理的相關功能作得很是全面,有典型語料庫,並且上手也很是容 易。
交互式環境:
1.ipython notebook:能直接打通數據到結果的通道,方便至極。強力推薦。
3.3.2 R
R最大的優點是開源社區,彙集了很是多功能強大可直接使用的包,絕大多數的機器學習算法在R中都有完善的包可直接使用,同時文檔也很是齊全。常見的package包括:RGtk2, pmml, colorspace, ada, amap, arules, biclust, cba, descr, doBy, e1071, ellipse等等。另外,值得一提的是R的可視化效果作得很是不錯,而這對於機器學習是很是有幫助的。
3.3.3 其餘語言
相應資深程序員GG的要求,再補充一下java和C++相關機器學習package。
Java系列
WEKA Machine Learning Workbench 至關於java中的scikit-learn
其餘的工具如Massive Online Analysis(MOA)、MEKA 、 Mallet 等也很是有名。
更多詳細的應用請參考這篇文章《25個Java機器學習工具&庫》
C++系列
mlpack,高效同時可擴充性很是好的機器學習庫。
Shark:文檔齊全的老牌C++機器學習庫。
3.3.4 大數據相關
Hadoop:基本上是工業界的標配了。通常用來作特徵清洗、特徵處理的相關工做。
spark:提供了MLlib這樣的大數據機器學習平臺,實現了不少經常使用算法。但可靠性、穩定性上有待提升。
3.3.5 操做系統
mac和linux會方便一些,而windows在開發中略顯力不從心。所謂方便,主要是指的mac和linux在下載安裝軟件、配置環境更快捷。
對於只習慣windows的同窗,推薦anaconda,一步到位安裝完python的全品類數據科學工具包。
3.4 基本工做流程
以上咱們基本具有了機器學習的必要條件,剩下的就是怎麼運用它們去作一個完整的機器學習項目。其工做流程以下:
3.4.1 抽象成數學問題
明確問題是進行機器學習的第一步。機器學習的訓練過程一般都是一件很是耗時的事情,胡亂嘗試時間成本是很是高的。
這裏的抽象成數學問題,指的咱們明確咱們能夠得到什麼樣的數據,目標是一個分類仍是迴歸或者是聚類的問題,若是都不是的話,若是劃歸爲其中的某類問題。
3.4.2 獲取數據
數據決定了機器學習結果的上限,而算法只是儘量逼近這個上限。
數據要有表明性,不然必然會過擬合。
並且對於分類問題,數據偏斜不能過於嚴重,不一樣類別的數據數量不要有數個數量級的差距。
並且還要對數據的量級有一個評估,多少個樣本,多少個特徵,能夠估算出其對內存的消耗程度,判斷訓練過程當中內存是否可以放得下。若是放不下就得考慮改進算法或者使用一些降維的技巧了。若是數據量實在太大,那就要考慮分佈式了。
3.4.3 特徵預處理與特徵選擇
良好的數據要可以提取出良好的特徵才能真正發揮效力。
特徵預處理、數據清洗是很關鍵的步驟,每每可以使得算法的效果和性能獲得顯著提升。歸一化、離散化、因子化、缺失值處理、去除共線性等,數據挖掘過程當中不少時間就花在它們上面。這些工做簡單可複製,收益穩定可預期,是機器學習的基礎必備步驟。
篩選出顯著特徵、摒棄非顯著特徵,須要機器學習工程師反覆理解業務。這對不少結果有決定性的影響。特徵選擇好了,很是簡單的算法也能得出良好、穩定的結果。這須要運用特徵有效性分析的相關技術,如相關係數、卡方檢驗、平均互信息、條件熵、後驗機率、邏輯迴歸權重等方法。
3.4.4 訓練模型與調優
直到這一步纔用到咱們上面說的算法進行訓練。如今不少算法都可以封裝成黑盒供人使用。可是真正考驗水平的是調整這些算法的(超)參數,使得結果變得更加優良。這須要咱們對算法的原理有深刻的理解。理解越深刻,就越能發現問題的癥結,提出良好的調優方案。
3.4.5 模型診斷
如何肯定模型調優的方向與思路呢?這就須要對模型進行診斷的技術。
過擬合、欠擬合 判斷是模型診斷中相當重要的一步。常見的方法如交叉驗證,繪製學習曲線等。過擬合的基本調優思路是增長數據量,下降模型複雜度。欠擬合的基本調優思路是提升特徵數量和質量,增長模型複雜度。
偏差分析 也是機器學習相當重要的步驟。經過觀察偏差樣本,全面分析偏差產生偏差的緣由:是參數的問題仍是算法選擇的問題,是特徵的問題仍是數據自己的問題……
診斷後的模型須要進行調優,調優後的新模型須要從新進行診斷,這是一個反覆迭代不斷逼近的過程,須要不斷地嘗試, 進而達到最優狀態。
3.4.6 模型融合
通常來講,模型融合後都能使得效果有必定提高。並且效果很好。
工程上,主要提高算法準確度的方法是分別在模型的前端(特徵清洗和預處理,不一樣的採樣模式)與後端(模型融合)上下功夫。由於他們比較標準可複製,效果比較穩定。而直接調參的工做不會不少,畢竟大量數據訓練起來太慢了,並且效果難以保證。
3.4.7 上線運行
這一部份內容主要跟工程實現的相關性比較大。工程上是結果導向,模型在線上運行的效果直接決定模型的成敗。 不單純包括其準確程度、偏差等狀況,還包括其運行的速度(時間複雜度)、資源消耗程度(空間複雜度)、穩定性是否可接受。
這些工做流程主要是工程實踐上總結出的一些經驗。並非每一個項目都包含完整的一個流程。這裏的部分只是一個指導性的說明,只有你們本身多實踐,多積累項目經驗,纔會有本身更深入的認識。
3.5 關於積累項目經驗
初學機器學習可能有一個誤區,就是一上來就陷入到對各類高大上算法的追逐當中。動不動就我能不能用深度學習去解決這個問題啊?我是否是要用boosting算法作一些模型融合啊?我一直持有一個觀點,『脫離業務和數據的算法討論是毫無心義的』。
實際上按咱們的學習經驗,從一個數據源開始,即便是用最傳統,已經應用多年的機器學習算法,先完整地走完機器學習的整個工做流程,不斷嘗試各類算法深挖這些數據的價值,在運用過程當中把數據、特徵和算法搞透,真正積累出項目經驗 纔是最快、最靠譜的學習路徑。
那如何獲取數據和項目呢?一個捷徑就是積極參加國內外各類數據挖掘競賽,數據直接下載下來,按照競賽的要求去不斷優化,積累經驗。國外的Kaggle和國內的DataCastle 以及阿里天池比賽都是很好的平臺,你能夠在上面獲取真實的數據和數據科學家們一塊兒學習和進行競賽,嘗試使用已經學過的全部知識來完成這個比賽自己也是一件頗有樂趣的事情。和其餘數據科學家的討論能開闊視野,對機器學習算法有更深層次的認識。
有意思的是,有些平臺,好比阿里天池比賽,甚至給出了從數據處理到模型訓練到模型評估、可視化到模型融合加強的所有組件,你要作的事情只是參與比賽,獲取數據,而後使用這些組件去實現本身的idea便可。具體內容能夠參見阿里雲機器學習文檔。
3.6 自主學習能力
多幾句嘴,這部份內容和機器學習自己沒有關係,可是咱們以爲這方面的能力對於任何一種新知識和技能的學習來講都是相當重要的。 自主學習能力提高後,意味着你可以跟據本身的狀況,找到最合適的學習資料和最快學習成長路徑。
3.6.1 信息檢索過濾與整合能力
對於初學者,絕大部分須要的知識經過網絡就能夠找到了。
google搜索引擎技巧——組合替換搜索關鍵詞、站內搜索、學術文獻搜索、PDF搜索等——都是必備的。
一個比較好的習慣是找到信息的原始出處,如我的站、公衆號、博客、專業網站、書籍等等。這樣就可以找到系統化、不失真的高質量信息。
百度搜到的技術類信息不夠好,建議只做爲補充搜索來用。各類搜索引擎均可以交叉着使用效果更好。
學會去常見的高質量信息源中搜索東西:stackoverflow(程序相關)、quora(高質量回答)、wikipedia(系統化知識,比某某百科不知道好太多)、知乎(中文、有料)、網盤搜索(免費資源一大把)等。
將蒐集到的網頁放到分類齊全的雲端收藏夾裏,並常常整理。這樣不管在公司仍是在家裏,在電腦前仍是在手機上,都可以找到本身喜歡的東西。
蒐集到的文件、代碼、電子書等等也放到雲端網盤裏,並常常整理。
3.6.2 提煉與總結能力
常常做筆記,並總結本身學到的知識是成長的不二法門。其實主要的困難是懶,可是堅持以後總能發現知識的共性,就能少記一些東西,掌握得更多。
筆記建議放到雲端筆記裏,印象筆記、爲知筆記都還不錯。這樣在坐地鐵、排隊等零碎的時間都能看到筆記並繼續思考。
3.6.3 提問與求助能力
機器學習的相關QQ羣、論壇、社區一大堆。總有人知道你問題的答案。
可是大多數同窗都很忙,無法像家庭教師那樣手把手告訴你怎麼作。
爲了讓回答者最快明白你的問題,最好該學會正確的問問題的方式:陳述清楚你的業務場景和業務需求是什麼,有什麼已知條件,在哪一個具體的節點上遇到困難了,並作過哪些努力。
有一篇經典的文章告訴你怎樣經過提問得到幫助:《提問的智慧》,強力推薦。 話鋒犀利了些,但裏面的乾貨仍是很好的。
別人幫助你的可能性與你提問題的具體程度和重要性呈指數相關。
3.6.4 分享的習慣
咱們深信:「證實本身真的透徹理解一個知識,最好的方法,是給一個想了解這個內容的人,講清楚這個內容。」 分享可以最充分地提高本身的學習水平。這也是咱們堅持長期分享最重要的緣由。
分享還有一個副產品,就是本身在求助的時候可以得到更多的幫助機會,這也很是重要。
4. 相關資源推薦
文章的最後部分,咱們繼續放送乾貨。其實機器學習的優質資源很是多。博主也是翻遍瀏覽器收藏夾,也問同事取了取經,整合了一部分資源羅列以下:
4.1 入門資源
首先coursera(https://www.coursera.org/)是一個很是好的學習網站,集中了全球的精品課程。上述知識學習的過程均可以在上面找到合適的課程。也有不少其餘的課程網站,這裏咱們就須要學習的數學和機器學習算法推薦一些課程(有一些課程有中文字幕,有一些只有英文字幕,有一些甚至沒有字幕,你們根據本身的狀況調整,若是不習慣英文,基礎部分有不少國內的課程也很是優質):
微積分相關
Calculus: Single Variable (https://www.coursera.org/learn/single-variable-calculus)
Multivariable Calculus(http://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/)
線性代數
Linear Algebra(http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/)
機率統計
Introduction to Statistics: Descriptive Statistics(https://www.edx.org/course/introduction-statistics-descriptive-uc-berkeleyx-stat2-1x)
Probabilistic Systems Analysis and Applied Probability(http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-041-probabilistic-systems-analysis-and-applied-probability-fall-2010/)
編程語言
Programming for Everybody:Python(https://www.coursera.org/learn/python)
DataCamp: Learn R with R tutorials and coding challenges:R(https://www.datacamp.com/)
機器學習方法
Statistical Learning(R) (https://lagunita.stanford.edu/courses/HumanitiesandScience/StatLearning/Winter2015/about)
machine learning(https://www.coursera.org/learn/machine-learning):強烈推薦,Andrew Ng老師的課程
機器學習基石(https://www.coursera.org/course/ntumlone)
機器學習技術(https://www.coursera.org/course/ntumltwo):林軒田老師的課相對更有深度一些,把做業作完會對提高對機器學習的認識。
天然語言處理(https://class.coursera.org/nlp/lecture):斯坦福大學課程
平常閱讀的資源
@愛可可-愛生活的微博(http://weibo.com/fly51fly?from=myfollow_all)
機器學習日報的郵件訂閱(http://ml.memect.com/)等。
4.2 進階資源
有源代碼的教程
scikit-learn(http://scikit-learn.org/stable/auto_examples/index.html)中各個算法的例子
《機器學習實戰》 有中文版,並附有python源代碼。
《The Elements of Statistical Learning (豆瓣)》(http://book.douban.com/subject/3294335/) 這本書有對應的中文版:《統計學習基礎 (豆瓣)》(http://book.douban.com/subject/1152126/)。書中配有R包。能夠參照着代碼學習算法。網盤中有中文版。
《Natural Language Processing with Python (豆瓣)》(http://book.douban.com/subject/3696989/) NLP 經典,其實主要是講 python的NLTK 這個包。網盤中有中文版。
《Neural Networks and Deep Learning》(http://neuralnetworksanddeeplearning.com/) Michael Nielsen的神經網絡教材,淺顯易懂。國內有部分翻譯,不全,建議直接看原版。
圖書與教材
《數學之美》:入門讀起來很不錯。
《統計學習方法 (豆瓣) 》(http://book.douban.com/subject/10590856/):李航經典教材。
《Pattern Recognition And Machine Learning (豆瓣) 》(http://book.douban.com/subject/2061116/):經典中教材。
《統計天然語言處理》天然語言處理經典教材
《Applied predictive modeling》:英文版,注重工程實踐的機器學習教材
《UFLDL教程》(http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B):神經網絡經典教材
《deeplearningbook》(http://www.deeplearningbook.org/):深度學習經典教材。
工具書
《SciPy and NumPy (豆瓣) 》 (http://book.douban.com/subject/10561724/)
《Python for Data Analysis (豆瓣) 》做者是Pandas這個包的做者(http://book.douban.com/subject/10760444/)
其餘網絡資料
機器學習(Machine Learning)與深度學習(Deep Learning)資料彙總(http://blog.csdn.net/zhongwen7710/article/details/45331915): 做者太給力,量大幹貨多,有興趣的同窗能夠看看,博主至今只看了一小部分。