Слишком хороший признак: как звёзды, галактики и квазары научили меня не верить графикам
На Kaggle завершился шестой эпизод Playground Series, и тема на этот раз была астрономическая: по горстке чисел определить, что перед нами: звезда, галактика или квазар. По этому выпуску я решил собрать почти исчерпывающий разбор EDA.
Playground Series это линейка регулярных учебных соревнований Kaggle: примерно раз в месяц, каждый на своём датасете. Призов и рейтинговой квалификации не дают, данные уже причёсаны (обычно синтетика на основе реальных данных), а задача узкая и понятная. Смысл — без хаоса «боевых» соревнований потренировать конкретные навыки: разведочный анализ, признаки, валидацию, подбор модели. Хорошая точка входа для новичка и полигон, где можно быстро обкатать приёмы.
В таких задачах новичок обычно вязнет в очевидном: ещё одна гистограмма, ещё одна «корреляция с таргетом», и время уходит впустую. Хотелось пройти очевидное быстро и по делу, а силы приберечь для того, что делает эксперта экспертом. Это валидация без утечек; привычка спрашивать, значит ли красивый график хоть что-то; и охота за классом, который реально ломает метрику.
1. Три точки света и один вопрос
Телескоп ловит тусклую точку света, за которой может стоять одна из трёх сущностей. Звезда — это солнце вроде нашего, по соседству, в нашей же Галактике. Галактика — далёкий остров из миллиардов звёзд, целиком уместившийся в одну точку кадра. Квазар — ядро галактики, где сверхмассивная чёрная дыра жадно поглощает вещество и в этот момент светит ярче всех звёзд вокруг; самые далёкие видны через всю наблюдаемую Вселенную. На нашем снимке все три одинаковы, так что разбираться приходится по числам.
Задача глазами модели: десятки тысяч объектов, все три класса уже на этой картинке — но глазу зацепиться не за что.
Объектов в выборке сотни тысяч, а вот чисел про каждый — горстка. Главное — яркость в пяти фильтрах: u, g, r, i, z, от ближнего ультрафиолета до ближнего инфракрасного диапазона. Деталь, на которой спотыкаются почти все новички: звёздная величина устроена наоборот, чем число больше, тем объект тусклее. Дальше — красное смещение, две небесные координаты и две категориальные колонки, которые сразу вызывают подозрение. Предсказать нужно класс: GALAXY, QSO (квазар) или STAR.
Сразу оговорюсь, что разбираю это как ML-практик; астрофизику беру ровно настолько, насколько она помогает читать данные, и подкрепляю физические утверждения ссылками на источники. Если вы астроном, кое-где придётся поморщиться от упрощений, заранее извиняюсь. :О)
А теперь тот самый график: красное смещение по горизонтали, цвет g-r по вертикали. Точки трёх классов расходятся по разным областям, и глаз почти проводит границы сам. Соблазн закрыть задачу прямо здесь. Но красивая картинка — это гипотеза. Она подсказывает, что может сработать; работает ли это на самом деле, мы будем придирчиво выяснять дальше.
Те же точки с ответами: звёзды прижаты к нулевому смещению, галактики собираются в облако, квазары тянутся вправо. Уже два признака из шести почти разводят классы.
Хук 0. До первого графика выпишите, что такое одна строка данных и как выглядит правильный ответ. Банально, но экономит часы.
2. Метрика решает, кого ловить
Прежде чем смотреть на признаки, надо понять, по какой линейке нас меряют. В этом выпуске метрика — balanced accuracy, сбалансированная точность. Это среднее из трёх recall’ов, по одному на класс: какую долю настоящих звёзд мы поймали, какую долю галактик, какую долю квазаров, а потом усреднили. Звучит как мелочь, но она переворачивает приоритеты.
Классы здесь очень разные по размеру: галактик примерно 65%, доля остальных классов заметно меньше; между самым частым и самым редким классом перекос около 4.6 к 1. Ленивая модель, которая всем подряд отвечает «галактика», получит обычную точность около 0.65, вроде прилично. А balanced accuracy у неё будет 0.33: один класс из трёх угадан, два провалены. Обычная точность льстит алгоритму, а сбалансированная его топит.
Перекос 4.6 : 1. «Всегда галактика» набирает 0.65 обычной точности и только 0.33 сбалансированной.
Аналогия без всякой астрономии: медицинский тест, который оценивают отдельно за то, что он ловит редкую болезнь, и отдельно за то, что не пугает здоровых. Если редких случаев мало, можно набрать высокий общий процент, просто не замечая их, и провалить именно то, ради чего тест и нужен.
Отсюда следствие: под этой метрикой итог решает самый слабый класс.
Хук 1. Сначала метрика, потом данные. Она решает, какие ошибки дорогие, и часто меняет всю стратегию.
3. Красное смещение — одометр Вселенной
Первый по-настоящему сильный сигнал виден сразу — это красное смещение (redshift). За ним стоит понятная физика.
У света от удаляющегося объекта растягивается длина волны, и спектр сдвигается к красному концу. Чем дальше объект, тем быстрее он убегает вместе с расширением Вселенной (закон Хаббла) и тем сильнее этот сдвиг. Получается космический одометр: по величине смещения можно прикинуть расстояние.
Три класса стоят у трёх разных отметок этого одометра. Звёзды в датасете наши, из Млечного Пути, поэтому их свет почти не растянут: смещение около нуля. (Строго говоря, у них есть крошечные доплеровские сдвиги от собственного движения, но на фоне космологических это шум). Галактики уже заметно дальше, типичное смещение в SDSS порядка 0.1. Квазары — самые далёкие из того, что мы видим: их смещение уходит за единицу, а рекордные известные забираются за семь.
Плотности красного смещения: звёзды жмутся к нулю, галактики — в десятых, квазары растянуты за единицу (хвост z > 2.5 обрезан).
И вот первая засада. На графике красное смещение в одиночку уже неплохо растаскивает классы. Если обучить модель только на нём, выходит около 0.80 balanced accuracy — стартовая точка из одного числа. Картинка будто говорит, что redshift решает почти всё. Но это преувеличение.
Хук 2. Один признак, который кодирует причинную структуру задачи, способен увезти на удивление далеко. Найдите его раньше, чем потянетесь за моделью.
4. Почему цвет важнее пяти ярких чисел
Дальше начинается то, ради чего астрономы и придумали фотометрию. Берём не сами пять яркостей, а их разности: u минус g, g минус r и так далее. Такую разность называют цветом.
Сильнее сырых величин цвет по простой причине. Яркость объекта сильно зависит от расстояния: далёкая галактика тусклее близкой просто потому, что она дальше. А цвет — это отношение потоков в двух фильтрах, и при делении расстояние сокращается. Остаётся форма спектра — собственное свойство объекта, которое от расстояния не зависит. Два вычитания выбрасывают мешающую переменную и оставляют сигнал. (Сокращается оно не идеально: на больших красных смещениях спектр сам уезжает по фильтрам, это называют k-коррекцией, и такой остаток иногда сам по себе полезен.)
На цветовой диаграмме классы раскладываются наглядно. Квазары собираются в плотное голубое облако: свет раскалённого диска вокруг чёрной дыры в среднем более голубой, чем у звёзд. Галактики расползаются в красную область. Звёзды лежат между ними вдоль узкой линии — звёздного потока (stellar locus), температурной последовательности от горячих голубых до холодных красных звёзд.
Каждый класс в цветовом пространстве u−g × g−r. Пунктир на панели звёзд — их медианная линия, набросок звёздного потока.
Когда к красному смещению добавляются цвета, модель прыгает с ~0.80 до ~0.95 balanced accuracy. Основную работу делает связка «расстояние плюс форма спектра».
Важная оговорка: правило «квазары голубые» держится не всюду. У самых далёких квазаров свет так уезжает по фильтрам, что они начинают походить на обычные звёзды.
Хук 3. Конструируйте признаки, которые изолируют сигнал и гасят мешающую переменную (здесь — убрать расстояние, оставить спектр). Приём переносится на любую табличную задачу.
5. Карта неба, которая красива и бесполезна
Теперь короткий, но важный пример. У каждого объекта есть две небесные координаты, определяющие его положение на небе. Их тоже хочется использовать как признаки: вдруг классы кучкуются по разным участкам?
Рисуем карту. Видим оттиск того, как телескоп осматривал небо: там, где он прошёлся, точки складываются в красивые дуги, а где не заглядывал — пустоты. Но все три класса размазаны по этим дугам одинаково. Этого стоило ждать: положение на небе говорит лишь о том, какой участок попал в обзор. К природе самого объекта оно отношения не имеет. Мера полезности (mutual information) ставит координаты в самый низ списка.
35 тысяч объектов на небе: дуги и пустоты — геометрия обзора, а не свойство классов.
Удобный калибровочный случай для нашего метода: здесь глаз и измерения согласны, что сигнала нет.
(Если координаты всё-таки хочется использовать, кодируйте угол через синус и косинус. Для модели 0 и 360 градусов — далёкие числа, хотя на небе это одна и та же точка; синус и косинус склеивают этот разрыв. Спасибо Noussair Mighri за этот приём в форуме соревнования.)
Хук 4. Не каждая колонка — признак. Проверить и выбросить непредсказывающую переменную тоже работа; отвергнутая гипотеза — это результат.
6. Слишком хороший признак
Возвращаюсь к двум подозрительным категориальным колонкам — spectral_type и galaxy_population. На первый взгляд связь с ответом очень сильная: зная категорию, класс почти угадываешь, и таблица P(класс | категория) выглядит чуть ли не готовым ответом.
Важно не забывать, что обе колонки синтетические: телескоп их не измерял, их дорисовал генератор датасета специально для соревнования. Поэтому дальше — история про доверие к данным. Астрофизика здесь почти ни при чём.
А дорисовали их красиво. Каждая колонка оказалась простым порогом по одному цвету. spectral_type — это цвет g-r, разрезанный на четыре полосы; galaxy_population — это цвет u-r с границей около 2.2. На гистограммах этих цветов границы категорий совпадают с порогами один в один. Спасибо broccoli beef за разбор формул в форуме.
Обе «сильные» категории — пороги на одном цвете: четыре полосы по g−r и один порог 2.2 по u−r.
Изящная деталь: порог u-r около 2.2 почти точно совпадает с реальной границей, найденной в работе Strateva и соавторов 2001 года по данным SDSS (u-r около 2.22). Эта граница отделяет старые спокойные эллиптические галактики от молодых, в которых ещё активно рождаются звёзды. Колонки синтетические, но деление, которое они кодируют, в природе действительно есть.
Признаки выглядят сильными и даже перекликаются с наукой. Осталось проверить, помогают ли они модели на самом деле.
Хук 5. Признак, который выглядит слишком хорошо, часто оказывается переупаковкой того, что у вас уже есть, или утечкой. Проследите, откуда он взялся, прежде чем брать его в работу.
7. Беспристрастный судья: кросс-валидация без утечек
Проверить, ценен ли признак на самом деле, может только судья. На Kaggle, как и в реальной работе, таким судьёй будет кросс-валидация без утечек.
Идея простая. Данные делим на пять частей. Каждую по очереди прячем, учим модель на остальных четырёх и проверяем на спрятанной части, которую модель не видела. Так получаются out-of-fold предсказания (OOF): каждую строку оценивает модель, не учившаяся на ней. Аналогия — экзамен. Оценке можно верить, только если студент не видел вопросов заранее. Если билеты известны наперёд, балл выйдет завышенным и ничего не скажет о реальных знаниях. Утечка в данных — те же заранее известные билеты.
Вернёмся к подозрительным колонкам. Первая проверка — mutual information (взаимная информация): насколько знание одного признака уменьшает неопределённость в ответе. По MI обе синтетические колонки стоят высоко, смотрятся сильными.
У этой меры есть слепое пятно: MI оценивает признак в одиночку, а признаки перекрываются. Колонка может быть сильно связана с ответом и при этом не добавлять ничего, если у модели уже есть красное смещение и цвета: информация просто дублируется. Проверяем абляцией — добавляем признаки группами и замеряем OOF balanced accuracy на каждом шаге:
-
только redshift: ~0.80;
-
плюс фотометрия и цвета: ~0.95;
-
плюс те самые синтетические категории: +0.0002.
Прибавка +0.0002 меньше, чем разброс между фолдами. По сути это шум. И теперь понятно почему: синтетические колонки — это те же цвета, разрезанные на несколько широких полос. Модель и так знает точное значение цвета; номер полосы ей ничего не добавляет.
Один и тот же признак с двух сторон: по MI синтетика в лидерах (слева), по приросту поверх остального — +0.0002 (справа).
(Близкий родственник этой проверки — permutation importance: перемешать один признак и посмотреть, насколько просядет качество. Падение и есть реальный вклад признака.)
Хук 6. Mutual information и любая «важность одного признака» оценивают признак в отрыве от остальных. Ранжируйте по приросту поверх того, что уже есть: одиночный скор обманет, так как не видит избыточности.
8. Где модель спотыкается: холодный красный хвост
Соберём простую базовую модель и посмотрим, где она ошибается. Это обычный градиентный бустинг на деревьях (LightGBM) на красном смещении и цветах. Никаких ансамблей и трюков: для разбора важнее понять задачу, чем выжать сотые. OOF balanced accuracy без утечек выходит около 0.9566.
Теперь матрица ошибок по OOF-предсказаниям. У галактик и квазаров recall около 0.96-0.97. А вот звёзды проваливаются: их recall около 0.915. Примерно одна звезда из двенадцати уезжает в «галактики». И это не баг.
Матрица ошибок по OOF: GALAXY 0.975, QSO 0.961, STAR 0.915. В рамке — 7.8% звёзд, прочитанных как галактики.
Причина в физике. Свет галактики — это сложенный свет миллиардов её звёзд, и у старых галактик в этой сумме преобладают холодные красные звёзды. Поэтому по цветам близкая старая галактика выглядит почти как одиночная холодная красная звезда: на цветовой диаграмме обе оказываются на одном и том же красном конце звёздного потока. На снимке обе просто тусклые точки. Развести их могло бы красное смещение, но у близкой галактики оно почти нулевое, как и у звезды. Обе подсказки отказывают одновременно. Так что эти ~8% перепутанных звёзд — настоящая астрофизика; модель тут ни при чём.
Всё сходится: физика (объекты перекрываются), метрика (классы весят поровну) и результат (итог держит STAR). В разделе про метрику мы вывели: под balanced accuracy балл решает самый слабый класс. Вот он.
Хук 7. Ваш худший класс — обычно реальное структурное перекрытие в данных. Сначала разберитесь в геометрии, а уже потом тянитесь за моделью побольше.
9. Калибровка против метрики, и почему лидерборд врёт
Раз итог держит STAR, остаётся понять, как поднять именно его. Тут два урока, которые пригодятся в любой задаче.
Первый — подбирай инструмент под метрику. Balanced accuracy смотрит только на argmax — какой класс победил. Значит, проседающему классу можно дать небольшую фору перед выбором: умножить его вероятности на вес чуть больше единицы, и несколько пограничных звёзд перестанут уезжать в галактики. Подобрали такие веса по OOF — balanced accuracy поднялась с 0.9566 до 0.9604. Дешёвый и аккуратный выигрыш ровно там, где он нужен. Одна оговорка: веса мы и подбирали, и проверяли на одном и том же OOF, так что +0.0038 — это оптимистичная верхняя оценка, гарантии не будет.
Та же мысль с другой стороны: калибровка вероятностей. И здесь легко промахнуться. Калибровка (например, изотоническая) делает вероятности согласованными с реальными частотами и улучшает log loss. Но balanced accuracy её почти не замечает: она смотрит на argmax, а монотонная перекройка вероятностей внутри класса редко меняет, кто победил. В цифрах: калибровка опустила log loss, а balanced accuracy почти не сдвинулась, с 0.9566 до 0.9572. Веса под класс делают обратное — двигают balanced accuracy и слегка портят log loss. Ни то ни другое не «лучше», просто они для разных метрик. Считают вас по log loss — калибруйте; считают по balanced accuracy — крутите порог или веса.
Одна модель, три варианта вероятностей: калибровка выигрывает по log loss, веса классов — по balanced accuracy.
Второй — верьте своей кросс-валидации, а публичному лидерборду не очень. Наш OOF около 0.9566 и почти не пляшет между фолдами. Верх публичного лидерборда около 0.973. Перед тем как гнаться за этим разрывом, стоит понять, откуда он. Часть его — вовсе не превосходство модели. Это подгонка под публичный срез: некоторые решения доворачивают предсказания по обратной связи самого лидерборда, и на скрытой части это, скорее всего, развалится. Сильные модели согласны почти на всех строках и расходятся лишь на немногих трудных, поэтому публичный порядок мест частично решает удача.
Так и вышло в этом выпуске. После закрытия соревнования балл пересчитали на скрытой части, и перетряска получилась образцовая: будущий победитель поднялся с 343-го места на первое, весь итоговый ТОП-20 до пересчёта располагался между 149-м и 495-м местами, а лидер публичной таблицы в него вообще не попал.
Практическое правило, которое повторяют и сильные участники в форуме: финальные сабмиты выбирайте по своей CV, публичному баллу не доверяйте и ждите перетряски. Для тех, кто не на Kaggle: любой балл на срезе, который можно щупать многократно, со временем уползает вверх от везения и переобучения, хоть это A/B-дашборд, хоть валидационная выборка, под которую модель подкрутили пятьдесят раз.
Хук 8. Поймите, что читает метрика: вероятности или argmax, — и под это выбирайте рычаг. Доверяйте офлайн-судье, которого задали сами, больше любого лестного внешнего балла.
10. Что забрать в любую задачу
Соберём все девять хуков в один список, который можно унести в любую задачу, без всякой астрономии:
-
Хук 0. До первого графика выпишите, что такое одна строка и как выглядит правильный ответ.
-
Хук 1. Сначала метрика — она решает, какие ошибки дорогие.
-
Хук 2. Ищите признак, кодирующий причинную структуру задачи; он может увезти далеко.
-
Хук 3. Конструируйте признаки, которые изолируют сигнал и гасят мешающую переменную.
-
Хук 4. Не каждая колонка — признак; отвергнутая гипотеза тоже результат.
-
Хук 5. Признак, который выглядит слишком хорошо, проверьте на происхождение: часто это утечка или то, что у вас уже есть.
-
Хук 6. Ранжируйте признаки по приросту поверх остального; одиночный скор обманет.
-
Хук 7. Худший класс — обычно реальное перекрытие в данных; разберитесь в геометрии до того, как брать модель побольше.
-
Хук 8. Узнайте, что читает метрика (вероятности или argmax), и доверяйте своей CV больше внешнего балла.
11. У каждого правила есть слепая зона
Правило «квазары голубые» из раздела про цвета держится на большей части диапазона, а при красном смещении от 2.5 до 3 отказывает: именно на этом интервале в SDSS проваливался отбор квазаров, глубже всего около 2.7. Виновато водородное поглощение по лучу зрения (лес Лайман-альфа). Оно съедает поток в фильтре u, цвет u-g краснеет, и квазары съезжают прямо на звёздный поток; эффективность отбора падала ниже четверти. Около z 3.5 есть второй провал, поменьше. Знать правило — значит знать и границы его применимости.
Трёхстрочная базовая модель на двух правильных идеях (красное смещение + цвета) подобралась к настроенным ансамблям на считанные сотые. Гнаться за этими сотыми можно долго, а окупается обычно другое — понимание данных: какой признак сработает, где у задачи потолок и почему модель ошибается именно там.
Космос оказался на удивление удобным полигоном для таких уроков.
Весь код — в открытом ноутбуке. Полный разбор с графиками и базовой моделью опубликован на Kaggle: An almost-exhaustive Stellar Class EDA. Его можно открыть, запустить в браузере и проверить каждую цифру из этой статьи.
Источники
-
Обзор SDSS и система ugriz: York et al. 2000, AJ 120, 1579 (arXiv); Fukugita et al. 1996, AJ 111, 1748. Сайт проекта — sdss.org.
-
Космологическое красное смещение и закон Хаббла: Swinburne COSMOS.
-
Самый далёкий известный квазар (z = 7.64): Wang et al. 2021, ApJL 907, L1 (DOI).
-
Медианное смещение галактик SDSS (z ≈ 0.1): Strauss et al. 2002, AJ 124, 1810 (arXiv).
-
Звёздный поток в SDSS: Covey et al. 2007, AJ 134, 2398 (arXiv).
-
Бимодальность цвета галактик, граница u-r ≈ 2.22: Strateva et al. 2001, AJ 122, 1861 (arXiv).
-
Провал отбора квазаров SDSS у z ≈ 2.7: Richards et al. 2006, AJ 131, 2766 (arXiv).
ссылка на оригинал статьи https://habr.com/ru/articles/1056802/