很难计算预测变量对 GAM 的相对重要性?

机器算法验证 回归 非线性回归 广义加法模型 重要性
2022-04-08 22:09:26

尽管对于(甚至)线性模型(一种可能的定义: lmg 方法)的“预测变量的相对重要性”没有达成一致,但如果我建立一个广义加法模型,我仍然想知道是否有一些可接受的方法来做到这一点.

这是一个很自然的问题,即哪个预测器更重要或更有用(定量地,例如使用百分比),不是吗?

我发现relaimpo包可以计算线性模型的几个相对重要性指标,但它不能处理 GAM 模型(见这里)。这是一个例子:

library(relaimpo)
library(mgcv)
gam1 <- gam(mpg ~ s(drat) + s(wt) + s(qsec), data = mtcars, method = "REML")
summary(gam1)

summary()结果中,我们可以通过 p 值看到哪个预测变量“显着”:

Approximate significance of smooth terms:
          edf Ref.df      F  p-value    
s(drat) 1.000  1.000  0.523 0.476069    
s(wt)   2.487  3.028 21.950 1.59e-08 ***
s(qsec) 1.000  1.000 15.241 0.000545 ***

但我们不知道它们的“相对重要性”,例如,我们能不能得到以下信息?

`wt` has a relative importance of 60%, 
`qsec` has a relative importance of 30%, 
`drat` has a relative importance of 10%. 

更糟糕的是,因为 GAM 没有真正的 R 平方,我想lmg方法不能应用。

1个回答

caret软件包提供了一个答案。使用默认值tuneGridand trainControl,

library(caret)
data("mtcars")
gam1 <- train(
  mpg ~ drat + wt + qsec, 
  data = mtcars, 
  method = "gam"
)

然后你就可以申请了varImp

varImp(gam1)
## gam variable importance
##      Overall
## wt     100.0
## qsec    26.4
## drat     0.0

对于您想要的百分比想法,您可以调整返回对象的大小:

library(dplyr)
x <- varImp(gam1)
x$importance %>%
  mutate(
    Variable = rownames(.), Overall = Overall / sum(Overall) * 100
  ) %>% 
  arrange(desc(Overall)) %>%
  select(Variable, Overall)
##   Variable Overall
## 1       wt   79.09
## 2     qsec   20.91
## 3     drat    0.00

因为默认不会调整样条曲线或自由度,您应该检查如何在caret包中执行这些操作。method = 'gam'调用mgcv包,但还有很多其他选项例如,如果您使用method = 'gamSpline',它将调整自由度,并给出不同的varImp结果。

但是,要警惕幕后caret所做的事情——如果预测变量中没有很多不同的值,它可能会将这个术语变成线性的。