Запрети мне псевдолейблить
رفتن به کانال در Telegram
Канал о пути к Kaggle competitions (теперь уже) GrandMaster и поте, которым обливаешься в процессе Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов Для контакта пишите в сообщения канала, они бесплатные
نمایش بیشتر3 578
مشترکین
+724 ساعت
+457 روز
+18930 روز
آرشیو پست ها
Итак, рецепт как зафармить бронзу за последние три дня на этой сореве:
Вернулся к ноутбуку вадима (лучший воспроизводимый паблик) и осмотрел лучший невоспроизводимый паблик (там модельки были запривачены), в котором блендили Catboost, XGB и MLP из sklearn.
Эксперимент 1:
Ноутбук Вадима состоял из одной модели, обученной на всех данных для каждого вопроса, причем для каждого вопроса и фичи были отобраны отдельные. Ноутбук работает быстро, потому что данные там тоже неплохо обработаны. Если в нем немножко подвинуть трешхолд бинаризации предикта, то скор можно даже еще вверх подвинуть и гордо сидеть чуть-ли не из серебра смотреть на остальных. Более того, если долго перебирать random_seed, то можно было получить и 0.701.
Вывод 1:
Если добавить в него обучение через StratifeidKFold, то скор на публичном ЛБ драматически падает. (0.7 → 0.697, с top 20% улетаешь на top 60%). Значит ноутбук- это переобучение под паблик и шансов на хороший прайвет не очень много.
Эксперимент 2:
Если в эту схему добавить обучение MLP и XGB по схеме:
Берем train_fold как есть, берем test_fold и разбиваем его на val1_fold и val2_fold.
Учим MLP, XGB и catboost на train_fold (количество деревьев заранее уже выяснили), подбираем оптимальные трешхолды на val1_fold (просто для информации) и оптимальное соотношение для блендинга этих всех моделей по auc_score (чтобы не бинаризовывать). Затем меряем качество ансамбля на val2 и на нем же выбираем оптимальные трешхолд. Для вязкости смотрим, чтобы трешхолды по фолдам были похожие и из всех фолдов берем медиану.
Вывод 2:
MLP почти всегда (за исключением пары фолдов на некоторых вопросах) выучивается так, что оптимальный трешхолд бинаризации для него 0.0 или 1.0. Значит и учить его не надо, он деградирует в константу. Значит возможно сэкономить время и просто добавить Dummy Estimator, который в зависимости от номера вопроса возвращает оптимальную константу (методу констант меня научил один якутский мастер кагла). В свою очередь блендинг такой модели с другой означает буквально следующее:
Используя априорное знание о распределении, мы просто трешхолд занижаем или завышаем для остальных моделек.
В итоге я засабмитил 5 разных блендов:
xgb (0.2) + catboost (0.8) 😶🌫️
xgb (0.1) + catboost(0.9) (вот этот бандит и победил в итоге) 😶🌫️
xgb (0.1) + catboost(0.9) с другим трешхолдом глобальным
xgb (0.05) + catboost(0.95)
(xgb (0.1) + catboost(0.9)) * (0.9) * (dummy 0.1) 😶🌫️
И отобрал по скору на паблике те, что дают лучший скор и не так сильно деградируют. Они отмечены эмоджи дымного коктейля.
Вот и все, еще одна бронза в мою коллекцию Bronze56k, которая не приблизила меня к титулу мастера, но хоть в рейтинге поднимет наверно. Ну хоть гештальт по табличкам закрыт, а то я свои прошлые медальки через зрение получил. Хотя может и не закрыл, это ж не таблички, это событийка.
Однако, это счастье не продолжалось надолго. В паблик-кернелах появился Вадим Камаев с его ноутбуками, которые полностью превзошли мои и всех остальных на паблике. К сожалению, в его ноутбуке использование FocalLoss не приводило к лучшим результатам.
Конечно, я не мог остаться равнодушным и начал разбираться, что же он придумал такого интересного. И тут меня ожидало настоящее страдание: его код состоял из переменных "otvet" и "catbust" и был крайне сложным для понимания. В итоге оказалось, что он качественно отобрал признаки для каждого вопроса, что дало ему неплохие результаты.
Этот ноутбук был настолько ‘тонким’ решением, что я не мог просто взять и внедрить его в свою модель. Я приуныл и забил на соревнование на пару недель, да и личные проблемы были.
После некоторого времени моя мотивация превозмогать вернулась, вернулся и я с новой идеей: почему бы не построить эмбеддинги пользователей на основе событийных данных? Так делают в проде, это практически универсальное решение. Руководствуясь принципом ‘не покупай, возьми с улицы’, я наткнулся на ноутбук Ивана Исаева, который использовал pytorch_lifestream, рекомендованный мне для создания эмбеддингов. В его ноутбуке он жаловался на проблемы с предсказаниями во время скорпиона скоринга и на то, что всё ломается. После множественной боли и кучи попыток я выяснил, что причиной проблемы была установка нужной версии pyarrow, которая даже не была включена в зависимости шикарного патентованного, чтобы все честно API. Причем результат был удивительный: API для сабмита просто не сабмитил часть ответов. Молча не сабмитила. К счастью, оказалось, что pyarrow на самом деле не так уж и необходим самому pytorch_lifestream. Так что вот вам секрет: если либы конфликтуют по зависимостям, то не факт, что вместе не будут работать. Экспериментируйте!
К сожалению, эта идея с эмбеддингами не принесла желаемых результатов. В локальном пайплайне данные протекали из будущего, а без будущего эмбеддинги оказались бесполезными.
Все еще говорю про Student Perfomance.
Вообще я накатл огромный опять какой-то пост, который мне не разрешает постить телеграм премиум. Так что вас ждет кайф отложеных сообщений и дополнительное подстегивание клипового мышления 👉️️️️️️🦍️️️️️️👈️️️️️️
Итак, соревнование начались с серьезной проблемы: данные, с которыми мы имели дело, были событийными данными. Работа с ними требовала множества усилий, боли и духоты. И не только данные, но и сгенерированные признаки, просто не помещались в память обычных кагловских ноутбуков.
Еще и автор соревнования запилил специальный API для сабмитов, чтобы никто не подглядывал в будущее. Из-за этого гениального решения пришлось несколько раз меня тестовые данные, выкатывать несколько патчей для API, да и ноутбуки ощутимо дольше скорились.
И вот тогда я решил заняться "оверинжинирингом" и переписал всё на polars, чтобы ускорить процесс. Результаты превзошли мои ожидания: ноутбук, который раньше занимал 40 ГБ памяти и работал полчаса, теперь мощно крутился всего за минуту, потребляя всего 8 ГБ оперативной памяти.
Поздние ноутбуки этой соревы показали, что большинство проблем решались просто путем адекватного выбора полезных признаков и правильного использования типов данных в pandas, но им никогда не достигнуть величия моего полярного сияния. К сожалению к пандасу было проще вернуться, чтобы переиспользовать код других участников.
Конечно, я провел много экспериментов с использованием CatBoost, и, о удача, мой бывший коллега поделился со мной радостью: в последней версии катубста была включена его имплементация FocalLoss. Этот лосс должен был улучшить качество модели для несбалансированных задач. Он дает больше веса 'сложным' примерам и меньше фокусируется на 'простых'. Действительно, на валидации и даже на лидерборде это привело к улучшению результатов.
Однако все не так просто: отсутствие документации по этой новой функциональности, сломанная метрика для валидации и устаревшая версией CatBoost на самой платформе. Но ведь нет таких проблем, которые не решаются суицидальным превозмоганием, правда? Вот, даже у меня есть график трехмерной визуализации оценки качества FocalLoss на локальной валидации в зависимости от его гиперпараметров Alpha и Gamma (см. прикрепленный график).
Фух, допилил статью на Мидиуме
В сухом остатке:
Пример достаточно синтетический, можно покритиковать в комментах и предложить, как сделать лучше.
Пандас нигде не победил (мб только по юзабилити)
Polars быстрый и меткий, но Vaex внезапно быстрее для merge и select операций. В то же время на этих операциях Vaex ест больше памяти, чем Polars.
По памяти Polars выигрывает немножко по бутылочному горлышку, но в среднем больше памяти расходует.
По заявкам из прошлого поста:
Забнчмаркал Pandas Vs Polars Vs Vaex на разных поплуярных операциях. Накатаю на выходных статью на мидиум с бенчмарками по производительности, но с вами делюсь свежайшим прямо сейчас
Polars в достаточно примитивной постановке в три раза аутперформит Pandas, и в два Vaex.
Еще и памяти меньше потребляет!
Участвую сейчас в соревнования Predict Student Performance from Game Play! 🤓🎮🎓
Задача: по сессиям игроков определить, смогут ли они правильно ответить на контрольные вопросы. Игра историческая и рассказывает о суфражистках Висконсина. Представляет из себя квест, в котором нужно расследовать простенькую детективную историю и отвечать на вопросы по сюжету расследования. Это помогает закрепить знания о суфражистках.
Как всегда, начал смотреть топовый паблик кернел, и там как раз было достаточно базовое и лобовое решение. Решил его допилить.
Что удалось выяснить? Кернел не работает. 😕 Он забирает слишком много памяти, а то что работает, работает медленно. Автор использует Polars и Pandas для предобработки. К слову, Polars - это Pandas на стероидах! 💪
Polars написан на Rust, что позволяет ему легко параллелизироваться на multi-CPU. И в этом плане он действительно хорош. Если заглянуть в
htop, то сразу видно как Polars использует все ресурсы. Более того, он не копирует объекты при изменении, а модифицирует их напрямую, экономя память. В Pandas же при изменении объекта сначала выделяется память размером этот же объект (если тип не меняется), затем осуществляются вычисления и, наконец, старая память освобождается. Еще, в Pandas каждое значение в колонке занимает память, даже если оно Null. Для представления Null всегда хранится служебная Pandas колонка типа byte, которая как раз и показывает пустое там значение или нет. Стало быть к каждому значению таблицы добавляется этот дополнительный байт. Если вдруг вы работаете с bool значениями, то оверхед по памяти будет два раза :0 В Polars же есть отдельный validity_bitmap, который хранит один byte array для всей колонки. Это ускоряет подсчет Null и уменьшает потребление памяти в 8 раз для каждой колонки (байт -> бит) И еще одно ключевое отличие: в Polars нет индексов! В Pandas индексы могут вызывать проблемы, но в Polars их просто нет. Когда-то коллега спросил меня, почему я всегда использую df.reset_index(drop=True) в Pandas. Я объяснил, что индексы могут быть проблематичными и что это полезная привычка на мой взгляд. Через пару недель он вернулся и сказал, что день дебага помог и ему заиметь полезную привычку. В итоге я переписал куски Pandas полностью на Polars. В память стало влезать чуть лучше, но все еще не отрабатывало до конца. (в этом посте будет три части: еще одна про Polars Lazy API и про то, что CatBoost- это целая скрытая метавселенная без документации)
Телеграм все же режет ботнеты и теперь вы официально подписаны на кладбище аккаунтов
На канал произошла атака ботов. Казалось бы, откуда столько счастья?
Вероятно с внедрением LLM эффективность труда еще больше выросла, и теперь даже каналы читают 18 ботов на одного человека.
Ваши версии произошедшего можно оставить под этим постом 🔽:
Ключевая идея из соревнования, которую можно использовать:
Если у вас объекты в датасете переменного объема, то можно просто разделить их на несколько этапов-лоудеров и тренироват вашу модель с разным батчсайзом.
Например тут берут лоудер, в которой много 'мальенких' объектов и учатся на нем с батчсайзом в 200 каждую эпоху, а для больших объектов берут батчсайз 20.
ТАким образом за одну эпоху мы используем два Loader, проходим по полным данным один раз и максимально утилизируем и данные и GPU.
Вроде бы на поверхности, но большая часть участников в сореве большие события просто выкидывала.
Repost from (sci)Berloga Всех Наук и Технологий
🚀 @SBERLOGACOMPETE webinar on data science:
👨🔬 Дмитрий Руденко: "О Каггл соревновании Neutrinos in Deep Ice"
⌚️ 28 Апреля, пятница, 18.00 (Moscow Time)
Add to Google Calendar
Join us for the follow-up session of the IceCube: Neutrinos in Deep Ice competition, where we'll be discussing the best tricks to predict azimuths and zeniths, the best approaches for detector-compensation NN, and how to handle 400 GB of graphs. This competition was extraordinary, as it offered "best write" prizes, so you can expect to hear some excellent explanations from the winners.
The goal of this competition was to predict the direction of neutrino particles using data from the IceCube detector at the South Pole. By improving the accuracy and speed of reconstructing neutrino events, we can gain a better understanding of the universe and its violent astrophysical sources. This challenge required a balance between accuracy and computational costs, as existing solutions have limitations. The winning solution will aid the international IceCube Collaboration in their research of the nearly massless and electrically neutral neutrinos.
Zoom link will be available at https://t.me/sberlogabig shortly before the start. Don't forget to subscribe to our YouTube channel (https://www.youtube.com/c/SciBerloga) to watch the video recordings of the session later.
📢 Also subscribe to Dmitry's telegram-channel @pseudolabeling devoted to Kaggle and data science.
Сегодня закончился IceCube. Закончился на 327 месте
Разбор ждем на следующей неделе:
Почему не выиграли
Что великолепного придумали лучшие команды
Как же хендлить 400 гб графовых обучающих данных?
У авторов соревнования есть отдельный приз за лучшее описание решения, так что должно быть жирно. Постараюсь мощный разбор подготовить
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
