使用LIME在R中解释模型

数据科学领域,除了对数据进行预处理之外,能够向非专业人士解释模型预测和模型本身同样重要。本文将介绍如何使用LIME(Local Interpretable Model-Agnostic Explanations)这一工具,在R语言中解释模型预测。

LIME简介

LIME是一种解释机器学习模型预测的工具,它的核心思想是回答每个预测的“为什么”,并满足以下四个基本标准:

  • 解释应该能够被目标人群理解,即具有可解释性。
  • 应该能够解释单个预测,这被称为局部保真度。
  • 解释方法应该适用于所有模型,即模型无关性。
  • 除了单个预测,整个模型也应该能够被解释,即考虑全局视角。

LIME的工作原理

LIME的基本假设是,每个模型在局部尺度上(即个体行级数据)都像一个简单的线性模型。LIME通过在个体行的小变化周围拟合这样的简单模型,并通过比较简单模型和复杂模型对该行的预测来提取重要特征。

LIME不仅适用于表格/结构化数据,也适用于文本数据。本文将重点介绍如何在R中使用LIME。

在R中使用LIME

以下是在R中使用LIME进行模型解释的步骤:

install.packages('lime') install.packages('MASS') install.packages("randomForest") install.packages('caret') install.packages('e1071')

如果已经安装了这些库,可以跳过这一步,直接开始下一步。

library(lime) library(MASS) library(randomForest) library(caret) library(e1071) data(biopsy)

将使用乳腺癌肿瘤活检数据集,该数据集包含699名患者的活检信息。

4.1) 移除ID列,因为它只是一个标识符,对没有用处。

biopsy$ID <- NULL

4.2) 重命名其余列,以便在可视化解释时更清楚地了解特征名称。

names(biopsy) <- c('clump thickness', 'uniformity cell size', 'uniformity cell shape', 'marginal adhesion', 'single epithelial cell size', 'bare nuclei', 'bland chromatin', 'normal nucleoli', 'mitoses', 'class')

4.3) 检查是否有缺失值。如果有,需要在进行下一步之前处理它们。

sum(is.na(biopsy))

4.4) 这里有两个选择。可以填补这些值,或者使用na.omit函数删除包含缺失值的行。将选择后者,因为数据清洗超出了本文的范围。

biopsy <- na.omit(biopsy)

最后,让通过查看前几行来确认数据框。

head(biopsy, 5)

将数据集划分为训练集和测试集,并检查数据的维度。

smp_size <- floor(0.75 * nrow(biopsy)) set.seed(123) train_ind <- sample(seq_len(nrow(biopsy)), size = smp_size) train_biopsy <- biopsy[train_ind, ] test_biopsy <- biopsy[-train_ind, ]

检查维度:

cat(dim(train_biopsy), dim(test_biopsy))

训练集有512行,测试集有171行。

将使用caret库中的随机森林模型。不会进行任何超参数调整,只是进行10折交叉验证,重复5次,并使用基本的随机森林模型。

model_rf <- caret::train(class ~ ., data = train_biopsy, method = "rf", trControl = trainControl(method = "repeatedcv", number = 10, repeats = 5, verboseIter = FALSE))

查看模型摘要:

model_rf biopsy_rf_pred <- predict(model_rf, test_biopsy) confusionMatrix(biopsy_rf_pred, as.factor(test_biopsy$class))

这个对象与将要使用的其他LIME函数相关联,用于查看解释。就像训练模型并将其拟合到数据上一样,使用lime()函数来训练这个解释器,然后使用explain()函数进行新的预测。

explainer <- lime(train_biopsy, model_rf)

让使用测试集中的5个新观测值,并仅使用5个特征来解释。可以自由地尝试n_features参数。也可以传递整个测试集或测试集中的单行。

explanation <- explain(test_biopsy[15:20, ], explainer, n_labels = 1, n_features = 5)

可以实验的其他参数包括:

  • n_permutations: 每个解释使用的排列数。
  • feature_select: 用于选择特征的算法。可以选择“auto”、“none”、“forward_selection”、“highest_weights”、“lasso_path”、“tree”。
  • dist_fun: 用于比较局部模型预测的行和全局模型(随机森林)预测的行的距离函数。默认是Gower的距离,但也可以使用欧几里得、曼哈顿等。
  • kernel_width: 从上述计算的个体排列的预测与全局预测的距离,并将其转换为相似度分数。

如何解释和解释这个结果?

  • 蓝色/红色:与目标正相关的特征以蓝色显示,负相关的特征以红色显示。
  • 细胞形状的均匀性<=1.5:较低的值与良性肿瘤正相关。
  • 裸核<=7:较低的裸核值与恶性肿瘤负相关。
  • 案例65、67和70相似,而良性案例64有不寻常的参数。
  • 细胞形状的均匀性和单上皮细胞大小在这种情况下是不寻常的。
  • 尽管这些值偏离,肿瘤仍然是良性的,表明这种情况下的其他参数值补偿了这种异常。

让也用所有特征可视化一个单一案例:

explanation <- explain(test_biopsy[93, ], explainer, n_labels = 1, n_features = 10) plot_features(explanation)
  • 细胞形状的均匀性>5.0:高值与恶性肿瘤正相关(这个值越高,肿瘤恶性的可能性越大)。
  • 团块厚度>6.0:高团块厚度值与恶性肿瘤正相关。
  • 同样,裸核>7.0和平淡染色质>5.0与恶性肿瘤正相关。
  • 相反,细胞大小的均匀性<=5.0和边缘粘连<=4:这两个参数的低值对恶性肿瘤的贡献是负的,恶性肿瘤的可能性越小。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485