R 和 Python 中随机森林回归的不同结果
Posted
技术标签:
【中文标题】R 和 Python 中随机森林回归的不同结果【英文标题】:different results for Random Forest Regression in R and Python 【发布时间】:2021-12-31 14:10:51 【问题描述】:我使用相同的数据在 R 和 Python 中进行随机森林回归,但我得到的 R2 值非常不同。我知道超参数可能是这背后的一个原因,但我认为它不会导致 R2 分数几乎减半。我正在使用以下代码并获得相应的结果。
在 Python 中 -
X = data.drop(['response'],axis=1)
y = data['response']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.05, random_state = 42)
rdf = RandomForestRegressor(n_estimators=500,oob_score=True)
rdf.fit(X_train, y_train)
print("Random Forest Model Score (on Train)" , ":" , rdf.score(X_train, y_train)*100 , "," ,
"Random Forest Model Score (on Test)" ,":" , rdf.score(X_test, y_test)*100)
y_predicted = rdf.predict(X_train)
y_test_predicted = rdf.predict(X_test)
print("Training RMSE", ":", rmse(y_train, y_predicted),
"Testing RMSE", ":", rmse(y_test, y_test_predicted))
>Random Forest Model Score (on Train) : 92.2312123 , Random Forest Model Score (on Test) : 78.1812321
>Training RMSE : 5.606443558164292e-06 Testing RMSE : 9.59221499904858e-06
在 R 中 -
> rows <- sample(0.95*nrow(data))
> train_random <- data[rows,]
> test_random <- data[-rows,]
> rf_model <- randomForest(response ~ . ,
data = train_random,
keep.forest=TRUE,
importance=TRUE
)
> rf_model
Call:
randomForest(formula = response ~ ., data = train_random, keep.forest = TRUE, importance = TRUE)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 6
Mean of squared residuals: 1.437236e-06
% Var explained: 42.05
> pred_train <- predict(rf_model,train_random)
> pred_test <- predict(rf_model,test_random)
> R2_Score(pred_train, train_random$response)
[1] 0.9014311
> R2_Score(pred_test, test_random$response)
[1] 0.3616823
我知道测试列车拆分不会导致相同的拆分,但为什么我会得到如此明显不同的 R2 值以及在 R 中执行相同随机森林的方法是什么。我尝试使用相同的超参数我是从 Python 获得的,但它并不能帮助我在 R 中获得相同的 R2 值。有人可以帮我吗?
【问题讨论】:
有一个随机分量。您是否尝试过使用不同的随机种子多次运行 R 和 Python? 您在随机森林中有一个随机组件。正如我从您的代码中可以看出的那样,您的 train:test 拆分中也有一个随机组件。尝试将脚本(数据拆分)重复 100 次,然后查看 R2 的分布情况。 (我认为在这里设置种子对您没有帮助) 我同意你所说的,但它有多大不同。 R2 的输出几乎是我在 Python 中获得的一半。我已经多次运行这两种代码,但两种情况下的 R2 都保持在相同的水平。 参数也不一样。您唯一对齐的是 500 棵树。树的深度、叶子的大小…… 我已经在 Python 中获取了随机森林模型的参数,并在 R 中使用了它们,但这并没有帮助。您能帮我将参数从 Python 映射到 R 吗? 【参考方案1】:正如其他人评论的那样,随机森林有一个随机组件,您可能已经知道了。
但随机森林也使用自举,每次运行时都会改变结果。我已经包含了进一步研究的链接。希望这有助于引导您找到想要的答案。
https://stats.stackexchange.com/questions/120446/different-results-from-several-passes-of-random-forest-on-same-dataset
【讨论】:
我确实理解您在这里的意思,但考虑到这一点并不能解释两种语言中 R2 值几乎减半的原因。如果有人可以分享在 R 和 Python 中执行的随机森林的示例或演示,并得出或多或少相似的 R2 值,那将很有帮助。请注意,我说的是相似而不是相同,因为我在这两种情况下都考虑了测试列车分裂的随机性。以上是关于R 和 Python 中随机森林回归的不同结果的主要内容,如果未能解决你的问题,请参考以下文章