python機(jī)器學(xué)習(xí)(六)回歸算法-邏輯回歸

邏輯回歸

同步更新在個人網(wǎng)站:http://www.wangpengcufe.com/machinelearning/pythonml-pythonml6/

一、概述

1.1、概念

是一種名為“回歸”的線性分類器,是由線性回歸變化而來的,一種廣泛使用于分類問題中的廣義回歸算法。

1.2、按預(yù)測標(biāo)簽的數(shù)據(jù)類型分

連續(xù)型變量:通過線性回歸方程z,線性回歸使用輸入的特征矩陣X來輸出一組連續(xù)型的標(biāo)簽值y_pred,以完成各種預(yù)測連續(xù)型變量的任務(wù)(比如預(yù)測產(chǎn)品銷量,預(yù)測股價等等)
離散型變量:通過Sigmoid函數(shù)變換,線性回歸方程z變換為g(z),使得模型的值分布在(0,1)之間,且當(dāng)g(z)接近0時樣本的標(biāo)簽為類別0,當(dāng)g(z)接近1時樣本的標(biāo)簽為類別1,這樣就得到了一個分類模型。

線性回歸方程式

1.3、公式

公式

其中,y(x)就是我們邏輯回歸返回的標(biāo)簽值。

1.4、本質(zhì)

y(x)的形似幾率取對數(shù)就是線性回歸,對數(shù)幾率回歸,就是邏輯回歸。

二、重要概念

Sigmoid函數(shù):Sigmoid函數(shù)是一個S型的函數(shù),當(dāng)自變量z趨近正無窮時,因變量g(z)趨近于1,而當(dāng)z趨近負(fù)無窮時,g(z)趨近于0,它能夠?qū)⑷魏螌?shí)數(shù)映射到(0,1)區(qū)間,使其可用于將任意值函數(shù)轉(zhuǎn)換為更適合二分類的函數(shù)。

Sigmoid函數(shù)

Sigmoid函數(shù)公式

因?yàn)檫@個性質(zhì),Sigmoid函數(shù)也被當(dāng)作是歸一化的一種方法,與我們之前學(xué)過的MinMaxSclaer同理,是屬于數(shù)據(jù)預(yù)處理中的“縮放”功能,可以將數(shù)據(jù)壓縮到[0,1]之內(nèi)。區(qū)別在于,MinMaxScaler歸一化之后,是可以取到0和1的(最大值歸一化后就是1,最小值歸一化后就是0),但Sigmoid函數(shù)只是無限趨近于0和1。

損失函數(shù):是一個評估指標(biāo),來衡量參數(shù)為 的模型擬合訓(xùn)練集時產(chǎn)生的信息損失的大小,并以此衡量參數(shù)的優(yōu)劣。
損失函數(shù)小,模型在訓(xùn)練集上表現(xiàn)優(yōu)異,擬合充分,參數(shù)優(yōu)秀。
損失函數(shù)大,模型在訓(xùn)練集上表現(xiàn)差勁,擬合不足,參數(shù)糟糕。
我們追求,能夠讓損失函數(shù)最小化的參數(shù)組合。
注意:沒有”求解參數(shù)“需求的模型沒有損失函數(shù),比如KNN,決策樹。

損失函數(shù)公式

θ表示求解出來的一組參數(shù),m是樣本的個數(shù), yi 是樣本 i 上真實(shí)的標(biāo)簽, yθ(xi)是樣本 i 上,基于參數(shù)θ計(jì)算出來的邏輯回歸返回值,xi 是樣本 i 各個特征的取值。我們的目標(biāo),就是求解出使 J(θ)最小的 θ 取值。注意,在邏輯回歸的本質(zhì)函數(shù)y(x)里,特征矩陣x是自變量,參數(shù)是 θ。但在損失函數(shù)中,參數(shù)θ是損失函數(shù)的自變量,x和y都是已知的特征矩陣和標(biāo)簽,相當(dāng)于是損失函數(shù)的參數(shù)。不同的函數(shù)中,自變量和參數(shù)各有不同,因此大家需要在數(shù)學(xué)計(jì)算中,尤其是求導(dǎo)的時候避免混淆。

三、sklearn中的邏輯回歸

linear_model.LogisticRegression 邏輯回歸分類器(又叫l(wèi)ogit回歸,最大熵分類器
linear_model.SGDClassifier 利用梯度下降求解的線性分類器(SVM,邏輯回歸等等)
linear_model.SGDRegressor 利用梯度下降最小化正則化后的損失函數(shù)的線性回歸模型

metrics.log_loss 對數(shù)損失,又稱邏輯損失或交叉熵?fù)p失
metrics.confusion_matrix 混淆矩陣,模型評估指標(biāo)之一
metrics.roc_auc_score ROC曲線,模型評估指標(biāo)之一
metrics.accuracy_score 精確性,模型評估指標(biāo)之一

sklearn.linear_model.LogisticRegression(penalty='l2', C = 1.0)
Logistic: 回歸分類器
coef_:回歸系數(shù)

四、重要參數(shù)

正則化參數(shù), penalty&C:

正則化: 是用來防止模型過擬合的過程,常用的有L1正則化和L2正則化兩種選項(xiàng),分別通過在損失函數(shù)后加上參數(shù)向量 的L1范式和L2范式的倍數(shù)來實(shí)現(xiàn)。這個增加的范式,被稱為“正則項(xiàng)”,也被稱為"懲罰項(xiàng)"。

penalty: 可以輸入"l1"或"l2"來指定使用哪一種正則化方式,不填寫默認(rèn)"l2"。
注意,若選擇"l1"正則化,參數(shù)solver僅能夠使用求解方式”liblinear"和"saga“,若使用“l(fā)2”正則化,參數(shù)solver中所有的求解方式都可以使用。

C:C正則化強(qiáng)度的倒數(shù),必須是一個大于0的浮點(diǎn)數(shù),不填寫默認(rèn)1.0,即默認(rèn)正則項(xiàng)與損失函數(shù)的比值是1:1。C越小,損失函數(shù)會越小,模型對損失函數(shù)的懲罰越重,正則化的效力越強(qiáng),參數(shù)會逐漸被壓縮得越來越小。

# L1正則化和L2正則化的比較
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
data = load_breast_cancer()
X = data.data
y = data.target
data.data.shape
lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)
#邏輯回歸的重要屬性coef_,查看每個特征所對應(yīng)的參數(shù)
lrl1 = lrl1.fit(X,y)
lrl1.coef_
lrl1.coef_輸出結(jié)果
(lrl1.coef_ != 0).sum(axis=1)
lrl2 = lrl2.fit(X,y)
lrl2.coef_

lrl2.coef_輸出結(jié)果

結(jié)論:L1正則化會將參數(shù)壓縮為0,L2正則化只會讓參數(shù)盡量小,不會取到0。

max_iter:
邏輯回歸的數(shù)學(xué)目的是求解能夠讓模型最優(yōu)化,擬合程度最好的參數(shù)的值,即求解能夠讓損失函數(shù) 最小化的值。對于二元邏輯回歸來說,有多種方法可以用來求解參數(shù) ,最著名的是梯度下降法(Gradient Descent)。

梯度下降法

在這個圖像上隨機(jī)放一個小球,當(dāng)我松手,這個小球就會順著這個華麗的平面滾落,直到滾到深藍(lán)色的區(qū)域——損失函數(shù)的最低點(diǎn)。為了嚴(yán)格監(jiān)控這個小球的行為,我讓小球每次滾動的距離有限,不讓他一次性滾到最低點(diǎn),并且最多只允許它滾動100步,還要記下它每次滾動的方向,直到它滾到圖像上的最低點(diǎn)。

可以看見,小球從高處滑落,在深藍(lán)色的區(qū)域中來回震蕩,最終停留在了圖像凹陷處的某個點(diǎn)上。非常明顯,我們可以觀察到幾個現(xiàn)象:

首先,小球并不是一開始就直向著最低點(diǎn)去的,它先一口氣沖到了藍(lán)色區(qū)域邊緣,后來又折回來,我們已經(jīng)規(guī)定了小球是多次滾動,所以可見,小球每次滾動的方向都是不同的。

另外,小球在進(jìn)入深藍(lán)色區(qū)域后,并沒有直接找到某個點(diǎn),而是在深藍(lán)色區(qū)域中來回震蕩了數(shù)次才停下。這有兩種可能:1) 小球已經(jīng)滾到了圖像的最低點(diǎn),所以停下了,2) 由于我設(shè)定的步數(shù)限制,小球還沒有找到最低點(diǎn),但也只好在100步的時候停下了。也就是說,小球不一定滾到了圖像的最低處。

小球其實(shí)就是一組組的坐標(biāo)點(diǎn)(θ1,θ2,J) ;小球每次滾動的方向就是那一個坐標(biāo)點(diǎn)的梯度向量的方向,因?yàn)槊繚L動一步,小球所在的位置都發(fā)生變化,坐標(biāo)點(diǎn)和坐標(biāo)點(diǎn)對應(yīng)的梯度向量都發(fā)生了變化,所以每次滾動的方向也都不一樣;人為設(shè)置的100次滾動限制,就是sklearn中邏輯回歸的參數(shù)max_iter,代表著能走的最大步數(shù),即最大迭代次數(shù)。

solver:
sklearn為我們提供了多種求解邏輯回歸參數(shù)θ 的方法(梯度下降法是其中著名的一種),讓我們可以使用不同的求解器來計(jì)算邏輯回歸。求解器的選擇,由參數(shù)"solver"控制,共有五種選擇。其中“l(fā)iblinear”是二分類專用,也是現(xiàn)在的默認(rèn)求解器。

  • liblinear : 坐標(biāo)下降法
  • lbfgs:擬牛頓法的一種,利用損失函數(shù)二階導(dǎo)數(shù)矩陣(海森矩陣)來迭代優(yōu)化損失函數(shù)。
  • newton-cg : 牛頓法的一種,利用損失函數(shù)二階導(dǎo)數(shù)矩陣(海森矩陣)來迭代優(yōu)化損失函數(shù)。
  • sag :隨機(jī)平均梯度下降,與普通梯度下降法的區(qū)別是每次迭代僅僅用一部分的樣本來計(jì)算梯度。
  • saga:隨機(jī)平均梯度下降的進(jìn)化,稀疏多項(xiàng)邏輯回歸的首選。

multi_class:
輸入"ovr", "multinomial", "auto"來告知模型,我們要處理的分類問題的類型。默認(rèn)是"ovr"。

  • 'ovr':表示分類問題是二分類,或讓模型使用"一對多"的形式來處理多分類問題。
  • 'multinomial':表示處理多分類問題,這種輸入在參數(shù)solver是'liblinear'時不可用。
  • "auto":表示會根據(jù)數(shù)據(jù)的分類情況和其他參數(shù)來確定模型要處理的分類問題的類型。比如說,如果數(shù)據(jù)是二分
    類,或者solver的取值為"liblinear","auto"會默認(rèn)選擇"ovr"。反之,則會選擇"nultinomial"。

樣本不平衡參數(shù)class_weight:
樣本不平衡是指在一組數(shù)據(jù)集中,標(biāo)簽的一類天生占有很大的比例,或誤分類的代價很高,即我們想要捕捉出某種特定的分類的時候的狀況。

例如:銀行要判斷“一個新客戶是否會違約”,通常不違約的人vs違約的人會是99:1的比例,真正違約的人其實(shí)是非常少的。這種分類狀況下,即便模型什么也不做,全把所有人都當(dāng)成不會違約的人,正確率也能有99%,這使得模型評估指標(biāo)變得毫無意義,根本無法達(dá)到我們的“要識別出會違約的人”的建模目的。

因此我們要使用參數(shù)class_weight對樣本標(biāo)簽進(jìn)行一定的均衡,給少量的標(biāo)簽更多的權(quán)重,讓模型更偏向少數(shù)類,向捕獲少數(shù)類的方向建模。該參數(shù)默認(rèn)None,此模式表示自動給與數(shù)據(jù)集中的所有標(biāo)簽相同的權(quán)重,即自動1:1。當(dāng)誤分類的代價很高的時候,我們使用”balanced“模式,我們只是希望對標(biāo)簽進(jìn)行均衡的時候,什么都不填就可以解決樣本不均衡問題。

五、案例介紹

5.1、數(shù)據(jù)描述
(1)699條樣本,共11列數(shù)據(jù),第一列用語檢索的id,后9列分別是與腫瘤相關(guān)的醫(yī)學(xué)特征,最后一列表示腫瘤類型的數(shù)值。
(2)包含16個缺失值,用”?”標(biāo)出。

原始數(shù)據(jù)的下載地址:
breast-cancer-wisconsin.data: https://url87.ctfile.com/f/21704187-594546064-ee4b93?p=7287 (訪問密碼: 7287)

5.2、特征選擇:
PCA和SVD一般不用,大多數(shù)時候不適用于邏輯回歸。邏輯回歸是由線性回歸演變而來,線性回歸的一個核心目的是通過求解參數(shù)來探究特征X與標(biāo)簽y之間的關(guān)系,而邏輯回歸也傳承了這個性質(zhì),我們常常希望通過邏輯回歸的結(jié)果,來判斷什么樣的特征與分類結(jié)果相關(guān),因此我們希望保留特征的原貌。PCA和SVD的降維結(jié)果是不可解釋的,因此一旦降維后,我們就無法解釋特征和標(biāo)簽之間的關(guān)系了。

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
# 構(gòu)造列標(biāo)簽名字
column = ['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']
# 讀取數(shù)據(jù)
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)
# print(data.head())

5.3、數(shù)據(jù)缺失處理,標(biāo)準(zhǔn)化

# 缺失值進(jìn)行處理
data = data.replace(to_replace='?', value=np.nan)
data = data.dropna()
# 進(jìn)行數(shù)據(jù)的分割
x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)
# 進(jìn)行標(biāo)準(zhǔn)化處理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)

5.4、估計(jì)器流程

# 邏輯回歸預(yù)測
lg = LogisticRegression(C=1.0)
lg.fit(x_train, y_train)
print(lg.coef_)
y_predict = lg.predict(x_test)
print("準(zhǔn)確率:", lg.score(x_test, y_test))
print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "惡性"]))
輸出結(jié)果

六、總結(jié)

應(yīng)用:
廣告點(diǎn)擊率預(yù)測、電商購物搭配推薦、股價預(yù)測、產(chǎn)品銷量預(yù)測

優(yōu)點(diǎn):

  • 線性回歸的數(shù)據(jù)要求:正態(tài)分布,消除多重共線性,現(xiàn)實(shí)數(shù)據(jù)無法滿足;邏輯回歸不需要對數(shù)據(jù)進(jìn)行處理
  • 對線性關(guān)系的擬合效果好
  • 邏輯回歸計(jì)算速度快
  • 返回的分類結(jié)果不是固定的0和1,而是以小數(shù)形式呈現(xiàn)的類概率數(shù)字
  • 抗噪音能力強(qiáng)

缺點(diǎn):當(dāng)特征空間很大時,邏輯回歸的性能不是很好
(看硬件能力)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容