LightGBMにカテゴリ変数を入れる - 7月 05, 2020 こんにちは、ぐぐりら(@guglilac)です。 LightGBMにカテゴリ変数を入力する際、 `category_feature`を * `lgb.Dataset`で指定する * `model.fit`や`lgb.train`で指定する * DataFrameのカラムをcategory型にする がありますが、三つ目のが良さげなんじゃないかと思いました。 `category_feature`を`lgb.Dataset`や`model.fit`や`lgb.train`で指定するといったやり方があるけど、[warningがでてしまう](https://qiita.com/junkoda/items/ddf35a240e9aa3f0d9f6)のもあるので、 dataframeのカラムの型をcategoryにするのが一番良さそう。 三つ目の方法について、どこかのブログ記事で、 「category_featureの対象にするカラムの型はint or categoryで、label encodingしてから渡すのが推奨」という情報を見かけてちょっと悩んでしまったのでまとめます。 結論category型じゃないとだめそうです。 ## 実験した タイタニックのデータセットで、`"Sex","Embarked","Cabin","Pclass"`の四つのカラムをlabel encodingしてそれぞれの処理をしてfit, predictしたときのaccuracyです。 ``` # dataframeのcolumnをcategory型にして、fitではcategorical featureを指定しない場合 0.8603351955307262 # dataframeのcolをcategory型にして、fitではcategorical featureを指定した場合 0.8603351955307262 # int型にして、fitではcategorical featureを指定する場合 0.8603351955307262 # int型にして、fitでもcategorical featureを指定しない場合 0.8715083798882681 ``` という結果で、DataFrameの該当するカラムの型をintにして、fitでcategorical featureを指定しない場合のみ結果が異なりました。 fitでcategorical featureを指定しない場合、defaultの`"auto"`が入っていて、 ソースコードを見に行くと `categorical_feature="auto"`のときは ```python cat_cols=list(data.select_dtypes(include=['category']).columns) [col for col in cat_cols if not data[col].cat.ordered] ``` みたいに、順序付きでないカテゴリ型のカラムをカテゴリ変数とみなすようです。 なので、自動設定時にint型もcategorical_featureの対象とするといった情報は誤りかと思います。(最初からドキュメントやソースコードを読みに行けば良かった) 指定しない(auto)場合はcategory型だけカテゴリ変数と見なされるので、上の実験結果のようにintでかつ未指定の時のみカテゴリ変数と見なされるカラムがなく、すべて数値として見なされていたわけですね。 intのまま渡す方が精度が良かったのは、カテゴリに順序性があって、閾値以上かどうかで判定するほうがis or is notでふり分けるよりあっているからでしょうか。 参考 : [lightgbm カテゴリカル変数と欠損値の扱いについて+α - てばさきさんの自由研究](https://tebasakisan.hatenadiary.com/entry/2019/01/27/222102) 数値として渡すかカテゴリ変数として渡すか、どちらがいいかはデータによるのだと思います。 ## 結局 精度うんぬんの話はおいておいて、正しくカテゴリ変数をカテゴリ変数として認識して欲しい場合は * Dataframeの該当カラムをcategory型にして、category_featureは指定せずfitする * 欠損値はうめなくても動く * label encodingもしなくてよい ちなみに実験ではint型と比較するためにlabel encodingしたけど、この方法でやるならlabel encodingせずにそのまま入れて大丈夫。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿