You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中将不同mtry值的随机森林迭代MSE值存入数据框?

随机森林不同mtry值的MSE存储与可视化方案

1. 准备模拟数据

先构建一份回归场景的模拟数据集,和你的需求匹配:

# 加载依赖包
library(randomForest)
library(ggplot2)

# 生成可复现的模拟数据
set.seed(123)
x <- matrix(rnorm(1000*10), ncol=10)
y <- rowSums(x[,1:3]) + rnorm(1000)
df <- data.frame(y, x)

2. 批量计算不同mtry的MSE并存储到数据框

你可以选择用袋外(OOB) MSE(随机森林自带的无额外数据集的评估指标),或者用独立测试集的MSE,两种方案都给你:

方案1:用OOB MSE

# 定义要测试的mtry范围(这里特征数是10,所以mtry从1到10)
mtry_list <- 1:(ncol(df)-1)

# 预先初始化结果数据框(比循环rbind效率更高)
mse_df <- data.frame(
  mtry = mtry_list,
  oob_mse = numeric(length(mtry_list))
)

# 循环训练模型并提取MSE
for (i in seq_along(mtry_list)) {
  m <- mtry_list[i]
  rf_model <- randomForest(y ~ ., data = df, mtry = m, ntree = 500)
  # 取最后一棵树对应的OOB MSE(即最终稳定的误差值)
  mse_df$oob_mse[i] <- rf_model$mse[length(rf_model$mse)]
}

# 查看结果
print(mse_df)

方案2:用独立测试集MSE

如果需要更严谨的模型评估,可以拆分训练/测试集:

# 拆分数据集
set.seed(456)
train_idx <- sample(1:nrow(df), 0.7*nrow(df))
train_data <- df[train_idx,]
test_data <- df[-train_idx,]

# 初始化结果数据框
test_mse_df <- data.frame(
  mtry = mtry_list,
  test_mse = numeric(length(mtry_list))
)

# 循环计算测试集MSE
for (i in seq_along(mtry_list)) {
  m <- mtry_list[i]
  rf_model <- randomForest(y ~ ., data = train_data, mtry = m, ntree = 500)
  test_pred <- predict(rf_model, newdata = test_data)
  test_mse_df$test_mse[i] <- mean((test_pred - test_data$y)^2)
}

# 查看结果
print(test_mse_df)

3. 绘制MSE可视化图表

用ggplot2快速生成折线图,直观观察mtry对MSE的影响:

# OOB MSE可视化
ggplot(mse_df, aes(x = mtry, y = oob_mse)) +
  geom_line(color = "#2E86AB", linewidth = 1) +
  geom_point(size = 2, color = "#F24C00") +
  labs(title = "随机森林OOB MSE随mtry的变化",
       x = "mtry值",
       y = "袋外均方误差") +
  theme_minimal()

# 测试集MSE可视化
ggplot(test_mse_df, aes(x = mtry, y = test_mse)) +
  geom_line(color = "#00A170", linewidth = 1) +
  geom_point(size = 2, color = "#FF7F11") +
  labs(title = "随机森林测试集MSE随mtry的变化",
       x = "mtry值",
       y = "测试集均方误差") +
  theme_minimal()

关键提示

  • 预先初始化数据框比循环用rbind拼接更高效,尤其是当mtry测试数量较多时。
  • 固定set.seed可以保证每次运行结果一致,方便调试和对比。
  • 如果是分类任务,只需把MSE换成分类误差(rf_model$err.rate[length(rf_model$err.rate),1])即可。

内容的提问来源于stack exchange,提问作者shollaback

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:52:19