Откуда появилась такая задача

Задача такую поставил нам Центробанк в рамках всероссийского хакатона «Цифровой прорыв» который проходил в Нижнем Новгороде 8–10 сентября 2023 года. Наша команда заняла первое место по данной задаче с неплохим отрывом по скору.

Подробная формулировка задачи

Дан датасет размером 1200 записей, каждая из которых имеет 3 колонки: текст пресс релиза, категория пресс релиза и уровень рейтинга. Категория пресс релиза это колонка которая принимает 7 значений: AAA, AA, A, BBB, BB, B, C. Категория пресс релиза представляет из себя обобщенный уровень рейтинга пресс релиза. Сам уровень кредитного рейтинга представляет из себя колонку из 17 возможных значений: AAA, AA+, AA, AA-, A+, A, A-, BBB+, BBB, BBB-, BB+, BB, BB-, B+, B, B-, C. Задача заключается в том чтобы научиться классифицировать пресс релизы по категориям и по уровням кредитного рейтинга.

Как проходил этап валидирования модели и подсчета результатов

Общая точность модели считалась так: 0.35 * f1(от категорий кредитного рейтинга) + 0.65 * f1(от уровня кредитного рейтинга). Помимо классификации рейтингов нужно научиться интерпретировать модель так как финтеху часто помимо просто ответа на вопрос нужно обоснование.

Помимо метрики оценки качества модели еще был ряд критериев о работоспособности приложения (в итоге сдать мы должны были готовый рабочий сервис в виде веб приложения). На них подробно останавливаться не будем. Достаточно знать что итоговая оценка считалась как метрика точности модели умноженная на сумму всех критериев о работоспособности приложения

Решение задачи классификации

По своей сути перед нами стояло 2 задачи классификации: научиться восстанавливать категорию кредитного рейтинга из пресс релиза (далее укрупненные классы) и научиться восстанавливать уровень кредитного рейтинга из пресс релиза (далее детализированные классы). Мы решали задачу классификацию на детализированных классах и восстанавливали из них укрупненные.

Первое что пришло в голову как можно решить данную задачу не используя тяжелую артиллерию (трансформеры и языковые модели) - использовать tfidf + random forest. Логика данного подхода проста: лемматизируем контент, обучаем на нем tfidf vectorizer и строим вокруг этого random forest. Ссылка на обучение бейслайна. Плюс данного решения в том что понятно как легко интерпретировать модель, можно просто взять максимальные значения с tfidf'а. Также эта модель обучилась достаточно быстро (буквально 2 минуты) что дало нам понять в начале хакатона какого примерно скора нам следует ожидать. Данная модель на тестовой выборке показала метрику по взвешенному f1 по детализированным классам примерно равный 0.62. Теперь поговорим про минусы данного подхода. Во-первых, tfidf переобучился на названиях компаний, что показали нам результаты интерпретации, что является не хорошим показателем так как дополнительное условие задачи заключалось в том что модель должна отрабатывать на синтетических данных (по факту которые являлись анонимизированными данными где вместо реальных названий компаний были несуществующие) по метрике f1 на укрупненных данных больше 0.33 иначе общая оценка умножалась на 0.1. Конечно, такая проблема решается банальным добавлением стоп слов в векторизатор, но мы пошли ресерчить альтернативные идеи решения данной задачи.

Данную задачу также можно было решить при помощи языковой модели. Также чтобы понять что от такого подхода можно ожидать мы взяли достаточно маленькую языковую модель: ruBert tiny и обучили ее на задачу мультиклассификации. Интерпретировать такую модель тоже понятно как: есть библиотека captum которая реализует различные методы интерпретации трансформеров. (тетрадь с обучением берта можно найти здесь). Данный подход показал значение 0.72 по метрике f1 на детализированных классах, что является несомненно лучше чем подход с tfidf. Помимо этого нами было выявлено что модель не переобучилась на названиях компаний в отличие от tfidf, значит она будет хорошо отрабатывать на синтетических данных. После успешного обучения игрушечного берта мы решили взять большой, но потом поняли что не будем его использовать так как время инференса и просчета методов интерпретации существенно увеличилось, что очень сильно сказалось на пользовательском опыте в итоговом веб сервисе.

Дополнительные методы интерпретации

Задачу классификации мы как-то решить смогли. Интерпретировать результаты моделей тоже вроде научились. Но наша команда задалась вопросом: а можно ли придумать еще способ интерпретации результатов? Оказалось что да, помимо этого мы придумали еще дополнительный метод решения задачи. Суть метода такова: выделим из абзацев пресс релизов обучающей выборки фичи и запихнем в векторный поиск. Результат предсказания будет считаться как наибольшая метрика по среднему взвешенному (взвешивать мы будем относительно расстояния между векторами) по близжайшим найденным похожим по смыслам абзацам входного пресс релиза. Данный подход мы не измеряли метриками так как использовали его чисто как метод для интерпретации результатов, однако на итоговый скор этот метод повлиял положительно.

У нас есть куча способов решить задачу, как выбрать лучший?

Никак. Мы загнали все метрики в кэтбуст и получили прирост к итоговой оценке, которая являлась 0.8 по метрике f1 на детализированных классах. Конечно на валидационных данных метрика упала до 0.76 что сигнализирует о легком переобучении, но с таким объемом данных не переобучиться почти невозможно.

Инференс модели и взаимодействие с пользователем

Инференс модели был написан на fastapi и затем успешно обернут бекендером в Django. Такой подход использовался чтобы по одной ручке фронтенд мог получать полный ответ на запрос включая постобработку и предобработку самим бекендом (например OCR как пример задачи предобработки и генерация документов в формате pdf и docx как пример задачи постобработки). Фронтенд был написан на React и по сути состоял из 3 экранов:

  1. Экран загрузки

Интерфейс экрана загрузки
Интерфейс экрана загрузки

На этом экране пользователь может вставить текст пресс релиза либо загрузить один или несколько файлов с текстами. Также возможна загрузка картинки с текстом пресс релиза, она обработается с помощью OCR.

  1. Экран просмотра загруженный и обработанных документов

Как выглядит экран обработанных документов
Как выглядит экран обработанных документов

Здесь пользователь может посмотреть на результат обработки документов пресс релизов. Как говорилось ранее — документы обрабатываются по 3 метрикам а затем выдается общая оценка при помощи CatBoost. Также помимо итоговых оценок пользователь может посмотреть суммаризированный текст пресс релиза.

  1. Экран детализированного просмотра документа с визуализацией результатов

Экран с отображением результатов
Экран с отображением результатов

Здесь как раз показано как работают интерпретации моделей различных способов. Если хотите подробнее узнать как у нас интерпретируются все модели можете посмотреть скринкаст.

Команда

На хакатоне мы участвовали втроем:

  • Василенко Илья — ML разработчик. Он решил задачу классификации и интерпретации результатов с точки зрения машинного обучения (обучил модель, написал инференс)

  • Карпов Александр — Backend разработчик. Он обернул мль модель в удобный для фронтенда интерфейс и также написал инференс модели суммаризации, OCR и генерацию отчетов в формате docx pdf

  • Торбеев Павел — Frontend разработчик. Он написал такой красивый фронтенд.

    У нашей команды также есть канал в тг где мы публикуем другие наши победные кейсы на хакатонах и выкладываем исходный код решений

Пару слов о хакатоне

На хакатоне «Цифровой прорыв» наша команда участвует не в первый раз, мы регулярно выигрываем этот хакатон с 2020 года. На этот раз мы поехали из Санкт‑Петербурга в Нижний Новгород на всероссийский этап. И хоть Нижний нас встретил дождем и температурой +10 и мы все заболели к началу хакатона, это не помешало нам достойно выступить и показать результат. С точки зрения организации все было как обычно — на высшем уровне, правда иногда пугали внезапные сообщения от спикеров о начале встречи или о грядущих чекпоинтах, но к концу хакатона привыкаешь. Ловите пару фоток, чтобы проникнуться атмосферой хакатона

Это мы узнали, что победили, но 2 других участника команды уехали домой
Это мы узнали, что победили, но 2 других участника команды уехали домой
Это заключительный чекпоинт, где мы уже все были измотанные, но нас ждала еще одна ночь перед дедлайном
Это заключительный чекпоинт, где мы уже все были измотанные, но нас ждала еще одна ночь перед дедлайном
,А это организаторы разыгрывают мерч
,А это организаторы разыгрывают мерч

Комментарии (0)