Python 在xgboost上使用shap时获取UnicodeDecodeError

Python 在xgboost上使用shap时获取UnicodeDecodeError,python,python-3.x,xgboost,Python,Python 3.x,Xgboost,我试图在xgboost模型上使用shap,但出现错误: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 341: invalid start byte 例如: model = XGBClassifier() model.fit(X_train, y_train) explainer = shap.TreeExplainer(model) 软件包版本: python == 3.6.9 xg

我试图在xgboost模型上使用shap,但出现错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 341: invalid start byte
例如:

model = XGBClassifier()
model.fit(X_train, y_train)
explainer = shap.TreeExplainer(model)
软件包版本:

    python == 3.6.9
    xgboost==1.1.0
    shap==0.35.0

问题是什么?我们如何解决它?

系统中似乎有一个bug。请参阅:。
这个问题似乎已经解决了,但修复程序可能还没有发布。无论如何,我也遇到了同样的问题,并通过安装xgboost v1.0.0暂时解决了它。

我尝试了以下解决方案,效果良好

package versions:
    python == 3.7.7
    xgboost==1.1.1
    shap==0.35.0
代码对我来说非常有效

import shap
from xgboost.sklearn import XGBClassifier

xgb = XGBClassifier(random_state=42)
mymodel = xgb.fit(X_train, y_train)
真正解决这些问题的部分是,千万不要错过

mybooster = mymodel.get_booster()    
model_bytearray = mybooster.save_raw()[4:]
def myfun(self=None):
    return model_bytearray
mybooster.save_raw = myfun

# Shap explainer initilization
shap_ex = shap.TreeExplainer(mybooster)

我对
xgboost-1.2.0
shap0.35.0
也有同样的问题

以下是完整的示例:

import numpy as np
import xgboost as xgb
import shap

# data
np.random.seed(100)
X_train = np.random.random((100, 10))
y_train = np.random.randint(2, size=100)

# model
model = xgb.XGBClassifier(random_state=42)
fitted_model = model.fit(X_train, y_train)

# monkey patch
booster = fitted_model.get_booster() 
model_bytearray = booster.save_raw()[4:]
booster.save_raw = lambda : model_bytearray

# shap expaliner
explainer = shap.TreeExplainer(booster)
shap_values = explainer.shap_values(X_train)
shap.summary_plot(shap_values, X_train)
输出

导致此错误的那一行是什么?explainer=shap.treeeexplainer(model)答案不仅是第一行,因为所有东西作为一个整体都是答案,从xgboost的1.0.0版开始,数据结构中有一个更新,有必要创建model_bytearray,并将其作为myfun()函数保存在模型中,在通过TreeExplainer函数使用它之前。