你能从scikit-learn中的DecisionTreeRegressor中获取选定的叶子吗?



只是阅读这篇伟大的论文并尝试实现这一点:

。我们对待每个人树作为分类特征,取值实例最终落入的叶的索引。我们使用 1-此类功能的 of-K 编码。例如,考虑图 1 中的提升树模型,包含 2 个子树,其中第一个子树有 3 个叶子,第二个子树有 2 个叶子。如果实例在第一个子树中的叶 2 和叶 1 中结束第二个子树,线性分类器的整体输入将是二进制向量 [0, 1, 0, 1, 0],其中前 3 个条目对应于第一个子树的叶子和最后 2 个子树的叶子第二个子树的那些...

有谁知道我如何预测一堆行,并为每一行获得融合中每棵树的选定叶子? 对于这个用例,我并不真正关心节点代表什么,只关心它的索引。 看了一下来源,我很快就看不出任何明显的东西。 我可以看到我需要迭代树并执行以下操作:

for sample in X_test:
  for tree in gbc.estimators_:
    leaf = tree.leaf_index(sample) # This is the function I need but don't think exists.
    ...

任何指示赞赏。

以下功能不仅仅是从决策树中识别选定的叶子,而是在参考论文中实现应用程序。它的用途与参考论文相同,我使用 GBC 进行特征工程。

def makeTreeBins(gbc, X):
    '''
    Takes in a GradientBoostingClassifier object (gbc) and a data frame (X).
    Returns a numpy array of dim (rows(X), num_estimators), where each row represents the set of terminal nodes
    that the record X[i] falls into across all estimators in the GBC. 
    Note, each tree produces 2^max_depth terminal nodes. I append a prefix to the terminal node id in each incremental
    estimator so that I can use these as feature ids in other classifiers.
    '''
    for i, dt_i in enumerate(gbc.estimators_):
        prefix = (i + 2)*100 #Must be an integer
        nds = prefix + dt_i[0].tree_.apply(np.array(X).astype(np.float32))
        if i == 0:
            nd_mat = nds.reshape(len(nds), 1)        
        else:
            nd_mat = np.hstack((nd, nds.reshape(len(nds), 1)))
return nd_mat

DecisionTreeRegressor 具有tree_属性,可让您访问底层决策树。它有方法 apply ,它似乎找到了相应的叶 id:

dt.tree_.apply(X)

请注意,apply 希望其输入的类型为 float32

相关内容

  • 没有找到相关文章

最新更新