Python分析结果可解释性_指标与图表说明方法【技巧】

sklearn.metrics指标需结合classification_report、混淆矩阵热力图和SHAP图深入解读:设pos_label、用average=None、标注行列含义、转概率尺度、控制采样并封装Explainer进pipeline。

sklearn.metrics 算出的指标为什么看不懂?

因为多数指标(如 f1_scoreroc_auc_score)只返回一个数字,不带业务含义。比如 f1_score=0.82 无法回答“模型在哪些客户群上容易误判?”

  • 优先搭配 classification_report 输出每类的 precision/recall/f1-score,尤其关注低支持度(support)类别的数值是否失真
  • 对二分类,强制设置 pos_label 参数(如 pos_label=1),否则默认按标签排序可能把负类当正类算
  • 若用 average='weighted',结果会掩盖少数类表现;改用 average=None 查看原始数组,再手动加权

混淆矩阵热力图里数字堆叠看不清?

直接用 seaborn.heatmap 默认会显示小数、不标注绝对频次、颜色映射不区分高低错判,导致关键问题被忽略。

  • 传入 confusion_matrix(y_true, y_pred) 后,用 annot=True + fmt='d' 强制显示整数频次
  • 添加 xticklabels=['Predicted Negative', 'Predicted Positive']yticklabels 显式标注行列含义,避免靠记忆对齐
  • cmap='Blues' 而非默认 cmap='viridis',让高值更醒目,同时加 cbar_kws={'label': 'Count'} 明确色条单位

SHAP 图表中 shap.summary_plot 横轴单位混乱?

横轴默认是 SHAP 值(log-odds 差分),但业务方只认“提升/降低概率多少个百分点”,直接展示易引发误解。

  • 调用时加参数 plot_type='dot'(默认)后,用 feature_names 传入中文列名,避免缩写歧义(如 'age_grp''年龄分段'
  • 若需概率尺度,先用模型的 predict_proba 得到原始概率,再用 shap.Explainer(model, X_train, feature_perturbation="tree_path_dependent")(树模型)或 shap.KernelExplainer(线性/其他)重算
  • 注意 shap.summary_plot 对样本量敏感:>1000 行会自动采样,导致局部模式丢失;加 max_display=10plot_size=(8,6) 控制可读性

matplotlib 画特征重要性却看不出业务逻辑?

单纯按 model.feature_importances_ 排序画柱状图,无法体现方向性(正向/负向影响)和阈值效应(如“收入>5万才起作用”)。

  • 改用 pd.Series(model.feature_importances_, index=X.columns).sort_values(ascending=False),再筛选前 10 项,避免长尾噪声干扰焦点
  • 对连续型特征,叠加箱线图(plt.boxplot)或小提琴图(seaborn.violinplot),展示该特征在不同预测结果下的分布偏移
  • 若特征含业务分组(如“渠道来源”含微信、抖音、线下),用 groupby 先聚合再绘图,比单维度排序更有决策价值
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, feature_names=cn_names, max_display=10, plot_size=(8,6))
实际部署时最容易漏掉的是:没把 shap.Explainer 的计算过程封装进预测 pipeline,导致上线后无法复现解释结果;还有人直接用训练集算 SHAP 值去解释测试样本,造成数据泄露。