Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
194 - Telegram Web
Telegram Web
Forwarded from Derp Learning
This media is not supported in your browser
VIEW IN TELEGRAM
Mito

Клёвая либа для питона. Встраивает практически MS Excel в эти ваши jupyter notebooks.

При этом позволяет экспортировать манипуляции в питон-код для pandas, который можно потом использовать без установки Mito.

Огромный минус - не работает в колабах, vscode итд. Вижу такое применение: ставите локально, делаете свой ДАТАСАЙЕНС МЕДЖИК, а экспортированный код используете в остальных местах.

Лонгрид тут
Forwarded from Denis Sexy IT 🤖
Люблю такие пересечения данных:
🔵 Синим – количество случаев заражения ковидом за сутки в США

🔴 Красным – отзывы в Амазоне на ароматизированные свечи бренда «Yankee Candles» с текстом вроде «Они не пахнут»

Думаю пройдут годы, прежде чем досконально опишут как вирус повлиял на все «сетевым эффектом» 🥲

P.S. Отдельно проверили – до пандемии не было таких скачков в отзывах, то есть не сезонное.
#AB

Вышла хорошая статья от коллег про пре- и постстратификацию. Рекомендую прочитать на досуге
​​С наступающим 2022 годом, господа и дамы подписчики!

В этом году у меня получилось выполнить почти все цели, которые я ставил. Я бы оценил процент выполнения в ~85-90%, что весьма неплохо.

В следующем году я ожидаю еще больше приключений (знакомые знают почему). Но все это будут весьма приятные (и местами полезные) приключения.

Собственно, вам желаю того же. Чтобы в этом году у вам были только приятные и полезные приключения, которые приводили бы к новым вехам в жизни и новым артефактам!

P.S. Ru-Dalle - это уже заезженная тема. Но хотелось какую-нибудь необычную картинку поставить к посту ;)
Channel photo updated
#video

Раз уж недавно собрали плейлист лучших выступлений на DataFest 2021 года, то стоит вспомнить крутые видео оттуда.

Одно из них от моей подруги, Даши Прониной. Называется "Что специалист по Data Science может подсмотреть у разработчиков". Очень рекомендую к просмотру тем, кто не видел. Благо, на праздниках вполне могут найтись свободные полчаса.
#management

Продолжаем потихоньку подходить к рабочим будням.

Сегодня закину классный сборник материалов для продактов от CPO YouDo - Адама Елдарова. Можно даже сказать, что это некий "курс молодого бойца" для продактов.

Если интересны материалы по этому направлению - смело могу советовать пройтись по этому списку. Хорошенько подкачаете продуктовые скиллы.
Forwarded from Время Валеры
Я почитал недавно статью на хабре про АБ тесты от одной компании
С удивлением обнаружил что там ниспровергается Cuped (точнее определенная формула)

И приводится этот код для проверки
Код из статьи воспроизведен без изменений (число итераций увеличено в 10 раз) в ячейке номер 2

Ячейка 2 выдает следующее
Не попал в 85.07000000000001% случаев; доверительный интервал: [84.36%, 85.76%]
Выглядит и вправду плохо, при ожидаемом уровне в 5% мы наблюдаем уровень ложно положительных результатов многократно выше


Я обратил внимание на то, что на одном и том же датасете считается сontrol before как ковариата и как вычитаемое среднее, к сожалению здесь ошибка и так делать нельзя. Это классический пример переобучения. Примерно как валидироваться на трейне и потом попасть впросак на новом датасете

Правится это следующим образом, вычитаемое среднее считается глобально по всему датасету (например если в а/б тест отправилось 5% юзеров, то среднее будем считаться по всем 100% и можем учесть чуть больший период времени)

В идеальном мире это выглядело бы вот так
Я бы просто знал параметры распределения и использовал их для вычитания среднего, хотя тогда и А/Б не нужен (строчка 8)
Ячейка 3

Допустим я не знаю параметры распределения, но у меня много данных, тогда будет вот так (строчка 4 и 9)
Ячейка 4

Вот как будет это выглядеть в реальной жизни при самом плохом случае, когда мы сравниваем группу А и Б и допустим что никаких других данных у нас нет
Ячейка 5

Вот как будет это выглядеть в реальной жизни при наличии каких то данных, кроме самих групп А и Б или А1 и А2
Ячейка 6

Вы можете позапускать код самостоятельно и убедится что во всех четырех случаях цифры будут около 5% , но пожалуй пристальнее всего стоит смотреть на то как будет в реальной жизни

Также, для сравнения дал пример где накинул очень маленький шум в качестве эффекта, cuped поймал его в половине случаев, без cuped - только в пяти из ста
Ячейка 7 и 8 соответственно

P.S. Кажется я знаю откуда может идти идея ниспровержения. По моему я был один из первых людей, сделавших доклад о Cuped на русском
В моем репозитории Cuped как раз был реализован с этой ошибкой, о чем я знал последние года два, но не придавал значения
Чуть подробнее мы разобрали это в ОДС в Июле 2021 года в этом треде

#ArticleReview
​​#statistics

Propensity score mathcing. Что это такое?

Кажется, что к концу праздников все уже подустали отмечать, так что можно рассказать про что-нибудь посложнее и поинтереснее, дабы начать вливаться в более иди менее "боевой" режим.

Итак, зачем нам вообще что-то такое нужно?
Конечно, круто иметь рандомизированное исследование, где все разбито по фен-шую и есть сопоставимые группы объектов. Но, увы, такая роскошь нам доступна не всегда. И в обычной жизни чаще встречаются не особо случайные разбиения на группы.

Но нам же хочется хотя бы приблизиться к похожему на случайное разбиение. То есть достичь хотя бы псевдорандомизации. И тут нам на помощь приходит один из методов достижения нашей цели. А именно - propensity score matching.

Что есть propensity score? По сути, это оценка условной вероятности того, что при заданных признаках элемент выборки попадет в treatment. То есть, получается, что нам нужно попробовать оценить, сколь вероятно, что именно этот объект попадет в treatment (а мы помним, что разбиение у нас не является случайным -> какие-то признаки и/или их сочетание приводят к попаданию в treatment).

Кажется, что это повод прикрутить сюда машинное обучение ;)

Давайте попробуем сделать модель, которая по признакам объекта будет предсказывать, попадет ли он в treatment, или нет. Результатом ее работы и будет искомый propensity score.

Ок, у нас есть некий score. Что дальше?
А дальше мы делаем взвешивание наших объектов на основе того, какой у них propensity score. Логика проста - нам нужно сделать так, чтобы учитывались как можно более похожие объекты, но с двух сторон баррикад (с treatment и без). Для этого и будем учитывать нашу оценку. Называется такой метод Inverse Probability of Treatment Weighting (IPTW), т.к. он изменяет вес на основании вероятности того, что этот элемент получил treatment. Думаю, лучше принцип объясняет картинка, которую приложил к посту.

При этом, нам нужно, чтобы каждый (или хотя бы большинство) элементов имело шанс попасть и в treatment и в его отсутствие. То есть, распределения для treated и untreated должны пересекаться. Иначе мы попытаемся сравнить совсем уже различные сущности, что приведет к неверной оценке.

Дополнительно нам желательно проверить, что суммы для 1/P(x) и 1/(1 - P(x)) примерно совпадают с размером нашей популяции, то есть, что у нас нет перекосов во взвешивании.

И стоит не забывать, что нам все еще желательно оценить не точечный эффект, а какой-то доверительный интервал эффекта. Для этого можно делать бутстрапированную оценку, просто делая ресэмплы нашей выборки, считая propensity score и делая взвешивание для этой конкретной выборки с последующим получением Average Treatment Effect (ATE).

Но стоит помнить, что метод не универсален и имеет свои минусы, а также подвергается критике в научном сообществе (пример - вот это видео).

Типичные проблемы метода:
1. Улучшение классификации на treatment и его отсутствие не превращается в улучшение балансирующих свойств нашего метода. По сути, нам лишь нужно учесть признаки, которые приводят к дисбалансу, но не сделать лучший классификатор;
2. В случае, когда у нас слабо пересекаются распределения (например, максимальный propensity score для untreated 0.7, а для treated - 0.99), мы можем привнести bias в нашу оценку, т.к. у нас попросту нет похожих сущностей, которые мы могли бы сравнить.

Лично я считаю, что для применения в индустрии метод может быть полезен. Т.к. это уже шаг в сторону улучшения точности наших оценок эффектов.
Со своими минусами, но и с плюсами, которые все же перевешивают.
#management

Синдром установки на неудачу. Что это такое?

Прочитал недавно интересный материал по "синдром установки на неудачу". И хотел бы немного про него рассказать.

Итак, у нас есть менеджер (М) и работник (Р).

Обычно, синдром развивается по следующему сценарию:
1. Предположим, что по какой-то причине (иногда вовсе не зависящей от него) Р допускает серьезную оплошность. В народе: "косорезит".
2. На это, очевидно, обращает внимание М. И начинает пристальнее следить за проблемным сотрудником.
3. Р начинает нервничать, ощущая пристальный взгляд в затылок от М. И пытается работать усерднее, чтобы "искупить трудом" свой проступок. Ну и начинает подгорать.
4. При этом, М не перестает пристально следить за подчиненным, т.к. тот еще в фокусе внимания, ибо "косячит".
5. В какой-то момент работник начинает уставать от того, что его незримо считают тем, за кем нужно пристально следить, а также от того, что слишком усердствует. Начинаются непроизвольные ошибки, накапливается усталость и разочарование.
6. М видит, что Р опять начинает допускать мелкие (или не особо мелкие) оплошности и понемногу терять мотивацию. И М еще больше утверждается в своем мнении о сотруднике.
7. В итоге получаем петлю обратной связи, которая может привести к выгоранию Р с последующими негативными последствиями (вплоть до увольнения).


P.S. Понятное дело, что есть категория объективно слабых сотрудников. К ним это менее применимо. Но все же стоит помнить про этот синдром. И периодически пересматривать свои отношения к подчиненным (а правда ли он настолько хорош/плох, как я думаю?). Ну и ставить более объективные мерила того, хорошо ли справляется подчиненный.
P.P.S. Позже опишу, как выходить из этой петли обратной связи.
27.01 пройдет первый в этом году X5 Data Driven митап. Будет несколько докладов про А/Б тестирование и около него.

Я там тоже буду выступать, так что если хотите послушать - регистрируйтесь (ссылка ниже).

Доклады митапа:
- AБ-тестирование в офлайн ритейле. Особенности дизайна эксперимента;
- AБ-тесты на скоррелированных объектах;
- Как перестать беспокоиться и полюбить метаанализ;
- Doubly Robust Difference-in-Differences Estimators: обзор способа оценки эффекта.

Регистрация по ссылке
#management

Синдром установки на неудачу. Решения.

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

1. Нужно создать комфортную атмосферу для общения обеих сторон.
Иначе, одна из сторон обязательно сразу будет в защитной стойке. И открытого диалога не выйдет.
2. Определить проблему и ее причины стоит совместными усилиями.
Если одна из сторон просто опирается на ощущения или продавливает свое видение проблемы, то компромисса достичь не получится.
Опять же, если не найти причину - то деятельных выводов их такой беседы извлечь не выйдет.
3. Нужно договориться о показателях того, насколько хорошо идут дела. И о "перезагрузке".
Первое поможет объективно оценивать прогресс и положение на шкале "плохо-хорошо" для обеих сторон. И опираться на факты в дальнейшем общении.
"Перезагрузка" нужна, чтобы избавиться от багажа предрассудков. Если продолжить с того же места, то смысла в предыдущих пунктах будет мало. Кстати, именно эту часть я считаю самой сложной, т.к. весьма непросто очистить мнение от уже существующей истории взаимодействия.
4. Сделать последующие встречи такими же комфортными и открытыми.
Это позволит честнее общаться друг с другом и впредь иметь меньший уровень непонимания.
По ссылке запись митапа, на котором в четверг выступал с докладом про метаанализ. И ссылка на саму презентацию.
#statisics

Что такое Conditional Average Treatment Effect (CATE) и зачем нам его считать?

Начнем с того, что такое Average Treatment Effect (ATE). Тут все просто. В рандомизированных исследованиях ATE используется, как мера эффекта. По сути, это просто средняя разница между группами. Когда мы проводим A/B тест, обычно это мы и хотим узнать - насколько в среднем мы сделали лучше?

Ок, но что делать, если наш treatment воздействует на разных пользователей по-разному? К примеру, у нас есть люди, которые перестанут у нас покупать, если мы проведем коммуникацию с ними. Или наоборот, есть только те, кто купит после коммуникации? 

Здесь и появляется Conditional Average Treatment Effect (CATE)

Что же это такое? На самом деле, тут все лишь чуть сложнее, чем в случае ATE. Итак, у нас есть некоторые подгруппы пользователей, которые реагируют на наше воздействие по-разному. Значит, мы можем оценить наш ATE в рамках этих групп. Получим некоторый условный ATE, то есть как раз CATE (т.к. у нас conditional effect). 

Обычно, CATE может использоваться при нарушении SUTVA (Stable Unit Treatment Value Assumption), то есть при нарушении предположения о независимости результатов от наличия или отсутствия treatment у других пользователей, а также от того, что у нас нет разных вариантов treatment, которые могут привести к отличию результатов. Именно в таких случаях, чтобы получить какие-то оценки нашего эффекта от treatment, мы используем CATE.

В следующих заметках рассмотрим Meta-learners, которые призваны оценивать CATE посредством ML.
​​Meta learners. Что это такое и с чем это едят? S-learner и T-learner

Мета-алгоритм (или meta-learner) - фреймворк для оценки Conditional Average Treatment Effect (CATE) с использованием любых ML алгоритмов (называемых base learners). 

При этом, у нас есть несколько разных вариантов для того, как проводить оценку CATE. Сегодня поговорим про простые методы - S-larner и T-learner. 

Итак:
1. В случае S-learner мы учим модель на наших признаках и дополнительной фиче - метках был ли treatment или нет. Для теста мы используем два набора данных - где для treatment стоят все единицы и все нули. Разница предсказаний позволяет оценить CATE. Стоит отметить, что S-learner прост в реализации, но имеет важный минус - смещение эффекта от treatment относительно нуля;
2. В случае T-learner, мы используем две разных модели: одну учим на признаках с treatment = 1, другую - на признаках с treatment = 0. То есть это уже не признаки для одной модели, а способ разделить на две модели. На тесте мы получаем разность предсказаний двух моделей. Это и будет нашей оценкой CATE. Увы, и T-learner не лишен изъянов. Хотя мы и решаем проблему смещения оценки, но все же мы не защищены от т.н. regularization bias.
Например, у нас мало объектов с treatment, но много без него. Плюс, у нас есть нелинейность в результатах. Но общий treatment эффект является константой. Тогда мы обучим простую модель для объектов с treatment и модель посложнее для объектов без treatment. В итоге, мы перенесем нашу нелинейность в оценку только для сложной модели, где есть достаточно много наблюдений. Что неверно, т.к. наш общий treatment эффект константен. То есть мы внесли некоторый bias в оценку эффекта.

В этой заметке мы рассмотрели что такое meta-learners и конкретно S- и T-learner. Позже рассмотрим более сложные X- и R-learner. Думаю, что каждый из них заслуживает отдельной заметки.
​​Meta-learners. X-learner.

Переходим к более advanced историям. И начнем с x-learner. Объяснять этот meta-learner сложнее, чем предыдущие два (S, T-learner). Но в реализации он не так уж и сложен.

Итак, поехали.

В X-learner у нас две стадии + используется propensity score (о нем я писал ранее):
- На первом шаге делаем все точно по рецепту T-leaner. Напомню: обучаем две модели для наличия и отсутствия treatment;
- На втором шаге мы делаем небольшой "финт ушами" и вычитаем из реальных значений для наличия или отсутствия treatment предсказания для противоположной модели. Например, для отсутствия treatment получим: M_1(X, T=0) - Y_0 (где M_1 обучена на признаках с наличием treatment, предсказание сделано на признаках с отсутствием treatment, аY_0 - реальные значения отклика без treatment);
- Далее обучаем еще две модели (M'_1, M'_0), которые предсказывают разность со второго шага

Но, у нас все еще проявляется все та же проблема, что и в T-learner (при нелинейном эффекте мы его видим для одной более сложной модели и не видим для менее сложной).

Что же делать? Давайте применим propensity score!

Что именно мы сделаем:
- Учим нашу модель для получения propensity score;
- Используем полученный proprensity score (обозначим его e(x)) для того, чтобы скомбинировать предсказания двух моделей (M'_0 * e(x) + M'_1 * (1 - e(x))). Если описать логику этого шага просто - то давайте назначим больший вес той модели, которая имела больше данных при обучении.

Схему всего процесса удобнее посмотреть на приложенном к посту изображении.
This media is not supported in your browser
VIEW IN TELEGRAM
​​Meta learners. R-learner.

Завершаем серию постов про meta-learners последним типом: R-learner.

Итак, мы все еще хотим оценить CATE. Ранее мы уже рассмотрели несколько вариантов такой оценки.

Еще один вариант был предложен в 2017 году в следующей статье (за авторством Xinkun Nie и Stefan Wager).

Что же мы хотим сделать? А мы хотим построить такую функцию потерь, при оптимизации которой, мы бы получали асимптотически близкий к реальности результат. Ну и (естественно) получали ответ на вопрос: "Какой эффект будет дляi-го объекта при его наборе признаковX_i?"

Какие у нас тут предположения:
1. Пересечение распределений (что было в заметке про propensity score) вероятности. То есть у нас для каждого объекта есть ненулевой шанс попасть в группу с воздействием (ну и в контроль, соответственно);
2. Решение о попадании в Treatment и результат независимы друг от друга при условии признаков пользователя

И как мы можем записать эту функцию потерь? Расширенную версию я позаимствовал отсюда (см. прикрепленное изображение + обязательно советую прочитать и первоисточник).

Но если упрощать, то:
1. Мы строим две модели для предсказания treatment и количественного значения результата на основании фичей объекта;
2. Используем запись, которая соединяет наши модели в единую связку (формула 1 на изображении + см. Robinson Decomposition по ссылкам из поста);
3. Выражаем оттуда ошибку, берем ее квадрат (формулы 2, 3);
4. Т.к. у нас уже есть две модели предсказания, то мы можем подставить их значения в наши формулы. И минимизировать результирующую функцию, чтобы получить оценку CATE (tau(X_i) в формулах на изображении).

То есть при реальном применении это выглядит так:
1. Обучаем две модели с k-fold валидацией;
2. Используем out-of-fold предсказания, чтобы получить остатки для treatment (например, цены товара) и результирующего значения outcome (например, суммарной стоимости покупки);
3. Получаем веса в виде квадрата остатков target;
4. Трансформируем outcome в виде: остатки outcome / остатки target;
5. Учим модель предсказывать трансформированное значение с учетом весов из п.3;
6. На тесте уже предсказываем моделью из п.5.

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

Итак, мы рассмотрели R-learner. Концепция весьма сложная, так что я бы рекомендовал еще почитать дополнительные материалы, особенно эту презентацию. Там все подробно изложено (но страниц там 30, а я несколько ограничен размером поста ;))
#recsys

Что такое Learning to Rank (LTR)? Pointwise, pairwise, listwise подходы к задаче обучения ранжированию.

Начнем с постановки задачи. Что мы имеем и что хотим получить?

Итак, мы имеем некоторый набор документов D и запрос q. И хотим выучить некоторую функцию f(q, D), которая бы каждому из документов D выдавала некий показатель релевантности таким образом, чтобы наиболее релевантные документы находились выше, то есть имели более высокий score.

В случае pointwise постановки задачи, мы переформулируем нашу задачу в обычный формат регрессии или классификации. То есть мы поступаем максимально прямолинейно - учим модель предсказывать нечто на метках.
Соответственно, нам нужно знать некие оценки релевантности, иначе у нас таргета не будет. Ну и учитывать мы будем только один элемент, а не всю информацию о множестве, что не очень хорошо.

В случае pairwise подхода, мы переформулируем задачу в виде классификации вида: больше ли релевантность одного документа, чем другого? При этом, задачу можно сформулировать в вероятностном виде: Pr(i > j) = 1 / (1 + exp(-(s_i - s_j))). Если проще, то в следующем формате: если релевантность одного документа выше другого, то вероятность того, что наша функция f выдаст для него больший score, должна стремиться к 1.
Увы, даже при таком подходе функция скоринга все еще считает поточечно, так что мы не полностью используем доступную нам информацию.

Ну и в случае listwise подхода, мы пытаемся оптимизировать целевую метрику напрямую. И тут сталкиваемся со сложностью - наши метрики ранжирования не очень-то дифференцируемы (при желании попробуйте дифференцировать DCG).
Получается, нам нужно использовать некую аппроксимацию (ListNet), либо эвристики (например, LambdaRank), позволяющие обойти эту проблему.

Общие принципы мы рассмотрели, в следующих заметках постараюсь раскрыть подходы подробнее.
​​#recsys

Сегодня поговорим о ListNet. Что это такое и в чем основная идея подхода?

Как я упомянул в прошлой заметке, при реализации listwise подхода, мы можем использовать аппроксимацию или эвристику. В случае ListNet, мы аппроксимируем нашу реальную функцию потерь похожей, но хотя бы такой, чтобы ее было возможно оптимизировать.

Что же мы делаем?
Если очень просто, то учимся предсказывать некий score для наших элементов из выдачи. По нему и сортируем - получается выдача с учетом релевантности.

Но тут же возникает вопрос - а как нам учиться на всем этом?
Ответ, который дают авторы: давайте отобразим наш набор скоров в вероятностное распределение. Его и будем сравнивать с реальным вероятностным распределением. При этом, мы смотрим на top-1 permutation probability.

Но что это такое?
Если просто - то авторы предполагают, что у нас есть вероятность получить любую перестановку элементов в списке с помощью нашей ранжирующей функции. Но некоторые из этих перестановок более вероятны, чем другие. Соответственно, мы можем оптимизировать правдоподобие получаемых результатов.

Но и здесь наш ждет проблема.
Напрямую оптимизировать такое не выйдет. Оттого и переходят к top-1 permutation probability, что, по сути, является суммой вероятностей перестановок, где n-й элемент списка стоит на первом месте. При этом, авторы показывают, что эта top-1 вероятность эквивалентна экспоненте(score_n) / сумму экспонент всех скоров. Что подозрительно напоминает softmax. Wow! Получается, что нам можно просто использовать softmax и не особо заморачиваться обо всех этих permutation probabilities.

Но как же посчитать разницу между распределениями, чтобы было что оптимизировать?
На выручку к нам приходит дивергенция Кульбака-Лейблера. Весьма классический и типичный подход.

Получается следующая картина:
1. Мы создаем набор признаков query - document (например, это может быть эмбеддинг того и другого, если мы говорим о текстах);
2. Нарезаем тензоры нужного размера (например, для каждого запроса есть выдача по 20 релеватных документов, а эмбеддинги для них имеют размерность 100 -> получаем размерность (20, (200)), т.к. 100*2, ибо запрос + ответ;
3. Учим сеть на результатах, отсортированных по оценкам реальной релеватности (которые можем получить в любом виде: начиная от 0 и 1 для кликов, заканчивая суммой покупки, все зависит от вашей фантазии);
4. В процессе обучения минимизируем KL-дивергенцию.

В итоге, получаем сеть, которая учится ставить score каждому документу в выдаче к запросу, учитывает всю нашу выдачу, а также оптимизирует функцию, близкую к реально желанному результату.
На изображении к посту я добавил обобщенную визуализацию процесса (можно заметить, что в случае RankNet используется несколько иная аппроксимация).

P.S. Дополнительно рекомендую почитать реализацию toy example по ссылке.
👍1
2025/07/13 22:33:21
Back to Top
HTML Embed Code: