关于随机森林及其在scikit中的实现,我有一个非常具体的问题。我构建了一个森林,到目前为止预测效果还不错。但是,我需要知道在拟合forest后,哪些特定的特征最终会出现在单个树的叶子中。
我已经理解了层次结构,其中随机森林构建了单个决策树,我可以通过"estimators_"属性访问它,并且在此基础上,每个决策树都有一个"tree_"属性。在这棵树中,我找到了关于特定节点、叶子和分裂的信息,但我无法找到哪些特定的特征最终出现在叶子中,甚至哪些特征被分配到特定的树中?
只是为了澄清,我不打算手动分析树节点,但我想有一个相似性度量,基于某一组特征在树的叶子中一起结束的频率。
非常感谢!
注。以防有人感兴趣,我从这篇论文中得到了这个相似度测量的想法:http://www.sciencedirect.com/science/article/pii/S1053811912009834
edit:好的,我得到了更多。显然,有一种方法可以"为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]))而不会出错?
对不起,但我不完全确定如何提供数据到这个函数。
您可以在Python中提取决策节点,正如在如何在Python中提取随机森林决策规则中所解释的那样。然后可以遍历树来检查每个叶子的特征