iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
AI & Data

咖狗報到-30天玩轉Kaggle競賽系列 第 11

一起來參加Kaggle競賽-提升實戰經驗11(Baseline model)

  • 分享至 

  • xImage
  •  

在昨天,我們已經完成檢查資料缺失值與編碼,將原始資料轉換成適合輸入機器學習模型的數字矩陣。今天,我們要建立一個簡單的 Baseline Model,目的是確保資料處理正確,並取得一個基準分數,作為之後模型優化的比較基準。


1. 建立 Baseline Model

昨天我們介紹了 Target Encoding、Frequency Encoding 和 One-Hot Encoding,今天我們來看看這三種編碼方法對模型表現有什麼影響。這次我選擇使用 RandomForestClassifier 作為 baseline model,因為它能快速收斂,且對資料標準化與特徵縮放(feature scaling)不敏感,很適合用來當這次比賽的初期驗證模型。


One-Hot Encoding + RandomForest Baseline

# === One-Hot Encoding + RandomForest Baseline ===
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

train_oh = pd.get_dummies(X, columns=cat_cols)

X_train, X_val, y_train, y_val = train_test_split(train_oh, y, test_size=0.2, random_state=42)
rf_oh = RandomForestClassifier(random_state=42)
rf_oh.fit(X_train, y_train)
y_pred_oh = rf_oh.predict(X_val)
print("One-Hot Encoding Baseline Accuracy:", accuracy_score(y_val, y_pred_oh))

One-Hot Encoding + RandomForest Baseline


Frequency Encoding + RandomForest Baseline

# === Frequency Encoding ===
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score


train_fe = X.copy()
for col in cat_cols:
    freq_map = train_fe[col].value_counts(normalize=True)
    train_fe[col] = train_fe[col].map(freq_map)

X_train, X_val, y_train, y_val = train_test_split(train_fe, y, test_size=0.2, random_state=42)
rf_fe = RandomForestClassifier(random_state=42)
rf_fe.fit(X_train, y_train)
y_pred_fe = rf_fe.predict(X_val)
print("Frequency Encoding Baseline Accuracy:", accuracy_score(y_val, y_pred_fe))

Frequency Encoding + RandomForest Baseline

Target Encoding + RandomForest Baseline

##  === Target Encoding + RandomForest Baseline ===
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score



# 建立 Baseline Model
X_train, X_val, y_train, y_val = train_test_split(train_te, y, test_size=0.2, random_state=42)
rf_te = RandomForestClassifier(random_state=42)
rf_te.fit(X_train, y_train)
y_pred_te = rf_te.predict(X_val)
print("Target Encoding Baseline Accuracy:", accuracy_score(y_val, y_pred_te))

Target Encoding + RandomForest Baseline

第一次嘗試 Target Encoding,居然 Accuracy 0.99?

我們可以仔細觀察 Target Encoding 搭配 RandomForestClassifier 建立第一個 baseline model,結果驗證集 Accuracy 居然高達 0.9926!乍看之下好像超強,跑出來後我嚇一大跳,但其實這個分數可能太過完美,反而讓我懷疑是不是哪裡出錯了。


我的推測

  • 我懷疑高分的原因是 我不小心把答案偷偷告訴了模型
  • 會出現「把答案告訴模型」的情況,是因為我在做 Target Encoding 時:
    1. 用整個訓練集計算每個類別的目標平均值
    2. 再切 train/val split 來訓練模型
      這代表驗證集的特徵也用到自己的標籤來計算平均值,模型在學習時就已經知道了答案,這種狀況就是典型的 Target Leakage

2.明日計畫

也因為這樣明天我需要把這個bug修理好:

  1. 改成 OOF (Out-Of-Fold) Target Encoding,讓驗證集的編碼不使用自己的標籤
  2. 比較 Target Encoding、Frequency Encoding、One-Hot Encoding 三種方法的分數
  3. 產生新的 submission,確認排行榜成績

程式就是要多嘗試、多 debug 才會進步!
明天我們就來好好修正這個 bug,分數應該就會回到合理的樣子


上一篇
一起來參加Kaggle競賽-提升實戰經驗10(資料前處理-One-Hot Encoding、Frequency Encoding 、Target Encoding)
下一篇
一起來參加Kaggle競賽-提升實戰經驗12(out-of-fold predictions)
系列文
咖狗報到-30天玩轉Kaggle競賽15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言