All Revision Notes

COM6005 Statistical Modeling · Module 5

Logistic Regression

COM6005 · Module 5 · Source: Lecture_5_Logistic_Regression_L02.pdf (19 slides)

Contents · 10 sections

🎯 本講重點 (Learning outcomes)

  • 明白 Generalized linear model 嘅角度:先認清 Y 係咩類型;binary Y 用 Logistic regression。
  • 解釋點解 linear regression 唔適合 binary Y:左邊 probability 喺 [0,1][0,1],右邊 XβX\beta 喺 [−∞,∞][-\infty,\infty],所以要 transform。
  • 識用 logit / logistic function,由 ηnew\eta_{new} 計 P(ynew=1)P(y_{new}=1),再用 threshold 0.5 做 classification。
  • 比較 OLS(linear regression)同 MLE(logistic regression),明白 likelihood 嘅意思。
  • 識睇同寫 Python:smf.mnlogit、predict()、idxmax(axis=1)、confusion_matrix。
  • 識計 Misclassification rate,分清 in-sample 同 out-of-sample prediction。

⭐ 考試必溫 Top-5

  1. 點解要 transform:P∈[0,1]P\in[0,1] 但 β0+β1X1+⋯+βpXp∈[−∞,∞]\beta_0+\beta_1X_1+\cdots+\beta_pX_p\in[-\infty,\infty],兩邊 range 唔夾。
  2. 預測三步:ηnew\eta_{new} → P=eηnew1+eηnewP=\dfrac{e^{\eta_{new}}}{1+e^{\eta_{new}}} → P>0.5P>0.5 即 ηnew>0\eta_{new}>0 就 classify 做 1(slide 10:η=13\eta=13,P≈1P\approx1)。
  3. OLS minimize sum of squared errors;categorical Y 嘅 error 唔可以用減數定義,所以 logistic regression 改為 maximize likelihood(MLE)。
  4. 3 個 categories → 3 個「one vs not」logistic models(Red / Blue / Green)。
  5. Misclassification rate = 分錯數目 / 總數 = 1−1- 分啱比例;slide 18:14/99≈0.14114/99\approx0.141。評估 model 要用 out-of-sample(test data)。

1. 點解需要 Logistic regression?(slides 1–4)

Module 4 嘅 model 係:

Y=β0+β1X1+β2X2+⋯+βpXp+errorY=\beta_0+\beta_1X_1+\beta_2X_2+\cdots+\beta_pX_p+\text{error}

Slide 2 講明:linear regression fails if Y is not continuous。Generalized linear regression 可以處理唔同類型嘅 Y,而本講集中講 Binomial,即 Logistic regression。Slide 2 嘅提醒:要 predict / classify,第一步係認清 Y 屬於邊種類型。

Binomial:Y 只有兩個可能值,例如 0/1、Yes/No、Healthy/Cancer、Good debt/Bad debt、Hungry/Not hungry、Rain/Not Rain。

ExamLogistic regression 嘅 target 唔係直接 predict 類別,而係 model 類別嘅 probability,例如 P(Hungry)P(\text{Hungry})。Slide 1 嘅例子:

⭐ 由 Probability 到 Prediction(slide 1)
P(Hungry)P(\text{Hungry})Prediction
1Hungry
0Not hungry
0.2Not hungry

1.1 Range 唔夾(slides 3–4)

Binomial data 本身係 categorical,唔可以直接寫成 β0+β1X1+⋯\beta_0+\beta_1X_1+\cdots。改為 model「getting 1 嘅 probability」就有數字,但係 range 仍然有問題:

⭐ 點解 Transform is needed(slide 4)
DataParameterL.H.S. rangeXβX\beta(R.H.S.)range
Rain / NoP(Y=Rain)P(Y=\text{Rain})[0,1][0,1][−∞,∞][-\infty,\infty]

如果硬寫 P(Y=Rain)=β0+β1X1+⋯+βpXp+errorP(Y=\text{Rain})=\beta_0+\beta_1X_1+\cdots+\beta_pX_p+\text{error},右邊可以計到 1.7 或者 −0.3,但 probability 一定喺 [0,1][0,1]。XβX\beta is arbitrary, probability is restricted to [0,1][0,1],所以要 transform。

1.2 多過兩個類別點算?(slide 3)

ExamBinomial 只考慮 2 個 outcomes。如果要 predict {Red,Blue,Green}\{\text{Red},\text{Blue},\text{Green}\},slide 嘅做法係每個類別 fit 一個 model:

ModelY 嘅兩個 outcomes
Logistic regression model 1Red vs not Red
Logistic regression model 2Blue vs not Blue
Logistic regression model 3Green vs not Green
💡 直覺理解

將多類別問題拆做幾條 Yes/No 問題:「係咪 Red?」「係咪 Blue?」「係咪 Green?」。k 個 categories 就要 k 個 models。

⚠️ 易混淆

Module 4b 嘅 dummy variables 係處理 categorical X,k 個 categories 用 k−1k-1 個 dummies;呢度講嘅係 categorical Y,slide 3 嘅 3 個 categories 用 3 個 models。

2. Logit 同 Logistic function(slides 3、5、6)

Slide 3 指出 XβX\beta 係透過 logistic function 連去 probability。Slide 6 有兩幅圖,係同一個關係嘅正反兩面:

Logit functionLogistic function
InputP∈[0,1]P\in[0,1]logit(P)∈[−∞,∞]\text{logit}(P)\in[-\infty,\infty]
Output[−∞,∞][-\infty,\infty]Probability ∈[0,1]\in[0,1]
Formulalogit(P)=ln⁡ ⁣(P1−P)\text{logit}(P)=\ln\!\left(\dfrac{P}{1-P}\right)P=elogit(P)1+elogit(P)P=\dfrac{e^{\text{logit}(P)}}{1+e^{\text{logit}(P)}}
圖形(slide 6)P = 0.5 時穿過 0,接近 0 同 1 時急速趨向 ∓∞\mp\inftyS 形曲線,由 0 慢慢升到 1,中間最斜

將 η=logit(P)\eta=\text{logit}(P) 寫出嚟,就可以反解 P:

η=ln⁡P1−P  ⇒  eη=P1−P  ⇒  eη−Peη=P  ⇒  P=eη1+eη\eta=\ln\frac{P}{1-P}\;\Rightarrow\; e^{\eta}=\frac{P}{1-P}\;\Rightarrow\; e^{\eta}-Pe^{\eta}=P\;\Rightarrow\; P=\frac{e^{\eta}}{1+e^{\eta}}

幾個數值幫你感受 logit 點樣將 [0,1][0,1] 拉開:

P0.010.10.20.50.70.90.99
logit(P)\text{logit}(P)−4.595−2.197−1.38600.8472.1974.595
💡 直覺理解

XβX\beta 可以係任何數字。Logistic function 就好似一個「壓縮器」,將任何數字壓入 (0,1)(0,1),所以計出嚟嘅一定係合法 probability。Slide 3 亦提到,呢個 function 喺其他 machine learning methods 都會用到。

3. 預測同分類(slides 5、10)

Logistic regression 係 statistical method of obtaining β^\hat{\boldsymbol\beta}。計到 β^\hat{\boldsymbol\beta} 之後,對新 data 就跟以下步驟做 classification:

⭐ 預測三步曲(slide 5)

Step 1:對 xnewx_{new} 計 ηnew\eta_{new}:

ηnew=β0+β1X1new+β2X2new+⋯+βpXpnew\eta_{new}=\beta_0+\beta_1X_1^{new}+\beta_2X_2^{new}+\cdots+\beta_pX_p^{new}

Step 2:計 probability:

P(ynew=1)=eηnew1+eηnewP(y_{new}=1)=\frac{e^{\eta_{new}}}{1+e^{\eta_{new}}}

Step 3(decision rule,default threshold = 0.5):如果 P(ynew=1)>0.5P(y_{new}=1)>0.5,即 ηnew>0\eta_{new}>0,就 classify ynew=1y_{new}=1。

例:P(Rain=True)=0.4P(\text{Rain}=\text{True})=0.4,未過 0.5,所以 claim 聽日唔會落雨。

點解 P>0.5P>0.5 同 η>0\eta>0 係同一件事?

eη1+eη>12  ⟺  2eη>1+eη  ⟺  eη>1  ⟺  η>0\frac{e^{\eta}}{1+e^{\eta}}>\frac12 \iff 2e^{\eta}>1+e^{\eta} \iff e^{\eta}>1 \iff \eta>0

ExamSlide 10 例題:p=1, β0=3, β1=2p=1,\ \beta_0=3,\ \beta_1=2,新 data x=5x=5,求 P(Y=1)P(Y=1)。

ηnew=β0+β1X1new=3+2×5=13,P(Y=1)=e131+e13≈1\eta_{new}=\beta_0+\beta_1X_1^{new}=3+2\times5=13,\qquad P(Y=1)=\frac{e^{13}}{1+e^{13}}\approx1

因為 ηnew=13>0\eta_{new}=13>0,所以 classify 做 Y=1Y=1。準確啲計,P≈0.999998P\approx0.999998。

多一題(自編,唔係 slide 內容):β0=−2, β1=0.5\beta_0=-2,\ \beta_1=0.5。

xη\etaP(Y=1)P(Y=1)Classification
2−10.26890
400.5000剛好喺 threshold;slide 嘅 rule 要 >0.5>0.5,所以唔算 1
610.73111
⚠️ 常見錯誤

η\eta 唔係 probability。η=13\eta=13 或者 η=−1\eta=-1 都係正常數值,一定要過埋 logistic function 先得到 P。

📎 補充(slides 冇教,唔標做考試重點)

由 ln⁡P1−P=η\ln\frac{P}{1-P}=\eta 可知,X1X_1 加 1 會令 log-odds 加 β1\beta_1,即 odds 乘以 eβ1e^{\beta_1},但 P 本身唔係加固定數值。Slide 只講到用 η\eta 計 P 同做分類。

4. 點樣 fit model:OLS vs MLE(slides 7–9)

⭐ Fitting 比較(slide 7)
Linear regressionLogistic regression
MethodOrdinary Least Squares (OLS)Maximum Likelihood Estimation (MLE)
ObjectiveMinimize the sum of squared errorsMaximize the likelihood
Slide 7 圖Size vs Weight:一條直線穿過散開嘅數據點Is Obese / Is Not Obese vs Weight:數據點只喺兩條水平線,model 係 S 形曲線;圖中亦有幾條灰色虛線 S-curve

4.1 點解唔用 squared error?(slide 8)

Categorical Y 嘅 error 或 residual 唔可以用減數定義:Engineering − Humanity = ???;Cloudy − Sunny = ???。所以 sum of squared errors 要換成另一樣嘢,就係 likelihood。

4.2 Likelihood(slide 8)

Roughly speaking,likelihood 就係「觀察到你實際觀察到嘅結果」嘅 probability。Likelihood 同 probability 成正比,所以 L1>L2L_1>L_2 代表 P1>P2P_1>P_2。

⭐ Likelihood 定義(slide 8)
L=∏t=1nP(Yt=yt∣Xt)L=\prod_{t=1}^{n}P(Y_t=y_t\mid X_t)

注意係 based on actual observations,將每一個 observation 嘅 probability 乘埋一齊。其中 ηt=β0+β1Xt1+β2Xt2+⋯+βpXtp\eta_t=\beta_0+\beta_1X_{t1}+\beta_2X_{t2}+\cdots+\beta_pX_{tp}。Statistician 就係 maximize the likelihood 去搵 unknown parameters。

⚠️ Slide 8 寫法要留意

Slide 寫 P(Yt=yt∣Xt)=eηt1+eηtP(Y_t=y_t\mid X_t)=\dfrac{e^{\eta_t}}{1+e^{\eta_t}},嚴格嚟講呢條只適用於 yt=1y_t=1。當 yt=0y_t=0,個 probability 應該係 1−eηt1+eηt=11+eηt1-\dfrac{e^{\eta_t}}{1+e^{\eta_t}}=\dfrac{1}{1+e^{\eta_t}}。下面例題就係咁計。

自編例題:三個 observations (x,y)=(1,1), (−1,0), (2,0)(x,y)=(1,1),\ (-1,0),\ (2,0),β0=0\beta_0=0。邊個 β1\beta_1 嘅 likelihood 較高?

Observationβ1=1\beta_1=1:P(Yt=yt)P(Y_t=y_t)β1=0\beta_1=0:P(Yt=yt)P(Y_t=y_t)
x=1, y=1x=1,\ y=1η=1\eta=1,P(Y=1)=0.7311P(Y=1)=0.73110.5
x=−1, y=0x=-1,\ y=0η=−1\eta=-1,P(Y=0)=1−0.2689=0.7311P(Y=0)=1-0.2689=0.73110.5
x=2, y=0x=2,\ y=0η=2\eta=2,P(Y=0)=1−0.8808=0.1192P(Y=0)=1-0.8808=0.11920.5
Likelihood0.7311×0.7311×0.1192≈0.06370.7311\times0.7311\times0.1192\approx0.06370.53=0.1250.5^3=0.125

喺呢兩個選擇之間,β1=0\beta_1=0 嘅 likelihood 較高,即係佢令實際數據更加「有可能出現」,所以 MLE 會較鍾意佢。真正嘅 MLE 就係喺所有可能嘅 β\boldsymbol\beta 入面搵最高嗰個。

💡 連繫 slide 7 嘅圖

可以將幾條灰色 S-curve 想像成候選 β\boldsymbol\beta,每條都計到一個 likelihood,揀最高嗰條。

4.3 Numerical analysis(slide 9)

Numerical analysis 係一類方法,用重複步驟 approximately 搵 max / min 同解方程。Computer 加 numerical analysis 可以解好多 without explicit solutions 嘅難題,例如解 xsin⁡x=1x\sin x=1。Slide 列明詳細方法係 Out-of-syllabus,知道概念就夠。

5. South African Heart Disease data(slides 11–12)

例子嚟自 Rousseauw et al, 1983, South African Medical Journal。Slide 11 寫 Training data:n=462, p=10n=462,\ p=10。

Column意思
sbpSystolic 收縮壓 blood pressure(mm Hg)
tobaccoCumulative tobacco use(kg)
ldlLow-density lipoprotein cholesterol 低密度脂蛋白膽固醇
adiposityAdiposity 肥胖 / obesity measure
famhistFamily history of ischemic 缺血性的 heart disease(Absent / Present,或 coded 0 / 1)
typeaType-A behavior score(12–84);例如 highly competitive、stressed、impatient、perfectionist、time-pressured
obesityBody mass index (BMI) measure
alcoholCurrent alcohol consumption
ageAge at onset / age in years
chdCoronary heart disease diagnosis:response variable(0 / negative 或 1 / positive)
⚠️ p=10p=10 要留意

Slide 12 列出嘅 10 個 columns 已經包括 response chd,而 slide 13 嘅 formula 用 9 個 predictors。所以 predictors 數目係 9,slide 嘅「p=10p=10」應該係指 columns 總數。

6. Python:Fit model(slides 13–14)

ExamSlides 用 statsmodels 入面嘅 mnlogit,formula 寫法同 Module 4 嘅 smf.ols 一樣,Y ~ X1 + X2 + ...。

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from sklearn.metrics import confusion_matrix

heart = pd.read_csv("SAheart.txt", sep=' ')
# 將 target class variable 轉做 integer codes(0, 1)
heart['chd'] = heart['chd'].astype('category').cat.codes

model = smf.mnlogit('chd ~ sbp+tobacco+ldl+adiposity+typea+obesity+alcohol+age+famhist', data=heart).fit()
print(model.summary())
⚠️ Slides 嘅細節
  • Slide 13 寫 package 係 “statsmodels.formulas.api”,正確名稱係 slide 14 code 用嘅 statsmodels.formula.api,冇 “s”。Function 要全細階寫 smf.mnlogit,唔係 mnLogit。
  • Slide 14 嘅 sep=' ‘ 收尾係彎引號,直接 copy 會 SyntaxError,上面已改做 sep=' '。
  • Slides 只有 code,冇 show summary() 嘅 output,所以呢度冇列 SAheart 嘅結果數字。

7. Python:Predict(slides 15–16)

# predict on new data
newdata = pd.DataFrame({
    'const': [1],
    'sbp': [114],
    'tobacco': [4.08],
    'ldl': [4.59],
    'adiposity': [14.6],
    'typea': [62],
    'obesity': [23.11],
    'alcohol': [6.72],
    'age': [58],
    'famhist': ['Present']
})
pred_probs = model.predict(newdata)      # 每個 class 一個 column
print(pred_probs)
pred_classes = pred_probs.idxmax(axis=1) # index of first occurrence of max
# axis=0, return row index; axis=1, return column index
print(pred_classes)
⭐ 兩句 predict 要識(slide 15)
  • model.predict(newdata):output probabilities,一個 row 一個 observation,一個 column 一個 class。
  • pred_probs.idxmax(axis=1):每個 row 揀 probability 最大嗰個 column,output predicted class。兩個 classes 時,就等於 threshold 0.5。
⚠️ 易錯位
  • Slide 15 用 result.predict,slide 16 用 model.predict。兩者一樣,只係變數名唔同;跟 slide 14 就係 model。
  • Formula API 會自己加 Intercept,'const' 呢個 column 其實用唔著,不過放咗亦唔會出錯。
  • Binary Y 亦可以用 smf.logit,coefficients 同 mnlogit 一樣,但 predict() 回傳 Series,只得 P(Y=1)P(Y=1),idxmax(axis=1) 會 ValueError。Slides 用 mnlogit,跟住佢就得。

8. Misclassification rate(slides 17–19)

Exam評估 classification model 嘅步驟(slide 17):

  1. 將 full data 分做 training data 同 testing data(unseen),例如 70% vs 30%。
  2. 將 mnlogit apply 落 training data。
  3. 扮唔知 test data 嘅 Y,apply predict()。
  4. 將 predicted class 同 actual class 比較。

Slide 17 特別提醒要小心 in-sample prediction 同 out-sample prediction 嘅分別:前者用嚟 fit model 嘅 data,後者係 model 未見過嘅 data。

⭐ Misclassification rate(slide 18)
Predicted classActual class
High riskLow risk
High risk506
Low risk835
Misclassification=6+850+6+8+35=1499≈0.141\text{Misclassification}=\frac{6+8}{50+6+8+35}=\frac{14}{99}\approx0.141
Misclassification=1−50+3550+6+8+35=1−8599≈0.141\text{Misclassification}=1-\frac{50+35}{50+6+8+35}=1-\frac{85}{99}\approx0.141

對角線係分啱,對角線以外係分錯。兩條 formula 結果一樣。

# Check the out-sample misclassification rate
heart_train = heart.iloc[0:323]
heart_test = heart.iloc[323:]

model = smf.mnlogit('chd ~ sbp+tobacco+ldl+adiposity+typea+obesity+alcohol+age+famhist', data=heart_train).fit()
print(model.summary())

predicted_class = model.predict(heart_test).idxmax(axis=1)
actual_class = heart_test['chd']

misclassification = confusion_matrix(actual_class, predicted_class)
error_rate = 1 - np.trace(misclassification) / np.sum(misclassification)

print('Out-of-sample performance:')
print(misclassification)
print(f'Error Rate: {error_rate}')

逐句拆解 slide 19:

Code意思
iloc[0:323] / iloc[323:]頭 323 個 rows 做 training,其餘 139 個 rows 做 testing,約 70% vs 30%(323/462 ≈ 69.9%)
np.trace(...)對角線總和,即分啱嘅數目
np.sum(...)所有格總和,即 test data 總數
1 - trace/sum就係 slide 18 第二條 formula
⚠️ Table 方向唔同

Slide 18 嘅 table:row = Predicted,column = Actual。sklearn 嘅 confusion_matrix(actual, predicted):row = Actual,column = Predicted。Misclassification rate 唔受影響,因為對角線一樣,但讀「邊格係邊種錯」時要小心。

⚠️ Split 方式

Slide 19 用 iloc 直接切頭同尾,唔係 random split。如果 data 本身有排序,train 同 test 嘅分佈就會唔同。實際做 project 時要留意呢點。

自我測驗 Self-test

Q1. 點解唔可以直接寫 P(Y=1)=β0+β1X1+⋯+βpXpP(Y=1)=\beta_0+\beta_1X_1+\cdots+\beta_pX_p?

因為 probability 一定喺 [0,1][0,1],但 XβX\beta 可以係 [−∞,∞][-\infty,\infty] 入面任何數。所以要用 logit / logistic function transform,將兩邊 range 夾返。

Q2. β0=−2, β1=0.5, x=2\beta_0=-2,\ \beta_1=0.5,\ x=2。求 η\eta、P(Y=1)P(Y=1) 同 predicted class。

η=−2+0.5×2=−1\eta=-2+0.5\times2=-1;P=e−11+e−1≈0.2689P=\dfrac{e^{-1}}{1+e^{-1}}\approx0.2689;P<0.5P<0.5(亦即 η<0\eta<0),所以 predict Y=0Y=0。

Q3. 同一個 model,x 要大過幾多先會 classify 做 1?

要 η>0\eta>0:−2+0.5x>0-2+0.5x>0,即 x>4x>4。

Q4. 證明 P>0.5  ⟺  η>0P>0.5 \iff \eta>0。

eη1+eη>12  ⟺  2eη>1+eη  ⟺  eη>1  ⟺  η>0\dfrac{e^\eta}{1+e^\eta}>\dfrac12\iff2e^\eta>1+e^\eta\iff e^\eta>1\iff\eta>0。

Q5. P=0.4P=0.4 嘅 logit(P)\text{logit}(P) 係幾多?

ln⁡(0.4/0.6)=ln⁡(0.6667)≈−0.405\ln(0.4/0.6)=\ln(0.6667)\approx-0.405。係負數,同 P<0.5P<0.5 一致。

Q6. Y 有 4 種顏色,跟 slide 3 嘅方法要 fit 幾多個 logistic regression models?

4 個:每種顏色一個「該顏色 vs not 該顏色」model。

Q7. 比較 OLS 同 MLE;點解 logistic regression 唔用 OLS?

OLS minimize sum of squared errors;MLE maximize likelihood ∏t=1nP(Yt=yt∣Xt)\prod_{t=1}^{n}P(Y_t=y_t\mid X_t)。Categorical Y 嘅 error 唔可以用減數定義(Cloudy − Sunny = ???),所以 squared error 要由 likelihood 取代。

Q8. Predicted High:actual High 40、actual Low 10;Predicted Low:actual High 5、actual Low 45。求 misclassification rate。

分錯 = 10 + 5 = 15,總數 = 100,rate = 15/100 = 0.15。亦可以用 1−(40+45)/100=0.151-(40+45)/100=0.15。

Q9. pred_probs.idxmax(axis=1) 做咩?如果係 axis=0 呢?

axis=1:每個 row 搵最大值所屬嘅 column index,即每個 observation 嘅 predicted class。axis=0:每個 column 搵最大值所屬嘅 row index。

Q10. Training data 嘅 error rate 好低,test data 嘅 error rate 好高,代表咩?

Model 喺 in-sample 表現好,但 out-of-sample 差,即對 unseen data 預測能力弱,可能係 overfitting。評估應該睇 out-of-sample 嗰個數字。

一頁總結 Cheat sheet

⭐ 考前速記
  • Binary Y → Logistic regression,model 嘅係 probability。P∈[0,1]P\in[0,1]、Xβ∈[−∞,∞]X\beta\in[-\infty,\infty] → 要 transform。
  • 3 個 categories → 3 個 models:Red / not Red、Blue / not Blue、Green / not Green。
  • logit(P)=ln⁡P1−P\text{logit}(P)=\ln\frac{P}{1-P}([0,1]→[−∞,∞][0,1]\to[-\infty,\infty]);P=eη1+eηP=\frac{e^{\eta}}{1+e^{\eta}}([−∞,∞]→[0,1][-\infty,\infty]\to[0,1])。
  • 預測:ηnew=β0+∑βjXjnew\eta_{new}=\beta_0+\sum\beta_jX_j^{new} → P → P>0.5  ⟺  ηnew>0P>0.5\iff\eta_{new}>0 → class 1。例:3+2×5=133+2\times5=13,P≈1P\approx1。
  • OLS:min sum of squared errors。MLE:max ∏t=1nP(Yt=yt∣Xt)\prod_{t=1}^{n}P(Y_t=y_t\mid X_t);由 numerical analysis 計(詳細方法 out-of-syllabus)。
  • Code:smf.mnlogit('y ~ x1+x2', data=df).fit() → .summary() → .predict(new) → .idxmax(axis=1)。
  • Misclassification = 分錯 / 總數 = 1−trace/sum1-\text{trace}/\text{sum};slide 18:14/99 ≈ 0.141。
  • 70 / 30 split;評估睇 out-of-sample。confusion_matrix(actual, predicted):row = actual、column = predicted。