监督学习 | 线性分类 之Logistic回归原理及Sklearn实现
文章目錄
- 1. Logistic 回歸
- 1.1 Logistic 函數
- 1.2 Logistic 回歸模型
- 1.2.1 模型參數估計
- 2. Sklearn 實現
- 參考資料
相關文章:
機器學習 | 目錄
監督學習 | 線性回歸 之多元線性回歸原理及Sklearn實現
監督學習 | 非線性回歸 之多項式回歸原理及Sklearn實現
監督學習 | 線性回歸 之正則線性模型原理及Sklearn實現
1. Logistic 回歸
我們之前討論了如何用線性模型進行回歸,但若要做的是分類問題怎么辦?其實只需要找一個單調可微函數將分類任務的真實標記 yyy 與線性回歸模型的預測值 zzz聯系起來。
考慮二分類任務,其輸出標記 y∈{0,1}y\in \{0,1\}y∈{0,1} ,而線性回歸模型產生的預測值 z=wTx+bz=\boldsymbol{w}^T\boldsymbol{x}+bz=wTx+b 是實值,于是,我們只需將實值 zzz 轉換為 0/1 值。最理想的是“單位階躍函數”(unit-step function):
y={0,z<00.5,z=01,z>0(3)y=\left\{ \begin{aligned} &0, &\quad z<0\\ &0.5,&\quad z=0\\ &1,&\quad z>0 \end{aligned} \right.\tag{3}y=???????0,0.5,1,?z<0z=0z>0?(3)
即若預測值 zzz 大于零就判為正例,小于零就判為反例,預測值為臨界值零則可任意判斷,如下圖所示:
圖1 單位階躍函數與對數幾率函數但如圖所示,單位階躍函數不連續,所以我們希望找到能在一定程度上近似單位階躍函數的“替代函數”(surrogate function),并希望它單調可微,對數幾率函數正是這樣一個常用的替代函數。
1.1 Logistic 函數
對數幾率函數(Logistic function)是一種“Sigmoid 函數”,它將 zzz 值轉化為接近 0 或 1 的 yyy 值,并且其輸出值在 z=0z=0z=0 附近變化很陡。
對數幾率函數:
f(z)=11+e?z(1)f(z)=\frac{1}{1+e^{-z}} \tag{1}f(z)=1+e?z1?(1)
將 z=wTx+bz=\boldsymbol{w}^T\boldsymbol{x}+bz=wTx+b 代入得:
p=11+e?(wTx+b)(2)p=\frac{1}{1+e^{-(\boldsymbol{w}^T\boldsymbol{x}+b)}} \tag{2}p=1+e?(wTx+b)1?(2)
移項并取對數得:
ln(p1?p)=wTx+b(3)ln(\frac{p}{1-p})=\boldsymbol{w}^T\boldsymbol{x}+b \tag{3}ln(1?pp?)=wTx+b(3)
若將 ppp 視為樣本 x\boldsymbol{x}x 作為正例的可能性,則 1?p1-p1?p 是其反例可能性,兩者比值
p1?p(4)\frac{p}{1-p} \tag{4}1?pp?(4)
稱為“幾率”(odds),反映了 x\boldsymbol{x}x 作為正例的相對可能性。對幾率取對數則得到“對數幾率”(log odds,亦稱 logit):
logit(p)=lnp1?p(5)logit(p)=ln\frac{p}{1-p} \tag{5}logit(p)=ln1?pp?(5)
由此可以看出,式 (2) 實際上是在用線性回歸模型的預測結果取逼近真實標記的對數幾率,因此,其對于的模型稱為“對數幾率回歸”(logisitc regression,亦稱 logit regression,邏輯回歸)。
需要特別注意到,雖然它的名字是“回歸“,但實際確實一種分類學習方法。
這種方法有很多優點,例如:
-
它是直接對分類可能性進行建模,無需實現假設數據分布,這樣就避免了假設分布不準確所帶來的問題;
-
它不是僅預測出”類別“,而是可得到近似概率預測,這對許多需要利用概率輔助決策的任務很有用;
-
此外,對率函數是任意階可導的凸函數,有很好的數學性質,現有的許多數值優化算法都可以直接用于求解最優解。[1]
1.2 Logistic 回歸模型
記 w=(w(1),w(2),?,w(n),b)T\boldsymbol{w}=(\boldsymbol{w}^{(1)},\boldsymbol{w}^{(2)},\cdots,\boldsymbol{w}^{(n)},b)^Tw=(w(1),w(2),?,w(n),b)T ,x=(x(1),x(2),?,x(n),1)T\boldsymbol{x}=(\boldsymbol{x}^{(1)},\boldsymbol{x}^{(2)},\cdots,\boldsymbol{x}^{(n)},1)^Tx=(x(1),x(2),?,x(n),1)T。
我們可以將公式 (3) 重寫為:
lnp(y=1∣x)p(y=0∣x)=w?x(6)ln\frac{p(y=1|x)}{p(y=0|x)}=\boldsymbol{w}\cdot x\tag{6}lnp(y=0∣x)p(y=1∣x)?=w?x(6)
顯然有:
p(y=1∣x)=exp(w?x)1+exp(w?x)(7)p(y=1|\boldsymbol{x})=\frac{exp(\boldsymbol{w}\cdot\boldsymbol{x})}{1+exp(\boldsymbol{w}\cdot\boldsymbol{x})} \tag{7}p(y=1∣x)=1+exp(w?x)exp(w?x)?(7)
p(y=0∣x)=11+exp(w?x)(8)p(y=0|\boldsymbol{x})=\frac{1}{1+exp(\boldsymbol{w}\cdot\boldsymbol{x})} \tag{8}p(y=0∣x)=1+exp(w?x)1?(8)
這就是 Logistic 回歸模型。
1.2.1 模型參數估計
Logistic 回歸模型學習是,對于給定的訓練數據集 T={(x1,y1),(x2,y2),?,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}T={(x1?,y1?),(x2?,y2?),?,(xN?,yN?)},其中,xi∈Rn,yi∈{0,1}x_i \in \boldsymbol{R}^n,y_i\in \{0,1\}xi?∈Rn,yi?∈{0,1} ,可以應用極大似然估計法(MLE)估計模型參數 w\boldsymbol{w}w ,從而得到 Logistic 回歸模型:
設:
P(Y=1∣x)=π(x),P(Y=0∣x)=1?π(x)(9)P(Y=1|x)=\pi(x), \quad P(Y=0|x)=1-\pi(x) \tag{9}P(Y=1∣x)=π(x),P(Y=0∣x)=1?π(x)(9)
則似然函數為:
∏j=1N[π(xi)]yi[1?π(xi)]1?yi(10)\prod_{j=1}^N [\pi(x_i)]^{y_i}[1-\pi(x_i)]^{1-y_i} \tag{10} j=1∏N?[π(xi?)]yi?[1?π(xi?)]1?yi?(10)
對數似然函數為:
L(w)=∑i=1N[yilog?π(xi)+(1?yi)log?(1?π(xi))]=∑i=1N[yilog?π(xi)1?π(xi)+log?(1?π(xi))]=∑i=1N[yi(w?xi)?log?(1+exp?(w?xi)](11)\begin{aligned} L(w) &=\sum_{i=1}^{N}\left[y_{i} \log \pi\left(x_{i}\right)+\left(1-y_{i}\right) \log \left(1-\pi\left(x_{i}\right)\right)\right] \\ &=\sum_{i=1}^{N}\left[y_{i} \log \frac{\pi\left(x_{i}\right)}{1-\pi\left(x_{i}\right)}+\log \left(1-\pi\left(x_{i}\right)\right)\right] \\ &=\sum_{i=1}^{N}\left[y_{i}\left(w \cdot x_{i}\right)-\log \left(1+\exp \left(w \cdot x_{i}\right)\right]\right.\end{aligned} \tag{11} L(w)?=i=1∑N?[yi?logπ(xi?)+(1?yi?)log(1?π(xi?))]=i=1∑N?[yi?log1?π(xi?)π(xi?)?+log(1?π(xi?))]=i=1∑N?[yi?(w?xi?)?log(1+exp(w?xi?)]?(11)
對 L(w)L(w)L(w) 求極大值,即得到 www 的估計值 w^\hat{w}w^。
Logistic 回歸學習通常采用的方法是梯度下降法及擬牛頓法。[2]
2. Sklearn 實現
sklearn.linear_model.LogisticRegression
from sklearn.linear_model import 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=’warn’, max_iter=100, multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)控制 LogisticRegression 模型正則化程度的超參數不是 alpha (其他線性模型使用 alpha),而是它的逆反:C,C 的值越高,模型正則化程度越高。
我們使用鳶尾植物數據集來說明邏輯回歸。這是一個非常著名的數據集,共有 150 朵鳶尾花,分別來自三個不同品種:Setosa 鳶尾花、Versicolor 鳶尾花和 Virginica 鳶尾花,數據里包含花的萼片以及花瓣的長度和寬度。
我們試試僅基于花瓣寬度這一個特征,創建一個 Logistic 回歸分類器來檢測 Virginica 鳶尾花。首先加載數據:
from sklearn import datasets iris = datasets.load_iris() list(iris.keys()) ['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'] X = iris["data"][:, 3:] # petal width y = (iris["target"] == 2).astype(np.int) # 1 if Iris-Virginica, else 0訓練 Logistic 回歸分類器:
from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression(solver="liblinear", random_state=42) log_reg.fit(X, y) LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, l1_ratio=None, max_iter=100,multi_class='warn', n_jobs=None, penalty='l2',random_state=42, solver='liblinear', tol=0.0001, verbose=0,warm_start=False)我們來看看對于花瓣寬度在 0 到 3 厘米之間的鳶尾花,模型估算出的概率:
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] X_new = np.linspace(0, 3, 1000).reshape(-1, 1) y_proba = log_reg.predict_proba(X_new)plt.plot(X_new, y_proba[:, 1], "g-", linewidth=2, label="Virginica 鳶尾花") plt.plot(X_new, y_proba[:, 0], "b--", linewidth=2, label="非 Virginica 鳶尾花")plt.xlabel('花瓣寬度(cm)' ,fontsize=18) plt.ylabel('概率', fontsize=18) plt.legend() <matplotlib.legend.Legend at 0x1a17e98cc0> 圖2 鳶尾花與非鳶尾花的花瓣寬度決策邊界<\center>可以看到,對于花瓣寬度超過 2cm 的花,分類器可以很有信心地說它是一朵 Virginica 鳶尾花,對于花瓣寬度低于 1cm 的花。也可以大概率地說它不是一朵 Virginica 鳶尾花。
decision_boundary = X_new[y_proba[:, 1] >= 0.5][0] decision_boundary array([1.61561562])對于花瓣寬度大約為 1.6cm 的花,其是 Virginica 鳶尾花的概率超過 50%,因此分類器認為它是一朵 Virginica 鳶尾花;對于花瓣寬度大約為 1.4cm 的花,其是 Virginica 鳶尾花的概率低于 50%,因此分類器認為它不是一朵 Virginica 鳶尾花。
log_reg.predict([[1.7], [1.5]]) array([1, 0])還是同樣的數據集,這次使用兩個特征:花瓣寬度和花瓣長度。經過訓練,虛線表示模型估算概率為 50% 的點,即模型的決策邊界。需要注意這里是一個線性邊界(它是使方程 θ0+θ1x1+θ2x2=0\theta_0+\theta_1x_1+\theta_2x_2=0θ0?+θ1?x1?+θ2?x2?=0 的點 xxx 的集合)。每條平行線都分別代表一個模型輸出的特定概率,從左下的 15% 到右上的 90%。根據這個模型,右上線之上的所有花都有超過 90% 的概率屬于 Virginica 鳶尾花。[3]
from sklearn.linear_model import LogisticRegressionX = iris["data"][:, (2, 3)] # petal length, petal width y = (iris["target"] == 2).astype(np.int)log_reg = LogisticRegression(solver="liblinear", C=10**10, random_state=42) log_reg.fit(X, y)x0, x1 = np.meshgrid(np.linspace(2.9, 7, 500).reshape(-1, 1),np.linspace(0.8, 2.7, 200).reshape(-1, 1),) X_new = np.c_[x0.ravel(), x1.ravel()]y_proba = log_reg.predict_proba(X_new)plt.figure(figsize=(10, 4)) plt.plot(X[y==0, 0], X[y==0, 1], "bs") plt.plot(X[y==1, 0], X[y==1, 1], "g^")zz = y_proba[:, 1].reshape(x0.shape) contour = plt.contour(x0, x1, zz, cmap=plt.cm.brg)left_right = np.array([2.9, 7]) boundary = -(log_reg.coef_[0][0] * left_right + log_reg.intercept_[0]) / log_reg.coef_[0][1]plt.clabel(contour, inline=1, fontsize=12) plt.plot(left_right, boundary, "k--", linewidth=3) plt.text(3.5, 1.5, "Not Iris-Virginica", fontsize=14, color="b", ha="center") plt.text(6.5, 2.3, "Iris-Virginica", fontsize=14, color="g", ha="center") plt.xlabel("Petal length", fontsize=14) plt.ylabel("Petal width", fontsize=14) plt.axis([2.9, 7, 0.8, 2.7]) plt.show() 圖3 線性決策邊界參考資料
[1] 周志華. 機器學習[M]. 北京: 清華大學出版社, 2016: 57-59.
[2] 李航. 統計學習方法[M]. 北京: 清華大學出版社, 2012: 78-79.
[3] Aurelien Geron, 王靜源, 賈瑋, 邊蕤, 邱俊濤. 機器學習實戰:基于 Scikit-Learn 和 TensorFlow[M]. 北京: 機械工業出版社, 2018: 129-131.
總結
以上是生活随笔為你收集整理的监督学习 | 线性分类 之Logistic回归原理及Sklearn实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式Tensorflow入门Demo
- 下一篇: skimage库安装