【问题标题】:Random Forest discrepancy between R and Matlab & PythonR与Matlab和Python之间的随机森林差异
【发布时间】:2016-04-20 03:45:47
【问题描述】:

我将三种不同编程语言中的随机森林算法应用于同一个伪样本数据集(1000 个 obs,二进制 1/0 因变量,10 个数值解释变量):

  1. Matlab 2015a(与 2012a 相同)使用 “Treebagger” 命令(统计和机器学习工具箱的一部分)
  2. R 使用 "randomForest" 包:https://cran.r-project.org/web/packages/randomForest/index.html
  3. Python 使用来自 sklearn.ensemble 的 "RandomForestClassifier"http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

我还尝试在编程语言中保持所有模型参数相同(树的数量、整个样本的引导抽样、每次拆分时随机抽样作为候选者的变量数量、衡量拆分质量的标准) .

虽然 Matlab 和 Python 产生基本相同的结果(即概率),但 R 结果却大不相同。

一方面由 R 产生的结果与另一方面由 Matlab 和 Python 产生的结果之间存在差异的可能原因是什么?

我猜有一些默认模型参数在 R 中有所不同,我不知道,或者在底层 randomForest 包中硬编码。

我运行的具体代码如下:

Matlab:

 b = TreeBagger(1000,X,Y, 'FBoot',1, 'NVarToSample',4, 'MinLeaf',1, 'Method', 'classification','Splitcriterion', 'gdi')
 [~,scores,~] = predict(b,X);

Python:

 clf = RandomForestClassifier(n_estimators=1000, max_features=4, bootstrap=True)
 scores_fit = clf.fit(X, Y)
 scores = pd.DataFrame(clf.predict_proba(X))

R:

 results.rf <- randomForest(X,Y,  ntree=1000, type = "classification", sampsize = length(Y),replace=TRUE,mtry=4)
 scores <- predict(results.rf, type="prob",
    norm.votes=FALSE, predict.all=FALSE, proximity=FALSE, nodes=FALSE)

【问题讨论】:

    标签: python r matlab machine-learning random-forest


    【解决方案1】:

    当您在 R 中的 randomForest 对象上调用 predict 而不提供数据集时,它会返回袋外预测。在您的其他方法中,您将再次传入训练数据。我怀疑如果你在 R 版本中这样做,你的概率会相似:

     scores <- predict(results.rf, X, type="prob",
        norm.votes=FALSE, predict.all=FALSE, proximity=FALSE, nodes=FALSE)
    

    另请注意,如果您想要无偏概率,返回 OOB 预测的 R 方法是对训练数据进行预测时的最佳方法。

    【讨论】:

    • 非常感谢,我实施了您建议的解决方案,结果显着改善。
    • 准确地说:所有三个软件包产生基本相同的结果。无论如何,我有一个快速的后续问题:任何人都可以解释 R 和 Python 之间在计算时间上的巨大差异,一方面是即时获得结果,另一方面是 Matlab,其中模型估计和预测需要几个每个秒?
    • R 实现是用 Fortran 编写的。我相信,scikit 版本是 Cython。我怀疑Matlab版本是纯Matlab?
    • @Zelazny7 - R 实现实际上是用 C 编写的(来源:github.com/cran/randomForest/tree/master/src),尽管它基于 Breiman/Cutler 的原始 Fortran 代码
    猜你喜欢
    • 2015-03-22
    • 2017-05-03
    • 2019-03-23
    • 2013-05-06
    • 2020-04-04
    • 2018-01-18
    • 2021-07-12
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多