在数据科学领域,除了对数据进行预处理之外,能够向非专业人士解释模型预测和模型本身同样重要。本文将介绍如何使用LIME(Local Interpretable Model-Agnostic Explanations)这一工具,在R语言中解释模型预测。
LIME是一种解释机器学习模型预测的工具,它的核心思想是回答每个预测的“为什么”,并满足以下四个基本标准:
LIME的基本假设是,每个模型在局部尺度上(即个体行级数据)都像一个简单的线性模型。LIME通过在个体行的小变化周围拟合这样的简单模型,并通过比较简单模型和复杂模型对该行的预测来提取重要特征。
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)
可以实验的其他参数包括:
如何解释和解释这个结果?
让也用所有特征可视化一个单一案例:
explanation <- explain(test_biopsy[93, ], explainer, n_labels = 1, n_features = 10)
plot_features(explanation)