机器学习模型解释与ELI5工具使用指南

机器学习领域,模型通常被比喻为“黑箱”,因为对于大多数模型,只能看到输入和输出,而无法了解模型内部是如何工作的。尽管可能不完全理解模型是如何得出特定解决方案的,但知道模型的准确性。因此,面临两个选择:要么信任模型并接受解决方案,要么深入研究模型为何得出特定解决方案。本文将探讨后者,尝试解释机器学习模型。

在开始之前,先回答一个关键问题:当模型已经具有高准确性时,为什么还需要解释机器学习模型?为什么不直接信任它?在机器学习中,模型解释和准确性之间总是存在权衡。选择哪一个取决于需要预测的内容。例如,可能不关心电影推荐系统是如何做出推荐的,只要它的准确性足够高。然而,当一个高度准确的机器学习模型预测应该给患者使用哪种药物时,情况就大不相同了。在后一种情况下,对错误预测的容忍度要低得多,因此有必要检查模型是如何得出解决方案的。模型解释对于向商业人士展示解决方案也很重要,他们不关心使用的代码和复杂的损失函数,只关心模型是否解决了问题。

讨论了解释的重要性之后,让继续尝试使用一个非常流行的模型解释工具ELI5。ELI5是一个Python包,用于检查机器学习分类器并解释它们的预测。它通常用于调试sklearn回归器和分类器、XGBoost、CatBoost、Keras等算法。

要开始使用,需要一个数据集和一个问题。本文将以“社交网络广告”数据集为例,尝试预测用户是否通过点击社交网络上显示的广告购买了产品,基于其性别、年龄和估计收入。以下是使用ELI5进行模型解释和调试的步骤。

步骤1:安装ELI5

安装完包后,就可以开始使用它了。

步骤2:导入重要库

import pandas as pd import numpy as np import seaborn as sns import eli5 as eli from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split

步骤3:导入数据集

data = pd.read_csv(r'Social_Network_Ads.csv') print(data.head())

步骤4:数据准备和预处理

在这一步中,执行了一些基本的预处理步骤,例如检查缺失值,将数据集分割为输入和输出,训练和测试集,并对分类变量进行标签编码。

data.isna().sum() # 分割数据集为独立变量和因变量 X = data.iloc[:, [1, 2, 3]] y = data.iloc[:,[4]] print("独立变量(预测因子) :n", X.head(), "n因变量(目标):n", y.head()) encoder = LabelEncoder() X.Gender = encoder.fit_transform(X.Gender) # 将数据集分割为训练集和测试集(75:25) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)

步骤5:模型训练

# 决策树分类器 classifier_dtc = DecisionTreeClassifier() classifier_dtc.fit(X_train, y_train)

步骤6:模型测试

在训练模型后,将其应用于保留用于测试的数据集的25%。

# 预测测试集结果 y_pred = classifier_dtc.predict(X_test)

步骤7:模型评估

已经做出了预测,现在是模型评估的时候了。在这里使用混淆矩阵。混淆矩阵中的每一行对应实际类别,每一列对应预测类别。

from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report clf_rpt = classification_report(y_test,y_pred) print("分类报告 :", clf_rpt) cm = confusion_matrix(y_test, y_pred) sns.heatmap(cm,annot=True)

从分类报告中可以看出,模型的准确性为84%。但想知道模型是如何得出这个结论的。因此,让继续使用ELI5来获得一些答案。

首先,可以使用explain_weights()来找出预测中每个特征的权重。对于基于树的模型,ELI5在计算特征权重时并没有做什么新的事情。它只是使用准备决策树时使用的GINI指数作为权重。

eli.explain_weights(classifier_dtc)

以下是带有特征权重的决策树的一部分。

eli.explain_prediction(classifier_dtc , np.array(X_test)[1]) 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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485