解释随机森林中的变量或特征重要性

数据挖掘 随机森林 预测重要性
2021-09-22 07:01:52

我目前正在使用随机森林来训练一些模型并解释获得的结果。

我想进一步分析的特征之一是可变重要性。问题是我不熟悉如何对我得到的结果进行适当的分析。假设我有这张桌子:

| Predictor  | Importance |
----------------------------
|   var_1    |   num_1    |
...
|   var_n    |   num_n    |

除了说哪个变量比另一个变量更重要之外,可以对从表中获得的值进行什么适当的分析?

有人建议我使用变量排名或使用累积密度函数,但我不知道如何开始。

1个回答

我不愿意单独对表格进行过多分析,因为变量重要性可能会产生误导,但您可以做一些事情。这个想法是通过模拟来学习特征重要性的统计属性,然后确定观察到的重要性对于每个特征有多“显着”。也就是说,一个特征的重要性是否纯粹是偶然出现的,还是该特征具有合理的预测性?

要做到这一点,你需要你的算法的目标 是的并对其值进行洗牌,这样就无法进行真正的预测,并且您的所有特征实际上都是噪声。然后适合您选择的模型次,观察每次迭代的特征的重要性,并记录每个迭代的“零分布”。这是当该特征没有预测能力时该特征的重要性分布。

获得这些分布后,您可以比较您实际观察到的重要性而无需改组 是的并开始对哪些特征是真正具有预测性的,哪些不是。也就是说,给定特征的重要性是否落入其零分布的较大分位数(例如第 99 个百分位数)?在这种情况下,您可以得出结论,它包含关于是的. 另一方面,如果重要性在分布的中间,那么您可以开始假设该特征没有用,并且可能开始基于这些理由进行特征选择。

这是一个你可以在 Python 中进行的模拟来尝试这个想法。首先,我们在线性回归模型下生成数据,其中 50 个特征中只有 3 个是可预测的,然后将随机森林模型拟合到数据中。现在我们有了特征重要性,我们在是的并记录结果。然后我们所要做的就是使用辅助函数将我们看到的实际重要性与其空分布进行比较dist_func,该函数计算空重要性的比例小于观察到的比例。这些数字本质上是p- 经典统计意义上的值(只有倒置,所以更高意味着更好)并且比 . 报告的重要性指标更容易解释RandomForestRegressor或者,您可以简单地绘制空分布并查看实际重要性值落在哪里。在这种情况下,通过查看原始重要性本身,很明显只有前三个特征很重要。

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor

# number of samples
n = 100
# number of features
p = 50
# monte carlo sample size
m = 100

# simulate data under a linear regression model
# the first three coefficients are one and the rest zero
beta = np.ones(p)
beta[3:] = 0
X = pd.DataFrame(np.random.normal(size=(n, p)), 
                 columns=["x" + str(i+1) for i in range(p)])
y = np.dot(X, beta) + np.random.randn(n)

# fit a random forest regression to the data
reg = RandomForestRegressor()
reg.fit(X, y)

# get the importances
var_imp = (pd.DataFrame({"feature": X.columns, 
                        "beta": beta, 
                       "importance": reg.feature_importances_}).
           sort_values(by="importance", ascending=False).
           reset_index(drop=True))

# fit many regressions on shuffled versions of y
sim_imp = pd.DataFrame({c: np.empty(m) for c in X.columns})

for i in range(m):
    reg.fit(X, np.random.permutation(y))
    sim_imp.iloc[i] = reg.feature_importances_

# null distribution function
def dist_func(var, x):
    return np.mean(sim_imp[var] < x)