データエンジニアだったりデータアナリストだったりします。 @kazasiki です。
Microsoft製の勾配ブースティングのライブラリ LightGBM の4.0.0が2023/07/14に公開されました。機能変更などを含むアップデートは約一年半ぶりだそうです。
さまざまな更新が含まれますが、その中でも自分が注目したのは support for pandas nullable types
という一文です。本記事ではこの変更について簡単に紹介していこうと思います。
変更内容
対応するIssueは以下です。
内容としては読んだまんまで、LightGBMをPython APIで扱う際にNullableなtypeが使えるようになりました。逆に言うと今までは使えなくて地味に不便でした。
よく知らない人に説明すると、Nullableなtypeというのは Int64
のように先頭が大文字になったtypeのことです。これは通常の int64
と違ってNaN(値なし)をデータに含めることが出来ます。NaNはnumpy的にはfloatのデータなので、通常の int64
では扱えません。
その辺りの詳しい説明はこちらで読めます。
今までは Int64
などのNullableなtypeのデータをLightGBMに渡そうとすると、無効なtype扱いで以下のエラー文で怒られていました。
ValueError: DataFrame.dtypes for data must be int, float or bool.
どう考えてもintだろ! と思いますが、認識されてない以上は仕方ありません。回避策は色々ありますが、泣く泣くfloatに変換して対応していた方が多いかと思います。
検証
ここらへんで動作検証のコードを書いて検証しました感を出しても良かったのですが、よく考えたらPull Requestにテストコードがあるはずだということに気づいたので探してみました。
見つけたのが以下のコードです。詳細はリンク先を見て下さい。
ちなみに同様のコードをLightGBM 3.3.1で実行したら想定通り以下のエラーが出ました。
ValueError: DataFrame.dtypes for data must be int, float or bool. Did not expect the data types in the following fields: x1, x2, x4
4.0.0では正常終了しました。
まとめ
pandasやLightGBMをきっちりdata typeを気にして使っている人は意外に少ないかも知れませんが、不要なトラブルを抑止できますし、動作内容もわかりやすくなるので出来れば気をつけていきたいものです。今回のアップデートで更にそういった使い方がしやすくなったので、これを機会にご自身のソースのdata typeを見直してみて頂ければと思います。
また、本記事で触れたもの以外にも4.0.0にはたくさんの修正が入っているので、興味があればリリースノートを一通り読んでみるのをオススメします。
@kazasikiさんのプロフィール
デジタルテクノロジー統括部 デジタルソリューション部 フロントアプリエンジニアグループ シニアエンジニア
バックエンドエンジニア。VRゲームとダンスミュージックが好き。都内のクラブによく行く。
※2023年7月現在の情報です。