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

技术

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

1. Shapas优点

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

picture.image

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

picture.image

2. Shapas工作原理

picture.image

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
      

picture.image

利用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)) # 输出模型完整评价指标
      

picture.image

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()
      

picture.image

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

picture.image

5. 结果解读

picture.image

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

picture.image

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

picture.image

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

picture.image

picture.image

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

6. 往期推荐

LightGBM模型房价预测实现

基于支持向量机(SVM)的红外光谱分类

Python中如何使用Joblib保存和调用模型

长短期记忆网络LSTM在时序数据预测演示

特征选择(嵌入法)—— 递归特征消除 RFE、 RFE-CV

特征筛选(过滤法)—— ANOVA

特征筛选(封装法)—— SFS、SBS

模型选择的有利方法——网格调参

模型选择的有利方法——随机搜索

分类模型评价指标详解(Python实现)

orange3一个不需要编程知识进行数据挖掘和机器学习的python工具箱

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎音视频体验白皮书
火山引擎联合AMD发布了音视频体验白皮书,以抖音亿级日活用户实践和大规模场景落地经验,详细解读音视频体验评估指标和模型,分享火山引擎音视频实验室的评测方案和抖音在音视频体验优化上的典型策略、案例,助力企业优化用户体验,促进业务增长。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论