12th place solution
参加者の皆様お疲れ様でした。また、運営の方々、本コンペを開催して下さりありがとうございました。
簡単ではございますが、私の解法の概要について共有します。
特徴量
各特徴量に対して行ったことは以下のとおりです。
- カテゴリデータ
- 'ORIGINAL_LANGUAGE', 'ACTIVITY_NAME', 'COUNTRY_CODE', 'SECTOR_NAME'に対してTarget Encoding
- CatBoostの場合はcat_featuresとしてモデルに渡す
- 文章データ
- 文章の長さや単語数などの基礎統計量
- TF-IDF -> TruncatedSVD
- CountVectorizer -> TruncatedSVD
- BERT(roberta-base) -> PCA
- Universal Sentence Encoder
- 'DESCRIPTION_TRANSLATED'から年齢および年の抽出
- 画像データ
- タグ
Universal Sentence Encoderは異なる言語でも同じベクトル空間で表現できることから、'DESCRIPTION'に対して適用しました。精度向上に少しは貢献していました。それ以外に関しては基本的に'DESCRIPTION_TRANSLATED'に適用しています。
おそらく'DESCRIPTION_TRANSLATED'に対してもっと色々な情報を抽出しなければいけなかったと思うのですが、あまりアイデアは浮かばず断念してしまいました。
Cross Validation
目的変数が連続値ということだったので、以下の記事を参考に連続値のStratifiedKFoldで5分割しました。
https://www.guruguru.science/competitions/16/discussions/092c2925-6a63-4e65-8057-6ea50fc660dd/
Model
以下のモデルでアンサンブルしました。
シングルモデルでは、CatBoost > TabNet > LightGBMという精度でした。ハイパーパラメータは手動でのみ調整したため、チューニングすればもしかしたら順番は変わるかもしれません。
後処理
後処理では以下の2つを実施しました。
- テストデータで学習データと同じ'IMAGE_ID'のレコードは学習データの'LOAN_AMOUNT'で上書きする
- 予測値を0〜10000でクリッピングし、25の倍数となるようにする
最後に
本コンペでは、Universal Sentence EncoderやTabNetなど今までに試したことなかった手法を試すことができました。ただ上位の方にはまだまだ及ばないのでもっと精進せねばと思いました!上位の方の解法共有楽しみにしています。