В этой статье я расскажу историю о том, как решался конкурс.
Учебный лагерь по ML V «Прогнозирование сердечно-сосудистых заболеваний» и заняла в нем второе место.
Постановка задачи и данные
Данные содержало 100 000 пациентов, из которых 70% находились в обучающей выборке, 10% для публичной таблицы лидеров (публичной) и финальные 20% (частной), по которым определялся результат конкурса.Данные явились результатом врачебного осмотра пациентов, на основании которого необходимо было спрогнозировать наличие у пациента сердечно-сосудистых заболеваний (ССЗ) или нет (эта информация была доступна для 70% и необходимо было спрогнозировать вероятность сердечно-сосудистых заболеваний для оставшиеся 30%).
Другими словами, это классическая задача бинарной классификации.
Метрика качества – потеря журнала .
Результат медицинского осмотра состоял из 11 признаков:
- Общие – возраст, пол, рост, вес.
- Объективно – верхнее и нижнее давление, уровень холестерина (3 категории: норма, выше нормы) и глюкозы в крови (также 3 категории).
- Субъективный – курение, алкоголь, активный образ жизни (бинарные характеристики).
Выборка была сбалансированной.
Высота, вес, верхнее и нижнее давление нуждались в очистке, так как содержали опечатки.
Перекрестная проверка
Первый важный момент — правильная перекрестная проверка, поскольку в тестовых данных отсутствовали данные в полях дым, алкоголь, активный.Поэтому в проверочной выборке 10% этих полей также были скрыты.
Используя 7 сгибов перекрестной проверки (CV) с модифицированным набором проверки, я рассмотрел несколько различных стратегий улучшения прогнозов по дыму, алкоголю и активности:
- Данные обучения оставьте как есть (при валидации пропущено 10% значений в Smoke, Alco, Active).
Этот подход требует алгоритмов, способных обрабатывать пропущенные значения (NaN), например — XGBoost .
- Скройте 10% при обучении, чтобы обучающий набор больше походил на проверочный набор.
Этот подход также требует алгоритмов, которые могут работать с NaN.
- Прогнозируйте NaN при проверке с использованием трех обученных классификаторов
- Замените признаки дыма, алкоголя, активности предсказанными вероятностями.
Сокрытие при обучении практически всегда показывало лучшие результаты CV, а оптимальная доля скрытых значений при обучении также составляла 10%.
Хочу добавить, что если использовать стандартную перекрестную проверку без сокрытия значений при проверке, то CV получилось лучше, но завышенным, так как тестовые данные в этом случае не похожи на локальную проверку.
Корреляция с таблицей лидеров
Интересный вопрос, который всегда волнует участников, — корреляция между CV и данными тестирования.Уже имея полные данные после завершения конкурса (ссылка), я провел небольшой анализ этой корреляции.
Почти для всех заявок я записывал результаты резюме в описание.
Имея также результат для публичного и частного, построим попарные графики подчинения для значений CV, public, Private (Поскольку все значения logloss начинаются с 0,5, для наглядности я опустил первые цифры, например, 370 — это 0,5370 , а 427,78 — это 0,542778):
Для получения численной оценки корреляции я выбрал коэффициент Спирмена (подойдут и другие, но в данном случае важна именно монотонная зависимость).
Копейщик ро | резюме | Общественный | Частный |
---|---|---|---|
резюме | 1 | 0.723 | 0.915 |
Общественный | - | 1 | 0.643 |
Частный | - | - | 1 |
Небольшие примечания: я не подписывал результат CV для всех заявок, и среди данных CV есть результаты с не лучшими стратегиями работы с NaN (но подавляющее большинство с лучшей стратегией, описанной в предыдущем разделе).
Кроме того, эти графики не включают две мои последние работы, о которых я расскажу позже.
Я изобразил их отдельно в публично-частном пространстве красной и зеленой точкой.
Модели
В ходе этого конкурса я использовал следующие модели с соответствующими библиотеками:- Регуляризованное повышение градиента (библиотека XGBoost ) — основная модель, на которую я опирался, так как она показала лучшие результаты в моих экспериментах.
Кроме того, большинство средних построено всего на нескольких xgb.
- Нейронные сети (библиотека Керас ) — экспериментировал с сетями прямой связи, автоэнкодерами, но не смог превзойти мой базовый уровень от xgb даже в усреднении.
- Различный запоминать модели, участвовавшие в усреднении с помощью xgb — RF, ExtraTrees и т.д.
- Укладка (библиотека заваривать ) — улучшить базовое усреднение нескольких разных xgb не удалось.
Также, помимо банального оптимального количества деревьев, после такого поиска я попробовал поочередно подтянуть параметры (в основном параметры регуляризации деревьев min_child_weight и reg_lambda) — метод, который некоторые называют аспирантским спуском.
Очистка данных I
Первый вариант очистки данных, вариант которого был в той или иной степени реализован участниками, заключался в простом применении правил обработки выбросов:- Для давлений типа 12000 и 1200 – делим на 100 и 10.
- Умножьте на 10 и 100 для давлений типа 10 и 1.
- Вес типа 25 заменен на 125.
- Замените высоту 70 на 170.
- Если верхнее давление меньше нижнего, поменяйте местами.
- Если нижнее давление равно 0, то заменить его на верхнее минус 40.
- и т. д.
В моих экспериментах удаление выбросов не улучшило CV.
Очистка данных II
Предыдущая очистка данных была вполне адекватной, однако после многих попыток улучшить модели я пересмотрел ее более тщательно, что значительно улучшило качество.Последующие модели с такой чисткой показали рост CV до ~0,5370 (с ~0,5375), публичные до ~0,5431 (с ~0,5435).
Основная идея заключается в том, что каждое правило имеет исключение.
Мой процесс поиска таких исключений был довольно рутинным — для небольшой группы (например, людей с верхним давлением между 1100 и 2000) я смотрел значения в поезде и тесте.
Для большинства, конечно, работало правило «разделить на 10», но всегда были исключения.
Проще было менять эти исключения отдельно для примеров, чем искать общую логику исключений.
Например, выделившиеся из общей группы давления, такие как 1211 и 1620, я заменил на 120 и 160. В некоторых случаях корректно обработать исключения можно было только включив информацию из других полей (например, о связи верхнего и нижнего давления).
Так, давления вида 1/1099 и 1/2088 были заменены на 110/90 и 120/80, а 14900/90 заменены на 140/90. Наиболее сложные случаи были, например, при замене давления 585 на 85, 701 на 170, 401 на 140. В сложных, менее простых случаях я проверял, насколько поправки схожи с обучением и тестированием.
Например, случай 13/0 я заменил на 130/80, так как он наиболее вероятен.
За исключениями из обучающей выборки мне также помогли знания в области ССЗ.
Очень важный момент – отличить шум от сигнала, в данном случае опечатки, от реальных аномальных значений.
Например, после чистки у меня осталась небольшая группа людей с артериальным давлением 150/60 (у них на тренировке ССЗ, их артериальное давление укладывается в один из категории ССЗ) или ростом около 90 см при небольшом весе.
Добавлю, что основной прирост произошел от клирингового давления, при этом было много неясностей с ростом и весом (обработка роста и веса тоже основана на поиске исключений с дальнейшим применением общего правила).
Используя опубликованный полный набор данных после соревнований мы обнаруживаем, что эта уборка затронула 1379 объектов на тренировках (1,97%), 194 на публичных (1,94%), 402 на частных (2,01%).
Конечно, исправление аномальных значений для 2% набора данных было не идеальным и можно было сделать лучше, но даже в этом случае наблюдалось наибольшее увеличение CV. Стоит только отметить, что после чистки или работы с фичами необходимо найти более оптимальные гиперпараметры алгоритмов.
Работа с признаками и их дискретизация
Первоначально возраст был разделен на 365,25, чтобы работать с годами.Распределение по возрасту было периодическим: гораздо больше пациентов были четными годами.
Возрасты представляли собой гауссову смесь с 13 центрами в четные годы.
Если просто округлить по годам, то CV в четвертом знаке улучшился на ~1-2 единицы по сравнению с исходным возрастом.
На рисунках показан переход от исходного возраста к округленному до ближайшего года.
Однако для улучшения распределения по годам я также использовал другую дискретизацию, которую включил в окончательную простую модель.
Вершины распределений в гауссовской смеси были найдены с использованием гауссовского процесса, а «год» определялся как половина гауссовского распределения (справа и слева).
Таким образом, новое распределение по годам выглядело более равномерным.
На рисунках показан переход от исходного возраста (с найденными вершинами гауссовой смеси) к новому распределению по «годам».
ИМТ (индекс массы тела =
) впервые появился в важности особенностей.
Добавление исходного ИМТ улучшило результат, однако наибольшего улучшения модели достигли после дискретизации его значений.
Порог выборки выбирался на основе квартилей, а количество определялось на основе cv, визуальной проверки распределений.
На рисунках показан переход от исходного ИМТ к выборочному ИМТ.
Аналогичным образом рост и вес были дискретизированы по небольшому количеству категорий, а давление и пульс округлены до ближайших пяти.
Поиск новых функций и их выбор осуществлялись вручную.
Лишь небольшое количество новых функций смогли улучшить CV, и все они показали относительно небольшой прирост:
- Пульсовое давление – разница между верхним и нижним давлением
- Давление в норме (85? <= ap_hi <= 125 & 55 <= ap_lo <= 85)
- Последняя цифра давления до округления + перестановка в зависимости от вероятности ССЗ
- Аналог годового четности (возраст - (age/2).
round()*2) > 0
За час до конца у меня была довольно простая модель на 2 xGB с использованием новейшей очистки данных и дискретизации функций.
Код доступен по адресу github (показал CV 0,5370, публичный 0,5431, частный 0,530569 - тоже 2 место).
Последний час соревнований
Усреднив два или три xgb на последней предварительной обработке данных, я решил попробовать усреднить результаты последних моделей с некоторыми предыдущими (различные преобразования и набор функций, очистка данных, модели) и, что удивительно, усреднение с весами 8 предыдущих прогнозов дало улучшение публичного уровня с 0,5430-31 до 0,54288. Сразу закрепилась стратегия с весами - обратно пропорциональная округленной 4-й цифре на паблике (например, 0,5431 имеет вес 1, 0,5432 - 1/2, 0,5433 - 1/3), что довольно хорошо коррелировало с тем, что модели с последняя очистка данных также показала лучшие значения CV. Эти 8 прогнозов были получены с использованием одной, двух, трех (большинства) и 9 различных моделей xgb. Все, кроме одного, были основаны на последней очистке данных, отличаясь набором новых функций, выборкой или ее отсутствием, гиперпараметрами и стратегией NaN. Кроме того, при той же схеме взвешивания добавление худших заявок (с весами менее 1/4) помогло повысить рейтинг публики до 0,542778 (всего 17 прогнозов, описание можно найти на сайте github ).Конечно, было строго необходимо хранить результаты предыдущих перекрестных проверок, чтобы правильно оценить качество такого усреднения.
Может ли здесь быть переоснащение? Учитывая, что более 90% веса при усреднении приходилось на модели со стабильными CV 0,5370–0,5371, можно было бы ожидать, что более слабые модели могут способствовать экстремальным ошибкам лучших простых моделей, но в целом прогнозы мало отличались от лучших.
модели.
Учитывая также, что паблик значительно улучшился, я выбрал эти два усреднения как окончательные, в результате чего получилась лучшая модель, показавшая 2 место с приватом 0,5304688. Можно отметить, что описанное выше простое решение, послужившее основой для данного усреднения, также показало бы 2-е место, но оно менее стабильно.
Уроки выучены
Окончательное усреднение показало, что использование комбинации относительно простых моделей с различными функциями/предварительной обработкой может дать лучшие результаты, чем использование нескольких моделей с одними и теми же данными.К сожалению, во время конкурса я искал ровно одну «идеальную» очистку данных, одно преобразование признаков и т. д. Также для себя я заметил, что помимо частых коммитов в git желательно хранить результаты перекрестной проверки предыдущих моделей, чтобы можно было быстро оценить, какие разные фичи/предобработки/модели смешиваются, чтобы дать наибольший выигрыш.
.
Однако из правил бывают исключения, например, если до окончания соревнований остался всего час.
Судя по результатам других участников, мне нужно было продолжить эксперименты с включением нейросетей и стекированием.
Однако они присутствовали в моем окончательном представлении, но лишь косвенно и с незначительным весом.
В заключении имеется авторская речь.
Здесь , и презентация тоже есть github .
Теги: #mlbootcamp #python #Машинное обучение #анализ спортивных данных #Машинное обучение
-
Потоковое Аудио Стало Проще
19 Oct, 24 -
«Тонкий Мир» Глава 3
19 Oct, 24 -
Спутник Под Управлением Ос Android
19 Oct, 24 -
Vue.js Московский Митап #1 (22.03.2018)
19 Oct, 24 -
Комната: Тот, Кто Похож На Многих
19 Oct, 24