随机森林图书馆:R和Python中的不同结果

时间:2017-10-31 15:37:30

标签: python r random-forest

下面的代码训练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找到了一个类似的问题,该问题链接到不同的基准......

1 个答案:

答案 0 :(得分:1)

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

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