邏輯回歸
邏輯回歸
邏輯回歸旨在解決分類問(wèn)題。它通過(guò)預(yù)測(cè)分類結(jié)果來(lái)實(shí)現(xiàn)這一點(diǎn),這與預(yù)測(cè)連續(xù)結(jié)果的線性回歸不同。
在最簡(jiǎn)單的情況下,有兩種結(jié)果,這被稱為二項(xiàng)式,其中一個(gè)例子是預(yù)測(cè)腫瘤是惡性還是良性。在其他情況下,有超過(guò)兩種結(jié)果進(jìn)行分類,在這種情況下它被稱為多項(xiàng)式。多項(xiàng)式邏輯回歸的一個(gè)常見(jiàn)例子是預(yù)測(cè)鳶尾花屬于3個(gè)不同物種中的哪一個(gè)。
在這里,我們將使用基本的邏輯回歸來(lái)預(yù)測(cè)一個(gè)二項(xiàng)式變量。這意味著它只有兩個(gè)可能的結(jié)果。
它是如何工作的?
在 Python 中,我們有模塊會(huì)為我們完成這項(xiàng)工作。首先導(dǎo)入 NumPy 模塊。
import numpy
將自變量存儲(chǔ)在 X 中。
將因變量存儲(chǔ)在 y 中。
下面是一個(gè)樣本數(shù)據(jù)集:
# X 代表腫瘤的厘米大小。 X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) # 注意:為了使 LogisticRegression() 函數(shù)工作,X 需要從行重塑為列。 # y 代表腫瘤是否為癌性(0 表示“否”,1 表示“是”)。 y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
我們將使用 sklearn 模塊中的一個(gè)方法,因此還需要導(dǎo)入該模塊:
from sklearn import linear_model
從 sklearn 模塊中,我們將使用 LogisticRegression() 方法來(lái)創(chuàng)建一個(gè)邏輯回歸對(duì)象。
這個(gè)對(duì)象有一個(gè)名為 fit()
的方法,該方法將自變量和因變量作為參數(shù),并用描述關(guān)系的數(shù)據(jù)填充回歸對(duì)象:
logr = linear_model.LogisticRegression() logr.fit(X,y)
現(xiàn)在我們有一個(gè)邏輯回歸對(duì)象,它可以根據(jù)腫瘤大小來(lái)預(yù)測(cè)腫瘤是否為癌性:
# 預(yù)測(cè)大小為 3.46mm 的腫瘤是否為癌性: predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))
實(shí)例
查看整個(gè)實(shí)例的運(yùn)行情況:
import numpy from sklearn import linear_model # 為邏輯函數(shù)重塑。 X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) logr = linear_model.LogisticRegression() logr.fit(X,y) # 預(yù)測(cè)大小為3.46mm的腫瘤是否為癌性: predicted = logr.predict(numpy.array([3.46]).reshape(-1,1)) print(predicted)運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
結(jié)果:
[0]
我們已經(jīng)預(yù)測(cè)出大小為 3.46mm 的腫瘤不是癌性的。
系數(shù)
在邏輯回歸中,系數(shù)是X每單位變化時(shí)結(jié)果的對(duì)數(shù)幾率的預(yù)期變化。
這并不具有最直觀的理解,因此讓我們用它來(lái)創(chuàng)建更有意義的東西,即幾率。
實(shí)例
查看整個(gè)實(shí)例的運(yùn)行情況:
import numpy from sklearn import linear_model # 為邏輯函數(shù)重塑。 X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) logr = linear_model.LogisticRegression() logr.fit(X,y) log_odds = logr.coef_ odds = numpy.exp(log_odds) print(odds)運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
結(jié)果:
[4.03541657]
這告訴我們,當(dāng)腫瘤大小增加 1mm 時(shí),它是癌性腫瘤的幾率增加了 4 倍。
概率
可以使用系數(shù)和截距值來(lái)找出每個(gè)腫瘤為癌性的概率。
創(chuàng)建一個(gè)函數(shù),該函數(shù)使用模型的系數(shù)和截距值返回一個(gè)新值。這個(gè)新值表示給定觀測(cè)值是腫瘤的概率:
def logit2prob(logr,x): log_odds = logr.coef_ * x + logr.intercept_ odds = numpy.exp(log_odds) probability = odds / (1 + odds) return(probability)
函數(shù)解釋
要找到每個(gè)觀測(cè)值的對(duì)數(shù)幾率,我們必須首先創(chuàng)建一個(gè)類似于線性回歸中的公式,提取系數(shù)和截距。
log_odds = logr.coef_ * x + logr.intercept_
然后,為了將對(duì)數(shù)幾率轉(zhuǎn)換為幾率,我們必須對(duì)對(duì)數(shù)幾率進(jìn)行指數(shù)化。
odds = numpy.exp(log_odds)
現(xiàn)在我們有了幾率,我們可以通過(guò)將其除以1加幾率來(lái)將其轉(zhuǎn)換為概率。
probability = odds / (1 + odds)
現(xiàn)在讓我們使用所學(xué)到的函數(shù)來(lái)找出每個(gè)腫瘤為癌性的概率。
實(shí)例
查看整個(gè)實(shí)例的運(yùn)行情況:
import numpy from sklearn import linear_model X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) logr = linear_model.LogisticRegression() logr.fit(X,y) def logit2prob(logr, X): log_odds = logr.coef_ * X + logr.intercept_ odds = numpy.exp(log_odds) probability = odds / (1 + odds) return(probability) print(logit2prob(logr, X))運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
結(jié)果:
[[0.60749955] [0.19268876] [0.12775886] [0.00955221] [0.08038616] [0.07345637] [0.88362743] [0.77901378] [0.88924409] [0.81293497] [0.57719129] [0.96664243]]
結(jié)果解釋
3.78 0.61 大小為 3.78cm 的腫瘤為癌性的概率為 61%。
2.44 0.19 大小為 2.44cm 的腫瘤為癌性的概率為 19%。
2.09 0.13 大小為 2.09cm 的腫瘤為癌性的概率為 13%。