我正在处理一个包含超过100个特征的大型数据集(这些特征都是相关的,因为它们已经过筛选;原始数据集有超过500个特征)。我使用caret包中的train()函数和“ranger”方法创建了一个随机森林模型。
这里有一个问题:如何提取所有变量的重要性,而不是只提取前20个最重要的变量?varImp()函数默认只输出前20个变量的重要性。
以下是一些示例代码(不包括训练集,因为它非常大):
library(caret)rforest_model <- train(target_variable ~ ., data = train_data_set, method = "ranger", importance = "impurity")
这是提取变量重要性的代码:
varImp(rforest_model)
回答:
varImp函数提取所有变量的重要性(即使这些变量未被模型使用),它只是打印出前20个变量。考虑以下示例:
library(mlbench) #for data setlibrary(caret)library(tidyverse)set.seed(998)data(Ionosphere)rforest_model <- train(y = Ionosphere$Class, x = Ionosphere[,1:34], method = "ranger", importance = "impurity")nrow(varImp(rforest_model)$importance) #34 variables extracted
让我们检查它们:
varImp(rforest_model)$importance %>% as.data.frame() %>% rownames_to_column() %>% arrange(Overall) %>% mutate(rowname = forcats::fct_inorder(rowname )) %>% ggplot()+ geom_col(aes(x = rowname, y = Overall))+ coord_flip()+ theme_bw()
请注意,在这个数据集中,V2是一个零方差特征,因此它的重要性为0,并且完全未被模型使用。