我目前正在查看患者数据并尝试使用它来预测变量在预测对药物的反应中的重要性。我没有很多患者,但有很多变量,我知道这些变量不太理想。
我已经形成了一个 svm 集成和一个包含所有变量的随机森林模型。我有第二个数据集,我试图用它来测试我的模型的有效性以及每个变量在预测中的重要性。将与特定变量对应的所有值都设置为 0 是否有效,或者我应该对列中的值进行洗牌?
我目前正在查看患者数据并尝试使用它来预测变量在预测对药物的反应中的重要性。我没有很多患者,但有很多变量,我知道这些变量不太理想。
我已经形成了一个 svm 集成和一个包含所有变量的随机森林模型。我有第二个数据集,我试图用它来测试我的模型的有效性以及每个变量在预测中的重要性。将与特定变量对应的所有值都设置为 0 是否有效,或者我应该对列中的值进行洗牌?
我在 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 变量的套索系数大于线性变量。