Привет, чемпион! Возможно, перед тобой сейчас стоит задача построить предиктивную модель, или ты просто фармишь Kaggle, и тебе не хватает идей, тогда эта статья будет тебе полезна!
Наверное, уже только ленивый не слышал про Data Science и то, как модели машинного обучения помогают прогнозировать будущее, но самое крутое в анализе данных, на мой взгляд, - это хакатоны! Будь-то Kaggle или локальные соревнования, везде примерно одна задача - получить точность выше, чем у других оппонентов (в идеале еще пригодную для продакшена модель). И тут возникает проблема...
С одной стороны, все используемые модели давно известны и реализованы, с другой стороны, находятся победители, которым удается реализовать решение, которое на тех же библиотеках и на тех же данных дает наилучших скор. Вот как они это делают? Как лидеры вырываются вперед? В чем магия? - Что ж, сейчас я поделюсь с вами несколькими трюками, как можно выжать максимум из данных и ваших моделей.
Работа с данными
Опустим банальные вещи типа нормировки численных значений или кодирование категориальных переменных, а сразу перейдем к обсуждению чистки данных.
В данных почти всегда будут "грязь" и пропуски. Грамотная обработка этих проблем может сильно продвинуть вас в построении качественной модели.
Начать стоит с заполнения численных значений средним или медианой, а если говорим про категориальные переменные, то заполняем их пропуски самыми популярными значениями. Для этого уже есть готовые элементы из Sklearn, например SimpleImputer.
Более умный способ - посмотреть на данные пристальным взглядом и попытаться понять природу пропусков. Приведу два примера из личного опыта:
Классификация временных рядов - три идея для рассмотрения - 1) Заполнить пропуски средним значением двух соседних точек слева или справа. 2) Попытаться дорисовать ряд, исходя из направления тренда ряда 3) Дорисовать, смотря на похожие образцы (тут поможет KNNImputer).
Еще один пример из моего опыта - кредитный скоринг - у пользователей в данных было много пропусков, очень помогло: 1) посмотреть на этих пользователей в какой-то момент времени в прошлом. Здесь я заметил, что есть переменные, которые почти не меняются во времени, например, род деятельности. Такие пропуски можно заменить значениями из прошлого. 2) Также обнаружил, что крупная часть пользователей не имеет никаких признаков кроме id самого пользователя и id контракта. Тут ничего с пропусками не сделаешь, но зато мы это заметили! Эту информацию можно будет использовать при генерации новых признаков.
Генерация признаков (Feature Engineering)
Мой любимый пункт по увеличению точности модели, так как здесь понимаешь, что анализ данных это не просто наука, это иногда искусство. Разберем этот пункт на примере задачи классификации. Чтобы облегчить жизнь вашей модели и позволить ей лучше решать эту задачу, вам стоит генерировать признаки так, чтобы они позволяли разделить ваши объекты на классы.
Вот пример.
На рисунке цвет временного ряда отражает его класс. Как видите, помимо использования сырых данных, новые признаки позволяют проще классифицировать временные ряды.
Выбор модели
Хорошо, вот вы почистили и сгенерировали новые признаки дэйта на взводе. Что теперь? Втыкаем линейную регрессию и залетаем в топ лидерборда? - В крайне редком случае это так, и линейные модели дают лучший скор, но как показывает практика, на табличных данных лучше всего "стреляют" градиентные бустинги.
Вам пригодятся три из них: Catboost, LightGMB и Xgboost. Каждый из этих бустингов имеет под капотом свой собственный алгоритм построения дерева решений. Интернет завален примерами и тьюториалами по этим алгоритмам, поэтому просто скажу - используйте! Один только сatboost из коробки дает такой бейзлайн, что придется еще постараться, чтобы побить его. Вот пример моего кода с использованием catboost. Стоит взять и попробовать самый любимый каждый из них в вашей задаче.
Замечание: успех выбора модели сильно зависит от данных и ваших навыков тюнить эти модели. Об этом позже сделаю отдельную статью, но это неточно.
Тюнинг моделей - model tuning
Хорошо, у нас в обойме готовые данные и заряженный бустинг, но точность все равно пока еще оставляет желать лучшего?! Не беда - время для "танцев с бубном"!
Делом в том, что не достаточно просто взять модель и накинуть ее на имеющиеся данные, если ваша цель - оказаться в лидерах турнирной таблицы. Чтобы поднять скор, необходимо погрузиться в данные еще глубже, а также основательно поработать с гиперпараметрами модели.
В подборе гиперпараметров модели всегда есть рабочее решение: втыкаем GridSearch, а лучше Optuna и ждем час другой, пока не подберутся оптимальные параметры. Однако, изучение данных и признаков - задача более трудная.
Отбор признаков - feature selection
Если в ваших данных есть несвязанные с целевой переменной признаки, то, с большой вероятностью, вы получите менее точный результат. И это случится независимо от используемой модели машинного обучения. Чтобы избежать потери точности, необходимо откинуть все ненужные признаки, но как это сделать?
Пройдусь кратко по списку подходов, с помощью которых можно почистить признаки:
Корреляция Пирсона - классический способ, который, однако, чувствителен к шуму и подходит только для задачи регрессии или бинарной классификации.
Feature Importance - удобный и понятный подход, но деревья часто извлекают зависимости там, где их нет. Метод можно усилить, сопоставив исследуемый признак с рандомным. Все признаки, которые оказались менее важными, чем Random, рассматриваем в качестве "кандидатов" на удаление.
![](https://habrastorage.org/getpro/habr/upload_files/0ae/44b/93f/0ae44b93f18a23f1af845516041d3da4.png)
Permutation Importance - один из моих фаворитов, но из предостережений - может долго считаться и требует внимательности, чтоб не подсмотреть в тест.
![](https://habrastorage.org/getpro/habr/upload_files/fc0/8d7/4af/fc08d74af22198c7db4d95e94aece2ca.png)
OLS модель + отсев по p-value - must have, если вы строите интерпретируемую модель и хотите качественно отфильтровать весь мусор.
Визуальный осмотр - вот это уже мой настоящий фаворит. Если время и размер признаков позволяют изучить каждый по отдельности, то такой способ позволит рассудить шумные признаки, которые предыдущие методы решили отсеять.
Понижение размерности - если совсем лень возиться с шумом в данных, то просто понижаем размерность с помощью PCA, UMAP или t-SNA. Точность вряд ли подрастёт, но так модели будут обучаться пободрее.
Итоги:
Мы разобрали несколько способов увеличения точности модели. Конечно, это только малый список подходов. В реале существуют сотни других трюков и хитростей, как еще можно увеличить точность моделей. Если вам интересно узнать больше о таких трюках, то я публикую подобные идеи в своем канале. Более того, в моих планах - продолжать делиться секретами успешных кейсов из собственной практики на Хабре - ждите!
Канал в телеграм