iPhoneとApple製品で機械学習モデルを動かすにはApple製の機械学習モデル運用環境のCoreMLを使う必要があります。ONNXを使うこともできないことはないですが、Objective-Cしかサポートされてないみたいですし、あまり使われている方法じゃないみたいです。
ONNXはMicrosoftが推しているので、Apple的には開発にやる気がでないのではないでしょうか?ちなみにCoreMLでLightGBMもサポートされていませんが、それもLightGBMがMSが開発元なことを意識したものかもしれません。
ただ、ONNXと違って各機械学習モデル(ライブラリ)の最新バージョンにCoreML(というかCoreMLモデルをpythonで生成するcoremltools 8.1)が対応してないことが困ったところなんですよね。
現時点(2025年1月)ではscikit-learnは0.17.から1.5.1.まで、XGBoostは1.4.2までしか動かないみたいですね。
scikit-learn version 1.6.1 is not supported. Minimum required version: 0.17. Maximum required version: 1.5.1. Disabling scikit-learn conversion API.
XGBoost version 2.1.3 has not been tested with coremltools. You may run into unexpected errors. XGBoost 1.4.2 is the most recent version that has been tested.
ということでscikit-learnとXGBoostをダウングレードする方法を記録しておきます。
pip uninstall scikit-learn
pip uninstall xgboost
pip install scikit-learn==1.5.1
pip install xgboost==1.4.2
ちなみに、xgboostのバージョンに合わせるとpandasやpandasもダウングレードする必要があります。
pip install pandas==1.5.3
pip install numpy==1.26.4
ONNXへの変換に必要なこと
CoreMLを使う型はONNXのモデルも作ると思いますが、xgboostのモデルをONNXに変換するときも、2025年1月現在だとPythonのモデルを3.10まで落とさないとonnxmltoolsが入らずxgboostのモデルをONNXに変換できません。
# 特徴量の列数を指定
ncols = X.shape[1]
# ターゲットのONNX opsetバージョンを取得(15までしか動かない)
TARGET_OPSET = 15
# モデルをONNXに変換
onnx_model_converted = convert_xgboost(
model_, # XGBoostモデル
'tree-based regressor', # モデルの種類 (回帰: 'tree-based regressor', 分類: 'tree-based classifier')
[('input', FloatTensorType([None, ncols]))], # 入力データ型 (特徴量数を指定)
target_opset=TARGET_OPSET # ターゲットのONNX opsetバージョン
)
# ONNXモデルを保存
onnx.save_model(onnx_model_converted, "example.onnx")
それでは。