實戰專案 - Titanic 生存預測專案

實戰專案 - Titanic 生存預測專案

這是一個資料科學專案,目標是透過 Kaggle 經典的 Titanic 生存預測題目,建立一套結構清晰、模組化的預測系統。我不只是想交出一份準確的預測結果,更希望藉由這個專案練習:

  • 如何設計可擴充、可維護的資料分析架構
  • 如何把模型訓練與推論流程標準化
  • 如何用設定檔 (config-driven) 控制整個 pipeline
  • 如何實踐工程導向的資料科學流程

GitHub 原始碼: https://github.com/twcch/TitanicSurvivalPrediction

專案定位:不只是「解題」,而是「設計一套解法系統」

我不滿足於單純把資料丟進模型調整參數。我希望打造的是一個「可重複使用的機器學習預測框架」,因此我做了以下幾點設計:

  • 架構模組化: 依照功能拆分為 data/, features/, models/, utils/,程式碼清楚分工
  • 流程自動化: 所有步驟都由 main.py 控制,方便一鍵執行與重現實驗
  • 設定檔驅動: 核心設定集中管理於 config.json,可以快速切換特徵、模型參數與輸出路徑
  • 可擴充性設計: 未來若要換模型、加特徵、改評估指標,幾乎不需改動主程式碼

這些設計不只是在技術上提升效率,也讓我在做資料科學時,更接近實務工作者的思維模式

資料前處理與特徵工程: 每個欄位都要能「解釋」

我對特徵的要求是: 不只要對模型有用,更要有邏輯、可解釋

  • 處理缺失值
    • Age 用中位數填補
    • Embarked 用眾數填補
    • Fare 缺值極少,仍完整處理
  • 創造新特徵
    • FamilySize = SibSp + Parch: 模擬家庭是否有互助效果
  • 選定使用特徵
    • 類別型: Pclass, Sex, Embarked, Title
    • 數值型: Age, Fare, FamilySize

模型設定: 我選擇 XGBoost,但更重視可控性

雖然這個任務可以用很多模型解,但我選擇以 XGBoost 為主模型,理由如下:

  • Tree-based 模型不需要特徵標準化,工程處理更簡潔
  • 對類別特徵與數值特徵的混合表現良好
  • 在 Kaggle 類似任務中表現穩定,可作為 baseline

模型訓練與推論流程

整個流程包含以下幾步,由 main.py 控制:

  • 讀取資料
  • 進行特徵前處理與編碼 (OneHotEncoder)
  • 拆分訓練與驗證集 (80/20 split)
  • 建立與訓練 XGBoost 模型
  • 計算驗證集準確度 (accuracy)
  • 對測試集做預測並輸出 .csv

我也設計了 XGBoostModel 類別,包裝內部模型與附加元件,方便儲存與部署。

專案成果與輸出

目前模型準確率穩定落在 約 80% 之間,在不調參與不使用 ensemble 技巧下,已具備穩定 baseline 水準。預測結果已可直接提交至 Kaggle

輸出結果包含:

  • 訓練好的模型檔 xgb_model.joblib
  • 預測檔案 submission.csv
  • 可重複執行的程式流程與設定

我的學習收穫

這個專案讓我強化了幾個面向的能力:

  • ✅ 不只「會跑模型」,而是能「設計實驗架構」
  • ✅ 理解模型不是重點,如何整合流程才是真功夫
  • ✅ 學會如何用工程角度思考資料分析任務(版本控管、模組分工、config 驅動)

我相信資料科學最終會走向「系統性與標準化」,這次練習是我往這個方向邁出的第一步。

結語:從解題者走向設計者

Titanic 雖然是入門題目,但我不希望只是提交一份漂亮的預測結果,而是藉此訓練自己「如何設計一套可複用的預測系統」,這也是我在轉型資料科學的過程中,一個重要的能力里程碑。

歡迎有興趣的朋友參考原始碼,也希望與你交流更好的專案設計方式。