只需阅读此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.
...
任何指示赞赏。
答案 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
。