LightGBM 4.0.0でpandasのnullable typesがサポートされました

LightGBM 4.0.0でpandasのnullable typesがサポートされました

データエンジニアだったりデータアナリストだったりします。 @kazasiki です。

Microsoft製の勾配ブースティングのライブラリ LightGBM の4.0.0が2023/07/14に公開されました。機能変更などを含むアップデートは約一年半ぶりだそうです。

github.com

さまざまな更新が含まれますが、その中でも自分が注目したのは support for pandas nullable types という一文です。本記事ではこの変更について簡単に紹介していこうと思います。

変更内容

対応するIssueは以下です。

github.com

内容としては読んだまんまで、LightGBMをPython APIで扱う際にNullableなtypeが使えるようになりました。逆に言うと今までは使えなくて地味に不便でした。

よく知らない人に説明すると、Nullableなtypeというのは Int64 のように先頭が大文字になったtypeのことです。これは通常の int64 と違ってNaN(値なし)をデータに含めることが出来ます。NaNはnumpy的にはfloatのデータなので、通常の int64 では扱えません。

その辺りの詳しい説明はこちらで読めます。

pandas.pydata.org

今までは Int64 などのNullableなtypeのデータをLightGBMに渡そうとすると、無効なtype扱いで以下のエラー文で怒られていました。

ValueError: DataFrame.dtypes for data must be int, float or bool.

どう考えてもintだろ! と思いますが、認識されてない以上は仕方ありません。回避策は色々ありますが、泣く泣くfloatに変換して対応していた方が多いかと思います。

検証

ここらへんで動作検証のコードを書いて検証しました感を出しても良かったのですが、よく考えたらPull Requestにテストコードがあるはずだということに気づいたので探してみました。

見つけたのが以下のコードです。詳細はリンク先を見て下さい。

github.com

ちなみに同様のコードを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にはたくさんの修正が入っているので、興味があればリリースノートを一通り読んでみるのをオススメします。

techtekt テクニカルライティング Award 2022 表彰式を開催しました!

@kazasikiさんのプロフィール

デジタルテクノロジー統括部 デジタルソリューション部 フロントアプリエンジニアグループ シニアエンジニア

バックエンドエンジニア。VRゲームとダンスミュージックが好き。都内のクラブによく行く。

※2023年7月現在の情報です。