测试预测中的变量重要性

机器算法验证 机器学习 支持向量机 随机森林
2022-04-13 11:06:09

我目前正在查看患者数据并尝试使用它来预测变量在预测对药物的反应中的重要性。我没有很多患者,但有很多变量,我知道这些变量不太理想。

我已经形成了一个 svm 集成和一个包含所有变量的随机森林模型。我有第二个数据集,我试图用它来测试我的模型的有效性以及每个变量在预测中的重要性。将与特定变量对应的所有值都设置为 0 是否有效,或者我应该对列中的值进行洗牌?

1个回答

我在 R 中多次使用 randomForest 包,并且有一些函数可以测量变量的重要性,例如importance() 和 varImpPlot()。据我所知,varImpPlot 可视化每个预测变量对变量在减少误差测量中的贡献的重要性(例如回归的均方误差、分类的基尼指数等)

我通常以一种非常简单的方式衡量变量重要性的方法是,我估计线性回归和套索回归,然后查看系数缩小了多少。

library(MASS)
library(randomForest)
library(glmnet)
data(Boston)

# Random forest (based on the lab example from the book "An Introduction to Statistical Learning")
rf.boston <- randomForest(medv ~., data = Boston, mtry = 13, ntree = 25, importance = TRUE)
importance(rf.boston)  
            %IncMSE IncNodePurity
 crim     2.80848132    1340.74773
 zn       2.12135233      34.74243
 indus    1.49676063     270.12398
 chas     0.06577971      31.42226
 nox      7.42985606    1381.58615
 rm      13.41323143   18128.73241
 age      6.28896854     487.95644
 dis      7.08361676    2621.61526
 rad      1.71445398     128.88846
 tax      6.48150760     557.31305
 ptratio  5.24860362     660.97934
 black    2.00139088     562.16876
 lstat    9.26159315   16553.01919

varImpPlot(rf.boston)

在此处输入图像描述

# Linear model
lm.boston <- lm(formula = medv~., data = Boston)

# Lasso 
optim.lambda <- cv.glmnet(x = as.matrix(Boston[, -14]), y = as.vector(Boston[, 14]))$lambda.1se

lasso.boston<- glmnet(x = as.matrix(Boston[, -14]), y = as.vector(Boston[, 14]), 
               lambda = optim.lambda)


sum.abs <- abs(coef(lasso.boston)[-1])/ abs(coef(lm.boston)[-1])
sum.abs <- sum.abs[order(sum.abs, decreasing = F)]
barplot(sum.abs, horiz = T, col = "red", las=2) 

在此处输入图像描述

par(mfrow = c(2,1))
rf.boston <- randomForest(medv ~., data = Boston, mtry = 13, ntree = 25, importance = FALSE)
varImpPlot(rf.boston, main = "Variable importance (Random forest)")
barplot(sum.abs, horiz = T, col = "red", las=2, main = "Variable importance (Lasso)")

并对两者进行快速比较: 在此处输入图像描述

据我了解,当预测变量相关时,套索方法可能会有点问题。您可以看到 rm 变量的套索系数大于线性变量。