Классификация с XGBoost

Добро пожаловать во вторую статью из серии «Путешествие по XGBoost». Сегодня мы построим нашу первую модель XGBoost на основе набора данных «болезни сердца» и создадим небольшое (но полезное) веб-приложение для передачи наших результатов конечным пользователям. Вот темы, которые мы сегодня обсуждаем.

Темы, которые мы обсуждаем

  • Сформировать задачу классификации
  • Определите матрицу признаков и целевой вектор
  • Создайте модель XGBoost (API, совместимый с Scikit-learn)
  • Опишите показатели «точность» и «площадь под кривой ROC».
  • Объяснение гиперпараметров классификатора XGBoost
  • Создайте модель XGBoost (API, не совместимый с Scikit-learn)
  • DMatrix от XGBoost
  • Создайте небольшое веб-приложение для нашей модели XGBoost с помощью библиотеки Python Shapash
  • Сделайте несколько причудливых визуализаций

Предпосылки

Прежде чем продолжить, убедитесь, что вы прочитали первую статью из серии XGBoost (Путешествие по XGBoost: Milestone 1 - Настройка фона). Это поможет вам настроить собственный компьютер для работы с кодами, обсуждаемыми здесь, и экспериментировать с ними. В дополнение к этому, я также предполагаю, что у вас есть базовые знания о библиотеке Python Scikit-learn ML.

Давайте начнем!

Набор данных о сердечных заболеваниях

Сегодня мы строим нашу первую модель XGBost на наборе данных болезни сердца (скачать здесь). На следующем изображении показаны первые 5 строк набора данных.

Следующее изображение содержит информацию о наборе данных, возвращаемом методом Pandas info ().

В наборе данных нет пропущенных значений. Все значения числовые. Таким образом, предварительная обработка не требуется, и набор данных готов к использованию. Этот набор данных содержит 303 наблюдения и 14 характеристик (включая столбец «цель»).

Теперь мы определяем нашу постановку проблемы.

Постановка проблемы

Основываясь на возрасте, поле, cp,…, thal, мы хотим предсказать, что у данного человека (новый экземпляр) есть болезнь сердца (класс 1) или нет (класс 0). Это проблема классификации, потому что ее результатом является дискретное значение (известный класс). Алгоритм, который мы используем для решения этой проблемы классификации, - XGBoost (XGBClassifier). Итак, мы построим модель XGBoost для этой проблемы классификации и оценим ее производительность на тестовых данных (невидимые данные / новые экземпляры), используя метрики оценки модели, такие как точность и площадь под кривой ROC.

Мы предоставляем матрицу функций и целевой столбец в качестве входных данных для модели XGBoost.

  • Матрица характеристик: называется X. Включает все столбцы, кроме «целевого столбца». Эта матрица может быть в форме Pandas DataFrame или двумерного массива numpy.
  • Целевой вектор: называется y. Включает «целевой столбец» набора данных. Этот вектор может быть в форме серии Pandas или одномерного массива numpy.

После этого модель XGBoost (с параметрами, определяемыми пользователем) изучит правила на основе X и y. Основываясь на этих правилах, мы делаем прогнозы на основе новых или невидимых данных.

Давайте получим практический опыт, написав код Python для построения нашей первой модели XGboost.

Построение модели XGboost

Здесь мы обсуждаем два сценария.

  • Построение модели с помощью API, совместимого с Scikit-learn
  • Построение модели с помощью собственного API XGBoost, не совместимого с Scikit-learn.

По мере нашего продвижения вы увидите разницу между двумя API.

Построение модели с помощью API, совместимого с scikit-learn

Самый простой способ построить модель XGBoost - использовать API, совместимый с Scikit-learn. «Совместимость с Scikit-learn» означает, что вы можете использовать парадигму Scikit-learn .fit () / .predict () с XGBoost. Если вы ранее использовали Scikit-learn, здесь нет ничего нового. Давайте напишем полный код Python для построения модели XGBoost.

Результатом вышеуказанного сегмента кода является:

Точность: 85,2% - это сумма всех правильных прогнозов по тестовой выборке, разделенная на общее количество наблюдений в тестовой выборке. Наша модель правильно предсказывает около 85 из 100 наблюдений. Этот показатель точности неплох для исходной модели, потому что мы еще не настроили модель с оптимальными комбинациями гиперпараметров (часть настройки модели будет обсуждаться позже в 5-й статье серии XGBoost).

Примечание. Если вы установите другое целочисленное значение для параметра random_state в функции train_test_split (), вы получите несколько другие оценки точности. Мы рассмотрим эту проблему также в 4-й статье серии XGBoost.

Площадь под кривой ROC: 91% - ROC - это кривая вероятности, а площадь под кривой (AUC) - это мера разделимости классов. AUC показывает, насколько модель способна различать классы. Чем выше AUC, тем лучше модель предсказывает 0 как 0 и 1 как 1. Очень плохая модель имеет AUC около 0. Если модель имеет AUC 0,5, в этой модели вообще нет разделения на классы. AUC 91% - очень хорошее значение для нашей модели. У него есть много возможностей различать эти два класса.

Давайте объясним приведенный выше код Python построчно.

Сначала мы импортируем все необходимые библиотеки в соответствии со стандартными соглашениями сообщества (xgboost → xgb, numpy → np и т. Д.). Затем мы загружаем набор данных с помощью функции Pandas read_csv (). Набор данных находится в том же рабочем каталоге. Затем мы создаем X и y. Перемешивая набор данных, мы создаем обучающие и тестовые наборы для X и y. Это потому, что нам нужно обучить нашу модель с помощью наборов поездов и оценить нашу модель с помощью наборов тестов - новых или невидимых данных. Мы никогда не тестируем нашу модель с теми же данными, которые использовались на этапе обучения. Если вы это сделаете, вы получите гораздо более высокие показатели точности, но модель не сможет обобщать новые или невидимые данные, и прогнозы на новых или невидимых данных не будут точными.

Затем мы создаем объект XGBoost (называемый xgb_clf) из класса XGBClassifier (). Модель XGBoost для классификации называется XGBClassifier. Мы указали 6 гиперпараметров внутри класса XGBClassifier ().

  • max_depth = 3: Здесь XGBoost использует деревья решений в качестве базовых обучающих. Если задать max_depth = 3, каждое дерево сделает 3 разбиения и остановится на этом.
  • n_estimators = 100: Всего в ансамбле 100 деревьев решений.
  • objective = ’binary: logistic’: имя функции потерь, используемой в нашей модели. binary: logistic - стандартный вариант двоичной классификации в XGBoost.
  • booster = ’gbtree’: это тип базового ученика, который модель машинного обучения использует на каждом этапе повышения. gbtree - это базовое обучающееся приложение XGBoost по умолчанию. С booster = ‘gbtree’ модель XGBoost использует деревья решений, что является лучшим вариантом для нелинейных данных.
  • n_jobs = 2: используйте 2 ядра процессора для выполнения параллельных вычислений для запуска XGBoost.
  • random_state = 1: управляет случайностью, участвующей в создании прядей. Вы можете использовать любое целое число. Указав значение для random_state, вы получите один и тот же результат при разных выполнениях вашего кода.

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

Затем мы получаем тот же результат, запустив XGBoost собственный API, не совместимый с Scikit-learn.

Построение модели с помощью собственного API XGBoost, не совместимого с Scikit-learn.

Другой способ создать модель XGBoost - использовать собственный API XGBoost, не совместимый с Scikit-learn. «Совместимость с Scikit-learn» означает, что вы не можете использовать парадигму Scikit-learn .fit () / .predict () и некоторые другие классы Scikit-learn с XGBoost. . Давайте напишем полный код Python для построения модели XGBoost.

Результатом вышеуказанного сегмента кода является:

Оценка точности такая же, как и у предыдущей! Основное отличие этого API состоит в том, что мы явно создаем специальную структуру данных под названием DMatrix, которая является внутренней структурой данных, используемой XGBoost. Функция XGBoost DMatrix () преобразует объекты, подобные массивам, в матрицы DM. В совместимом с scikit-learn API для XGBoost это преобразование происходит за кулисами, и нам не нужно явно создавать DMatrices. При использовании DMatrices алгоритм оптимизирован как для эффективности памяти, так и для скорости обучения.

Другие отличия этого API:

  • Для обучения модели мы используем собственную функцию train () XGBoost. Ранее мы использовали метод Scikit-learn fit () для обучения модели.
  • Прогнозы возвращаются как вероятности. Нам нужно преобразовать их в классы (целые числа: 0 и 1)
  • С этой моделью XGBoost мы не можем использовать некоторые функции Scikit-learn. Например, мы не можем использовать функцию plot_roc_curve () с моделью XGBoost, созданной с помощью этого API.

Примечание. По возможности я рекомендую вам использовать API, совместимый с XGBoost scikit-learn. Это потому, что его синтаксис очень последовательный и простой в использовании. В дополнение к этому, мы всегда можем в полной мере воспользоваться всеми функциями библиотеки Scikit-learn.

Создание небольшого веб-приложения для обсуждения модели XGBoost с конечными пользователями.

Здесь мы воспользуемся преимуществом библиотеки Python Shapash, цель которой - сделать модели машинного обучения интерпретируемыми и понятными для конечных пользователей, которые не имеют особых технических знаний, но хотят видеть результаты в визуализациях. С помощью всего нескольких строк кода (может быть, 5 или 6) мы можем легко создавать причудливые визуализации с помощью Shapash. Давайте начнем.

Примечание. Чтобы узнать больше о библиотеке Python Shapash, прочтите ее официальную документацию.

Установка

Просто выполните следующую команду в командной строке Anaconda, чтобы установить Shapash. После установки вы можете использовать Shapash в своем блокноте Jupyter с Python.

pip install shapash --user

Создание веб-приложения

После создания модели классификации XGBoost с помощью API, совместимого с XGBoost scikit-learn (запустите Фрагмент кода-1 выше), выполните следующий код, чтобы создать веб-приложение. Метод compile () объекта xpl принимает тестовые данные X (X_test), модель XGboost (xgb_clf). и прогнозы в виде серии Pandas с тем же индексом, что и X_test. Тип данных прогнозов (y_pred_as_series) должен быть целым или плавающим (нам нужно явно определить его как dtype = np.int или dtype = np.float). В противном случае вы получите ошибку.

После запуска ссылка на веб-приложение должна появиться в вашем выводе Jupyter (как вторая ссылка на следующем изображении). Щелкните по нему, чтобы запустить веб-приложение.

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

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

Ниже приведены некоторые графики, созданные из библиотеки Shapash.

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

График влияния характеристик (график скрипки для категориальной переменной)

График влияния характеристик (точечная диаграмма для непрерывной переменной)

Чтобы завершить эту статью, я визуализирую отдельное дерево решений - базовый элемент обучения в нашей модели XGBoost. Следующий код показывает и сохраняет первое дерево решений (с индексом 0) в нашей модели.

Результат:

Резюме

В первой статье из серии статей XGBoost мы только начали путешествие по XGBoost. Там мы настроили среду для запуска XGBoost на наших собственных компьютерах. Сделав еще один шаг вперед, в этой статье мы выполнили задачу классификации с помощью XGBoost. Мы обсудили разницу между двумя API, поддерживающими XGBoost. Помимо этого, мы также создали небольшое (но полезное) веб-приложение для передачи нашей модели конечным пользователям. Замечательно то, что мы написали всего 5 дополнительных строк кода для создания веб-приложения. Веб-приложение очень интерактивное. Добавьте конец статьи, я добавил несколько навороченных визуализаций.

Что следующее? Мы еще не обсуждали математические основы XGBoost. В следующей статье я построю регрессионную модель с помощью XGBoost. Там я также рассмотрю математические основы, такие как «сформулирую цель обучения XGBoost». В этой статье больше внимания было уделено технической части и кодированию, которые очень полезны для реализации алгоритма с реальными наборами данных. Теперь у вас будет практический опыт реализации алгоритма и визуализации результатов для конечных пользователей.

Следите за обновлениями о следующей статье из серии XGBoost!

Спасибо за прочтение!

Это руководство было разработано и создано Рукшаном Прамодитха, автором блога Data Science 365.

Прочтите другие мои статьи на https://rukshanpramoditha.medium.com

2021–03–07