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

时间:2014-12-26 08:21:45

标签: python-2.7 machine-learning scikit-learn decision-tree

只需阅读此great paper并尝试实现此目的:

......我们对待每个人 树作为一种分类特征,它具有价值 实例最终落入的叶子的索引。我们使用1- -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.
    ...

任何指示赞赏。

2 个答案:

答案 0 :(得分:3)

以下功能不仅仅是从决策树中识别选定的叶子,还在参考文件中实现了应用程序。它的用法与参考文献相同,我使用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

答案 1 :(得分:2)

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

dt.tree_.apply(X)

请注意,apply期望其输入具有类型float32