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

相同数据集下R与Python随机森林回归结果差异大问题求助

R与Python随机森林回归结果差异过大的修复方案

核心差异原因

你当前的代码存在4个未对齐的关键实现细节,是导致R2差异悬殊的核心原因:

  • 数据集划分逻辑错误:R端rows <- sample(0.95*nrow(data))的写法仅会从1到0.95*nrow(data)的行号中采样,而非全局随机采样95%的样本作为训练集,和Python的train_test_split逻辑完全不一致,且未固定随机种子
  • 叶子节点最小样本数默认值不同:Python sklearn默认min_samples_leaf=1,R randomForest包回归任务默认nodesize=5,R端树的生长限制更严格,模型复杂度更低
  • 分裂候选特征数默认值不同:Python sklearn回归任务默认max_features=1/3 * 总特征数,R randomForest回归任务默认mtry=sqrt(总特征数),R端每轮分裂可选特征更少,单棵树的表达能力更弱
  • R2计算参数顺序可能倒置:多数R语言第三方包的R2计算函数参数顺序为(预测值, 真实值),和sklearn的(真实值, 预测值)顺序完全相反,会直接导致R2计算结果错误

对齐操作步骤

1. 修正数据集划分逻辑,固定随机种子

R端划分代码调整为和Python逻辑完全一致:

set.seed(42) # 对齐Python的random_state参数
train_idx <- sample(nrow(data), size = floor(0.95*nrow(data)), replace = FALSE)
train_random <- data[train_idx, ]
test_random <- data[-train_idx, ]

注意:需要确保两个语言加载的数据集行顺序、字段类型完全一致,无额外排序、缺失值处理差异

2. 对齐全部超参数训练模型

R端训练代码调整为:

library(randomForest)
set.seed(42) # 固定模型训练的随机种子
rf_model <- randomForest(
  response ~ .,
  data = train_random,
  ntree = 500, # 对齐Python的n_estimators
  mtry = floor((ncol(data)-1)/3), # 减去目标列后取1/3特征数,对齐max_features默认值
  nodesize = 1, # 对齐Python的min_samples_leaf默认值
  keep.forest = TRUE,
  importance = TRUE
)

3. 手动计算R2避免包逻辑差异

直接使用R2的标准公式手动计算,完全规避第三方包的参数顺序差异:

# 预测
pred_train <- predict(rf_model, train_random)
pred_test <- predict(rf_model, test_random)

# 手动计算R2
calc_r2 <- function(y_true, y_pred) {
  1 - sum((y_true - y_pred)^2) / sum((y_true - mean(y_true))^2)
}
r2_train <- calc_r2(train_random$response, pred_train)
r2_test <- calc_r2(test_random$response, pred_test)

完成以上操作后,两端的R2误差会缩小到1%以内的随机波动范围。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:04