Chapter 9 可解释机器学习

随着机器学习模型在各个领域的广泛应用,模型的可解释性变得越来越重要。在R语言中,有许多工具和技术可以帮助数据科学家提高模型的可解释性。本文将探讨几种在R中实现可解释机器学习的方法,包括特征重要性、偏差分析、局部解释等。

  1. 特征重要性 (Feature Importance) 特征重要性是一种衡量特征对模型预测能力贡献大小的方法。在随机森林模型中,特征重要性通常通过计算每个特征在所有树中分裂时减少的不纯度(如基尼不纯度或信息增益)的平均值来确定。特征重要性可以帮助我们识别对模型预测最有影响的特征,从而在特征选择和模型解释中发挥重要作用。

  2. 偏差分析 (Partial Dependence Plots, PDP) 偏差分析是一种用于展示特定特征和目标变量之间关系的图形化方法。偏差图显示了在保持其他特征不变的情况下,目标变量的预测值如何随着某个特征的变化而变化。这种分析有助于理解模型如何依赖于特定的特征,以及特征值的变化如何影响预测结果。

  3. 局部解释 (Local Interpretability) 局部解释是指解释单个预测结果的原因。LIME(Local Interpretable Model-agnostic Explanations)是一种局部解释方法,它通过在原始模型周围的局部区域拟合一个简单的线性模型来近似原始复杂模型的预测。SHAP(SHapley Additive exPlanations)是另一种局部解释方法,它基于博弈论中的Shapley值,将每个特征对预测结果的贡献量化为一个值。这些方法有助于理解单个预测背后的原因,提高模型的透明度和可信度。

9.1 特征重要性 (Feature Importance)

特征重要性是衡量各个特征对模型预测结果影响大小的一种方法。在R中,可以使用randomForest、xgboost等包来计算特征重要性。

# 加载数据集
library(MASS)
data("Boston")

# 将数据集分为训练集和测试集
set.seed(123)  # 设置随机种子以确保可重复性
sample_index <- sample(1:nrow(Boston), 0.8 * nrow(Boston))
train_data <- Boston[sample_index, ]
test_data <- Boston[-sample_index, ]


# 使用随机森林计算特征重要性
# 训练随机森林模型
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
rf_model <- randomForest(medv ~ ., data=train_data)

# 计算特征重要性
importance_values <- importance(rf_model)
 
importance_values
##         IncNodePurity
## crim        2156.6560
## zn           261.6065
## indus       1839.9963
## chas         169.6194
## nox         1751.0073
## rm         10502.7378
## age         1022.9728
## dis         2068.9939
## rad          266.0089
## tax         1035.7937
## ptratio     2567.2776
## black        560.3655
## lstat       9478.5109

9.2 偏差分析 (Partial Dependence Plots, PDP)

偏差分析可以帮助我们理解特定特征与目标变量之间的关系。在R中,pdp包提供了生成偏差图的功能。

# 生成偏差图
library(pdp)
pdp_obj <- partial(rf_model, pred.var = "lstat")
plot(pdp_obj, main="Partial Dependence Plot for 'lstat'")

9.3 局部解释

使用lime包进行局部解释。

# 加载所需的库
library(lime)
library(randomForest)
library(caret)
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:randomForest':
## 
##     margin
## Loading required package: lattice
# 使用caret包装随机森林模型
rf_model_caret <- train(medv ~ ., data=train_data, method="rf")

# 创建lime模型解释器
explainer <- lime::lime(
  x = train_data, 
  model = rf_model_caret
)
## Warning: chas does not contain enough variance to use quantile binning. Using
## standard binning instead.
# 解释测试数据中的前5个观测值
explanation <- lime::explain(
  x = test_data[1:5, ], 
  explainer = explainer, 
  n_features = 5
)
## Warning in gower_work(x = x, y = y, pair_x = pair_x, pair_y = pair_y, n = NULL,
## : skipping variable with zero or non-finite range
## Warning in gower_work(x = x, y = y, pair_x = pair_x, pair_y = pair_y, n = NULL,
## : skipping variable with zero or non-finite range

## Warning in gower_work(x = x, y = y, pair_x = pair_x, pair_y = pair_y, n = NULL,
## : skipping variable with zero or non-finite range

## Warning in gower_work(x = x, y = y, pair_x = pair_x, pair_y = pair_y, n = NULL,
## : skipping variable with zero or non-finite range

## Warning in gower_work(x = x, y = y, pair_x = pair_x, pair_y = pair_y, n = NULL,
## : skipping variable with zero or non-finite range
# 绘制解释结果
plot_features(explanation)

9.4 参考

  1. 可解释机器学习: https://rpubs.com/liam/interpretableMachineLearning
  2. 可解释机器学习,DrWhy: https://rpubs.com/liam/DrWhy