【Kaggle】Learn Feature Engineering②
Learn Feature Engineering Tutorials | Kaggle
kaggle learn で feature engineeringを勉強するシリーズ第二弾。
今回はカテゴリカルエンコーディングについて。
- Count Encoding
- Target Encoding
- CatBoost Encoding
の取り扱いを勉強します。
使用するライブラリはこちら。
http://contrib.scikit-learn.org/category_encoders/
1) Categorical encodings and leakage
実際に使用する場合は、データセットのうちtrainのみを使い、testやvalidationは使用しません。使用するとleakしてしまうからです。
2) Count encodings
import category_encoders as ce
cat_features = ['ip', 'app', 'device', 'os', 'channel']
train, valid, test = get_data_splits(clicks)
# Create the count encoder
count_enc = ce.CountEncoder(cols=cat_features)
# Learn encoding from the training set
count_enc.fit(train[cat_features])
# Apply encoding to the train and validation sets
train_encoded = train.join(count_enc.transform(train[cat_features]).add_suffix('_count'))
valid_encoded = valid.join(count_enc.transform(valid[cat_features]).add_suffix('_count'))
category_encodersから、CountEncoder()を選択したのち、.fitでtrainingデータを学習させ、.transformでencodingします。.add_suffixを使って、_countを列名に付け加えて元のデータセットにjoinします。
3) Why is count encoding effective?
なぜcount encodingが有効なのでしょうか?
希少値は、似たようなカウント(1や2のような値)を持つ傾向があります。そのため、予測時に希少値をまとめて分類することができます。カウントが大きい値は、他の値とカウントが全く同じである可能性が低いです。結局、重要なグループに分類することができます。
4) Target encoding
CountEncoderと同様、TargetEncoderを使用します。.fit時にtargetとなるtrainingデータの列を指定する必要があります。
5) Try removing IP encoding
IPアドレスを除いてencodingするとどうなるでしょうか?同一のIPアドレスごとのデータが少ないので、ノイズが多くなってしまいます。また、testやvalidationでtrainingデータにない新しいIPアドレスを見たとき(これはほとんどの新しいデータであると思われます)モデルのパフォーマンスは非常に悪くなります。したがって、IPアドレスを除外するほうが成績はよくなることが予想されます。
6) CatBoost Encoding
CountEncoderと同様、CatBoostEncoderを使用します。.fit時にtargetとなるtrainingデータの列を指定する必要があります。5)で予想した通り、validation AUC scoreがさらに高くなりました。
まとめ)
category_encodersという便利なライブラリーを使用しました。
count encodingがなぜ有効かを勉強しました。
IPアドレスのような値を入れてしまうと、testやvalidationには汎化しにくいことを学びました。
leakしないようにtrain datasetのみで.fitすることに注意しましょう。