Биоинформатика и лапки

Биоинформатика и лапки 

Путевые заметки старшего мяучного котрудника

12subscribers

11posts

goals1
0 of 100 paid subscribers
Если получится набрать сто котят-подписчиков, то запущу видеоблог или лапковый подкаст.

Восстание против меточного шума

В этом открытом длиннопосте поговорим о меточном шуме и о том, как с ним бороться. Код приложен к посту.
В прикладном машинном обучении, особенно в высоконаучных приложениях вроде той же биоинформатики, иногда возникают интересные задачи эпистемиологического характера в духе "А как мы можем понять, что из этих данных вообще можно узнать, и насколько они правильные?".
Предположим, что существует некий датасет (X, y_gathered), где X -- данные, а y_gathered -- метки. (Бусти, втф, добавь латех в редактор!)
Этот датасет был, например, собран людьми, у которых руки растут не из того места -- реальные метки y_real и собранные метки y_gathered отличаются так, что y_gathered = y_real + N, где N -- некий шум неизвестной природы. Также мы можем предположить, что сама метка y_real -- какая-то сложноопределимая хрень, насчет которой спорят эксперты (ТМ) и никак не могут определиться с результатом.
Для нас эти две постановки эквивалентны.
Есть интерес в том, чтобы:
1. Попытаться понять, какие из меток в y_gathered неправильные и соответствующие примеры выкинуть из датасета;
2. Насколько реальный диапазон y_real отличается от диапазона y_gathered, или, если говорить о классификации, насколько классы из y_real соответствуют классам в y_gathered;
3. Какой может быть модель шума -- какие классы проще всего между собой перепутать?
В общем виде этим заннимается теория уверенного обучения (confident learning), которая предлагает свою формализацию понятия меточного шума и общие подходы к этим вопросам. Сегодня мы попробуем поиграться с решением задачи 1, и посмотреть на примере, а можно ли тем же самым подходом решить задачу 2. Про задачу 3 поговорим как-нибудь в другой раз.
Давайте попробуем воспроизвести алгоритм Repeated Cross-Validations (ReCoV) из статьи https://arxiv.org/pdf/2306.13990 -- он достаточно прост для иллюстрации уверенного обучения и в целом прикольный для практического применения.
Потренируемся мы даже не на кошках, а на ирисах -- классическом наборе данных. В качестве модели возьмем логистическую регрессию.
Предварительно надо будет ирисы загадить. Сделаем мы это несколькими способами:
1. В M из примеров мы перепутаем метки;
2. L от одного из классов будет отдано в новый несуществующий класс peniscaninica;
3. L, M, K от трех реальных классов будет отдано в новый несуществующий класс peniscaninica;
Интересно посмотреть, получится ли с помощью метода ReCoV выловить все неправильные метки и понять, что один из четырех классов -- выдумка прогрева ради.
Сначала разобъем по классике и обучим просто модель:
Данные выглядят вот так теперь (если делать PCA):
Видно, что в сценарии 1 у нас все классы немного смешались, а в сценариях 2 и 3 появились новые точки странно определенного класса peniscanininca.
Модель, которую будем использовать, -- логистическая регрессия.
Посмотрим производительность:
Как мы видим, довольно точные предсказания. Что же получается, если метки испорчены?
У нас сразу получаются проблемы со сходимостью... Совпадение? Не думаю.
Срааазу все стало плоховатенько, ну кто бы мог подумать?;) Наблюдаем проблемы с точностью на испорченных метках.
Для сценария 1 есть какие-то смешные ошибочные предсказания.
Для сценария 2, вся peniscaninica была совершенно справедливо предсказана как versicolor.
Для сценария 3 часть peniscaninica была предсказана как setosa, а часть как versicolor.
Давайте попробуем сделать 5-фолдовую кросс-валидацию на тренировочных данных, чтобы было с чем сравнивать перформанс на настоящих, испорченных и очищенных метках:
На настоящих:
На испорченных:
Запомним эти значения и идем дальше.
Алгоритм ReCoV предлагает нам сделать большое количество кросс-валидаций и сохранять плохие фолды в память -- ошибочные айдишники будут систематически попадать в плохие фолды с ростом количества запусков. В зависимости от порога по количеству попаданий в плохие фолды, можно отличить ошибочные айдишники от правильных, попавших в плохие фолды случайно.
У ReCoV есть два гиперпараметра -- N, количество запусков и k, количество фолдов кросс-валидации. Начинаме мы с генерации N сидов для запусков обучения. Для каждого сида мы разделяем тренировочные данные на k фолдов, обучаем k моделей на тренировочных фолдах и проверяем на тестовых. Худший тестовый фолд скопом добавляем в список кандидатов. После завершения всех запусков, объявляем ошибочными все примеры, которые встречаются в списке кандидатов чаще порогового значения.
Сначала уберем ворнинги, ибо не интересно уже:
Давайте посмотрим на распределения попаданий. Теорема из статьи говорит нам, что на большом количестве кросс-валидаций количество попаданий испорченных меток в плохой фолд и количество попаданий чистых меток в плохой фолд будут разделяться между собой, потому что фолды с большим количеством чуши будут предсказываться хуже.
В целом да, похоже, везде мы наблюдаем что-то в духе бимодального или многомодального распределения. На самом деле, для каждого плохого фолда мы наблюдаем гипергеометрическое распределение -- вероятность того, что в выборке из n объектов ровно k являются бракованными. А в сумме для всех фолдов нам удобно использовать модель смесей гауссиан для определения порога сепарации между испорченными и чистыми примерами или найти порог тупо глазами лол. В статье рекомендуют оба варианта в зависимости от ситуации. В целом может помочь любой алгоритм кластеризации, хоть k-means. Попробуем:
Как видите, в целом один хрен. Ну для наших данных по крайней мере.
Давайте посмотрим, как хорошо мы определили плохие образцы для каждого сценария. Для этого будем новучными и используем меру Жаккара, она же Intersection over Union (IoU). Тут идет немного моя отсебятина, потому что в статье таким способом производительность алгоритма не оценивали.
Видим забавные вещи. Во-первых, установка порога тупо глазами сработала немного лучше, чем смесь гауссиан. Наверное, у меня просто хороший глазомер;)
Во-вторых, по какой-то причине, для сценариев 2 и 3 результаты какие-то совсем плохие.
Для сценария 1 все понятно -- большую часть шума мы выловили.
Сценарий 2 и сценарий 3 же показывают, что по количеству попаданий в плохой фолд испорченные и чистые данные отличаются очень плохо.
Почему? Не знаю. Возможно, дело в количестве данных, во влиянии k и N, или чего-то еще. Мне лично кажется, что метода ReCoV недостаточно для хорошего определения того, что у тебя есть целый фальшивый класс в данных. Для этого нужны какие-то дополнительные подходы. Поскольку я сейчас только начинаю погружаться в вопрос уверенного обучения, я пока не знаю, какой. Мое впечатление на текущий момент состоит в том, что задача обнаружения соответствия классов и задача восстановления зашумливающего процесса сильно связаны.
Давайте теперь вернемся к пятифолдовой кросс-валидации и посчитаем результаты для очищенных данных:
Видим, что для сценария 1 у нас перформанс лучше, чем на настоящих метках, что ожидаемо -- меньше значений дает больший вес каждого правильного ответа. Для сценария 2 перформанс почти не отличается, только для грязных немного лучше, чем на очищенных, для сценария 3 перформанс на очищенных лучше, чем на грязных. В целом понятно, что для определения наличия фальшивого класса метод ReCoV не подходит. По крайней мере на этих данных.
В той же статье авторы ReCoV предложили еще быстрый алгоритм fastReCoV, который отличается хитрой оценкой вероятности попадания в плохой фолд. Его мы рассмотрим в продолжении, которое будет после второй части истории об индуктивном конформном предсказании. Мяу!
ipynb
ReCoV.ipynb427.31 Kb
Хороший пост! Интересно было почитать. Изложенное нужно будет опробовать на своих данных)
Subscription levels5

оченб маленбки котови

$2.88 per month
Доступ к небольшим статьям, спискам, рецептам. Gateway drug лапкопространства.

маленьки мохнати

$7.2 per month
Доступ к книжному блогу доктора Пушистого, вдобавок к предыдущему уровню. Погружение в котовость по колено (со стрелой или без).

мохнати поболбше

$14.4 per month
Оптимальный уровень погружения в лапкопространство, полный доступ ко всем постам, чертежам, коду, stl-ам.

биг коть

$28.8 per month
Все предыдущее + доступ в телеграмм чат для бустеров. 
+ chat

кутёжный котан

$72 per month
Для невероятно богатых котанов, которые меня очень любят по какой-то причине или без. Поим котят шампанским, входим в PAWCOIN на всю котлету, наслаждаемся девятью жизнями на полную КОТ УШКО. Все то же, что и для биг коть, плюс моя большая благодарность.
+ chat
Go up