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
相关产品推荐
相关产品推荐

