Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

เข้าใจ Logistic Regression ใน Python: ทฤษฎีและการปฏิบัติ

Logistic Regression เป็นเทคนิคทางสถิติสำหรับทำนาย Binary Outcome (0/1, Yes/No, True/False) ใช้กันกว้างในการเงิน การแพทย์ อาชญากรรมวิทยา และสังคมวิทยา

ติดตั้ง Libraries

pip install numpy pandas statsmodels matplotlib

Dataset: UCLA Graduate Admission

ข้อมูลจาก UCLA IDRE - ปัจจัยที่ส่งผลต่อการรับเข้า Graduate School

  • admit: 0=ไม่รับ, 1=รับ (Target)
  • gre: GRE score
  • gpa: GPA
  • rank/prestige: อันดับมหาวิทยาลัย (1=ดีที่สุด, 4=ต่ำสุด)

โค้ดเต็ม: โหลดและสำรวจข้อมูล

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import numpy as np

# โหลดข้อมูล
df = pd.read_csv('binary.csv')
# หรืออ่านจาก URL: pd.read_csv('https://stats.idre.ucla.edu/stat/data/binary.csv')

# เปลี่ยนชื่อ column 'rank' -> 'prestige' (กันชนกับ method .rank())
df.columns = ['admit', 'gre', 'gpa', 'prestige']

print(df.head())
print(df.describe())
print(df.std())

# Frequency table: admit vs prestige
print(pd.crosstab(df['admit'], df['prestige'], rownames=['admit']))

# Histograms
df.hist()
plt.show()

ผลลัพธ์สำรวจ:

   admit  gre   gpa  prestige
0      0  380  3.61         3
1      1  660  3.67         3
2      1  800  4.00         1
3      1  640  3.19         4
4      0  520  2.93         4

# Crosstab
prestige  1  2  3  4
admit          
0        28 97 93 55
1        33 54 28 12

Dummy Variables (One-Hot Encoding)

แปลง categorical variable (prestige) เป็น dummy variables

# สร้าง dummy variables
dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
print(dummy_ranks.head())

# เลือก features: admit (target), gre, gpa, prestige_2, prestige_3, prestige_4
# (drop prestige_1 เป็น reference category)
cols_to_keep = ['admit', 'gre', 'gpa']
data = df[cols_to_keep].join(dummy_ranks.iloc[:, 1:])  # ข้าม prestige_1

print(data.head())

ผลลัพธ์:

   admit  gre   gpa  prestige_2  prestige_3  prestige_4
0      0  380  3.61           0           1           0
1      1  660  3.67           0           1           0
2      1  800  4.00           0           0           0
3      1  640  3.19           0           0           1
4      0  520  2.93           0           0           1

รัน Logistic Regression ด้วย Statsmodels

# เตรียม X และ y
train_cols = data.columns[1:]  # ทุกคอลัมน์ยกเว้น 'admit'
logit = sm.Logit(data['admit'], data[train_cols])

# Fit model
result = logit.fit()
print(result.summary2())

ผลลัพธ์สรุป (Summary):

Results: Logit
Model:              Logit          Pseudo R-squared: 0.083
Dependent Variable: admit          AIC: 470.52
No. Observations:   400            BIC: 494.47
Df Model:           5              Log-Likelihood: -229.26
Df Residuals:       394            LL-Null: -249.99
Converged:          1.0000         Scale: 1.0000

----------------------------------------------------------------
           Coef.  Std.Err.    z    P>|z|   [0.025   0.975]
----------------------------------------------------------------
gre        0.0023  0.0011  2.07  0.0385   0.0001  0.0044
gpa        0.8040  0.3318  2.42  0.0154   0.1537  1.4544
prestige_2 -0.6754  0.3165 -2.13  0.0328  -1.2958 -0.0551
prestige_3 -1.3402  0.3453 -3.88  0.0001  -2.0170 -0.6634
prestige_4 -1.5515  0.4178 -3.71  0.0002  -2.3704 -0.7325
intercept -3.9900  1.1400 -3.50  0.0005  -6.2242 -1.7557
----------------------------------------------------------------

การตีความผลลัพธ์

1. Coefficients (สัมประสิทธิ์)

  • gre (0.0023): GRE สูงขึ้น → โอกาสรับเพิ่ม (p=0.0385, significant)
  • gpa (0.804): GPA สูงขึ้น → โอกาสรับเพิ่มมาก (p=0.0154, significant)
  • prestige_2 (-0.675): มหาวิทยาลัยอันดับ 2 → โอกาสรับน้อยกว่าอันดับ 1
  • prestige_3 (-1.340): มหาวิทยาลัยอันดับ 3 → โอกาสรับน้อยกว่าอันดับ 1 มากกว่า
  • prestige_4 (-1.552): มหาวิทยาลัยอันดับ 4 → โอกาสรับน้อยที่สุด

2. P-values

ทุกตัวแปรมี p < 0.05 → ทุกตัวแปรมีนัยสำคัญทางสถิติ

3. Odds Ratios (คำนวณจาก exp(coef))

import numpy as np
print(np.exp(result.params))
# gre         1.0023  (เพิ่ม 1 คะแนน GRE → odds คูณ 1.0023)
# gpa         2.234   (เพิ่ม 1 GPA → odds คูณ 2.23)
# prestige_2  0.509   (อันดับ 2 → odds ลดเหลือ 50.9%)
# prestige_3  0.262   (อันดับ 3 → odds ลดเหลือ 26.2%)
# prestige_4  0.212   (อันดับ 4 → odds ลดเหลือ 21.2%)

4. Confidence Intervals

print(result.conf_int())
#                  0         1
# gre         0.000120  0.004409
# gpa         0.153684  1.454391
# prestige_2 -1.295751 -0.055135
# prestige_3 -2.016992 -0.663416
# prestige_4 -2.370399 -0.732529
# intercept  -6.224242 -1.755716

สรุป

  • Logistic Regression ทำนาย binary outcome ได้ดี
  • Statsmodels ให้ statistical details ครบ (p-values, CI, odds ratios)
  • Prestige ของมหาวิทยาลัย undergraduate มีผลต่อโอกาสรับเข้า graduate school มากที่สุด
  • GPA มีผลมากกว่า GRE ต่อหน่วย

ขั้นตอนต่อไป (Model Evaluation)

  • ROC Curve / AUC
  • Confusion Matrix
  • Precision, Recall, F1-Score
  • Train/Test Split หรือ Cross Validation