特征重要性结果在R和sklearn随机森林回归中有所不同

时间:2015-08-18 22:00:16

标签: python r scikit-learn regression random-forest

我正在研究回归问题,并且一直在使用R randomForest包以及python sklearn random forest regression估算器。

R包可以通过两种不同的方式计算特征重要性分数:

  
      
  1. 第一个度量是根据置换OOB数据计算得出的:对于每个树,数据的袋外部分的预测误差是   记录(分类错误率,回归MSE)。那么   在置换每个预测变量后进行相同的操作。区别   然后在两者之间对所有树进行平均,并将其归一化   差异的标准差。

  2.   
  3. 第二个指标是变量上的节点杂质总量减少,平均所有树木。对于   分类,节点杂质由基尼指数测量。对于   回归,用剩余的平方和(RSS)来衡量。

  4.   

而sklearn仅以后一种方式(see here for details)完成。

我对两种方法中的方法#2进行比较感兴趣,所以我做了以下工作:

- [R

iteration_count <- 3
seeds <- seq(1,iteration_count,1)
tree_count <- 500

for(i in 1:iteration_count) {
  set.seed(seeds[[i]])
  rfmodels[[i]]<- randomForest(y ~ .,X,ntree=tree_count,importance=TRUE,na.action=na.omit)
}

# convert all iterations into matrix form
imp_score_matrix <- do.call(cbind, lapply(models_selected, function(x) { importance(x, scale=T, type=1)[,1] }))

# Calculate mean and s.d. for importance ranking of each feature based on a matrix of feature importance scores
imp_score_stats <- (cbind(rowMeans(imp_score_matrix),rowSds(imp_score_matrix)))

# Order the matrix so that the features are ranked by mean (most important features will be in the last rows)
ordered_imp_score_stats <- imp_score_stats[order(imp_score_stats[,1]),]

sklearn

# get FIS through mean decrease in impurity (default method for sklearn)
num_iter = 3 # number of times to generate FIS; will average over these scores
trees = 500
seeds = [l for l in range(num_iter)]
FIS = []

# R implementation of RF settings - https://cran.r-project.org/web/packages/randomForest/randomForest.pdf
num_features = 1/3.0 # see mtry
leaf = 5 # see nodesize

FIS_map = {v:k for k,v in enumerate(X.columns.values)} # {feature: i}
for i in range(num_iter):
    print "Iteration", i
    clf = RandomForestRegressor(n_jobs = -1, n_estimators = trees, random_state = seeds[i],
                               max_features = num_features, min_samples_leaf = leaf)
    clf = clf.fit(X,y)
    FIS.append(clf.feature_importances_)

FIS_stats = pd.DataFrame(FIS).describe().T # will have columns mean, std, etc
FIS_stats = FIS_stats.sort("mean", ascending = False) # most important features on top
FIS_stats['OTU'] = FIS_map # add the OTU ID
FIS_stats = FIS_stats.set_index('OTU')
FIS_stats = FIS_stats[FIS_stats['mean'] > 0] # remove those OTU features with no mean importance 

正如您所看到的,我已经尝试调整sklearn中的默认设置以匹配R中使用的设置。问题是,我为每个实现获得了不同的结果。现在,我知道随机森林有各种不确定的维度,所以我不希望这些特征的排名完全相同;但是,我发现重要的功能几乎没有重叠。

此外,当我使用最好的 X 功能时,R选择的功能比保留样本集中的sklearn功能要好得多。

我做错了吗?什么可以解释由此产生的差异?

更新

根据关于使用sklearn中的Gini索引计算的要素重要性的注释,随机森林回归的源代码显示MSE is used to calculate impurity

所以,看起来R使用RSS而sklearn使用MSE,relationship being

enter image description here

这可以解释差异吗?

0 个答案:

没有答案