最近的十幾年機器學習非常火熱,尤爲是其中的一個分支深度學習在工業界取得很好應用,吸引了不少眼球。不過從其歷程來看,機器學習的歷史並不短暫~從早期的感知機到八十年代火熱的神經網絡,再到九十年代被提出的經典算法集成學習和支持向量機;而最近的十年算得上是機器學習發展的黃金年代,軟、硬件計算條件大幅提升,尤爲是如今數據量的爆發式增加讓機器擁有充分「學習」的資本,另外一方面如今開源項目愈來愈多,即使一些算法的實現很複雜,我等小白只須要調幾個接口也能完成對數據的處理;在這個年代裏,不一樣的人充斥着不一樣的野心,計算機科學家仍在探索人工智能的奧義,資本、媒體都在熱炒機器學習概念,大數據、AI儼然成爲寵兒,各行程序員也在茶餘飯後有了談資。盛名之下,其實難副,機器學習、人工智能的發展還處在淺層,特別是深度學習這些被媒體過分炒做的產物,從計算智能到感知智能再到認知智能,前面的路依然很遠。長路漫漫,無論怎樣,愈來愈多的人投入這個行業確實對行業自己有很大的發展,特別是能夠看出,國內外不少高校的專家學者已經把研究陣地轉向工業,不只僅是由於報酬豐厚,更由於工業界提供了現實場景更豐富的數據,而這些數據讓算法擁有很好的施展空間。 程序員
還記得16年在亞馬遜買了一本南大周志華老師的<<機器學習>>,到手以後真的超出了預期,書上面的算法介紹的比較系統,每一章節提到了某個領域的經典算法,後面給出的附錄也適合非科班同窗看懂~更可貴是這是一本中文的能夠當成教材的書~並且從寫的內容來看,真的很謙虛、嚴謹,總之比較推薦入門的同窗看,由於以前一直被廣爲人知的仍是NG的斯坦福大學Machine Learning公開課講義,如今終於有本好的中文圖書了。 彷佛有些偏題了:)初衷只是想寫一個機器學習系列筆記的開篇,算是對本身的一個督促吧,如今不少時候感受腦子不動真的是要上鏽了~好了很少說了,下面進入正題吧~算法
1.概念 數組
機器學習究竟是什麼?Wiki上有Tom M. Mitchell這樣一段定義: 網絡
"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E."機器學習
我常常這樣總結: 「設計模型,並從已觀測的數據中學習出模型參數,而後經過模型對未知進行分預測 。」這樣說彷佛仍是有點抽象,臺大李宏毅老師ppt解釋的很是形象:函數
這個圖解釋的含義是什麼呢?能夠這樣看:性能
機器學習的本質是進行預測,好比咱們想要判斷一幅輸入的圖像是猴子,貓仍是狗。怎樣預測呢?學習
(1)首先,咱們須要找到一個模型來表達預測的過程,這個模型可能包含一個或者多個須要設定的參數,所以模型是一個多個函數組成的集合;測試
(2)在模型肯定了以後,咱們須要從數學上尋找一個函數來表示這個模型,即從函數集合中尋找一個可以「準確」地表達模型,這一步咱們須要在已知的數據上進行學習,即讓函數可以在已知數據上得到很不錯的預測效果;大數據
(3)使用(2)中肯定的函數對未知的數據進行預測。
一個典型的機器學習系統包含輸入和輸出空間,分別對應輸入和輸出全部可能取值的集合。輸入值,簡稱樣本,描述了樣本不一樣特徵或者屬性的取值,它能夠是一個向量,矩陣,張量或者其餘更爲複雜的數學形式;好比:
\( x=\left ( x^{1},x^{2},...x^{n}\right )\)
輸出值通常是離散或者連續的值,若是是離散的,對應於分類問題,此時描述了樣本的類別標籤,若是是連續的則對應於迴歸問題,描述了具體的輸出值,輸出值一般能夠用\(y\)表示。機器學習系統的目標在於利用已知數據信息,設計「合理的」函數映射,在給定新的未知數據時,使得輸出值比較符合咱們的預期:
\(F=\left \{ f|Y=f_{\theta }(X),\theta \in R^{n} \right \}\)
大寫的\(X\)和\(Y\)分別對應於某個輸入或者輸出的集合。好的特徵輸入對於機器學習模型的設計尤其重要,好比不少電商須要預測用戶可能購買或者感興趣的產品,怎樣基於用戶過去的購買、瀏覽、收藏等行爲構建行爲特徵,把具體的用戶行爲數學化;若是咱們須要對房價進行預測,咱們可能會擁有已有房產的大小、地理位置、戶型甚至當前房市整體行情等特徵,咱們須要選擇哪些特徵並處理成模型的輸入形式,這對預測的最終結構很是重要,像這種特徵選擇或者處理在數據挖掘中作的很是多,咱們有時叫作業務模型構建,這其實並非機器學習過分關注的問題,機器學習更加關注與模型和算法自己。
我把機器學習作的事情歸納成任務、策略和方法,其中任務描述了機器學習的最終目的,而策略描述了機器學習在處理問題時使用的方案,方法則是機器學習在處理實際問題中使用的具體方法。
2.任務
機器學習的本質在於使用已知數據的」經驗「來預測未知數據,從模型的輸出來看,咱們處理實際問題的最終目的主要能夠分紅兩種,一是分類(classification),即預測某個輸入樣本對應的類別,或者叫標籤;二是迴歸(regression),即預測輸入樣本對應的具體的輸出值。
(1)通俗一點的來說,分類也就是咱們一般所說的「識別」,好比上圖中判斷圖像中是否包含一隻貓。分類包含二元分類和多元分類,即模型可能輸出的標籤是2個或者大於2個,好比判斷圖像中是否存在貓,判斷一封郵件是否是垃圾郵件,這裏輸出有或者無,是典型的二元分類,判斷圖像中是貓仍是狗、猴子或者其餘動物則是多元分類,能夠看出分類模型中輸出的值是離散的值。
(2)迴歸是指模型的輸出多是多個連續的值,好比要預測明每天氣的最高溫度,這裏的溫度就是一個存在於某個範圍區間的值;房價預測、無人駕駛方向盤輸出角度預測均可以當作是迴歸任務。
3.策略
在不一樣的場景下咱們會遇到不一樣類型的數據,而數據的不一樣也會致使咱們設計機器學習模型的策略不一樣,一般狀況下能夠分紅如下幾種:
(1)有監督學習(supervised learning),即給定的樣本是有標記的;
(2)無監督學習(supervised learning),即給定的樣本是無標記的;
(3)半監督學習(semi-supervised learning),一部分樣本是有標記的,另外一部分是無標記的。
大多數現實機器學習模型都是有監督學習,由於已知輸出的數據訓練效果對最後預測的結果影響太大了。有監督學習強調人類教「機器」進行「學習」,好比小孩子可能沒有見過猴子(現實的或者圖片),可是父母會告訴他:「這是一隻猴子」,所以孩子的大腦皮層會對此作出記憶和處理,認爲這種類型的東東是一隻猴子;而且在看到其餘動物的時候,大腦會將其圖像和猴子的特徵進行類似度比較,來判斷是一隻猴子仍是其餘動物,這一行爲是典型的有監督學習;無監督學習強調讓機器本身去學習,好比聚類算法,機器能夠本身進行歸類,而不須要任何標記的數據。考慮到現實場景獲取有標記的數據代價較高,你須要人工的方式去打標記,而網絡社會中包含大量沒有標記的數據,這些數據很好獲取,更爲重要的是這些數據對於對於預測自己是有很大幫助的,好比近些年比較熱門的一個方向遷移學習,若是咱們要作人臉識別,因爲人臉頭像存在角度、光照等複雜外界因素的干擾,那麼是否能夠藉助這些大量的不一樣場景的無標記數據實現模型自己的遷移,從而使其更能適應干擾,提升識別的精度呢?這就是遷移學習的一個重要做用。
4.方法
方法就是具體的模型設計用到的方法,好比線性方法或非線性方法,線性方法好比早期的感知機,線性迴歸,線性的子空間投影方法(如經典的降維算法,主成分分析)等等,非線性方法好比如今火熱的深度神經網絡,支持向量機等等,這些在後面的文章中會提到。
5.經驗風險最小化、結構風險最小化和過擬合、欠擬合
有了模型和樣本以後咱們須要利用這些樣本,即經過這些已經觀測獲得的數據對模型參數進行訓練,這個過程也就是「學習」或者「訓練」,而後經過學習的模型對未知數據進行預測的過程能夠稱之爲「預測」,預測的目的在於檢驗學習獲得模型的好壞。然而一個機器學習系統的好壞不只和模型設計有關,並且和數據的特色有很大關係,「No free lunch」告訴咱們,模型的設計必然會帶來某些方面的代價或者損失,所以必須綜合數據的特色、算法模型、開銷等等各個方面來設計,好比在某些狀況下樣本規模大小和數據的分佈徹底不知道,假若在設計模型的時候過於追求精度,導致模型對訓練樣本的預測效果很好,可是在預測新的未知數據時效果不好,也就是咱們常說的「過擬合」問題。
舉一個很直觀的例子,小明學習的基礎並非很好,在學習了一個新的知識點以後作了不少習題,這些習題套路固定,題型相似,而後須要進行測試,若是測驗用的題目和題型與練習的題目變化不大,那麼小明在考試中頗有可能取得很好的成績,然而這種測試得到的成績「掩蓋」了背後的假象,一旦出題老師換一個全新的套路,小明的成績頗有可能就炸了。能夠看出,「過擬合」意味着模型適應不一樣場景數據的能力,咱們有時候叫作「泛化能力」。過擬合問題是機器學習長期須要面對的挑戰之一,而現實中有不少狀況掩蓋了過擬合帶來的問題,其中之一即是數據量,好比小明若是平時作的習題足夠足夠多,那麼仍是頗有可能應付測驗的。
再者,咱們也不能讓一個模型爲了過於適應複雜場景,追求算法的適應能力,可是過多的損失了精度,這就是「欠擬合」。下面的樣本分佈圖(樣本分佈圖一般以二維座標的形式展現樣本的分佈狀況)給出了一個示例來展現欠擬合和過擬合。用小圈圈表示二維平面中的樣本,其中紅色圈圈表示訓練樣本,綠色圈圈表示真實樣本,而後我分別用不一樣的多項式曲線去擬合這些樣本,能夠看出第一幅圖中的簡單直線並無準確的對訓練樣本和真實樣本進行擬合,可是從必定程度表示出了樣本的「大概趨勢」,這是「欠擬合」;第二幅圖中的曲線擬合地效果比較好,儘管在個別樣本稍有誤差,但就預測真實樣本而言是三張圖中最好的,這正是理想狀況下須要尋找的模型;相比較而言,第三幅圖中的曲線雖然能「完美」地反映出訓練樣本點的位置,不過存在很大的缺陷,也就是曲線過於複雜,在真實的環境下會遭遇嚴重的過擬合問題,好比橫座標9到10的這些點與預期值差異巨大。
在不少狀況下,大量的數據是不可多得的,有時候咱們嘗試從模型而不是數據方面着手解決此問題,所以怎樣合理地控制模型,使之避免過擬合呢?
首先在監督學習中,咱們須要定義必定的標準來保證學習的精度的好壞,顯而易見的是,咱們可使用一種叫作「損失函數」的東東來衡量結果,損失函數能夠解釋爲「衡量預測值和實際值之間的一致性」。損失函數可使用\(L\left ( Y,f(X)) \right )\)來表示,很容易想到的一種關於\(L\)的表示是使用衡量預測值和實際值之間的誤差,爲了保證誤差老是大於0的,能夠用\(L\left ( Y,f(X)) \right )=\left ( Y-f(x) \right )^{^{2}}\)來表示,還有的模型可能會使用誤差的絕對值之和、0-1值或者其餘的方式定義損失函數。實際上如誤差平方和形式的損失函數是基於最小二乘擬合的一種應用,基於極大似然估計能夠獲得,在後面博客中寫到線性迴歸的時候提到~若是給定訓練集合,也就是包含多個樣本的數據集,模型關於樣本的平均損失能夠稱之爲經驗損失或者經驗風險,顧名思義,也就是根據已給出的數據經驗式地衡量模型的好壞。好比,對於訓練集
\(\left \{ (x_{1},y_{1}),(x_{2},y_{2},...,(x_{m},y_{m}))\right \}\)
對應的經驗損失能夠定義爲:
\(R_{emp}(f)=\frac{1}{n}\sum _{i=1}^{n}L(y_i,f(x_i))\)
直觀地來講,若是須要機器學習的預測效果好,要求經驗損失最小,也就是咱們常說的經驗風險最小化(Empirical Risk Minimization, ERM),基於此策略,能夠考慮以下的經驗風險最小化最優化模型:
\(\mathrm{min} \frac{1}{n}\sum _{i=1}^{n}L(y_i,f(x_i))\)
在樣本數據量很大的狀況下ERM每每能得到很好的預測效果,可是正如前面提到的,一旦數據規模較小,會出現「過擬合」的狀況。過擬合是不少機器學習問題都會面對的一大挑戰,不少方法用來避免出現過擬合。除了增大數據量之外,其中一個常見的作法是對模型的複雜程度進行約束,也就是添加正則化項(regularizer)或懲罰項(penalty)直觀上來講模型越複雜,越難以模擬真實場景。翻看不少paper,無論是大牛的也好,灌水的也好,限制模型複雜度做爲懲罰項已是一件司空見慣的事情了~畢竟懲罰項很容易對模型進行解釋了,儘管有時候隨意添加懲罰項的效果並不怎麼好... 這種約束模型複雜程度的作法叫作「結構風險最小化」,意在ERM的基礎上限制模型複雜度:
\(R_{srm}(f)=\frac{1}{n}\sum _{i=1}^{n}L(y_i,f(x_i))+\lambda J(f)\)
上式中\(J(f)\)即模型複雜度項,係數\(\lambda\)爲ERM和模型複雜懲罰之間的平衡因子~不過不一樣模型處理過擬合會使用不一樣的方法,好比在迴歸分析中添加的\(L_{1}\),\(L_{2}\)懲罰項,獲得的lasso迴歸和嶺迴歸;在決策樹中使用剪枝來下降模型複雜度;在深度神經網絡中使用dropout;等等。
6.模型評估和驗證
在咱們訓練獲得一個模型以後,咱們須要必定的手段來對模型進行評估,大多數狀況咱們會預留出一部分數據做爲測試集,使用這一部分數據進行驗證工做。在模型評估環節當中咱們不只須要模型有精確地預測效果,還須要很強的健壯性,在算法精度和性能上都有好的表現。一般的一個作法是咱們須要對樣本集合作交叉驗證,屢次選取不一樣或者不一樣規模的訓練集合進行評估。另外,不一樣的場景咱們須要考慮的側重點可能不同,好比咱們作一個帳號產品缺陷檢測系統,咱們會更關注在真實的缺陷樣本是否被檢測出來,而不是真實的完好陷樣本有沒有被檢測出來。咱們在相似於這樣的二分類問題中使用召回率、錯誤接受率、正類準確率、準確率和F-measure等指標來衡量分類效果,用FP、FN、TN和TP定義如下行爲樣本的個數:
FP:真實樣本是負例,被錯誤地預測爲正例;
FN:真實樣本是正例,被錯誤地預測爲負例;
TN:真實樣本是負例,被正確地預測爲負例;
TP:真實樣本是正例,被正確地預測爲正例。
召回率(Recall Rate):其定義爲\(\frac{TP}{TP+FN}\)。召回率是一種重要的分類器性能衡量指標,由於在實際應用中須要重點考慮的是正類的數據,其反映了被正確斷定的正類樣本佔總的正類樣本的比重,即衡量着正類樣本檢測的全面程度。
錯誤接受率(False positive rate):其定義爲\(\frac{FP}{FP+TN}\)。 其反映了分類結果中負類數據被預測爲正類數據的比例。
正類準確率(Precision):其定義爲\(\frac{TP}{TP+FP}\),衡量檢測到正類樣本的準確率。
準確率(Accuracy):其定義爲 \(\frac{TP+TN}{TP+FN+FP+TN}\)。其衡量着全部正確分類的樣本佔總樣本的比例。
從以上定義看出,一個好的的分類器預測模型,但願能知足較高的召回率、正類檢測準確率以及準確率,較低的錯誤接受率。然而,實際狀況中,查準率和召回率之間每每難以同時都達到較高的值,須要在兩者之間尋求權衡,所以須要折中考慮兩者。一般引入F-measure值來考慮衡量準確率和召回率的調和平均數,其被定義爲:
\(F=2\ast\beta\ast recall*pre/(recall + \beta ^{2}\ast pre)\)
現現在不少模型的優劣能夠經過比較有名的benchmark來度量,每一個benchmark的度量標準可能不同,好比在圖像分類競賽中有些度量標準還包括top5,咱們用最匹配的5個樣原本衡量準確率,所以,模型評估很大程度取決於業務場景和設定的規則。
7.總結
機器學習是一門關於預測的學科,即設計模型利用已知的數據預測未知的數據。數據分佈和模型自己都對預測的結果有必定的影響,沒有完美的模型,咱們構建的是適用於不一樣場景的模型;在預測過程當中咱們會遇到過擬合、欠擬合等挑戰,而在benchmark上對模型評估和驗證爲咱們提供了調節模型的指標。
暫時寫到這,後面的文章準備從線性模型開始,寫一些機器學習中經典或者重要的算法。