MOAI 2026 模擬考題
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 |
| 可用工具 | pandas、scikit-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 | 病患唯一識別碼 | int | 10001 ~ 99999 |
age | 年齡 | float | 18.0 - 90.0 (含有約 10% 缺失值 NaN) |
gender | 性別 | str | 'M', 'F', 'Other' |
bmi | 身體質量指數 (BMI) | float | 15.0 - 45.0 |
bp_sys | 收縮壓 (Systolic BP) | int | 90 - 180 |
bp_dia | 舒張壓 (Diastolic BP) | int | 60 - 120 |
cholesterol | 膽固醇指數 | float | 150.0 - 300.0 (含有約 15% 缺失值 NaN) |
smoking | 抽菸習慣 | str | 'Never', 'Former', 'Current' |
activity | 運動頻率 | str | 'Low', 'Moderate', 'High' |
risk_label | 慢性病高風險 (目標變數) | int | 0 (低風險), 1 (高風險) |
任務要求 (Task Requirements)
請假設你身處 MOAI 2026 的比賽現場,只能查閱 pandas 與 scikit-learn 的官方文檔。你必須使用 Python 完成以下流程:
- 數據清理 (Data Cleaning):
- 使用 Pandas 或 Scikit-learn (如
SimpleImputer或KNNImputer) 來處理age與cholesterol的缺失值。
- 使用 Pandas 或 Scikit-learn (如
- 特徵工程 (Feature Engineering):
- 對所有類別型變數(
gender,smoking,activity)進行轉換(例如使用pd.get_dummies或 Scikit-learn 的OneHotEncoder)。 - 特徵創造: 請利用現有數值創造至少一個有意義的新醫學特徵。(提示:例如脈壓差 Pulse Pressure = bp_sys - bp_dia)
- 數值特徵縮放(使用
StandardScaler或MinMaxScaler)。
- 對所有類別型變數(
- 模型選擇與訓練 (Model Selection & Training):
- 從 Scikit-learn 中選擇一個適合的分類模型(如
RandomForestClassifier,GradientBoostingClassifier,LogisticRegression或SVC等)。
- 從 Scikit-learn 中選擇一個適合的分類模型(如
- 交叉驗證 (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 表現。
作答前快速檢查
| 檢查項目 | 是否完成 |
|---|---|
age 與 cholesterol 已處理缺失值 | □ |
| 類別欄位已編碼 | □ |
| 至少新增 1 個合理特徵 | □ |
| 已做特徵縮放 | □ |
| 已使用 5-Fold CV | □ |
評分指標為 f1_macro | □ |
測驗模式已啟動 🚀
我已經將程式碼鎖在後台。現在,請告訴我你的解題思路,或者直接提供你所撰寫的 Python 程式碼。
如果你在某個步驟(例如 Pipeline 的串接、Cross-validation 的語法)需要提示,隨時可以告訴我,我會根據你提供的內容為你進行點評與指導!期待你的解答!
🎬 配套影片資源
完成考題後,建議觀看以下影片對照學習:
| 影片 | 說明 |
|---|---|
| ▶️ MOAI 金獎解答影片 | 本題金獎級解答詳解:Strategy Map、防 Data Leakage 的 Pipeline 寫法、模型打包要點 |