機械学習で定番の 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_train
は pandas.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 がいつから出るようになったのか、今後も続くのかは不明。ネットで情報を見つけられなかったのでこの記事を書きました。最近の変更と思われる。