SHAP无法处理包含LightGBM分类特征的数据

5

我的模型使用 LGBMClassifier。我想使用 Shap(Shapley)来解释特征。但是,Shap在分类特征上给了我错误。例如,我有一个名为“Smoker”的特征,它的值包括“是”和“否”。我从Shap收到了一个错误:

ValueError: could not convert string to float: 'Yes'.

我是否漏掉了任何设置?

顺便提一下,我知道我可以使用one-hot编码来转换分类特征,但我不想这样做,因为LGBMClassifier可以在没有one-hot编码的情况下处理分类特征。

这是示例代码:(shap版本是0.40.0,lightgbm版本是3.3.2)

import pandas as pd
from lightgbm import LGBMClassifier #My version is 3.3.2
import shap #My version is 0.40.0

#The training data
X_train = pd.DataFrame()
X_train["Age"] = [50, 20, 60, 30]
X_train["Smoker"] = ["Yes", "No", "No", "Yes"]

#Target: whether the person had a certain disease
y_train = [1, 0, 0, 0]
#I did convert categorical features to the Category data type.
X_train["Smoker"] = X_train["Smoker"].astype("category")

#The test data
X_test = pd.DataFrame()
X_test["Age"] = [50]
X_test["Smoker"] = ["Yes"]
X_test["Smoker"] = X_test["Smoker"].astype("category")

#the classifier    
clf = LGBMClassifier()
clf.fit(X_train, y_train)
predicted = clf.predict(X_test)

#shap
explainer = shap.TreeExplainer(clf)
#I see this setting from google search but it did not really help
explainer.model.original_model.params = {"categorical_feature":["Smoker"]}
shap_values = explainer(X_train) #the error came out here: ValueError: could not convert string to float: 'Yes'
1个回答

4

让我们稍微尝试不同的方式:

from lightgbm import LGBMClassifier
import shap

X_train = pd.DataFrame({
    "Age": [50, 20, 60, 30], 
    "Smoker": ["Yes", "No", "No", "Yes"]}
)
X_train["Smoker"] = X_train["Smoker"].astype("category")
y_train = [1, 0, 0, 0]

X_test = pd.DataFrame({"Age": [50], "Smoker": ["Yes"]})
X_test["Smoker"] = X_test["Smoker"].astype("category")


clf = LGBMClassifier(verbose=-1).fit(X_train, y_train)
predicted = clf.predict(X_test)
print("Predictions:", predicted)

exp = shap.TreeExplainer(clf)
sv = exp.shap_values(X_train) # <-- here

print(f"Expected values: {exp.expected_value}")
print(f"SHAP values for 0th data point: {sv[1][0]}")

Predictions: [0]
Expected values: [1.0986122886681098, -1.0986122886681098]
SHAP values for 0th data point: [0. 0.]

请注意,您不需要调整explainer.model.original_model.params,因为它会给您非预期的公共访问模型参数,这些参数已经通过训练模型为您设置好了。

以这种方式计算的SHAP值是否有意义? - undefined
你能说得更清楚一点吗? - undefined
你如何将通过这种方法给出的SHAP值与你输入的特征联系起来?似乎分类特征使得在SHAP库中无法进行大多数(或全部)的绘图。 - undefined
OP似乎误用了SHAP API,我提供了一种解释lgbm模型的方法,而不会出现错误。SHAP的好坏取决于底层模型的质量。 - undefined
当然,但是你如何解释SHAP值呢?你会将它们的效果在所有样本中进行求和吗?这正是我考虑要做的。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接