只是阅读这篇伟大的论文并尝试实现这一点:
。我们对待每个人树作为分类特征,取值实例最终落入的叶的索引。我们使用 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
。