Это отчет о моем подходе к Олимпиаде по науке о данных 2019, которая прошла в Париже и Берлине 23 мая 2019 года.

Олимпиада по науке о данных — это небольшое соревнование, которое собирает около 1000 участников, от новичков до экспертов. Целью обычно является Kaggle-подобная классификация или регрессия.

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

Задача 2019 года заключалась в том, чтобы спрогнозировать, за сколько времени выдается социальное жилье семьям, оказавшимся в чрезвычайной ситуации. Целевое поле разделено на 4 категории, от 0 до 3. 0 – отсутствие предоставления социального жилья, а от 1 до 3 – от предоставления краткосрочного до долгосрочного жилья. Набор данных представлял собой 1 файл csv размером 100 МБ, содержащий различные поля, такие как семейное положение, количество детей, ожидаемые дети, тип запроса и т. д. Задача дает вам блокнот Python и файл R, которые уже загружают данные, запускают логистическую регрессии и отправить решение. Это позволяет всем сосредоточиться только на части науки о данных.

Глядя на данные

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

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

Глядя на оценку

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

Это интересная потеря, которая подчеркивает ошибки на более высоких метках. Ошибка на долгосрочной категории 3 будет стоить в 1000 раз дороже, чем ошибка на 0.

Улучшение модели

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

  • Добавить веса классов. Просмотр определения потерь побудил меня придать вес своим классам, чтобы модель могла обучаться в соответствии с оценочной метрикой. В Scikit обычно есть аргумент class_weight, который позволяет указать веса, связанные с классами. Просто добавление этого аргумента заставило меня прыгнуть в десятку лучших работ в начале конкурса.
  • Добавьте дополнительные поля. В базовой логистической регрессии использовались только 3 числовых столбца, которые на самом деле были категориальными значениями.
  • Попробуйте другие алгоритмы. Я хотел попробовать классификаторы случайного леса, поскольку они обычно хорошо справляются с задачами такого типа. Затем, если бы у меня было время, я хотел бы попробовать LightGBM.

Добавление дополнительных полей

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

Начав с простого, я использовал OrdinalEncoder для большинства текстовых столбцов. Глядя на данные, некоторые столбцы оказались более важными, чем другие, поэтому я преобразовал их с помощью OneHotEncoder. Я не мог сделать это для всех столбцов, так как было слишком много значений и было бы создано слишком много столбцов.

Другие модели

Теперь, когда обучающие данные были преобразованы, пришло время попробовать другие модели. Я пробовал SVC и RandomForestClassifier. К моему удивлению, классификатор случайного леса был очень плохим с большим количеством оценок. Мне пришлось выполнить поиск по сетке метапараметров, чтобы найти что-то лучшее, чем логистическая регрессия.

Результаты и выводы

Я занял 27-е место в таблице лидеров после двух часов. Мой лучший результат был 0,68. В итоге я даже не пробовал модель LightGBM, потому что не был на 100% знаком с API и документацией. Я решил не терять на это время и продолжить копать с помощью Scikit.

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

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

Код можно найти здесь https://github.com/clemkoa/datascience-olympics-2019

Открыт постсоревновательный вызов, зарегистрироваться и найти его можно здесь: https://qscore.datascience-olympics.com/