#python #python-3.x #scikit-learn
#python #python-3.x #scikit-learn
Вопрос:
Я хотел бы узнать больше о регрессорах случайного леса, которые я создаю с помощью sklearn. Например, какую глубину имеют деревья в среднем, если я не упорядочу?
Причина этого в том, что мне нужно упорядочить модель и я хочу получить представление о том, как модель выглядит на данный момент. Кроме того, если я установлю, например, max_leaf_nodes
будет ли по-прежнему необходимо также ограничить max_depth
или эта «проблема» решится сама собой, потому что дерево не может быть выращено слишком глубоко, оно max_leaf_nodes
установлено. Имеет ли это смысл или я думаю в неправильном направлении? Я не смог найти ничего в этом направлении.
Ответ №1:
Если вы хотите узнать среднюю максимальную глубину деревьев, составляющих вашу модель случайного леса, вам нужно получить доступ к каждому дереву отдельно и запросить его максимальную глубину, а затем вычислить статистику на основе полученных результатов.
Давайте сначала создадим воспроизводимый пример модели классификатора случайного леса (взято из документации Scikit-learn)
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
clf = RandomForestClassifier(n_estimators=100,
random_state=0)
clf.fit(X, y)
Теперь мы можем выполнить итерацию по его estimators_
атрибуту, содержащему каждое дерево решений. Для каждого дерева принятия решений мы запрашиваем атрибут tree_.max_depth
, сохраняем ответ и получаем среднее значение после завершения нашей итерации:
max_depth = list()
for tree in clf.estimators_:
max_depth.append(tree.tree_.max_depth)
print("avg max depth %0.1f" % (sum(max_depth) / len(max_depth)))
Это даст вам представление о средней максимальной глубине каждого дерева, составляющего вашу модель случайного леса (это работает точно так же и для регрессорной модели, о чем вы спрашивали).
В любом случае, в качестве предложения, если вы хотите упорядочить свою модель, у вас есть лучшая гипотеза о параметрах проверки в рамках парадигмы перекрестной проверки и сетки / случайного поиска. В таком контексте вам на самом деле не нужно спрашивать себя, как гиперпараметры взаимодействуют друг с другом, вы просто тестируете разные комбинации и получаете наилучшую комбинацию на основе оценки перекрестной проверки.
Комментарии:
1. Да, конечно, я буду использовать grid search для настройки гиперпараметров, но я хотел получить представление о проблеме и методе.
2. Используя предоставленный мной код, вы можете получить необходимую статистику о средней максимальной глубине деревьев в вашем случайном лесу на основе вашего выбора гиперпараметров max_leaf_nodes и max_depth.
Ответ №2:
В дополнение к ответу @Luca Massaron:
Я нашел https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html#sphx-glr-auto-examples-tree-plot-unveil-tree-structure-py который может быть применен к каждому дереву в лесу с помощью
for tree in clf.estimators_:
Количество конечных узлов может быть вычислено следующим образом:
n_leaves = np.zeros(n_trees, dtype=int)
for i in range(n_trees):
n_nodes = clf.estimators_[i].tree_.node_count
# use left or right children as you want
children_left = clf.estimators_[i].tree_.children_left
for x in range(n_nodes):
if children_left[x] == -1:
n_leaves[i] = 1