1. はじめに
- 非エンジニアが Kaggle Playground へ挑戦
- 目的:汎用ベースラインの構築 + 特徴量作成の学び
- 今回の題材:クロス特徴量の作り方
2. アプローチ概要
- 使用環境:Kaggle Notebook
- 使用モデル:LightGBM, XGBoost, CatBoost
- 参考にした公開Notebook:"Notebook by GM C. Deotte :XGBoost - Using Original Data - [CV 0.976]", GM C. Deotte [1]
3. 実装の工夫:クロス特徴量
- これまで特徴量を作成する際、カラムの組み合わせを一つ加えてCV確認、改善すれば採用、悪化すれば不採用、というループを回していた。例えば、下記のコードの通り。
# (1) 住宅ローンあり + 債務残高
all_df["housing_loan"] = all_df["housing"].astype(str) + "_" + all_df["loan"].astype(str)
# (2) コンタクト時間 x 年齢
all_df["duration_x_age"] = all_df["duration"] * all_df["age"]
# (3) sin,cos(コンタクト時間)
all_df['duration_sin'] = np.sin(2*np.pi * all_df['duration'] / 400)
all_df['duration_cos'] = np.cos(2*np.pi * all_df['duration'] / 400)
- GM Chris氏の公開コードより、「カテゴリ列」と「数値列」を網羅的に組み合わせる方法を学んだ。実装内容は下記の通り。(詳細は参考文献 [1] )
① カテゴリ列(CATS)、数値列(NUMS)を保存
② 数値列をカテゴリに変換 → CATS1
③ CATS + CATS1をラベルエンコードしサイズ(SIZES)保存
④ (c1,c2)の組み合わせで新規特徴量CATS2を作成
CATS2 = c1 x SIZES[c2] + c2
⑤ CATS + CATS1 + CATS2 の CE (カウントエンコード)を保存
⑥ CATS1, CATS2 は TE (ターゲットエンコード) 特徴量として更新
4. スコア推移(AUC)
| 番号 | 内容 | CV | Public LB | Private LB | 備考 |
|---|---|---|---|---|---|
| 01 | ベースライン | 0.9688 | 0.9689 | 0.9686 | LGBM/XGB/CB |
| 02 | 特徴量追加 | 0.9712 | 0.9723 | 0.9719 | 最終提出(期限内) |
| 03 | XGB + TE | 0.9753 | 0.9767 | 0.9763 | Chris氏コード編集 |
| 04 | LGBM + TE | 0.9756 | 0.9766 | 0.9763 | 03をLightGBMへ移植 |
| 05 | アンサンブル | 0.9762 | 0.9770 | 0.9766 | 外部データ含む[2] |
最終スコア
Late Submission
まとめ
- クロス特徴量の網羅的な生成 + TEの組合せが大きな改善につながった
- 期限内の最終提出は AUC 0.9723 (Public LB)
- Late Submissionでは AUC 0.9770 に到達
- Kaggle初心者として学んだこと
(1) 手動の特徴量作成より「網羅的な組合せ」+ TEの方が強力
(2) 実務では「特徴量の意味」を説明できることが不可欠 - 今後の挑戦
(1) Playgroundに継続参加し、公開コードを含めて新たな経験を蓄積
(2) テーブルデータコンペで一定の成果を出せるようになること
本記事は自身の学習記録ですが、特徴量設計・モデル改善のアプローチは業務のデータ活用にも応用可能だと考えています。
参考文献
[1] Notebook by GM Chris :XGBoost - Using Original Data - [CV 0.976]
https://www.kaggle.com/code/cdeotte/xgboost-using-original-data-cv-0-976
[2] 自身のGitHubコード
https://github.com/gentlech0/product/blob/main/01_Kaggle/01_Playground/S5E8/10_S5E8-Final-Edition.ipynb


