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

Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов
Download Telegram
Альтернативная модель (код)

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

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
Собрал коротенький ноутбучек с демо фокал лосса в катбусте.
Каггл даже сделал за меня половину работы и установил catboost-1.2 в свой постоянный контейнер. Документации на самом сайте катбуста все еще не подвезли, так что я запилил вам полностью воспроизводимое демо.

Мб самому доку написать на сайт катбуста?
🔥122👍2
Блин блинский, и тут на 2к откалибровался. Мне наконец зарендерили медаль и я радуюсь
🔥17👍3👏2
Хочу повторить результат маэстро с этого лб ICR:
В этом соревновании всего 186 семплов на паблик лб и ~257 в прайвете.
Это значит лишь одно- будет очень мощный шейк на прайвете. Решать соревнование в лоб в таком случае очень рискованно (high risk, low reward), но это повод поупражняться в пробинге.
И так подписчики, приглашаю вас засабмитить в эту сореву и возможно накраудсорсить медальку! 🥉️️️️

Если вы вдруг не участвуете в ICR, но хотите пофлексить, то вот рецепт того, что нужно сделать:
1. Заходите в соревнование
2. Копируете мой ноутбук, честно украденный у Вадима Камаева (Чет второй раз подяд я его упоминаю. Не знаю, вдруг это все выльется в броманс?)
3. Выбираете ваше счастливое число, которого нет желательно в комментариях к этому посту. Если вам это сложно, то есть третья с конца ячейка, она помогает выбрать. Число присваиваем в переменную
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 индексов и добавили как фичу и им это дал импрув. Вот что значит не случайные сессии.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍61🌭1
Тем временем у Kaggle появился свой Discord сервак.
У кого-то есть понимание вообще, зачем всему нужны дискорд серверы? Я буквально никогда не находил никакой полезной информации в этих дискордах и внятных ответов на вопросы тоже не получал
💯5
Этого соревнования боялись даже чеченцы...
Свои впечатления я бы выразил так.
Меня с Иваном Исаевым скинуло с 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
👍9🤡2👨‍💻1
Рубрика "изи контрибьюшн"

Пока ездил, посмотрел синтаксис Rust, собрался с силами и законтрибьютил в величайшую Rust-библиотеку для анализа табличных данных за последнюю тысячу лет (переименовал функцию в rust бекенде и в питонической обвязке) и страшно собой доволен. Теперь буду вам продавать использование МОЕЙ БИБЛИОТЕКИ.

Вообще во многих популярных инструментах есть задачи, которые можно за пару вечеров собрать и потом всю жизнь гордиться, как ты делал мир лучше. Я бы предложил для легкого старта портировать пару лоссов в CatBoost с CPU на GPU. Там всего лишь ванильно с плюсов переписать на CUDA код и распараллелить под векторные вычисления. Ну и догадаться, на что нужно абсолютные пути яндексовых серваков поменять, чтобы скомпиллить этого франкенштейна. Тут любой профан справится

Кстати, а есть уже какой-то бустинг, который на Rust написали? :0
😁6🥰1🕊1
Мой славный гитхаб-лик на главной Polars, попирающий сиянием Русов баги
👍6
Запрети мне псевдолейблить
Из интересного, что удалось вынести для 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. Мы искусственно раздуваем данные, что замедляет пайплайн
🔥7💩2🐳2👍1
#ICR #SMOTE
Другой возможный подход к оверсемплингу данных для минорного класса это 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. Никак не аугментируем данные
👍6😁2💩2
Тут новая фича вышла:
1. Обновляем телеграмм
2. Бустим канал по ссылке: https://news.1rj.ru/str/pseudolabeling?boost
3. Получаем благословление до самого конца большой игры
💩4🤮1
Читаю статью про 'новый' алгоритм для ускорения Jacobi SVD, и такой 'что-то не так. Что-то неправильно. Что-то странно...'
А потом скипнул первый параграф и как понял, в чем дело было
🤣12🫡6🗿1
Постепенно возвращаюсь к Kaggle-кранчам и набросал ядро для Open-Problems Single-Cell Pertrubation
Говорят, если его немножко докрутить (в коде есть подсказка) и сблендить с текущими популярными блендами, то можно влететь в медали
🔥10👍1