《The R journal》杂志主编写了一个R包{vivid},可将机器学习模型作图!

学术   科学   2024-03-25 19:28   浙江  
这篇文章介绍一个R包,名为{vivid},可以将机器学习模型的交互作用以及变量重要性通过图片的形式呈现,并且还可以制作偏依赖图。而上述的几张图片是了解和解释机器学习模型的重要图片。如果使用得当,这个R包将会是你的得力战将!

这个R包的关键函数如下表所示: 

文献[1] 表2

首先安装并且载入相关的R包: 

install.packages("vivid") # 计算变量交互以及重要性图
install.packages("randomForest")
# 建立随机森林模型
install.packages(c("network", "sna", "scales", "intergraph", "lemon"))
# 制作网络图

if (!requireNamespace("graph", quietly = TRUE)){install.packages("BiocManager")
  BiocManager::install("graph")
}
install.packages("zenplots")

library(vivid)
library(randomForest)
library(MASS)
将使用R包{MASS}中的著名数据集Boston,它是一个关于房价的数据集,感兴趣的读者可以使用代码?Boston进一步查看。

大致了解下数据集: 

summary(Boston)

最后的一个变量medv通常作为感兴趣的结局变量,是一个连续变量,为房价。其他通常作为自变量,包含周边的犯罪率和空气污染等等。

下一步,以建立一个随机森林模型为例,代码如下: 

set.seed(123)
rf_model <- randomForest(medv ~., data = Boston)
上述代码中波浪线右侧的英文句号"."指的是纳入除因变量以外的所有变量。

下一步,计算变量交互作用(interactions)以及重要性(importance),将使用vivi()函数(顺便提一句,变量交互的英文为variable interactions,变量重要性的英文为variable importance,取首字母,即vi以及vi;所以作者使用vivi作为函数名),代码如下: 

set.seed(123)
VIVI_rf <- vivi(data = Boston,
                fit = rf_model,
                response = "medv")
上述的三行代码为vivi()函数的必填内容,包含数据集,模型,以及因变量。

如果将上述的三行代码展开的话(如下),结果是一样的,只是隐藏了一些默认的行为: 

set.seed(123)
VIVI_rf <- vivi(data = Boston,
                fit = rf_model,
                response = "medv",
                reorder = TRUE,
                normalized = FALSE,
                importanceType = "agnostic",
                gridSize = 50,
                nmax = 500,
                class = 1,
                predictFun = NULL,
                numPerm = 4)
其中,importanceType = "agnostic" 指代默认使用agnostic置换方法计算重要性,它是一种非参数方法;normalized = FALSE 指代Friedman's H-statistic的值未被标准化。

上述函数的代码运行后将会产生一个矩阵,对角线上为变量重要性,非对角线上为变量交互。

可以查看一下结果,代码如下: 

print(VIVI_rf, digits = 1)

下一步,介绍如何将上面的矩阵作图。

这个R包提供了多种方式,第一种是将上述的矩阵做成热图(heatmap),代码如下: 

viviHeatmap(mat = VIVI_rf)

右侧上方图例Vint指代变量交互;而下方Vimp指代变量重要性。

在这个热图中,变量重要性是分布在对角线上的;而变量交互分布在非对角线上。

就变量重要性来说(绿色),lstat为最重要的变量,rm次之。

如果不喜欢上述的绿色,希望改成红色,可以进一步修饰,代码如下: 

viviHeatmap(mat = VIVI_rf,
            impPal = rev(colorspace::sequential_hcl(palette = "Reds 3", n = 100)))

下一步,这个R包还提供了热图以外的形式,比如网络图,代码如下: 

viviNetwork(mat = VIVI_rf)

上图中的节点(圆形)指代变量重要性,而连接线条指代变量交互。

也可以给变量交互(连接线条)设定一个阈值(比如0.2),代码如下: 

viviNetwork(mat = VIVI_rf, intThreshold = 0.2, removeNode = TRUE)

也可以改变图片的布局风格,代码如下: 

viviNetwork(mat = VIVI_rf,
            layout = igraph::layout_on_grid)

下一步,这个R包可以画出实战中非常重要的偏依赖图(同时伴随个体条件期望曲线),代码如下: 

pdpVars(data = Boston,
        fit = rf_model,
        response = "medv",
        vars = colnames(VIVI_rf)[1:5],
        nIce = 80)

其中,前面三行分别为数据集,模型,以及因变量;vars = colnames(VIVI_rf)[1:5] 提取了VIVI_rf矩阵的前面五个变量;nIce = 80指定了个体条件期望曲线的个数。

在上图中,黑色的线条指代偏依赖图,而彩色的线条指代个体条件期望曲线。从上图的结果大致可以判断lstat以及rm对因变量有较大的影响。 

下一步,还可以画出偏依赖配对图,将使用到pdpPairs()函数,代码如下: 

pdpPairs(data = Boston,
         fit = rf_model,
         response = "medv",
         nmax = 500,
         gridSize = 10,
         vars = colnames(VIVI_rf)[1:5],
         nIce = 80)

上图的对角线展示了单变量的偏依赖图(以及个体条件期望曲线),对角线上方展示了双变量的偏依赖图;而对角线下方展示变量原始数据的散点图。

好啦,今天的内容就到这里。如果有帮助,记得分享给需要的人


参考文献

[1] vivid: An R package for Variable Importance and Variable Interactions Displays for Machine Learning Models

公众号的线上课程
1. 《R语言和统计新手课程》
2. 《回归:从入门到进阶》
通过公众号菜单栏--线上课程--新手课程/回归课程即可到达相关链接。

统计咨询
《服务介绍和经典合作案例》

公众号核心成员的成果发表
《SCI医学1区影响因子9分论文》

公众号核心成员担任SCI杂志Associate Editor!
《JAD杂志Associate editor》
《Frontiers in Neuroscience, Frontiers in Neurology and Frontiers in Psychiatry杂志的神经退行性病变板块》


▌本文由R语言和统计首发
▌课程相关咨询可添加R师妹微信: kefu_rstats
▌编辑:June
▌邮箱:contact@rstats.cn
▌网站:www.rstats.cn
我们致力于让R语言和统计变得简单!



R语言和统计
我们定期更新与R有关的内容,比如R编程基础,作图,实用R包的解读,统计学基础知识,前沿的统计方法,机器学习等等。
 最新文章