使用ELI5消除模型解释的神秘性
大多数机器学习和
人工智能模型通常被称为“黑匣子”。您是否想过为什么要这样称呼他们?黑匣子模型总是好事吗?对于未启动的黑匣子模型,是指人类只能看到输入和输出的机器。作为人类,我们对于机器如何处理输入以达到所述输出一无所知。
在大多数情况下,在机器学习(ML)中,我们也不知道机器如何实现特定的解决方案,但是我们知道模型的准确性。因此,我们有两个选择:要么我们可以仅信任机器并接受解决方案,要么深入研究为什么机器要达到特定的解决方案?让我们采用后一种方法,尝试解释
机器学习模型。
但是在开始之前,让我们回答一个非常关键的问题:为什么在已经具有很高的准确性的情况下解释机器学习模型是必要的?为什么不就已经信任它呢?
为什么ML模型的可解释性如此重要?
在ML中,始终需要在模型解释和准确性之间进行权衡。而选择哪个始终取决于:必须预测什么?例如,鉴于电影推荐系统具有良好的准确性,我们不关心它如何进行推荐。但是,当高精度的机器学习模型对应向患者使用哪种药物进行预测时,情况会有所不同。
在后一种情况下,与前一种情况相比,我们对错误的预测几乎没有兴趣。因此,有必要检查模型如何到达解决方案。模型解释对于向业务人员展示我们的解决方案也很重要,他们不关心我们的代码和所使用的花哨的损失函数。他们只是在乎模型是否可以解决问题。
在讨论了可解释性为何如此重要的原因之后,让我们继续尝试在一种非常流行的模型解释工具ELI5中获得一些动手经验。
什么是ELI5?
简而言之,ELI5是一个python软件包,用于检查ML分类器并解释其预测。它广泛用于调试算法,例如sklearn回归器和分类器,XGBoost,CatBoost,Keras等。您可以在此处了解有关该软件包的更多信息。
ELI5模型解释
首先,我们需要一个数据集和一个问题。出于本文的目的,我们将使用social_network_ads数据集。在这里,我们将尝试根据其性别,年龄和估算工资,通过在社交网络上点击显示给其的广告来预测用户是否购买了该产品。因此,事不宜迟,让我们开始吧。
步骤1:安装ELI5
如果您尚未在系统上安装ELI5软件包,请使用以下命令进行安装:
点安装eli5
5级
安装软件包后,我们就可以使用它了。
步骤2:导入重要的库
将熊猫作为pd导入
将numpy导入为np
将seaborn导入为sns
将eli5导入为eli
从sklearn.tree导入DecisionTreeClassifier
从sklearn.preprocessing导入LabelEncoder
从sklearn.model_selection导入train_test_split
步骤3:导入数据集
数据= pd.read_csv(r'/ content / Social_Network_Ads.csv')
data.head()
5级
步骤4:数据准备和预处理
在此步骤中,我们执行了一些基本的预处理步骤,例如检查NA,将数据集分为输入和结果,训练和测试集以及标签编码分类变量。
data.isna()。sum()
#将数据集拆分为独立变量和因变量
X = data.iloc [:
y = data.iloc [:,[4]]
print(“ Independent Variables(Predictors):n”,X.head(),“ nDependent Variable(Target):n”,y.head())
5级
编码器= LabelEncoder()
X.Gender =编码器.fit_transform(X.Gender)
#将数据集分为训练集和测试集(75:25)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.25)
一旦准备好数据,就可以训练ML模型进行预测了。在这种情况下,我们使用决策树分类器。
步骤5:模型训练
#决策树分类器
classifier_dtc = DecisionTreeClassifier()
classifier_dtc.fit(X_train,y_train)
5级
步骤6:模型测试
训练模型后,在我们保留用于测试的数据集的25%上对其进行测试。
#预测测试集结果
y_pred = classifier_dtc.predict(X_test)
步骤7:模型评估
已经做出了预测,现在是进行模型评估的时候了。我们在这里使用混淆矩阵。混淆矩阵中的每一行都对应于实际类别,而每一列则对应于预测类别。
#制作混淆矩阵
从sklearn.metrics导入confusion_matrix
从sklearn.metrics导入category_report
clf_rpt =分类报告(y_test,y_pred)
打印(“分类报告:”,clf_rpt)
cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm,annot = True)
从分类报告中可以看出,该模型的准确性为84%。但是我们想知道模型是如何得出这个结论的。因此,让我们继续尝试使用ELI5来获得一些答案。
步骤8:模型解释
首先,我们可以使用explain_weights()查找在预测中赋予每个特征的权重。对于基于树的模型,ELI5在计算特征权重方面没有任何新功能。它仅使用用于准备决策树的GINI索引作为权重。
eli.explain_weights(classifier_dtc)
这是具有特征权重的决策树的一部分。
假设是否希望调试并检查如何针对特定行预测结果。我们可以使用explain_prediction()。
eli.explain_prediction(classifier_dtc,np.array(X_test)[1])
从上面的输出可以看出,eli5向我们展示了每个特征在预测输出中的作用。如果您进一步希望查看并比较将特征和值的组合导致特定的预测,则可以使用show_prediction()。
eli.show_prediction(classifier_dtc,X_test.iloc [1],
feature_names = list(X.columns),
show_feature_values = True)
eli.show_prediction(classifier_dtc,X_test.iloc [20],
feature_names = list(X.columns),
show_feature_values = True)
是的 你猜对了。在ELI5中,预测基本上是包括偏差在内的积极特征的总和。
题库