我如何運用探索性資料分析、特徵工程、管道與集成模型來解決真實世界的機器學習問題——以及我在此過程中學到的教訓。
介紹
在每一位機器學習學習者的旅程中,總會有一個時刻,僅僅觀看教學影片與完成小型練習已經不再滿足。
在花費數週理解統計學、探索性資料分析(EDA)、特徵工程、前處理技術以及傳統機器學習演算法之後,我想回答一個問題:
我能否將所學的一切應用在真正的機器學習競賽上?
就在此時,我決定參加 Kaggle 的 Playground 競賽。
與課堂資料集不同,Kaggle 競賽迫使你以機器學習工程師的思維來思考。你必須負責理解混亂的資料、建立前處理管道、選擇模型、評估效能、除錯錯誤,最後建立能與數千名參賽者競爭的提交檔案。
本文記錄了我的完整旅程——從載入資料集到建立生產級前處理管道,以及訓練多個集成模型。在此過程中,我也會分享我遇到的挑戰、哪些方法有效,以及我將帶入未來競賽的教訓。
為什麼選擇 Kaggle?
學習機器學習不只是了解演算法。
真實世界的機器學習需要回答以下問題:
- 哪些特徵是有用的?
- 應該如何處理缺失值?
- 類別變數應該使用單熱編碼還是序數編碼?
- 哪些前處理步驟應該放在管道內?
- 不同的集成模型比較如何?
Kaggle 提供了一個能讓所有這些問題都變得重要的環境。
你不是建立一個只在筆記本中運作的模型,而是在真實限制下解決問題,並在未見資料上評估你的解決方案。
競賽目標
本次 Playground 競賽的目標是根據與健康和生活方式相關的數值與類別特徵,預測目標類別。
工作流程遵循許多真實世界機器學習專案所使用的相同結構。
Raw Dataset
│
▼
Exploratory Data Analysis
│
▼
Missing Value Analysis
│
▼
Feature Engineering
│
▼
Preprocessing Pipeline
│
▼
Model Training
│
▼
Evaluation
│
▼
Prediction
│
▼
Kaggle Submission
Enter fullscreen mode Exit fullscreen mode
雖然工作流程看似簡單,但每個階段都需要仔細的決策。
了解資料集
第一步是使用 Pandas 載入訓練集與測試集。
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
Enter fullscreen mode Exit fullscreen mode
在撰寫任何機器學習模型之前,我花時間了解資料的結構。
我探討的一些問題包括:
- 資料集中有多少列與欄?
- 哪些特徵是數值的?
- 哪些特徵是類別的?
- 是否有缺失值?
- 每個特徵的分布如何?
- 是否有明顯的離群值?
跳過這個階段通常會導致模型效能不佳,因為前處理決策完全取決於資料的特徵。
探索性資料分析(EDA)
EDA 成為這個專案中最有價值的部分之一。
我沒有立即訓練模型,而是想了解資料集的行為。
我將特徵分成兩個大類:
數值特徵
範例包括:
- 睡眠時長
- 心率
- BMI
- 熱量消耗
- 步數
- 運動時長
- 水分攝取
類別特徵
範例包括:
- 飲食類型
- 性別
- 吸菸/飲酒
- 體能活動程度
- 睡眠品質
- 壓力程度
這種分類讓我更容易應用不同的視覺化技術。
視覺化數值特徵
對於數值欄位,我使用以下方式探索資料:
- 直方圖
- KDE 圖
- 箱形圖
這些視覺化幫助回答重要問題。
特徵是否呈常態分布?
有些變數的分布接近常態,而其他變數則呈現明顯的偏態。
是否有極端值?
箱形圖顯示數個數值特徵中存在離群值。
資料是否對稱?
使用偏度計算與 KDE 圖,讓我更容易了解是否需要進行轉換。
我沒有盲目地前處理資料,而是根據證據做出決策。
了解缺失值
我執行的第一項分析是檢查資料集中缺失值的百分比。
train.isnull().mean() * 100
Enter fullscreen mode Exit fullscreen mode
缺失值是真實世界資料集中最常見的問題之一。
忽略它們不是選項,因為大多數機器學習演算法無法使用不完整的資料進行訓練。
我沒有用單一常數替換所有缺失值,而是決定稍後在管道中使用適當的前處理技術。
探索類別特徵
對於類別變數,我建立了計數圖來了解每個類別的頻率分布。
這些圖表回答了以下問題:
- 哪種飲食類型出現最頻繁?
- 體能活動程度如何分布?
- 性別是否影響某些生活方式變數?
- 是否有某些類別極為罕見?
我還使用分組視覺化來探索不同類別變數之間的關係。
這幫助我在訓練任何模型之前,對資料集建立直覺。
在建立模型之前建立直覺
在 EDA 過程中,有一個教訓變得非常清楚:
更好的理解往往導致更好的前處理。
機器學習不只是選擇強大的演算法。
輸入資料的品質對最終預測的品質有巨大影響。
這就是為什麼我在進行特徵工程之前,花費大量時間探索資料。
特徵工程
了解資料集後,下一步是為機器學習準備資料。
第一項任務是分離特徵與目標變數。
X = train.drop(columns=["health_condition"])
y = train["health_condition"]
Enter fullscreen mode Exit fullscreen mode
這在以下兩者之間建立了清晰區分:
- 輸入特徵(
X) - 目標標籤(
y)
接著我將訓練資料分割為訓練集與驗證集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42
)
Enter fullscreen mode Exit fullscreen mode
建立驗證集讓我能在提交 Kaggle 之前評估模型效能。
為什麼前處理很重要
不同的特徵類型需要不同的前處理策略。
例如:
| 特徵類型 | 前處理 |
|---|---|
| 數值 | 插補 + 縮放 |
| 序數類別 | 序數編碼 |
| 名義類別 | 單熱編碼 |
| 目標變數 | 標籤編碼 |
使用錯誤的前處理技術可能會顯著降低模型效能。
我沒有手動轉換每個欄位,而是想要一個更乾淨且可重複使用的解決方案。
這就是 Scikit-learn 管道變得極其有用的地方。
組織特徵
我將特徵分成邏輯群組。
數值欄位
需要縮放與缺失值處理的連續數值變數。
序數類別
具有自然順序的特徵,例如活動或壓力程度。
這些可以安全地轉換為有序數值。
名義類別
例如性別或飲食類型等特徵沒有自然順序。
指派任意數字可能會引入不必要的關係,因此單熱編碼是更好的選擇。
這種分類讓前處理管道更容易維護。
建立生產級前處理管道
我沒有為每個模型重複撰寫前處理程式碼,而是使用了 Scikit-learn 的 Pipeline 與 ColumnTransformer。
這種方法提供了多項優勢:
- 更乾淨的程式碼
- 降低資料洩漏風險
- 一致的前處理
- 更容易對多個模型進行實驗
- 生產就緒的工作流程
我沒有手動逐一應用轉換,而是讓管道在模型訓練前自動執行每個前處理步驟。
這是我相較於早期機器學習專案所做出的最大改進之一。
建立生產就緒的機器學習管道
我在這個專案中相較於早期機器學習練習所做出的最大改進之一,就是從手動前處理轉向自動化。
我沒有為每個模型撰寫個別的前處理程式碼,而是使用 Scikit-learn 建立可重複使用的管道。
這種方法遵循生產機器學習系統所使用的相同理念。
我不需要記住數十個前處理步驟,所有步驟都自動化在單一工作流程中。
設計前處理管道
不同的特徵類型需要不同的轉換。
我的前處理工作流程如下:
Raw Dataset
│
▼
Separate Numerical & Categorical Features
│
├───────────────┐
│ │
▼ ▼
Numerical Categorical
│ │
KNN Imputer Simple Imputer
│ │
StandardScaler Encoding
│ │
└──────┬────────┘
▼
ColumnTransformer
▼
Machine Learning Model
Enter fullscreen mode Exit fullscreen mode
我沒有手動轉換每個欄位,而是讓管道自動對每個特徵類型應用正確的前處理。
這讓程式碼更乾淨、可重複使用且較不易出錯。
處理缺失值
真實世界資料集中不可避免地會有缺失值。
我沒有刪除列而失去寶貴資訊,而是根據特徵類型應用不同的插補策略。
對於數值特徵,我使用了 KNN Imputer。
KNN 插補的理念很簡單。
它不是用平均值或中位數填補缺失值,而是尋找最相似的觀測值,並根據這些鄰近值估算缺失值。
對於類別特徵,我使用了帶有最常見類別的 Simple Imputer。
這保留了類別資料的完整性,同時避免了不必要的資料損失。
編碼類別變數
機器學習模型無法直接理解文字。
因此,類別變數需要轉換為數值表示。
我將類別欄位分成兩組。
序數特徵
這些特徵具有自然順序。
範例包括活動程度或壓力程度。
對於這些變數,我使用了 Ordinal Encoding。
Low → 0
Medium → 1
High → 2
Enter fullscreen mode Exit fullscreen mode
由於這些類別具有有意義的順序,序數編碼保留了這種關係。
名義特徵
有些特徵沒有自然順序。
範例包括性別或飲食類型。
指派數字如
Male = 0
Female = 1
Enter fullscreen mode Exit fullscreen mode
可能會無意中暗示數學關係。
相反地,我應用了 One-Hot Encoding,讓每個類別都有自己的二元欄位。
這防止模型假設不存在的順序。
為什麼我使用 ColumnTransformer
如果沒有 ColumnTransformer,前處理很快就會變得難以管理。
不同的特徵群組需要不同的轉換。
ColumnTransformer 允許所有轉換在單一統一的前處理階段發生,而不是手動應用每個轉換。
這使得實驗變得更容易,因為更換模型不再需要重寫前處理程式碼。
建立可重複使用的管道
建立前處理管道後,我將其與不同的機器學習演算法結合。
我沒有為每個模型撰寫個別的前處理程式碼,而是簡單地替換最終的估計器。
概念上,每個管道都遵循此結構:
Preprocessing
│
▼
Machine Learning Model
│
▼
Predictions
Enter fullscreen mode Exit fullscreen mode
這讓我在保持前處理完全一致的情況下,比較多個演算法。
訓練多個集成模型
我沒有依賴單一演算法,而是訓練了多個集成模型來比較它們的效能。
模型包括:
- Random Forest
- XGBoost
- CatBoost
- LightGBM
每個模型都有自己的優勢。
Random Forest
Random Forest 是我的基準集成模型。
其優勢包括:
- 穩健的效能
- 處理非線性關係
- 抗過擬合
- 可用於特徵重要性
它在實驗提升演算法之前,為我提供了強大的基準。
XGBoost
XGBoost 是競爭性機器學習中最受歡迎的梯度提升函式庫之一。
在我的實作中,我配置了以下參數:
- 300 個估計器
- 學習率 0.05
- 最大樹深度
- 子抽樣
- 欄位抽樣
- 基於直方圖的樹建構
- GPU 加速
目標是在預測效能與計算效率之間取得平衡。
CatBoost
CatBoost 在處理包含類別變數的資料集時特別有效。
即使我的前處理管道已經處理了編碼,CatBoost 仍然提供了另一個強大的集成模型供比較。
我使用 GPU 加速來訓練它,以減少計算時間。
LightGBM
LightGBM 專為效率而設計。
它使用基於直方圖的學習與葉子式樹生長,在維持競爭性效能的同時極為快速。
其高效擴展的能力使其成為 Kaggle 競賽中的熱門選擇。
評估模型效能
訓練模型只是工作流程的一半。
下一步是評估模型的表現。
我使用多個評估指標來比較模型,而不僅依賴準確率。
這些指標包括:
- 準確率
- 精確率
- 召回率
- F1 分數
每個指標都提供了對模型行為的不同洞察。
查看多個指標有助於避免僅使用準確率可能造成的誤導性結論。
分類報告
為了更深入了解效能,我為每個模型生成了分類報告。
這些報告顯示:
- 每個類別的精確率
- 每個類別的召回率
- F1 分數
- 整體準確率
- 宏觀平均
- 加權平均
我沒有將模型視為黑箱,而是透過這些報告揭示模型在哪些方面表現良好,以及在哪些方面有困難。
混淆矩陣
另一個有價值的視覺化是混淆矩陣。
混淆矩陣不僅顯示預測錯誤,還顯示模型將哪些類別互相混淆。
這通常能揭示原始準確率無法顯示的模式。
對於多類別分類問題,混淆矩陣提供了對模型弱點的寶貴洞察。
比較模型
我沒有分別評估模型,而是建立了一個包含以下指標的比較表:
| 模型 | 準確率 | 精確率 | 召回率 | F1 分數 |
|---|---|---|---|---|
| XGBoost | 比較 | 比較 | 比較 | 比較 |
| CatBoost | 比較 | 比較 | 比較 | 比較 |
| LightGBM | 比較 | 比較 | 比較 | 比較 |
比較表讓識別不同演算法之間的權衡變得更容易。
我學到的教訓
回顧這個競賽,它教給我的遠不止是訓練機器學習模型。
一些最重要的教訓包括:
了解資料比選擇模型更重要。
強大的前處理管道通常比切換演算法更能提升效能。
管道能節省大量時間。
我不需要重複撰寫前處理程式碼,所有內容都變得模組化且可重複使用。
評估不應依賴單一指標。
僅靠準確率很少能說明完整的故事。
集成方法很強大。
比較多個演算法幫助我了解每種方法的優點與限制。
過程中的挑戰
如同每個真實專案,這次競賽涉及多次除錯。
我遇到的問題與以下相關:
- 前處理
- 管道建構
- 模型實驗
- 評估
- 提交工作流程
雖然這些挑戰有時令人沮喪,但解決它們大大提升了我對完整機器學習生命週期的理解。
回顧起來,那些除錯過程與成功的模型訓練一樣教會了我很多。
超越 Kaggle 分數
關於 Kaggle 的一個最大誤解是,成功僅以排行榜位置來衡量。
對我而言,真正的成就不僅是產生預測。
而是學會如何建立端到端的機器學習工作流程。
這個專案要求我結合之前分別學習的概念:
- 探索性資料分析
- 資料清理
- 特徵工程
- 缺失值處理
- 編碼
- 縮放
- 管道
- 集成學習
- 模型評估
這些概念首次在單一專案中結合在一起。
結論
這次競賽標誌著我機器學習旅程中的重要里程碑。
在這個專案之前,前處理技術、管道、集成模型與評估指標都是我分別學習的主題。
透過實際的 Kaggle 競賽,我看到了這些部分如何結合在一起,解決端到端的機器學習問題。
雖然還有許多要學習的——從進階特徵工程、超參數最佳化到模型集成與部署——但這次經驗讓我有信心超越教學影片,並在實際環境中應用機器學習概念。
如果你剛開始你的 Kaggle 旅程,我最大的建議很簡單:
不要先追逐排行榜。先追求理解。
在資料分析、前處理與實驗上的穩固基礎,會比記憶模型參數帶你走得更遠。每一次競賽都是學習、精煉工作流程並成為更好機器學習實踐者的機會。
對我而言,這不只是一個筆記本——它是將數週學習轉化為真實實作經驗的專案。而這正是讓 Kaggle 成為任何認真學習機器學習的人如此有價值的平台的原因。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.