? 今日目標
- 引入多種常見分類模型(隨機森林、支持向量機、K近鄰等)
- 比較不同模型的訓練效果
- 使用交叉驗證提升評估穩定性
🧾 一、對比模型列表
模型 | 類名(sklearn) | 適用說明 |
---|---|---|
邏輯回歸 | LogisticRegression | 基礎線、易于解釋 |
KNN | KNeighborsClassifier | 基于鄰近數據點 |
決策樹 | DecisionTreeClassifier | 可視化,易過擬合 |
隨機森林 | RandomForestClassifier | 綜合表現較優,抗過擬合 |
支持向量機 | SVC | 高維表現好,耗時較久(適合小數據) |
🧪 二、交叉驗證策略
使用 cross_val_score
進行 K 折交叉驗證,常用 cv=5
:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring="accuracy")
還可以比較不同模型的:
accuracy
roc_auc
f1_macro
等指標
🧪 今日練習任務
編寫腳本 model_compare_cv.py
,實現:
-
加載
processed_X_train.csv
與標簽 -
初始化多個模型
-
對每個模型進行 5 折交叉驗證
-
輸出每個模型的平均準確率和 AUC
# model_compare_cv.py - 多模型比較與交叉驗證(優化版)import pandas as pd import numpy as np import warnings from sklearn.model_selection import cross_val_score from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.svm import SVC# 忽略數值計算警告 warnings.filterwarnings("ignore", category=RuntimeWarning)# 讀取訓練數據 X = pd.read_csv("./data/stage4/processed_X_train.csv") y = pd.read_csv("./data/stage4/processed_y_train.csv").values.ravel()# 檢查數值問題 print("🔎 是否包含 NaN:", X.isna().sum().sum()) print("🔎 是否包含 Inf:", (~np.isfinite(X)).sum().sum()) print("🔎 特征最大值:", X.max().max()) print("🔎 特征最小值:", X.min().min())# 標準化所有特征 scaler = StandardScaler() X_scaled = pd.DataFrame(scaler.fit_transform(X), columns=X.columns)# 定義模型集合 models = {"Logistic Regression": LogisticRegression(max_iter=1000, random_state=42),"K-Nearest Neighbors": KNeighborsClassifier(),"Decision Tree": DecisionTreeClassifier(random_state=42),"Random Forest": RandomForestClassifier(random_state=42),"SVM": SVC(probability=True, random_state=42), }# 定義評價指標 scoring = ["accuracy", "roc_auc"]# 逐模型評估 for name, model in models.items():print(f"🔍 模型:{name}")for score in scoring:cv_scores = cross_val_score(model, X_scaled, y, cv=5, scoring=score)print(f" [{score}] 平均得分: {cv_scores.mean():.4f} ± {cv_scores.std():.4f}")print("-" * 40)print("? 所有模型交叉驗證完畢。")
運行輸出:
🔎 是否包含 NaN: 0 🔎 是否包含 Inf: 0 🔎 特征最大值: 1.6341648019019988 🔎 特征最小值: -1.6565987890014815 🔍 模型:Logistic Regression[accuracy] 平均得分: 0.7500 ± 0.0988[roc_auc] 平均得分: 0.8409 ± 0.0656 ---------------------------------------- 🔍 模型:K-Nearest Neighbors[accuracy] 平均得分: 0.6875 ± 0.0906[roc_auc] 平均得分: 0.7469 ± 0.0751 ---------------------------------------- 🔍 模型:Decision Tree[accuracy] 平均得分: 0.6438 ± 0.0829[roc_auc] 平均得分: 0.6442 ± 0.0829 ---------------------------------------- 🔍 模型:Random Forest[accuracy] 平均得分: 0.6937 ± 0.0696[roc_auc] 平均得分: 0.7739 ± 0.0815 ---------------------------------------- 🔍 模型:SVM[accuracy] 平均得分: 0.6813 ± 0.0914[roc_auc] 平均得分: 0.7829 ± 0.0867 ---------------------------------------- ? 所有模型交叉驗證完畢。