邏輯迴歸——一文帶你搞懂邏輯迴歸原理

目錄

  1、邏輯迴歸的由來
  2、邏輯迴歸模型建立過程中存在的兩個問題
    1)問題一:如何將等式左右連續化
    2)問題二:使用sigmoid函數,將任意範圍的值,映射爲(0,1)
    3)使用matplotlib繪製sigmoid函數
    4)邏輯迴歸函數的推導
  3、邏輯迴歸——鳶尾花數據集的簡單預測

1、邏輯迴歸的由來

  本人是統計學專業,這裏將自己學習中所理解的邏輯迴歸,給你們做一個詳細的說明,希望能幫助到你們。如果覺得本文對您有幫助,可以關注一下這個博客,精彩搶先看。
  先來回顧一下“線性迴歸模型”,它有如下兩個特點:

  • 因變量是連續性的變量,或者說因變量近似是連續性數據;
  • 它研究的是x,y之間的線性相關關係;

  這裏,再回到邏輯迴歸,它區別於線性迴歸,最主要的特點就是:

  • 邏輯迴歸的因變量是0-1型數據;

  對於0-1型數據,就表示這個數據有兩個可能的取值。數學上爲了方便,把其中一個記爲0,另外一個記爲1。即:用0和1代表數據的兩個結果。
  eg:購買決定:我是買呢?還是不買?
  eg:離職決定:離職?還是不離職?
  我們可以定義:1 = 購買;0 = 不購買; 1 = 離職; 0 = 不離職;
  簡單地說:只要有抉擇的地方,就會有0-1型數據。0-1型數據反映的不是阿拉伯數字0和1,它反映的是兩個不能兼得的結果中的一個。
  如果0-1數據關乎業務的核心訴求,那它就是我們的因變量z(z只是一個標記,你也可以寫爲y)。於是,同線性迴歸的定義一樣,我們就會有一堆的自變量x(x也是一個標記,你也可以換成任何其他字母),嘗試去解釋那個因變量。
  於是,我們也需要一個迴歸模型來解決此類問題。基於這種訴求,便產生了“邏輯迴歸”。
  

2、邏輯迴歸模型建立過程中存在的兩個問題

  根據上述敘述,我的目標現在很明確。基於一個0-1變量z,建立一個迴歸模型使得:
在這裏插入圖片描述

1)問題一

  問題一:x爲任意實數,β也爲任意實數。因此上述等號右邊的值,也爲任意實數。但是等號左邊的z卻是一個0-1變量,顯然有問題。
  根本原因在於:0-1型變量z不是連續的,但是等號右邊的值卻是連續的。因此只有把0-1型變量變得連續了,上述等式纔有可能成立。
  於是科學家就想出了一種可能性度量表示這個0-1變量z。這種可能性度量一般用“概率”表示。回到之前的eg,我們定義了:1 = 購買;0 = 不購買;而介於高低之間的存在着很想購買,一般想購買,一點想購買等這樣不同的概率程度。
  於是,上式左側已經變成了一個(0,1)之間的連續型變量了,不再是一個0-1的二值變量。

2)問題二

  問題二:雖然上述“等號兩邊”都是連續性數據了,但是“等號右邊”的取值範圍是(-∞,+∞),而“等號左邊”的取值範圍卻是(0,1)之間,很顯然又存在問題。
  鑑於上述問題,科學家又想出了一個方法,對於任意一個給定的輸入,通過一個函數後,將這個(-∞,+∞)的值,映射到(0,1)之間。於是,引入了“sigmoid函數”。

3)使用matplotlib繪製sigmoid函數
def sigmoid(x):
    return 1. / (1. + np.exp(-x))

x = np.arange(-8,8,0.2)
y = sigmoid(x)
plt.plot(x,y)

結果如下:
在這裏插入圖片描述

4)邏輯迴歸函數的推導

在這裏插入圖片描述
注意:y表示取0或者1的概率。
  

3、邏輯迴歸——鳶尾花數據集的簡單預測

1)相關代碼的說明
  • iris數據集是一個類字典格式的數據。以鍵-值對形式存在。其中數據存放在 “data”鍵中,目標變量存放在“target”鍵中,並且都是以數組形式存放數據的。
  • pprint叫做“漂亮的打印”,對於有字典格式的數據,都能給你很工整的打印出來,尤其是做爬蟲的時候很有用,一定要下去嘗試一下。
  • train_test_split()函數,用於切分數據集,參數test_size=0.2表示我們把整個數據的20%切分出來,作爲測試集,那麼剩下的80%就是用作訓練集。參數random_state=12是一個隨機種子,任意整數即可,這個爲了保證每次運行代碼時,任然是同一個切分。
2)代碼如下
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

from pprint import pprint
from sklearn.datasets import load_iris

iris = load_iris()
# pprint(iris)
x_tr,x_te,y_tr,y_te = train_test_split(iris["data"],iris["target"],
                                       test_size=0.2,random_state=12)
model = LogisticRegression().fit(x_tr,y_tr)
pre = model.predict(x_te)
print(pre)
print("預測精度如下:")
print(sum(y_te == pre) / len(pre))

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章