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

Sklearn与R的RandomForest回归结果差异显著,求原因解析

随机森林回归:Python sklearn与R randomForest结果差异原因分析

问题背景

同时使用Python sklearn的RandomForestRegressor和R语言randomForest包的randomForest()函数执行随机森林回归任务,在mtcars数据集及数百行自定义数据集上测试后,均发现Python端模型结果远优于R端,R²差异甚至超过0.3。

测试代码与结果

Python代码

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn import metrics
import math

inputfile = r'/PathToFile/mtcars.csv'
myData = pd.read_csv(inputfile)

# 获取特征与标签
df_x = myData[["cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb"]]
df_reference = myData['mpg']

np.random.seed(1)
clf = RandomForestRegressor(n_estimators=1000, max_features=7)

# 训练模型
clf.fit(df_x, df_reference)
    
# 生成预测
df_predicted = clf.predict(df_x)

R2 = metrics.r2_score(df_reference, df_predicted)
MAE = metrics.mean_absolute_error(df_reference, df_predicted)
MSE = metrics.mean_squared_error(df_reference, df_predicted)
RMSE = math.sqrt(MSE)

print(R2);print(MAE);print(RMSE)

Python结果

r2 = 0.97
MAE = 0.68
RMSE = 0.85

R代码

library(Metrics)
library(randomForest)
rm(list=ls())

set.seed(1)
data(mtcars)
rf.fit <- randomForest(mpg ~ ., data=mtcars, ntree=1000, mtry=7)

summary(lm(rf.fit$predicted~mtcars$mpg))$r.squared
mae(mtcars$mpg,rf.fit$predicted)
rmse(mtcars$mpg,rf.fit$predicted)

R结果

r2 = 0.84
MAE = 1.84
RMSE = 2.32

差异原因分析

1. 随机种子的正确传递问题

  • Python中np.random.seed(1)仅设置NumPy全局随机种子,但RandomForestRegressor自身的随机数生成器并不依赖这个全局种子,需要通过random_state参数显式指定。原代码未设置random_state=1,导致模型训练的随机性无法和R端对齐,可能恰好出现拟合程度更高的情况。
  • R中set.seed(1)是全局生效的,randomForest会直接使用该种子保证结果可复现。

2. 模型默认参数的隐性差异

这是核心原因:

  • 叶节点最小样本数:sklearn的RandomForestRegressor默认min_samples_leaf=1(回归树允许叶节点仅包含1个样本),而R的randomForest回归默认nodesize=5(每个叶节点至少要有5个样本)。在mtcars这种小数据集(仅32个样本)中,sklearn的树可以无限生长直至完全拟合训练数据,出现严重过拟合;而R的模型被限制了树的复杂度,拟合程度更低。
  • 树的分裂停止条件:sklearn默认min_samples_split=2(节点样本数≥2就可分裂),R的randomForest默认分裂逻辑也会受nodesize限制,进一步约束了树的深度。

3. 验证与修复方案

将Python端模型参数调整为与R端对齐,即可得到接近的结果:

clf = RandomForestRegressor(
    n_estimators=1000,
    max_features=7,
    random_state=1,  # 对齐R的随机种子
    min_samples_leaf=5  # 对齐R的nodesize参数
)

调整后重新训练,Python端的R²、MAE、RMSE会与R端结果基本一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:15:34