所有文章 > AI驱动 > 可解释性机器学习库Shapash——鸢尾花XGBoost分类解释实现

可解释性机器学习库Shapash——鸢尾花XGBoost分类解释实现

Shapash是一个用于解释机器学习模型预测结果的Python库。旨在使每个人都可以解释和理解机器学习。它提供了各种可视化效果,带有清晰明确的标签,所有人都可以轻松理解。借助 Shapash,可以生成一个 Webapp,以简化对模型特征之间交互的理解,并允许在局部和全局可解释性之间无缝导航

1. Shapas优点

显示清晰易懂的结果:绘图和输出对每个要素及其值使用显式标签

通过生成项目的独立 HTML 报告,为模型的可审计性做出贡献

2. Shapas工作原理

3. GitHub网址

https://github.com/MAIF/shapash?tab=readme-ov-file

4. 代码实现

4.1 模型参数选择

import xgboost as xgb
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV, StratifiedKFold, train_test_split

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将X和y保存为一个DataFrame
data = pd.DataFrame(data=X, columns=iris.feature_names)
data['target'] = y

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.drop(['target'], axis=1),
data['target'],
test_size=0.2, random_state=42, stratify=data['target'])

model = xgb.XGBClassifier()

# 定义XGBoost的参数网格
param_grid = {
'learning_rate': [0.01, 0.1, 0.2], # 学习率,控制每个弱学习器的权重缩减,用于防止过拟合
'max_depth': [3, 4, 5], # 每棵树的最大深度,控制树的复杂性
'n_estimators': [50, 100, 200], # 弱学习器的数量,即树的数量
'subsample': [0.8, 0.9, 1.0], # 每棵树用于训练的子样本的比例
'colsample_bytree': [0.8, 0.9, 1.0], # 每棵树用于训练的特征的比例
'reg_alpha': [0, 0.1, 0.5], # L1正则化的参数,控制模型复杂性
'reg_lambda': [0, 0.1, 0.5], # L2正则化的参数,控制模型复杂性
}

strkfold = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)

gscv = GridSearchCV(model, param_grid, cv=strkfold, n_jobs=-1, scoring=['accuracy', 'roc_auc_ovr_weighted'], refit='accuracy')

# 在训练数据上进行网格搜索和交叉验证,找到最佳模型
gscv.fit(X_train, y_train)

# 在测试数据上评估最佳模型的性能
score_best_estimator = gscv.score(X_test, y_test)

# 打印最佳模型的交叉验证最高得分、最佳超参数组合和测试数据上的准确性
print('最高得分为:{:.3f}'.format(gscv.best_score_))
print('最佳超参数组合为:{}'.format(gscv.best_params_))
print('最佳模型在测试数据上的准确性为:{:.3f}'.format(score_best_estimator))

# 将 GridSearchCV 的结果转为 DataFrame 方便查看
df = pd.DataFrame(gscv.cv_results_)
df

利用GridSearchCV和XGBoost来调整模型参数,以获得在测试数据上表现最佳的分类器,详细调整模型参数方法参考文章尾所给出的往期文章链接

4.2 模型训练

model = xgb.XGBClassifier(
colsample_bytree=0.8,
learning_rate=0.01,
max_depth=3,
n_estimators=100,
reg_alpha=0,
reg_lambda=0,
subsample=0.8
)
# 使用训练数据拟合模型
model.fit(X_train, y_train)
# 使用拟合好的模型对测试数据进行预测
y_pred = model.predict(X_test)
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred)) # 输出模型完整评价指标

4.3 使用Shapash库解释模型

from shapash import SmartExplainer
import warnings
# 忽略警告
warnings.filterwarnings("ignore")

# 将 y_pred 转换为 Pandas Series 并设置索引
y_pred_series = pd.Series(y_pred, name="y_pred", index=X_test.index) # 参数接受 Pandas 数据框 (DataFrame)


# 创建 SmartExplainer 对象
xpl = SmartExplainer(model)
# 编译数据集,指定 x(特征)、y_pred(预测值)、y_target(真实值)等参数
xpl.compile(
x=X_test,
y_pred=y_pred_series, # 可选参数:自定义预测值(默认使用 model.predict)
y_target=y_test, # 可选参数:允许显示真实值与预测值的对比
)


# 启动 Web 应用
app = xpl.run_app()

箭头所指处会显示所生成的模型解释链接点击后如下图

5. 结果解读

如图红色箭头可以选择需要解释的数据类别,蓝色箭头为在该类别下的特征贡献度,粉色箭头为数据集,这里的数据集也就是模型的测试集,其中包含模型的预测结果,其中True Values Vs Predicted Values会显示该类别下的预测散点图,如下图

这里显示的就是类别1类的预测结果散点图,从图中可以发现有一个数据点预测错误,实际类别为1预测错误为2

蓝色箭头为各个数据在petal width (cm)、类别1下的预测结果、索引以及petal width (cm)对于模型预测输出的影响程度,红色箭头下可视化为指定索引数据在类别1下每个特征的贡献以及预测为该类别的概率,最后的粉色箭头可以指定需要探讨数据ID以便在红色箭头下输出

如图通过调整输出了索引为77数据点的模型解释,预测结果为2,实际类别为1,通过Shapash的模型解释工具,能够更深入地理解模型在特定数据点上的行为,识别潜在的预测错误原因,从而改进模型的性能或者对模型的预测结果提出进一步的疑问,这对于调整和优化机器学习模型具有很大的帮助,更多Shapash库使用技巧参考前文给出的GitHub链接

本文章转载微信公众号@Python机器学习AI