🫧

sklearn-onnxで、RandomForestClassifierの出力がboolのときにエラーになる件

2022/11/28に公開約1,300字

概要

表記の件でワークアラウンドコードを書いて回避したので、その備忘録。

事象

以下のようなコードで、ランダムフォレストの学習モデルをONNXに変換しようとしたところ、AttributeError: 'numpy.bool_' object has no attribute 'encode' のエラーが発生した。

from sklearn.ensemble import RandomForestClassifier

classifier = RandomForestClassifier(
    n_estimators = 5,
    random_state = 42,
    n_jobs = -1
)

features = ['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V26', 'V27', 'V28', 'Amount']
x = raw_df[features]
y = raw_df['Class_bool']
classifier.fit(x, y)

x1 = x[:1]
onx = to_onnx(classifier, x1.to_numpy().astype(np.float32), target_opset=12)

https://gist.github.com/kn1kn1/133526aadf029f50fc5b97564aac29f0

原因と回避方法

出力yとして設定しているdataframeのカラムの型がboolで、これがsklearn-onnxで対応していなかったのが原因である。

過去にも別なconverterで同じような事象があったようで、https://github.com/onnx/sklearn-onnx/issues/813 に回避方法があったのでそれを参照して以下のようにint32型に変換することで回避した。

# apply a workaround described at https://github.com/onnx/sklearn-onnx/issues/813
classifier.classes_ = classifier.classes_.astype(np.int32)
onx = to_onnx(classifier, x1.to_numpy().astype(np.float32), target_opset=12)

不具合の報告と改修

上記について、GitHubのissueで不具合の報告を行ったところ、素早く対応して頂けた。次のリリースではワークアラウンドは不要になるだろう。

https://github.com/onnx/sklearn-onnx/issues/946

今回の件は、ケースとしては稀で、上のnotebookでも事象を再現させるためにわざわざbool型に変換したものを使用しているが、もし今後bool以外の型でも同じようなケースがあれば同様の対応で回避できそうである。

GitHubで編集を提案

Discussion

ログインするとコメントできます