我用一个RandomForestClassifier
对样本进行分类,结果是二元的(“没有东西”vs“有东西”)根据RandomForestClassifier.decision_path
的结果,我如何确定哪些样本有助于分类决策?
documentation表示:
退货
指示符:稀疏csr数组,shape=[n_samples,n_nodes]
返回一个节点指示符矩阵,其中非零元素表示
样本通过节点。
n_nodes_ptr:大小数组(n_估计器+1,)
指标[n_nodes_ptr[i]:n_nodes_ptr[i+1]中的列给出了指标值
对于第i个估计量。
不幸的是,这些条款对我来说是不透明的。indicator[x:y]
在一个维度为[n_samples, n_nodes]
的矩阵上似乎是一个错误(难道不是indicator[sample, n_nodes_ptr[i]:n_nodes_ptr[i+1]]
?),但即便如此,我也不确定该如何获取“节点指示器”并找到该节点所指的功能。我可以为decision_path
找到使用DecisionTreeClassifier
的示例,但不能为RandomForestClassifier
找到使用的示例。
最佳答案
当您意识到RandomForestClassifier.decision_path
约定将尽可能多的内容放在sklearn
矩阵中时,理解numpy
的输出就更容易了。decision_path
返回每个决策树的decision_path
的水平连接,第二个返回值通知您每个子矩阵的边界因此,在adecision_path
上使用RandomForestClassifier
等同于在每个decision_path
上使用RandomForestClassifier.estimators_
。对于单行示例,可以按如下方式遍历结果:
indicators, index_by_tree = classifier.decision_path(data_row)
indices = zip(index_by_tree, index_by_tree[1:])
for tree_classifier, (begin, end) in zip(classifier.estimators_, indices):
tree = tree_classifier.tree_
node_indices = indicators[0, begin:end].indices
树实例不将每个节点视为单独的对象,而是具有以下属性:
feature
value
children_left
children_right
每一个都是数组或矩阵,记录由其索引标识的树节点的特征。例如,
tree.feature[3]
告诉您节点3测试的是哪个功能;tree.value
告诉您树的值是一个3d数组,第一个维度是节点号,最后一个维度包含分类值和阈值。(我不知道第二维度是什么。在我的例子中,它只有一个元素。)tree.children_left[5]
告诉您节点5的左子节点的节点号,正如您所猜测的,tree.children_right[6]
告诉您节点6的右子节点的节点号。除了这些数组之外,
DecisionTreeClassifier.decision_path
也是一个数组,其中,如果在决策过程中访问了node_n,则decision_path[N]
是非零的。要返回已测试的功能,可以执行以下操作:
for index in node_indices:
feature = tree.feature[index]
if feature >= 0:
features.add(feature) # where `features` is a set()
请注意,这会告诉您已测试的功能,而不会告诉您它们的价值或它们如何影响结果。