公號:碼農充電站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:懲罰項,可取的值有
l1
,l2
,elasticnet
,none
,預設為l2
。l2
:當模型引數滿足高斯分佈的時候,使用l2
。支援l2
的優化方法有newton-cg
,sag
和lbfgs
。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 迴歸廣泛用於廣告系統預估點選率,生物統計等領域。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術乾貨。