さきさんの自由研究スマートフォン用の表示で見るてばさきさんの自由研究この広告は、90日以上更新していないブログに表示しています。一発目から自由研究をしていないのですが、ご容赦ください。笑lightgbmのカテゴリカル変数の扱い等がチーム内で話題になったため、メモも兼ねてまとめました。話題となったのは、以下の3点です。encoding1して入力するのと、カテゴリカル変数として入力する違いtrainに存在しないが、testには存在するカテゴリーの扱い欠損値の扱いこれより、順に説明します。encodingして入力すると、普通の数値型変数と同様に閾値との大小関係で判定されます。category_xで判定されるようです。カテゴリーに順序性がある場合は、カテゴリカル変数として扱うのはイマイチの場合があるとのこと。encodingで、順序性がない特徴はカテゴリカル変数として入力するのが良さそうです。下の画像は、カテゴリカル変数を持つデータで学習後に、graphvizを使って木を可視化したものです。notで分岐していることがわかります。not側に振り分けられます。そのためコンペなどでは問題ないのですが、実務ではちょっとした落とし穴があります。カテゴリー型をlightgbmの入力とする方法は以下の2種類が主流だと思います。pandasのカテゴリー型に変換して、モデルに入れるここで、実務で学習・予測データを別々に処理する必要がある場合は、LabelEncoderの出力番号が学習・予測データでずれてしまう場合があります。pandasのカテゴリー型では、元のカテゴリーの情報を保持して適切に扱ってくれるようです。そのため、問題がなければpandasのカテゴリー型に変換して学習させるのが良いと考えます。以下、しばらくLabelEncoderとpandasのカテゴリー型の検証が続くので、興味のない人は飛ばしてください。欠損値の扱いlightgbmでは、欠損値を一度無視して分割を探索した後に、よりロスが下がるほうの分岐に欠損値を振り分けるようです。そのため、例えばその変数が欠損値であるという情報が重要な場合は、明示的にその変数の最大値、最小値の外側の値を代入するなどで区別がつくようにした方が良いと思います。zero_as_missingパラメータをTrueにすると、0もnullと同様に無視をして分割を探索してから、あとで振り分けるようになるとのこと。encodingは普通の数値型変数として扱われる。notで判定されるため基本は問題ない。実務などで予測データのみをLabelEncoderで変換する場合は注意が必要。欠損値の扱いは、一度無視して分岐を探索後、よりロスが下がるほうに振り分ける。binの制約がかかるのか。githubのdisucussionを要約すると、カテゴリー型の変数はmax_binの最大値を下回る場合は全カテゴリーが採用され、上回る場合は頻度の高い順から全データの99%を占めるまでに登場する全カテゴリーが採用されるようです。cardinalityな変数ではかなり多数のカテゴリーとなるケースがありそうですね。余談ですが、xgboostではデフォルトで0と欠損値を無視して分割を探索後に、よりロスが下がるほうに両方を振り分けるようです。この辺りにも、微妙に仕様の差があるようですね。月別アーカイブはてなブログをはじめよう!tebasaki3さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。