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 中随机森林回归的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中执行随机森林/交叉验证

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

在 R 中使用随机森林预测的不同结果

GBDT和随机森林的区别

随机森林和GBDT进行比较

先马后看!详解线性回归朴素贝叶斯随机森林在R和Python中的实现应用!(附代码)