Как я могу получить информацию о деревьях в случайном лесу в sklearn?

#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