1. 程式人生 > >機器學習中分類與迴歸的解決與區別

機器學習中分類與迴歸的解決與區別

機器學習可以解決很多問題,其中最為重要的兩個是 迴歸與分類。 這兩個問題怎麼解決, 它們之間又有什麼區別呢? 以下舉幾個簡單的例子,以給大家一個概念

1. 線性迴歸

迴歸分析常用於分析兩個變數X和Y 之間的關係。 比如 X=房子大小 和 Y=房價 之間的關係, X=(公園人流量,公園門票票價) 與 Y=(公園收入) 之間的關係等等。

那麼你的資料點在圖上可以這麼看

現在你想找到 房子大小和房價的關係, 也就是一個函式f(x) = y. 能夠很好的表示 這兩個變數之間的關係。

於是你需要大概評估一下這個 房子大小和房價大概是一個什麼關係.

線性的關係嗎? 還是非線性

的關係?

當然在這個問題裡面, 線性的關係更符合這兩者的關係。於是我們 選擇一個合適的 線性模型, 最常用的是 f(x) = ax+b. 

然後用這個線性的模型 去 匹配這些資料點。

1.1 怎麼匹配? 

有了資料點 和 你臆想出來的線性模型,怎麼進行匹配,也就是怎麼用這根線最好地描述些資料點的關係?

需要最好地描述點, 我們又需要一個關於“好”的定義。你也可以想出很多關於“好”的定義。下面有兩個,

這兩個定義都是 將模型與資料點之間的距離差 之和做為 衡量匹配好壞的標準。  誤差越小,  匹配程度越大。

但是 總的來說, 我們想要找到的模型, 最後是想要使 f(x) 最大程度地 與y相似, 所以我們想要儘量地減少 f(x)與y之間的差值。 所以在這裡 用第二個圖的“好的定義” 來評估這根線的匹配程度是很合理的。於是我們有了誤差公式!!!!!

這個公式,說的是,可以通過調整不同的a 和 b的值,就能使 誤差不斷變化,而當你找到這個公式的最小值時,你就能得到最好的a,b. 而這對(a,b)就是能最好描述你資料關係的模型引數

 

1.1.1 沿導數下降法(Gradient Descent)

怎麼找 cost(a,b)的最小? cost(a,b) 的影象其實像一個碗 一樣,有一個最低點。 找這個最低點的辦法就是,先隨便找一個點(e.g. a=3, b = 2), 然後 沿著這個碗下降的方向找,最後就能找到碗的最低點。

cost(a,b) 的形狀

怎麼找(某一點)碗下降的方向?? 答案是,找那一點導數的反方向。拿引數a 舉個例子,  a與cost 關係如下圖,

只要將任意一個a, 沿著使cost 導數的反方向 慢慢移動,那麼 最終有一天a值就會到達使 cost 最小的那一點. 於是你可以不斷地移動a,b, 向著最低點前進。

當然在進行移動的時候也需要考慮,每次移動的速度,也就是\Alpha的值,這個值也叫做(學習率). 學習率的增大可以加速引數逼近最優的情況, 但是如果在快要到達函式的底端的時候,需要減小學習率,以免出現cost 不斷增大或者不停擺動的情況(如下圖, J(a,b)就是cost(a,b) )。 所以說,當出現以上兩種情況時候,我們應該果斷選取一個較小的學習率, 以保證cost能減少到一個穩定的值(我們稱為 收斂converge). 

1.1.2 直接求解最小點方法

這時候,有的人會問,為什麼要讓a不停地往下跑呢? 而且還需要設定學習率, 多麻煩, 直接讓找 導數為0點(最小極值), 不就可以了嗎? 嗯。。。也可以...但是各有優缺,

具體方法和優劣分析可見Rachel-Zhang 的部落格: http://blog.csdn.net/abcjennifer/article/details/7700772

 

總結一下:  迴歸問題的解決方法是:

     1. 假定一個模型   2.  定義什麼叫做最好的匹配(構造誤差函式)   3. 用這個模型去匹配已有的資料點(訓練集)

 

需要進一步討論的問題:

 

  • 如果引數(a,b)更多了該怎麼辦?
  • 如果最合適的匹配模型並不是線性的怎麼辦?   --- 選用一個 非線性模型  比如  y = ax^2 + bx + c.
  • 如果誤差(cost)與a,b(模型引數)的關係不是像碗一樣的, 而是凹凸不平的該怎麼辦? ------   這時候你就得注意你得到的cost的最低點(區域性的最低)可能因初始點的不同而不同。 而這些最低點你需要進行比較,以確定是不是全域性的最低

 

2.分類(Logistic regression)

分類問題也是一類很常見的問題。 比如說,怎麼判定一個人是高富帥還是吊絲? 假如我是中央電視臺的記者,採訪了N個人, 拿到了第一手資料。資料如下

我們想要根據一個人的口袋錢數量,來預測一個人是(富帥) 還是 (吊絲).  我們能不能用迴歸的方法做呢? 顯然是可以的, 我們只要找到一個模型,然後再進行匹配就可以了。

但是因為分類問題的y值常常是一些離散的數字,(比如, 富帥為1, 吊絲為0), 所以我們已經不能用一個簡單的線性函式來擬合這些資料了。我們需要一個更逼真的模型。 

 

於是我們引入了一個更適合處理分類問題的函式--- 一個非線性函式, 階躍函式。

這個函式的形狀更像我們分類問題的資料分佈,所以,用他來擬合分類問題的資料將更適合

所以我們有了一個新的模型, 

通過調整a,b 的值,可以讓模型不斷改變以匹配資料點。 為了匹配資料點,我們又需要一個衡量匹配程度的函式,就像 迴歸問題一樣的cost 函式. 於是同理我們可以得到cost

於是我們急切地想要把它用我們之前的gradient descent 的方法求解出使cost 最小的兩個a,b值。 但是很遺憾的是, 這個cost函式關於a,b,是非凸(non-convex)的。 就像下面那張圖那樣坑坑窪窪。。。

 

 

所以你沒有辦法通過以上兩種方法(1.1.1和1.1.2)求出這個cost函式的全域性最小值

所以你需要構造一個更好的cost函式, 在可以衡量擬合程度的同時 又是一個關於a,b 的凸函式(像迴歸問題的cost一樣,和一個碗一樣,只有一個極小值). 

這怎麼構造啊....

 

幸好我們還有各種偉大的數學家,他們夜以繼日,終於趕製出了一個形狀和碗一樣(convex)的cost函式. (Maximum Likelihoods Estimation 更具體的介紹請看http://www.holehouse.org/mlclass/06_Logistic_Regression.html )

現在我們又可以用我們熟悉的 導數方向下降法(gradient descent) 移動a, b的值,使cost 降低到最小。

 

最後,分類的問題就這樣被解決了。

 

 

當然,更復雜的問題可能有:

  • 現在是分成兩類,如果資料需要分成三類或者更多該怎麼辦?  ---- 假如有A,B,C三類, 把其中A類做為1,BC做為0,然後做Logistic regression, 得到模型a, 同理將B類做為1,AC作為0,得到模型b, 再同理得到模型c.    最後測試的時候, 對任意一個數據點x, 我們能夠得到x分別屬於A,B,C三類的概率值 

最後比較大小,哪個大,這個x就屬於哪一類

             具體可看, http://blog.csdn.net/abcjennifer/article/details/7716281 (七)

 

 

 

3.總結(兩個問題的區別)

這篇文章大概的意圖是能想讓大家瞭解, 機器學習中最基本的兩類問題,線性迴歸和分類。 能讓大家有個清晰的思想,對於這兩類問題都有以下幾個步驟,

  • 如何選取一個 合理的模型(線性的,or 非線性的(e.g. 階躍函式, 高斯函式)).
  • 製造一個"美好"的 誤差函式 (可以評估擬合程度,而且還是convex函式)
  • 採取一切可能的技術(e.g. 導數下降法,解極值方程法) 求出最好的模型引數

 

談談迴歸和分類的區別:

總的來說兩個問題本質上都是一致的,就是模型的擬合(匹配)。 但是分類問題的y值(也稱為label), 更離散化一些. 而且, 同一個y值可能對應著一大批的x,  這些x是具有一定範圍的。 

所以分類問題更多的是 (一定區域的一些x) 對應 著 (一個y).   而回歸問題的模型更傾向於 (很小區域內的x,或者一般是一個x)  對應著  (一個y)。

 

分類問題與迴歸問題是監督學習問題,區別在於學習函式的預測輸出是類別還是值。但是分類基本上都是用“迴歸模型”解決的,只是假設的模型不同(損失函式不一樣),因為不能把分類標籤當迴歸問題的輸出來解決。分類和迴歸的區別在於輸出變數的型別。定量輸出稱為迴歸,或者說是連續變數預測;定性輸出稱為分類,或者說是離散變數預測。

 

 

在把一個問題建模的時候一定要考慮好需求,讓你的模型更好的與現實問題相對應。