Logistic 迴歸-原理及應用

碼農充電站發表於2020-12-22

公號:碼農充電站pro
主頁:https://codeshellme.github.io

上一篇文章介紹了線性迴歸模型,它用於處理迴歸問題。

這次來介紹一下 Logistic 迴歸,中文音譯為邏輯迴歸,它是一個非線性模型,是由線性迴歸改進而來(所以邏輯迴歸的名字中帶有“迴歸”二字)。

雖然 Logistic 迴歸的名字中也有迴歸二字,但是該演算法並非用於迴歸問題,而是用於處理分類問題,主要用於處理二分類問題,也可以用於處理多分類問題。

1,Logistic 迴歸模型

Logistic 迴歸模型將一個事件出現的概率適應到一條S 型曲線上,這條曲線稱為 Logistic 曲線

Logistic 迴歸函式也叫做 Sigmoid 函式,其基本形式如下:

在這裡插入圖片描述
其中:

  • g(z) 的範圍為 (0, 1)
  • z 的範圍為 (-∞, +∞)

g(z) 公式中的自變數 z 就是我們之前介紹的線性模型公式:

在這裡插入圖片描述

2,畫出 Logistic 曲線

NumPy 庫中的 linspace(start, stop, num) 方法在 [start, stop] 範圍內生成 num 個等距的數字,比如:

>>> import numpy as np
>>>
>>> np.linspace(2.0, 3.0, num=5)    # 在[2.0, 3.0] 範圍生成 5 個數字
array([2.  , 2.25, 2.5 , 2.75, 3.  ])
>>>
>>> np.linspace(2.0, 3.0, num=6)    # 在[2.0, 3.0] 範圍生成 6 個數字
array([2. , 2.2, 2.4, 2.6, 2.8, 3. ])

為了畫出 Logistic 曲線,定義 x,y 如下:

x = np.linspace(-10, 10, 1000)     # 在[10, -10] 範圍生成 1000 個數字
y = [1/(1+np.exp(-i)) for i in x]  # 根據 Sigmoid 函式求出 y

Matplotlib 畫出折線圖:

import matplotlib.pyplot as plt

plt.plot(x, y)
plt.show()

S 型曲線如下:

在這裡插入圖片描述

其中橙色的直線是我新增上去的。從上圖可以直觀的看出S 型曲線的走勢,當 x 值在 [-6, 6] 之外時,y 的值變化非常小。

Logistic 迴歸用於二分類問題時,分類為 0 和 1,當 g(z) 大於0.5 時,歸入1 類;當 g(z) 小於0.5 時,歸入0 類。

3,Logistic 迴歸的實現

sklearn 庫中的 LogisticRegression 類是Logistic 迴歸的實現。

LogisticRegression 類的原型如下:

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)

來看下其中比較重要的幾個引數:

  • penalty:懲罰項,可取的值有 l1l2elasticnetnone,預設為 l2
    • l2:當模型引數滿足高斯分佈的時候,使用 l2。支援 l2 的優化方法有 newton-cgsaglbfgs
    • l1:當模型引數滿足拉普拉斯分佈的時候,使用 l1。在0.19 版本中,sag 支援 l1
    • elasticnet:僅 liblinear 支援 elasticnet
    • none:表示不使用正則化(liblinear 不支援)。
  • solver:代表的是邏輯迴歸損失函式的優化方法。有 5 個引數可選,分別為:
    • liblinear:coordinate descent (CD),座標下降法。適用於資料量小的資料集。
    • lbfgs:為預設值,在0.22 版本中改為 liblinear
    • newton-cg:牛頓CG法。
    • sag:平均梯度下降法,適用資料量大的資料集。
    • saga:隨機平均梯度下降法,適用資料量大的資料集。
  • max_iter:演算法收斂的最大迭代次數,預設為 10。
  • n_jobs:擬合和預測的時候 CPU 的核數,預設是 1。

關於上面的一些引數,也可以參考這裡

4,對鳶尾花資料集進行分類

下面我們使用 Logistic 迴歸對鳶尾花資料集進行分析。

首先載入資料集:

from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)

構建 Logistic 迴歸模型:

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression() # 建立物件
clf.fit(X, y)              # 擬合模型

對模型的準確率進行評分:

>>> clf.score(X, y)
0.97

可以看到,用 Logistic 迴歸對鳶尾花資料集進行分類,最終的準確率為 97%,可見效果還是不錯的。

5,Logistic 迴歸處理多分類

Logistic 迴歸多用於二分類問題,但也可以用於多分類,就像上面對鳶尾花資料集的分析。要讓 Logistic 迴歸處理多分類問題,就要做出一些改進。

一種改進方式是通過多次二分類實現多分類的目的。假如一個資料集有 N 個分類,那就需要訓練 N 個二分類模型。對於一個新的特徵資料,就需要用這 N 個分類器都對其進行處理,最終選擇概率最大的那個分類作為多分類的結果。

另一種方法是將 Logistic 迴歸改進為 Softmax 迴歸,Softmax 迴歸給出的是例項在每一種分類下出現的概率,從而處理多分類任務。

6,總結

Logistic 迴歸模型是線性迴歸的改進,用於處理分類問題。實際應用中,Logistic 迴歸廣泛用於廣告系統預估點選率,生物統計等領域。

(本節完。)


推薦閱讀:

線性迴歸-如何對資料進行迴歸分析

AdaBoost 演算法-分析波士頓房價資料集

如何用Python 製作詞雲-對1000首古詩做詞雲分析

EM 演算法-對鳶尾花資料進行聚類

Apriori 演算法-如何進行關聯規則挖掘


歡迎關注作者公眾號,獲取更多技術乾貨。

碼農充電站pro

相關文章