淺析機器學習:線性回歸 & 邏輯回歸
在當今高手雲集的傳統機器學習界,雖然集成學習模型(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是對應的:
β是係數向量,ε是幹擾項(disturbance term),或稱錯誤項(error term):
最後我們得到的第i個y(觀測值)是這樣的:
所以,線性回歸的公式是這樣子的:
前面說過,線性回歸的過程就是要找到最優的模型來描述數據。這裡就產生了兩個問題:
- 如何定義「最優」?
- 如何尋找「最優」?
想要評價一個模型的優良,就需要一個度量標準。對於回歸問題,最常用的度量標準就是均方差(MSE,Mean Squared Error),均方差是指預測值和實際值之間的平均方差。平均方差越小,說明測試值和實際值之間的差距越小,即模型性能更優。
在線性回歸的式子中y和X是給定的,而β和ε是不確定的,也就是說,找到最優的β和ε,就找到了最優的模型。
綜合以上結論,可以用如下式子描述:
其中, 和 是要求的最優參數,右部是最小化均方差。
明確了我們的目標,接下來就是該如何去尋找這兩個量呢?最常用的是參數估計方法是最小二乘法(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.從線性回歸推廣到廣義線性回歸
上面我們得到了線性回歸模型的數學原型,在數學上一個特例經常都是歸屬於一個更普遍或更一般的原型。讓我們思考下面這兩個回歸模型:
左邊是我們之前得到的線性回歸模型,右邊是對數線性回歸模型(log-Linear Regression)。從等式的形式來看,對數線性回歸與線性回歸區別僅僅在於等式左部,形式依舊是線性回歸,但實質上是完成了輸入空間X到輸出空間y的非線性映射。這裡的對數函數ln(·),將線性回歸模型和真實觀測聯繫起來。通俗地說,原本線性回歸模型無法描述的非線性y,套上了一個非線性函數ln(·),就可以描述對數形式的y了。
將以上兩個式子綜合,寫成更一般的形式就是廣義線性回歸模型(GLM,Generalized Linear Model)了。這裡的g(·),即ln(·),是一個單調可微函數,稱為聯繫函數(Link Function)。顯然,前面的線性回歸和對數回歸都是廣義線性回歸的特例,根據聯繫函數的不同,以不同的方式映射,可以是對數,可以是指數,也可以是其他更複雜的函數。
3.邏輯回歸
經過上面的鋪墊,終於可以愉快地談談邏輯回歸了? ω ?
當我們想將線性回歸應用到分類問題中該怎麼辦呢?比如二分類問題,將X對應的y分為類別0和類別1。我們知道,線性回歸本身的輸出是連續的,也就是說要將連續的值分為離散的0和1。答案很容易想到,找到一個聯繫函數,將X映射到y∈{0,1}。
可能大家立馬會想到單位階躍函數(unit-step Function),函數圖像如下: