MOAI 2026 模擬考題

你好!我是 MOAI 2026 的命題專家。根據 IOAI 2026 Syllabus 中對於「表格數據處理 (Tabular Data)」與「監督式學習 (Supervised Learning)」、「資料處理 (Data Processing)」及「特徵工程 (Feature Engineering)」的要求 [1-3],我為你設計了一道符合白名單網路環境(僅能查閱 scikit-learn.org 與 pandas.pydata.org)限制的經典 Kaggle 模擬競賽題。

請準備好你的虛擬鍵盤,以下是你的挑戰題目:


MOAI 2026 ML 模擬任務:慢性病風險預測 (Chronic Disease Risk Classification)

一頁看懂

項目重點
任務類型表格資料二元分類
預測目標risk_label
可用工具pandasscikit-learn
必做步驟缺失值處理、類別編碼、特徵工程、特徵縮放、模型訓練、5-Fold CV
評分指標Macro F1-score
常見陷阱忘記處理 NaN、訓練與驗證流程不一致、沒有用完整 Pipeline

題目背景 (Description)

在精準醫療的趨勢下,利用病患的歷史健康數據來預測其罹患慢性病(如心血管疾病或糖尿病)的風險,是機器學習在醫療領域的經典應用。然而,真實世界的醫療表格數據(Tabular Data)往往是不完美的,充滿了缺失值(Missing Data)以及需要轉換的類別變量(Categorical Features)。

在本任務中,你的目標是處理一份病患的健康檢查與生活習慣數據,進行數據清理與特徵工程,最後訓練一個監督式學習分類器,並使用 5-Fold Cross-Validation 來確保模型的泛化能力(Generalization)。

數據欄位定義 (Dataset Description)

你將獲得一份包含病患資訊的 train.csv,資料欄位說明如下:

欄位名稱說明型別範例/範圍/備註
patient_id病患唯一識別碼int10001 ~ 99999
age年齡float18.0 - 90.0 (含有約 10% 缺失值 NaN)
gender性別str'M', 'F', 'Other'
bmi身體質量指數 (BMI)float15.0 - 45.0
bp_sys收縮壓 (Systolic BP)int90 - 180
bp_dia舒張壓 (Diastolic BP)int60 - 120
cholesterol膽固醇指數float150.0 - 300.0 (含有約 15% 缺失值 NaN)
smoking抽菸習慣str'Never', 'Former', 'Current'
activity運動頻率str'Low', 'Moderate', 'High'
risk_label慢性病高風險 (目標變數)int0 (低風險), 1 (高風險)

任務要求 (Task Requirements)

請假設你身處 MOAI 2026 的比賽現場,只能查閱 pandasscikit-learn 的官方文檔。你必須使用 Python 完成以下流程:

  1. 數據清理 (Data Cleaning):
    • 使用 Pandas 或 Scikit-learn (如 SimpleImputerKNNImputer) 來處理 agecholesterol 的缺失值。
  2. 特徵工程 (Feature Engineering):
    • 對所有類別型變數(gender, smoking, activity)進行轉換(例如使用 pd.get_dummies 或 Scikit-learn 的 OneHotEncoder)。
    • 特徵創造: 請利用現有數值創造至少一個有意義的新醫學特徵。(提示:例如脈壓差 Pulse Pressure = bp_sys - bp_dia)
    • 數值特徵縮放(使用 StandardScalerMinMaxScaler)。
  3. 模型選擇與訓練 (Model Selection & Training):
    • 從 Scikit-learn 中選擇一個適合的分類模型(如 RandomForestClassifier, GradientBoostingClassifier, LogisticRegressionSVC 等)。
  4. 交叉驗證 (Cross-Validation):
    • 對你的完整處理流程(Pipeline)或模型進行 5-Fold Cross-Validation,以確保評估結果穩健。

建議解題流程

步驟要做什麼簡短例子
1讀入資料,確認欄位df.head()
2處理缺失值SimpleImputer(strategy='median')
3類別欄位編碼OneHotEncoder(handle_unknown='ignore')
4建立新特徵pulse_pressure = bp_sys - bp_dia
5數值欄位縮放StandardScaler()
6訓練分類模型RandomForestClassifier()
7用 5-fold 驗證cross_val_score(..., cv=5, scoring='f1_macro')

短範例

df["pulse_pressure"] = df["bp_sys"] - df["bp_dia"]
scores = cross_val_score(pipe, X, y, cv=5, scoring="f1_macro")
print(scores.mean())

評分標準 (Evaluation Metric)

本題的評估指標為 Macro F1-score。 因為醫療數據中,高風險病患(Label=1)往往佔少數(Class Imbalance),所以使用 F1-score 比單純的 Accuracy 更能準確評估模型在正負樣本上的綜合表現。

你的最終得分將取決於 5-Fold CV 的平均 Macro F1-score 表現。

作答前快速檢查

檢查項目是否完成
agecholesterol 已處理缺失值
類別欄位已編碼
至少新增 1 個合理特徵
已做特徵縮放
已使用 5-Fold CV
評分指標為 f1_macro

測驗模式已啟動 🚀

我已經將程式碼鎖在後台。現在,請告訴我你的解題思路,或者直接提供你所撰寫的 Python 程式碼

如果你在某個步驟(例如 Pipeline 的串接、Cross-validation 的語法)需要提示,隨時可以告訴我,我會根據你提供的內容為你進行點評與指導!期待你的解答!


🎬 配套影片資源

完成考題後,建議觀看以下影片對照學習:

影片說明
▶️ MOAI 金獎解答影片本題金獎級解答詳解:Strategy Map、防 Data Leakage 的 Pipeline 寫法、模型打包要點
Built with LogoFlowershow