一、分類(lèi)問(wèn)題
在分類(lèi)問(wèn)題中叁扫,你要預(yù)測(cè)的變量 是離散的值卵酪,我們將學(xué)習(xí)一種叫做邏輯回歸 (Logistic Regression) 的算法的诵,這是目前最流行使用最廣泛的一種學(xué)習(xí)算法。
在分類(lèi)問(wèn)題中匪补,我們嘗試預(yù)測(cè)的是結(jié)果是否屬于某一個(gè)類(lèi)(例如正確或錯(cuò)誤)伞辛。分類(lèi)問(wèn)題的例子有:判斷一封電子郵件是否是垃圾郵件;判斷一次金融交易是否是欺詐夯缺;之前我們也談到了腫瘤分類(lèi)問(wèn)題的例子蚤氏,區(qū)別一個(gè)腫瘤是惡性的還是良性的。
我們將因變量(dependent variable)可能屬于的兩個(gè)類(lèi)分別稱為負(fù)向類(lèi)(negative class)和正向類(lèi)(positive class)踊兜,則因變量{ 0,1 } 竿滨,其中 0 表示負(fù)向類(lèi),1 表示正向類(lèi)捏境。
如果我們要用線性回歸算法來(lái)解決一個(gè)分類(lèi)問(wèn)題于游,對(duì)于分類(lèi), 取值為 0 或者1垫言,但如果你使用的是線性回歸贰剥,那么假設(shè)函數(shù)的輸出值可能遠(yuǎn)大于 1,或者遠(yuǎn)小于0筷频,即使所有訓(xùn)練樣本的標(biāo)簽 都等于 0 或 1蚌成。盡管我們知道標(biāo)簽應(yīng)該取值0 或者1柱告,但是如果算法得到的值遠(yuǎn)大于1或者遠(yuǎn)小于0的話,就會(huì)感覺(jué)很奇怪笑陈。所以我們?cè)诮酉聛?lái)的要研究的算法就叫做邏輯回歸算法,這個(gè)算法的性質(zhì)是:它的輸出值永遠(yuǎn)在0到 1 之間葵袭。
順便說(shuō)一下涵妥,邏輯回歸算法是分類(lèi)算法,我們將它作為分類(lèi)算法使用坡锡。有時(shí)候可能因?yàn)檫@個(gè)算法的名字中出現(xiàn)了“回歸”使你感到困惑蓬网,但邏輯回歸算法實(shí)際上是一種分類(lèi)算法,它適用于標(biāo)簽 取值離散的情況鹉勒,如:1 0 0 1帆锋。
二、假說(shuō)表示
在這段視頻中禽额,我要給你展示假設(shè)函數(shù)的表達(dá)式锯厢,也就是說(shuō),在分類(lèi)問(wèn)題中脯倒,要用什么樣的函數(shù)來(lái)表示我們的假設(shè)实辑。此前我們說(shuō)過(guò),希望我們的分類(lèi)器的輸出值在0和1之間藻丢,因此剪撬,我們希望想出一個(gè)滿足某個(gè)性質(zhì)的假設(shè)函數(shù),這個(gè)性質(zhì)是它的預(yù)測(cè)值要在0和1之間悠反。
我們引入一個(gè)新的模型残黑,邏輯回歸,該模型的輸出變量范圍始終在0和1之間斋否。 邏輯回歸模型的假設(shè)是: 其中: 代表特征向量 代表邏輯函數(shù)(logistic function)是一個(gè)常用的邏輯函數(shù)為S形函數(shù)(Sigmoid function)梨水,公式為: 。
該函數(shù)的圖像為:
合起來(lái)茵臭,我們得到邏輯回歸模型的假設(shè):
對(duì)模型的理解: 冰木。
的作用是,對(duì)于給定的輸入變量笼恰,根據(jù)選擇的參數(shù)計(jì)算輸出變量=1的可能性(estimated probablity)即 例如踊沸,如果對(duì)于給定的,通過(guò)已經(jīng)確定的參數(shù)計(jì)算得出社证,則表示有70%的幾率為正向類(lèi)逼龟,相應(yīng)地為負(fù)向類(lèi)的幾率為1-0.7=0.3。
三追葡、邊界判定
現(xiàn)在講下決策邊界(decision boundary)的概念腺律。這個(gè)概念能更好地幫助我們理解邏輯回歸的假設(shè)函數(shù)在計(jì)算什么奕短。
在邏輯回歸中,我們預(yù)測(cè):
當(dāng)時(shí)匀钧,預(yù)測(cè) 翎碑。
當(dāng)時(shí),預(yù)測(cè) 之斯。
根據(jù)上面繪制出的 S 形函數(shù)圖像日杈,我們知道當(dāng)
時(shí)
時(shí)
時(shí)
又 ,即: 時(shí)佑刷,預(yù)測(cè) 時(shí)莉擒,預(yù)測(cè)
現(xiàn)在假設(shè)我們有一個(gè)模型:
并且參數(shù) 是向量[-3 1 1]。 則當(dāng)瘫絮,即時(shí)涨冀,模型將預(yù)測(cè) 。 我們可以繪制直線麦萤,這條線便是我們模型的分界線鹿鳖,將預(yù)測(cè)為1的區(qū)域和預(yù)測(cè)為 0的區(qū)域分隔開(kāi)。
假使我們的數(shù)據(jù)呈現(xiàn)這樣的分布情況壮莹,怎樣的模型才能適合呢栓辜?
因?yàn)樾枰们€才能分隔 的區(qū)域和 的區(qū)域,我們需要二次方特征:是[-1 0 0 1 1]垛孔,則我們得到的判定邊界恰好是圓點(diǎn)在原點(diǎn)且半徑為1的圓形藕甩。
我們可以用非常復(fù)雜的模型來(lái)適應(yīng)非常復(fù)雜形狀的判定邊界。
四周荐、代價(jià)函數(shù)
我們要介紹如何擬合邏輯回歸模型的參數(shù)狭莱。具體來(lái)說(shuō),我要定義用來(lái)擬合參數(shù)的優(yōu)化目標(biāo)或者叫代價(jià)函數(shù)概作,這便是監(jiān)督學(xué)習(xí)問(wèn)題中的邏輯回歸模型的擬合問(wèn)題腋妙。
對(duì)于線性回歸模型,我們定義的代價(jià)函數(shù)是所有模型誤差的平方和讯榕。理論上來(lái)說(shuō)骤素,我們也可以對(duì)邏輯回歸模型沿用這個(gè)定義,但是問(wèn)題在于愚屁,當(dāng)我們將帶入到這樣定義了的代價(jià)函數(shù)中時(shí)济竹,我們得到的代價(jià)函數(shù)將是一個(gè)非凸函數(shù)(non-convexfunction)。
這意味著我們的代價(jià)函數(shù)有許多局部最小值霎槐,這將影響梯度下降算法尋找全局最小值送浊。
線性回歸的代價(jià)函數(shù)為: 。 我們重新定義邏輯回歸的代價(jià)函數(shù)為:丘跌,其中
與 之間的關(guān)系如下圖所示:
這樣構(gòu)建的函數(shù)的特點(diǎn)是:當(dāng)實(shí)際的 且也為 1 時(shí)誤差為 0袭景,當(dāng) 但不為1時(shí)誤差隨著變小而變大唁桩;當(dāng)實(shí)際的 且也為 0 時(shí)代價(jià)為 0,當(dāng) 但不為 0時(shí)誤差隨著 的變大而變大耸棒。 將構(gòu)建的 簡(jiǎn)化如下: 帶入代價(jià)函數(shù)得到: 即:
在得到這樣一個(gè)代價(jià)函數(shù)以后荒澡,我們便可以用梯度下降算法來(lái)求得能使代價(jià)函數(shù)最小的參數(shù)了。算法為:
Repeat { (simultaneously update all ) }
求導(dǎo)后得到:
Repeat { (simultaneously update all ) }
在這個(gè)視頻中与殃,我們定義了單訓(xùn)練樣本的代價(jià)函數(shù)单山,凸性分析的內(nèi)容是超出這門(mén)課的范圍的,但是可以證明我們所選的代價(jià)值函數(shù)會(huì)給我們一個(gè)凸優(yōu)化問(wèn)題奈籽。代價(jià)函數(shù)會(huì)是一個(gè)凸函數(shù),并且沒(méi)有局部最優(yōu)值鸵赫。
推導(dǎo)過(guò)程:
考慮: 則:
所以:
注:雖然得到的梯度下降算法表面上看上去與線性回歸的梯度下降算法一樣衣屏,但是這里的與線性回歸中不同,所以實(shí)際上是不一樣的辩棒。另外狼忱,在運(yùn)行梯度下降算法之前,進(jìn)行特征縮放依舊是非常必要的一睁。
五钻弄、使用scikit-learn實(shí)現(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
使用多項(xiàng)式進(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
六、多分類(lèi)
對(duì)于一個(gè)多類(lèi)分類(lèi)問(wèn)題者吁,我們的數(shù)據(jù)集或許看起來(lái)像這樣:
我用3種不同的符號(hào)來(lái)代表3個(gè)類(lèi)別窘俺,問(wèn)題就是給出3個(gè)類(lèi)型的數(shù)據(jù)集,我們?nèi)绾蔚玫揭粋€(gè)學(xué)習(xí)算法來(lái)進(jìn)行分類(lèi)呢复凳?
我們現(xiàn)在已經(jīng)知道如何進(jìn)行二元分類(lèi)瘤泪,可以使用邏輯回歸,對(duì)于直線或許你也知道育八,可以將數(shù)據(jù)集一分為二為正類(lèi)和負(fù)類(lèi)对途。用一對(duì)多的分類(lèi)思想,我們可以將其用在多類(lèi)分類(lèi)問(wèn)題上髓棋。
下面將介紹如何進(jìn)行一對(duì)多的分類(lèi)工作实檀,有時(shí)這個(gè)方法也被稱為"一對(duì)余"方法。
現(xiàn)在我們有一個(gè)訓(xùn)練集按声,好比上圖表示的有3個(gè)類(lèi)別膳犹,我們用三角形表示 ,方框表示签则,叉叉表示 镣奋。我們下面要做的就是使用一個(gè)訓(xùn)練集,將其分成3個(gè)二元分類(lèi)問(wèn)題怀愧。
我們先從用三角形代表的類(lèi)別1開(kāi)始侨颈,實(shí)際上我們可以創(chuàng)建一個(gè)余赢,新的"偽"訓(xùn)練集,類(lèi)型2和類(lèi)型3定為負(fù)類(lèi)哈垢,類(lèi)型1設(shè)定為正類(lèi)妻柒,我們創(chuàng)建一個(gè)新的訓(xùn)練集,如下圖所示的那樣耘分,我們要擬合出一個(gè)合適的分類(lèi)器举塔。
這里的三角形是正樣本,而圓形代表負(fù)樣本求泰⊙朐可以這樣想,設(shè)置三角形的值為1渴频,圓形的值為0芽丹,下面我們來(lái)訓(xùn)練一個(gè)標(biāo)準(zhǔn)的邏輯回歸分類(lèi)器,這樣我們就得到一個(gè)正邊界卜朗。
為了能實(shí)現(xiàn)這樣的轉(zhuǎn)變拔第,我們將多個(gè)類(lèi)中的一個(gè)類(lèi)標(biāo)記為正向類(lèi)(),然后將其他所有類(lèi)都標(biāo)記為負(fù)向類(lèi)场钉,這個(gè)模型記作蚊俺。接著,類(lèi)似地第我們選擇另一個(gè)類(lèi)標(biāo)記為正向類(lèi)()逛万,再將其它類(lèi)都標(biāo)記為負(fù)向類(lèi)泳猬,將這個(gè)模型記作 ,依此類(lèi)推。 最后我們得到一系列的模型簡(jiǎn)記為: 其中:
最后宇植,在我們需要做預(yù)測(cè)時(shí)暂殖,我們將所有的分類(lèi)機(jī)都運(yùn)行一遍,然后對(duì)每一個(gè)輸入變量当纱,都選擇最高可能性的輸出變量呛每。
總之,我們已經(jīng)把要做的做完了坡氯,現(xiàn)在要做的就是訓(xùn)練這個(gè)邏輯回歸分類(lèi)器:晨横, 其中 對(duì)應(yīng)每一個(gè)可能的 ,最后箫柳,為了做出預(yù)測(cè)手形,我們給出輸入一個(gè)新的 值,用這個(gè)做預(yù)測(cè)悯恍。我們要做的就是在我們?nèi)齻€(gè)分類(lèi)器里面輸入 库糠,然后我們選擇一個(gè)讓 最大的,即。
你現(xiàn)在知道了基本的挑選分類(lèi)器的方法瞬欧,選擇出哪一個(gè)分類(lèi)器是可信度最高效果最好的贷屎,那么就可認(rèn)為得到一個(gè)正確的分類(lèi),無(wú)論值是多少艘虎,我們都有最高的概率值唉侄,我們預(yù)測(cè)就是那個(gè)值。這就是多類(lèi)別分類(lèi)問(wèn)題野建,以及一對(duì)多的方法属划,通過(guò)這個(gè)小方法,你現(xiàn)在也可以將邏輯回歸分類(lèi)器用在多類(lèi)分類(lèi)的問(wèn)題上候生。
使用scikit實(shí)現(xiàn)多分類(lèi)
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)