2020年4月20日月曜日

Target Encoder

Target Encoder が効くという話を以前から聞いておりました。

単純な手法では平均を取るだけなので簡単なように見えるのですが、リークしないように少数カテゴリに配慮したり、k-fold したりしようとすると、ゴリっと書く気は失せます。
training データで fit, test データで transform が必要になるでしょうから、ライブラリがあるでしょうと。

探してみると、ありますね。
H2O は理想的。スムージングも備えています。と思いきや、サポートは Python 3.6まで。今更、仮想環境を構築し直して動かないライブラリが出てきたら困ります。
Driverless AI はこのような機能を備えているのでしょうね。いいなあ。

Category Encoders も多くの Target Encoder を備えています。
https://contrib.scikit-learn.org/categorical-encoding/
リークの面では CatBoost Encoder が良いと聞きますが、少量のサンプルを含むカテゴリには向かないでしょう。
平均をとる Target Encoder では ’minimum samples to take category average into account.’ やスムージングにを備えていますね。
どの手法も fit, transform で実装も楽でした。これにしましょう。

地質特性を変換してみましたが、これ、楽ですね。
どのようなカテゴリでも自由に変換できますので、事前に集約する必要がありません。
経験すると、プチパラダイムシフト。解釈性を保つために追うのが大変になりましたが。

one-hot と異なり、カラム数を増やさない taget encoding。これで性能が上がるなら、使わない手はないでしょう。

********************************
20200421追記

Category Encoders の CatBoost Encoder では seed 値を指定するところが見当たりません。encode の度に結果が変わるので却下。
Target Encoder では、想像よりもかなり過学習が進みます。XGBoost に4000以上の特徴量を投げつけたのですが、きっちりリークを見つけてきます。CV の Varidation でAUC=0.99、TESTでAUC=0.87。
Kaggle 本に書かれているように、CV 時に encode を入れるべきなのでしょう。
https://phreeqc.blogspot.com/2020/01/blog-post.html

20200422追記
random_state で固定できました。

0 件のコメント:

コメントを投稿