RandomForestClassifier

RandomForestClassifier

我用一个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()

请注意,这会告诉您已测试的功能,而不会告诉您它们的价值或它们如何影响结果。

08-04 09:24