iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
自我挑戰組

用數據守護雙眼:生活型態對視力影響的探索性資料分析系列 第 19 篇

基準模型出戰!多元邏輯回歸與混淆矩陣實測

  • 分享至 

  • xImage
  •  

成功訓練多類別邏輯回歸模型,完成測試集推論評估,並將模型係數轉化為特徵權重條形圖以利可解釋性分析。

一、實作前情境:為什麼選擇多元邏輯回歸作為 Baseline?
在機器學習實務中,無論後續打算使用多複雜的模型(如 Random Forest、XGBoost 或神經網路),第一步永遠應該建立一個具備強解釋性且結構單純的基準模型:

1.多類別分類本質:

  • 目標變數包含三個有序等級:0 (Low)、1 (Medium)、2 (High)。
  • 多元邏輯回歸透過為每個類別學習一組線性權重向量,計算樣本屬於各風險等級的條件機率 P(y=k|x),可直接評估線性決策邊界在該任務上的上限。

2.高透明度與可解釋性:

  • 邏輯回歸的係數 beta 具有明確的統計意義:特徵每增加一個標準差,該特徵促使個體被判定為特定風險等級的「勝算比」變化倍數。
  • 我們可以藉此驗證 Day 15 所設計的 CESI_Score 在機器學習模型眼中是否真正主導了決策。

二、撰寫模型訓練、評估與係數可視化腳本
在 Colab 中新增儲存格,使用 scikit-learn 的 LogisticRegression 進行模型配適,並以 classification_report 與視覺化熱力圖呈現評估成果:

# ==========================================
# Day 19:多元邏輯回歸基準模型與特徵權重解析
# ==========================================

import warnings
warnings.filterwarnings('ignore')

import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

# 1. 引用中文字型
font_path = 'NotoSansTC-Regular.otf'
my_font = fm.FontProperties(fname=font_path)

# 2. 建立並訓練多元邏輯回歸模型
# multi_class='multinomial', solver='lbfgs' 為多元 Softmax 標準設定
clf = LogisticRegression(
    multi_class='multinomial', 
    solver='lbfgs', 
    max_iter=1000, 
    random_state=42
)
clf.fit(X_train, y_train)

# 3. 測試集預測
y_pred = clf.predict(X_test)
y_prob = clf.predict_proba(X_test)

acc = accuracy_score(y_test, y_pred)
print(f"=== 多元邏輯回歸測試集整體準確率 (Accuracy): {acc * 100:.2f}% ===\n")

# 4. 分類報告 (Precision, Recall, F1-score)
target_names = ['低度風險 (Low)', '中度風險 (Medium)', '高度風險 (High)']
report_dict = classification_report(y_test, y_pred, target_names=target_names, output_dict=True)
report_df = pd.DataFrame(report_dict).transpose()
print("=== 分類性能評估報告 (Classification Report) ===")
display(report_df.round(3))

# 5. 繪製 1x2 畫布:混淆矩陣熱力圖 + 高風險特徵係數長條圖
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
sns.set_theme(style="white")

# --- 圖 1:混淆矩陣熱力圖 (Confusion Matrix) ---
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(
    cm, 
    annot=True, 
    fmt='d', 
    cmap='Blues', 
    xticklabels=target_names, 
    yticklabels=target_names, 
    cbar=False, 
    ax=axes[0]
)
axes[0].set_title('測試集預測混淆矩陣 (Confusion Matrix)', fontproperties=my_font, fontsize=14, fontweight='bold')
axes[0].set_xlabel('模型預測等級 (Predicted Label)', fontproperties=my_font, fontsize=12)
axes[0].set_ylabel('真實風險等級 (True Label)', fontproperties=my_font, fontsize=12)
axes[0].set_xticklabels(target_names, fontproperties=my_font, fontsize=10)
axes[0].set_yticklabels(target_names, fontproperties=my_font, fontsize=10)

# --- 圖 2:推動判定為「高度風險 (High Risk)」的特徵權重係數 ---
# clf.coef_[2] 對應類別 2 (High Risk) 的線性權重
coef_high = pd.Series(clf.coef_[2], index=X_train.columns).sort_values()

# 顏色區分正負影響:正向推升使用紅橘色,負向保護使用青藍色
colors = ['#4a90e2' if val < 0 else '#e74c3c' for val in coef_high.values]

coef_high.plot(kind='barh', ax=axes[1], color=colors, edgecolor='none', alpha=0.85)
axes[1].axvline(0, color='gray', linestyle='--', linewidth=1)
axes[1].set_title('預測「高度疲勞風險 (High)」之特徵權重係數', fontproperties=my_font, fontsize=14, fontweight='bold')
axes[1].set_xlabel('邏輯回歸迴歸係數 (Log-Odds Coefficient)', fontproperties=my_font, fontsize=12)
axes[1].set_ylabel('輸入特徵項目', fontproperties=my_font, fontsize=12)

plt.tight_layout()
plt.show()

# 6. 輸出各類別係數總表
coef_df = pd.DataFrame(clf.coef_, columns=X_train.columns, index=['Low_Coef', 'Medium_Coef', 'High_Coef']).T
print("=== 模型各類別權重係數矩陣 ===")
display(coef_df.round(4))

https://ithelp.ithome.com.tw/upload/images/20261003/201787949GHgyNaekj.png
https://ithelp.ithome.com.tw/upload/images/20261003/20178794DIaPl7yyy5.png

三、圖表解讀與客觀數據分析
本實作以多元邏輯回歸作為預測用眼疲勞風險的 Baseline 模型,從測試集混淆矩陣、特徵迴歸係數長條圖及係數矩陣中,揭示了線性模型在複雜生理資料上的極限與關鍵洞察:

  1. 混淆矩陣解讀:多數類傾向與「保守型崩塌」
    觀察測試集(100 筆樣本)的混淆矩陣熱力圖,呈現了極端的垂直條狀分佈:
    a.真實分佈:低度風險 24 筆、中度風險 47 筆、高度風險 29 筆。
    b.預測分佈:
  • 中度風險(Medium)預測了93筆(準確捕捉41筆,但誤將23筆低風險、29筆高風險全數判為中度)。
  • 高度風險(High)僅預測了5筆(命中0筆真實高風險,將1筆低風險與4筆中風險誤判為高風險)。
  • 低度風險(Low)僅預測了2筆(全為中風險誤判,命中0筆真實低風險)。
    c.工程與統計洞察:
  • 多數類偏差:因為中度風險在母體中佔比最高(近半數),在特徵與標籤非強線性的情況下,邏輯回歸選擇了一條「最安全」的策略——將樣本往中位數機率集中,導致整體準確率看似達到 41%,但對兩側極端類別(Low、High)的召回率幾乎趨近於0!
  • 這明確證實了線性超平面無法有效劃分本資料集的三分類邊界,單靠線性回歸難以解決非線性與多因子交織的用眼疲勞判定。
  1. 特徵權重係數:特徵工程的成功與線性矛盾
    觀察右側「預測高度疲勞風險」的迴歸係數長條圖與對應權重矩陣
    a.關鍵正向推手:
  • CESI_Score(+0.2995):權重高居全場第一,且遠高於其他特徵。這證明了 Day 15 所設計的「綜合用眼疲勞指數」具備強大的特徵聚合能力,即使在保守的線性模型中,依然是推動判定高風險的最強驅動力。
  • Blurred_Vision_Yes(+0.0746):次要正向因子,呼應了 Day 14 視力模糊是急性生理警訊的發現。
  • Blue_Light_Filter_Used_Yes(+0.0258):呈現微弱正係數,再次佐證濾鏡對降低高風險無實質保護效益。

b.反向係數的反思(Multicollinearity & Suppression Effect):

  • 令人驚訝的是,Eye_Pain_Level(-0.2087)、Daily_Screen_Hours(-0.1416)在 High_Coef 中竟然呈現負值。
  • 數學成因:這是統計學中標準的「抑制效應」與共線性現象。因為 CESI_Score 本身就已經包含了 Eye_Pain_Level 與 Daily_Screen_Hours 的資訊(正權重達 0.2995),在線性回歸同時放入原料特徵與合成特徵時,模型為了抵消多重計算,會給原始特徵負權重進行數學補償。

上一篇
機器學習前哨戰!特徵編碼、標準化與分層資料切分
系列文
用數據守護雙眼:生活型態對視力影響的探索性資料分析 共 19 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言