之前的文章學(xué)習(xí)了線性回歸见间,這次來(lái)跟大家分享下我對(duì)邏輯回歸的一些理解。
一工猜、什么是分類問(wèn)題米诉?
這個(gè)其實(shí)很好理解,就比如你手里有一個(gè)蘋(píng)果和一個(gè)橘子篷帅,我們的分類問(wèn)題就是可以描述為如何寫(xiě)一個(gè)算法讓計(jì)算機(jī)認(rèn)出哪個(gè)是蘋(píng)果史侣,哪個(gè)是橘子。
分類問(wèn)題的輸出是不連續(xù)的離散值魏身,比如設(shè)定程序輸出 1 表示蘋(píng)果惊橱,0 表示橘子。但我們之前學(xué)習(xí)的線性回歸的輸出是連續(xù)的箭昵,如預(yù)測(cè)房?jī)r(jià)税朴,肯定不能用 0 和 1 來(lái)表示房?jī)r(jià)。
所以記住一點(diǎn):分類問(wèn)題輸出離散值家制,線性回歸問(wèn)題輸出連續(xù)值正林。
二、什么是邏輯回歸颤殴?
今天要學(xué)習(xí)的這個(gè)邏輯回歸是屬于分類問(wèn)題觅廓,你可能對(duì)「邏輯回歸」有疑惑,既然是分類問(wèn)題涵但,為何要說(shuō)成回歸問(wèn)題杈绸?干嗎不叫邏輯分類問(wèn)題?
我也覺(jué)得有點(diǎn)別扭矮瘟,可誰(shuí)讓大師比我們?cè)缟鰜?lái)呢蝇棉?如果我們?cè)琰c(diǎn)出生,發(fā)明這個(gè)算法芥永,或許就命名為邏輯分類了篡殷,哈哈。
既然改變不了埋涧,我們就只能接受了板辽,把他當(dāng)成分類問(wèn)題記住即可奇瘦。
三、邏輯回歸的假設(shè)函數(shù)
還記得之前線性回歸的假設(shè)函數(shù)嗎劲弦,就是預(yù)測(cè)的模型耳标,我們用的是多項(xiàng)式,但在分類問(wèn)題中我們就要換模型了邑跪,為啥次坡?
很簡(jiǎn)單,我們從分類問(wèn)題和線性回歸問(wèn)題的定義可以知道画畅,線性回歸問(wèn)題輸出連續(xù)值(房?jī)r(jià))砸琅,邏輯回歸只輸出離散值(0 1),所以模型的輸出不一樣轴踱,因此需要選擇一個(gè)能輸出離散值的函數(shù) :
其中 表示特征向量症脂, 表示待學(xué)習(xí)的參數(shù)向量。
但在機(jī)器學(xué)習(xí)分類問(wèn)題中淫僻,模型輸出 0 或者 1 的前一步通常是確定 0 或者 1 的概率诱篷,而不是直接根據(jù)實(shí)例數(shù)據(jù)就輸出 0 或 1,比如模型預(yù)測(cè)是蘋(píng)果的概率是 90%雳灵,那是橘子的概率就是 10%(因?yàn)楦怕屎蜑?1)棕所,進(jìn)而模型認(rèn)為該水果是蘋(píng)果的可能性最大,所以輸出 1 來(lái)表示當(dāng)前識(shí)別的水果是蘋(píng)果悯辙。
根據(jù)這個(gè)概率特性橙凳,我們的邏輯回歸假設(shè)函數(shù)取一個(gè)常用的邏輯函數(shù) Sigmoid Function:
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
使用這個(gè)函數(shù)來(lái)做為邏輯回歸的假設(shè)函數(shù),這樣就能根據(jù)輸入?yún)?shù) 來(lái)輸出 的可能性了笑撞,比如輸出 岛啸,就表示有 90% 的概率是蘋(píng)果,有 10% 的概率是橘子茴肥。
四坚踩、邏輯回歸的分類邊界
在分類問(wèn)題中存在分類(決策)邊界(Decision Boundary)的概念,因?yàn)槲覀冏罱K是要將數(shù)據(jù)用函數(shù)分類瓤狐,體現(xiàn)在坐標(biāo)系中就是函數(shù)曲線把數(shù)據(jù)分為 2 類瞬铸,比如一類是蘋(píng)果,一類是橘子础锐。
理解分類邊界的目的就是為了理解邏輯回歸的假設(shè)函數(shù)是如何工作的嗓节。下面通過(guò)一個(gè)小例子說(shuō)明下分類邊界是如何得出的,其實(shí)也容易理解皆警。
我們假設(shè):
- 時(shí)拦宣,預(yù)測(cè) ,蘋(píng)果
- 時(shí),預(yù)測(cè) 鸵隧,橘子
從 Sigmoid 函數(shù)圖像可以看出:
- : 在 之間
- :
- : 在 之間
又因?yàn)?绸罗,要注意這里 ,所以上面的假設(shè)可以替換為:
- 時(shí)豆瘫,預(yù)測(cè) 珊蟀,蘋(píng)果
- 時(shí),分類邊界外驱!
- 時(shí)育灸,預(yù)測(cè) ,橘子
用個(gè)圖來(lái)直觀的說(shuō)明下:
這個(gè)圖已經(jīng)說(shuō)明的很詳細(xì)了昵宇,中間的紅線就是分類邊界 磅崭,兩邊分別是大于 0 和小于 0 的情況,在實(shí)際應(yīng)用中趟薄,經(jīng)常把 合并來(lái)表示 。
這個(gè)例子的分類邊界是直線典徊,其實(shí)分類邊界也可以是非線性邊界杭煎,比如一個(gè)圓:
以上是兩個(gè)簡(jiǎn)單的分類邊界例子,實(shí)際使用中使用更加復(fù)雜的多項(xiàng)式可以擬合很復(fù)雜的分類邊界卒落。
五羡铲、代價(jià)函數(shù)和梯度下降
與線性回歸一樣,邏輯回歸也需要定義代價(jià)函數(shù)來(lái)求出模型的最優(yōu)參數(shù) 儡毕,不過(guò)代價(jià)函數(shù)不能使用模型誤差的平方和也切,因?yàn)閷⑦壿嫽貧w的假設(shè)函數(shù)帶入平方誤差的代價(jià)函數(shù)會(huì)導(dǎo)致代價(jià)函數(shù)不是凸函數(shù),進(jìn)而代價(jià)函數(shù)會(huì)產(chǎn)生許多局部最優(yōu)值腰湾,對(duì)梯度下降求最優(yōu)值會(huì)有很大影響雷恃。
由于這個(gè)缺點(diǎn),所以我們需要重新定義邏輯回歸的代價(jià)函數(shù):
函數(shù)如下:
這個(gè)函數(shù)直觀上不好理解费坊,可以用曲線看下:
- 時(shí):當(dāng) 倒槐,;當(dāng) 時(shí) 無(wú)窮大附井;
- 時(shí):當(dāng) 讨越,;當(dāng) 時(shí) 無(wú)窮大永毅;
可以用一句話來(lái)理解這個(gè)代價(jià)函數(shù):當(dāng)模型的預(yù)測(cè)與實(shí)際值差異越大把跨,代價(jià)值越大。
但是我們發(fā)現(xiàn)上面的代價(jià)函數(shù)是分開(kāi)的沼死,不方便梯度下降計(jì)算着逐,能不能整合到一起呢?還真的可以:
當(dāng) 時(shí)后面項(xiàng)為 0,當(dāng) 時(shí)滨嘱,前面項(xiàng)為 0峰鄙,正好對(duì)應(yīng)之前的分段表達(dá)式,再添加上標(biāo)代入代價(jià)函數(shù) 中:
有了代價(jià)函數(shù)太雨,我們就可以利用之前學(xué)會(huì)的梯度下降法來(lái)迭代求代價(jià)函數(shù)最小值啦吟榴!
六、邏輯回歸實(shí)戰(zhàn)
最后我們來(lái)用前面學(xué)習(xí)的邏輯回歸技術(shù)來(lái)對(duì) 2 類數(shù)據(jù)進(jìn)行分類囊扳!
6.1 數(shù)據(jù)準(zhǔn)備
要分類的數(shù)據(jù)可視化如下吩翻,一共只有 2 個(gè)類別,所以只需要使用直線決策邊界即可:
6.2 假設(shè)函數(shù)
def sigmoid(z):
return 1 / (1 + np.exp(-z))
6.3 代價(jià)函數(shù)
這里仍然使用向量化代碼表示:
# 邏輯回歸代價(jià)函數(shù)
def cost_function(theta, X, y):
# 向量化代碼
return np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))
6.4 梯度下降
梯度下降的原理在之前的這篇文章有介紹:
# 梯度計(jì)算
# return 梯度的一維數(shù)組
def gradient(theta, X, y):
return (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)
6.5 訓(xùn)練參數(shù)
這里利用已有的優(yōu)化手段來(lái)優(yōu)化代價(jià)函數(shù)(損失函數(shù)):
import scipy.optimize as opt
# 用 opt.minimize 來(lái)訓(xùn)練邏輯回歸的參數(shù)
# Newton-CG 是牛頓法家族的一種锥咸,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來(lái)迭代優(yōu)化損失函數(shù)
res = opt.minimize(fun = cost_function, x0 = theta, args = (X, y), method = 'Newton-CG', jac = gradient)
6.6 在訓(xùn)練集上預(yù)測(cè)
# 計(jì)算 y 在訓(xùn)練集上的預(yù)測(cè)值
y_predict = predict(X, final_theta)
# 打印分類報(bào)告
print(classification_report(y, y_predict))
報(bào)告中的 f1-score 分?jǐn)?shù)分別為 0.86 和 0.91狭瞎,說(shuō)明分類結(jié)果還是很不錯(cuò)的:
6.7 輸出分類邊界
我們用繪圖庫(kù)來(lái)繪制出預(yù)測(cè)的分類邊界,可以發(fā)現(xiàn)分類邊界能夠比較好分開(kāi)兩個(gè)類別的數(shù)據(jù):
OK!今天登龍跟大家分享了邏輯回歸的原理和實(shí)戰(zhàn)編程,大家多多實(shí)踐院水,早日學(xué)會(huì)乞榨!文中完整注釋代碼在我的倉(cāng)庫(kù)中:
https://github.com/DLonng/AI-Notes/tree/master/MachineLearning
大家下期見(jiàn) :)
本文原創(chuàng)首發(fā)于 同名微信公號(hào)「登龍」,微信搜索關(guān)注回復(fù)「1024」你懂的!