[英]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或零。 您可以尝试这样的事情:
也可以通过逻辑回归进行尝试。 它实际上取决于您的数据及其分布方式,以找到哪种回归效果最好。 您绝对必须使用回归来找到输入变化带来的概率变化。
您甚至可以尝试使用具有回归/线性输出层的单层神经网络来执行相同的操作。 如果数据不太可能是线性的,则添加图层或非线性激活函数。
干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.