天天看點

再讀線性回歸 Linear Regression (邏輯回歸)

1. 邏輯回歸

線性回歸算法旨在通過訓練一定量的樣本來預測 連續型數值 (Continuous Value) (即回歸問題)。當然了,聰明的科學家們早就想好如何将線性回歸運用到 離散型數值 (Discrate value) 的預測上了 (即分類問題)。我們将這種運用在 分類問題 上的線性回歸模型稱之為 邏輯回歸 (Logistic Regression)。

簡單的來說,邏輯回歸僅僅是将線性回歸的輸出值做了一定的處理,并設定一個門檻值。當預測的輸出值大于或等于這個門檻值時,将樣本分為一類;當預測的輸出與之小于這個門檻值時,将樣本分為另一類。一個常見的例子就是給線性回歸結果上加上 Sigmoid 函數(或稱 Logisitc 函數),如此一來,線性回歸的輸出值就固定在 0 到 1 之間了。我們設定門檻值為 0.5,當預測值大于 0.5 時,認為樣本為正類;反之則為負類。

在二進制分類 (類 0 和類 1) 問題中,輸出結果可被看做是一個機率值 (0~1),該機率值表示該樣本預測為類 1 的機率。使用者可以調解不同的門檻值來控制分類的結果,當類 0 樣本個數較多時,為了防止不平衡現象,我們可以适當調高門檻值 (如大于 0.5)。
再讀線性回歸 Linear Regression (邏輯回歸)

上圖左邊展示了标準的 Sigmoid 函數,它将整個 x 軸平均分為 2 部分,即 x ≥ 0 x \geq 0 x≥0 時樣本為正,當 x < 0 x < 0 x<0 時樣本為負,我們記這個函數為 g ( z ) g(z) g(z)。是以,邏輯回歸的函數可以寫為,

h θ ( x ) = g ( θ T x ) , 其 中 g ( z ) = 1 1 + e − z h_{\theta}(x) = g(\theta^Tx),其中 g(z)=\frac{1}{1+e^{-z}} hθ​(x)=g(θTx),其中g(z)=1+e−z1​

其中, θ \theta θ 是 n+1 維參數向量( θ ∈ R ( n + 1 ) × 1 \theta \in \mathbb{R}^{(n+1)\times1} θ∈R(n+1)×1)。 x x x 表示單個樣本,也是 n+1 維向量( x ∈ R ( n + 1 ) × 1 x \in \mathbb{R}^{(n+1)\times1} x∈R(n+1)×1)。對于每個樣本 x x x,我們通過計算其 h θ ( x ) h_{\theta}(x) hθ​(x) 的值來判斷它到底屬于正類或負類,其預測結果表示為,

預 測 類 别 = { 1 , 如 果 h θ ( x ) ≥ 0.5 0 , 如 果 h θ ( x ) < 0.5 預測類别 = \begin{cases} 1,如果 h_{\theta}(x) \geq 0.5 \\ 0,如果 h_{\theta}(x) < 0.5 \end{cases} 預測類别={1,如果hθ​(x)≥0.50,如果hθ​(x)<0.5​

總而言之,邏輯回歸的過程可以概括為,輸入為 ( n + 1 ) (n+1) (n+1) 維的樣本 x x x,輸出為 x x x 屬于正類( y = 1 y=1 y=1)的機率。人們通過這個機率來判斷 x x x 更有可能屬于正類還是負類。

除此之外,對于多分類問題(即預測類的個數大于2),邏輯回歸預設使用 one-vs-rest1 來判斷。簡單的說,就是針對 k k k 個類( y 1 , y 2 , . . . , y k y_1, y_2, ..., y_k y1​,y2​,...,yk​),訓練出 k k k 個分類器 ( h θ 1 ( x ) h^1_{\theta}(x) hθ1​(x), h θ 2 ( x ) h^2_{\theta}(x) hθ2​(x), …, h θ k ( x ) h^k_{\theta}(x) hθk​(x),)。在訓練單個分類器 h θ i ( x ) h^i_{\theta}(x) hθi​(x) 中,将 y i y_i yi​ 作為正類,其餘類作為負類。當來了一個新的樣本 x n e w x_{new} xnew​ 時,依次用這 k k k 個分類器進行預測,找到預測值最大的分類器 h θ ∗ ( x ) h^{*}_{\theta}(x) hθ∗​(x),并将其對應的 y ∗ y_* y∗​ 類作為最終預測結果。

2. 決策邊界 Decision Boundary

線性回歸和邏輯回歸最大的不同在于預測值 h θ ( x ) h_{\theta}(x) hθ​(x) 的計算。即線上性回歸中, h θ ( x ) = θ T x h_{\theta}(x)=\theta^Tx hθ​(x)=θTx。而在邏輯回歸中, h θ ( x ) = g ( θ T x ) h_{\theta}(x)=g(\theta^Tx) hθ​(x)=g(θTx)。若設定分類的門檻值為 0.5,那麼判斷 h θ ( x ) h_{\theta}(x) hθ​(x) 與 0.5 的關系,等價于判斷 θ T x \theta^Tx θTx 與 0 的關系(由 Sigmoid 函數曲線圖可知)。換句話說,如果 θ T x \theta^Tx θTx 大于等于 0,那麼 h θ ( x ) h_{\theta}(x) hθ​(x) 一定大于等于 0.5,則 x x x 可能為正類樣本;反之, θ T x \theta^Tx θTx 小于 0,那麼 h θ ( x ) h_{\theta}(x) hθ​(x) 一定小于 0.5,則 x x x 可能為負類樣本。是以, θ T x = 0 \theta^Tx=0 θTx=0 構成了邏輯回歸的決策邊界,具體的,

θ T x = θ 0 x 0 + θ 1 x 1 + . . . + θ n x n = 0. \theta^Tx = \theta_0x_0+\theta_1x_1 + ...+\theta_nx_n = 0. θTx=θ0​x0​+θ1​x1​+...+θn​xn​=0.

2.1 線性決策邊界

舉個例子,現需要針對下圖中的正類和負類樣本進行分類。每個樣本 x = ( x 1 ; x 2 ) x=(x_1;x_2) x=(x1​;x2​) 都是一個二維向量。現在,假設我們針對特征 { 1 , x 1 , x 2 } \{1,x_1,x_2\} {1,x1​,x2​} 學習到的參數 θ = ( − 3 ; 1 ; 1 ) \theta=(-3;1;1) θ=(−3;1;1),則邏輯回歸對應的決策邊界為 ,

決 策 邊 界 : − 3 + x 1 + x 2 = 0 決策邊界:-3+x_1+x_2=0 決策邊界:−3+x1​+x2​=0

由于這個決策邊界是關于 x 1 , x 2 x1,x2 x1,x2 的線性表達式,故這個決策邊界也成為 線性決策邊界。線性決策邊界是分類問題中最簡單最基礎的。

再讀線性回歸 Linear Regression (邏輯回歸)
2.2 非線性決策邊界

另一個例子,假設正類和負類樣本的分布如下圖所示,我們很難通過一條直線将它們分割開。這個時候我們需要一個非線性的決策邊界。這個時候簡單的 x 1 , x 2 x1,x2 x1,x2 兩個特征不能很好的分類,我們需要增加到 2 次方的特征,如 x 1 2 x_1^2 x12​, x 2 x 2 x_2x_2 x2​x2​ 和 x 2 2 x_2^2 x22​。現假設邏輯回歸算法針對特征 { 1 , x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 } \{1,x_1,x_2,x_1^2,x_1x_2,x_2^2\} {1,x1​,x2​,x12​,x1​x2​,x22​} 學習到的參數是 θ = ( − 2 ; 0 ; 0 ; 1 ; 0 ; 1 ) \theta=(-2;0;0;1;0;1) θ=(−2;0;0;1;0;1)。那麼邏輯回歸模型的決策邊界為,

決 策 邊 界 : − 2 + x 1 2 + x 2 2 = 0 決策邊界:-2 + x_1^2 + x_2^2 = 0 決策邊界:−2+x12​+x22​=0

是以,隻要将回歸方程中的項的次數升高,邏輯回歸還是具有很強的非線性分類能力的。

再讀線性回歸 Linear Regression (邏輯回歸)

3. 代價函數

邏輯回歸的代價函數 J ( θ ) J(\theta) J(θ) 比較特别,它與線性回歸的代價函數不同,它更多的是一個分段函數形式呈現。也就是說,當樣本 x ( i ) x^{(i)} x(i) 是正類( y ( i ) = 1 y^{(i)}=1 y(i)=1)或負類( y ( i ) = 0 y^{(i)}=0 y(i)=0)時,計算代價的公式是不同的。【這麼做的原因是保持代價函數是凸函數,也即保持隻有一個全局優點】

x ( i ) 的 代 價 = { − l o g ( h θ ( x ( i ) ) ) , y ( i ) = 1 − l o g ( 1 − h θ ( x ( i ) ) ) , y ( i ) = 0 x^{(i)} 的代價 = \begin{cases} -log(h_{\theta}(x^{(i)})),y^{(i)}=1 \\ -log(1-h_{\theta}(x^{(i)})),y^{(i)}=0 \end{cases} x(i)的代價={−log(hθ​(x(i))),y(i)=1−log(1−hθ​(x(i))),y(i)=0​

首先,當樣本本來是正類時,根據 − l o g ( x ) -log(x) −log(x) 可知:預測值越是接近 1,代價越小;當預測值越是接近 0,代價變得非常大(無窮大)。與之相反,當樣本本來是負類時,根據 − l o g ( 1 − x ) -log(1-x) −log(1−x) 可知:預測值越是接近 1,代價變得大(無窮大);當預測值越是接近 0,代價越小。這個設計不得不說十分巧妙。

再讀線性回歸 Linear Regression (邏輯回歸)

通常,為了簡化代價函數(将多行寫成一行的形式),我們在前面添加參數 y y y 和 ( 1 − y ) (1-y) (1−y),這樣代價函數 x^{(i)} 的代價也可以寫成,

x ( i ) 的 代 價 = y ( i ) [ ( − 1 ) × l o g ( h θ ( x ( i ) ) ) ] + ( 1 − y ( i ) ) [ ( − 1 ) × − l o g ( 1 − h θ ( x ( i ) ) ) ] x^{(i)} 的代價 =y^{(i)}[(-1)\times log(h_{\theta}(x^{(i)}))]+(1-y^{(i)})[(-1)\times -log(1-h_{\theta}(x^{(i)}))] x(i)的代價=y(i)[(−1)×log(hθ​(x(i)))]+(1−y(i))[(−1)×−log(1−hθ​(x(i)))]

是以總的代價函數 J ( θ ) J(\theta) J(θ) 可看做是所有樣本 x ( i ) x^{(i)} x(i) 的代價之和( m m m 表示樣本個數),記為,

J ( θ ) = 1 m ∑ i = 1 m { y ( i ) [ ( − 1 ) × l o g ( h θ ( x ( i ) ) ) ] + ( 1 − y ( i ) ) [ ( − 1 ) × − l o g ( 1 − h θ ( x ( i ) ) ) ] } J(\theta)= \frac{1}{m}\sum_{i=1}^{m} \{y^{(i)}[(-1)\times log(h_{\theta}(x^{(i)}))]+(1-y^{(i)})[(-1)\times -log(1-h_{\theta}(x^{(i)}))]\} J(θ)=m1​i=1∑m​{y(i)[(−1)×log(hθ​(x(i)))]+(1−y(i))[(−1)×−log(1−hθ​(x(i)))]}

4. 參數優化

在邏輯回歸中,我們沿用之前介紹的梯度下降算法(Gradient Descent)。通過每次疊代中對參數的調整來實作代價函數最小化,邏輯回歸同樣是求解出使得代價函數最小的參數集合 θ \theta θ,

θ = arg ⁡ min ⁡ θ J ( θ ) \theta = \mathop{\arg\min}_{\theta} J(\theta) θ=argminθ​J(θ)

同樣的,我們對代價函數求導,發現其梯度與線性回歸的梯度一模一樣,

∂ J ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , j = 0 , 2 , . . . , n \frac{\partial J}{\partial \theta_j} = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j,j=0,2,...,n ∂θj​∂J​=m1​i=1∑m​(hθ​(x(i))−y(i))xj(i)​,j=0,2,...,n

每一輪疊代,調整的參數也是類似,令 α \alpha α 為學習率,則參數項 θ j \theta_j θj​ 調整過程為,

θ j = θ j − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \theta_j = \theta_j - \frac{\alpha}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)} θj​=θj​−mα​i=1∑m​(hθ​(x(i))−y(i))x(i)

我們将 j 推廣到一般情況,即每次對待看做是對 θ \theta θ 上的矩陣操作,令 X X X 和 Y Y Y 分别表示特征集合和标簽集合,我們得到每次疊代的新的 θ \theta θ 應該等于(等式同樣适用于線性回歸),

θ = θ − α m X T ( X θ − Y ) \theta = \theta - \frac{\alpha}{m} X^T(X\theta-Y) θ=θ−mα​XT(Xθ−Y)

可以說,參數調優過程跟線性回歸一模一樣。但是注意,邏輯回歸的 h θ ( x ) h_{\theta}(x) hθ​(x) 與線性回歸的不同。

5. Sklearn 實作

Sklearn 同樣提供了邏輯回歸算法的現成品,即 sklearn.linear_model.LogisticRegression 類2 。執行個體代碼如下,函數

logistic_regression_example()

建立了一個邏輯回歸模型的架構,函數

set_arguments()

列出了邏輯回歸中比較重要的參數。

from  sklearn.linear_model import LogisticRegression

def logistic_regression_example(args, train_x, train_y):
    # fit the train_x, train_y
    clf = LogisticRegression()
    clf.set_params(**args)
    clf.fit(train_x,train_y)
	return clf
    
def set_arguments():
    args = dict()
    args['penalty']='elasticnet' # 正則化方法, {'l1','l2','elasticnet',none'}
    args['l1_ratio']=0.5 # elasticnet 正則化情況下的 L1 正則化的比例
    args['class_weight']='balanced' # 類權值, {'balanced',dict={0:0.5,1:0.5}}
    args['max_iter']=800 # 疊代次數, default=100
    args['tol']=1e-4
    args['solver'] = 'saga' # 優化算法, {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}
    args['random_state']=0 # 随機種子
    return args
           

值得一提的是優化算法的參數

solver

,它對邏輯回歸的預測結果影響重大。預設的選擇有 ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’(具體見博文3)。不同的優化算法對應着不同的正則化的懲罰項 ,即

penalty

參數。舉個例子,‘liblinear’ 優化算法在小資料集上效果不錯,它對應的

penalty

不能等于 ‘none’。而其他的 ‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 等優化算法,它們的

penalty

必須等于 ‘l2’ 或者 ‘none’。支援

penalty

=‘elasticnet’ 的隻有 ‘saga’ 算法。這個在設定參數時應該留意。

另外,這個

class_weight

表示類權重,也就是說分類器分錯不同類的樣本的代價是不同的,這個參數可以取 ‘balanced’,也可以取一個字典,裡面标記不同權重的比例,如 ‘{0:0.5,0:0.5}’。不同的權重會導緻決策邊界向正類或負類的方向偏移,這個參數也是處理類不平衡問題的一個好辦法。

6. 邏輯回歸的探讨

在邏輯回歸分類器中,我們使用不同的參數,會造成不同效果的分類效果。如下面 4 個子圖所示,其中 liblinear 方法就不是一個好的分類結果,因為它訓練出來的決策邊界太靠近負類(藍色的 X),這回導緻一些本來是負類的樣本被劃分進正類中(橙色的 O)。其他的 saga,lbfgs,和 sag 效果都還不錯,它們的決策邊界都還比較适中。但是現階段,邏輯回歸并沒有辦法差別誰好誰壞,這對我們的分類效果造成了一定的影響。

再讀線性回歸 Linear Regression (邏輯回歸)

解決這個問題的辦法有 2 個,一個是繼續嘗試不同的參數,直至找到類似于 saga,lbfgs,和 sag 效果的參數;另一個是使用更加穩定的分類方法,如 支援向量機(Support Vector Machine,SVM),支援向量機正是針對此現象,而力圖找出到離 2 個類的距離均最大的決策邊界,也稱之為超平面。

  1. one-vs-rest與one-vs-one以及sklearn的實作. Link ↩︎
  2. LogisticRegression 官方文檔. Link ↩︎
  3. logistic 回歸的sklearn實踐. Link ↩︎