Практические руководства

Мой секретный соус быть в топ-2% соревнований kaggle

Соревноваться в соревнованиях kaggle - это весело и захватывающе! И за последние пару лет я разработал несколько стандартных способов изучения функций и создания более совершенных моделей машинного обучения. Эти простые, но эффективные методы помогли мне получить верхние 2% места в конкурсе Instacart Market Basket Analysis, и я использую их и вне kaggle. Итак, приступим к делу!

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

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

  1. Понимание особенностей
  2. Выявление шумных объектов (самое интересное!)
  3. Функциональная инженерия
  4. Важность функции
  5. Отладка функций
  6. Обнаружение утечек и понимание
  7. Мониторинг модели

Чтобы сделать его легкодоступным, я решил поместить эти методы в пакет python featexp, и в этой статье мы увидим, как его можно использовать для исследования функций. Мы будем использовать набор данных приложения из конкурса Риск дефолта Home Credit на Kaggle. Задача конкурса - прогнозировать неплательщиков по предоставленным о них данным.

  1. Основные сведения о функциях

Если зависимая переменная (целевая) является двоичной, то диаграммы разброса не работают, потому что все точки лежат либо в 0, либо в 1. Для непрерывной цели слишком много точек данных затрудняет понимание тенденции целевой и характеристики. Featexp создает лучшие графики, которые помогают решить эту проблему. Давай попробуем!

Featexp создает равные интервалы популяции (ось X) числового объекта. Затем он вычисляет целевое среднее значение в каждой ячейке и отображает его на левом графике выше. В нашем случае целевое среднее значение - это не что иное, как ставка по умолчанию. График говорит нам, что клиенты с высокими отрицательными значениями для DAYS_BIRTH (старшего возраста) имеют более низкие показатели по умолчанию. В этом есть смысл, так как молодые люди обычно более склонны к невыполнению обязательств. Эти графики помогают нам понять, что функция говорит о покупателях и как она повлияет на модель. На графике справа показано количество покупателей в каждой ячейке.

2. Выявление шумных объектов

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

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

  1. Корреляция тренда (видно на тестовом графике): если функция не имеет той же тенденции относительно. целевое значение для обучающих и оценочных наборов, это может привести к переобучению. Это происходит потому, что модель изучает что-то, что не применимо в тестовых данных. Корреляция трендов помогает понять, насколько похожи тренды поездов / тестов, и для их расчета используются средние целевые значения для бинов в обучении и тестировании. Функция выше имеет корреляцию 99%. Не кажется шумным!
  2. Изменения тренда: внезапные и повторяющиеся изменения направления тренда могут указывать на шум. Но такое изменение тенденции также может произойти из-за того, что эта корзина имеет совершенно другую совокупность с точки зрения других функций, и, следовательно, ее коэффициент по умолчанию нельзя сравнивать с другими корзинами.

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

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

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

Функция get_trend_stats () в featexp возвращает фрейм данных с корреляцией тенденций и изменениями для каждой функции.

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

Мы видим, что чем выше порог корреляции тренда для отбрасывания функций, тем выше AUC таблицы лидеров (LB). Если не отбрасывать важные функции, AUC LB увеличивается до 0,74. Также интересно и тревожно то, что тестовая AUC не меняется так сильно, как LB AUC. Также важно разработать правильную стратегию валидации, чтобы AUC локального теста соответствовала AUC LB. Весь код можно найти в блокноте featexp_demo.

3. Разработка функций

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

Клиенты, имеющие высокое значение EXT_SOURCE_1, имеют низкие показатели по умолчанию. Но первая корзина (коэффициент по умолчанию ~ 8%) не соответствует тенденции функции (сначала идет вверх, а затем вниз). Он имеет только отрицательные значения около -99,985 и большую популяцию. Это, вероятно, означает, что это особые ценности и, следовательно, они не следуют тенденциям в функциональности. К счастью, у нелинейных моделей не будет проблем с изучением этой взаимосвязи. Но для линейных моделей, таких как логистическая регрессия, такие особые значения и нули (которые будут показаны как отдельная ячейка) должны быть вменены со значением из ячейки с аналогичной ставкой по умолчанию, а не просто вменяться средним признаком.

4. Важность функции

Featexp также поможет вам оценить важность функций. У DAYS_BIRTH и EXT_SOURCE_1 хорошая тенденция. Но совокупность EXT_SOURCE_1 сконцентрирована в специальной корзине значений, что означает, что функция имеет одинаковую информацию для большинства клиентов и, следовательно, не может их хорошо различать. Это говорит о том, что это может быть не так важно, как DAYS_BIRTH. Исходя из важности функции модели XGBoost, DAYS_BIRTH на самом деле важнее EXT_SOURCE_1.

5. Отладка функций

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

  1. Проверка правильности распределения населения объекта. Я лично сталкивался с крайними случаями, подобными описанным выше, много раз из-за мелких ошибок.
  2. Прежде чем смотреть на эти графики, всегда делайте предположения о том, как будет выглядеть тренд функции. Тенденция к особенностям, не похожая на то, что вы ожидали, может указывать на некоторую проблему. И, честно говоря, этот процесс гипотезы тенденций делает построение моделей машинного обучения намного более увлекательным!

6. Обнаружение утечки

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

Для функции ниже значение по умолчанию 0% в ячейке «Нулевые» и 100% во всех остальных ячейках. Ясно, что это крайний случай утечки. Эта функция имеет значение только тогда, когда клиент не выполняет свои обязательства. В зависимости от того, что это за функция, это может быть из-за ошибки или функция фактически заполнена только для неплательщиков (в этом случае ее следует удалить). Если вы поймете, в чем проблема дырявой функции, это ускорит отладку.

Для более точного обнаружения утечек я выпустил еще один пакет python «обнаружение утечек», в котором реализован новый трюк с использованием NAN и комплексных чисел для этой задачи. Проверьте это в другом моем посте, ссылка на который приведена в конце.

7. Мониторинг модели

Поскольку featexp вычисляет корреляцию тенденций между двумя наборами данных, его можно легко использовать для мониторинга модели. Каждый раз, когда модель повторно обучается, новые данные поезда можно сравнивать с хорошо протестированными данными поезда (обычно данные обучения с первого раза, когда вы построили модель). Корреляция тенденций может помочь вам отслеживать, изменилось ли что-нибудь в функции w.r.t. его отношения с целью.

Выполнение этих простых вещей всегда помогало мне создавать лучшие модели в реальной жизни и на kaggle. С featexp на просмотр этих графиков уходит 15 минут, и это определенно того стоит, поскольку после этого вы не будете летать вслепую.

Какие еще уловки и советы вы считаете полезными для изучения функций? Я всегда жду обратной связи. Дайте мне знать в комментариях или напишите мне на [email protected]. Подписывайтесь на меня в твиттере (https://twitter.com/abhayspawar), если хотите и дальше получать от меня известия :)

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