自己紹介
データサイエンスを学んでいる、大学4年生です。
最近は、SIGNATEのコンペに参加しながら、東京大学の松尾・岩澤研究室主催のサマースクールを3つ受講し、マナビDXにも参加しています。
Xはこちら→@uki_datascience
概要
先日、SIGNATE Cup 2024 夏で60位となり、銅メダルを獲得しました。今回は、備忘録も兼ねて、解法をアウトプットしたいと思います。
コンペについて
今回のコンペでは、旅行会社が保有する顧客データ(属性や志向、営業担当との接触履歴等)を元に、旅行パッケージの成約率を予測するものでした。
解法
前処理・特徴量エンジニアリング
ここでは、各変数ごとに施した前処理を記述します。
- Age
- 'nan'を欠損値として扱う
- 全角の数字を半角に変換
- 漢数字を数字に変換
- 〇代は〇5に変換(例.10代→15)
- 「14-25」「26-30」「31-40」「41-50」「51-65」に分けた"Agebin"という特徴量を追加
- TypeofContact
- ラベルエンコーディングを採用
- CityTier
- そのまま使用
- DurationOfPitch
- 欠損値が多く、使わない方が精度も高かったため、不使用
- Occupation
- ラベルエンコーディングを採用
- Gender
- 表記揺れを修正
- ラベルエンコーディングを採用
- NumberOfPersonVisiting
- そのまま使用
- NumberOfFollowups
- 外れ値(100, 200, 300, 400, 500, 600)を欠損値として扱う
- ProductPitched
- 表記揺れを修正
- ラベルエンコーディングを採用
- PreferredPropertyStar
- そのまま使用
- NumberOfTrips
- 回数を年換算(例.「年に1回→1」「半年に1回→2」)
- Passport
- そのまま使用
- PitchSatisfactionScore
- そのまま使用
- Designation
- 表記揺れを修正
- ラベルエンコーディングを採用
- MonthlyIncome
- 文字列を含んでいるため、すべて数値に変換
- customer_info
- 「婚姻状況」「車の有無」「子どもの人数」をそれぞれmarried, car, childという特徴量として追加
- married
- 「未婚:0」「独身:1」「結婚済み:2」「離婚済み:3」としてラベルエンコーディングを採用
- car
- 表記揺れを問わず、所持を1、未所持を0としてラベルエンコーディングを採用
- child
- 文字列を含んでいるため、すべて数値に変換
- 欠損値は0で補完
モデリング
- カテゴリカル変数(TypeofContact, CityTier, Occupation, ProductPitched, Designation, Agebin, Passport)をcategory型に変換
※marriedは、変換しない方が精度が高かったため、そのまま使用 - KFold:10
- LightGBMの分析結果をキャリブレーション
※ハイパーパラメータは手作業でチューニング
うまくいったこと
キャリブレーション
Discordで紹介されているのを見て、今回初めて使いましたが、ある程度効果があったと思います。「LightGBMではあまり効果がない」という記事も拝見しましたが、今回は一定の効果があったかなと思います。
KFold
これまではtrain_test_splitだけを使っていて、何気にこちらも初めて使いました。どう考えても使わない理由はないなと思うぐらい効果がありました。
Agebin
年齢の区分を表したAgebinという特徴量を追加しましたが、設定する区分によって大きく精度が変わったので、ここの閾値をうまく設定できれば使うべきだったと思いますが、うまく設定できなければこの特徴量は使わない方が賢明だったかと思います。
未婚と独身の区別
Discord上でも議論がありましたが、「未婚」と「独身」の違いについて少し言及しようと思います。僕の解釈は、こんな感じです。
- 未婚:現在独身で、結婚歴がない人
- 独身:現在独身の人(結婚歴は問わない)
- 離婚済み:現在独身で、結婚歴がある人
「独身」を「未婚」と同じ扱いにしてみたり、「離婚済み」と同じ扱いにしてみたりしましたが、最終的にはすべて別という扱いにした方が精度が良かったです。
車の有無
婚姻状況の特徴量でいろいろあったので、車の有無でも同じようなことがあるのではないかと思いました。
実際、「車未所持」「車あり」「自動車未所有」「車所持」「自家用車あり」「車保有」など、さまざまなパターンの表記揺れがありました。
婚姻状況と同じように「すべて別」として扱ったところ、精度が下がったので、最終的には、意味的に所有している場合は1、所有していない場合は0としました。
※もっと細かく分類すれば、もう少し良い落としどころがあったかもしれません。
感想
今回のSIGNATE Cupでは、LBで金圏だった人が誰一人としてPBで金圏に入れないという、非常にシェイクの大きいコンペになりました。
そんな中、LB:69位、PB:60位と大きなシェイクの影響を受けずに終えることができました。以前の「第2回金融データ活用チャレンジ」では、100位以上シェイクダウンしてメダルを逃したので、少しは成長できたかなと思います。
大変なコンペだったと思いますが、参加されていた1000人以上のみなさん、改めてお疲れさまでした。そして、上位入賞されたみなさん、おめでとうございます!
偉そうに解法共有はしてきましたが、今回は、60位で銅メダルという結果に終わってしまったので、上位の方の解法からしっかり学ばせていただこうと思います!