基于ranger包实现随机森林回归的Drop-column特征重要性方法
使用ranger包实现Drop-column特征重要性并构建最终模型
一、核心逻辑回顾
Drop-column重要性的核心思路:先训练基线模型并获取基线性能分数,随后依次删除单个特征、重新训练模型并计算对应性能,某特征的重要性为基线分数与删除该特征后模型分数的差值(差值越大,说明该特征对模型性能的贡献越强)。
二、具体实现步骤
1. 训练基线模型并计算基线性能
先基于完整特征训练基线模型,再计算其在测试集上的性能(以下示例以分类任务的准确率为例,回归任务可替换为RMSE、R²等指标):
library(ranger) library(Metrics) # 设置随机种子保证结果可复现 set.seed(123) # 数据拆分(沿用你的示例) train.idx <- sample(nrow(iris), 2/3 * nrow(iris)) iris.train <- iris[train.idx, ] iris.test <- iris[-train.idx, ] # 训练基线随机森林模型 baseline_model <- ranger(Species ~ ., data = iris.train, num.trees = 101, seed = 123) # 计算基线测试集准确率 baseline_pred <- predict(baseline_model, data = iris.test)$predictions baseline_acc <- accuracy(iris.test$Species, baseline_pred) cat("基线模型测试集准确率:", baseline_acc, "\n")
2. 计算Drop-column特征重要性
遍历每个特征,删除后重新训练模型并计算性能,最终得到各特征的重要性值:
# 获取所有特征名(排除目标变量) feature_names <- setdiff(colnames(iris.train), "Species") drop_col_importance <- numeric(length(feature_names)) names(drop_col_importance) <- feature_names # 逐个删除特征计算重要性 for (feat in feature_names) { # 生成删除当前特征后的训练数据 train_data_drop <- iris.train[, !colnames(iris.train) %in% feat] # 训练模型 model_drop <- ranger(Species ~ ., data = train_data_drop, num.trees = 101, seed = 123) # 计算测试集性能(注意同步删除测试集对应特征) test_data_drop <- iris.test[, !colnames(iris.test) %in% feat] pred_drop <- predict(model_drop, data = test_data_drop)$predictions acc_drop <- accuracy(iris.test$Species, pred_drop) # 计算重要性:基线性能与删除特征后性能的差值 drop_col_importance[feat] <- baseline_acc - acc_drop } # 按重要性降序排序 drop_col_importance_sorted <- sort(drop_col_importance, decreasing = TRUE) print("Drop-column特征重要性(降序排列):") print(drop_col_importance_sorted)
3. 筛选重要变量并训练最终模型
根据重要性筛选目标特征(示例选择重要性大于0的特征,也可指定Top N数量),再用筛选后的特征训练最终模型:
# 筛选重要变量(示例规则:保留重要性大于0的特征) selected_features <- names(drop_col_importance_sorted[drop_col_importance_sorted > 0]) # 构建最终模型的公式 final_formula <- as.formula(paste("Species ~", paste(selected_features, collapse = " + "))) # 训练最终模型 final_model <- ranger(final_formula, data = iris.train[, c(selected_features, "Species")], num.trees = 101, seed = 123) # 输出筛选出的重要预测变量 cat("筛选出的重要预测变量:", paste(selected_features, collapse = ", "), "\n") # 可选:评估最终模型性能 final_pred <- predict(final_model, data = iris.test[, c(selected_features, "Species")])$predictions final_acc <- accuracy(iris.test$Species, final_pred) cat("最终模型测试集准确率:", final_acc, "\n")
三、回归任务适配说明
如果是回归任务(例如预测连续型变量Sepal.Length),只需调整3个关键点:
- 目标变量替换为连续型,公式改为
Sepal.Length ~ . - 性能指标替换为回归类指标,比如
rmse()或r2_score()(来自Metrics包) - 重要性计算逻辑调整为:删除特征后的RMSE - 基线RMSE(差值越大,说明该特征对降低预测误差的作用越强)
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

