В предыдущем посте мы рассмотрели основы деревьев, как они разбиваются, как они вычисляются и как классификатор приходит к конкретному прогнозу, используя примеры кода.

В этом посте мы переходим к следующему шагу — ансамблевому методу обучения для классификации, регрессии и других задач, который работает путем построения множества деревьев решений во время обучения и вывода класса, который является режимом классов или средним предсказанием отдельные деревья. Случайный лес похож на алгоритм начальной загрузки с моделью дерева решений (CART).

В последние несколько лет случайный лес стал расцветающей техникой машинного обучения. Это нелинейная древовидная модель, которая часто дает точные результаты. Однако, будучи черным ящиком, его часто трудно интерпретировать и полностью понять, особенно когда дело доходит до объяснения результатов и их обоснования заинтересованным сторонам в организациях.

От деревьев решений к лесу:

Мы начали предыдущий пост с деревьев решений, так как же нам перейти от дерева решений к лесу?

Это просто, поскольку предсказание леса — это среднее значение предсказаний его деревьев, предсказание — это просто среднее значение условий смещения плюс средний вклад каждого признака.

Шаги:

1) Предположим, что количество случаев в обучающей выборке равно N. Затем случайным образом, но с заменой, берется выборка из этих N случаев. Этот образец будет обучающим набором для выращивания дерева.

2) Если имеется M входных переменных, задается число m ‹ M так, чтобы в каждом узле m переменных выбирались случайным образом из M. Среди признаков "m" вычислите узел "d", используя лучшую точку разделения для разделения узла. Значение m поддерживается постоянным, пока мы выращиваем лес. Узлы далее разбиваются на дочерние узлы с использованием наилучшего разделения.

Критерии разделения аналогичны критериям регрессора дерева решений в scikit-learn.

3) Постройте лес, повторив описанные выше шаги n раз, чтобы создать n количество деревьев (n_estimators в scikit-learn). Каждое дерево выращено в максимально возможной степени и не требует обрезки.

4) Прогнозировать новые данные путем агрегирования прогнозов ntree( количество «n» деревьев) (т. е. большинство голосов за классификацию, среднее для регрессии).

Давайте посмотрим на реализацию тех,

rf.fit(X_train, y_train)

Опять же, превращение черного ящика в белый ящик для предсказания случайного леса.

rf_prediction, rf_bias, rf_contributions = ti.predict(rf, instances)
rf_ft_list = []
for i in range(len(instances)):
    print("Bias (trainset mean)", rf_bias[i])
    for c, feature in sorted(zip(rf_contributions[i], 
                                 x.columns), 
                             key=lambda x: -abs(x[0])):
       rf_ft_list.append((feature, round(c, 2)))
    print("-"*50)

rf_labels, rf_values = zip(*rf_ft_list)
rf_ft_list

Что это говорит нам?

Как видно из приведенных выше результатов, 4 функции оказывают положительное влияние на повышение цен, но на этот раз широта времени оказывает очень сильное негативное влияние, в результате чего прогнозы намного меньше, чем систематическая ошибка (среднее значение набора поездов).

Глядя на вклады, прогнозы и условия смещения.

rf_contributions

rf_prediction

rf_bias

Опять же, прогноз должен быть равен «смещение + вклад функции (1) + … + вклад функции (n)».

print(rf_bias + np.sum(rf_contributions, axis=1))

Подобно тому, как мы видели в предыдущем посте, как дерево решений пришло к результатам, давайте посмотрим, как случайный лес пришел к своим прогнозам.

from sklearn.ensemble import RandomForestRegressor
rf_model = RandomForestRegressor(n_estimators=10)
top5xrf = X_train.head(5)
top5yrf = y_train.head(5)
rf_model.fit(top5xrf, top5yrf)

Извлечение одного дерева для визуализации результатов,

estimator = rf_model.estimators_[5]
from sklearn.externals.six import StringIO  
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
dot_data1 = StringIO()
export_graphviz(estimator, out_file=dot_data1,  
               filled=True, rounded=True,
               special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data1.getvalue())  
Image(graph.create_png())

Хотя одно изображение не решит проблему, просмотр отдельного дерева решений показывает нам, что случайный лес — это не необъяснимый метод, а последовательность логических вопросов и ответов, и каждое предсказание можно тривиально представить как сумму вкладов признаков. , показывающий, как функции приводят к определенному прогнозу.

Это открывает массу возможностей в практических задачах машинного обучения.

Похлопайте, если вы нашли этот пост полезным! Ваше здоровье.