カテゴリカル変数に出現頻度が低いカテゴリーが含まれると、trainデータにoverfittingしたり、trainデータに含まれないカテゴリーがtestデータに初めて出てくるという問題が発生しやすく、そのままモデルを学習させると精度が落ちる原因になります。
よく行われる対処方法は出現頻度が一定の割合以下のカテゴリーに”Rare”というカテゴリーを割り当てるというものです。この方法を用いることで出現頻度の低いカテゴリー同士をまとめて大きなRareカテゴリーを作成したり、testデータで初めて出現したカテゴリーをRareカテゴリーに含めることでデータハンドリングが難しい状況にも対処しやすくなります。
Feature-engineには出現頻度の低いカテゴリーを含むカテゴリカル変数をエンコードするためのRareLabelEncoderがありますので、本記事ではこの関数の基本的な使い方とscikit-learnのpipelineとGridSearchCVを合わせて使った少し応用的な使い方をまとめました。Feature-engineのインストール方法や文中に出てくるOrdinalEncoderの基本的な使い方は以下の記事をご覧ください。
RareLabelEncoderの基本的な使い方
出現頻度の低いカテゴリーをRareに変換するために、Feature-engineのRareLabelEncoderをインポートします。
from feature_engine.encoding import RareLabelEncoder
データはkaggleのTabular Playground Series – Mar 2021のデータを使用します。このデータには11の量的変数と19のカテゴリカル変数が含まれます。
各カテゴリカル変数のユニークなカテゴリー数は以下の通りです。
例えばcat3の分布は以下のようになっており、出現頻度が1%未満のものはカテゴリーF, K, G等8つあります。
ここでRareLabelEncoderを使ってcat3の出現頻度が1%未満のものをRareに変換します。
n_categoriesはカテゴリーの最低数を指定するものです。例えばカテゴリー数が2つしかないのに、カテゴリーの出現頻度が1%未満のカテゴリーの方をRareにしても情報量は変わりません。このようなカーディナリティが低い変数にRareへの変換を適用しないために設定します。
再度分布を確認すると、8つのカテゴリーがまとめられてRareになっていることが分かります。
scikit-learnと組み合わせた使い方
Rareカテゴリーを判定するために出現頻度を設定することになりますが、この数値はハイパーパラメータになります。1%なのか5%なのか迷ったときはscikit-learnの機能と組み合わせることでパラメータチューニングをすることができます。ここではscikit-learnのPipelineを使ってRareラベルに変換後にOrdinal Encodingを実施してxgboostを構築するまでを設定し、GridSearchCVを使ってパラメータ探索をします。
必要なパッケージをインポートします。
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from xgboost import XGBClassifier
from feature_engine.encoding import OrdinalEncoder
パイプラインを構築します。vars_catは全カテゴリカル変数のカラム名のリストです。
パラメータの探索範囲を設定します。encoder_rare_label__tolで出現頻度を1%か5%かを探索するように設定しています。xgboostのmax_depthも同時に探索できます。
あとはgridsearchをするだけです。
best parameterは以下の通りで、この場合Rareにする出現頻度は1%未満にした方が良いことが分かりました。
以上のようにFeature-engineとscikit-learnを組み合わせることで、出現頻度が低いカテゴリーを含むカテゴリー変数への対応からモデル構築、パラメータ探索までを簡単にコーディングすることができました。
コメント