LoginSignup
22
11

More than 3 years have passed since last update.

LightGBM UserWarning: Using categorical_feature in Dataset

Last updated at Posted at 2019-11-04

機械学習で定番の Gradient Boosting Decision Tree の定番のライブラリ LightGBM でカテゴリー変数を扱う場合について。執筆時点の LightGBM バージョンは 2.3.0.

結論

カテゴリー変数を指定する方法は少なくとも3つあるけど、これを書いている時点では (3) dtype='category' が良さそう。(1) (2) もよく使われているけど UserWarning が出る; 最近、非奨励になった?

3つの方法

1. Dataset に categorical_feature を設定

lgb_train = lgb.Dataset(X_train, y_train, categorical_feature=['A'])

X_trainpandas.DataFrame'A' はカテゴリー変数の column 名。

UserWarning がでる:

python3.7/site-packages/lightgbm/basic.py:1243: UserWarning: Using categorical_feature in Dataset.
  warnings.warn('Using categorical_feature in Dataset.')

はい、Dataset で categorical_feature を指定しましたが何か?

2. train() に categorical_feature を設定

gbm = lgb.train(params,
                lgb_train,
                categorical_feature=['A'],
                )

UserWarning:

python3.7/site-packages/lightgbm/basic.py:1247: UserWarning: categorical_feature in Dataset is overridden.
New categorical_feature is ['A']

そうですか、ここで categorical_feature を設定するのは非奨励? (1) の Dataset と (2) の train() 両方で設定すれば UserWarning がでないけど、無駄に重複している気がする。

3. dtype='category' を使用

X_train['A'] = X_train['A'].astype('category')

これだと UserWarning は出ない。最初に category 型にしておけば (1) の場合のように train と validation で2回 categorical_feature を指定しなくていいのも良い。category型は内部でほどよく小さい整数型を使うので、RAM にも優しい。これが良さそう。

この UserWarning がいつから出るようになったのか、今後も続くのかは不明。ネットで情報を見つけられなかったのでこの記事を書きました。最近の変更と思われる。

22
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
11