工学と医学のあいだ

医者のふりをしたエンジニアになりたい。ゆるゆるやってます。

Learn Feature Engineering②

Learn Feature Engineering Tutorials | Kaggle

kaggle learn で feature engineeringを勉強するシリーズ第二弾。

www.kaggle.com

今回はカテゴリカルエンコーディングについて。

  • 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することに注意しましょう。