从 pickle 文件加载 XGBoost 模型。错误:“XGBClassifier”对象没有属性“use_label_encoder”

Man*_*jee 10 python machine-learning xgboost data-science amazon-sagemaker

我正在尝试从 pickle 文件加载序列化的 xgboost 模型。

import pickle
def load_pkl(fname):
    with open(fname, 'rb') as f:
        obj = pickle.load(f)
    return obj

model = load_pkl('model_0_unrestricted.pkl')
Run Code Online (Sandbox Code Playgroud)

打印模型对象时,我在 linux(AWS Sagemaker Notebook)中收到以下错误

    ~/anaconda3/envs/python3/lib/python3.6/site-packages/xgboost/sklearn.py in get_params(self, deep)
    436             if k == 'type' and type(self).__name__ != v:
    437                 msg = 'Current model type: {}, '.format(type(self).__name__) + \
--> 438                       'type of model in file: {}'.format(v)
    439                 raise TypeError(msg)
    440             if k == 'type':

~/anaconda3/envs/python3/lib/python3.6/site-packages/sklearn/base.py in get_params(self, deep)
    193         out = dict()
    194         for key in self._get_param_names():
--> 195             value = getattr(self, key)
    196             if deep and hasattr(value, 'get_params'):
    197                 deep_items = value.get_params().items()

AttributeError: 'XGBClassifier' object has no attribute 'use_label_encoder'
Run Code Online (Sandbox Code Playgroud)

您能帮忙解决这个问题吗?

它在我本地的 mac 上运行良好。

参考:xgboost:1.4.1安装日志(Mac)

    Collecting xgboost
  Downloading xgboost-1.4.1-py3-none-macosx_10_14_x86_64.macosx_10_15_x86_64.macosx_11_0_x86_64.whl (1.2 MB)
     
Run Code Online (Sandbox Code Playgroud)

但无法在 AWS 上工作

参考:xgboost:1.4.1安装日志(SM笔记本,linux机器)

Collecting xgboost
  Using cached xgboost-1.4.1-py3-none-manylinux2010_x86_64.whl (166.7 MB)
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 8

看来您升级了 xgboost。您可以考虑通过以下方式降级到 1.2.0:

pip install xgboost==1.2.0
Run Code Online (Sandbox Code Playgroud)


小智 3

我尝试在 ubuntu 上运行的笔记本上进行测试,它似乎工作正常,但是你能检查一下你是如何初始化分类器的吗?这是我尝试过的:

\n
import numpy as np\nimport pickle\nfrom scipy.stats import uniform, randint\n\nfrom sklearn.datasets import load_breast_cancer, load_diabetes, load_wine\nfrom sklearn.metrics import auc, accuracy_score, confusion_matrix, mean_squared_error\nfrom sklearn.model_selection import cross_val_score, GridSearchCV, KFold,RandomizedSearchCV, train_test_split\n\nimport xgboost as xgb\ncancer = load_breast_cancer()\nX = cancer.data\ny = cancer.target\nxgb_model = xgb.XGBClassifier(objective="binary:logistic", random_state=45)\nxgb_model.fit(X, y)\npickle.dump(xgb_model, open("xgb_model.pkl", "wb"))\n
Run Code Online (Sandbox Code Playgroud)\n

使用您的函数加载模型并输出:

\n
def load_pkl(fname):\n    with open(fname, 'rb') as f:\n        obj = pickle.load(f)\n    return obj\n\nmodel = load_pkl('xgb_model.pkl')\nmodel\n
Run Code Online (Sandbox Code Playgroud)\n

以下是输出:

\n
XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n          colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,\n          importance_type='gain', interaction_constraints='',\n          learning_rate=0.300000012, max_delta_step=0, max_depth=6,\n          min_child_weight=1, missing=nan, monotone_constraints='()',\n          n_estimators=100, n_jobs=8, num_parallel_tree=1, random_state=45,\n          reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,\n          tree_method='exact', validate_parameters=1, verbosity=None)\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\x8b

\n