导语
在机器应用案例中:
金融行业:银行需要我们开发模型,帮助柜员判断要不要给这个用户办理信用贷款,柜员用机器学习模型来自动判断,判断不能给这位用户办理贷款,柜员想知道模型是依据这位用户的那些信用条件,不给他办理贷款的
医疗诊断:在医院里,医生借助诊断模型辅助他完成病人病情的诊断,医生想知道模型是依据这位病人检测报告中的那项指标看出对方得什么病的
法律断案:在法律上,法官借助断案模型辅助他完成犯人的案情定罪,法官想知道模型是依据这位犯人犯了哪些罪才给他定的这个有期徒刑5年呢
没有可解释的现状
每当我们建立任何机器学习或神经网络模型时,我们只是根据模型的预测结果来判断它。
但对于大多数非线性模型来说,我们永远不知道我们的模型是如何预测的,这意味着我们不知道哪些特征有助于我们的预测。
特别是神经网络这块,在做图像处理的时候,我们无法知道网络内部是怎么样做到学习到了识别猫狗的能力的。对于人类而言,模型像是一个黑盒。虽然线性模型可以跟直观的告诉我们模型怎么运转的,但是模型中有很多非线性,抽象的,是人类无法理解的。
为什么要做可解释
- 交叉验证可能会失败 尽管在投入生产之前,我们可以依靠交叉验证来测试我们的模型 但交叉验证的问题是,我们永远不知道在生产中会得到什么样的测试数据。
- A/B测试不是每个人的解决方案 虽然A/B测试是一个黄金标准,但问题公司将不得不向公共测试人员展示非最佳质量的产品。也可能很贵。
但是有可解释,我们就能很精准的发现模型中那些特征对模型影响因素最大,检查模型参数,并尝试了解模型如何在全局范围内工作
检查一个模型的单个特征的重要影响权重,试图找出模型做出决策的原因
回到应用案例:比如说医疗诊断
医生根据模型可解释,了解,病人是因为血小板指标较小,得的低血糖病,而不是像之前那样,模型输入病人的检测报告数据,输出病人得了低血糖。
下图为不同模型的可解释程度对比图
什么样的可解释是最好的呢:
回到我们的人脑来看,我们人类不需要知道脑子的思维的运转是什么样的,但我们收到别人传递的信息,有时候还是会相信别人的一些话。
你给我一个理由,让我选择相信你说的话,就像下面这一组谈话,对方不同的方式理由,给人的选择相信对方情况是不同的。
因此我觉得能够让对方接受的理由,让人高兴的理由(可解释)就是好的可解释
可解释性分类:
可解释性可以为分为局部可解释和全局可解释
Local Explainable:这个图片的为什么是杨幂
Global Explainable:杨幂应该长什么样
Local Explainable基本思路
模型之所以知道这张图片是杨幂,是因为模型把重点关注到人的五官特征上。就像下面这种图,白色点就是模型真正去关注的地方
回归到可解释性,理由就可以说:因为这张图片的人的人脸五官,结合起来看,所以她是杨幂。
那如果说我们要知道可解释性中这张图片那个五官特征起最决定性的作用,能帮我们判断她是杨幂的呢
方法:通过改变特征数据的权重,或者删除特征数据来看最后输出的变化,在图像中就是通过改变像素的某一个像素值,来看loss的变化,如果loss变化大,那说明这个位置的像素对图片的重要性大
Global Explainable基本思路
对于模型的Global可解释性,就说让模型去学习,杨幂长什么样子。
在net网络中,模型通过不同的卷积核去发现出杨幂这个人的特征,如下图所示。
通过不同的纹理,来侦测出一个人的五官特征点,让模型学习到杨幂的特征,这里就有点类似于GAN中的生成器一样。
可解释性框架
机器学习可解释性的一些主要框架,如ELI5、LIME、SKATER或SHAP(以及PDPbox和FairML)
ELI5项目实战案例
我们的示例将使用一个模型,该模型根据足球队的统计数据预测一个足球队是否会拥有“最佳球员”赢家
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier y = (data['Man of the Match'] == "Yes") # Convert from string "Yes"/"No" to binary feature_names = [i for i in data.columns if data[i].dtype in [np.int64]] X = data[feature_names] train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1) my_model = RandomForestClassifier(n_estimators=100, random_state=0).fit(train_X, train_y) import eli5 from eli5.sklearn import PermutationImportance perm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y) eli5.show_weights(perm, feature_names = val_X.columns.tolist())
解释排列的重要性
朝上的值是最重要的特征,朝下的值最不重要。
在我们的例子中,最重要的特征是进球。这似乎是明智的。对于其他变量的顺序是否令人惊讶,球迷可能有一些自己直觉