針對桌球回合同步預測三個目標變數,使用 LightGBM 建立多模型 pipeline,並產出可直接提交的 submission.csv。
比賽需要對每一個 rally(來回)預測三個目標:
actionId(多分類):預測「下一拍動作類型」pointId(多分類):預測「下一拍落點區域」serverGetPoint(二分類):預測「該回合最後是否由發球方得分」
本程式將三個任務拆成三個獨立模型來訓練與預測,最後組合成一份提交檔。
-
讀取資料
- 讀取
train.csv、test.csv至 DataFrame。 - 複製為
train_new、test_new供後續修改。
- 讀取
-
調整標籤編碼
- 將
actionId、pointId整體加 1,避免使用 0 作為類別編碼,利於後續編碼與處理。
- 將
-
對齊「下一拍」標籤
- 以
rally_uid分組,將actionId、pointId進行 向後位移一拍(shift -1),作為要預測的「下一拍」標籤。 - 排除在位移後產生缺失值(通常是每個 rally 的最後一拍)的樣本。
- 以
-
目標欄位與特徵欄位
- 目標:
y_action:下一拍的actionIdy_point:下一拍的pointIdy_server:該回合的serverGetPoint
- 移除與預測無關或身分性質欄位,例如:
rally_uid,rally_id,match,numberGame,serverGetPoint等,作為特徵的排除欄位。
- 目標:
-
時序 Lag 特徵
- 針對具代表性的欄位(例如
actionId,pointId,spinId,strengthId,positionId),以rally_uid分組,建立過去 1、2、3 拍的歷史特徵(prev_1_*,prev_2_*,prev_3_*)。 - 這些特徵讓模型能掌握球來回的節奏與模式。
- 針對具代表性的欄位(例如
-
Target Encoding
- 對部分類別欄位(例如
strengthId,spinId,handId)進行 target encoding。 - 使用 下一拍的
actionId作為 target,讓這些特徵反映「此類型擊球通常導致什麼樣的下一拍動作」。
- 對部分類別欄位(例如
-
類別型欄位標註
- 將包含離散值的欄位(如
sex、原始欄位與各種 lag 特徵)標註為category型別,讓 LightGBM 自動以類別方式處理。
- 將包含離散值的欄位(如
-
Rally 等級切分(避免資料洩漏)
- 先取得所有
rally_uid的唯一值,隨機切分為訓練集與驗證集的 rally 清單(例如 8:2)。 - 之後再依
rally_uid是否在清單內,產生 train/valid 的 row mask。 - 這樣可以確保:同一個 rally 不會同時出現在訓練與驗證中,避免時間與內容洩漏。
- 先取得所有
-
不平衡問題處理
- 使用
class_weight計算類別權重,轉成sample_weight傳入 LightGBM 訓練,使少數類別能被較公平地學習。
- 使用
-
模型架構
- 共訓練 三個獨立 LightGBM 模型:
actionId:多分類模型pointId:多分類模型serverGetPoint:二分類模型
- 多分類模型使用多類別交叉熵(multi_logloss)作為優化目標,二分類模型使用 binary logloss。
- 共訓練 三個獨立 LightGBM 模型:
-
評估指標
actionId:加權 F1 分數(weighted F1)pointId:加權 F1 分數(weighted F1)serverGetPoint:ROC AUC 分數- 並計算一個加權總分:
0.4 * F1_action + 0.4 * F1_point + 0.2 * ROC_AUC_server
- 訓練過程同時輸出各任務的混淆矩陣圖檔,協助分析各類別的預測情形。
-
測試集特徵處理
- 在
test_new上進行與訓練資料相同的前處理與特徵工程(lag 特徵、target encoding、欄位型態設定等)。
- 在
-
只取每個 rally 的最後一拍進行預測
- 針對測試集,對每個
rally_uid取出最後一筆紀錄,作為該 rally 的代表樣本。 - 對這些最後一拍的特徵餵入三個模型進行預測。
- 針對測試集,對每個
-
還原 label 編碼與輸出
- 由於訓練時
actionId、pointId有做 +1 平移,因此在輸出時需再 -1 還原回原始編碼。 - 將
rally_uid、serverGetPoint、pointId、actionId組成 DataFrame,輸出成submission.csv,格式符合競賽要求。
- 由於訓練時
需要 Python 3.x,並安裝下列套件(可使用 pip):
pandasnumpylightgbmxgboostcategory_encodersscikit-learntqdmmatplotlibseaborn
安裝範例:
pip install pandas numpy lightgbm xgboost category_encoders scikit-learn tqdm matplotlib seaborn請將程式與資料整理如下:
.
├── main.py # 內含使用 LightGBM 訓練與推論的完整程式
└── README.md
若你的主程式檔名不同,請自行調整以下執行指令中的檔名。
-
確認
train.csv、test.csv與main.py位於同一資料夾。 -
在該資料夾開啟終端機或命令列。
-
執行:
python main.py
-
程式執行流程會自動完成:
- 資料前處理與特徵工程
- Rally-level 切分訓練/驗證
- 三個 LightGBM 模型訓練與評估
- 混淆矩陣圖檔輸出
- 測試集推論與
submission.csv生成
-
欄位說明:
欄位名稱 說明 rally_uid回合同一識別碼 serverGetPoint模型預測之發球方是否得分 (0/1) pointId模型預測之下一拍落點類別 actionId模型預測之下一拍動作類別 -
可直接上傳至比賽平台作為預測結果。
程式會輸出三張 PNG 圖檔(檔名依任務命名),內容為:
- 真實標籤 vs 預測標籤的混淆矩陣
- 有助於檢視模型對不同類別的預測強弱與錯誤型態
本專案的重點特色:
- 使用 時序特徵(lag features) 搭配 rally 序列結構
- 將三個預測目標拆成三個 LightGBM 模型,便於獨立調整與分析
- 使用 class weight / sample weight 緩解資料不平衡問題
- 採用 rally-level 訓練/驗證切分,避免同一回合資訊洩漏
- 自動產生
submission.csv與混淆矩陣圖檔,方便提交與檢視結果
只要準備好 train.csv、test.csv,安裝必要套件並執行 python main.py,即可完整重現本方法的訓練與推論流程。