Древовидные методы - один из самых известных алгоритмов контролируемого обучения в машинном обучении как для регрессионных, так и для классификационных задач. Они с большим успехом использовались во многих соревнованиях по науке о данных, и из-за их простоты и интерпретируемости стоит взглянуть на них.

Набор данных

Мы будем использовать набор данных Bike sharing из репозитория машинного обучения UCI. Он содержит почасовой и ежедневный счет проката велосипедов в период с 2011 по 2012 год в системе Capital bikeshare с соответствующей погодой и сезонной информацией. Данные до июля 2012 г. используются в качестве обучающего набора, а данные с июля 2012 г. и далее являются частью набора для проверки. Цель состоит в том, чтобы спрогнозировать почасовую арендную плату.

Деревья решений

Дерево решений можно описать как последовательность разбиений, где в каждом из этих разбиений совокупность разделяется на две или более подгрупп. Если бы мы хотели создать дерево, первым делом нужно было бы найти наиболее значимый дифференциатор во входных переменных. Как мы это делаем?

Обучение

Чтобы найти оптимальное разбиение, мы должны перебрать предикторы и их возможные значения. Для каждого возможного разделения мы рассчитаем среднее целевое значение переменной для полученных подгрупп. Используя эти средства в качестве прогнозов для экземпляров каждой подвыборки, следующим шагом является вычисление среднеквадратичной ошибки (MSE). Сравнения MSE недостаточно для определения наилучшего разделения, потому что может случиться так, что подгруппа будет содержать только один образец (а другая подгруппа - все оставшиеся экземпляры), что совершенно бесполезно. Чтобы избежать этой ситуации, мы берем средневзвешенное (MSE * количество выборок в подгруппе) в качестве показателя оценки. Этот процесс повторяется до тех пор, пока мы не достигнем некоторого предела: минимальное количество экземпляров в каждом узле, максимальная глубина дерева или узлы, которые невозможно разделить (содержащие одну обучающую выборку).

Используя библиотеку Python scikit-learn, давайте поместим дерево с max_depth = 3 (для удобства визуализации).

model = RandomForestRegressor(n_estimators=1, max_depth=3, bootstrap=False)
model.fit(X_train, y_train)

Мы видим, что переменная hr (час) используется для создания первого разбиения, в частности, если ее значение ≤6,5 или нет. Как мы можем оценить, насколько хороша эта модель?

Оценка

Коэффициент детерминации - это статистическая мера того, насколько хорошо модель приближается к реальным значениям. Наиболее общее определение R²:

Значение R², равное 1, указывает на то, что модель идеально соответствует данным. Кроме того, использование простого наивного подхода, такого как прогнозирование среднего, приведет к R² = 0. Если мы обучим дерево до тех пор, пока каждый листовой узел не будет содержать единственный экземпляр, мы получим обучение R² = 1, потому что модель запомнила бы каждое обучение. образец. С другой стороны, валидация R² будет ниже, поскольку чрезмерно переоборудованные модели плохо обобщаются на невидимые данные.

Давайте оценим простое дерево, которое мы подогнали.

model.score(X_train, y_train), model.score(X_valid, y_valid)
(0.49136305225068927, 0.40361438427146706)

0.4 validation R² не является хорошим показателем, поэтому нам нужно найти способ улучшить модель. Это будет связано с использованием деревьев в качестве строительных блоков для построения более мощных моделей прогнозирования.

Упаковка

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

Например, предположим, что мы создаем n деревьев решений, но выбираем только случайное подмножество данных для обучения каждого из них. В результате каждая модель будет сильно переобучать на своем подмножестве, но будет давать неточные прогнозы для всего набора данных. Из-за того, что используются разные подвыборки, модели не коррелируют друг с другом, поэтому они по-разному понимают взаимосвязь данных. Усредняя деревья, мы эффективно извлекаем идеи из каждого из них. Ключ в том, чтобы создать несколько моделей, которые лучше, чем ничего, но их ошибки в максимально возможной степени не коррелированы. В противном случае этот прием не сработает.

Случайные леса

Можно сделать небольшую настройку, чтобы декоррелировать деревья и улучшить ранее упомянутую технику: при построении дерева при каждом разбиении алгоритму даже не разрешается рассматривать все предикторы, он должен искать лучшее разбиение среди случайной выборки из m предикторы.

Давайте создадим случайный лес из 10 деревьев:

model = RandomForestRegressor(n_estimators=10)
model.fit(X_train, y_train)
model.score(X_train, y_train), model.score(X_valid, y_valid)
(0.9889539960228737, 0.8900380998681449)

Получаем подтверждение R² = 0,89.

Давайте посмотрим, как изменяется R² при добавлении дополнительных деревьев решений в нашу модель:

Выводы

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

Код доступен здесь.

использованная литература

Джеймс Гарет, Виттен Даниэла, Тревор Хасти и Тибширани Роберт. Введение в статистическое обучение с приложениями в R. 2013 г.

Курс машинного обучения Fastai

Https://en.wikipedia.org/wiki/Coefficient_of_determination