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

Если вам нужно собрать много математики, не волнуйтесь, мы просто примем эти уравнения и объясним, как эта математика преобразуется в процедуру построения модели. Сядьте поудобнее и читайте вместе!

В части 1 мы выяснили, как рассчитать показатель качества и выходное значение. Перепишем уравнения отдельно для регрессии и классификации.

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

ТОЧНЫЙ ЖАДНЫЙ АЛГОРИТМ:

1. Для дерева t0 мы устанавливаем наш начальный прогноз для целевого значения. Рассмотрим это так же, как мы используем априорные значения в наших байесовских моделях. При начальном прогнозе мы получаем начальные остатки R.

2. Помещаем эти начальные остатки в корневой узел нашего дерева t1. Нам нужно разделить этот узел. Для целей этого примера, скажем, мы разделяем по возрасту как признаку и по порогу 40, затем соответствующие остатки (точки данных) помещаются в левый и правый узлы.

3. Но лучший ли это сплит? Здесь на помощь приходит ПОКАЗАТЕЛЬ КАЧЕСТВА. Мы рассчитываем показатели качества для корневого, левого и правого узлов. При этом мы также вычисляем GAIN, как показано ниже.

GAIN = левая_оценка_качества + правая_оценка_качества — корневая_оценка_качества

4. Теперь, используя другой порог (рассматривайте его как скользящую полосу), мы получаем другое разделение и, следовательно, другие показатели качества, а также ПРИБЫЛЬ. Мы разделяем в зависимости от того, сможем ли мы лучше сгруппировать похожие остатки, если разделим их на 2 группы.

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

6. Чтобы обрезать дерево, мы используем гамму. Если разница (Gain — gamma) положительна, мы не будем обрезать, а если разница отрицательна, то обрежем дерево.

7. Когда мы построим полное дерево, рассчитаем ВЫХОДНОЕ ЗНАЧЕНИЕ каждого листа в дереве.

8. Predicted_target = Предыдущий_прогноз + (learning_rate) * РЕЗУЛЬТАТ ЗНАЧЕНИЯ

9. Повторите это для большего количества деревьев. (num_boost_rounds)

Давайте немного повеселимся, а?

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

КОНТЕКСТНОЕ ПРЕДУПРЕЖДЕНИЕ: что с пандемией и что мы пытаемся купить? Недавние трудные времена заставили всех нас в панике совершать покупки, и когда я зашел в продуктовый магазин, я не смог найти ни одного пакета макарон, кроме лежащих пачек макарон Лазанья. Я просто подумал, почему бы людям не купить это?

Есть несколько причин, по которым никто не будет покупать, эти молодые люди не будут знать, как их готовить, требует времени и т. д. Основываясь на этом и на моей любви к GoT, я попытался изобразить два простых дерева.

Этим данным присуща предвзятость, но я оставлю это вам, ребята, для интерпретации. Дракарис!!

Обратите внимание, что было много гиперпараметров, таких как gamma, lambda, min_child_weight, которые были введены ранее. Давайте посмотрим, что они означают, ниже.

ГИПЕРПАРАМЕТРЫ

Общие параметры:

Booster: gbtree: для древовидных моделей; gblinear: для линейных моделей

многословие: тип сообщений журнала, которые вы хотите распечатать, чтобы было ощущение, что вы что-то делаете. Кроме шуток, у нас есть значения, 0 (без звука), по умолчанию =1 (предупреждение), 2 (информация ), 3 (отладка).

Это наиболее часто используемые общие параметры, остальные можно установить по умолчанию.

Параметры задачи обучения:

цель:

reg: sqaurederror : регрессия с квадратом потерь

двоичный: логистический : двоичная классификация с потерей журнала

multi: softmax : многоклассовая классификация

multi : softprob: многоклассовая классификация, но также возвращает выходную вероятность.

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

eval_metric:

rmse: среднеквадратическая ошибка

mae: означает абсолютную ошибку

ошибка: частота ошибок двоичной классификации.

auc: площадь под кривой

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

seed: установите случайное начальное число для воспроизведения результатов.

Параметры бустеров:

max_depth: максимальная глубина, до которой может быть построено одно дерево. Всегда рекомендуется начинать с меньшей глубины, скажем, 3 или 4, и линейно увеличивать их на 1, чтобы избежать переобучения.

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

гамма: параметр обрезки дерева. Это тот же параметр, который мы используем вместе со значением GAIN, чтобы решить, следует ли далее разбивать узел. Как и все параметры, это также помогает избежать переобучения.

альфа: регуляризация L1, та же цель, что и регрессия Лассо, и может использоваться, когда у нас есть более высокая размерность.

лямбда: регуляризация L2, похожая на хребтовую регрессию и параметр, который мы видим в уравнении (1).

eta: скорость обучения. Уменьшает вес функции. Как видно из точного жадного алгоритма, после каждого раунда бустинга увеличение эта делает процесс более надежным и предотвращает переоснащение.

colsample_bytree: выборка количества столбцов/функций в обучающих данных в случайном порядке перед построением каждого дерева. Значения обычно находятся в диапазоне от 0 до 1, где, например, 0,6 означает, что перед построением дерева производится случайная выборка 60% столбцов.

colsample_bylevel. Произвольная выборка количества столбцов/функций на каждом уровне дерева.

подвыборка. Произвольная выборка количества примеров в обучающих данных перед построением каждого дерева. Значения обычно находятся в диапазоне от 0 до 1, где, например, 0,7 означает, что перед построением дерева производится случайная выборка 70% строк/примеров.

scale_pos_weight. Используйте этот параметр для несбалансированной классификации, чтобы присвоить веса отрицательным и положительным классам.

Вышеуказанное является наиболее часто используемыми гиперпараметрами. Дополнительную информацию о гиперпараметрах см. в официальной документации Xgboost [2].

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

Я попытался сделать следующие лакомые кусочки относительно короткими, но я настоятельно рекомендую ознакомиться с документом [1] для более подробного объяснения.

Приблизительный жадный алгоритм:

Точный жадный алгоритм: Чрезвычайно дорого проводить, если нам нужно перебрать все возможные пороги и все различные функции, чтобы найти оптимальное разделение.

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

Эскиз взвешенного квантиля:

Допустим, у нас есть набор данных с 50 строками, и мы разделяем данные на 10 блоков, и каждый блок имеет 5 точек данных (это мне кажется или это звучит как математическая задача из школы?) Алгоритм квантильного эскиза использует значения из эти 10 плит, чтобы сделать приблизительное распределение, и используя это приблизительное распределение, мы находим приблизительные квантили.

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

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

Ссылаясь на выражение min_child_weight из задачи классификации, если наши ранее предсказанные вероятности равны 0,4, 0,5 или 0,6, веса (min_child_weight) больше, а это означает, что нам нужно больше сосредоточиться на них по сравнению с вероятностями 0,1 или 0,9.

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

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

Алгоритм разделения с учетом разреженности

OOOOOH НЕДОСТАЮЩИЕ ЗНАЧЕНИЯ:

(Кажется, это призраки, у которых нет ног!)

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

На одном и том же пороге мы вычисляем усиление слева и усиление справа. Где Gain left рассчитывается путем помещения всех остатков отсутствующего признака слева.

Точно так же усиление справа рассчитывается путем помещения всех остатков отсутствующего признака справа.

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

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

Другие примечательные и полезные функции реализации XGBoost:

1. Xgboost имеет встроенную перекрестную проверку, которая вычисляет среднее значение и дисперсию метрики ошибки после каждого раунда повышения. Это помогает нам определить оптимальное количество деревьев.

2. Переоснащение можно контролировать с помощью ранней остановки

3. Xgboost имеет доступ к Cache Aware, что означает, что градиенты и гессианы хранятся в кэш-памяти, что ускоряет расчет показателя качества и усиления.

4. Xgboost также обеспечивает важность функций и может быть легко визуализирован.

5. Xgboost может обрабатывать отсутствующие значения, как видно из алгоритма разреженности.

Это подводит нас к концу поста. Я надеюсь, что теперь у вас есть краткое представление о популярном алгоритме машинного обучения. Это дает вам интуитивное представление о том, как эти гиперпараметры могут повлиять на модель, которую вы создаете. Этот пост будет неполным без благодарности за замечательную работу, проделанную Тяньци Ченом и Карлосом Гестрином, авторами статьи.

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

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

[1] https://arxiv.org/pdf/1603.02754.pdf

[2] https://xgboost.readthedocs.io/en/latest/parameter.html

[3] https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf

[4]Элементы статистического обучения