1. 程式人生 > >Logistic 迴歸-原理及應用

Logistic 迴歸-原理及應用

> **公號:碼農充電站pro** > **主頁:** 上一篇文章介紹了[線性迴歸模型](https://www.cnblogs.com/codeshell/p/14166821.html),它用於處理迴歸問題。 這次來介紹一下 **Logistic 迴歸**,中文音譯為**邏輯迴歸**,它是一個**非線性模型**,是由**線性迴歸**改進而來(所以邏輯迴歸的名字中帶有“迴歸”二字)。 雖然 **Logistic 迴歸**的名字中也有**迴歸**二字,但是該演算法並非用於迴歸問題,而是用於處理**分類問題**,主要用於處理二分類問題,也可以用於處理多分類問題。 ### 1,Logistic 迴歸模型 **Logistic 迴歸模型**將一個事件出現的概率適應到一條**S 型曲線**上,這條曲線稱為 **Logistic 曲線**。 **Logistic 迴歸函式**也叫做 **Sigmoid 函式**,其基本形式如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201221145903384.png) 其中: - g(z) 的範圍為 (0, 1) - z 的範圍為 (-∞, +∞) **g(z)** 公式中的自變數 **z** 就是我們之前介紹的[線性模型](https://www.cnblogs.com/codeshell/p/14166821.html)公式: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201221150858751.png) ### 2,畫出 Logistic 曲線 [NumPy](https://numpy.org/) 庫中的 [linspace(start, stop, num)](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html) 方法在 `[start, stop]` 範圍內生成 `num` 個等距的數字,比如: ```python >
>> 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** 如下: ```python x = np.linspace(-10, 10, 1000) # 在[10, -10] 範圍生成 1000 個數字 y = [1/(1+np.exp(-i)) for i in x] # 根據 Sigmoid 函式求出 y ``` 用 [Matplotlib](https://matplotlib.org/) 畫出折線圖: ```python import matplotlib.pyplot as plt plt.plot(x, y) plt.show() ``` **S 型曲線**如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201221153735864.png?) 其中橙色的直線是我新增上去的。從上圖可以直觀的看出**S 型曲線**的走勢,當 **x** 值在 **[-6, 6]** 之外時,**y** 的值變化非常小。 將 **Logistic 迴歸**用於二分類問題時,分類為 0 和 1,當 g(z) 大於0.5 時,歸入1 類;當 g(z) 小於0.5 時,歸入0 類。 ### 3,Logistic 迴歸的實現 **sklearn** 庫中的 [LogisticRegression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) 類是**Logistic** 迴歸的實現。 **LogisticRegression** 類的原型如下: ```python 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。 關於上面的一些引數,也可以參考[這裡](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression)。 ### 4,對鳶尾花資料集進行分類 下面我們使用 **Logistic** 迴歸對[鳶尾花資料集](https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/data/iris.csv)進行分析。 首先載入資料集: ```python from sklearn.datasets import load_iris X, y = load_iris(return_X_y=True) ``` 構建 **Logistic** 迴歸模型: ```python from sklearn.linear_model import LogisticRegression clf = LogisticRegression() # 建立物件 clf.fit(X, y) # 擬合模型 ``` 對模型的準確率進行評分: ```python >
>> clf.score(X, y) 0.97 ``` 可以看到,用 **Logistic** 迴歸對**鳶尾花資料集**進行分類,最終的準確率為 `97%`,可見效果還是不錯的。 ### 5,Logistic 迴歸處理多分類 **Logistic** 迴歸多用於**二分類**問題,但也可以用於**多分類**,就像上面對**鳶尾花資料集**的分析。要讓 **Logistic** 迴歸處理多分類問題,就要做出一些改進。 一種改進方式是通過**多次**二分類實現**多分類**的目的。假如一個數據集有 **N** 個分類,那就需要訓練 **N** 個二分類模型。對於一個新的特徵資料,就需要用這 **N** 個分類器都對其進行處理,最終選擇概率最大的那個分類作為**多分類**的結果。 另一種方法是將 **Logistic** 迴歸改進為 **Softmax** 迴歸,**Softmax** 迴歸給出的是例項在每一種分類下出現的概率,從而處理多分類任務。 ### 6,總結 **Logistic** 迴歸模型是**線性迴歸**的改進,用於處理分類問題。實際應用中,**Logistic** 迴歸廣泛用於廣告系統預估點選率,生物統計等領域。 (本節完。) --- **推薦閱讀:** [線性迴歸-如何對資料進行迴歸分析](https://www.cnblogs.com/codeshell/p/14166821.html) [AdaBoost 演算法-分析波士頓房價資料集](https://www.cnblogs.com/codeshell/p/14149923.html) [如何用Python 製作詞雲-對1000首古詩做詞雲分析](https://www.cnblogs.com/codeshell/p/14136780.html) [EM 演算法-對鳶尾花資料進行聚類](https://www.cnblogs.com/codeshell/p/14132408.html) [Apriori 演算法-如何進行關聯規則挖掘](https://www.cnblogs.com/codeshell/p/14113600.html) --- *歡迎關注作者公眾號,獲取更多技術乾貨。* ![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic