全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
1810 0
2020-12-17
使用可解释的AI(Lime,Shap)行业用例发布黑匣子模型。
本文介绍了在保险公司中使用可解释的AI框架(Lime,Shap)来预测客户对购买车辆保险单感兴趣的可能性。
作为数据科学家学习的最好方法是向黑客马拉松学习,这种马拉松涉及构建要在排行榜上评估的模型。出于对机器学习算法的行业用例的好奇心和趋势问题,由于其可解释的性质,许多公司仍使用传统模型(逻辑或线性回归)来决定其业务。最近的研究和屡获殊荣的数据黑客马拉松解决方案表明,梯度提升算法(Lightgbm,Catboost和Xgboost)比传统模型更健壮。
在各种机器学习算法的新兴市场中,梯度提升算法在其用例方面变得越来越有用,与传统的机器学习算法相比,它为线性和非线性特征提供了鲁棒性。
最近,Explainable AI(Lime,Shap)使黑盒模型本质上具有高精度和高可解释性,可用于跨行业的业务用例,并为业务利益相关者做出更好的决策。
Lime(与本地可解释模型无关的解释)有助于阐明机器学习模型并使其预测可单独理解。该方法解释了特定单个实例的分类器,因此适合本地考虑。
SHAP代表SH apley一个dditive前P lanations。基于Shapley值的机器学习模型解释的核心思想是使用合作博弈论的公平分配结果在模型的输入特征之间为模型的输出f(x)f(x)分配信用。为了将博弈论与机器学习模型联系起来,既需要使模型的输入特征与游戏中的玩家相匹配,又要使模型功能与游戏规则相匹配。
可解释的AI的重要性
模型行为
透明度
做出更好的决定
可以解释任何模型,无论是黑盒模型还是深度学习
这是桥梁,并有助于使用更可靠的模型(以提高准确性和可解释性)
诚信度
模型调试
这篇文章的数据来自Analytics Vidhya网站上托管的Hackathon,可对车辆保险单进行交叉销售预测。
深入分析交叉销售预测数据
保险单是公司承诺为特定的损失,损坏,疾病或死亡提供赔偿保证的一种安排,以换取指定的保险费。保费是客户需要定期向保险公司支付此保证金的金额。
现在,为了预测客户是否会对车辆保险感兴趣,您需要了解有关人口统计信息(性别,年龄,区域代码类型),车辆(车辆年龄,损坏),保单(保费,货源渠道)等信息。
这是一个二进制分类问题。
解释模型的步骤
1.了解问题并导入必要的软件包
执行EDA(了解我们的数据集)
数据转换(使用适合于分类特征的编码方法)
分散数据以训练和验证数据
使用极限梯度提升机器学习模型(Lightgbm)进行预测
用Lime和Shap解释模型
了解问题陈述并导入包和数据集
变量定义
ID客户的唯一ID
性别客户性别
年龄客户年龄
驾驶执照0:客户没有DL,1:客户已经具有DL
区域代码客户所在地区的唯一代码
以前_已保险1:客户已经拥有车辆保险,0:客户没有车辆保险
车辆年龄车龄
车辆损坏1:客户过去曾损坏车辆。
0:客户过去没有受到车辆损坏。
年度_高级客户需要在当年支付的保费金额
Policy_Sales_Channel与客户联系的渠道的匿名代码,即 不同的代理,通过邮件,通过电话,亲自等
年份酒客户已与公司建立联系的天数
响应1:客户感兴趣,0:客户不感兴趣
上面的属性用于确定客户是否对购买新的车辆保险感兴趣,是否对购买新的车辆保险不感兴趣。
导入包
将熊猫作为pd导入
将numpy导入为np
导入操作系统,随机,数学,全局
从IPython.display导入图像为IM
从IPython.display导入clear_output
从matplotlib导入pyplot作为plt
将seaborn导入为sns
%matplotlib内联
从sklearn.model_selection导入train_test_split
汇入
从sklearn.preprocessing导入LabelEncoder
从lightgbm导入LGBMClassifier
plt.rcParams ['figure.figsize'] = [5,5]
pd.set_option('display.max_columns',无)
#模型可解释性用例
从sklearn.model_selection导入train_test_split
从sklearn.metrics导入precision_score,roc_auc_score,classification_report,confusion_matrix,plot_confusion_matrix,plot_roc_curve
从lime.lime_tabular导入LimeTabularExplainer
进口杂货
以上软件包用于数据处理,数据可视化,数据拆分,算法,模型可解释性软件包。
执行EDA(探索性数据分析)并了解我们的数据集
df = pd.read_csv('train.csv')
df.head()
#获取每个客户的数量
对于df.columns中的cols:
    打印(' -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - ')
    打印(df [cols] .value_counts())
print('我们的数据集中有{}行'.format(df.shape [0]))
print('我们的数据集中有{}列'.format(df.shape [1]))
可解释的AI青柠味
可解释的AI青柠味
检查我们的目标变量(响应)
可解释的AI青柠味
我们观察到,我们有一个比“是”更高的客户“没有响应”。它称为不平衡数据集。
数据转换
使用分类编码的性质已知使用序数编码方法,即作为有意义的排序的性质,作为要转换的3个分类变量的数据是Vehicle_Age,Vehicle_Damage和Gender。
注–性别可以采用另一种编码方法(一次编码)
#清理数据
#映射他们
df ['Vehicle_Age'] = df ['Vehicle_Age']。replace({'<1 Year':1,'1-2 Year':2,'> 2 Years':3})
df ['Vehicle_Damage'] = df ['Vehicle_Damage']。map({'Yes':1,'No':0})
df ['Gender'] = df ['Gender']。map({'Male':1,'Female':0})
检查相关矩阵
可解释的AI青柠味
使用Pearson Correlation系数的特征相关系数越接近1,我们就可以从该图推断出Vehicle_Dage是与我们目标变量(Response)最相关的特征。
造型零件
分割数据
X = df.drop([“” Response“,'id'],轴= 1)
y = df [“ Response”]
#将数据拆分为训练和验证集
#训练和测试数据
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 101,stratify = y)
#训练和验证集的数据形状
print('X_train {}的形状'.format(X_train.shape))
print('y_train {}的形状'.format(y_train.shape))
print('X_test {}的形状'.format(X_test.shape))
print('y_test {}的形状'.format(y_test.shape))
我们的训练和验证数据的形状。我们将使用Lightgbm算法来构建模型。
使用Lightgbm算法
    参数= {}
    params [“ objective”] =“二进制”
    params ['metric'] ='auc'
    params [“ max_depth”] = -1
    params [“ num_leaves”] = 10
    params [“ min_data_in_leaf”] = 20
    params [“ learning_rate”] = 0.03
    params [“ bagging_fraction”] = 0.9
    params [“ feature_fraction”] = 0.35
    params [“ feature_fraction_seed”] = 20
    params [“ bagging_freq”] = 10
    params [“ bagging_seed”] = 30
    params [“'min_child_weight'”] = 0.09
    params [“ lambda_l1”] = 0.01
    params [“ verbosity”] = -1
从lightgbm import LGBMClassifier#初始化模型
型号= LGBMClassifier(** params)
#拟合模型
model.fit(X_train,y_train)
使用ROC_AUC分数检查我们的模型性能。
def model_auc(模型):
    train_auc = roc_auc_score(y_train,model.predict_proba(X_train)[:
    val_auc = roc_auc_score(y_test,model.predict_proba(X_test)[:
    print(f'Train AUC:{train_auc},Val Auc:{val_auc}')
#模特表现
model_auc(模型)
#预测验证集的可能性
y_pred = model.predict_proba(X_test)[:
#检查roc_auc_curve
print(模型的AUC分数为{}'。format(roc_auc_score(y_test,y_pred)))
#roc_auc分数的可视化
plot_roc_curve(model,X_test,y_test)
上图显示了roc_auc得分和图。
模型的特征重要性
全局要素重要性量化了测试数据集中每个要素的相对重要性。它提供了数据集中每个要素对预测影响程度的一般比较。
上图显示了每个功能对响应做出的贡献的权重和值,可能是客户对车辆保险感兴趣还是不感兴趣。从以上功能来看,企业将面临许多问题。
排名前5位的功能对第0级或第1级的贡献更大
该决定需要更加透明
可解释的AI(使用酸橙和香脆)
局部特征重要性衡量每个特征值对特定个体预测的影响。
可解释的AI青柠味
酸橙
这是模型不可知的方法,这意味着它适用于任何模型,以便为预测提供解释。
用石灰做决定
从lime.lime_tabular导入LimeTabularExplainer
class_names = [0,1]
#实例化数据集的说明
limeexplainer = LimeTabularExplainer(X_test.values,class_names = class_names,feature_names = X_test.columns,discretize_continuous = True)
idx = 0#数据集的行
解释性表达式=石灰explainer.explain_instance(X_test.values [idx],model.predict_proba,num_features = 3,标签=类名)
describeable_exp.show_in_notebook(show_table = True,show_all = False)
可解释的AI青柠味
我们可以看到前3个功能以及索引为0的客户所属的实际类别。对于使客户对车辆保险单感兴趣的属性的权重和值,Lime使我们更容易解释。
超值
它具有用于解释基于树的模型的优化功能以及用于解释任何已知预测的黑匣子模型的模型不可知解释器功能。
解释器= shap.TreeExplainer(模型)
预期值=说明者。预期值
如果isinstance(expected_value,list):
    预期值=预期值[1]
print(f“ Explainer预期值:{expected_value}”)
idx = 100#为快速运行选择了行
选择=范围(idx)
功能= X_test.iloc [选择]
feature_display = X.loc [features.index]
进口警告
warnings.simplefilter(action ='ignore',category = FutureWarning)
使用warnings.catch_warnings():
    warnings.simplefilter('ignore')
    shap_values = explorer.shap_values(功能)[1]
    shap_interaction_values =说明器.shap_interaction_values(功能)
如果isinstance(shap_interaction_values,list):
    shap_interaction_values = shap_interaction_values [1]
可解释的AI青柠味
摘要图(比功能重要性更一致和可信赖)
可解释的AI青柠味
从以上总结可以看出,该图与全局要素重要性不同,但与LIME功能重要性的前3个要素相似。
摘要图(检查特征正向或负向移动决策)
可解释的AI青柠味
从图中可以得出结论,当Previously_Insured为0,Vehicle_Damage为1时,它对正类(1)的贡献更大。我们还可以从Driving_License功能中看到特定客户的行为,这对于模型调试很有帮助。
依赖关系图(单向图检查100位客户的行为)
shap.dependence_plot(ind ='Age',interact_index ='Age',
                    shap_values = shap_values,功能= X_test [:idx],
                    display_features = feature_display)
可解释的AI青柠味
从100-200个选定客户的模型中,从20-35岁的年龄开始对模型产生负面影响,从40-50-50岁的年龄开始受到积极影响。
两个依赖图
shap.dependence_plot(ind ='Age',interact_index ='Previously_Insured',
                    shap_values = shap_values,功能= X_test [:idx],
                    display_features = feature_display)
可解释的AI青柠味
我们观察到年龄的2次交互作用,该交互作用被先前的保险值分隔为0或1。
单独进行力图
shap.initjs()#运行以显示图
shap.force_plot(explainer.expected_value,shap_values = shap_values [0
可解释的AI青柠味
显示将索引上的客户的决策移至正值的特征。它显示客户的基本预测为-0.92,我们可以推断出Vehicle_Damage = 1,Previously_Insured = 0,Age = 46和Policy_Channel = 26,正在将客户推向正值。
多力图
shap.force_plot(解释器.expected_value,shap_values,feature_display)
可解释的AI青柠味在制定决策时强制绘制多个客户索引。
决策图
shap.decision_plot(期望值,shap_values,特征)
可解释的AI青柠味模型的决策链。
结论
可解释的AI(Lime和Shap)可以帮助使我们的黑匣子模型更易于企业理解。可解释的AI可以与任何算法(逻辑或线性回归,决策树等)一起使用。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群