В части 1 (вы можете прочитать ее здесь) я обсудил экономическое обоснование для прогнозирования конверсии посетителей в клиентов для интернет-магазина и рассмотрел исследовательский анализ данных набора обучающих данных.

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

Итак, без лишних слов, перейдем к предварительной обработке данных!

  1. Предварительная обработка данных

«Что посеешь, то и пожнешь». Эта пословица, столь верная для жизни в целом, во многом верна и для науки о данных! Мы не можем вводить дерьмовые данные в наши алгоритмы и ожидать, что они волшебным образом дадут нам точные прогнозы.

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

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

Ключевые элементы используемой мной стратегии предварительной обработки данных:

  1. Выполните одноразовое кодирование всех категориальных атрибутов
  2. Преобразование непрерывных и дискретных атрибутов, которые представлены в строковой форме в наборе данных, в плавающую форму
  3. Масштабируйте все числовые (непрерывные и дискретные) атрибуты
  4. Объедините все атрибуты точки данных в один список с каждым значением в диапазоне от 0 до 1.
  5. Создайте фреймворк Panda для наборов данных обучения и тестирования

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

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

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

XGBoost: для реализации алгоритма XGBoost (нажмите здесь)

Imblearn: для работы с несбалансированными наборами данных (нажмите здесь)

Hyperopt: для оптимизации гиперпараметров XGBoost (нажмите здесь)

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

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

  1. load_csv: эта функция открывает файл csv и создает список списков, где каждый список представляет собой одну точку данных набора данных обучения / тестирования.
  2. str_column_to_float: эта функция преобразует строковую запись в указанном столбце набора данных в запись с плавающей запятой.

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

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

В этом наборе данных было 7 категориальных атрибутов, и я обработал их, используя скрипт, показанный ниже:

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

Следующим шагом является преобразование непрерывных и дискретных атрибутов, которые представлены в строковой форме в наборе данных, в плавающую форму. Эти атрибуты иногда присутствуют в CSV-файле в строковой форме, и их сначала необходимо преобразовать в тип данных с плавающей запятой. Приведенный ниже сценарий преобразует 10 атрибутов, таких как частота выхода, показатель отказов и т. Д., И значение y (статус дохода, 0 или 1) из строковых значений в значения с плавающей запятой.

Третий шаг - масштабировать все числовые атрибуты. Масштабирование особенно важно, когда диапазоны различных атрибутов данных сильно различаются. Хотя деревья решений не так чувствительны к разным диапазонам атрибутов данных, как, например, нейронные сети, многие специалисты по данным по-прежнему считают лучшей практикой масштабирование входных функций до того, как они будут загружены в алгоритмы. Я применил масштабатор min-max, который сопоставляет каждый атрибут со значением от 0 до 1.

Теперь у нас есть набор данных, в котором некоторые функции представляют собой масштабированные значения в диапазоне от 0 до 1, а другие функции представляют собой списки единиц и нулей, созданные OHE. Моя цель - создать входную матрицу X, состоящую из всех атрибутов точки данных, объединенных в единый список.

Итак, на следующем шаге я объединил 10 масштабированных значений в один список:

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

Значения x и y обучающих данных извлекаются и помещаются в отдельные списки:

Затем я преобразовал данные x_train и y_train в фрейм данных Panda.

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

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

2. Реализация классификатора RandomForest:

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

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

Я использовал библиотеку RandomForestClassifier () из scikit-learn и подобрал модель с использованием обучающих данных (я не настраивал гиперпараметры для RandomForest, поэтому здесь нет проверки)

Я обнаружил, что RandomForest дал roc_auc_score 0,89. Хотя эта оценка разумна, я почувствовал, что пришло время перейти к XGBoost и настроить его, а не тратить время на настройку RandomForest, поскольку маловероятно, что настроенный RandomForest даст более высокий roc_auc_score, чем настроенный XGBoost.

3. Реализация классификатора XGBoost:

eXtreme Gradient Boosting - это хорошо известный алгоритм обучения, который по ходу добавляет больше деревьев решений, пока не станет заметным улучшения в задаче классификации / регрессии. Мягкое введение в его работу и параметры, используемые для обучения XGB, доступно здесь.

Первоначально я использовал настройки XGB по умолчанию, обучил его на обучающем наборе и обнаружил, что его roc-auc_score на тестовом наборе был впечатляющим 0,916

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

Следующим шагом для меня была оптимизация гиперпараметров XGBoost, которые я опишу в следующем разделе.

4. Оптимизация гиперпараметров для XGBoost:

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

Я применил методологию, упомянутую здесь для настройки гиперпараметров.

Я определил пространство параметров со словарем, содержащим имена и диапазоны различных гиперпараметров, и целевой функцией, чтобы найти набор параметров, который максимизирует roc_auc_score (минимизирует 1-roc_auc_score). Затем я провел 1000 испытаний (кажется, много, но на самом деле это крошечная часть исчерпывающей комбинации параметров ~ 75000000000), чтобы найти (почти) оптимальную настройку гиперпараметров. Выполнение этого прогона заняло почти 1 час.

Полученные мной оптимальные настройки гиперпараметров показаны в приведенном ниже коде:

Процедура оптимизации была особенно полезна в поиске правильной комбинации настроек для Learning_rate, max_depth, reg_alpha и reg_lambda.

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

Результаты:

Используя оптимизированный XGB, я получил 0,9318 roc_auc_score! Хотя я, возможно, мог бы провести дополнительную оптимизацию, чтобы улучшить его, учитывая время и количество попыток ограничения, я чувствовал, что это было достаточно хорошо. Это подводит меня к важному уроку:

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

Я был под 17-м номером из 131, хороший скачок с минимума, когда я был на уровне 70 из 90 в какой-то момент :) Я получил огромное удовольствие от долгих усилий на этой неделе со множеством взлетов и падений!

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

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

Я вернусь, чтобы поделиться своим опытом с еще одним Data Challenge в ближайшее время!

Большое спасибо за чтение!