Вот как я оказался на 18-м месте в таблице лидеров (я по ошибке оказался анонимным) на хакатоне AmExpert 2018 - Машинное обучение (ML), организованном Analytics Vidhya при спонсорской поддержке American Express. Цель состоит в том, чтобы спрогнозировать вероятность клика по объявлению. Прогноз должен быть для определенного веб-сеанса, который принадлежит определенному пользователю с его характеристиками и параметрами, определяющими категорию продукта. отображается.

Данные имеют таблицы Train, Test и History. Данные по обучению охватывают период с 1 по 5 июля 2017 года, а данные тестирования - за следующие несколько дней, с 6 по 7 июля 2017 года. В таблице истории есть данные о кликах пользователей за последние пару месяцев. Сводка данных обучения приведена ниже:

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

Быстрый анализ данных

Определите частичное совпадение пользователей, типов продуктов, данных о поездах, тестах и ​​данных истории. Это очень полезно, поскольку показывает, что почти 60% участников поезда также доступны в тесте. Поскольку все столбцы в данных имеют категориальный характер, я попытался увидеть распределение для положительного и отрицательного классов. Я не включаю здесь эти подробности.

Стратегия перекрестной проверки (CV)

Да, это называется стратегией, в которой вы должны иметь возможность максимально точно имитировать тестовые данные. Я попытался составить местное резюме с данными о поездах за последние 2 дня. По моему опыту, было несколько проектов, которые не были запущены в производство, потому что не удалось правильно определить резюме. Хочу отметить замечательную статью, опубликованную здесь Рэйчел Томас из Fastai.

Функциональная инженерия:

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

Вот некоторые из работавших здесь функций:

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

df['hour'] = df['DateTime'].dt.hour.astype('uint8')

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

Уникальная особенность, которая помогла повысить местный рейтинг CV, - это выявление доверия к определенным продуктам, кампаниям, которые могут иметь более высокую частоту is_click, чем другие. Интуитивно мы пытаемся определить те категории или комбинацию категорий, которые имеют более высокую вероятность клика.

Я рассчитываю следующие показатели кликов, используя P (is_click | Product) или их комбинацию, используя P (is_click | Product, Gender). Однако комбинация категорий имеет очень мало кликов, поэтому нельзя доверять статистической значимости приведенных выше уравнений. Поэтому мы можем взвесить ставки, используя формулу доверительной вероятности log (Вероятность) / log (100000).

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

Я многому научился в Feature Engineering, наблюдая за соревнованиями по машинному обучению, подобными этому, и на Kaggle. 2 лучших ядра Kaggle, которые я использовал в этом конкурсе: link1, link2

Обучите модель ML и отправьте

Я сразу перешел к Gradient Boosting Machines, который довольно популярен для многих структурированных типов данных. Я сделал среднее значение вероятностей, предсказанных с использованием 5-кратного CV XGBoost и LightGBM.

Полный код доступен в моем репозитории Github @ ссылка

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

Всегда рад отзывам и предложениям, поделитесь своими мыслями.