邏輯斯諦回歸(Logistic Regression,LR)及python實現(xiàn)

0. 簡介

邏輯回歸中,因變量取值是一個二元分布,模型學習E [y | x; \theta], 給定自變量和超參數(shù)后,得到因變量的期望,并基于期望來處理預(yù)測分類。

LR模型中,
\log \frac{p}{1-p}=\theta^{\mathrm{T}} x
其中, p 是預(yù)測輸入為正樣本的概率。
定義 事件的幾率(odds)為,該事件發(fā)生的概率與該事件不發(fā)生的概率的比值 \frac{p}{1-p}.

邏輯斯諦回歸與線性回歸的區(qū)別與相同點

邏輯斯諦回歸是線性回歸在分類問題的推廣,使用sigmoid函數(shù)作為 link 函數(shù)。邏輯回歸可以看作廣義線性模型在因變量服從二元分布是的一個特殊情況。

線性回歸使用最小二乘法進行參數(shù)估計,邏輯斯諦回歸使用極大似然法,最大化預(yù)測屬于實際的概率。其實,最小二乘法是在自變量x 與超參數(shù) \theta 確定,因變量y服從正態(tài)分布的假設(shè)下,使用極大似然估計的一個化簡。

LR和SVM(線性核)的聯(lián)系與區(qū)別

LR和SVM的不同

1、損失函數(shù)的不同
LR是cross entropy(對數(shù)似然損失函數(shù)),SVM的損失函數(shù)是最大化間隔距離(合頁損失);


在這里插入圖片描述

2、SVM不能產(chǎn)生概率,LR可以產(chǎn)生概率;
LR 擬合的是概率分布。

3、SVM自帶結(jié)構(gòu)風險最小化,LR則是經(jīng)驗風險最小化

在假設(shè)空間、損失函數(shù)和訓練集確定的情況下,經(jīng)驗風險最小化即最小化損失函數(shù);
結(jié)構(gòu)最小化是為了防止過擬合,在經(jīng)驗風險的基礎(chǔ)上加上表示模型復雜度的正則項

4、LR和SVM在實際應(yīng)用的區(qū)別

根據(jù)經(jīng)驗來看,對于小規(guī)模數(shù)據(jù)集,SVM的效果要好于LR,但是大數(shù)據(jù)中,SVM的計算復雜度受到限制,而LR因為訓練簡單,可以在線訓練,所以經(jīng)常會被大量采用。

n 是特征數(shù)量, m是樣本數(shù):
(1)如果 n 相對于 m 很大,(比如,n=1萬, m = 10-1000) 使用LR算法或者 不帶核的SVM;
(2) 如果 n 很小,m的數(shù)量適中(比如, n = 1-1000, m = 10-10000)
使用帶有核函數(shù)的SVM算法
(3)如果n 很小, m很大, (n = 1-1000, m = 50000+)
增加更多的feature,使用LR或者不帶核函數(shù)的SVM。
LR和不帶核的SVM類似。

5、SVM的處理方法是只考慮support vectors,也就是和分類最相關(guān)的少數(shù)點,去學習分類器。
而邏輯回歸通過非線性映射,大大減小了離分類平面較遠的點的權(quán)重,相對提升了與分類最相關(guān)的數(shù)據(jù)點的權(quán)重。

1. 為什么LR是線性模型

邏輯斯蒂回歸是假設(shè)因變量服從伯努利分布。

在這里插入圖片描述

也就是說,經(jīng)過sigmoid函數(shù),將 x 映射為 \phi 后,x與y的概率分布仍然是指數(shù)分布簇,即模型仍是廣義線性模型。

2. LR模型定義

LR模型定義:

在這里插入圖片描述

線性二分類模型:
f(x)=\theta^{T} x
其中,f(x)=0是決策平面。

邏輯回歸決策函數(shù)是將此線性二分類嵌套一個sigmoid函數(shù):
h_{\theta}(x)=\operatorname{sigmoid}(f(x))=\frac{1}{1+e^{-\theta^{T} x}}
該式子取值在0~1,它的含義是,二分類中,類別y 為正類(即1)的概率。

(為什么h_{\theta}(x)可以看做是正類的概率?
因為,在線性二分類中,\theta^{T} x>0屬于正類,因此,這里h_{\theta}(x)>0.5屬于正類。h_{\theta}(x)取值又在0~1之間,因此,在二分類中,把h_{\theta}(x)當作正類的概率沒問題。
這里,有點本末倒置,因為構(gòu)建LogisticRegression時,就是引入概率 p 來解釋 y,通過 log[ p/(1-p)]=y來進行連接 p 和 y 的關(guān)系。

因此,在二分類中,
P(Y=1 | x)=\frac{\exp (\theta^{T} x)}{1+\exp (\theta^{T} x)}\\ P(Y=0 | x)=\frac{1}{1+\exp (\theta^{T} x)}
其中,\theta^{T} x = w \cdot x+b
此外, 如果取Y的取值為{+1, -1 }; 最終梯度計算會不一樣。

最大似然函數(shù):
\begin{aligned} L(\theta)=& p(\hat{y} | X ; \theta)=\prod_{i=1}^{m} p\left(y^{(i)} | x^{(i)} ; \theta\right) \\ &=\prod_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)\right)^{y^{(i)}}\left(1-h_{\theta}\left(x^{(i)}\right)\right)^{\left(1-y^{(i)}\right)} \end{aligned}
(這里也體現(xiàn)了LR滿足伯努利分布。)
令損失函數(shù)為負對數(shù)似然函數(shù):

\operatorname{loss}(\theta)=-\log (L(\theta))=- \left\{ \sum_{i=1}^{m} y^{(i)} \log \left(h\left(x^{(i)}\right)\right) + \left(1-y^{(i)}\right) \log \left(1-h\left(x^{(i)}\right)\right) \right\}
化簡得到:
loss(\theta) = - \sum_{i=1}^{m} [ (y-1)\theta^Tx - log(1+e^{-\theta^Tx})]\\ = - \sum_{i=1}^{m} [ y\theta^Tx - log(1+e^{\theta^Tx})]
loss(\theta) 求極小值。

\frac{\partial}{\partial \theta} J(\theta) = -\sum_{i=1}^{m}\left(y^{(i) }-h_{\theta}\left(x^{(i)}\right)\right) \cdot x_{i}

這也是梯度下降法計算的參數(shù)梯度。
參數(shù)更新:
沿著負梯度方向進行更新。
w \leftarrow w-\alpha \cdot \frac{\partial}{\partial w} J(w,b)
b \leftarrow b-\alpha \cdot \frac{\partial}{\partial b} J(w,b)

3. 多分類LR

假如有y 有K類,使用多項邏輯回歸(softmax regression)來分類。
p(x = k) = \frac{e^{w_k\cdot x} } {\sum_{i = 1}^{K}{e^{w_k\cdot x}}}
損失函數(shù):
Loss( w ) = \sum\limits_{i = 1}^{N} \sum\limits_{j = 1}^{k} [ sign(y_i = c) log(P(Y = c | x) ]
或者采用 one-vs-rest 方法,構(gòu)建 K-1 個邏輯斯蒂回歸模型。

4. 防止過擬合方法

1.減少特征數(shù)量;
2.正則化

損失函數(shù):
Loss( w ) = -\frac{1}{N}\sum\limits_{i = 1}^{N} [y_i log(P(Y = 1 | x) + (1 - y_i) log( P( Y = 0 | x )] + \frac{\lambda}{2*N}\sum_{j = 1}^{N} {\theta_j^2 }\\ = -\frac{1}{N} \sum\limits_{i = 1}^{N} [y_i (wx + b) - log(1 + log( 1 + e ^{wx + b})] + \frac{\lambda}{2*N}\sum_{j = 1}^{N} {\theta_j^2 }
\lambda為正則化系數(shù)。

model.LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)

在sklearn 中, 可以設(shè)置 超參數(shù)C(正則項懲罰系數(shù)的倒數(shù))

L1,L2懲罰項的區(qū)別

L1容易使得LR系數(shù) w 更加稀疏;
L2 相當于weight decay,目標函數(shù)變?yōu)橥购瘮?shù),梯度下降法和L-BFGS都能收斂到全局最優(yōu)解。
正則化項實際上是給了模型一個先驗知識,L2正則相當于添加了一個均值為0,協(xié)方差為 1/λ 的高斯分布先驗。

5. 實踐

LogisticRegression二分類的python實現(xiàn),由于LogisticRegression沒有解釋解,使用梯度下降法進行求解。

import sklearn.datasets as datasets
import numpy as np
from sklearn.linear_model import LogisticRegression as LR
class LogisticRegression():
    def __init__(self,alpha=0.01,epochs=3):
        self.W = None 
        self.b = None
        self.alpha = alpha
        self.epochs = epochs
    def fit(self,X,y): 
        # 設(shè)定種子
        np.random.seed(10)
        self.W = np.random.normal(size=(X.shape[1]))
        self.b = 0
        for epoch in range(self.epochs):
            if epoch%50 == 0:
                print("epoch",epoch)
            w_derivate = np.zeros_like(self.W)
            b_derivate = 0
            for i in range(len(y)):
                # 這里是加上負梯度
                w_derivate += (y[i] - 1/(1+np.exp(-np.dot(X[i],self.W.T)-self.b)))*X[i]
                b_derivate += (y[i] - 1/(1+np.exp(-np.dot(X[i],self.W.T)-self.b)))
            self.W = self.W + self.alpha*np.mean(w_derivate,axis=0)
            self.b = self.b + self.alpha*np.mean(b_derivate)
        return self
    def predict(self,X):
        p_1 = 1/(1 + np.exp(-np.dot(X,self.W) - self.b))
        return np.where(p_1>0.5, 1, 0)
def accuracy(pred, true):
    count = 0
    for i in range(len(pred)):
        if(pred[i] == true[i]):
            count += 1
    return count/len(pred)
def normalize(x):
    return (x - np.min(x))/(np.max(x) - np.min(x))

if __name__ == "__main__":
    # input datasets 
    digits = datasets.load_breast_cancer()
    X = digits.data
    y = digits.target
    # 歸一化
    X_norm = normalize(X)
    X_train = X_norm[:int(len(X_norm)*0.8)]
    X_test = X_norm[int(len(X_norm)*0.8):]
    y_train = y[:int(len(X_norm)*0.8)]
    y_test = y[int(len(X_norm)*0.8):]
    # model 1
    lr = LogisticRegression(epochs=500,alpha=0.03)
    lr.fit(X_train,y_train)
    y_pred = lr.predict(X_test)
    # 評估準確率
    acc = accuracy(y_pred, y_test)
    print("acc", acc)
    # model 2
    clf_lr = LR()
    clf_lr.fit(X_train, y_train)
    y_pred2 = clf_lr.predict(X_test)
    print("acc2", accuracy(y_pred2, y_test))

運行結(jié)果:

acc 0.9473684210526315
acc2 0.9298245614035088

可以看到自己寫的LR模型比sklearn里邊實現(xiàn)的效果更好,原因,可能是我們設(shè)定的超參數(shù)(如alpha,epoch)更加適合這個小數(shù)據(jù)集吧。

6. 其他問題

LR特征離散化原因:
1.離散特征容易增加和減少特征,快速迭代模型;
2.稀疏向量內(nèi)積乘法運算速度更快,計算易于存儲、擴展;
3.離散特征對異常值不敏感,魯棒性強;
4.簡化了邏輯斯蒂模型,降低模型過擬合。
5.離散化的特征方便進行特征交叉,使得模型的表達能力更強。

把高度相關(guān)的特征去掉原因:

使得模型的可解釋性更強;提高訓練速度。
如果模型很多特征高度相關(guān),損失函數(shù)本身收斂了,參數(shù)仍然沒有收斂,訓練時間變長。

避免局部極小方法:

1.以多組不同參數(shù)值進行初始化;
2.使用隨機梯度下降,加入隨機的因素。

特征系數(shù)絕對值能認為是特征重要性嗎?
1.特征系數(shù)絕對值越大,對分類效果的影響越顯著,但不能認為特征系數(shù)更大的特征更重要。
2.改變變量尺度會改變系數(shù)絕對值;
3.特征相關(guān),系數(shù)可以認為從一個特征轉(zhuǎn)移到另一個特征;

邏輯斯諦回歸需要標準化?
理論上不需要,因為特征尺寸發(fā)生改變,并不影響到最優(yōu)決策面;但是,為了加快模型的收斂速度,一般也進行標準化。

但是,像Lasso回歸,嶺回歸,是需要對數(shù)據(jù)進行標準化的,因為在輸入的縮放比例下不是等變的。


參考:

  1. zhihu 為什么機器學習的分類器用logistic模型?;
  2. 機器學習面試題匯總(邏輯斯蒂回歸相關(guān));
  3. Logistic 回歸的三個視角(極大似然估計/熵/形式化損失函數(shù));
  4. 機器學習之邏輯回歸(Logistic Regression);
  5. 淺析機器學習:線性回歸 & 邏輯回歸;
  6. 在進行數(shù)據(jù)分析的時候,什么情況下需要對數(shù)據(jù)進行標準化處理?;
  7. 在進行邏輯回歸之前需要標準化嗎?;
  8. sklearn lr;
  9. 邏輯回歸L1與L2正則,L1稀疏,L2全局最優(yōu)(凸函數(shù)梯度下降)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容