在當今高手雲集的傳統機器學習界,雖然集成學習模型(Boosting,Bagging,Stacking)以左手降龍十八掌,右手乾坤大挪移打遍天下無敵手╰(‵□′)╯。但是作為其中最為經典的演算法之一,線性回歸(Linear Regression),是所有機器學習初學者的起點。邏輯回歸(Logistic Regression)是線性回歸的一個推廣,邏輯回歸也可以說是最為經典的分類演算法之一。相對其他的機器學習演算法來說,邏輯回歸比較容易理解(深究還是挺不簡單的),適合初學者上手。

預告:本文從線性回歸推廣到廣義線性回歸,再引入邏輯回歸,中間會夾雜一些簡單公式,不影響閱讀噢 o(* ̄▽ ̄*)ブ

0.引入

在進入正題之前,先講一個可能很多人(包括非初學者)沒有注意到的問題:邏輯回歸為什麼叫「邏輯」?既然是分類演算法,為什麼又叫「回歸」?

其實邏輯回歸和邏輯二字沒有實際上的關係,純粹是由「Logistic」音譯而來,那麼Logistic又該怎麼解釋呢?且Regression的確是回歸的意思,那又該如何解釋呢?

這兩個問題的答案最後再揭開(不是我不想說_(:з)∠)_,是因為涉及到底層原理....)

1.線性回歸

在介紹邏輯回歸之前,先用線性回歸來熱熱身。線性回歸幾乎是最簡單的模型了,它假設因變數和自變數之間是線性關係的,一條直線簡單明瞭。

在有監督(有標籤的)學習中,我們會有一份數據集,由一列觀測(y,即因變數)和多列特徵(X,即自變數)組成 。線性回歸的目的就是找到和樣本擬合程度最佳的線性模型(or式子,方程 whatever),在尋找過程中需要確定係數β和幹擾項ε(幹擾項的作用是捕獲除了X之外所有影響y的其他因素)。

直接上公式吧,有「看公式會發困病」的同學可以直接跳過到 加粗斜體黑字 噢 (●ˇ?ˇ●)~:

y是一列有n個觀測值的觀測變數,或者直接說因變數以便於理解,

X是由多列特徵組成的特徵空間,假設有p列特徵,簡單理解就是有p個自變數,每個特徵都有n個值,這與y是對應的:

y=left( egin{array}{ccc} y_1 \ y_2 \ vdots \ y_n\ end{array} 
ight) quad,quad X= left( egin{array}{ccc} X_1^T \ X_2^T \ vdots\ X_n^T \ end{array} 
ight) = left( egin{array}{ccc} 1 & x_{11} & cdots & x_{1p}\ 1 & x_{21} & cdots & x_{2p}\ vdots & vdots & ddots & vdots\ 1 & x_{n1} & cdots & x_{np}\ end{array} 
ight)

β是係數向量,ε是幹擾項(disturbance term),或稱錯誤項(error term):

β=left( egin{array}{ccc} β_0 \ β_1\β_2 \ vdots \ β_p\ end{array} 
ight)quad,quad ε=left( egin{array}{ccc} ε_1 \ ε_2 \ vdots \ ε_n\ end{array} 
ight)

最後我們得到的第i個y(觀測值)是這樣的:

y_i=β_01+β_1x_{i1}+cdots+β_px_{ip}+ε_i (i=1,cdots,n,β_0為截距)

所以,線性回歸的公式是這樣子的:

y=Xβ+ε

前面說過,線性回歸的過程就是要找到最優的模型來描述數據。這裡就產生了兩個問題:

  • 如何定義「最優」?
  • 如何尋找「最優」?

想要評價一個模型的優良,就需要一個度量標準。對於回歸問題,最常用的度量標準就是均方差(MSE,Mean Squared Error),均方差是指預測值和實際值之間的平均方差。平均方差越小,說明測試值和實際值之間的差距越小,即模型性能更優。

在線性回歸的式子中y和X是給定的,而β和ε是不確定的,也就是說,找到最優的β和ε,就找到了最優的模型

綜合以上結論,可以用如下式子描述:

(β^*,ε^*)=argmin sum_{i=1}^m(f(x_i)-y_i)^2

其中, β^*ε^* 是要求的最優參數,右部是最小化均方差。

明確了我們的目標,接下來就是該如何去尋找這兩個量呢?最常用的是參數估計方法是最小二乘法(Least Square Method), 最小二乘法試圖找到一條直線,使得樣本點和直線的歐氏距離之和最小。這個尋找的過程簡單描述就是:根據凸函數的性質,求其關於β和ε的二階導的零點。

( ?? ω ?? )?終於講完了理論知識,下面展示一個使用python3編寫的簡單例子。

from numpy.random import randint # 導入numpy庫中的隨機數生成函數
import matplotlib.pyplot as plt # 導入繪圖庫

X = np.array([x for x in range(1, 101)]).reshape(-1, 1) # X = 1,2,...,n
y = np.array(list(map(lambda x: 2 * x + randint(-30, 30), X))) # y=2X+r, r=random(-30,+30)
y_true = np.array(list(map(lambda x: 2 * x, X))) # y=2x
plt.plot(X, y_true, c=b) # 繪製線圖
plt.scatter(X, y, alpha=0.7, s=60) # 繪製散點圖
plt.title(Random Scatter)
plt.show()

即使去掉標準的y=2x直線圖像,也可以很明顯地看出y和X具有線性關係(這裡的X為了簡單起見只包含一個自變數,即X特徵空間只有一維/列),但是由於我們加入了雜訊(隨機數),所以僅僅靠觀察的話找不到一條確切的直線能夠描述y和X的線性關係。

# 續上面的代碼
from sklearn.linear_model import LinearRegression # 導入sklearn庫中的線性回歸模塊
lr = LinearRegression() # 定義一個線性回歸模型
lr.fit(X, y) # 將模型擬合到數據上
y_pred = lr.predict(X) # 使用模型預測數據(方便起見就不劃分訓練集和測試集了)
plt.scatter(X, y, alpha=0.5, s=50)
plt.plot(X, y_pred, c=r)
plt.plot(X, y_true, c=b)
plt.title(Linear Regression)
plt.show()

圖中的藍線是y=2x,紅線是回歸之後得到的擬合直線,由於雜訊比較多,所以擬合程度沒有非常理想,但也足以描述觀測量y和回歸量X之間的線性關係了。

2.從線性回歸推廣到廣義線性回歸

上面我們得到了線性回歸模型的數學原型,在數學上一個特例經常都是歸屬於一個更普遍或更一般的原型。讓我們思考下面這兩個回歸模型:

y=βX+ε quad,quad lny=βX+ε

左邊是我們之前得到的線性回歸模型,右邊是對數線性回歸模型(log-Linear Regression)。從等式的形式來看,對數線性回歸與線性回歸區別僅僅在於等式左部,形式依舊是線性回歸,但實質上是完成了輸入空間X到輸出空間y的非線性映射。這裡的對數函數ln(·),將線性回歸模型和真實觀測聯繫起來。通俗地說,原本線性回歸模型無法描述的非線性y,套上了一個非線性函數ln(·),就可以描述對數形式的y了。

y=g^{-1}(βX+ε)

將以上兩個式子綜合,寫成更一般的形式就是廣義線性回歸模型(GLM,Generalized Linear Model)了。這裡的g(·),即ln(·),是一個單調可微函數,稱為聯繫函數(Link Function)。顯然,前面的線性回歸和對數回歸都是廣義線性回歸的特例,根據聯繫函數的不同,以不同的方式映射,可以是對數,可以是指數,也可以是其他更複雜的函數。

3.邏輯回歸

經過上面的鋪墊,終於可以愉快地談談邏輯回歸了? ω ?

當我們想將線性回歸應用到分類問題中該怎麼辦呢?比如二分類問題,將X對應的y分為類別0和類別1。我們知道,線性回歸本身的輸出是連續的,也就是說要將連續的值分為離散的0和1。答案很容易想到,找到一個聯繫函數,將X映射到y∈{0,1}。

可能大家立馬會想到單位階躍函數(unit-step Function),函數圖像如下:

函數原型如下:

y= egin{cases} 0,& z<0\ 0.5,&z=0\ 1,&z>0 end{cases}

單位階躍函數的確直接明瞭,小於0為類別0,大於0為類別1,等於0則皆可。但是有一個原則性的問題,我們需要的聯繫函數,必須是一個單調可微的函數,也就是說必須是連續的。(關於連續和可微的概念,忘了的同學趕緊回去補高數吧╮(╯_╰)╭)。

這裡寫給出一個結論,邏輯回歸使用的聯繫函數是Sigmoid函數(S形函數)中的最佳代表,即對數幾率函數(Logistic Function),函數圖像如下:

函數原型如下:

y=frac 1 {(1+e^{-z})}

為什麼叫對數幾率呢,因為它本來是長這樣子的:

ln frac y{1-y}=z

式子中的frac y{1-y} 就是所謂的幾率(odds)

這裡插入一個小知識,不想看的同學可以直接跳過噢:

Odds(幾率)和Probability(概率)之間是有區別的

Probability是指,期望的結果/所有可能出現的結果Odds是指,期望的結果/不期望出現的結果For example: 6個白球,4個黑球Prob(白球)=6/10=0.6,而Odds(白球)=6/(10-6)=1.5

將對數幾率函數代入到之前得到的廣義線性回歸模型中,就可以得到邏輯回歸的數學原型了:

y=frac 1{1+e^{-(βX+ε)}}

( ?? ω ?? )?所以邏輯回歸也是廣義線性回歸中的一種以對數幾率函數為聯繫函數的特例。至於為什麼要使用Sigmoid函數中的對數幾率函數,這涉及到伯努利分佈的指數族形式,最大熵理論等,這裡就不展開討論啦,數學和英語比較ok的同學可以看下這兩篇詳細的數學推導:

邏輯回歸與最大熵模型?

www.win-vector.com

指數族分佈與廣義線性回歸?

blog.csdn.net

得到了邏輯回歸的數學原型,接下來就是找到最優參數。

與線性回歸不同的是,邏輯回歸由於其聯繫函數的選擇,它的參數估計方法不再使用最小二乘法,而是極大似然法(Maximum Likelihood Method)。

最小二乘法是最小化預測和實際之間的歐氏距離,極大似然法的思想也是如出一轍的,但是它是通過最大化預測屬於實際的概率來最小化預測和實際之間的「距離」。詳細推導涉及凸優化理論,梯度下降法,牛頓法等,就不展開了。

講完了理論知識,為了防止大家發困( ̄o ̄) . z Z,下面同樣講個簡單的例子。

import matplotlib.pyplot as plt # 導入matplotlib繪圖庫
import seaborn as sns # 導入seaborn繪圖庫

tips = sns.load_dataset(tips) # 載入小票數據集
tips[big_tip] = (tips[tip] / tips[total_bill]) < 0.15 # 構造y
sns.regplot(x=tips[total_bill], y=tips[big_tip], logistic=True)
plt.title(Logistic Regression)
plt.show()

上面是一段簡單的邏輯回歸可視化代碼

tips是一個seaborn內置的數據集,蒐集了小票的信息,包括七個特徵欄位。注意這裡沒有類標,即沒有y,所以在有監督學習的情況下,需要我們自己構造一個y。在我上面給出的代碼中,y代表的含義是{0:小費超過賬單的15%,1:小費沒超過賬單的15%}。為了方便可視化,這裡只將total_bill一列作為我們的X。

這就是最後繪製出來的邏輯回歸圖像,由於現實中的數據不總是理想化的,所以很少出現像之前展示的sigmoid函數圖像那麼的「S」,但也能看出規律:賬單較小的更有可能給出超過15%的小費,這也符合生活經驗。

4.線性回歸和邏輯回歸的區別和聯繫

  • 線性回歸和邏輯回歸都是廣義線性回歸模型的特例
  • 線性回歸只能用於回歸問題,邏輯回歸用於分類問題(可由二分類推廣至多分類)
  • 線性回歸無聯繫函數或不起作用,邏輯回歸的聯繫函數是對數幾率函數,屬於Sigmoid函數
  • 線性回歸使用最小二乘法作為參數估計方法,邏輯回歸使用極大似然法作為參數估計方法

5.最後

ヾ( ̄▽ ̄)最後,揭曉剛開始兩個問題的答案!

1.邏輯回歸的「Logistic」應該怎麼解釋?

2.為什麼邏輯回歸是分類演算法?

其實如果有仔細看正文的同學早就已經知道答案啦:

1.Logistic並非邏輯的意思,其語義來自Logarithm:對數。這更體現了Logistic Regression的本質。周志華老師在其書《機器學習》中,給出了一個更恰當的中文名稱:對數幾率回歸。我覺得這個翻譯比起不搭邊的「邏輯回歸」,或者畫蛇添足的「邏輯斯諦回歸」更靠譜。

2.對數幾率回歸的「回歸」並非針對可以應用的問題,而是來自其父級:廣義線性回歸模型。對數幾率回歸之所以用於離散的分類而不是連續的回歸,是因為它將本來連續的輸出,通過對數幾率函數,映射到了非線性的{0,1}空間上,所以它可以有效地解決二分類問題(甚至可推廣至多分類)。

講到這裡,這篇解析就結束啦,希望我的一些見解能幫助到你


這是這個專欄開坑以來第一篇實際意義上的機器學習演算法模型解析。看起來很簡單的線性回歸和對數幾率回歸模型,細究起來還是大有乾坤的。對於初學者來說其實不用對每一個細節,每一個推導步驟都瞭解清楚(畢竟數學不是所有人的特長_(:з)∠)_),只需要知道其基本原理和應用就足夠了,這些細節留待以後更深入研究的時候再鑽研。

還是那句話:機器學習很有趣也很有用,大家一起來學吧o((>ω< ))o!!!

推薦閱讀:

相關文章