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

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

Оглавление

Ансамбли - Введение

В машинном обучении ансамбли - это модели, которые используют несколько моделей (известных как БАЗОВЫЕ УЧАЩИЕСЯ) вместе, чтобы сформировать единую прогностическую модель.

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

ПОЧЕМУ ансамбли лучше отдельных моделей ??? ПОЧЕМУ ансамбли, способные минимизировать ошибку ??? ПОЧЕМУ отличные слабые базовые учащиеся образуют сильную группу по сравнению с аналогичными базовыми учащимися ???

Чтобы ответить на это могущественное «ПОЧЕМУ» и понять ансамбли, позвольте мне попытаться сформулировать его объяснение на примере повседневной жизни, а затем использовать математику, реализацию на Python, концепцию, лежащую в основе каждого ансамблевая техника.

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

ПОЧЕМУ ансамбли лучше отдельных моделей ???

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

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

ПОЧЕМУ ансамбли способны минимизировать погрешность ???

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

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

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

ПОЧЕМУ отдельные слабые базовые ученики образуют сильный ансамбль по сравнению с аналогичными базовыми учениками ???

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

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

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

Повышение - Введение

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

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

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

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

Алгоритм

Деревья решений с усилением градиента (GBDT)

GBDT - это одна из техник ансамбля повышающего типа, которую можно легко реализовать с помощью scikit-learn. Наряду со всеми функциями повышения, scikit-learn также обеспечивает выборку строк в GBDT, что сделало его сверхмощным алгоритмом.

Согласно приведенному выше алгоритму, окончательная функция для GBDT может быть представлена ​​следующим образом:

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

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

Теперь у нас осталось два основных гиперпараметра:

  1. k т.е. нет. базовых учащихся (деревья решений)
  2. v т.е. скорость обучения

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

Глубина дерева сильно влияет на переобучение в модели. Обычная глубина отдельного дерева составляет 2,3,4 или максимум 5. Более 5 может привести к переобучению модели.

Наряду с его уязвимостью к переобучению GBDT есть и другие ограничения:

GBDT считается медленным процессом, для большого набора данных он обычно занимает много времени по сравнению с другими алгоритмами машинного обучения.

Распараллеливание задачи в GBDT (или других алгоритмах повышения) также невозможно.

Но все благодаря XGBoost, еще одному алгоритму повышения, который обладает всеми преимуществами GBDT и преодолевает ограничение временной сложности.

Для реализации GBDT мы можем обратиться к документации sklearn.

Экстремальное усиление градиента (XGBoost)

XGBoost поставляется с небольшой настройкой GBDT, т.е.

Scikit-learn GBDT может выполнять выборку строк, но не может облегчить метод выборки столбцов. Отбор проб из колонки закрепляет GBDT без ущерба для характеристик модели. В XGBoost мы получаем все преимущества GBDT вместе с методом выборки столбцов.

Выполнение

В отличие от других алгоритмов машинного обучения, XGBoost до сих пор не является частью sklearn, но мы можем установить XGboost из предварительно созданного двоичного колеса, доступного из индекса пакетов Python (PyPI).

Для классификации

from sklearn.model_selection import RandomizedSearchCV
from xgboost import XGBClassifier as xgbc
from scipy import stats
classifier = xgbc(random_state = 0)
tuned_param = {'n_estimators': [x for x in range(1,101,10) ], 'learning_rate': stats.uniform(0.0095,
0.15)}
model = RandomizedSearchCV(classifier , tuned_param, scoring = 'f1' , n_iter = 15 , cv =3)
model.fit(X_train , y_train)
print(model.best_estimator_)

Для регресса

from sklearn.model_selection import RandomizedSearchCV
from xgboost import XGBRegressor as xgbr
from scipy import stats
regressor = xgbr(random_state = 0)
tuned_param = {'n_estimators': [x for x in range(1,101,10) ], 'learning_rate': stats.uniform(0.0095, 0.15)}
model = RandomizedSearchCV(regressor , tuned_param, scoring = 'explained_variance' , n_iter = 15 , cv =3)
model.fit(X_train , y_train)
print(model.best_estimator_)

В XGBoost параметры learning_rate, max_depth, n_estimators чаще всего используются в качестве гиперпараметров.

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

max_depth - максимальная глубина дерева.

n_estimators - Количество учеников по основанию.

Интерпретация

Построение модели с применением различных алгоритмов машинного обучения - это просто изменение 2–3 строк кода, что более важно, так это интерпретация того, как модель обучается, ее результатов.

Интерпретация - это двухэтапный процесс: этап 1 - интерпретация модели, этап 2 - интерпретация результата.

График важности функции:

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

Иногда модель обучения только по наиболее важным функциям дает лучшие результаты.

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

Три типа важности функций:

  1. Вес. Сколько раз функция использовалась для разделения данных по всем деревьям.
  2. Обложка. Количество раз, когда функция используется для разделения данных по всем деревьям, взвешенная по количеству точек обучающих данных, которые проходят через эти разделения.
  3. Прирост. Среднее снижение потерь при обучении, полученное при использовании функции разделения.

Реализация графика важности функций в Python

import xgboost
def plot_importance(importance_type):
xgboost.plot_importance(model_1, importance_type =importance_type,  title = 'Feature importance plot with type = ' + importance_type)
imp_type = ['weight' , 'gain', 'cover']
for type_ in imp_type:
    plot_importance(type_)

Насколько точен график важности функций? ? ?

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

Рассмотрим диаграмму ниже,

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

Код для проверки графика важности функции в Python

def fi_plot_comp(base, depth):
    col = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']
    model = xgbc(learning_rate = 0.1, max_depth = depth ,                      n_estimators = base)
model.fit(X_train, y_train)
    plt.figure(figsize=(4,3))
    index = np.arange(len(col))
    plt.bar(index, model.feature_importances_)
    plt.xlabel('Features', fontsize=10)
    plt.ylabel('Relative importance', fontsize=10)
    plt.xticks(index, col, fontsize=10, rotation=90)
    plt.title('feature imp plot for xgboost when \n max_depth = '  + str(depth) + ' & #estimators= ' + str(base))
    plt.show()
    
for x in [50,100]:
    for y in [3,4]:
        fi_plot_comp(x,y)

График влияния характеристик - график значений SHAP

Этот сюжет очень полезно визуализировать:

  1. как разные функции использовались для генерации вывода для тестовых данных.
  2. насколько каждая функция в совместном прогнозировании способствовала его успеху.

График воздействия функции может быть визуализирован в двух форматах:

(а) Формат распространения

(b) Формат гистограммы

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

Значения SHAP (добавление Шапли)

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

Реализация графика значений SHAP - формат распределения в python

import shap
import xgboost
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)

Реализация графика значений SHAP - формат гистограммы в Python

shap.summary_plot(shap_values, X_test, plot_type="bar")

График интерпретации тестового образца

Ниже приведены результаты для двух тестовых выборок: первая модель предсказывает 1, а вторая модель предсказывает 0.

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

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

Точно так же из графика распределения с меткой «0» ясно, что функция 1 доминирует при выборе метки класса, функция 0 и функция 2 также внесли некоторый вклад, а остальные функции внесли почти незначительный вклад.

Реализация тестового образца графика - формат распределения на python

import shap
import xgboost
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
test_id = 5
shap.summary_plot(shap_values[test_id:test_id+1], X_test[test_id:test_id+1,:])

Реализация тестового образца графика - формат гистограммы в Python

shap.summary_plot(shap_values[test_id:test_id+1], X_test[test_id:test_id+1,:], plot_type="bar")

Вывод

Ансамбли обычно дают отличные результаты, а среди ансамблей бустинг более популярен среди специалистов по обработке данных, но люди отказываются от него из-за его низкой интерпретируемости. Но ансамбли Boosting не настолько интерпретируемы, как все предполагали, заразить есть много способов визуализировать их.

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

  1. Интерпретируемое машинное обучение с XGBoost
  2. Документация XGBoost
  3. Документация ГБДТ