Теория вероятностей на практике.
Или как школьный теорвер помогает в работе MLщика.
Представьте себе ситуацию - у вас есть модель бинарной классификации, которая что-то предсказывает. После того, как она выдала вам вероятность положительного класса, если она больше чем некоторый порог, вы делаете доп.проверку с помощью эвристик (чтобы убрать лишние False Positive варианты), и после этого уже выдаете итоговое предсказание. У вас есть новая модель, которой вы хотите заменить старую. Она работает лучше, но для нее порог для подачи в доп.проверку будет другой. Соответственно, хочется научиться оценивать, сколько в итоге сэмплов при каком-то пороге пройдет доп.проверку после работы новой модели.
Если записать на языке теории вероятности, то мы хотим оценить P(доп.проверка пустила | predict > threshold). Но есть нюанс - часть сэмплов, на которых новая модель выдала большой скор, у старой модели имели маленький скор, и не попали на доп.проверку. Поэтому напрямую оценить эту вероятность не получится. Что же нам тогда делать?
Воспользуемся формулой Байеса: P(доп.проверка пустила | predict > threshold) = P(predict > threshold | доп.проверка пустила) * P(доп.проверка пустила) / P(predict > threshold). Имея выборку, посчитать знаменатель и первый множитель не составляет труда. Однако что делать с P(доп.проверка пустила)? Мы все еще не можем напрямую оценить эту вероятность.
Воспользуемся формулой полной вероятности: P(доп.проверка пустила) = P(доп.проверка пустила | predict_old > threshold_old) * P(predict_old > threshold_old) + P(доп.проверка пустила | predict_old <= threshold_old) * P(predict_old <= threshold_old). Первый множитель мы оценить можем, но что делать со вторым? Мы хотим получить оценку на эту вероятность сверху, чтобы оценить итоговую вероятность сверху (если итоговая система выдала положительный класс, делается много действий, например это может быть классификатор поломки детали на производстве, соответственно мы хотим контролировать кол-во False Positive результатов). Если у старой модели сработала ситуация, что predict_old <= threshold_old, то, так как та модель все еще обладала нормальной точностью и полнотой, можем смело предположить что P(доп.проверка пустила | predict_old <= threshold_old) < P(доп.проверка пустила | predict_old > threshold_old). Тогда, упростив выражение, получим P(доп.проверка пустила) <= P(доп.проверка пустила | predict_old > threshold_old), а вероятность справа мы уже можем оценить по выборке.
Собираем все вместе: P(доп проверка пустила | predict > threshold) < P(predict > threshold | доп.проверка пустила) * P(доп.проверка пустила | predict_old > threshold_old) / P(predict > threshold). Теперь, подбирая threshold, мы можем оценивать кол-во сэмплов с положительным классом, которые мы предскажем на проде.
Вот так, с помощью простых трюков с вероятностью получилось вывести полезный результат для валидации нашей модели.
Или как школьный теорвер помогает в работе MLщика.
Представьте себе ситуацию - у вас есть модель бинарной классификации, которая что-то предсказывает. После того, как она выдала вам вероятность положительного класса, если она больше чем некоторый порог, вы делаете доп.проверку с помощью эвристик (чтобы убрать лишние False Positive варианты), и после этого уже выдаете итоговое предсказание. У вас есть новая модель, которой вы хотите заменить старую. Она работает лучше, но для нее порог для подачи в доп.проверку будет другой. Соответственно, хочется научиться оценивать, сколько в итоге сэмплов при каком-то пороге пройдет доп.проверку после работы новой модели.
Если записать на языке теории вероятности, то мы хотим оценить P(доп.проверка пустила | predict > threshold). Но есть нюанс - часть сэмплов, на которых новая модель выдала большой скор, у старой модели имели маленький скор, и не попали на доп.проверку. Поэтому напрямую оценить эту вероятность не получится. Что же нам тогда делать?
Воспользуемся формулой Байеса: P(доп.проверка пустила | predict > threshold) = P(predict > threshold | доп.проверка пустила) * P(доп.проверка пустила) / P(predict > threshold). Имея выборку, посчитать знаменатель и первый множитель не составляет труда. Однако что делать с P(доп.проверка пустила)? Мы все еще не можем напрямую оценить эту вероятность.
Воспользуемся формулой полной вероятности: P(доп.проверка пустила) = P(доп.проверка пустила | predict_old > threshold_old) * P(predict_old > threshold_old) + P(доп.проверка пустила | predict_old <= threshold_old) * P(predict_old <= threshold_old). Первый множитель мы оценить можем, но что делать со вторым? Мы хотим получить оценку на эту вероятность сверху, чтобы оценить итоговую вероятность сверху (если итоговая система выдала положительный класс, делается много действий, например это может быть классификатор поломки детали на производстве, соответственно мы хотим контролировать кол-во False Positive результатов). Если у старой модели сработала ситуация, что predict_old <= threshold_old, то, так как та модель все еще обладала нормальной точностью и полнотой, можем смело предположить что P(доп.проверка пустила | predict_old <= threshold_old) < P(доп.проверка пустила | predict_old > threshold_old). Тогда, упростив выражение, получим P(доп.проверка пустила) <= P(доп.проверка пустила | predict_old > threshold_old), а вероятность справа мы уже можем оценить по выборке.
Собираем все вместе: P(доп проверка пустила | predict > threshold) < P(predict > threshold | доп.проверка пустила) * P(доп.проверка пустила | predict_old > threshold_old) / P(predict > threshold). Теперь, подбирая threshold, мы можем оценивать кол-во сэмплов с положительным классом, которые мы предскажем на проде.
Вот так, с помощью простых трюков с вероятностью получилось вывести полезный результат для валидации нашей модели.
👍14🔥8👏4🤩3❤1
This media is not supported in your browser
VIEW IN TELEGRAM
❤32❤🔥10🤮6🔥5
ML-легушька
Админа забеспокоило, что он тратит слишком много денег на кофе. Чтобы следить за этим (это крайне муторно делать через сбер + ломает его и так плохую статистику), поэтому я решил сделать простенького телеграм бота для трекинга расходов на кофе. Основной код…
Итак, я провел масштабный рефакторинг, и наконец-то бот запущен, задеплоен на яндекс клауде (надеюсь никакая пропущенная мной бага не положит все), и его можно потыкать!
Это пока что самая первая версия, она будет дорабатываться. Мой первый относительно нормальный проект, не связанный с чистым ML.
Бот: @coffee_tracker_bot
Код: github.com/Kutuz4/Coffee-Tracker (можете поставить луйков на репо, буду благодарен)
Конструктивная критика огненно приветствуется
Это пока что самая первая версия, она будет дорабатываться. Мой первый относительно нормальный проект, не связанный с чистым ML.
Бот: @coffee_tracker_bot
Код: github.com/Kutuz4/Coffee-Tracker (можете поставить луйков на репо, буду благодарен)
Конструктивная критика огненно приветствуется
GitHub
GitHub - Kutuz4/Coffee-Tracker
Contribute to Kutuz4/Coffee-Tracker development by creating an account on GitHub.
❤🔥8👍8💩3
ML-легушька
Итак, я провел масштабный рефакторинг, и наконец-то бот запущен, задеплоен на яндекс клауде (надеюсь никакая пропущенная мной бага не положит все), и его можно потыкать! Это пока что самая первая версия, она будет дорабатываться. Мой первый относительно нормальный…
По планам на развитие:
1) добавить доп.функционал для удобства типо удаления кофеен/напитков если что-то не так ввел
1.1) переехать на нормальную бд
2) собрать большой датасет и запилить рекомендашку кофе (тут будет очень много интересных ML и не ML задач типо матчинга кофеен с разными названиями в одни, и прочее)
3) В оооочень далеком будущем я перепишу это на го
1) добавить доп.функционал для удобства типо удаления кофеен/напитков если что-то не так ввел
1.1) переехать на нормальную бд
2) собрать большой датасет и запилить рекомендашку кофе (тут будет очень много интересных ML и не ML задач типо матчинга кофеен с разными названиями в одни, и прочее)
3) В оооочень далеком будущем я перепишу это на го
👍15🤮4😈1
Сегодня мы раскатили мою модель в яндексе в тестовом режиме и она нашла свое первое ДТП!!!
💯35😍13🔥7😭2👍1
#доброеутро
Уснул в 00:30, проснулся в 9:30 и ещё час валялся в кровати, так как теорию колец и полей отменили. Встал, закинул вещи стираться, набрал себе ванну. Полежал в ванне, приятно. Встал и сделал завтрак-обед (следующий полноценный приём пищи только в ~19, а на физру голодным не хочется). Это был салат филадельфия (как ролл но оно все перемешано), суп с лососем и шпинатом и вот такой бутербродик (выглядит не так эстетично, но это очень вкусно). Теперь еду на пары, а после них открывается хакатон по цифровой фармакологии, будем со своими хорошими знакомыми пробовать что-то занять :) Всем хорошей пятницы
Уснул в 00:30, проснулся в 9:30 и ещё час валялся в кровати, так как теорию колец и полей отменили. Встал, закинул вещи стираться, набрал себе ванну. Полежал в ванне, приятно. Встал и сделал завтрак-обед (следующий полноценный приём пищи только в ~19, а на физру голодным не хочется). Это был салат филадельфия (как ролл но оно все перемешано), суп с лососем и шпинатом и вот такой бутербродик (выглядит не так эстетично, но это очень вкусно). Теперь еду на пары, а после них открывается хакатон по цифровой фармакологии, будем со своими хорошими знакомыми пробовать что-то занять :) Всем хорошей пятницы
🔥32❤5🌭1
ML-легушька
Почему в листья деревьев решений не могут вставлять KNN? Если лист разделился не полностью. Это же будет иметь лучший перфоманс в ряде случаев, и будет помогать бороться с переобучением
Один хороший человек это имплементировал, и это действительно в части задач дало хороший буст
Скоро будет новый пост на эту тему, там будет про interpretable ML и с кучей матеши
Скоро будет новый пост на эту тему, там будет про interpretable ML и с кучей матеши
🔥18🤯1
Про хакатон: я участвовал в команде с очень крутым млщиком, но у которого не было такой мат.базы как у меня, поэтому я скорее генерировал какие-то идеи, а он их реализовывали. Сам что-то тоже пописал, но не очень много, ибо свои дела были.
В целом я доволен - подольше пообщался с пакетами и разными приёмами для хемоинформатики, проверил всякие гипотезы про кодирование графов на практике, вспомнил как учить трансформеры.
Сам хакатон был организован очень странно, с точки зрения критериев оценки, там немалую часть занимает парсинг. Ну и договор об отчуждении права интеллектуальной собственности тоже пахнет не очень))
В целом я доволен - подольше пообщался с пакетами и разными приёмами для хемоинформатики, проверил всякие гипотезы про кодирование графов на практике, вспомнил как учить трансформеры.
Сам хакатон был организован очень странно, с точки зрения критериев оценки, там немалую часть занимает парсинг. Ну и договор об отчуждении права интеллектуальной собственности тоже пахнет не очень))
🤩10🌭4❤🔥2👍1🔥1
Почему для сегментации временных рядов нельзя просто посчитать в скользящем окне моменты выборки с 2ого по 10ый условно и впихнуть в катбуст? 🤔🤔🤔
Это же буквально сегментация пространства распределений
Это же буквально сегментация пространства распределений
🤔8💩1
ML-легушька
Почему для сегментации временных рядов нельзя просто посчитать в скользящем окне моменты выборки с 2ого по 10ый условно и впихнуть в катбуст? 🤔🤔🤔 Это же буквально сегментация пространства распределений
Пояснение: тут я имел в виду немного специфичную сегментацию рядов, которая возникает у меня в задаче в хуавее и во многих других, уверен.
В каждом сегменте тут поведение "ряда" описывается некоторым распределением с неизвестными параметрами и само распределение тоже неизвестно, то есть соседние точки у нас ± i.i.d. Наша задача - научиться понимать, в какой момент распределение меняет свои параметры, и среди этих изменений параметров с помощью ML вытянуть, что эти изменения соответствуют конкретному "событию", порождающему такие параметры
В каждом сегменте тут поведение "ряда" описывается некоторым распределением с неизвестными параметрами и само распределение тоже неизвестно, то есть соседние точки у нас ± i.i.d. Наша задача - научиться понимать, в какой момент распределение меняет свои параметры, и среди этих изменений параметров с помощью ML вытянуть, что эти изменения соответствуют конкретному "событию", порождающему такие параметры
👍4
ML-легушька
Про хакатон: я участвовал в команде с очень крутым млщиком, но у которого не было такой мат.базы как у меня, поэтому я скорее генерировал какие-то идеи, а он их реализовывали. Сам что-то тоже пописал, но не очень много, ибо свои дела были. В целом я доволен…
Ура, из 72 команд мы попали в 27, которые получат сертификат участника.
Может быть там просто у остальных по каким-то обязательным критериям непроход, но все равно приятно
Может быть там просто у остальных по каким-то обязательным критериям непроход, но все равно приятно
👍16❤3
ML-легушька
Я в шцпм!
Для детей было необходимо сделать "шаблон" проекта - простенький, которому они могут следовать. Их проекты должны выглядеть в основном как телеграм бот + нейронка для классификации/детекции, встроенная в него. Если кому-то интересно, то выкладываю и сюда: https://github.com/Kutuz4/codaim_bot_template . Там нет комментариев, ибо я разберу все на лекции, но бот достаточно простой, при этом использует немалую часть инструментов аиограмма - работу с медиа, клавиатуры, машину состояний. Можете потыкать-разобраться
GitHub
GitHub - Kutuz4/codaim_bot_template: Telegram bot template for кодиим.цпм.рф
Telegram bot template for кодиим.цпм.рф. Contribute to Kutuz4/codaim_bot_template development by creating an account on GitHub.
🔥16