1. はじめに
SIGNATEのコンペに参加して、メダルを獲得することが出来ました。なので、備忘録としてこの記事を書くことにしました。
初めて記事を書くので、拙い部分が沢山あると思いますが、最後までお付き合いしていただけると幸いです
2. 参加したコンペについて
現在、SIGNATEでSOTA ChallengeになっているSIGNATE Cup 2024(URL: https://signate.jp/competitions/1523 )に参加しました。
このコンペのタスクは、旅行会社が保有する顧客データ(属性、志向、営業担当との接触履歴など)を基に、旅行パッケージの成約率を予測するモデルを構築することです。
3. 実装したコードの詳細
以下は、銅メダル獲得時に使用したコードを説明していきます。
3.1. 前処理
基本的には、データの形状の統一、外れ値処理、欠損値処理、ダミー変数化を実施しました。
これらに当てはまらない前処理を行ったのは、customer_info だけです。
具体的に customer_info に施した前処理は以下のようになります。
- 婚姻状況、車の所有、子どもの人数
- 婚姻状況は、"未婚"・"離婚済み"・"結婚済み"・"独身" に分類し、ラベリング
- 車の所有は、"所持"・"未所持"に分類し、ラベリング
- 子どもの人数は、整数型に変換
以上が施した前処理になります。基本の処理は、データの形状を見ながら、特徴量ごとに行いました。詳細は、リクエストがあったら載せようと思います🙇
3.2. モデル選定
私が使用したモデルは、XGBoost単体モデルです。理由は以下になります。
- 高速な学習が可能
- ハイパーパラメータの柔軟な調整が可能
- 欠損値を自然に処理が可能
- LightGBMや、CatBoostよりLBのスコアが高かった(アンサンブルも試したが、XGBoost単体の方がLBのスコアが高かった)← この理由が1番大きいです
3.3. クロスバリデーション
精度向上のために、StratifiedKFold を用いてデータを分割しました。以下のような設定で実装しました。
- 分割数は 5
- データ分布を考慮した層化サンプリングを採用
# クロスバリデーションの設定
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
3.4. ハイパーパラメータチューニング
XGBoost のハイパーパラメータを最適化するため、以下の範囲でグリッドサーチを実行しました。
# ハイパーパラメータの候補
param_grid = {
'n_estimators': [100, 200, 500],
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.05, 0.1],
'subsample': [0.6, 0.8, 1.0],
'colsample_bytree': [0.6, 0.8, 1.0],
'reg_alpha': [0, 0.1, 1],
'reg_lambda': [0, 0.1, 1]
}
# モデルの定義
xgb_model = XGBClassifier(
objective='binary:logistic',
use_label_encoder=False,
eval_metric='logloss',
random_state=42
)
# グリッドサーチの実行
grid_search = GridSearchCV(
estimator=xgb_model,
param_grid=param_grid,
scoring='neg_log_loss',
cv=skf,
n_jobs=-1,
verbose=1
)
grid_search.fit(X, y)
最適なパラメータは以下になりました。
- n_estimators: 500
- max_depth: 5
- learning_rate: 0.05
- 他のパラメータもチューニング済み
以上が実装したコードの説明になります。
4. 学びと反省
- 簡潔なモデルでも十分な成果を出せる
- XGBoost のみでアンサンブルを使わず、安定したスコアを達成できました
- データの理解が鍵
- データの欠損値やカテゴリ変数の分布を深く理解することで、前処理が精度に大きな影響を与えることを実感しました
- 終了までの残り2週間は多忙で、コンペに取り組む時間を確保できませんでした
- 十分な時間が取れるときにコンペに参加しようと思います
- 最終スコアより高いものがあったが、選択していなかった
5. まとめ
今回のコンペでは、XGBoostを用いたシンプルなアプローチで銅メダルを獲得することができました。最適化されたハイパーパラメータと効果的なデータ前処理が成功の要因となりました。本記事が参考になれば幸いです!最後までお付き合いいただきありがとうございました🥲
質問やフィードバックがあればぜひコメントで教えてください!