【Basic】Logistic 迴歸分類演算法
分類問題
學術上對分類問題做了細緻區別,如果待分類只有兩個,通常稱之為“二元分類問題”,在機器學習中較多使用 Logistic 函式來解決;若待分類超過兩個,則稱之為“多分類問題”,較多使用 Softmax 函式來解決。
對二元分類,機器學習也專門規定了術語,將“是”類成為“正類(Positive)”,而將“否”類成為“負類(Negative)”,與之對應的訓練集中也可劃分為“正樣本”和“負樣本”。
Logistic 函式介紹
在神經網路演算法中,也稱之為 Sigmoid函式,它既是一種可導的函式,也是一種階躍函式(或者說能夠扮演類似階躍函式的角色)。
Logistic函式作為階躍函式來說,是尺度越大,其效果越明顯。
- X軸的值越是小於0,Y軸的值就越是接近於0;
- X軸的值越是大於0,Y軸的值就越是接近於1。
那麼,通過Logistic函式就可以把線性模型的預測結果對映成分類問題所需的預測結果思路如下:
- 將線性模型的輸出和 Logistic 函式的輸入串接起來;
- 當樣本為負類時,讓線性模型輸出的預測值小於0,而且越小越好;
- 當樣本為正類時,讓線性模型輸出的預測值大於0,而且越大越好。
有了 Logistic 函式進行對映,線性模型不再需要輸出某個特定的值,而只要滿足 “讓 Logistic 函式輸出儘可能地接近0或者1”這一條要求即可。這條要求是線性模型可以滿足的。
同時 Logistic 函式的返回值為 [0, 1],即它的輸出區間符合概率的要求。
Logistic 迴歸介紹
本文的 Logistic 迴歸和其他文獻中的“邏輯迴歸”“邏輯斯諦迴歸”以及“對數機率迴歸”指的都是同一套演算法。
接著就要說說 Logistic迴歸名字本身了,這個名字至少有兩處地方顯示命名者掩藏不住的濃烈黑色幽默感:一是雖然名字赫然寫著“迴歸”,但實際上解決的卻是分類問題,堪稱演算法界的“身在曹營心在漢”;二是雖然名字沒有半點“線性”的蛛絲馬跡,但擔綱的卻都是地地道道的線性模型原班人馬。
Logistic 迴歸的演算法原理
基本思路
分類問題的預測結果自然預測的是類別, 也許你在日常生活中習慣以類別的名字作為不同類別的區分,但在機器學習中,使用的 是事前約定的數值來代表類別,常用的形式有如下三種:
- 數字形式:這是最為直接的一種形式,譬如直接用“1”代表正類,“-1”代表示負類,那麼預測結果是正類就輸出“1”,是負類就輸出-1,簡單明瞭。當然,指代的數字不是唯一的,只要能與類別對應就行,譬如另一種常見習慣是用“0“來指代負類。
- 向量形式:這是當前深度學習在分類問題上使用最多的一種形式,特別是在多分類問題上多采用這種形式,用向量中元素按順序代表類別,譬如有A、B、C三類就可以用[x1,x2,x3]這樣的向量元素依次代表,預測結果為哪一類,就把向量中的對應元素置1,其他置0。如預測的結果類別為“A”,則輸出的預測結果就表示為[1,0,0];預測結果為“B”,則表示為[0,1,0]。
- 概率值形式:前面兩種表示形式都以1或0等確值來表示預測結果是否為這個類但部分演算法給出的預測結果不是絕對的“是/否”,而是每個類的可能概率。如上文對A、B、C三類的預測結果,用這種形式就表示為如0.84302000419,可以看出,雖然三個元素都存在一定概率,但顯然“A”的概率要高於其他,同樣能夠起到預測類別的效果。
在套上Logistic函式的馬甲後,憑什麼就能保證線性模型對正類的預測結果大於0呢?這是個好問題,也是理解線性模型從線性迴歸到 Logistic迴歸的關鍵。
關鍵還是在於線性迴歸。我們俯下身子,學著從線性模型的視角看,就會發現這裡根本不存在什麼預測值是離散的分類問題,而是要預測得到一個連續值。對於任意一個非零數值,當然不是大於0就是小於0,為了使預測更準確,唯一的要求就是預測值距離0點越遠越好,譬如說把正類看成是要預測3756.2、3890、3910.7,把負類結果看成要預測-21164、-2213、-2305.6這樣的連續值。這當然還是典型的迴歸問題,然後就可以照葫蘆畫瓢地用線性迴歸那套老辦法去擬合。只要線性迴歸圓滿完成了它的任務我們自然就能保證正類的預測結果大於0,而負類小於0了。
Logistic迴歸的數學解析
1. Logsitic 迴歸的數學表示式
Logistic函式的數學表示式如下:
L
o
g
i
s
t
i
c
(
z
)
=
1
1
+
e
−
z
Logistic(z) = \frac {1}{ 1 + e^{-z} }
Logistic(z)=1+e−z1
表示式為什麼要寫成這個樣子,其實沒必要細究。數學是門發現的學問,也是一門發明的學問,數學家出於各種目的也會“製造”一些產品,感覺需要階躍函數了,就“製造”出Logistic函式。只需要記住這個Logistic函式就可以了。
Logistic迴歸的假設函式就是套上Logistic數的線性方程,也就是把線性方程表示式帶入上式的 z
,表示式如下:
H
(
x
)
=
1
1
+
e
−
(
ω
T
x
i
+
b
)
H(x) = \frac {1}{ 1 + e^{-(\omega^T x_i + b)} }
H(x)=1+e−(ωTxi+b)1
該假設函式的返回值便是樣本為正樣本(y = 1)的概率。
因為在我們假設正類為1,負類為0是,便已經把正類當做標準。
2. Logistic 迴歸的損失函式
Logistic 迴歸的損失函式表示式如下:
L
(
x
)
=
−
y
log
H
(
x
)
−
(
1
−
y
)
log
(
1
−
H
(
x
)
)
L(x) = -y \log{H(x)} - (1 - y) \log{( 1 - H(x) )}
L(x)=−ylogH(x)−(1−y)log(1−H(x))
要弄清楚損失函式,首先還是回到假設函式。我們知道假設函式的返回值是正樣本的概率,如果把預測結果看做概率,那可以寫出第一版的損失函式:
L
(
x
)
=
−
H
(
x
i
)
y
i
(
1
−
H
(
x
i
)
)
1
−
y
i
L(x) = -H(x_i)^{y_i} (1 - H(x_i) )^{1 - y_i}
L(x)=−H(xi)yi(1−H(xi))1−yi
這是根據概率巧妙設計出來的。函式的值由
H
(
x
i
)
H(x_i)
H(xi)和
(
1
−
H
(
x
i
)
)
(1-H(x_i))
(1−H(xi))兩部分相乘,但由於y的值只會為0或1所以實際上每次只會有一個部分能夠輸出值。當y=1時,
1
−
y
1-y
1−y 就為0,所以第二部分的值為1,相乘後不會對函式的值產生影響,函式值為
H
(
x
i
)
H(x_i)
H(xi)。同理,當y=0時,函式值為
1
−
H
(
x
i
)
1-H(x_i)
1−H(xi)。
現在確定一下損失函式是否正常工作。當y=1時如果預測正確,預測值則無限接近1, 也就是 H ( x i ) y i H(x_i)^{y_i} H(xi)yi的值為1,損失值則為-1。如果預測錯誤, H ( x i ) y i H(x_i)^{y_i} H(xi)yi的值為0,損失值也為0。預測錯誤的損失值確實比預測正確的大,滿足要求。
損失函式的要求就是當模型越好時,損失函式的值越小。
第一版的損失函式雖然能夠表達預測值和實際值之間的偏差,但存在一個致命的問題:它不是一個凸函式,這將導致無法使用梯度下降等優化方法使得損失值最小。好在機器學習界早就掌握了應對這種狀況的解決方法:對數函式,也即取 log \log log 。
3. Logistic 迴歸演算法的具體步驟
- 為假設函式設定引數 ω \omega ω ,通過假設函式計算出一個預測值。
- 將預測值帶入損失函式,計算出一個損失值。
- 通過得到的損失值,利用梯度下降等優化方法調整引數 ω \omega ω 。不斷重複這個過程,使得損失值最小。
Logistic 迴歸演算法的 Python 實現
# 匯入所需的包
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
# 獲取鳶尾花資料集
X, y = load_iris(return_X_y=True)
# 生成模型並訓練
lr_model = LogisticRegression()
clf = lr_model.fit(X, y)
# 進行預測
print(clf.predict(X))
# 使用效能評估器進行分數評估
print('score:', clf.score(X, y))
預測結果如下: