随机森林库:R 和 Python 中的不同结果



下面的代码用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

蟒蛇代码

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])

我在随机森林实现之间的差异中发现了一个类似的问题,它链接到不同的基准......

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

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

最新更新