使用 RandomForestClassifier.decision_path,我如何判断分类器用于做出决策的样本?

Posted

技术标签:

【中文标题】使用 RandomForestClassifier.decision_path,我如何判断分类器用于做出决策的样本?【英文标题】:Using RandomForestClassifier.decision_path, how do I tell which samples the classifier used to make a decision? 【发布时间】:2018-10-04 02:59:21 【问题描述】:

我正在使用RandomForestClassifier 对具有二元结果的样本进行分类(“没有东西”与“有东西”)。从RandomForestClassifier.decision_path的结果中,我如何确定哪些样本对分类决策有贡献?

documentation 说:

返回:

指标:稀疏 csr 数组,形状 = [n_samples, n_nodes]

返回一个节点指示矩阵,其中非零元素表示 样本通过节点。

n_nodes_ptr : 大小数组 (n_estimators + 1, )

indicator[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

【问题讨论】:

我觉得你说得对,应该是indicator[sample, n_nodes_ptr[i]:n_nodes_ptr[i+1]]。虽然我没有明白你的意思是你的句子的其余部分“..但即便如此,我也不是..指的是”。 @EmmetB,我在问如何将决策路径解释为被检查的样本。 你能举一个 DecisionTreeClassifier 的例子吗? @EmmetB,在这里找到它:scikit-learn.org/stable/auto_examples/tree/… 【参考方案1】:

当您意识到sklearn 约定是将尽可能多的东西放入numpy 矩阵中时,就会更容易理解RandomForestClassifier.decision_path 的输出。

decision_path 返回每​​个决策树的decision_path 的水平串联,第二个返回值通知您每个子矩阵的边界。因此,在RandomForestClassifier 上使用decision_path 等同于在每个RandomForestClassifier.estimators_ 上使用decision_path。对于单行样本,您可以像这样遍历结果:

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 的左子节点的 节点编号,正如你所猜测的那样,@987654338 @告诉你节点6的右孩子的节点号。

除了这些数组之外,DecisionTreeClassifier.decision_path 也是一个数组,如果在决策过程中访问了节点#N,decision_path[N] 非零。

要退回已测试的功能,您可以执行以下操作:

for index in node_indices:
    feature = tree.feature[index]
    if feature >= 0:
        features.add(feature)  # where `features` is a set()

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

【讨论】:

以上是关于使用 RandomForestClassifier.decision_path,我如何判断分类器用于做出决策的样本?的主要内容,如果未能解决你的问题,请参考以下文章

RandomForestClassifier 性能不佳

RandomForestClassifier 导入

使用 RandomForestClassifier 理解 TreeInterpreter 的输出

机器学习算法:RandomForestClassifier的使用

ValueError:未知标签类型:RandomForestClassifier 中的“未知”

使用 RandomForestClassifier.decision_path,我如何判断分类器用于做出决策的样本?