Готовлюсь к разбору соревнования 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 помог им.
1 место:
Победители рассмотрели количество пользователей и событий и признали, что их было недостаточно. Длинные последовательности и небольшое количество пользователей вызвали сомнения. Поэтому они решили провести небольшой "гуглопоиск" и посмотреть, что еще существует в этой области.
И нашли то, что искали! Был найден список сессий, причем, оказалось, что тренировочный набор данных был его частью (или может быть даже тест).
Преобразовали необработанные данные в формат, соответствующий требованиям соревнования. И удивительно, но 98% сессий были идентичными, а 2% имели незначительные изменения. Просмотрев данные, cpmpml и pdnartreb обнаружили интересную особенность: некоторые люди играли несколько раз. Вместо того, чтобы удалять повторяющиеся сессии, они выбрали минимальный результат для каждого ответа. Таким образом, даже если игрок первый раз ответил неправильно на первый вопрос в своей первой сессии, а затем во второй сессии ответил правильно, мы все равно считаем, что он ответил неправильно.
Кроме того, они дополнили свои данные информацией из собственного скрапинга.
Давайте теперь ориентироваться на лучший общедоступный результат, который составляет сейчас 0.707 на паблике.
Ребята запустили локальную кросс-валидацию на этих данных и получили результат 0.718. Для сравнения, мой лучший результат при кросс-валидации составлял 0.701. Они отправили свое решение и получили оценку 0.708 на публичном лидерборде. Да да, лучше чем текущий паблик. Но нет нужды удивляться. Они рассмотрели этот результат как аномалию и обратились к организаторам. Организаторы пообещали изменить публичные и приватные наборы данных и вообще решить все проблемы, потому что оказалось, что их данные были фактически доступны публично (просто необработанные).
Но победители соревнования не унывали: они снова использовали тот же пайплайн и лучше обучили модель на новых данных + старых. И они достигли 0.72 на лидерборде. Это было странно вдвойне. Они проверили файлы и источник данных скрапинга. Оказалось, что Джо Уайлдер просто удалил часть данных из публичного набора в интернете и использовал его часть в качестве публичного/приватного набора данных для валидации. А у победителей соревнования остались эти данные. И, насколько я понимаю, набор данных больше не изменялся.
Базовая модель
Правило
Правило 🥈 (для соревнований с кодом): подглядывайте. Стоит потратить время, чтобы узнать размер публичного и приватного наборов данных. Проведя двоичный поиск, господа установили, что приватная часть состоит из 1450-1500 сессий.
Правило 2.5: На основе локальных данных можно определить, насколько шумен приватный набор. Для этого запускаем модель на разном объеме данных (1000/2000/5000/10000 сессий) при фиксированном числе фолдов и видим, что стабильные результаты достигаются при объеме данных от 5000 сессий. Это означает, что публичный лидерборд может дезинформировать.
Правило 🥉 : Если лидерборд содержит шум, нужно быть консервативным. Победители добавляли только те признаки, которые значительно улучшали результаты кросс-валидации по сравнению с уровнем шума. Признаки, которые не улучшали результаты, были отброшены, даже если в них сильно верили.
Правило
Правило
Please open Telegram to view this post
VIEW IN TELEGRAM
Kaggle
Predict Student Performance from Game Play
Trace student learning from Jo Wilder online educational game
🔥6
Другие интересные наблюдения:
В приватном наборе данных существовал еще один утечка - использование индексов событий для создания признаков дополнительно повышало результат на публичном лидерборде.
Метод случайного удаления признаков показал плохие результаты, поэтому они использовали поэтапное добавление признаков, чтобы продвигаться вверх, а не спускаться.
В итоге одна модель XGBoost давала результат 0.7025, а предсказания по фолдам дали 0.704 на локальном уровне.
Вторая часть поста завтра
В приватном наборе данных существовал еще один утечка - использование индексов событий для создания признаков дополнительно повышало результат на публичном лидерборде.
Метод случайного удаления признаков показал плохие результаты, поэтому они использовали поэтапное добавление признаков, чтобы продвигаться вверх, а не спускаться.
В итоге одна модель 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 для одной модели, что сопоставимо с результатами градиентного бустинга.
Градиентные бустинги обычно хорошо блендятся с нейронными сетями, поэтому начали пробовать их в отработанном пайплайне.
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 для одной модели, что сопоставимо с результатами градиентного бустинга.
Kaggle
Predict Student Performance from Game Play
Trace student learning from Jo Wilder online educational game
👍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 фолдов нейронных сетей.
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
Forwarded from (sci)Berloga Всех Наук и Технологий
🚀 @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 на нем Вы найдете много интересного о Каггл соревнованиях и дата-сайнс !
👨🔬 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 на нем Вы найдете много интересного о Каггл соревнованиях и дата-сайнс !
👍4❤1
Собрал коротенький ноутбучек с демо фокал лосса в катбусте.
Каггл даже сделал за меня половину работы и установил catboost-1.2 в свой постоянный контейнер. Документации на самом сайте катбуста все еще не подвезли, так что я запилил вам полностью воспроизводимое демо.
Мб самому доку написать на сайт катбуста ?
Каггл даже сделал за меня половину работы и установил catboost-1.2 в свой постоянный контейнер. Документации на самом сайте катбуста все еще не подвезли, так что я запилил вам полностью воспроизводимое демо.
Kaggle
Catboots-1.2 and Native Custom Loss
Explore and run machine learning code with Kaggle Notebooks | Using data from No attached data sources
🔥12❤2👍2
Хочу повторить результат маэстро с этого лб ICR:
В этом соревновании всего 186 семплов на паблик лб и ~257 в прайвете.
Это значит лишь одно- будет очень мощный шейк на прайвете. Решать соревнование в лоб в таком случае очень рискованно (high risk, low reward), но это повод поупражняться в пробинге.
И так подписчики, приглашаю вас засабмитить в эту сореву и возможно накраудсорсить медальку! 🥉️️️️
Если вы вдруг не участвуете в ICR, но хотите пофлексить, то вот рецепт того, что нужно сделать:
1. Заходите в соревнование
2. Копируете мой ноутбук, честно украденный у Вадима Камаева(Чет второй раз подяд я его упоминаю. Не знаю, вдруг это все выльется в броманс?)
3. Выбираете ваше счастливое число, которого нет желательно в комментариях к этому посту. Если вам это сложно, то есть третья с конца ячейка, она помогает выбрать. Число присваиваем в переменную
4. Сабмитите на лб и смотрите на публичный скор
5. Ваше счастливое число и получившийся результа на лб пишем в комменты к этому посту в формате f"{my lucky number} ::: {my public lb score}" Можно еще ссылку на свой публичный ноутбук прислать.
6. ...
7. Аггрегируем результаты под конец соревы и на них учим улучшенную модель для сабмита под прайвет лб
Это каждодневный квест, так что своих результатов можно залить в комменты несколько раз.
А вы как думали? Медальки получает тот, кто лучше карабкается по лб!
#ICR
В этом соревновании всего 186 семплов на паблик лб и ~257 в прайвете.
Это значит лишь одно- будет очень мощный шейк на прайвете. Решать соревнование в лоб в таком случае очень рискованно (high risk, low reward), но это повод поупражняться в пробинге.
И так подписчики, приглашаю вас засабмитить в эту сореву и возможно накраудсорсить медальку! 🥉️️️️
Если вы вдруг не участвуете в ICR, но хотите пофлексить, то вот рецепт того, что нужно сделать:
1. Заходите в соревнование
2. Копируете мой ноутбук, честно украденный у Вадима Камаева
example_numberв следующей ячейке.
4. Сабмитите на лб и смотрите на публичный скор
5. Ваше счастливое число и получившийся результа на лб пишем в комменты к этому посту в формате f"{my lucky number} ::: {my public lb score}" Можно еще ссылку на свой публичный ноутбук прислать.
6. ...
7. Аггрегируем результаты под конец соревы и на них учим улучшенную модель для сабмита под прайвет лб
Это каждодневный квест, так что своих результатов можно залить в комменты несколько раз.
А вы как думали? Медальки получает тот, кто лучше карабкается по лб!
#ICR
😁5🔥3
Давайте еще коротко поговорим о прочих высоких местах в Predict Student Perfomance.
🥈 2 место (это решение еще не было доступно, когда мы в зуме обсуждали сореву, так что оргиинальный контент!)
1. Только LGBM
2. 5 фолдов для валидации, но сабмитили в итоге одну модель, тренированную на полных данных.Lucky strike, не иначе
3. Фич инжиниринг с помощью numba и C (sic!). Просто зайдите и посмотрите, как это выглядит!
🥉 3 место:
1. Тоже нашли публичный датасет и на нем тренировались, но не использовали его для валидации. Так же у них нет никаких заметок про размеры фолдов и нестабильность, а на мой взгляд это очень важная находка, которая в будущем может сильно пригодиться в соревах и даже проде.
2. Тоже использовали вероятности ответов на предыдущие вопросы как фичи.
3.Отбирали фичи по permutation score. Если забыли или не знали, то идея примерно такая:
3a. Учим модель на трейне и смотрим на импортанс, выбираем фичу для проверки (imp_orig)
3b .Перемешиваем эту фичу между объектами рандомно и снова учим модель, замеряем импортанс фичи (imp_shuffle)
3c. Смотрим на то, насколько фича важна относительно 'бейзлайна': imp_orig/imp_shuffle=permutation_score. Отбираем лучшие по этой метрике.
4. Учили одну модель для уровня, которая брала номер вопроса как фичу. Т.е. у них было всего 3 модели в фолде. Интересно, что по их наблюдениям работало не хуже, чем индивидуальные модели. Я об этом думал, но идею отмел, считая, что модель для каждого вопроса будет априорно лучше.
5. Стакали xgb/catboost с трансформерами. Было три разных, два предсказывали на уровне левела (использовали конформер-архитектуру), один предсказывал сразу 18 таргетов по полной сессии (стандартный трансформер).
🏅 4 место:
1. 5 фолдов, три трансформера, три катбуста, три лгбм
2. Линейная регрессия как металернер
да, так было можно
Вообще почти все топовые места пишут, что лучший перфоманс у них занимали оптимизированные для Efficiency prize решения, из которых тяжелые оверфитные штуки пытались вырезать для ускорения. А оказалось- для регурялизации.
🏅8 место:
Из интересного: парни использовали бининг индексов. Просто порезали индексы на участки в 30/50 индексов и добавили как фичу и им это дал импрув. Вот что значит не случайные сессии.
1. Только LGBM
2. 5 фолдов для валидации, но сабмитили в итоге одну модель, тренированную на полных данных.
3. Фич инжиниринг с помощью numba и C (sic!). Просто зайдите и посмотрите, как это выглядит!
🥉 3 место:
1. Тоже нашли публичный датасет и на нем тренировались, но не использовали его для валидации. Так же у них нет никаких заметок про размеры фолдов и нестабильность, а на мой взгляд это очень важная находка, которая в будущем может сильно пригодиться в соревах и даже проде.
2. Тоже использовали вероятности ответов на предыдущие вопросы как фичи.
3.Отбирали фичи по permutation score. Если забыли или не знали, то идея примерно такая:
3b .Перемешиваем эту фичу между объектами рандомно и снова учим модель, замеряем импортанс фичи (imp_shuffle)
3c. Смотрим на то, насколько фича важна относительно 'бейзлайна': imp_orig/imp_shuffle=permutation_score. Отбираем лучшие по этой метрике.
5. Стакали xgb/catboost с трансформерами. Было три разных, два предсказывали на уровне левела (использовали конформер-архитектуру), один предсказывал сразу 18 таргетов по полной сессии (стандартный трансформер).
🏅 4 место:
1. 5 фолдов, три трансформера, три катбуста, три лгбм
2. Линейная регрессия как металернер
Вообще почти все топовые места пишут, что лучший перфоманс у них занимали оптимизированные для Efficiency prize решения, из которых тяжелые оверфитные штуки пытались вырезать для ускорения. А оказалось- для регурялизации.
🏅8 место:
Из интересного: парни использовали бининг индексов. Просто порезали индексы на участки в 30/50 индексов и добавили как фичу и им это дал импрув. Вот что значит не случайные сессии.
Please open Telegram to view this post
VIEW IN TELEGRAM
Kaggle
Predict Student Performance from Game Play
Trace student learning from Jo Wilder online educational game
🔥10👍6❤1🌭1
Запрети мне псевдолейблить
Хочу повторить результат маэстро с этого лб ICR: В этом соревновании всего 186 семплов на паблик лб и ~257 в прайвете. Это значит лишь одно- будет очень мощный шейк на прайвете. Решать соревнование в лоб в таком случае очень рискованно (high risk, low reward)…
Крис тоже пробил, чертяка
Но вообще я нашел ноутбук с рассуждениями, которые наталкивают на мысли, как это делается
#ICR
Но вообще я нашел ноутбук с рассуждениями, которые наталкивают на мысли, как это делается
#ICR
🔥7
Тем временем у Kaggle появился свой Discord сервак.
У кого-то есть понимание вообще, зачем всему нужны дискорд серверы? Я буквально никогда не находил никакой полезной информации в этих дискордах и внятных ответов на вопросы тоже не получал
Kaggle
New Official Kaggle Discord Server! | Kaggle
💯5
Этого соревнования боялись даже чеченцы...
Свои впечатления я бы выразил так.
Меня с Иваном Исаевым скинуло с 639 места в 802
Мы старались построить максимально консервативную стратегию, но трясучка всех уровняла.
Алерона скинуло с 12 в 6608/6712
Я конечно обещал Алерону ад, но без Израиля.
В ТОП-100 есть человек 30 с одним едиственным сабмитом.
Как писал автор Data Feeling- действительно лоторея.
Я даже не знаю, стоит ли по нему писать райтап. Думаю найду пару людей, которые говорили 'А МЫ ЗНАЛИ' и выберу отборные перлы из их постов. А нормальные райтапы разберу по соревнованию Google Research - Identify Contrails to Reduce Global Warming. Там хоть что-то интересное есть.
#ICR
Свои впечатления я бы выразил так.
Меня с Иваном Исаевым скинуло с 639 места в 802
Мы старались построить максимально консервативную стратегию, но трясучка всех уровняла.
Алерона скинуло с 12 в 6608/6712
Я конечно обещал Алерону ад, но без Израиля.
В ТОП-100 есть человек 30 с одним едиственным сабмитом.
Как писал автор Data Feeling- действительно лоторея.
Я даже не знаю, стоит ли по нему писать райтап. Думаю найду пару людей, которые говорили 'А МЫ ЗНАЛИ' и выберу отборные перлы из их постов. А нормальные райтапы разберу по соревнованию Google Research - Identify Contrails to Reduce Global Warming. Там хоть что-то интересное есть.
#ICR
❤3👍1😢1
Из интересного, что удалось вынести для ICR, это разобраться какие бывают оверсемплинги для табличек. По ссылке оригинальный пост Ивана Исаева, с которым решали ICR, который я переписываю немножко сюда + дополняю своими мыслями.
Оверсемплинг стоит попрбовать при соблюдении двух условий:
1. У вас не слишком большой датасет
2. Сэмплов одного класса явно больше, чем другого, но не экстримально. Например соотношение от 19:1 к 5:1.
Оба условия важны:
Если нарушается первое- вы скорее всего решаете RTB и тут надо просо из бесконечного стрима положить в модель больше информации, а проблемой вероятностей займется калибровка уверенности. Обязательно почитайте пост в блоге Дьяконова, там очень интересно.
Если нарушается второе, то вам либо можно особо не париться, либо париться особо. Например подменять задачу с классификации на детекцию аномалий/сужать задачу/играть в искуственное расширение данных другими способами. Например играть в задачу 'разладки'. К пограничному случаю тут относится например проблема поиска фрода, где может и одновременно не работать классификация.
Например в ICR положительным классом было наличие одной из трех болезней. Все кто здоров- те нолики, прочие- единички.
A 509 объектов (здоровые)
B 61 samples (болезнь B )
G 29 samples (болезнь G)
D 18 samples (болезнь D)
На вскидку можно оверсемплить уже несколькими способами:
Эквивалентный баланс
Баланс положительных по наибольшему положительному классу
Баланс между негативным и позитивным классами
A 509 или 509 или 509
B 509 169 169
G 509 169 120
D 509 169 80
С постановкой задачи вроде разобрались, чуть попозже обсудим, как можно решать умнее. #ICR
Оверсемплинг стоит попрбовать при соблюдении двух условий:
1. У вас не слишком большой датасет
2. Сэмплов одного класса явно больше, чем другого, но не экстримально. Например соотношение от 19:1 к 5:1.
Оба условия важны:
Если нарушается первое- вы скорее всего решаете RTB и тут надо просо из бесконечного стрима положить в модель больше информации, а проблемой вероятностей займется калибровка уверенности. Обязательно почитайте пост в блоге Дьяконова, там очень интересно.
Если нарушается второе, то вам либо можно особо не париться, либо париться особо. Например подменять задачу с классификации на детекцию аномалий/сужать задачу/играть в искуственное расширение данных другими способами. Например играть в задачу 'разладки'. К пограничному случаю тут относится например проблема поиска фрода, где может и одновременно не работать классификация.
Например в ICR положительным классом было наличие одной из трех болезней. Все кто здоров- те нолики, прочие- единички.
A 509 объектов (здоровые)
B 61 samples (болезнь B )
G 29 samples (болезнь G)
D 18 samples (болезнь D)
На вскидку можно оверсемплить уже несколькими способами:
Эквивалентный баланс
Баланс положительных по наибольшему положительному классу
Баланс между негативным и позитивным классами
A 509 или 509 или 509
B 509 169 169
G 509 169 120
D 509 169 80
С постановкой задачи вроде разобрались, чуть попозже обсудим, как можно решать умнее. #ICR
Анализ малых данных
Проблема калибровки уверенности
Удивительно, но нигде нет хорошей обзорной работы по всем методам калибровки модели — процесса в результате которого «чёрные ящики» не просто качественно решают задачу классификации, но ещё и…
👍9🤡2👨💻1
Рубрика "изи контрибьюшн"
Пока ездил, посмотрел синтаксис Rust, собрался с силами и законтрибьютил в величайшую Rust-библиотеку для анализа табличных данных за последнюю тысячу лет(переименовал функцию в rust бекенде и в питонической обвязке) и страшно собой доволен. Теперь буду вам продавать использование МОЕЙ БИБЛИОТЕКИ.
Вообще во многих популярных инструментах есть задачи, которые можно за пару вечеров собрать и потом всю жизнь гордиться, как ты делал мир лучше. Я бы предложил для легкого старта портировать пару лоссов в CatBoost с CPU на GPU. Там всего лишь ванильно с плюсов переписать на CUDA код и распараллелить под векторные вычисления. Ну и догадаться, на что нужно абсолютные пути яндексовых серваков поменять, чтобы скомпиллить этого франкенштейна. Тут любой профан справится
Кстати, а есть уже какой-то бустинг, который на Rust написали? :0
Пока ездил, посмотрел синтаксис Rust, собрался с силами и законтрибьютил в величайшую Rust-библиотеку для анализа табличных данных за последнюю тысячу лет
Вообще во многих популярных инструментах есть задачи, которые можно за пару вечеров собрать и потом всю жизнь гордиться, как ты делал мир лучше. Я бы предложил для легкого старта портировать пару лоссов в CatBoost с CPU на GPU. Там всего лишь ванильно с плюсов переписать на CUDA код и распараллелить под векторные вычисления. Ну и догадаться, на что нужно абсолютные пути яндексовых серваков поменять, чтобы скомпиллить этого франкенштейна. Тут любой профан справится
Кстати, а есть уже какой-то бустинг, который на Rust написали? :0
GitHub
depr(python, rust!): Rename `count_match` to `count_matches` by I8dNLo · Pull Request #11028 · pola-rs/polars
Closes #10907
Renamed all occurrences of count_match to count_matches. Also rename CountMatch to CountMatches as mentioned in #10907
Renamed all occurrences of count_match to count_matches. Also rename CountMatch to CountMatches as mentioned in #10907
😁6🥰1🕊1
Запрети мне псевдолейблить
Из интересного, что удалось вынести для ICR, это разобраться какие бывают оверсемплинги для табличек. По ссылке оригинальный пост Ивана Исаева, с которым решали ICR, который я переписываю немножко сюда + дополняю своими мыслями. Оверсемплинг стоит попрбовать…
#ICR #таблицы #аугментация
Попробуем короткий формат?
Первый из небанальных кандидатов для апсемплинга- Gaussian Noise Up-sampling. Идея простая:
0. Выбираем параметры нормального распределения для каждой фичи
1. Из класса, которого меньше, выбираем объект
2. Добавляем к его признакам случайный нормальный шум
3. Добавляем получившийся синтетический объект в датасет для обучения (оригинальные объекты класса мы туда изначально не добавляем)
Теоретически работать должно лучше обычного апсемплинга, потому что объекты разные, их больше и они 'аугментированные'. В statistical learning где-то даже есть теоретический результат: если параметры шума аугментации меньше или сравнимы с реальным шумом измерения признака, то модель будет асимптотически лучше оценивать истинные параметры. Тут важно помнить, что семлируем мы с повторениями- это уменьшает итоговую дисперсию оценки параметров. Для линейных моделей даже доказательство есть.
Казалось бы, а зачем ты, Дима, про линейные модели рассказываешь? Мы же бодрые-молодые датасентисты из 2018, мы Catboost учим и стакаем с LightGBM. Дело в том, что теоретические трюки, улучшающие линейные модели обычно помогают и более сложным моделям работать лучше. Обычно.
Из плюсов:
1. Может быть лучше, чем обычные веса для классов, если правильно готовить параметры распределения шума для признаков
2. Работает для регрессии
3. Апсемплинг с повторениями позволяет уменьшить влияние выбросов
Проблемы у такого подхода тоже очевидные:
1. Параметры истинного распределения ошибки измерения признаков нам никто не даст ->
2. Параметры надо подбирать
3. То, что текущие параметры дают модель, которая работает на валидации лучше, совсем не значит, что мы их лучше подобрали, эти параметры тоже легко оверфитнуть
4. Не все ошибки измерения признаков распределены нормально (вспомним категориалки)
5. С пропущенными значениями тоже совершенно не ясно, что делать
6. Мы искусственно раздуваем данные, что замедляет пайплайн
Попробуем короткий формат?
Первый из небанальных кандидатов для апсемплинга- Gaussian Noise Up-sampling. Идея простая:
0. Выбираем параметры нормального распределения для каждой фичи
1. Из класса, которого меньше, выбираем объект
2. Добавляем к его признакам случайный нормальный шум
3. Добавляем получившийся синтетический объект в датасет для обучения (оригинальные объекты класса мы туда изначально не добавляем)
Теоретически работать должно лучше обычного апсемплинга, потому что объекты разные, их больше и они 'аугментированные'. В statistical learning где-то даже есть теоретический результат: если параметры шума аугментации меньше или сравнимы с реальным шумом измерения признака, то модель будет асимптотически лучше оценивать истинные параметры. Тут важно помнить, что семлируем мы с повторениями- это уменьшает итоговую дисперсию оценки параметров. Для линейных моделей даже доказательство есть.
Казалось бы, а зачем ты, Дима, про линейные модели рассказываешь? Мы же бодрые-молодые датасентисты из 2018, мы Catboost учим и стакаем с LightGBM. Дело в том, что теоретические трюки, улучшающие линейные модели обычно помогают и более сложным моделям работать лучше. Обычно.
Из плюсов:
1. Может быть лучше, чем обычные веса для классов, если правильно готовить параметры распределения шума для признаков
2. Работает для регрессии
3. Апсемплинг с повторениями позволяет уменьшить влияние выбросов
Проблемы у такого подхода тоже очевидные:
1. Параметры истинного распределения ошибки измерения признаков нам никто не даст ->
2. Параметры надо подбирать
3. То, что текущие параметры дают модель, которая работает на валидации лучше, совсем не значит, что мы их лучше подобрали, эти параметры тоже легко оверфитнуть
4. Не все ошибки измерения признаков распределены нормально (вспомним категориалки)
5. С пропущенными значениями тоже совершенно не ясно, что делать
6. Мы искусственно раздуваем данные, что замедляет пайплайн
🔥7💩2🐳2👍1
#ICR #SMOTE
Другой возможный подход к оверсемплингу данных для минорного класса это SMOTE: synthetic minority over-sampling technique
Тут экспериментируем уже с тем, как аугментировать данные.
Вместо добавления случайного шума, мы делаем чуть более хитрую процедуру:
1. Выбираем объект из минорного класса с повторениями
2. Находим N его ближайших соседей
3. Между признаками выбранного объекта и его соседями берем линейную комбинацию и получившийся пример кладем в наш синтетический датасет
4. (Опционально) Андерсемплим мажорный класс
Из плюсов (кроме уже упомянутых):
0. Всего один параметр
1. Может быть лучше, чем обычные веса для классов, если правильно подобрать количество соседей
2. Не так зависим от нормального распределения
Из ключевых минусов:
1. Не ясно, что делать с категориалками
2. Все еще надо подбирать параметры (хотя и проще)
3. Аутлаер может сгенерировать кучу очень 'интересных семплов'
Другой возможный подход к оверсемплингу данных для минорного класса это SMOTE: synthetic minority over-sampling technique
Тут экспериментируем уже с тем, как аугментировать данные.
Вместо добавления случайного шума, мы делаем чуть более хитрую процедуру:
1. Выбираем объект из минорного класса с повторениями
2. Находим N его ближайших соседей
3. Между признаками выбранного объекта и его соседями берем линейную комбинацию и получившийся пример кладем в наш синтетический датасет
4. (Опционально) Андерсемплим мажорный класс
Из плюсов (кроме уже упомянутых):
0. Всего один параметр
1. Может быть лучше, чем обычные веса для классов, если правильно подобрать количество соседей
2. Не так зависим от нормального распределения
Из ключевых минусов:
1. Не ясно, что делать с категориалками
2. Все еще надо подбирать параметры (хотя и проще)
3. Аутлаер может сгенерировать кучу очень 'интересных семплов'
👍5🤮2🏆1
#ICR
Идея оверсемплинга используя простые модели получила развитие и в другую сторону:
GMOTE: Gaussian based minority oversampling technique for imbalanced classification adapting tail probability of outliers
Идея:
1. Кластеризуем наш датасет с помощью гаусовских смесей (EM)
2. С помощью измерения расстояния Махаланобиса (сейчас объясню), считаем, является ли пример выбросом
3. Снова кластеризуем с помощью EM
4. Семплируем из оставшихся кластеров с повторениями
Расстояние Махаланобиса- мера для того, чтобы учитывая корреляцию и дисперсию признаков, померять похожесть
D(x,y) - расстояние Махаланобиса между точками xx и yy.
x и y - векторы признаков (наблюдения).
S ^−1 - обратная ковариационная матрица, которая учитывает корреляции между признаками и дисперсии каждого признака. Вычисляется на основе данных.
Каждый кластер семплируем пропорциональное его размеру. Каждый семпл внутри кластера семплируем обратно пропорционально расстоянию от центра.
Количество кластеров кстати выбирается автоматически, по BIC (а зачем еще нужны EM, да?)
Из плюсов:
1. Дополнительных параметров для оптимизации не прибалвяется
2. Избавляемся как минимум от части выбросов
3. Можем оценивать правдоподобие для разных моделей
Из минусов:
1. Проблмеа категориалок
2. EM тоже могут оверфитнуться
3. Никак не аугментируем данные
Идея оверсемплинга используя простые модели получила развитие и в другую сторону:
GMOTE: Gaussian based minority oversampling technique for imbalanced classification adapting tail probability of outliers
Идея:
1. Кластеризуем наш датасет с помощью гаусовских смесей (EM)
2. С помощью измерения расстояния Махаланобиса (сейчас объясню), считаем, является ли пример выбросом
3. Снова кластеризуем с помощью EM
4. Семплируем из оставшихся кластеров с повторениями
D(x,y) - расстояние Махаланобиса между точками xx и yy.
x и y - векторы признаков (наблюдения).
S ^−1 - обратная ковариационная матрица, которая учитывает корреляции между признаками и дисперсии каждого признака. Вычисляется на основе данных.
Каждый кластер семплируем пропорциональное его размеру. Каждый семпл внутри кластера семплируем обратно пропорционально расстоянию от центра.
Количество кластеров кстати выбирается автоматически, по BIC (а зачем еще нужны EM, да?)
Из плюсов:
1. Дополнительных параметров для оптимизации не прибалвяется
2. Избавляемся как минимум от части выбросов
3. Можем оценивать правдоподобие для разных моделей
Из минусов:
1. Проблмеа категориалок
2. EM тоже могут оверфитнуться
3. Никак не аугментируем данные
👍6😁2💩2
Тут новая фича вышла:
1. Обновляем телеграмм
2. Бустим канал по ссылке: https://news.1rj.ru/str/pseudolabeling?boost
3. Получаем благословление до самого конца большой игры
1. Обновляем телеграмм
2. Бустим канал по ссылке: https://news.1rj.ru/str/pseudolabeling?boost
3. Получаем благословление до самого конца большой игры
💩4🤮1