[Python] Feature-engineを使った出現頻度の低いカテゴリーを含むカテゴリカル変数の対処方法

機械学習

カテゴリカル変数に出現頻度が低いカテゴリーが含まれると、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を組み合わせることで、出現頻度が低いカテゴリーを含むカテゴリー変数への対応からモデル構築、パラメータ探索までを簡単にコーディングすることができました。

コメント

タイトルとURLをコピーしました