Это отчет о моем подходе к Олимпиаде по науке о данных 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/