1.簡介
首先邏輯迴歸(Logistic Regression)是一個分類算法,它可以處理二元分類以及多元分類,是機器學習中一個非常非常常見的模型,在實際生產環境中也常常被使用,是一種經典的分類模型(不是迴歸模型)
2.模型構建
2.1 線性迴歸
爲了更容易理解LR,我先說一下線性迴歸吧,線性迴歸的主要思想就是通過歷史數據擬合出一條直線,用這條直線對新的數據進行預測。
對於一元的自變量:
y=wx+b
模型參數爲w,b
對於每個樣本誤差爲:
εi=yi−yi
最小誤差平方和(線性迴歸是連續的所以可以用模型誤差平方和定義損失函數):
w,bminΣiεi2=Σi(wxi+b−yi)2
這裏取最小誤差平方和是因爲誤差有正有負,防止正負抵消影響誤差判斷
對於多元的自變量:
自變量可以看作是一個向量,則方程可記爲(i爲樣本特徵的數量,j爲樣本的數量):
f(xi,w,,b)=j∑wjxi+b=[xi1...xij]⎣⎢⎡w1⋮wj⎦⎥⎤+b=wixi+b
因爲這裏的b最終會是一個常數,需要注意的是這裏的w和x的維度是相同的,故上述公式可變形爲:
f(xi,w,,b)=[xi1...xij]⎣⎢⎡w1⋮wj⎦⎥⎤+b=[xi1...xij 1]⎣⎢⎢⎢⎡w1⋮wjb⎦⎥⎥⎥⎤=wixi
這時候整個公式就可以簡化爲
f(xi,w)=wxi
我們只要研究參數w就可以了,我們最終的學習目標爲使平方差和最小時w的值:
wminL(w)=i∑(wxi−yi)2
根據函數的特性,要得到最小平方差和,對w求導,導數爲0的地方就是函數的最小值
dwdL(w)=⎣⎢⎢⎡w1∂L(w)⋮wi∂L(w)⎦⎥⎥⎤=2i∑xixiTw−2i∑yixi=2XTXw−2XTY
令其等於0,得:
w∗=(XTX)−1XTY
然後利用最小二乘法(最小平方和)得到w
注:這裏有個問題,如果不是可逆矩陣,我們可以給他加個常數矩陣使他可逆
w∗=(XTX+λI)−1XTY
λ的值可以通過測試得到
2.2 邏輯迴歸(二元)
邏輯迴歸有個logit函數:
log(p/(1−p))=wx
下面先研究一下這個函數原理::
對於二分類問題,最終因變量y只有兩種情況,且兩種情況概率加起來等於1
eg:一個事件發生概率爲:p(y=1|x),不發生概率爲:p(y=0|x)
假定p(y=1|x)依賴於線性函數發f(x) = wx,但是wx值域在(-∞,+∞)
而兩個概率的比值卻是(0,+∞),我們對wx進行指數變換,那麼就可以得到:
p(y=0∣x)p(y=1∣x)=1−p(y=1∣x)p(y=1∣x)=ewx∈(0,+∞) (1)
則可以得到:
p(y=1∣x)=1+ewxewx=1+e−wx1 (2)
現在我們把公式(1)兩邊同時進行取log運算,結果就是logit函數
而公式(2)就是我們下面要引出的sigmoid函數,也就是LR的模型
2.3 sigmoid函數
LR算法也可以看作是把線性函數的結果映射到了sigmod函數中
sigmoid函數公式及模型圖:
η=1+e−t1
則對於二分類問題類別概率爲:
p(y=1∣x)=η(t)=η(wx)
p(y=0∣x)=1−η(t)=1−η(wx)
3.損失函數
從前文可以看到邏輯迴歸並不是連續的,所以不能用模型的誤差平方和定義損失函數,我們可以用極大似然推導邏輯迴歸的損失函數
3.1 極大似然估計
這裏我先解釋一下什麼是極大似然估計:eg.一個袋子中有20個球,只有黑白兩色,有放回的抽取十次,取出8個黑球和2個白球,計算袋子裏有白球黑球各幾個?
我們假設每次取出黑球的概率爲p,那麼白球概率就爲(1-p)
則: P=p8(1−p)2
我們可以認爲是按照最大概率來抽取的樣本,對p進行求導,讓導數爲0.即可得到黑球對應的概率。極大似然估計就是這種思想
3.2 二元邏輯迴歸損失函數
根據極大似然估計思想,則假設二元邏輯迴歸的輸出只有0和1兩種,則:
p(yi∣xi)=η(wxi)yi(1−η(wxi))1−yi
爲了方便求解,我們用負對數似然函數最小化:
L(w)=−i∑(yi∗log(η(wxi))+(1−yi)∗log(1−η(wxi)))
損失函數的本質是如果預測對了可以不懲罰,如果錯了,就加大懲罰,也就是讓損失函數變得較大,而-log函數在[0,1]之間正好符合這一點。另外,前面線性迴歸我們損失函數是用誤差平方和,而LR是廣義的線性迴歸,模型是sigmoid函數,如果也用誤差平方和的話,對於sigmoid求導無法保證是凸函數,在優化過程中得到的解可能是局部的最優解不是全局的,最後,取對數之後,求導更方便
3.3 損失函數優化
求導之前我們先對sigmoid函數變形一下:令t=wxi,則:e−t=e−wxi,那麼e−wxi=η(wxi)1−η(wxi) (3.1)
L(w)=−i∑(yi∗log(η(wxi))+(1−yi)∗log(1−η(wxi)))
∇L(w)=−i∑(yi∗η(wxi)1∗η(wxi)′+(1−yi)∗1−η(wxi)1∗(1−η(wxi))′)=−i∑(yi∗η(wxi)1∗η(wxi)′+(yi−1)∗1−η(wxi)1∗(η(wxi))′)=−i∑((η(wxi)yi+1−η(wxi)yi−1)∗η(wxi)′)=−i∑(η(wxi)(1−η(wxi))yi−η(wxi)∗η(wxi)′)=−i∑(η(wxi)(1−η(wxi))yi−η(wxi)∗(1−e−wxi1)′=−i∑(η(wxi)(1−η(wxi))yi−η(wxi)∗(−(1−e−wxi)21)∗e−wxi∗(−xi)=−i∑(η(wxi)(1−η(wxi))yi−η(wxi)∗((1−e−wxi)21)∗e−wxi∗(xi)=−i∑(η(wxi)(1−η(wxi))yi−η(wxi)∗(η(wxi)2)∗η(wxi)1−η(wxi)∗xi=−i∑(yi−η(wxi))∗xi
最終的結果就是我們所需要的梯度,一般我們採用梯度下降法找到最優解w,則w的每次迭代公式爲:
wnew=w+α∇L(w)
α爲梯度下降法的步長
我們在進行計算時候,會先設置個初始的w,然後當函數值變化較小時,停止
4.總結
邏輯迴歸尤其是二元邏輯迴歸是非常常見的模型,訓練速度很快,雖然使用起來沒有支持向量機(SVM)那麼佔主流,但是解決普通的分類問題是足夠了,訓練速度也比起SVM要快不少的。
邏輯迴歸的簡單實戰請參考我另一篇文章python實現邏輯迴歸二分類