Разбор задач квалификации: ML

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


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

Многие, увидев соревнование по текстам, взялись за классические подходы, такие как TF-IDF или Word2vec. Кто-то даже пробовал использовать SOTA-решения для обработки текстов, но, как оказалось, эвристики, полученные после беглого изучения текстов, даже без машинного обучения выводили на скор 0,8+.

На свой код с хакатонов всегда страшно смотреть, особенно через время. Многие, в том числе и я, к окончанию конкурса не могут воспроизвести свой лучший результат. Так как я параллельно участвовал ещё в двух конкурсах, совсем не хотелось иметь очередной неподдерживаемый код. А тот факт, что я выбрал правильный путь в самом начале, позволил мне сразу удачно оформить проект. В итоге я свел всё к тому, что больше не думал о данных, о фичах, которые уже есть, и названиях полей. Достаточно написать функцию в class, и поле с названием этой функции и значением, рассчитанным в ней, появляется в данных. Например, захотелось мне добавить признак «количество цифр в вопросе» — я просто пишу функцию https://github.com/BraginIvan/vkcup2019/blob/master/analysis/question_based_analytics.py#L63 и запускаю run all fit_predict. Функция применится к данным, создаст поле и рассчитает значение в датафрейме. Захотел что-то переименовать — пожалуйста, захотел удалить — нет проблем. Это позволило сконцентрироваться на ручном изучении данных, а не на вылавливании багов. Никакой магии, просто пробегаем по всем функциям класса, берём их имена и записываем результат их применения в соответствующее поле датафрейма. На Питоне это реализуется в несколько строк кода: https://github.com/BraginIvan/vkcup2019/blob/master/analysis/utils.py#L8.

Мой подход достаточно ленивый: первым сабмитом, после 4–5 часов работы, я получил скор 0,843 плюс легко масштабируемое решение. Это было в первый день соревнования, поэтому конкуренции ещё не было, а соответственно, и мотивации улучшать результат. Через какое-то время меня начали догонять, что придало сил тщательнее разобраться в данных. Я просто час смотрел на данные и выписывал заметки «заглавная/не заглавная первая буква», «пробел перед вопросом в конце»... Потом реализовал все эти функции и получил 0,867. Через какое-то время всё повторилось, и я пришёл к скору 0,887. На платформе ML Boot Camp можно скрывать свои решения, и я был уверен, что многие пробили 0,9, просто не показывают. Но тот факт, что этих скоров не было на лидерборде, не давал достаточной мотивации.

В последний вечер, за час до окончания конкурса, я решил глазами посмотреть на свои предсказания, около часа потратил на то, чтобы проставить нолики вопросам, в которых есть мат и другие нелегко выделимые особенности, но это добавило лишь в четвёртом знаке. Отчаянная попытка пробить 0,9 провалилась, и меня сместили с первого места. Вроде денег я не проиграл, а всё равно как-то расстроился. Не считая попыток что-то поправить руками и некорректных сабмитов, я отправил всего четыре решения, поэтому я догадывался, что не заоверфитился на лидерборд. Так и оказалось, скор на привате практически совпал со скором на паблике и вернул меня на первую позицию.

Так что же зашло, скажете вы? А я и не знаю. Я генерил фичи десятками, запускал обучение, удалял фичи с низкой важностью и не думал о том, что даёт прирост. Все фичи можно найти в классах https://github.com/BraginIvan/vkcup2019/tree/master/analysis, а важность фичей в Jupyter https://github.com/BraginIvan/vkcup2019/blob/master/training2.ipynb. Из оригинального могу отметить несколько идей. Особые кавычки «», которые использовали редакторы, должны не просто присутствовать в тексте, но и быть сбалансированными. CatBoost со своим встроенным обработчиком фичей неплохо обрабатывала такие признаки как «первое/последнее слово в тексте», «самое популярное слово в тексте»... Также важно то, что при метрике AUC желательно не иметь одинаковых скоров, а в данных повторялись вопросы. Я решил их отсортировать по индексу (надеясь, что он сортирован по времени) и пронумеровать, и, по-моему, это немного улучшило результат.

Ждём второго этапа. Думаю, конкуренция возрастёт — туда прошло как минимум два Kaggle Grandmasters.


Источник: m.vk.com

Комментарии: