一、树模型的解释性

集成学习树模型因为其强大的非线性能力及解释性,在表格类数据挖掘等任务中应用频繁且表现优异。

模型解释性对于某些领域(如金融风控)是极为看重的,对于树模型的解释性,我们常常可以通过输出树模型的结构或使用shap等解释性框架的方法:

本文技术工具来自技术群小伙伴的分享,想加入按照如下方式

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群+CSDN

graphviz 输出树结构

# 需要先安装https://graphviz.org/download/
import os
os.environ["PATH"] += os.pathsep + 'D:/Program Files/Graphviz/bin/'   # 安装路径for k in range(n_estimators):  #遍历n_estimators棵树的结构ax = lightgbm.plot_tree(lgb, tree_index=k, figsize=(30,20), show_info=['split_gain','internal_value','internal_count','internal_weight','leaf_count','leaf_weight','data_percentage'])
plt.show()

输出树的决策路径是很直接的方法,但对于大规模(树的数目>3基本就比较绕了)的集成树模型来说,决策就太过于复杂了,最终决策要每棵树累加起来,很难理解。。(相关树的可解释工作,可参考如下论文:https://www.cs.sjtu.edu.cn/~kzhu/papers/kzhu-infocode.pdf)

接下介绍下常用的几种框架的方法辅助去解释模型:

shap框架解释性

SHAP基于Shapley值,Shapley值是经济学家Lloyd Shapley提出的博弈论概念。它的核心思想是计算特征对模型输出的边际贡献,再从全局和局部两个层面对“黑盒模型”进行解释。如下几行代码就可以展示该模型的变量对于决策的影响,以Insterest历史利率为例,利率特征值越高(蓝色为低,红色为高),对应shap值越高,说明决策结果越趋近1(在本例金融风控项目里面也就是数值越大,越容易违约)

### 需要先pip install shap
import shapexplainer = shap.TreeExplainer(lgb)
shap_values = explainer.shap_values(pd.concat([train_x,test_x]))
shap.summary_plot(shap_values[1], pd.concat([train_x,test_x]),max_display=5,plot_size=(5,5)) #特征重要性可视化

其他模型可解释性框架

  • LIME

在可解释性领域,最早出名的方法之一是LIME。它可以帮助解释机器学习模型正在学习什么以及为什么他们以某种方式预测。Lime目前支持对表格的数据,文本分类器和图像分类器的解释。

知道为什么模型会以这种方式进行预测对于调整算法是至关重要的。借助LIME的解释,能够理解为什么模型以这种方式运行。如果模型没有按照计划运行,那么很可能在数据准备阶段就犯了错误。

  • Shapash

“ Shapash是一个使机器学习对每个人都可以进行解释和理解Python库。Shapash提供了几种类型的可视化,显示了每个人都能理解的明确标签。数据科学家可以更轻松地理解他们的模型并分享结果。最终用户可以使用最标准的摘要来理解模型是如何做出判断的。”

Shapash库可以生成交互式仪表盘,并收集了许多可视化图表。与外形/石灰解释性有关。它可以使用SHAP/Lime作为后端,也就是说它只提供了更好看的图表。

使用Shapash构建特征贡献图

  • InterpretML

InterpretML是一个开源的Python包,它向研究人员提供机器学习可解释性算法。InterpretML支持训练可解释模型(glassbox),以及解释现有的ML管道(blackbox)

  • ELI5

ELI5是一个可以帮助调试机器学习分类器并解释它们的预测的Python库。目前支持以下机器学习框架:scikit-learn、XGBoost、LightGBM CatBoost、Keras

ELI5有两种主要的方法来解释分类或回归模型:检查模型参数并说明模型是如何全局工作的;检查模型的单个预测并说明什么模型会做出这样的决定。

  • OmniXAI

OmniXAI (Omni explained AI的简称),是Salesforce最近开发并开源的Python库。它提供全方位可解释的人工智能和可解释的机器学习能力来解决实践中机器学习模型在产生中需要判断的几个问题。对于需要在ML过程的各个阶段解释各种类型的数据、模型和解释技术的数据科学家、ML研究人员,OmniXAI希望提供一个一站式的综合库,使可解释的AI变得简单。

二、微调树模型结构以符合业务解释性

但是树模型的解释性也是有局限的,再了解树模型的决策逻辑后,不像逻辑回归(LR)可以较为轻松的调节特征分箱及模型去符合业务逻辑(如收入越低的人通常越可能信用卡逾期,模型决策时可能持相反的逻辑,这时就需要调整了)。

我们一旦发现树结构或shap值不符合业务逻辑,由于树模型学习通常较复杂,想要依照业务逻辑去调整树结构就有点棘手了,所有很多时候只能推倒原来的模型,数据清洗、筛选、特征选择等 重新学习一个新的模型,直到特征决策在业务上面解释得通。

在此,本文简单探讨一个可以快速对lightgbm树模型结构进行调整的方法。

lightgbm结构

首先导出lightgbm单棵树的结构及相应的模型文件:

model.booster_.save_model("lgbmodel.txt") # 导出模型文件

tree
version=v3
num_class=1
num_tree_per_iteration=1
label_index=0
max_feature_idx=36
objective=binary sigmoid:1
feature_names=total_loan year_of_loan interest monthly_payment class work_year house_exist censor_status use post_code region debt_loan_ratio del_in_18month scoring_low scoring_high known_outstanding_loan known_dero pub_dero_bankrup recircle_b recircle_u initial_list_status app_type title policy_code f0 f1 f2 f3 f4 early_return early_return_amount early_return_amount_3mon issue_date_y issue_date_m issue_date_diff employer_type industry
feature_infos=[818.18181819999995:47272.727270000003] [3:5] [4.7789999999999999:33.978999999999999] [30.440000000000001:1503.8900000000001] [0:6] [0:10] [0:4] [0:2] [0:13] [0:901] [0:49] [0:509.3672727] [0:15] [540:910.90909090000002] [585:1131.818182] [1:59] [0:12] [0:9999] [0:779021] [0:120.6153846] [0:1] [0:1] [0:60905] none [0:9999] [0:9999] [0:9999] [2:9999] [0:9999] [0:5] [0:17446] [0:4821.8999999999996] [2007:2018] [1:12] [2830:6909] -1:4:3:2:0:1:5 -1:13:11:3:1:2:10:7:8:12:0:4:5:9:6
tree_sizes=770Tree=0
num_leaves=6
num_cat=0
split_feature=30 2 16 15 2
split_gain=3093.94 124.594 59.0243 46.1935 42.6584
threshold=1.0000000180025095e-35 9.9675000000000029 1.5000000000000002 17.500000000000004 15.961500000000003
decision_type=2 2 2 2 2
left_child=1 -1 3 -2 -3
right_child=2 4 -4 -5 -6
leaf_value=0.023461476907437533 -0.17987415362524772 0.10323905611372351 -0.026732447730002745 -0.10633877114664755 0.14703056722907529
leaf_weight=147.41318297386169 569.9415502846241 502.41849474608898 30.554571613669395 100.48724548518658 399.18497054278851
leaf_count=544 3633 1325 133 543 822
internal_value=-5.60284e-08 0.108692 -0.162658 -0.168852 0.122628
internal_weight=0 1049.02 700.983 670.429 901.603
internal_count=7000 2691 4309 4176 2147
is_linear=0
shrinkage=1end of treesfeature_importances:
interest=2
known_outstanding_loan=1
known_dero=1
early_return_amount=1parameters:
[boosting: gbdt]
[objective: binary]
[metric: auc]
[tree_learner: serial]
[device_type: cpu]
[data: ]
[valid: ]
[num_iterations: 1]
[learning_rate: 0.1]
[num_leaves: 6]
[num_threads: -1]
[deterministic: 0]
[force_col_wise: 0]
[force_row_wise: 0]
[histogram_pool_size: -1]
[max_depth: -1]
[min_data_in_leaf: 20]
[min_sum_hessian_in_leaf: 0.001]
[bagging_fraction: 1]
[pos_bagging_fraction: 1]
[neg_bagging_fraction: 1]
[bagging_freq: 0]
[bagging_seed: 7719]
[feature_fraction: 1]
[feature_fraction_bynode: 1]
[feature_fraction_seed: 2437]
[extra_trees: 0]
[extra_seed: 11797]
[early_stopping_round: 0]
[first_metric_only: 0]
[max_delta_step: 0]
[lambda_l1: 0]
[lambda_l2: 0]
[linear_lambda: 0]
[min_gain_to_split: 0]
[drop_rate: 0.1]
[max_drop: 50]
[skip_drop: 0.5]
[xgboost_dart_mode: 0]
[uniform_drop: 0]
[drop_seed: 21238]
[top_rate: 0.2]
[other_rate: 0.1]
[min_data_per_group: 100]
[max_cat_threshold: 32]
[cat_l2: 10]
[cat_smooth: 10]
[max_cat_to_onehot: 4]
[top_k: 20]
[monotone_constraints: ]
[monotone_constraints_method: basic]
[monotone_penalty: 0]
[feature_contri: ]
[forcedsplits_filename: ]
[refit_decay_rate: 0.9]
[cegb_tradeoff: 1]
[cegb_penalty_split: 0]
[cegb_penalty_feature_lazy: ]
[cegb_penalty_feature_coupled: ]
[path_smooth: 0]
[interaction_constraints: ]
[verbosity: -1]
[saved_feature_importance_type: 0]
[linear_tree: 0]
[max_bin: 255]
[max_bin_by_feature: ]
[min_data_in_bin: 3]
[bin_construct_sample_cnt: 200000]
[data_random_seed: 38]
[is_enable_sparse: 1]
[enable_bundle: 1]
[use_missing: 1]
[zero_as_missing: 0]
[feature_pre_filter: 1]
[pre_partition: 0]
[two_round: 0]
[header: 0]
[label_column: ]
[weight_column: ]
[group_column: ]
[ignore_column: ]
[categorical_feature: 35,36]
[forcedbins_filename: ]
[precise_float_parser: 0]
[objective_seed: 8855]
[num_class: 1]
[is_unbalance: 0]
[scale_pos_weight: 1]
[sigmoid: 1]
[boost_from_average: 1]
[reg_sqrt: 0]
[alpha: 0.9]
[fair_c: 1]
[poisson_max_delta_step: 0.7]
[tweedie_variance_power: 1.5]
[lambdarank_truncation_level: 30]
[lambdarank_norm: 1]
[label_gain: ]
[eval_at: ]
[multi_error_top_k: 1]
[auc_mu_weights: ]
[num_machines: 1]
[local_listen_port: 12400]
[time_out: 120]
[machine_list_filename: ]
[machines: ]
[gpu_platform_id: -1]
[gpu_device_id: -1]
[gpu_use_dp: 0]
[num_gpu: 1]end of parameterspandas_categorical:[["\u4e0a\u5e02\u4f01\u4e1a", "\u4e16\u754c\u4e94\u767e\u5f3a", "\u5e7c\u6559\u4e0e\u4e2d\u5c0f\u5b66\u6821", "\u653f\u5e9c\u673a\u6784", "\u666e\u901a\u4f01\u4e1a", "\u9ad8\u7b49\u6559\u80b2\u673a\u6784"], ["\u4ea4\u901a\u8fd0\u8f93\u3001\u4ed3\u50a8\u548c\u90ae\u653f\u4e1a", "\u4f4f\u5bbf\u548c\u9910\u996e\u4e1a", "\u4fe1\u606f\u4f20\u8f93\u3001\u8f6f\u4ef6\u548c\u4fe1\u606f\u6280\u672f\u670d\u52a1\u4e1a", "\u516c\u5171\u670d\u52a1\u3001\u793e\u4f1a\u7ec4\u7ec7", "\u519c\u3001\u6797\u3001\u7267\u3001\u6e14\u4e1a", "\u5236\u9020\u4e1a", "\u56fd\u9645\u7ec4\u7ec7", "\u5efa\u7b51\u4e1a", "\u623f\u5730\u4ea7\u4e1a", "\u6279\u53d1\u548c\u96f6\u552e\u4e1a", "\u6587\u5316\u548c\u4f53\u80b2\u4e1a", "\u7535\u529b\u3001\u70ed\u529b\u751f\u4ea7\u4f9b\u5e94\u4e1a", "\u91c7\u77ff\u4e1a", "\u91d1\u878d\u4e1a"]]

lightgbm集成多棵二叉树的树模型,以如下一颗二叉树的一个父节点及其两个叶子分支具体解释(其他树及节点依此类推), 下面内部节点是以

  • 特征insterest(贷款利率)的数值 是否<=15.962做的判断划分

  • 划分的增益gain 42.658

  • 样本权重 901.603

  • 该节点的样本数2147 占据了30.67%的数据

  • 该节点的如果不继续分裂叶子,获得的分数值是0.123 划分后的两个叶子节点:

  • leaf2 分数值 0.103

  • leaf5 分数值 0.147 分数值越高说明该叶子决策结果越趋近1(在本例金融风控项目里面也就是数值越大,越容易违约)

在金融风控领域是很注重决策的可解释性,有时我们可能发现某一个叶子节点的决策是不符合业务解释性的。比如,业务上认为利率越高 违约概率应该越低,那我们上图的节点就是不符合业务经验的(注:这里只是假设,实际上图节点的决策 还是符合业务经验的)

那么这时最快微调树模型的办法就是直接对这个模型的这个叶子节点剪枝掉,只保留内部节点做决策。

那么,如何快速地对lightgbm手动调整树结构(如剪枝)呢?

lightgbm手动剪枝

这里有个取巧的剪枝办法,可以在保留原始树结构的前提下,修改特定叶子节点的分数值为他们上级父节点的分数值,那逻辑上就等同于“剪枝”了

  • 剪枝前对应的测试集的模型效果

  • 剪枝后 (修改叶子节点为父节点的分数)

可以手动修改下模型文件对应叶子节点的分数值:

我们再验证下剪枝前后,测试集的模型效果差异:auc降了1%,ks变化不大;

通过剪枝去优化模型复杂度或者去符合合理业务经验,对模型带来都是正则化效果模型可以减少统计噪音的影响(减少过拟合),有更好的泛化效果。

当然本方法建立在小规模集成学习的树模型,如果动则几百上千颗的大规模树模型,人为调整每一颗的树结构,这也不现实。。

【机器学习】树模型决策的可解释性与微调(Python)相关推荐

  1. [机器学习] 树模型(xgboost,lightgbm)特征重要性原理总结

    在使用GBDT.RF.Xgboost等树类模型建模时,往往可以通过 feature_importance 来返回特征重要性,各模型输出特征重要性的原理与方法 一 计算特征重要性方法 首先,目前计算特征 ...

  2. MLK | 如何解决机器学习树集成模型的解释性问题

    MLK,即Machine Learning Knowledge,本专栏在于对机器学习的重点知识做一次梳理,便于日后温习,这篇文章主要是结合前几天看到的一个问题,然后结合自己的理解来写的. ? 前情回顾 ...

  3. 【机器学习】为什么在信用风险建模中首选树模型?

    信用风险建模是一个可以使用机器学习来提供解决方案的领域,因为它能够从大量异构数据中找到答案.在信用风险建模中,还需要推断特征,因为它们在数据驱动的决策中非常重要. 在这篇文章中,我们来研究什么是信用风 ...

  4. 机器学习中树模型算法总结之 决策树(下)

    写在前面 首先回顾一下上一篇的相关内容,主要是理论的介绍了决策树的模型及几种常见的特征选择准则,具体可参见机器学习中树模型算法总结之 决策树(上).今天主要接着学习,包括决策树的生成(依赖于第一篇的三 ...

  5. 机器学习中树模型算法总结之 决策树(上)

    写在前面 在网上看XGBoost资料的时候觉得自己以前看的树模型算法都忘得差不多了,所以就趁着这个机会把机器学习里的树模型算法重新再过一遍,主要包括决策树.随机森林.提升树.XGBoost等等. 1. ...

  6. 【机器学习】——逻辑模型:树模型(决策树)

    树模型并不只局限于分类场合,而是可用于解决绝大多数机器学习问题,包括排序.概率估计.回归及聚类. 基本的决策树生成算法是一个贪心算法,采用自上而下.分而治之的递归方式来构造. 决策树 决策树算法3要素 ...

  7. 机器学习算法终极对比:树模型VS神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 选自towardsdatascience 作者:Andre Ye ...

  8. 一文带你入门机器学习中的树模型(附源码)

    树模型 树模型在机器学习中至关重要,它不仅本身具有较好的性能,也可以用于优化其他的算法. 我们在本节将要介绍优化KNN~KNN~ KNN 算法的树模型以及决策树. 一.KNN~KNN~ KNN 的数据 ...

  9. 传统机器学习笔记6——回归树模型

    目录 前言 一.决策树回归 1.1.核心思想 二.启发式切分与最优属性选择 2.1.回归模型示例 2.2.回归树的构建方法 递归二分 过拟合与正则化 3.1.过拟合问题 3.2.过拟合问题的解决方法 ...

最新文章

  1. git保姆级入门(包含解决git仓库报错500的问题)
  2. 车模换几代了,电池什么时候换?
  3. 安装vmware esx4.1
  4. 《基于张量网络的机器学习入门》学习笔记6
  5. .NET CORE下最快比较两个文件内容是否相同的方法
  6. C Primer Plus(三)
  7. 【交通标志识别】基于matlab GUI BP神经网络交通标志识别(带面板)【含Matlab源码 1647期】
  8. 【持续更新】实用算法小点总结(怕忘QAQ)
  9. 百度硬盘搜索使用指南
  10. jmeter分布式部署
  11. 电脑双网卡访问内外网
  12. Hello CTP(二)——CTP简介
  13. 通过财务报表读懂美股
  14. 如何对文件进行压缩和解压缩
  15. 摄影构图学83年绝版_常用的摄影构图之点线面
  16. 微软默认 密钥管理服务器,加密和密钥管理概述 - Microsoft Service Assurance | Microsoft Docs...
  17. 机器学习python基础(一)魔法命令
  18. html创建盒子,HTML 盒子
  19. MONTHS_BETWEEN
  20. make menuconfig学习

热门文章

  1. Audio Framework
  2. soundEffectsEnabled
  3. ios+手机壳+瞬间切换android,这个手机壳可以让你的iPhone 7瞬间变成安卓机
  4. 高德地图发布“极客地图” 女神林志玲推荐最美街拍地
  5. BZOJ_P2563 阿狸和桃子的游戏(贪心)
  6. 2017 ICPC Naning Rake It In
  7. mac在线看html5,Mac看HTML5视频教程
  8. 【人工智能】机器学习入门之监督学习(一)有监督学习
  9. 汇编语言经典书目,初学者必看
  10. 10 04Hibernate之HibernateSessionFactory