寫給產品經理的機器學習演算法

寫給產品經理的機器學習演算法入門,在文章中會忽略一些細節以及演算法本身具體的實現方式。我想盡量用直白的語言、較少的數學知識給各位產品經理講清楚各個演算法的原理是什麼。

機器學習的過程

機器學習的過程從本質上來說就是通過一堆的訓練數據找到一個與理想函數(f)相接近的函數。在理想情況下,對於任何適合使用機器學習的問題在理論上是存在一個最優的函數讓每個參數都有一個最合適的權重值,但在現實應用中不一定能這麼準確得找到這個函數,所以我們要去找與這個理想函數相接近的函數,能夠滿足我們的使用那麼我們就認為是一個好的函數。

這個訓練數據的過程通常也被解釋為在一堆的假設函數(Hypothesis set)中,它是包含了各種各樣的假設,其中包括好的和壞的假設,我們需要做的就是從這一堆假設函數中挑選出它認為最好的假設函數(g),這個假設函數是與理想函數(f)最接近的。

機器學習這個過程就好比在數學上,我們知道了有一個方程和一些點的坐標,用這些點來求這個方程的未知項從而得到完整的方程是什麼。但在機器學習上我們往往很難解出來這個完整的方程是什麼,所以我們只能通過各種手段求最接近理想情況下的未知項取值,使得這個結果最接近原本的方程。

什麼問題適合用機器學習解決

機器學習不是萬能的,並不能解決所有的問題。通過以上機器學習的過程可以看出來,實質上機器學習是通過已知經驗找到規律進行預測。

銀行想知道應該發放多少貸款給某個客戶時,可以根據過往成功放貸的數據找出每個貸款區間的人群特點、自身的房車資產狀況等,再看看這個客戶的特點符合哪個區間去確定應該發放多少貸款,這就是適合用機器學習去解決的問題。

對於適合用機器學習解決的問題,台大的林軒田教授為我們總結了三個要素:有規律可以學習、編程很難做到、有能夠學習到規律的數據;滿足這三個條件的問題,我們都可以挑選合適的演算法去解決。

基於以上的條件,通常我們可以用機器學習解決三類問題:

預測(回歸):根據已知數據和模型,預測不同客戶應該發放的貸款額度是多少;

判別(分類):與預測有點類似,也是根據模型判別這個客戶屬於過往哪一類客戶的概率有多大;

尋找關鍵因素:客戶的屬性非常多,通過模型我們可以找出對放貸影響最大的因素是什麼;

感知機 Perceptron Learning Algorithm,PLA

感知機學習演算法是一種二分類的線性分類演算法,一般用來解決二分類(只存在兩個結果)的問題。例如我們判斷一個同學的考試成績合格還是不合格,銀行會不會給某個客戶發放貸款等,像這種只存正、負兩個結果的問題就稱為二分類的問題。

感知機學習演算法的原理非常好理解,有點類似考試的概念,把很多個影響因素看成每道題的得分,因為不同題目的權重不同,所以我們每道題的得分由權重(重要程度)和這個因素的得分相乘,最後把所有題目的得分加起來看看有沒有超過60分(閾值),如果超過了就是及格了(正結果),即對應的輸出值為1,如果沒有超過就是不及格(負結果),對應的輸出值為-1。

還是以剛才銀行貸款的例子來解釋,通常銀行判斷給不給某個客戶放貸款都是掌握了客戶的各種信息如年薪、負債情況、社保繳費、公積金等等,因為數據的維度不同,描述的單位也不同,我們需要把這些數據按照各自維度的標準統一成可以量化的評分,可以按照年薪在5W以下得1分、5-10W得2分這樣的方式進行量化。每個維度的重要程度都不同,所以我們在相加的時候需要考慮為每個值加上一個權重,最後得出來的結果看看有沒有高過放款的閾值評分,如果高過這個分數就放款,低過這個分數就不放款。

首先看看關於感知機的數學定義:

我們可以轉換到幾何的方式去看這個問題,在二維空間內,訓練的數據就變成了平面上的一個點,這些數據裡面有正樣本以及負樣本(成功放貸款的以及沒有放貸款的),感知機演算法的學習過程就是找到一個平面(在二維中表現為一條線),能夠把所有的正樣本和負樣本區分開來,那麼在應用的時候面對新來的客戶,通過模型算出是正結果,我們就可以給這個客戶發放貸款,算出來是負結果,我們就不發放貸款。

怎麼去找到這條線(超平面)呢?

感知機使用的學習策略是梯度下降法,這種方法的思想是先在平面內隨便找一條線,然後開始把樣本點放到平面內,當一個點被誤分類,即位於分類超平面錯誤的一側時,調整模型的參數(w和b),使分類超平面向該誤分類點的一側移動,以減少該誤分類點與超平面的距離,直到超平面越過該誤分類點使其被正確分類為止。

感知機利用梯度下降法的訓練過程

這種方式對於模型的訓練非常快速,計算量相對較小,但同時這樣的計算方式追求最大程度正確劃分,最小化訓練數據的錯誤,效果類似下圖的直線,會導致比較容易造成過擬合的情況,即模型對於新數據的包容性差,過度得把新輸入數據分成錯誤的類別。

線性回歸 Linear regression,LR

講邏輯回歸之前,我們先講講什麼是線性回歸。在統計學中,線性回歸是利用稱為線性回歸方程的最小平方函數對一個或多個自變數和因變數之間關係進行建模的一種回歸分析。舉個直觀的例子,深圳春運時的客流量可能是與過年的時間相關的,越接近過年這天人流量越大,如下圖所示:

如果客運站想預測一下明天後天的客流量該這麼辦呢?

我們可以用一條線去盡量準的擬合這些數據,如果有新的數據輸入進來,我們就可以找到對應的預測點:

上述例子就是一個最簡單的一元線性回歸分析:y=ax+b,只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示。收集的數據中,每一個分量,就可以看做一個特徵數據。例如上述例子的日期是一個特徵,我們還可以找到地區、節假日、其他車站的客流量等等不同的因素,每個特徵至少對應一個未知的參數。這樣就形成了一個線性模型函數,當特徵變多時,上述線性回歸的向量表示形式為: h_{0}(x)=	heta^{T}X

這個矩陣方程由於計算量太大很難直接去求解,那麼我們要怎麼樣去找到這根線的位置呢?

在這裡我們可以退一步,把參數求解的問題,轉化為求最小誤差的問題,讓實際值與預測值之間的誤差變得最小,那麼我們的預測值就十分接近實際值了。這就是損失函數的來源,在機器學習的演算法中實際上存在大量由於計算量巨大從而無法求解的問題,我們都是把這類問題轉化成求最小誤差,即實際值與預測值之間的誤差(損失)問題,想辦法求出讓誤差最小的情況就可以得到問題的最優解。線性回歸方程的損失函數通常是通過最小二乘法或梯度下降法求解,在這裡我們不展開敘述。

線性回歸是目前運用最廣泛的模型之一,在金融、經濟學、醫學等領域常常用來解決預測類問題,通過觀測數據集擬合出一個預測模型,告訴我們一組特定數據是否在一段時間內會增長或下降。

邏輯回歸 Logistic regression,LR

邏輯回歸實際上也是一個線性回歸模型,但是線性回歸常常用來做預測,邏輯回歸卻常常用來解決二分類問題。為什麼會有這麼大的差異呢?

如果對於上面的感知機演算法來說,目標是為了找到一個能夠將正負樣本完全分開的超平面,從另外一個層面看感知機演算法相當於是一個躍階函數,我們只需要找到閾值並且拿輸入的數據對比是大於還是小於這個閾值,然後就能給出的就是0或1(正/負樣本)的反饋。

對應到數學模型上我們只需要把算出來的結果映射到這個躍階函數上看看大於0還是小於0就能說他是一個正樣本還是負樣本。

感知器的模型雖然簡單直觀,但問題在於這個模型不夠光滑,如果對於一個新的樣本點我們計算出來結果等於0.01,只比0大了一點點就會被分類為正樣本,這樣在實際應用的時候可能會不夠準確,同時這個函數在0處有一個躍階導致這一點不連續,在數學上也不好處理。

那麼有沒有什麼方法可以讓這個函數更光滑一點呢?

在數學上剛好存在一個sigmoid函數有這樣的特性。這個函數的輸入範圍是?∞→+∞,而值域則光滑地分布在0到1之間。對於這個模型的解釋和感知機也稍微有些區別,感知機是根據輸入的條件,判斷是一個正樣本還是負樣本,而邏輯回歸因為值域分布在0到1之間的特性,所以輸出的是判斷是一個正樣本或負樣本的概率是多少。我們的學習策略即是求所有訓練樣本的條件概率之積的最大值,也可以理解為求概率之積儘可能大,這樣模型預測的效果就會越準確。

邏輯回歸的本質上是一個線性回歸模型,只是在特徵到結果的映射中加入了一層函數映射,即先把特徵線性求和,然後使用函數g(z)將最為假設函數來預測。我們看到的參數z實際上也是一個線性回歸的方程,只不過在這裡符號化表示。實際上求解的方式與線性回歸是相同的,都是要通過損失函數的方式逼近最優解。

邏輯回歸的目的是將樣本分成0或1兩類,但是我們也關心樣本分類的準確性,例如一個腫瘤被預測出來是惡性的,我們也會關心它是惡性的可能性有多大。對邏輯回歸的理解也可以是:我們通過概率將樣本分成了0和1兩類。

因為邏輯回歸不像感知機是通過一個固定的閥值去判斷樣本數據的正負性,所以在二維平面上也不再是通過一條直線去判斷數據,而是變得更加有包容性,可以把一些不能線性區分的數據集區分開來,其根本原因就是sigmoid函數把因變數自變數變成了曲線的關係,使得在函數在二維平面上的表現更為柔和,這裡面損失函數發揮了很大的作用,這裡不再展開說明

邏輯回歸與感知機相比,有三方面的優勢:

1.直接對分類可能性建模,不需要事先假設數據的分布情況。感知機演算法中如果不先假設一下數據的分布再去確定線的位置很可能會算錯,但是邏輯回歸演算法就避免了這個問題;

2.不僅可以預測出類別,還可以給出具體的概率預測值。對預測結果有更好的解釋性;

3.有很好的數學性質,方便計算,工程量較小;

邏輯回歸演算法因其優點是現在最廣泛使用的演算法之一,常常用來做尋找某一疾病的危險因素、個人信用評估、貸款/金融意圖預測等等領域,同時也可以用來對數據做自動判別分析,比如一條評論是正面還是負面,一個用戶的購買路徑是男性還是女性,預測用戶會不會購買某種商品等等,邏輯回歸應用廣泛還是因為許多現實問題跟它的模型吻合,能夠幫助我們快速解決很多實際的問題。

K近鄰分類演算法 K-Nearest Neighbor,KNN

上面我們說到感知機以及邏輯回歸實際上都是一種二分類演算法,非黑即白,如果遇到多分類問題該如何解決呢?有一種非常簡單的演算法可以幫助我們快速解決這個問題——K近鄰分類演算法。

K近鄰分類演算法是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。

用官方的解釋來說,所謂K近鄰演算法,即存在一個樣本數據(訓練樣本)集,並且樣本中每個數據都存在標籤(類別),也就是說樣本集中每一個數據都被分到一個類別中。輸入新的數據後,將新數據的每個特徵與樣本集中的數據對應的特徵進行比較,然後演算法提取樣本集中特徵最相似的數據的分類標籤,即可以為新輸入的數據進行分類。

在訓練數據集中找到與該實例最鄰近的K個實例, 這K個實例的大多數都屬於同一個分類,就把該輸入實例分類到這個類中。一般情況下,我們只選擇樣本集中前K個最相似的數據,這就是K近鄰演算法中k的出處,比較3個最近的數據,那麼K=3。通常K是不大於20的整數,最後,選擇K個最相似的數據中出現次數最多的分類,作為新數據的分類。

這種思想實際上也非常好理解,有點像「人以類聚,物以群分」的說法,如果你身邊的鄰居都來自同一個公司,那麼你極有可能也屬於某個公司。如果你身邊的朋友絕大多數都屬於某個學校畢業,那麼你極有可能也曾經在這個學校讀過書。這種方式也很類似投票機制,新來的數據與舊數據相比對,多數都屬於某個類別時,採用少數服從多數的原則,給新數據歸類。

同樣我們轉化到幾何的方式去看這個演算法,KNN可以看成:有那麼一堆你已經知道分類的數據,然後當一個新數據進入的時候,就開始跟已知數據里的每個點求距離,然後挑離這個訓練數據最近的K個點看看這幾個點屬於什麼類型,就把這個新的點歸到這個同屬大多數的類別里。

K近鄰分類演算法的優缺點都非常明顯。優點主要有兩個方面:

1.精度很高,對異常數據也不敏感(所屬類別是由大多數點決定了,一兩個異常點不會有太大的影響)

2.與上面的PLA、LR演算法相比,不需要訓練模型,易於實現,來一個新數據就可以馬上進行比對。

缺點則是計算複雜度比較高,因為要算新數據與每一個臨近點的距離,當維度超過二維時這就是一個空間複雜度很大的矩陣。

基於KNN演算法的特點,目前主要應用在文本分類與商品推薦等場景,在文本分類中像信息檢索、手寫字識別、機器翻譯這樣的場景都可以使用KNN演算法以保證在有限的硬體資源下,提供給用戶一個高效的檢索系統。

樸素貝葉斯分類器 Naive Bayes Classifier,NBC

貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理和特徵條件獨立假設為基礎,故統稱為貝葉斯分類。而樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。

樸素貝葉斯的簡單之處在於:對於給出的待分類項,求解在此待分類項出現的條件下各個類別出現的概率,哪個概率最大,就認為此待分類項屬於哪個類別,這就有點像我們走在街上,迎面走過來一個黑色皮膚的人,那我們就猜他是非洲人,因為黑人中非洲人最多。

通過上述例子我們可以看到,我們判斷一個人是非洲人基於一個很關鍵的信息,因為他是黑色皮膚的人。所以我們的判斷實際上是發生在「擁有黑色皮膚」這件事的情況下我們的推斷,這種在其他已知事件發生的基礎上計算某件事發生的概率叫做條件概率,一般我們使用貝葉斯定理求解條件概率。

要搞懂貝葉斯定理之前,我們首先要搞懂什麼是正向概率什麼是反向(條件)概率。在貝葉斯研究之前, 人們已經能夠計算正向概率,比如「假設袋子里有N個白球M個黑球,你伸手進去摸一把,摸出黑球的概率有多大」。然而在我們實際生活中,日常能觀察到的只是事物表面的結果,往往我們只知道從袋子里取出來的球是什麼顏色,並不能看到袋子里的實際情況。這時候我們就希望有一些方法可以通過觀察這些取出來的球的顏色,可以推測出袋子裡面黑白球的比例是什麼樣的。

我們通過下圖簡單講一下貝葉斯定理的組成:

樸素貝葉斯分類器的核心在於訓練模型階段,需要計算每個類別在訓練樣本中的出現頻率及每個特徵屬性劃分對每個類別的條件概率估計,並將結果記錄。這一階段是機械性階段,根據前面討論的公式可以由程序自動計算完成。

讓我們通過一個貝葉斯分類器解決拼寫檢查/糾正的例子加深理解,當一個用戶輸入了一個不在字典中的單詞時,我們需要去猜測這個人到底想要輸出的單詞是什麼呢?如果用戶輸出了一個theu,那麼他到底是想輸入they還是then?到底哪個猜測的可能性更大?

這個問題實際上是在求「已知輸入theu的情況下,我們猜測他想輸出they hen的概率誰更大」用上述符號表示即P(B|A),我們可以很容易計算出they hen單詞的詞頻P(B)、那麼要怎麼得到P(A|B)呢?在這裡可以用輸入單詞與正確單詞在鍵盤上的距離來表示P(A|B),即通過字母在鍵盤上的距離判斷下輸入哪個字母的可能性更高,比如在鍵盤上Y和U離得更近所以我們會認為輸入Y但是不小心按成了U的概率更大一些。通過上述的信息就可以計算出輸出哪個單詞的概率更大。

樸素貝葉斯分類器的以下優點:

1.生成式模型,通過計算概率來進行分類,可以用來處理多分類問題而且分類的結果很容易被解釋;

2.所需估計的參數不大,對缺失數據不太敏感;

3.無需複雜的迭代求解框架,適用於規模巨大的數據集。

除了上述說到的拼寫糾正以外,貝葉斯分類器還經常用在垃圾郵件分類、文字廣告過濾、識別惡性評論等等領域。在許多場景下,樸素貝葉斯分類演算法可以與後續講到的決策樹、神經網路演算法相媲美,而且方法簡單、分類準確率高、速度快。但這個演算法也有一些像對輸入數據的形式比較敏感、計算先驗概率時分類決策可能存在錯誤這樣的缺點,在使用的時候還是要根據具體的場景選擇。


感謝寫作過程中 @yonggege 的斧正與指導,下面的演算法如果想看看實現方式可以移步到寫點Python。

下一篇我們講講:

決策樹;

隨機森林;

神經網路;

聚類;

集成演算法;

推薦閱讀:

機器學習基石筆記2:感知器學習演算法(PLA)
關於專欄文章說明
超級推薦!Mathematics for Machine Learning
機器學習基石筆記10:邏輯斯蒂(Logistic)回歸 上
Paper Reading | 多角度講解自動駕駛中的激光雷達感知系統

TAG:機器學習 | 產品經理 | 互聯網產品 |