【问题标题】:Random Forest Libraries: Different Results in R and Python随机森林库:R 和 Python 中的不同结果
【发布时间】:2018-04-12 20:20:55
【问题描述】:

下面的代码在 R 和 python 中训练一个随机森林模型。如您所见,R (1-0.27=0.73) 的准确度比 Python (0.69) 好。此外,特征的重要性在 R 和 Python 中是不同的。

[编辑] 有没有办法在 python 中复制 R 结果,或者有些事情是失控的?一些可调参数在两个库中是不同的,因此很难进行匹配。

还有其他人从 Pyhton 和 R 的随机森林中得到不同的结果吗?有什么区别?

R代码:

library(randomForest)
mydata=read.csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
mydata$admit=factor(mydata$admit)
rf = randomForest(admit~gre+gpa+rank, mydata, ntree=1000, 
importance=TRUE, replace=TRUE)
print(rf)
print(rf$importance)   

输出:

 Call:
 randomForest(formula = admit ~ gre + gpa + rank, data = mydata,      
 ntree = 1000, importance = TRUE, replace = TRUE) 
           Type of random forest: classification
                 Number of trees: 1000
 No. of variables tried at each split: 1

    OOB estimate of  error rate: 28.5%
Confusion matrix:
   0  1 class.error
0 254 19  0.06959707
1  95 32  0.74803150
          0          1 MeanDecreaseAccuracy MeanDecreaseGini
gre  0.01741400 0.01209596           0.01566284         31.45256
gpa  0.02565179 0.02467486           0.02527394         43.32355
rank 0.02570388 0.04844323           0.03283692         18.15780

Python 代码

from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix

mydata=pd.read_csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
train_data = mydata[ ["gre","gpa","rank"]]
train_label = mydata.admit

rfs = RandomForestClassifier(n_estimators=1000,oob_score=True,bootstrap=True)    
rfs.fit(train_data,train_label)
print(rfs.oob_score_)

pred=np.round(rfs.oob_decision_function_[:,1])
real=train_label
confusion_matrix(real, pred)
rfs.feature_importances_

输出:

RandomForestClassifier(bootstrap=True, 
class_weight=None, criterion='gini',
        max_depth=None, max_features='auto', max_leaf_nodes=None,
        min_impurity_decrease=0.0, min_impurity_split=None,
        min_samples_leaf=1, min_samples_split=2,
        min_weight_fraction_leaf=0.0, n_estimators=1000, n_jobs=1,
        oob_score=True, random_state=None, verbose=0, 
warm_start=False)
0.6925
>>> >>> >>> array([[229,  44],
                  [ 79,  48]])
array([ 0.34573918,  0.53783772,  0.11642309])

我在Difference between random forest implementation 发现了一个类似的问题,它链接到不同的基准...

【问题讨论】:

  • 所以你的问题是......?你想知道为什么会有差异吗?
  • 看起来 randomForest 默认值在这个特定数据上比 sklearn 默认值更好。我不会读到比这更多的内容。

标签: python r random-forest


【解决方案1】:

训练随机森林模型(与许多机器学习模型一样)的过程高度依赖于模型的超参数值,以及会影响训练期间做出的随机选择的初始随机种子。

我会假设在您的情况下,python 和 R 库中选择的默认超参数是不同的,从而导致模型的不同行为。您可以通过手动将所有超参数设置为相等来测试行为之间是否真的存在差异。我猜想这之后的任何剩余差异可能是由于数字问题,或者是偶然的(因为训练中的随机性,在相同数据上训练的不同随机森林永远不会相同)。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2016-08-10
    • 2017-06-09
    • 2021-03-25
    • 2021-05-29
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多