一、算法簡介
1、定義
邏輯斯蒂回歸(Logistic Regression)雖然名字中有回歸,但是模型最初是為了解決二分類問題。線性回歸模型幫助我們用最簡單的線性方程實現(xiàn)了對數(shù)據(jù)的擬合,但只實現(xiàn)了回歸而無法進行分類,因此LR就是在線性回歸的基礎(chǔ)上,構(gòu)造的一種分類模型。
對線性模型進行分類如二分類任務(wù),簡單的事通過階躍函數(shù)(unit-step function),即將線性模型的輸出值套上一個函數(shù)進行分割,大于z的判定為0,小于z的判定為1.如下圖左所示:

但是這樣的分段函數(shù)數(shù)學(xué)性質(zhì)不好,既不連續(xù)也不可微。因此有人提出了對數(shù)幾率函數(shù),上圖右,簡稱Sigmoid函數(shù),
該函數(shù)具有很好的數(shù)學(xué)性質(zhì),既可以用于預(yù)測類別,并且任意階可微,因此可用于求解最優(yōu)解。將函數(shù)帶進去,可得LR模型為,
其實,LR模型就是在擬合z=W^Tx+b這條直線,使得這條直線盡可能地將原始數(shù)據(jù)中的兩個類別正確的劃分開。
2、損失函數(shù)
回歸問題的損失函數(shù)一般為平均誤差平方損失MSE,LR解決二分類問題,損失函數(shù)為如下形式,
這個函數(shù)通常稱為對數(shù)損失logloss,這里的對數(shù)底為自然對數(shù)e,其中真實值y是有0,1兩種情況,而推測值
由于借助對數(shù)幾率函數(shù),其輸出是介于0~1之間連續(xù)概率值。因此損失函數(shù)可以轉(zhuǎn)換為分段函數(shù)
3、sklearn模塊
sklearn.linear_model模塊提供了很多模型供我們使用,比如線性回歸、嶺回歸、Lasso回歸等。邏輯回歸API,
sklearn.linear_model.LogisticRegression(penalty='l2',C=1.0)
二、案例分析
這里我們使用邏輯回歸預(yù)測癌癥分類,數(shù)據(jù)集主要是來自美國威斯康星州乳腺癌的數(shù)據(jù)集
數(shù)據(jù)集信息:
沃爾伯格博士報告其臨床病例后,樣品會定期到達。因此,數(shù)據(jù)庫反映了數(shù)據(jù)的時間順序分組。該分組信息已從數(shù)據(jù)本身中刪除,立即顯示在下面:
組1:367個實例(1989年1月)
組2:70個實例(1989年 10月)
組3:31個實例(1990年2月)
組4:17個實例(1990年4月) )
組5:48個實例(1990年8月)
組6:49個實例(1991年1月更新)
組7:31個實例(1991年6月)
組8:86個實例(1991年11月)
總計:699分
屬性信息:
1.樣本代碼編號:id編號
2.團塊厚度:1-10
3.細胞大小的均勻性:1-10
4.細胞形狀的均勻性:1-10
5.邊緣附著力:1-10
6.單層上皮細胞大小:1-10
7.裸核:1-10
8.乏味染色質(zhì):1-10
9.正常核仁:1-10
10.線粒體:1-10
11.類別:(良性2,惡性4)
注意數(shù)據(jù)有缺失,用?代替的,我們需要對數(shù)據(jù)進行預(yù)處理。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
def logistic():
"""
利用邏輯回歸預(yù)測癌癥
:return:
"""
#加載數(shù)據(jù)集
names = ['Sample code number',' Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape',
'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin',
'Normal Nucleoli','Mitoses','Class']
data = pd.read_csv('../../../數(shù)據(jù)集/機器學(xué)習(xí)/回歸算法/乳腺癌數(shù)據(jù)集/breast-cancer-wisconsin.data',names=names)
#數(shù)據(jù)集預(yù)處理,缺失值刪除
data = data.replace(to_replace='?',value=np.nan)
data = data.dropna()
#進行數(shù)據(jù)的分割
x_train,x_test,y_train,y_test = train_test_split(data.loc[:,'Sample code number':'Mitoses'],data.loc[:,'Class'],test_size=0.25)
#特征值的標(biāo)準(zhǔn)化
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
#使用邏輯回歸進行預(yù)測
lr = LogisticRegression(C=1.0)
lr.fit(x_train,y_train)
print(lr.coef_)
y_predict = lr.predict(x_test)
#輸出準(zhǔn)確率
print("準(zhǔn)確率為:",lr.score(x_test,y_test))
#輸出召回率
print("召回率:",classification_report(y_test,y_predict,labels=[2,4],target_names=["良性","惡性"]))
# print(x_train)
return None
if __name__ == "__main__":
logistic()

總結(jié)
- 優(yōu)點:簡單、速度快,適合需要得到一個分類概率的場景
- 缺點:不好處理多分類的問題
生成模型和判別模型
我們判斷一個算法是生成模型還是判別模型的依據(jù)是有沒有先驗概率,即是否需要從歷史數(shù)據(jù)總結(jié)出概率信息。
| 判別模型 | 生成模型(先驗概率) | |
|---|---|---|
| 算法 | 邏輯回歸 | 樸素貝葉斯 |
| 解決問題 | 二分類 | 多分類 |
| 應(yīng)用場景 | 癌癥、二分類需要概率 | 文本分類 |
| 參數(shù) | 正則化力度 | 沒有 |
但是得出的結(jié)果都有概率解釋。
判斷模型:k-近鄰、決策樹、隨機森林、神經(jīng)網(wǎng)絡(luò)、邏輯回歸
生成模型:樸素貝葉斯、隱馬爾科夫模型
邏輯斯蒂回歸算法我們就講到這里,相對來說理解了線性回歸之后,理解邏輯回歸就非常簡單了,邏輯回歸是對線性回歸的結(jié)果進行了sigmoid優(yōu)化,通過梯度下降算法求解的過程。