2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SIGNATE Cup 2024 備忘録

Last updated at Posted at 2024-12-30

1. はじめに

SIGNATEのコンペに参加して、メダルを獲得することが出来ました。なので、備忘録としてこの記事を書くことにしました。
初めて記事を書くので、拙い部分が沢山あると思いますが、最後までお付き合いしていただけると幸いです:pray:

2. 参加したコンペについて

現在、SIGNATEでSOTA ChallengeになっているSIGNATE Cup 2024(URL: https://signate.jp/competitions/1523 )に参加しました。

このコンペのタスクは、旅行会社が保有する顧客データ(属性、志向、営業担当との接触履歴など)を基に、旅行パッケージの成約率を予測するモデルを構築することです。

ちなみに順位は、108位/1,372人でした。
スクリーンショット 2024-12-30 20.00.18.png

3. 実装したコードの詳細

以下は、銅メダル獲得時に使用したコードを説明していきます。

3.1. 前処理

基本的には、データの形状の統一、外れ値処理、欠損値処理、ダミー変数化を実施しました。
これらに当てはまらない前処理を行ったのは、customer_info だけです。
具体的に customer_info に施した前処理は以下のようになります。

  • 婚姻状況、車の所有、子どもの人数
  • 婚姻状況は、"未婚"・"離婚済み"・"結婚済み"・"独身" に分類し、ラベリング
  • 車の所有は、"所持"・"未所持"に分類し、ラベリング
  • 子どもの人数は、整数型に変換

以上が施した前処理になります。基本の処理は、データの形状を見ながら、特徴量ごとに行いました。詳細は、リクエストがあったら載せようと思います🙇

3.2. モデル選定

私が使用したモデルは、XGBoost単体モデルです。理由は以下になります。

  • 高速な学習が可能
  • ハイパーパラメータの柔軟な調整が可能
  • 欠損値を自然に処理が可能
  • LightGBMや、CatBoostよりLBのスコアが高かった(アンサンブルも試したが、XGBoost単体の方がLBのスコアが高かった)← この理由が1番大きいです

3.3. クロスバリデーション

精度向上のために、StratifiedKFold を用いてデータを分割しました。以下のような設定で実装しました。

  • 分割数は 5
  • データ分布を考慮した層化サンプリングを採用
qiita.py
# クロスバリデーションの設定
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

3.4. ハイパーパラメータチューニング

XGBoost のハイパーパラメータを最適化するため、以下の範囲でグリッドサーチを実行しました。

qiita.py
# ハイパーパラメータの候補
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週間は多忙で、コンペに取り組む時間を確保できませんでした
    • 十分な時間が取れるときにコンペに参加しようと思います
  • 最終スコアより高いものがあったが、選択していなかった
    • よく提出ファイルを確認しようと思います(今回は、暫定スコアが1番高かったものを選んだんですが、これはどうやって対策すればいいのでしょうか...)
      スクリーンショット 2024-12-30 20.31.43.png

5. まとめ

今回のコンペでは、XGBoostを用いたシンプルなアプローチで銅メダルを獲得することができました。最適化されたハイパーパラメータと効果的なデータ前処理が成功の要因となりました。本記事が参考になれば幸いです!最後までお付き合いいただきありがとうございました🥲

質問やフィードバックがあればぜひコメントで教えてください!

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?