邏輯回歸(Logistic Regression)

一、分類問題

在分類問題中,你要預(yù)測的變量 y 是離散的值,我們將學(xué)習(xí)一種叫做邏輯回歸 (Logistic Regression) 的算法,這是目前最流行使用最廣泛的一種學(xué)習(xí)算法。
在分類問題中,我們嘗試預(yù)測的是結(jié)果是否屬于某一個類(例如正確或錯誤)。分類問題的例子有:判斷一封電子郵件是否是垃圾郵件;判斷一次金融交易是否是欺詐;之前我們也談到了腫瘤分類問題的例子,區(qū)別一個腫瘤是惡性的還是良性的。
我們將因變量(dependent variable)可能屬于的兩個類分別稱為負(fù)向類(negative class)和正向類(positive class),則因變量{ 0,1 } ,其中 0 表示負(fù)向類,1 表示正向類。


如果我們要用線性回歸算法來解決一個分類問題,對于分類, y 取值為 0 或者1,但如果你使用的是線性回歸,那么假設(shè)函數(shù)的輸出值可能遠(yuǎn)大于 1,或者遠(yuǎn)小于0,即使所有訓(xùn)練樣本的標(biāo)簽 y 都等于 0 或 1。盡管我們知道標(biāo)簽應(yīng)該取值0 或者1,但是如果算法得到的值遠(yuǎn)大于1或者遠(yuǎn)小于0的話,就會感覺很奇怪。所以我們在接下來的要研究的算法就叫做邏輯回歸算法,這個算法的性質(zhì)是:它的輸出值永遠(yuǎn)在0到 1 之間。

順便說一下,邏輯回歸算法是分類算法,我們將它作為分類算法使用。有時候可能因為這個算法的名字中出現(xiàn)了“回歸”使你感到困惑,但邏輯回歸算法實際上是一種分類算法,它適用于標(biāo)簽 y 取值離散的情況,如:1 0 0 1。

二、假說表示

在這段視頻中,我要給你展示假設(shè)函數(shù)的表達(dá)式,也就是說,在分類問題中,要用什么樣的函數(shù)來表示我們的假設(shè)。此前我們說過,希望我們的分類器的輸出值在0和1之間,因此,我們希望想出一個滿足某個性質(zhì)的假設(shè)函數(shù),這個性質(zhì)是它的預(yù)測值要在0和1之間。
我們引入一個新的模型,邏輯回歸,該模型的輸出變量范圍始終在0和1之間。 邏輯回歸模型的假設(shè)是: h_\theta \left( x \right)=g\left(\theta^{T}X \right) 其中: X 代表特征向量 g 代表邏輯函數(shù)(logistic function)是一個常用的邏輯函數(shù)為S形函數(shù)(Sigmoid function),公式為: g\left( z \right)=\frac{1}{1+{{e}^{-z}}}。
該函數(shù)的圖像為:

合起來,我們得到邏輯回歸模型的假設(shè):

對模型的理解: g\left( z \right)=\frac{1}{1+{{e}^{-z}}}。

h_\theta \left( x \right)的作用是,對于給定的輸入變量,根據(jù)選擇的參數(shù)計算輸出變量=1的可能性(estimated probablity)即h_\theta \left( x \right)=P\left( y=1|x;\theta \right) 例如,如果對于給定的x,通過已經(jīng)確定的參數(shù)計算得出h_\theta \left( x \right)=0.7,則表示有70%的幾率y為正向類,相應(yīng)地y為負(fù)向類的幾率為1-0.7=0.3。

三、邊界判定

現(xiàn)在講下決策邊界(decision boundary)的概念。這個概念能更好地幫助我們理解邏輯回歸的假設(shè)函數(shù)在計算什么。

在邏輯回歸中,我們預(yù)測:

當(dāng){h_\theta}\left( x \right)>=0.5時,預(yù)測 y=1。

當(dāng){h_\theta}\left( x \right)<0.5時,預(yù)測 y=0 。

根據(jù)上面繪制出的 S 形函數(shù)圖像,我們知道當(dāng)

z=0g(z)=0.5

z>0g(z)>0.5

z<0g(z)<0.5

z={\theta^{T}}x ,即: {\theta^{T}}x>=0 時,預(yù)測 y=1 {\theta^{T}}x<0 時,預(yù)測 y=0
現(xiàn)在假設(shè)我們有一個模型:


并且參數(shù)\theta 是向量[-3 1 1]。 則當(dāng)-3+{x_1}+{x_2} \geq 0,即{x_1}+{x_2} \geq 3時,模型將預(yù)測 y=1。 我們可以繪制直線{x_1}+{x_2} = 3,這條線便是我們模型的分界線,將預(yù)測為1的區(qū)域和預(yù)測為 0的區(qū)域分隔開。

假使我們的數(shù)據(jù)呈現(xiàn)這樣的分布情況,怎樣的模型才能適合呢?

因為需要用曲線才能分隔 y=0 的區(qū)域和 y=1 的區(qū)域,我們需要二次方特征:{h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}^{2}+{\theta_{4}}x_{2}^{2} \right)是[-1 0 0 1 1],則我們得到的判定邊界恰好是圓點在原點且半徑為1的圓形。

我們可以用非常復(fù)雜的模型來適應(yīng)非常復(fù)雜形狀的判定邊界。

四、代價函數(shù)

我們要介紹如何擬合邏輯回歸模型的參數(shù)\theta。具體來說,我要定義用來擬合參數(shù)的優(yōu)化目標(biāo)或者叫代價函數(shù),這便是監(jiān)督學(xué)習(xí)問題中的邏輯回歸模型的擬合問題。


對于線性回歸模型,我們定義的代價函數(shù)是所有模型誤差的平方和。理論上來說,我們也可以對邏輯回歸模型沿用這個定義,但是問題在于,當(dāng)我們將{h_\theta}\left( x \right)=\frac{1}{1+{e^{-\theta^{T}x}}}帶入到這樣定義了的代價函數(shù)中時,我們得到的代價函數(shù)將是一個非凸函數(shù)(non-convexfunction)。

這意味著我們的代價函數(shù)有許多局部最小值,這將影響梯度下降算法尋找全局最小值。

線性回歸的代價函數(shù)為:J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{1}{2}{{\left( {h_\theta}\left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}} 。 我們重新定義邏輯回歸的代價函數(shù)為:J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)},其中


{h_\theta}\left( x \right)Cost\left( {h_\theta}\left( x \right),y \right)之間的關(guān)系如下圖所示:

這樣構(gòu)建的Cost\left( {h_\theta}\left( x \right),y \right)函數(shù)的特點是:當(dāng)實際的 y=1{h_\theta}\left( x \right)也為 1 時誤差為 0,當(dāng) y=1{h_\theta}\left( x \right)不為1時誤差隨著{h_\theta}\left( x \right)變小而變大;當(dāng)實際的 y=0{h_\theta}\left( x \right)也為 0 時代價為 0,當(dāng)y=0{h_\theta}\left( x \right)不為 0時誤差隨著 {h_\theta}\left( x \right)的變大而變大。 將構(gòu)建的 Cost\left( {h_\theta}\left( x \right),y \right)簡化如下: Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right) 帶入代價函數(shù)得到: J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} 即:J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}
在得到這樣一個代價函數(shù)以后,我們便可以用梯度下降算法來求得能使代價函數(shù)最小的參數(shù)了。算法為:

Repeat { \theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta) (simultaneously update all ) }

求導(dǎo)后得到:

Repeat { \theta_j := \theta_j - \alpha \frac{1}{m}\sum\limits_{i=1}^{m}{{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right)-\mathop{y}^{\left( i \right)} \right)}}\mathop{x}_{j}^{(i)} (simultaneously update all ) }

在這個視頻中,我們定義了單訓(xùn)練樣本的代價函數(shù),凸性分析的內(nèi)容是超出這門課的范圍的,但是可以證明我們所選的代價值函數(shù)會給我們一個凸優(yōu)化問題。代價函數(shù)J(\theta)會是一個凸函數(shù),并且沒有局部最優(yōu)值。

推導(dǎo)過程:

J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} 考慮: {h_\theta}\left( {{x}^{(i)}} \right)=\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} 則: {{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right) ={{y}^{(i)}}\log \left( \frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right) =-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^T}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^T}{{x}^{(i)}}}} \right)

所以: \frac{\partial }{\partial {\theta_{j}}}J\left( \theta \right)=\frac{\partial }{\partial {\theta_{j}}}[-\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^{T}}{{x}^{(i)}}}} \right)]}] =-\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\frac{-x_{j}^{(i)}{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}{1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}}] =-\frac{1}{m}\sum\limits_{i=1}^{m}{{y}^{(i)}}\frac{x_j^{(i)}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}] =-\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{{{y}^{(i)}}x_j^{(i)}-x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}+{{y}^{(i)}}x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{{{y}^{(i)}}\left( 1\text{+}{{e}^{{\theta^T}{{x}^{(i)}}}} \right)-{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}x_j^{(i)}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}-\frac{{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}-{h_\theta}\left( {{x}^{(i)}} \right)]x_j^{(i)}} =\frac{1}{m}\sum\limits_{i=1}^{m}{[{h_\theta}\left( {{x}^{(i)}} \right)-{{y}^{(i)}}]x_j^{(i)}}

注:雖然得到的梯度下降算法表面上看上去與線性回歸的梯度下降算法一樣,但是這里的{h_\theta}\left( x \right)=g\left( {\theta^T}X \right)與線性回歸中不同,所以實際上是不一樣的。另外,在運行梯度下降算法之前,進(jìn)行特征縮放依舊是非常必要的。

五、使用scikit-learn實現(xiàn)邏輯回歸

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

np.random.seed(666)
X = np.random.normal(0, 1, size=(200, 2))
y = np.array((X[:,0]**2+X[:,1])<1.5, dtype='int')
for _ in range(20):
    y[np.random.randint(200)] = 1

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)

log_reg.score(X_train, y_train)
#0.79333333333333333
log_reg.score(X_test, y_test)
#Output:0.85999999999999999

使用多項式進(jìn)行邏輯回歸

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

def PolynomialLogisticRegression(degree):
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression())
    ])
poly_log_reg = PolynomialLogisticRegression(degree=2)
poly_log_reg.fit(X_train, y_train)

poly_log_reg.score(X_train, y_train)
#Output:0.91333333333333333
poly_log_reg.score(X_test, y_test)
#Output:0.93999999999999995

六、多分類

對于一個多類分類問題,我們的數(shù)據(jù)集或許看起來像這樣:


我用3種不同的符號來代表3個類別,問題就是給出3個類型的數(shù)據(jù)集,我們?nèi)绾蔚玫揭粋€學(xué)習(xí)算法來進(jìn)行分類呢?
我們現(xiàn)在已經(jīng)知道如何進(jìn)行二元分類,可以使用邏輯回歸,對于直線或許你也知道,可以將數(shù)據(jù)集一分為二為正類和負(fù)類。用一對多的分類思想,我們可以將其用在多類分類問題上。
下面將介紹如何進(jìn)行一對多的分類工作,有時這個方法也被稱為"一對余"方法。

現(xiàn)在我們有一個訓(xùn)練集,好比上圖表示的有3個類別,我們用三角形表示 y=1,方框表示y=2,叉叉表示 y=3。我們下面要做的就是使用一個訓(xùn)練集,將其分成3個二元分類問題。

我們先從用三角形代表的類別1開始,實際上我們可以創(chuàng)建一個,新的"偽"訓(xùn)練集,類型2和類型3定為負(fù)類,類型1設(shè)定為正類,我們創(chuàng)建一個新的訓(xùn)練集,如下圖所示的那樣,我們要擬合出一個合適的分類器。



這里的三角形是正樣本,而圓形代表負(fù)樣本??梢赃@樣想,設(shè)置三角形的值為1,圓形的值為0,下面我們來訓(xùn)練一個標(biāo)準(zhǔn)的邏輯回歸分類器,這樣我們就得到一個正邊界。

為了能實現(xiàn)這樣的轉(zhuǎn)變,我們將多個類中的一個類標(biāo)記為正向類(y=1),然后將其他所有類都標(biāo)記為負(fù)向類,這個模型記作h_\theta^{\left( 1 \right)}\left( x \right)。接著,類似地第我們選擇另一個類標(biāo)記為正向類(y=2),再將其它類都標(biāo)記為負(fù)向類,將這個模型記作 h_\theta^{\left( 2 \right)}\left( x \right),依此類推。 最后我們得到一系列的模型簡記為: h_\theta^{\left( i \right)}\left( x \right)=p\left( y=i|x;\theta \right)其中:i=\left( 1,2,3....k \right)

最后,在我們需要做預(yù)測時,我們將所有的分類機(jī)都運行一遍,然后對每一個輸入變量,都選擇最高可能性的輸出變量。

總之,我們已經(jīng)把要做的做完了,現(xiàn)在要做的就是訓(xùn)練這個邏輯回歸分類器:h_\theta^{\left( i \right)}\left( x \right), 其中 i 對應(yīng)每一個可能的 y=i,最后,為了做出預(yù)測,我們給出輸入一個新的 x 值,用這個做預(yù)測。我們要做的就是在我們?nèi)齻€分類器里面輸入 x,然后我們選擇一個讓 h_\theta^{\left( i \right)}\left( x \right) 最大的i,即\mathop{\max}\limits_i,h_\theta^{\left( i \right)}\left( x \right)

你現(xiàn)在知道了基本的挑選分類器的方法,選擇出哪一個分類器是可信度最高效果最好的,那么就可認(rèn)為得到一個正確的分類,無論i值是多少,我們都有最高的概率值,我們預(yù)測y就是那個值。這就是多類別分類問題,以及一對多的方法,通過這個小方法,你現(xiàn)在也可以將邏輯回歸分類器用在多類分類的問題上。

使用scikit實現(xiàn)多分類
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data[:,:2]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

from sklearn.linear_model import LogisticRegression

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

相關(guān)閱讀更多精彩內(nèi)容

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