LoginSignup
6
6

More than 3 years have passed since last update.

XGBClassifierでpickleを使わずにmodelを保存する

Last updated at Posted at 2019-02-01

XGBoostでsklearn APIを使用する場合、save_modelとload_modelには、"pythonだけで完結する場合はpickleを使うこと"という注釈があります。sklearnのmodelと同じつもりで使うと、loadしても"'XGBClassifier' object has no attribute '_le'"というerrorが出てpredictに利用できません。

これはBoosterオブジェクトのみ保存していて、LabelEncoderが保存されていないことによるので、下記のようにすると回避できます。pickle使ったほうがわかりやすいのですが、どうしてもpickleを使いたくないときには有効かもしれません。

from xgboost import XGBClassifier
import xgboost

# model1の学習と保存
model1 = XGBClassifier()
model1.fit(X, Y)

model1.save_model('./xgb1.model')

# 保存したmodel1をロードして使用する
model2 = XGBClassifier()
model2.load_model('./xgb2.model')

model2._le = xgboost.compat.XGBLabelEncoder()
model2._le.fit(Y) # YのラベルをLabelEncoderに学習させる

model2.predict(X)

LabelEncoderはsklearn.preprocessing.LabelEncoderと同一で、ユニークな値をソートして保持するという実装になっています。なので、同じラベルが網羅されていれば必ずしも学習時のYを取っておかなくても大丈夫です。ただ、将来的にLabelEncoderの仕様が変更になった場合などには注意が必要かもしれません。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6