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