使用 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 理解 TreeInterpreter 的输出
机器学习算法:RandomForestClassifier的使用