iml 包
机器学习模型通常可以很好地进行预测,但无法解释。 iml软件包提供了用于分析任何黑匣子机器学习模型的工具:
特征重要性:哪些是最重要的功能?
特征效应:特征如何影响预测? (累积的局部影响,偏相关图和个别条件期望曲线)
单个预测的解释:单个数据点的特征值如何影响其预测? (LIME和Shapley值)
替代树:我们可以用短决策树来近似底层黑匣子模型吗?
iml包适用于任何分类和回归机器学习模型:随机森林,线性模型,神经网络,xgboost等。
示例
1.读取数据并建立随机森林模型
library("iml")
library("randomForest")
data("Boston", package = "MASS")
head(Boston)
set.seed(42)
rf = randomForest(medv ~ ., data = Boston, ntree = 50)
X = Boston[which(names(Boston) != "medv")]
predictor = Predictor$new(rf, data = X, y = Boston$medv)
- 特征重要性图
我们可以使用FeatureImp来衡量每个特征对于预测的重要性。 特征重要性度量是通过改组每个特征并测量性能下降多少来起作用的。 对于此回归任务,我们选择使用平均绝对误差(mae)来衡量性能损失,另一种选择是均方误差(mse)。
imp = FeatureImp$new(predictor, loss = "mae")
plot(imp)
特征重要性.png
print(imp$results)
feature | importance.05 | importance | importance.95 | permutation.error |
---|---|---|---|---|
lstat | 3.557901 | 4.632124 | 5.497080 | 4.565000 |
rm | 2.900720 | 3.119034 | 4.531629 | 3.073835 |
nox | 1.667456 | 1.714099 | 1.881914 | 1.689260 |
crim | 1.569166 | 1.656692 | 1.679968 | 1.632685 |
dis | 1.593274 | 1.626608 | 1.872172 | 1.603037 |
indus | 1.351980 | 1.462431 | 1.485823 | 1.441239 |
ptratio | 1.388786 | 1.417079 | 1.538757 | 1.396544 |
age | 1.345481 | 1.416432 | 1.485841 | 1.395906 |
tax | 1.254460 | 1.361721 | 1.442950 | 1.341988 |
black | 1.205680 | 1.254997 | 1.340960 | 1.236811 |
rad | 1.059286 | 1.132156 | 1.186773 | 1.115750 |
zn | 1.035060 | 1.074501 | 1.091897 | 1.058930 |
chas | 0.996149 | 1.036302 | 1.072554 | 1.021285 |
- 特征效应
除了知道哪些特征很重要外,我们还对特征如何影响预测结果感兴趣。 FeatureEffect类实现累积的局部效应图,偏依赖图和单个条件期望曲线。 下图显示了“ lstat”特征的局部累积效果(ALE)。 ALE显示了当特征变化时预测结果如何变化。 x轴上的标记表示“ lstat”特征的分布,显示了一个区域与预测结果的相关性(很少或没有点表示我们不应过度解释该区域)。
ale = FeatureEffect$new(predictor, feature = "lstat")
ale$plot()
特征效应.png
effs = FeatureEffects$new(predictor)
plot(effs)
特征效应2.png
4.交互作用
我们还可以衡量要素之间相互作用的强烈程度。 交互作用量度取决于交互作用解释了f(x)的方差。 度量介于0(无交互)和1( f(x)因交互而引起的方差的100%)之间。 对于每个特征,我们衡量它们与任何其他特征的交互程度:
interact = Interaction$new(predictor)
plot(interact)
交互效应1.png
我们还可以指定一项特征,并衡量其与所有其他特征的所有2向交互
interact = Interaction$new(predictor, feature = "crim")
plot(interact)
交互效应2.png
- 替代模型
使模型更易于解释的另一种方法是用一个更简单的模型-决策树替换黑匣子。 我们采用黑匣子模型(在我们的情况下为随机森林)的预测,并针对原始特征和预测结果训练决策树。 该图显示了拟合树的终端节点。 maxdepth参数控制树的生长深度,以及树的可解释性。
tree = TreeSurrogate$new(predictor, maxdepth = 2)
plot(tree)
决策树.png
使用替换的决策树模型进行预测
tree$predict(Boston)
6.1 Local模型解释单个预测值
> lime.explain = LocalModel$new(predictor, x.interest = X[1,])
Loading required package: glmnet
Loading required package: Matrix
Loaded glmnet 3.0-2
Loading required package: gower
> lime.explain$results
beta x.recoded effect x.original feature feature.value
rm 4.4836483 6.575 29.479987 6.575 rm rm=6.575
ptratio -0.5244767 15.300 -8.024493 15.3 ptratio ptratio=15.3
lstat -0.4348698 4.980 -2.165652 4.98 lstat lstat=4.98
> lime.explain = LocalModel$new(predictor, x.interest = X[1,])
> lime.explain$results
> plot(lime.explain)
beta | x.recoded | effect | x.original | feature | feature.value | |
---|---|---|---|---|---|---|
rm | 4.3179058 | 6.421 | 27.725273 | 6.421 | rm | rm=6.421 |
ptratio | -0.5330579 | 17.800 | -9.488430 | 17.8 | ptratio | ptratio=17.8 |
lstat | -0.4418233 | 9.140 | -4.038265 | 9.14 | lstat | lstat=9.14 |
6.2 博弈论解释单个预测值
shapley = Shapley$new(predictor, x.interest = X[1,])
shapley$plot()
博弈论解释.png
7.并行计算见帮助文档
网友评论