用邏輯回歸來進行分類

邏輯回歸是機器學習中經(jīng)常用到的一種方法,其屬于有監(jiān)督機器學習,邏輯回歸的名字雖然帶有“回歸”二字,但實際上它卻屬于一種分類方法,本文就介紹一下如何用邏輯回歸進行分類。
首先還是介紹一下邏輯回歸的基本原理。

圖1. 邏輯函數(shù)圖形
邏輯回歸之所以叫“邏輯”,是因為其使用了Logistic函數(shù)(也稱Sigmoid函數(shù)),該函數(shù)形式如圖2中式(1)所示,圖形如圖1所示。既然邏輯回歸是分類方法,那么我們這里就以最簡單的二分類來說明一下,二分類的輸出標記為 y=0或1,而線性回歸產(chǎn)生的預測值z = ω^Tx+b,我們讓t=z,把z的表達式帶入到式(1)中得到式(2),再做變換就得到式(3)。y是我們要求的正例,1-y則是反例,二者比值則可稱為幾率,所以式(3)可以稱作“對數(shù)幾率”。接下來我們要求解ω和b,用的是極大似然估計法。我們將y視為后驗概率估計p(y=1|x),那么就可以得到圖3中的式(4)和(5)。接下來令β=(ω;b)和x=(x;1),可得到式(6),由式(6)的得到圖4中(7)、(8)和(9),(9)就是目標函數(shù),對目標函數(shù)求解得到最優(yōu)參數(shù)即可。這些推導比較復雜,筆者在這里僅列出了主要部分,大家如果有興趣,可自行查閱相關(guān)資料。

圖2. 邏輯回歸推導公式(1)—(3)

圖3. 邏輯回歸推導公式(4)—(6)

圖4. 邏輯回歸推導公式(7)—(9)
在了解邏輯回歸的基本原理之后,我們再用一個例子來介紹一下邏輯回歸的用法。
本文中我們使用的邏輯回歸模型來自scikit-learn,用到的數(shù)據(jù)集也同樣來自于scikit-learn,代碼如下。
import?matplotlib.pyplot?as?plt
from?sklearn.metrics?import?classification_report
from?sklearn.datasets?import?make_classification
from?sklearn.linear_model?import?LogisticRegression
from?sklearn.model_selection?import?train_test_split?
X,?y?=?make_classification(n_samples=100,?n_features=2,?
n_informative=2,?n_redundant=0,?n_clusters_per_class=1,
class_sep?=?2.0,?random_state=15)
fig,?ax?=?plt.subplots(figsize=(8,?6))
plt.scatter(X[:,?0],?X[:,?1],?marker='o',?c=y)
plt.xlabel('Feature?1')
plt.ylabel('Feature?2')
plt.show()

圖5. 本例中所用數(shù)據(jù)點
其結(jié)果如圖5所示。這個數(shù)據(jù)集是我們用make_classification方法生成的,共100個點,一共兩個特征(維度),所有數(shù)據(jù)共分為兩個類。從圖中可以看出紫色的點分為一類,黃色的點分為另一類。然后對數(shù)據(jù)集進行一下劃分,分為訓練集和測試集,代碼如下。X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=30)
在這里,我們設置測試集的數(shù)據(jù)個數(shù)為30個,隨機狀態(tài)random_state為30,這個數(shù)字可以隨意設置。接下來我們用邏輯回歸來進行一下訓練和預測,結(jié)果用classification_report方法輸出。
model?=?LogisticRegression()?#生成模型
model.fit(X_train,?y_train)?#輸入訓練數(shù)據(jù)
y_predict?=?model.predict(X_test)?#輸出預測數(shù)據(jù)
print(classification_report(y_test,?y_predict))?#生成預測結(jié)果報告預測
結(jié)果如圖6所示。從圖6中我們可以看出該模型的accuracy為0.97,因為我們的測試數(shù)據(jù)共有30個,所以這意味著我們只有1個點預測錯了,說明該模型的分類效果還是非常不錯的。

圖6. 模型結(jié)果報告
然后為了讓大家對該模型的分類效果有一個進一步的了解,筆者在這里再深入研究一下,我們再來看看邏輯回歸模型的分類邊界,即該模型是從哪里開始進行劃分的,代碼如下。
step?=?0.01?#?相當步長,越小點越密集
x_min?=?X[:,?0].min()?-1?#設置mesh的邊界
x_max?=?X[:,?0].max()?+?1
y_min?=?X[:,?1].min()?-?1
y_max?=?X[:,?1].max()?+?1
x_mesh,?y_mesh?=?np.meshgrid(np.arange(x_min,?x_max,?step),?np.arange(y_min,?y_max,?step))?
data_mesh?=?np.stack([x_mesh.ravel(),?y_mesh.ravel()],?axis=-1)?#把mesh轉(zhuǎn)換為2列的數(shù)據(jù)
Z?=?model.predict(data_mesh)
Z?=?Z.reshape(x_mesh.shape)
fig,?ax?=?plt.subplots(figsize=(8,6))
plt.pcolormesh(x_mesh,?y_mesh,?Z,?cmap=plt.cm.cool)?#畫出mesh的顏色
plt.scatter(X[:,?0],?X[:,?1],?c=y,?cmap=plt.cm.ocean)
plt.show()
這里代碼有些復雜,解釋一下。我們的設計思路是這樣的,因為本次使用的邏輯回歸模型是一個二分類模型,也就是將結(jié)果分為了兩個類,那么我們把模型中每個類的區(qū)域用一種顏色標出,這樣就有兩種顏色。落入每個區(qū)域的點就屬于這個區(qū)域,也就是這個類。x_mesh, y_mesh = np.meshgrid(np.arange(x_min, x_max, step), np.arange(y_min, y_max, step)) 這行代碼就是得到整個區(qū)域(也就是兩個類的區(qū)域之和)的點,這個區(qū)域比我們用到的數(shù)據(jù)集的范圍大一些,x_min、x_max、y_min、y_max就是整個區(qū)域的邊界。data_mesh = np.stack([x_mesh.ravel(), y_mesh.ravel()], axis=-1) 這行代碼就是把上面整個區(qū)域中的點轉(zhuǎn)換為2列的數(shù)據(jù),便于后面預測,Z = model.predict(data_mesh)就是區(qū)域每個點的預測值,我們再用plt.pcolormesh和plt.scatter分別畫出區(qū)域顏色和數(shù)據(jù)點的顏色,就能清楚看到那些點在哪個區(qū)域中。其結(jié)果如圖7所示。

圖7. 用不同顏色來表示不同的劃分區(qū)域
從結(jié)果中可以看出,有一個綠色的點落入到了錯誤的區(qū)域中,說明這個點預測錯了,這和我們前面classification_report得到的結(jié)果一致。
邏輯回歸在機器學習中的使用非常廣泛而且效果也不錯,但其也有一些缺點,比如不能解決非線性問題、對多重共線性數(shù)據(jù)較為敏感、很難處理數(shù)據(jù)不平衡的問題等。其原理也要比筆者介紹的復雜不少,想要深入了解的讀者可以自行查找相關(guān)資料來學習。
作者簡介:Mort,數(shù)據(jù)分析愛好者,擅長數(shù)據(jù)可視化,比較關(guān)注機器學習領域,希望能和業(yè)內(nèi)朋友多學習交流。
贊賞作者

Python中文社區(qū)作為一個去中心化的全球技術(shù)社區(qū),以成為全球20萬Python中文開發(fā)者的精神部落為愿景,目前覆蓋各大主流媒體和協(xié)作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業(yè)界知名公司和技術(shù)社區(qū)建立了廣泛的聯(lián)系,擁有來自十多個國家和地區(qū)數(shù)萬名登記會員,會員來自以工信部、清華大學、北京大學、北京郵電大學、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關(guān)、科研單位、金融機構(gòu)以及海內(nèi)外知名公司,全平臺近20萬開發(fā)者關(guān)注。
長按掃碼添加“Python小助手”
▼點擊成為社區(qū)會員? ?喜歡就點個在看吧
