1st place solution
運営者様、参加者の皆様、コンペティションお疲れ様でした。
ソリューションを投稿します。
コードリンク
https://github.com/ktrw1011/probspace-minpaku-service
Key Feature
はじめは定石通りLightGBMでモデリングしましたが、有効な特徴量を見つけられず0.8くらいでスタックしました。
特に駅からの距離等を入れても改善がなく、外れ値なpriceを決めるのに有効な特徴量がないように感じました。
Feature importanceを見る限りほぼroom_type
とname
で決まる感じだったので
room_type
とname
のみ使用して、BERTで予測すると0.7後半くらい出ました。
最終的に日本語系+マルチリンガル系Transformerのpretrainedモデルと最初に作成していたGBDTとのアンサンブルです。
テーブルコンペ的なテクニックはほとんど使用しなかったので、NLP(+カテゴリ)だったという感想です。
CV
KFold(n_split=5)
host_idでsplitされているようなのでGroupKFoldと迷いました。
localとpublicの乖離が酷かったですが、KFoldでもlocalの改善がpublicに反映されたのでKFoldにしました。
host_idが異なっていても似たようなname
のレコードが存在したので、GroupKFoldにしても同じかなという理由もあります。
Model
- Transformers:
number_of_reviews
、minimum_nights
、room_type
、neighbourhood
、name
を結合してinput
- cl-tohoku/bert-large-japanese、cl-tohoku/bert-base-japanese-whole-word-masking
- bert-base-multilingual-uncased、xlm-roberta-base、xlm-roberta-large、microsoft/mdeberta-v3-base
sep_token = tokenizer.sep_token
input_text = "number of reviews, " + str(examples["number_of_reviews"]) + sep_token +\
"minimum nights, " + str(examples["minimum_nights"]) + sep_token +\
examples["room_type"] + sep_token + examples["neighbourhood"] + sep_token + examples["name"]
- GBDTs:ラベルエンコーディング、
name
のTF-IDFなどの一般的な特徴量
Ensemble
9 models weighted average (Nelder-Mead)