sklearn.tree.DecisionTreeClassifier: получить все образцы, попавшие в конечный узел.
Я хочу оценить для всех образцов размер листового узла, в который они попали.
Основываясь на этом превосходном ответе, я уже нашел способ извлечь количество выборок для каждого конечного узла:
from sklearn.tree import _tree, DecisionTreeClassifier
import numpy as np
clf = DecisionTreeClassifier().fit(X_train, y_train)
def tree_get_leaf_size_for_elem(tree, feature_names):
tree_ = tree.tree_
def recurse(node):
if tree_.feature[node] != _tree.TREE_UNDEFINED:
recurse(tree_.children_left[node])
else:
samples_in_leaf = np.sum(tree_.value[node][0])
recurse(0)
tree_get_leaf_size_for_elem(clf, feature_names)
Есть ли способ получить индексы всех образцов (X_train
) что оказалось в листовом узле? Новый столбец для X_train
названный "leaf_node_size" был бы желаемым выводом.
1 ответ
Решение
Sklearn позволяет вам сделать это легко с помощью метода apply
from collections import Counter
#get the leave for each training sample
leaves_index = tree.apply(X_train)
#use Counter to find the number of elements on each leave
cnt = Counter( leaves_index )
#and now you can index each input to get the number of elements
elems = [ cnt[x] for x in leaves_index ]