Scikit learn + Random Forest - 单棵树的特征

Posted

技术标签:

【中文标题】Scikit learn + Random Forest - 单棵树的特征【英文标题】:Scikit learn + Random forest - features of single trees 【发布时间】:2014-06-27 03:43:09 【问题描述】:

我有一个关于随机森林及其在 scikit 中的实现的非常具体的问题。 我建造了一片森林,到目前为止,预测工作得很好。但是,我需要知道在拟合森林后,哪些特定特征最终会出现在单棵树的叶子中。

我已经了解了层次结构,其中随机森林构建单个决策树,我可以通过“estimators_”属性访问它,并且进一步每个决策树都有一个“tree_”属性。在这棵树中,我找到了有关特定节点、叶子和分裂的信息,但我无法找出哪些特定特征最终出现在叶子中,甚至无法找出哪些特征分配给该特定树?

澄清一下,我不打算手动分析树节点,但我想根据某组特征出现在树的叶子中的频率来进行相似性度量。

非常感谢!

附:以防万一有人感兴趣,我从这篇论文中得到了这种相似性度量的想法: http://www.sciencedirect.com/science/article/pii/S1053811912009834

edit:好的,我已经更进一步了。显然,Ensemble 有一种方法可以“为 X 中的每个样本查找终端区域(=叶节点)”。这可以在这里找到(第 2465 行) https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx

我已经摆弄了一下,但无法完全理解代码。我可以制作 rf.apply(np.array([i,j])),其中 i,j 是用于拟合模型的 2D 矩阵中的样本数,它返回给我它所在的叶子.伟大的 !但唯一奇怪的是我可以使用比实际样本更大的数字吗?如果索引太大,它会假设最后一个样本,还是我做错了什么?

出于测试目的,我制作了一个 10x5 矩阵,但我可以索引 rf.apply(np.array([500,2333])) 而不会出错?

抱歉,我不完全确定如何向此函数提供数据。

【问题讨论】:

【参考方案1】:

您可以在 Python 中提取决策节点,如 how extraction decision rules of random forest in python 中所述。然后可以遍历树木以检查哪些特征导致了每片叶子。

【讨论】:

以上是关于Scikit learn + Random Forest - 单棵树的特征的主要内容,如果未能解决你的问题,请参考以下文章

导出 Scikit Learn Random Forest 以在 Hadoop 平台上使用

逻辑回归-5. scikit-learn中的逻辑回归

LinearSVC sklearn (scikit-learn) 中 C 的行为

Tensorflow 导致 scikit-learn 出错

混淆矩阵中的 Scikit-learn 变化阈值

SciKit-learn - 训练高斯朴素贝叶斯分类器