在scikitlearn中实现随机森林特征重要性评分

2024-09-30 14:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在sklearn中实现R的随机森林回归模型的特征重要性评分方法;根据R的文档:

The first measure is computed from permuting OOB data: For each tree, the prediction error on the out-of-bag portion of the data is recorded (error rate for classification, MSE for regression). Then the same is done after permuting each predictor variable. The difference between the two are then averaged over all trees, and normalized by the standard deviation of the differences. If the standard deviation of the differences is equal to 0 for a variable, the division is not done (but the average is almost always equal to 0 in that case).

因此,如果我理解正确,我需要能够为每个树中的OOB样本置换每个预测变量(特征)。在

我知道我可以用这样的方法访问经过训练的森林中的每一棵树

numberTrees = 100
clf = RandomForestRegressor(n_estimators=numberTrees)
clf.fit(X,Y)
for tree in clf.estimators_:
    do something

有没有得到每棵树的OOB样本列表?也许我可以使用每棵树的random_state来导出OOB示例列表?在


Tags: ofthe方法treefordatais森林
1条回答
网友
1楼 · 发布于 2024-09-30 14:29:10

虽然R使用OOB样本,但我发现通过使用所有的训练样本,我在scikit中得到了类似的结果。我正在做以下工作:

# permute training data and score against its own model  
epoch = 3
seeds = range(epoch)


scores = defaultdict(list) # {feature: change in R^2}

# repeat process several times and then average and then average the score for each feature
for j in xrange(epoch):
    clf = RandomForestRegressor(n_jobs = -1, n_estimators = trees, random_state = seeds[j],
                               max_features = num_features, min_samples_leaf = leaf)

    clf = clf.fit(X_train, y_train)
    acc = clf.score(X_train, y_train)    

    print 'Epoch', j
    # for each feature, permute its values and check the resulting score
    for i, col in enumerate(X_train.columns):
        if i % 200 == 0: print "- feature %s of %s permuted" %(i, X_train.shape[1])
        X_train_copy = X_train.copy()
        X_train_copy[col] = np.random.permutation(X_train[col])
        shuff_acc = clf.score(X_train_copy, y_train)
        scores[col].append((acc-shuff_acc)/acc)

# get mean across epochs
scores_mean = {k: np.mean(v) for k, v in scores.iteritems()}

# sort scores (best first)
scores_sorted = pd.DataFrame.from_dict(scores_mean, orient='index').sort(0, ascending = False)

相关问题 更多 >