🫧
sklearn-onnxで、RandomForestClassifierの出力がboolのときにエラーになる件
概要
表記の件でワークアラウンドコードを書いて回避したので、その備忘録。
事象
以下のようなコードで、ランダムフォレストの学習モデルを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)
原因と回避方法
出力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で不具合の報告を行ったところ、素早く対応して頂けた。次のリリースではワークアラウンドは不要になるだろう。
今回の件は、ケースとしては稀で、上のnotebookでも事象を再現させるためにわざわざbool型に変換したものを使用しているが、もし今後bool以外の型でも同じようなケースがあれば同様の対応で回避できそうである。
Discussion