Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在R和sklearn随机森林回归中,特征重要性结果不同_Python_R_Scikit Learn_Regression_Random Forest - Fatal编程技术网

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

Python 在R和sklearn随机森林回归中,特征重要性结果不同,python,r,scikit-learn,regression,random-forest,Python,R,Scikit Learn,Regression,Random Forest,我正在处理一个回归问题,并且一直在使用这个包和python估计器 R包可以通过两种不同的方式计算特征重要性得分: 第一个度量是从排列OOB数据计算出来的:对于每棵树,数据包外部分的预测误差为 记录(分类的错误率,回归的MSE)。然后 在排列每个预测变量后,也会执行相同的操作。区别 然后在所有树上取两者之间的平均值,并通过 差异的标准偏差 第二个度量是在所有树上求平均值,从变量上拆分节点杂质的总减少量。对于 分类时,节点杂质由基尼指数测量。对于 回归,通过残差平方和(RSS)测量 而sklea

我正在处理一个回归问题,并且一直在使用这个包和python估计器

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

  • 第一个度量是从排列OOB数据计算出来的:对于每棵树,数据包外部分的预测误差为 记录(分类的错误率,回归的MSE)。然后 在排列每个预测变量后,也会执行相同的操作。区别 然后在所有树上取两者之间的平均值,并通过 差异的标准偏差

  • 第二个度量是在所有树上求平均值,从变量上拆分节点杂质的总减少量。对于 分类时,节点杂质由基尼指数测量。对于 回归,通过残差平方和(RSS)测量

  • 而sklearn只采用后一种方式()

    我对比较两种实现中的方法#2很感兴趣,因此我做了以下工作:

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

    此外,当我使用最佳X特性时,R选择的特性在保持样本集上的性能要比sklearn中的特性好得多

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

    更新 根据关于使用sklearn中的基尼指数计算特征重要性的评论,随机森林回归的源代码显示

    因此,看起来R使用RSS,sklearn使用MSE,即:


    这可能是造成差异的原因吗?

    您是否尝试过增加两个脚本的iTrantions数?没有任何区别:(R random forest的文档说明:对于分类,节点杂质是通过基尼指数测量的。对于回归,它是通过残差平方和测量的。当您进行回归时,可能这就是差异?在scikit学习文档中,仅提到基尼标准来测量杂质。我发现您的R代码<代码>random forest(X~,y,ntree=tree\u count,…)奇怪。如果
    X
    数据帧不包含响应,则需要
    randomForest(X,y,ntree=tree\u count,…)
    而不使用公式。如果
    X
    包含响应,则只需要公式接口
    randomForest(y~,data=X,ntree=tree\u count,…)
    按照您的代码,我不确定您是否适合。您能检查一下吗?确实,您是对的;我在清理用于发布的代码时犯了一个错误-我已对其进行了更新,以反映我实际计算FIS的正确方式
    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]),]
    
    # 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