Запрети мне псевдолейблить – Telegram
Запрети мне псевдолейблить
2.76K subscribers
153 photos
3 files
148 links
Канал о пути к Kaggle competitions (теперь уже) GrandMaster и пиве, которым обливаешься в процессе

Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов
Download Telegram
Что же случилось с ODS?
ОДС начал погибать еще до ковида. Стало очень много людей. Когда становится много людей, много нерелвантных мнений. От этого средний уровень вовлеченности падал и типичным было увидеть раз в три дня одно сообщение в условном kaggle_crackers.

Коронваирус дозаправли топлива: многим людям было скучно дома и они вернулись в одс для общения. Я тоже тогда вернулся и даже стал проходить курс по графовым нейросеткам от стендфорда. Оказалось, что его проходят парни из AI лабы Сбера, которые даже сделали отдельную группу. Оказалось, что это уже тоже целое околосбер-сообщество. Люди стали привыкать к короне и одс снова стал остывать примерно через полгода-год.

В этот момент многие большие мальчики из ODS поняли, куда дует ветер и стали собирать вокруг себя комьюнити, чтобы держать людей в курсе и дальше качать личный бренд. Примеры: канал Валеры, незаслуженно непопулярный канал Сережи Колесникова (scitator). Последний кстати пытался еще и собрать людей вокруг Catalyst и контрибьюшнов в него, но почему-то история заглохла.

Когда начались боевые действия, ОДС попал под волну банов Slack для российских компаний. Как я понимаю, Slack чарджит за пользователей и раздутый (и в основном мертвый) ODS стал слишком дорого обходиться. Кто-то из основателей ODS оплатил со своей карты хост хаба, но это было временным решением. Было ясно, что ОДС умрет/var/folders/l1/b01fb2tx5l12nfvrxfmqxggh0000gn/T/TemporaryItems/NSIRD_screencaptureui_RjiDKU/Снимок экрана 2023-03-24 в 14.19.47.png не сегодня, так через пару месяцев.

Натекин решил перетащить всех в другую селф-хостед платформу даже до февраля 2022, но дело шло тухло. Я кажется даже подался на инвайт, но так в матрикс инвайта и не получил. Сейчас, когда Натекин помогает РКН строить цифровой гулаг, не сильно сожалею о отсутствии инвайта.

Более либеральным форком ОДС стал singularis.ai. В нем все по-старому с точки зрения организации, пока люди туда только подтягиваются. Можно считать его ODS 1.1.

Есть еще комьюнити NoML, которое можно занести в личные каналы, пытающиеся вырасти в сообщество.
Сберлога переродилась и перестала быть частью Сбера. Теперь она (sci) Berloga, что даже немножко смешно, но соответствует духу времени.

Алгоритм принятия решений для вас по взглядам на картинке
👍4💩1
Сегодня закончился IceCube. Закончился на 327 месте
Разбор ждем на следующей неделе:
Почему не выиграли
Что великолепного придумали лучшие команды
Как же хендлить 400 гб графовых обучающих данных?

У авторов соревнования есть отдельный приз за лучшее описание решения, так что должно быть жирно. Постараюсь мощный разбор подготовить
🔥10💩1
🚀 @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://news.1rj.ru/str/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.
💩1
Ключевая идея из соревнования, которую можно использовать:
Если у вас объекты в датасете переменного объема, то можно просто разделить их на несколько этапов-лоудеров и тренироват вашу модель с разным батчсайзом.

Например тут берут лоудер, в которой много 'мальенких' объектов и учатся на нем с батчсайзом в 200 каждую эпоху, а для больших объектов берут батчсайз 20.
ТАким образом за одну эпоху мы используем два Loader, проходим по полным данным один раз и максимально утилизируем и данные и GPU.
Вроде бы на поверхности, но большая часть участников в сореве большие события просто выкидывала.
👍72💩1
Выступаю в Мюнхене через 18 дней. Приходите слушать 🙂
👍5🔥5💩1
На канал произошла атака ботов. Казалось бы, откуда столько счастья?
Вероятно с внедрением LLM эффективность труда еще больше выросла, и теперь даже каналы читают 18 ботов на одного человека.
Ваши версии произошедшего можно оставить под этим постом 🔽:
Please open Telegram to view this post
VIEW IN TELEGRAM
4👏3💩2
Телеграм все же режет ботнеты и теперь вы официально подписаны на кладбище аккаунтов
2💩1
Участвую сейчас в соревнования 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- это целая скрытая метавселенная без документации)
👍43💩1🐳1
По заявкам из прошлого поста:
Забнчмаркал Pandas Vs Polars Vs Vaex на разных поплуярных операциях. Накатаю на выходных статью на мидиум с бенчмарками по производительности, но с вами делюсь свежайшим прямо сейчас
Polars в достаточно примитивной постановке в три раза аутперформит Pandas, и в два Vaex.
Еще и памяти меньше потребляет!
👍72🔥1💩1
Фух, допилил статью на Мидиуме
В сухом остатке:
Пример достаточно синтетический, можно покритиковать в комментах и предложить, как сделать лучше.
Пандас нигде не победил (мб только по юзабилити)
Polars быстрый и меткий, но Vaex внезапно быстрее для merge и select операций. В то же время на этих операциях Vaex ест больше памяти, чем Polars.
По памяти Polars выигрывает немножко по бутылочному горлышку, но в среднем больше памяти расходует.
🔥3👍2💩1
Не верь лб или проиграешь
🔥7
Итак, соревнование начались с серьезной проблемы: данные, с которыми мы имели дело, были событийными данными. Работа с ними требовала множества усилий, боли и духоты. И не только данные, но и сгенерированные признаки, просто не помещались в память обычных кагловских ноутбуков.

Еще и автор соревнования запилил специальный API для сабмитов, чтобы никто не подглядывал в будущее. Из-за этого гениального решения пришлось несколько раз меня тестовые данные, выкатывать несколько патчей для API, да и ноутбуки ощутимо дольше скорились.

И вот тогда я решил заняться "оверинжинирингом" и переписал всё на polars, чтобы ускорить процесс. Результаты превзошли мои ожидания: ноутбук, который раньше занимал 40 ГБ памяти и работал полчаса, теперь мощно крутился всего за минуту, потребляя всего 8 ГБ оперативной памяти.

Поздние ноутбуки этой соревы показали, что большинство проблем решались просто путем адекватного выбора полезных признаков и правильного использования типов данных в pandas, но им никогда не достигнуть величия моего полярного сияния. К сожалению к пандасу было проще вернуться, чтобы переиспользовать код других участников.

Конечно, я провел много экспериментов с использованием CatBoost, и, о удача, мой бывший коллега поделился со мной радостью: в последней версии катубста была включена его имплементация FocalLoss. Этот лосс должен был улучшить качество модели для несбалансированных задач. Он дает больше веса 'сложным' примерам и меньше фокусируется на 'простых'. Действительно, на валидации и даже на лидерборде это привело к улучшению результатов.

Однако все не так просто: отсутствие документации по этой новой функциональности, сломанная метрика для валидации и устаревшая версией CatBoost на самой платформе. Но ведь нет таких проблем, которые не решаются суицидальным превозмоганием, правда? Вот, даже у меня есть график трехмерной визуализации оценки качества FocalLoss на локальной валидации в зависимости от его гиперпараметров Alpha и Gamma (см. прикрепленный график).
👍5🔥1
Вообще я накатл огромный опять какой-то пост, который мне не разрешает постить телеграм премиум. Так что вас ждет кайф отложеных сообщений и дополнительное подстегивание клипового мышления 👉️️️️️️🦍️️️️️️👈️️️️️️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Однако, это счастье не продолжалось надолго. В паблик-кернелах появился Вадим Камаев с его ноутбуками, которые полностью превзошли мои и всех остальных на паблике. К сожалению, в его ноутбуке использование FocalLoss не приводило к лучшим результатам.

Конечно, я не мог остаться равнодушным и начал разбираться, что же он придумал такого интересного. И тут меня ожидало настоящее страдание: его код состоял из переменных "otvet" и "catbust" и был крайне сложным для понимания. В итоге оказалось, что он качественно отобрал признаки для каждого вопроса, что дало ему неплохие результаты.

Этот ноутбук был настолько ‘тонким’ решением, что я не мог просто взять и внедрить его в свою модель. Я приуныл и забил на соревнование на пару недель, да и личные проблемы были.

После некоторого времени моя мотивация превозмогать вернулась, вернулся и я с новой идеей: почему бы не построить эмбеддинги пользователей на основе событийных данных? Так делают в проде, это практически универсальное решение. Руководствуясь принципом ‘не покупай, возьми с улицы’, я наткнулся на ноутбук Ивана Исаева, который использовал pytorch_lifestream, рекомендованный мне для создания эмбеддингов. В его ноутбуке он жаловался на проблемы с предсказаниями во время скорпиона скоринга и на то, что всё ломается. После множественной боли и кучи попыток я выяснил, что причиной проблемы была установка нужной версии pyarrow, которая даже не была включена в зависимости шикарного патентованного, чтобы все честно API. Причем результат был удивительный: API для сабмита просто не сабмитил часть ответов. Молча не сабмитила. К счастью, оказалось, что pyarrow на самом деле не так уж и необходим самому pytorch_lifestream. Так что вот вам секрет: если либы конфликтуют по зависимостям, то не факт, что вместе не будут работать. Экспериментируйте!

К сожалению, эта идея с эмбеддингами не принесла желаемых результатов. В локальном пайплайне данные протекали из будущего, а без будущего эмбеддинги оказались бесполезными.
Все еще говорю про Student Perfomance.
🔥5👍2👌1
Итак, рецепт как зафармить бронзу за последние три дня на этой сореве:

Вернулся к ноутбуку вадима (лучший воспроизводимый паблик) и осмотрел лучший невоспроизводимый паблик (там модельки были запривачены), в котором блендили 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, которая не приблизила меня к титулу мастера, но хоть в рейтинге поднимет наверно. Ну хоть гештальт по табличкам закрыт, а то я свои прошлые медальки через зрение получил. Хотя может и не закрыл, это ж не таблички, это событийка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1🎉1
Готовлюсь к разбору соревнования Predict Student Perfomance, отчитываюсь перед подписчиками. Предварительно можно будет в понедельник меня послушать онлайн и позадавать вопросы. Я обычно оцениваю топ 10 решений, и выбираю из них интересные неповторяющиеся идеи. Думаю на поста три должно до тех пор хватить.

1 место:

Победители рассмотрели количество пользователей и событий и признали, что их было недостаточно. Длинные последовательности и небольшое количество пользователей вызвали сомнения. Поэтому они решили провести небольшой "гуглопоиск" и посмотреть, что еще существует в этой области.

И нашли то, что искали! Был найден список сессий, причем, оказалось, что тренировочный набор данных был его частью (или может быть даже тест).

Преобразовали необработанные данные в формат, соответствующий требованиям соревнования. И удивительно, но 98% сессий были идентичными, а 2% имели незначительные изменения. Просмотрев данные, cpmpml и pdnartreb обнаружили интересную особенность: некоторые люди играли несколько раз. Вместо того, чтобы удалять повторяющиеся сессии, они выбрали минимальный результат для каждого ответа. Таким образом, даже если игрок первый раз ответил неправильно на первый вопрос в своей первой сессии, а затем во второй сессии ответил правильно, мы все равно считаем, что он ответил неправильно.

Кроме того, они дополнили свои данные информацией из собственного скрапинга.

Давайте теперь ориентироваться на лучший общедоступный результат, который составляет сейчас 0.707 на паблике.

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

Но победители соревнования не унывали: они снова использовали тот же пайплайн и лучше обучили модель на новых данных + старых. И они достигли 0.72 на лидерборде. Это было странно вдвойне. Они проверили файлы и источник данных скрапинга. Оказалось, что Джо Уайлдер просто удалил часть данных из публичного набора в интернете и использовал его часть в качестве публичного/приватного набора данных для валидации. А у победителей соревнования остались эти данные. И, насколько я понимаю, набор данных больше не изменялся.

Базовая модель

Правило 🥇: верь своей валидации. Выбирайте модель, ориентируясь на результаты валидации, и уделите время для улучшения методики валидации. Победители пользовались этим правилом.

Правило 🥈 (для соревнований с кодом): подглядывайте. Стоит потратить время, чтобы узнать размер публичного и приватного наборов данных. Проведя двоичный поиск, господа установили, что приватная часть состоит из 1450-1500 сессий.

Правило 2.5: На основе локальных данных можно определить, насколько шумен приватный набор. Для этого запускаем модель на разном объеме данных (1000/2000/5000/10000 сессий) при фиксированном числе фолдов и видим, что стабильные результаты достигаются при объеме данных от 5000 сессий. Это означает, что публичный лидерборд может дезинформировать.

Правило 🥉 : Если лидерборд содержит шум, нужно быть консервативным. Победители добавляли только те признаки, которые значительно улучшали результаты кросс-валидации по сравнению с уровнем шума. Признаки, которые не улучшали результаты, были отброшены, даже если в них сильно верили.

Правило 4️⃣: Все, что связано с соревнованием, может иметь значение. О игре была опубликована статья, где четко указана цель игры: улучшение навыков чтения у игроков. Мои навыки уж точно улучшились. Следовательно, длина реплик и время их отображения на экране играют важную роль.

Правило 5️⃣: Если ресурсы ограничены, нужно экономить. Используйте Polars, чтобы добиться победы. Ну, это не прямо сказано, но Polars помог им.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Другие интересные наблюдения:

В приватном наборе данных существовал еще один утечка - использование индексов событий для создания признаков дополнительно повышало результат на публичном лидерборде.

Метод случайного удаления признаков показал плохие результаты, поэтому они использовали поэтапное добавление признаков, чтобы продвигаться вверх, а не спускаться.

В итоге одна модель XGBoost давала результат 0.7025, а предсказания по фолдам дали 0.704 на локальном уровне.

Вторая часть поста завтра
5
Альтернативная модель (код)

Градиентные бустинги обычно хорошо блендятся с нейронными сетями, поэтому начали пробовать их в отработанном пайплайне.

1. Трансформер. Результаты были плохие. Скор на валидации составлял 0.685, а время обучения на один фолд занимало два часа. Обучение было медленным и результаты неудовлетворительными.
2. Сеть Conv1D. Результаты были немного лучше, но все равно неудовлетворительными. За один день удалось создать модель, которая показывала такой же скор как трансформер (0.685) на валидации, но обучалась в 10 раз быстрее. Сосредоточились на этой модели и провели более ста экспериментов, чтобы добиться ее эффективной работы. Я не буду подробно описывать процесс подбора архитектуры, но если вам интересно, вы можете прочитать подробности в оригинальном посте по ссылке.
3. Идея итогового решения заключалась в использовании модели WaveNet, которую модифицировали, чтобы она создавала эмбеддинги для duration, text_fqid, room_fqid, fqid, event_name + name и предсказывала ответы для каждого стейджа.
- На первом этапе обучаем отдельную сеть на BCELoss для каждого стейджа, предсказывая все ответы этого стейджа. (В игре есть три блока с ответами, между которыми идет сама игра. Все ивенты с начала игры/прошлого ответного блока и называется стейджем).
- Затем замораживаем веса базовой модели (отрезая BCE-голову) и обучаем другую голову, которая получает на вход конкатенацию доступных эмбеддингов для всех стейджей. На первом этапе у нас есть только один 24-мерный эмбеддинг, на втором - два эмбеддинга, и на третьем - три эмбеддинга. Мы также обучаем эту структуру на BCE и подбираем лучший вариант, исходя из метрики F1 (которая является метрикой соревнования).
4. В итоге получили результат 0.70175 для одной модели, что сопоставимо с результатами градиентного бустинга.
👍4🔥1
Другие интересные находки:

1. Создали симулятор API, чтобы оценивать скорость работы моделей в офлайн-режиме.
2. Использовали Treelite для работы с деревьями. Эта библиотека позволяет универсально компилировать деревья c помощью C++, и в этом соревновании она ускорила инференс в 2 раза. Она поддерживает модели XGBoost, LightGBM, Scikit-learn, и вы можете использовать и другие модели. В ней так же можно использовать Triton/Rapids cuML для ускорения работы на графических процессорах. Но авторы не настолько углубились и просто ускорили сеть с помощью TFLite, получив ускорение в 6 раз без потери качества. Как замечают, квантизация модели сильно ухудшала результаты, поэтому остановились только на TFLite.
КАК ЖЕ Я ЛЮБЛЮ УСКОРЯТЬ
3. Обнаружили, что во время скоринга сначала прогонялись приватные тестовые данные через API, а затем публичные тестовые данные, но клянутся, что не использовали это знание.
4. Итоговый ансамбль моделей получился эффективным, так как все модели были легковесными: 2 x 4 x 10 фолдов градиентного бустинга XGBoost + 3 x 4 x 5 фолдов нейронных сетей.
🔥9
🚀 @SBERLOGACOMPETE webinar on data science:
👨‍🔬 Dmitrii Rudenko "Review of the Kaggle competition Predict Student Performance from Game Play."
⌚️ Monday 10 July, 19.00 (Moscow time)

Add to Google Calendar

Join us for the review of the finished Kaggle Competition "Predict Student Performance from Game Play"! This unique competition explores the exciting realm where education and gaming converge, making learning a thrilling and engaging experience.

🎯 Objective: Develop model which can predict student perofmance by in-game actions. Actions/interactions with in-game objects converts directly student knowledge!

🔍 Challenge: 3 stages of game, 18 different questions and millions of in-game actions!

Zoom link will be available in https://news.1rj.ru/str/sberlogabig shortly before start of the talk.
Video records: https://www.youtube.com/c/SciBerloga

Подписывайтесь на телеграм канал Дмитрия: https://news.1rj.ru/str/pseudolabeling на нем Вы найдете много интересного о Каггл соревнованиях и дата-сайнс !
👍41