Machine learning 随机森林中变量重要性的回归量化

Machine learning 随机森林中变量重要性的回归量化,machine-learning,statistics,random-forest,logistic-regression,decision-tree,Machine Learning,Statistics,Random Forest,Logistic Regression,Decision Tree,是否有可能量化变量的重要性,以计算出一个观测值归入一类的概率。类似于逻辑回归 例如: 如果我有以下自变量 1) 这个人养了多少只猫 2) 一个人养的狗的数量 3) 一个人养了多少只鸡 我的因变量是:一个人是否是善待动物组织的一部分 有没有可能这样说:“如果一个人收养的猫比他现有的动物多一只,那么他成为善待动物组织成员的可能性增加0.12” 我目前正在使用以下方法实现这一特定场景: 1) 利用训练数据建立随机森林模型 2) 预测客户属于某一特定类别的概率(Peta与非Peta) 3) 人为地将每次

是否有可能量化变量的重要性,以计算出一个观测值归入一类的概率。类似于逻辑回归

例如: 如果我有以下自变量 1) 这个人养了多少只猫 2) 一个人养的狗的数量 3) 一个人养了多少只鸡

我的因变量是:一个人是否是善待动物组织的一部分

有没有可能这样说:“如果一个人收养的猫比他现有的动物多一只,那么他成为善待动物组织成员的可能性增加0.12”

我目前正在使用以下方法实现这一特定场景: 1) 利用训练数据建立随机森林模型 2) 预测客户属于某一特定类别的概率(Peta与非Peta) 3) 人为地将每次观察拥有的猫的数量增加1 4) 预测客户的新概率属于这两类中的一类 5) (4)概率和(2)概率之间的平均变化是一个人收养猫的概率的平均增加


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

如果您使用的是scikitlearn,您可以通过访问已安装的RandomForestClassifier的
功能\u重要性
属性轻松做到这一点。据SciKitLearn称:

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

属性
feature\u importance\u
存储树中每个特征的平均深度。 这里有一个例子。让我们从导入必要的库开始

# 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或0。您可以尝试以下方法:

  • 在数据上拟合线性回归模型。这并不能真正为您提供最准确的拟合,但它能够可靠地获取您所需的信息
  • 找到模型对原始输入的响应。(很可能不是1或0)
  • 人为地更改输入,并找到原始数据和修改数据输出的差异,就像您在问题中建议的那样
  • 用逻辑回归也可以尝试一下。这实际上取决于您的数据以及如何分配数据,以找到哪种回归最有效。你一定要用回归来找出概率随输入变化的变化

    你甚至可以尝试一个带有回归/线性输出层的单层神经网络来做同样的事情。如果数据不太可能是线性的,则添加层或非线性激活函数


    干杯

    欢迎来到SO;由于这不是一个编程问题,我强烈建议您将其移动到其中一个或姐妹站点。如果您希望得到逻辑回归给出的结果,那么为什么不使用逻辑回归?也许您可以使用naive Bayes。您好Manny,感谢您抽出时间回答此问题,你的建议会给我每个变量的相对重要性,但它不会量化重要性,因为改变一个变量会带来多大的概率差异。