繁体   English   中英

回归分析,例如量化随机森林中变量的重要性

[英]Regression like quantification of the importance of variables in random forest

是否有可能量化变量的重要性,以弄清观察结果落入一类的可能性。 类似于Logistic回归。

例如:如果我具有以下自变量1)一个人的猫数2)一个人的狗数3)一个人的鸡数

我的因变量是:一个人是否是PETA的一部分

是否可以说这样的话:“如果该人收养的猫多于其现有动物的范围,则其成为PETA的几率增加了0.12”。

我目前正在使用以下方法来实现此特定场景:1)使用训练数据构建随机森林模型2)预测客户落入某一特定类别(Peta与非Peta)的概率3)人为地增加猫的数量每个观察点拥有1的4)预测客户落入两个类别之一的新概率5)(4)的概率与(2)的概率之间的平均变化是一个人的概率平均增加已经收养了一只猫。

这有意义吗? 我没有想到的方法上有什么缺陷吗? 有没有更好的方法可以做到这一点?

如果您使用的是scikitlearn,则可以通过访问已拟合的RandomForestClassifier的feature_importance_属性轻松地做到这一点。 根据SciKitLearn:

用作树中决策节点的特征的相对等级(即深度)可用于评估该特征相对于目标变量的可预测性的相对重要性。 在树的顶部使用的特征有助于更大比例的输入样本的最终预测决策。 他们所贡献的样本的预期比例因此可以用作特征相对重要性的估计。 通过在几棵随机树上平均那些预期的活动率,可以减少这种估计的方差并将其用于特征选择。

属性feature_importance_存储树中每个特征的平均深度。 这是一个例子。 让我们从导入必要的库开始。

# using this for some array manipulations
import numpy as np
# of course we're going to plot stuff!
import matplotlib.pyplot as plt

# dummy iris dataset
from sklearn.datasets import load_iris
#random forest classifier
from sklearn.ensemble import RandomForestClassifier

一旦有了这些,我们将加载虚拟数据集,定义分类模型并将数据拟合到模型中。

data = load_iris()
​
# we're gonna use 100 trees
forest = RandomForestClassifier(n_estimators = 100)
​
# fit data to model by passing features and labels
forest.fit(data.data, data.target)

现在,我们可以根据要素能够将数据分类到不同目标的程度,使用要素重要性属性来为其评分。

# find importances of each feature
importances = forest.feature_importances_
# find the standard dev of each feature to assess the spread 
std = np.std([tree.feature_importances_ for tree in forest.estimators_],
             axis=0)
​
# find sorting indices of importances (descending)
indices = np.argsort(importances)[::-1]
​
# Print the feature ranking
print("Feature ranking:")
​
for f in range(data.data.shape[1]):
    print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))

功能排名:1.功能2(0.441183)2.功能3(0.416197)3.功能0(0.112287)4.功能1(0.030334)

现在,我们可以将每个功能的重要性绘制为条形图,并确定是否值得保留所有功能。 我们还绘制了误差线以评估其重要性。

plt.figure()
plt.title("Feature importances")
plt.bar(range(data.data.shape[1]), importances[indices],
       color="b", yerr=std[indices], align="center")
plt.xticks(range(data.data.shape[1]), indices)
plt.xlim([-1, data.data.shape[1]])
plt.show()

功能重要性的条形图

我道歉。 在您提到要发表什么样的陈述时,我没有注意到。 我假设您的响应变量为1或零。 您可以尝试这样的事情:

  1. 在数据上拟合线性回归模型。 这实际上并不能为您提供最准确的拟合,但是获取所需的信息将非常可靠。
  2. 用原始输入找到模型的响应。 (很可能不会是一或零)
  3. 像您在问题中建议的那样,人为地更改输入,并找到原始数据和修改后的数据的输出差异。

也可以通过逻辑回归进行尝试。 它实际上取决于您的数据及其分布方式,以找到哪种回归效果最好。 您绝对必须使用回归来找到输入变化带来的概率变化。

您甚至可以尝试使用具有回归/线性输出层的单层神经网络来执行相同的操作。 如果数据不太可能是线性的,则添加图层或非线性激活函数。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM