#recsys
Learning to Rank: LambdaRank и LambdaMart.
Закончим разговор о learning to rank. Сегодня речь будет о LambdaRank (и вариации для бустингов под названием LambdaMart).
Корневая идея, которая лежит под LambdaRank - это идея о том, что нам вместо самой ошибки нужны только градиенты (стрелочки на изображении к посту). То есть мы можем учесть направление и силу "выталкивания" вверх или вниз по списку. При этом, градиенты можно масштабировать посредством вычисления разницы между NDCG, если элементы поменять местами.
Получаем некоторую эвристику. Если мы используем функцию потерь, которая предложена в статье, мы получаем эмпирическое улучшение NDCG. А большего нам и не надо ;)
В случае LambdaMart, мы подменяем нейронную сеть из LambdaRank градиентным бустингом (собственно, MART тут - Multiple Additive Regression Trees). Подробнее можно почитать в этой статье.
Learning to Rank: LambdaRank и LambdaMart.
Закончим разговор о learning to rank. Сегодня речь будет о LambdaRank (и вариации для бустингов под названием LambdaMart).
Корневая идея, которая лежит под LambdaRank - это идея о том, что нам вместо самой ошибки нужны только градиенты (стрелочки на изображении к посту). То есть мы можем учесть направление и силу "выталкивания" вверх или вниз по списку. При этом, градиенты можно масштабировать посредством вычисления разницы между NDCG, если элементы поменять местами.
Получаем некоторую эвристику. Если мы используем функцию потерь, которая предложена в статье, мы получаем эмпирическое улучшение NDCG. А большего нам и не надо ;)
В случае LambdaMart, мы подменяем нейронную сеть из LambdaRank градиентным бустингом (собственно, MART тут - Multiple Additive Regression Trees). Подробнее можно почитать в этой статье.
👍3
Время пролетело незаметно, а нас уже более 200 человек! 🥳🥳🥳
Спасибо всем, кто меня читает. Надеюсь, вы и дальше будете находить на канале нечто интересное для себя.
Спасибо всем, кто меня читает. Надеюсь, вы и дальше будете находить на канале нечто интересное для себя.
🎉6❤3
#books
Сегодня расскажу про книгу "System design: подготовка к сложному интервью".
В книге описывается полтора десятка кейсов построения ответа на вопросах интервью по системному дизайну. Например, одна из глав про проектирование своего собственного YouTube (иронично, судя по последним новостям).
В целом, книга интересная, но новичку будет сложновата. При этом, там много справочных материалов, полезные советы: как лучше построить вопросы интервьюеру, как вводить предположения, как оценивать ресурсы для решения и сильные/слабые стороны "на глазок".
Мне удалось почерпнуть нечто новое из нее, так что скорее склонен ее посоветовать. Особенно полезна она будет, если готовитесь к интервью по дизайну систем.
Сегодня расскажу про книгу "System design: подготовка к сложному интервью".
В книге описывается полтора десятка кейсов построения ответа на вопросах интервью по системному дизайну. Например, одна из глав про проектирование своего собственного YouTube (иронично, судя по последним новостям).
В целом, книга интересная, но новичку будет сложновата. При этом, там много справочных материалов, полезные советы: как лучше построить вопросы интервьюеру, как вводить предположения, как оценивать ресурсы для решения и сильные/слабые стороны "на глазок".
Мне удалось почерпнуть нечто новое из нее, так что скорее склонен ее посоветовать. Особенно полезна она будет, если готовитесь к интервью по дизайну систем.
👍4🔥1
Т.к. по образованию я - инженер-математик, то не могу пройти мимо и не поздравить всех причастных с днем математика!
Не знаю, почему в России его решили назначить на первое апреля, но уж как есть.
Надеюсь, что у вас все сложится, а плюсы в вашей жизни только приумножатся.
Не знаю, почему в России его решили назначить на первое апреля, но уж как есть.
Надеюсь, что у вас все сложится, а плюсы в вашей жизни только приумножатся.
🔥6❤2🎉1
#libraries
Сегодня на повестке дня библиотека с методами детекции выбросов, сдвигов в данных и adversarial историй - alibi-detect.
Очень разнообразный набор методов. При этом, реализованы методы и для широкого набора типов данных (табличные, тексты, изображения и т.д.). Методы от достаточно классических (isolation forest) до весьма современных (context-aware MMD).
Пока особо в деле ее не попробовал, т.к. случая не было. Но выглядит многообещающе. Как минимум, как baseline.
Сегодня на повестке дня библиотека с методами детекции выбросов, сдвигов в данных и adversarial историй - alibi-detect.
Очень разнообразный набор методов. При этом, реализованы методы и для широкого набора типов данных (табличные, тексты, изображения и т.д.). Методы от достаточно классических (isolation forest) до весьма современных (context-aware MMD).
Пока особо в деле ее не попробовал, т.к. случая не было. Но выглядит многообещающе. Как минимум, как baseline.
Forwarded from Reliable ML
Почему Correlation != Causation
В недавнем посте мы поговорили о том, что корреляция не подразумевает причинно-следственную связь.
Давайте теперь обсудим, почему это может быть так.
Общепринято выделять 4 причины.
1. Пропущенная переменная (Omitted variable). В случае, если Х и Y скоррелированы, причиной их изменения может быть другой, третий фактор F, воздействие которого и заставляет X и Y двигаться вместе (сонаправленно). Поэтому, если цель нашего исследования – изменить Y, изменение Х нам с этим не поможет. К изменению Y приведет только изменение F.
В нашем недавнем посте можно найти ряд примеров, когда корреляция не означает причинно-следственной связи, именно по причине пропущенного фактора. Так, в корреляции наличия астмы и низкой вероятности смерти от пневмонии третьим фактором оказалось регулярное врачебное наблюдение, необходимое при астме и оказывающее значительное влияние на снижение смерти от пневмонии. А для корреляции ЗП и сексуальной активности третьим фактором, по мнению автора исследования, является состояние здоровья.
2. Обратная причинность (Reverse Causality). Корреляция X и Y не подразумевает, что Х влияет на Y, поскольку влияние может быть обратным – Y влияет на Х. Самым известным примером reverse causality считается взаимосвязь курения и депрессии. Здесь возможна как прямая взаимосвязь (курение способствует депрессии), так и обратная (подавленное состояние способствует курению). Другие примеры из экономической теории: уровень дохода и счастье, бедность и безработица, сексуальная активность и уровень ЗП.
3. Смещение выборки (Selection bias). Третья возможная причина, почему корреляция не подразумевает причинно-следственной связи – нерепрезентативность выборки, на основе которой мы делаем выводы, для генеральной совокупности. Пример – исследование факторов роста заработной платы. При проведении подобного исследования мы неизбежно рассматриваем только работающих и, следовательно, получающих ЗП на текущий момент людей и делаем выводы о факторах, влияющих на их доход. При этом в выборку не попадают неработающие люди (потерявшие работу, матери в декрете, официально безработные, и др.), данные о которых могут значимо повлиять на результат.
4. Ошибка измерения (Measurement error). Способ получения данных и его уязвимости также могут влиять на результат. Самый распространенный пример – систематическое искажение данных в опросах. Так, пациенты могут систематически приукрашивать данные о регулярности приема лекарств и занижать – о приеме алкоголя. В опросах про доходы также часто встречается завышение низкого дохода и занижение высокого. При этом не каждая ошибка измерения приводит к неверным выводам о причинно-следственной связи. В некоторых случаях она может быть вполне безобидной.
В недавнем посте мы поговорили о том, что корреляция не подразумевает причинно-следственную связь.
Давайте теперь обсудим, почему это может быть так.
Общепринято выделять 4 причины.
1. Пропущенная переменная (Omitted variable). В случае, если Х и Y скоррелированы, причиной их изменения может быть другой, третий фактор F, воздействие которого и заставляет X и Y двигаться вместе (сонаправленно). Поэтому, если цель нашего исследования – изменить Y, изменение Х нам с этим не поможет. К изменению Y приведет только изменение F.
В нашем недавнем посте можно найти ряд примеров, когда корреляция не означает причинно-следственной связи, именно по причине пропущенного фактора. Так, в корреляции наличия астмы и низкой вероятности смерти от пневмонии третьим фактором оказалось регулярное врачебное наблюдение, необходимое при астме и оказывающее значительное влияние на снижение смерти от пневмонии. А для корреляции ЗП и сексуальной активности третьим фактором, по мнению автора исследования, является состояние здоровья.
2. Обратная причинность (Reverse Causality). Корреляция X и Y не подразумевает, что Х влияет на Y, поскольку влияние может быть обратным – Y влияет на Х. Самым известным примером reverse causality считается взаимосвязь курения и депрессии. Здесь возможна как прямая взаимосвязь (курение способствует депрессии), так и обратная (подавленное состояние способствует курению). Другие примеры из экономической теории: уровень дохода и счастье, бедность и безработица, сексуальная активность и уровень ЗП.
3. Смещение выборки (Selection bias). Третья возможная причина, почему корреляция не подразумевает причинно-следственной связи – нерепрезентативность выборки, на основе которой мы делаем выводы, для генеральной совокупности. Пример – исследование факторов роста заработной платы. При проведении подобного исследования мы неизбежно рассматриваем только работающих и, следовательно, получающих ЗП на текущий момент людей и делаем выводы о факторах, влияющих на их доход. При этом в выборку не попадают неработающие люди (потерявшие работу, матери в декрете, официально безработные, и др.), данные о которых могут значимо повлиять на результат.
4. Ошибка измерения (Measurement error). Способ получения данных и его уязвимости также могут влиять на результат. Самый распространенный пример – систематическое искажение данных в опросах. Так, пациенты могут систематически приукрашивать данные о регулярности приема лекарств и занижать – о приеме алкоголя. В опросах про доходы также часто встречается завышение низкого дохода и занижение высокого. При этом не каждая ошибка измерения приводит к неверным выводам о причинно-следственной связи. В некоторых случаях она может быть вполне безобидной.
👍3
#interview
Что такое MapReduce и как он работает?
MapReduce - это модель распределенных вычислений. Потребность в использовании такого рода модели возникает, когда у нас нет возможности физически обработать данные на одной машине. Разработана в недрах Google еще в 2000-х.
При обработке записей, данные проходят через три стадии:
1. Map - на этой стадии мы применяем некоторую функцию к нашему набору значений (что похоже на обычный map из python). В итоге, мы должны получить некоторое множество пар ключ-значение (при этом, для одной записи множество может быть и пустым). На этой стадии происходит предварительная обработка и фильтрация данных. При этом, уже на этом шаге мы можем разбить наши значения на обработку несколькими машинами;
2. Shuffle - на этой стадии пары ключ-значение разбиваются на отдельные множества по значению ключа. Эти множества послужат входными данными для стадии reduce. Это может быть сильно затратной стадией, т.к. нам придется "гонять" наши данные между машинами;
3. Reduce - на этой стадии мы применяем некоторую функцию, которая производит финальные вычисления над данными, полученными с map шага. Полученные на каждой отдельной машине результаты потом склеиваются на т.н. master-ноде.
К посту прилагаю пример того, как выглядит сам процесс для задачи подсчета слов в тексте.
Что такое MapReduce и как он работает?
MapReduce - это модель распределенных вычислений. Потребность в использовании такого рода модели возникает, когда у нас нет возможности физически обработать данные на одной машине. Разработана в недрах Google еще в 2000-х.
При обработке записей, данные проходят через три стадии:
1. Map - на этой стадии мы применяем некоторую функцию к нашему набору значений (что похоже на обычный map из python). В итоге, мы должны получить некоторое множество пар ключ-значение (при этом, для одной записи множество может быть и пустым). На этой стадии происходит предварительная обработка и фильтрация данных. При этом, уже на этом шаге мы можем разбить наши значения на обработку несколькими машинами;
2. Shuffle - на этой стадии пары ключ-значение разбиваются на отдельные множества по значению ключа. Эти множества послужат входными данными для стадии reduce. Это может быть сильно затратной стадией, т.к. нам придется "гонять" наши данные между машинами;
3. Reduce - на этой стадии мы применяем некоторую функцию, которая производит финальные вычисления над данными, полученными с map шага. Полученные на каждой отдельной машине результаты потом склеиваются на т.н. master-ноде.
К посту прилагаю пример того, как выглядит сам процесс для задачи подсчета слов в тексте.
👍4👎1
#statistics
Сегодня давайте рассмотрим такую вещь, как блочный бутстреп (block bootstrapping).
Блочный бутстреп используется для данных, в которых присутствует корреляция между значениями или ошибками предсказания модели. Обычно, такое возникает при работе с временными рядами (автокорреляция значений в них играет с нами злую шутку), но может быть и при пространственной связи (например, в задачах работы с геоданными, либо с иными данными, имеющими кластерную структуру).
Кратко опишем идею методов блочного бутстрепа. Давайте будем тем или иным образом выбирать готовые блоки из данных, которые сохраняют некоторую структурную целостность исходного набора. С множеством этих блоков мы и будем работать дальше.
Основные методы блочного бутстрапирования:
1. Non-overlapping block bootstrap (NBB) - в данном случае, мы выделяем некоторое множество непересекющихся блоков, которые в дальнейшем используем для бутстрапирования;
2. Moving block bootstrap (MBB) - выделяем множество пересекающихся блоков данных некоторой фиксированной длины, после чего с возвращением выбираем подмножество этих блоков и составляем требуемое множество;
3. Circular block bootstrap (CBB) - здесь мы закольцовываем нашу генерацию, чтобы справляться с ситуациями на концах генерируемых множеств. Например, у нас может быть окно с n=5 и ряд в 100 элементов. Должны ли мы тогда останавливаться на последнем блоке с 96 значения по 100? В случае CBB мы можем просто подставить значения из начала нашей серии, то есть будет, например, блок с 99 значения по 3 (99, 100, 1, 2, 3);
4. Stationary bootstrap (SB) - можно рассматривать, как некоторое улучшение MBB. В данном случае, мы используем еще и случайную длину блоков (и еще случайные точки старта этих блоков). Это позволяет исправить проблему нестационарности получаемых наблюдений.
Подробнее про указанные методы можно почитать в этом посте. Описано весьма неплохо и понятно.
А реализацию части приведенных выше методов можно найти здесь.
Сегодня давайте рассмотрим такую вещь, как блочный бутстреп (block bootstrapping).
Блочный бутстреп используется для данных, в которых присутствует корреляция между значениями или ошибками предсказания модели. Обычно, такое возникает при работе с временными рядами (автокорреляция значений в них играет с нами злую шутку), но может быть и при пространственной связи (например, в задачах работы с геоданными, либо с иными данными, имеющими кластерную структуру).
Кратко опишем идею методов блочного бутстрепа. Давайте будем тем или иным образом выбирать готовые блоки из данных, которые сохраняют некоторую структурную целостность исходного набора. С множеством этих блоков мы и будем работать дальше.
Основные методы блочного бутстрапирования:
1. Non-overlapping block bootstrap (NBB) - в данном случае, мы выделяем некоторое множество непересекющихся блоков, которые в дальнейшем используем для бутстрапирования;
2. Moving block bootstrap (MBB) - выделяем множество пересекающихся блоков данных некоторой фиксированной длины, после чего с возвращением выбираем подмножество этих блоков и составляем требуемое множество;
3. Circular block bootstrap (CBB) - здесь мы закольцовываем нашу генерацию, чтобы справляться с ситуациями на концах генерируемых множеств. Например, у нас может быть окно с n=5 и ряд в 100 элементов. Должны ли мы тогда останавливаться на последнем блоке с 96 значения по 100? В случае CBB мы можем просто подставить значения из начала нашей серии, то есть будет, например, блок с 99 значения по 3 (99, 100, 1, 2, 3);
4. Stationary bootstrap (SB) - можно рассматривать, как некоторое улучшение MBB. В данном случае, мы используем еще и случайную длину блоков (и еще случайные точки старта этих блоков). Это позволяет исправить проблему нестационарности получаемых наблюдений.
Подробнее про указанные методы можно почитать в этом посте. Описано весьма неплохо и понятно.
А реализацию части приведенных выше методов можно найти здесь.
👍2
Forwarded from Love. Death. Transformers.
This media is not supported in your browser
VIEW IN TELEGRAM
Ладно, минутка киберпанка их Шанхая, где в связи с новыми ковидными ограничениями происходит рыбалка на дронах.
👍2
#books
Совсем недавно прочитал книгу "Мама, я тимлид! Практические советы по руководству IT-командой".
По итогу - весьма сильно резонирует с моим опытом. Интересная подача и достаточно обширный набор тем, которые автор успел покрыть в книге. При этом, скорее выжимка идей и опыта, но с примерами и иллюстрациями.
Мне книга показалась весьма четкой и емкой + прочитал весьма быстро (ушло два выходных по несколько часов в каждый из них). Ну и подача с юморком. Что я как раз уважаю (ну и там классные картинки с котиками 🐈).
Единственное, что могу отметить из минусов - сильно устарел пункт про распределенные команды. Мысли и подходы там "доковидные", так что стоит на это сделать скидку, я думаю.
В общем, точно могу порекомендовать тем, кто начинает свою работу в качестве тимлида, либо претендует на эту роль в будущем.
Совсем недавно прочитал книгу "Мама, я тимлид! Практические советы по руководству IT-командой".
По итогу - весьма сильно резонирует с моим опытом. Интересная подача и достаточно обширный набор тем, которые автор успел покрыть в книге. При этом, скорее выжимка идей и опыта, но с примерами и иллюстрациями.
Мне книга показалась весьма четкой и емкой + прочитал весьма быстро (ушло два выходных по несколько часов в каждый из них). Ну и подача с юморком. Что я как раз уважаю (ну и там классные картинки с котиками 🐈).
Единственное, что могу отметить из минусов - сильно устарел пункт про распределенные команды. Мысли и подходы там "доковидные", так что стоит на это сделать скидку, я думаю.
В общем, точно могу порекомендовать тем, кто начинает свою работу в качестве тимлида, либо претендует на эту роль в будущем.
👍6
#statistics
Uplift деревья. Что это и зачем нужно?
Итак, что такое uplift деревья?
У нас есть много разных методов оценки uplift-а (про это понятие я ранее писал, как про CATE: Conditional Average Treatment Effect, но вообще это еще может быть и не индивидуальном уровне, то есть ITE: Individual Treatment Effect) для разных ситуаций (ранее я писал про S,T,X,R learners, то есть подходы с использованием meta-learners). Но они имеют свои минусы (к примеру, при использовании двух разных моделей мы получаем двойную ошибку, при разных типах моделей одна может переобучиться, а другая - недообучиться и т.п.). Хочется взять что-то достаточно привычное, что можно было бы использовать напрямую к данной задаче. На выручку к нам приходят решающие деревья (decision tree).
Итак, мы хотим использовать некоторое дерево, которое в узлах будет по некоему критерию разделять наши группы пользователей. Желательно, чтобы этот критерий был как можно ближе к реальности, то есть позволял отделить наш эффект от воздействия на целевую группу.
Какие для этого есть предложения? Предложение следующее - давайте для критерия разделения использовать разницу между нашими распределениями. Чем больше мы разделим распределение в целевой и контрольной группах - тем ближе подберемся к оценке uplift'а.
Здесь у нас есть несколько вариантов:
1. Дивергенция Кульбака-Лейблера (Kullback–Leibler divergence);
2. Евклидово расстояние (Euclidean distance);
3. Дивергенция хи-квадрат (Сhi-squared divergence, отличается от евклидова расстояния тем, что мы вместо
Получается, что при разбиении мы хотим максимизировать дивергенцию (или разницу) между нашими распределениями.
Казалось бы, все ок, с задачей справились. Но! Возникает новая проблема: у нас начинают появляться неравномерные разбиения с большим количеством контрольных объектов или объектов с воздействием. Приходится модифицировать наш критерий таким образом, чтобы учитывалось и количество объектов в разных группах при разделении на ветви дерева (подробнее можно посмотреть здесь).
Обновленная метрика позволяет получить лучшие результаты. Правда, тут стоит заметить, что это все еще не прямая оптимизация uplift'а, а лишь некоторое приближение. Ну и, конечно же, указанную проблему постарались решить в более поздних работах. Про то, что же предложили в этих работах, я расскажу позже.
А пока предлагаю посмотреть реализацию uplift tree в библиотеке causalml от Uber.
Uplift деревья. Что это и зачем нужно?
Итак, что такое uplift деревья?
У нас есть много разных методов оценки uplift-а (про это понятие я ранее писал, как про CATE: Conditional Average Treatment Effect, но вообще это еще может быть и не индивидуальном уровне, то есть ITE: Individual Treatment Effect) для разных ситуаций (ранее я писал про S,T,X,R learners, то есть подходы с использованием meta-learners). Но они имеют свои минусы (к примеру, при использовании двух разных моделей мы получаем двойную ошибку, при разных типах моделей одна может переобучиться, а другая - недообучиться и т.п.). Хочется взять что-то достаточно привычное, что можно было бы использовать напрямую к данной задаче. На выручку к нам приходят решающие деревья (decision tree).
Итак, мы хотим использовать некоторое дерево, которое в узлах будет по некоему критерию разделять наши группы пользователей. Желательно, чтобы этот критерий был как можно ближе к реальности, то есть позволял отделить наш эффект от воздействия на целевую группу.
Какие для этого есть предложения? Предложение следующее - давайте для критерия разделения использовать разницу между нашими распределениями. Чем больше мы разделим распределение в целевой и контрольной группах - тем ближе подберемся к оценке uplift'а.
Здесь у нас есть несколько вариантов:
1. Дивергенция Кульбака-Лейблера (Kullback–Leibler divergence);
2. Евклидово расстояние (Euclidean distance);
3. Дивергенция хи-квадрат (Сhi-squared divergence, отличается от евклидова расстояния тем, что мы вместо
(p - q)**2
используем ((p - q)**2 / q)
).Получается, что при разбиении мы хотим максимизировать дивергенцию (или разницу) между нашими распределениями.
Казалось бы, все ок, с задачей справились. Но! Возникает новая проблема: у нас начинают появляться неравномерные разбиения с большим количеством контрольных объектов или объектов с воздействием. Приходится модифицировать наш критерий таким образом, чтобы учитывалось и количество объектов в разных группах при разделении на ветви дерева (подробнее можно посмотреть здесь).
Обновленная метрика позволяет получить лучшие результаты. Правда, тут стоит заметить, что это все еще не прямая оптимизация uplift'а, а лишь некоторое приближение. Ну и, конечно же, указанную проблему постарались решить в более поздних работах. Про то, что же предложили в этих работах, я расскажу позже.
А пока предлагаю посмотреть реализацию uplift tree в библиотеке causalml от Uber.
👍3
Какие из тем наиболее интересны?
Anonymous Poll
67%
statistics
33%
books
42%
interview
12%
video
33%
libraries
26%
recsys
26%
management
40%
AB
21%
competition
37%
advice
Спасибо всем, кто проголосовал ранее в опросе!
Некоторое время еще повыходят заготовки, но я обязательно учту мнение аудитории. Как раз будет время подумать, какие темы взять на рассмотрение и посидеть над первой из тем.
Некоторое время еще повыходят заготовки, но я обязательно учту мнение аудитории. Как раз будет время подумать, какие темы взять на рассмотрение и посидеть над первой из тем.
#books
На очереди еще одна книга: "Лидер и племя. Пять уровней корпоративной культуры".
Ее очень часто хвалят, много кто советует. Честно, идея книги интересная, но я дочитать не смог. Потому рекомендую краткое содержание (можно посмотреть здесь).
Если коротко, то автор вводит структуру 5 уровней "племен". Каждая организация находится на этой шкале (начиная от банд где-то в Фавелах Бразилии до SpaceX и Илона Маска). И для того, чтобы делать крутые вещи и быть на вершине, нужно поднять организацию до 4 уровня (с редкими подъемами на 5 уровень, где уже организация меняет мир). Примерный смысл каждого уровня на изображении к посту.
Собственно, книга как раз про то, какие это уровни, как работают и как поднимать организацию от уровня к уровню.
Если хотите - можете прочесть полностью. Но я бы рекомендовал поискать краткую выжимку с советами. Они будут весьма занимательны и полезны.
На очереди еще одна книга: "Лидер и племя. Пять уровней корпоративной культуры".
Ее очень часто хвалят, много кто советует. Честно, идея книги интересная, но я дочитать не смог. Потому рекомендую краткое содержание (можно посмотреть здесь).
Если коротко, то автор вводит структуру 5 уровней "племен". Каждая организация находится на этой шкале (начиная от банд где-то в Фавелах Бразилии до SpaceX и Илона Маска). И для того, чтобы делать крутые вещи и быть на вершине, нужно поднять организацию до 4 уровня (с редкими подъемами на 5 уровень, где уже организация меняет мир). Примерный смысл каждого уровня на изображении к посту.
Собственно, книга как раз про то, какие это уровни, как работают и как поднимать организацию от уровня к уровню.
Если хотите - можете прочесть полностью. Но я бы рекомендовал поискать краткую выжимку с советами. Они будут весьма занимательны и полезны.
#statistics
Сегодня речь пойдет про residual bootstrap.
Принцип здесь такой - давайте сэмплировать остатки от изначальной модели, чтобы далее их использовать для построения нового ряда.
Итак, пройдемся по шагам:
1. Строим изначальную модель, чтобы на основании набора признаков
2. Берем наши остатки и случайным образом добавляем к полученным
3. Учим новую модель, но уже на новых
4. Повторяем шаги 2,3 много раз.
Стоит отметить, что данный метод не подойдет для данных с автокорреляцией остатков.
Сегодня речь пойдет про residual bootstrap.
Принцип здесь такой - давайте сэмплировать остатки от изначальной модели, чтобы далее их использовать для построения нового ряда.
Итак, пройдемся по шагам:
1. Строим изначальную модель, чтобы на основании набора признаков
X
предсказывать Y
. Получаем некоторые оценки Y^
. И остатки, то есть разности Y-Y^
;2. Берем наши остатки и случайным образом добавляем к полученным
Y^
, получим некоторые Y'
;3. Учим новую модель, но уже на новых
Y'
. Оцениваем требуемый параметр из регрессии;4. Повторяем шаги 2,3 много раз.
Стоит отметить, что данный метод не подойдет для данных с автокорреляцией остатков.
#interesting_links #marketing
Интересный материал с рассмотрением Adstock функции и использованием вероятностного программирования (полагаю, логично так перевести probabilitistic programming).
Что такое задача Adstock функция? Если коротко - то это способ моделирования эффектов от маркетинга, растянутых во времени.
К примеру, мы запустили рекламную кампанию. Но печаль в том, что на пользователей она действует не мгновенно, нужно, чтобы народ проникся нашим креативом.
Плюс в заметке еще учтен эффект насыщения рынка. То есть, если мы завесили полгорода нашим креативом, то нам нет смысла завешивать остальные полгорода, т.к. это будут деньги на ветер.
Материал сложноват (ибо пользуется магией Байесовского вывода), но любопытен.
P.S. Думаю, попозже напишу что-нибудь про MMM (Marketing Mix Modeling, а не тот, про который вы подумали ;))
Интересный материал с рассмотрением Adstock функции и использованием вероятностного программирования (полагаю, логично так перевести probabilitistic programming).
Что такое задача Adstock функция? Если коротко - то это способ моделирования эффектов от маркетинга, растянутых во времени.
К примеру, мы запустили рекламную кампанию. Но печаль в том, что на пользователей она действует не мгновенно, нужно, чтобы народ проникся нашим креативом.
Плюс в заметке еще учтен эффект насыщения рынка. То есть, если мы завесили полгорода нашим креативом, то нам нет смысла завешивать остальные полгорода, т.к. это будут деньги на ветер.
Материал сложноват (ибо пользуется магией Байесовского вывода), но любопытен.
P.S. Думаю, попозже напишу что-нибудь про MMM (Marketing Mix Modeling, а не тот, про который вы подумали ;))
👍1🔥1
#python
Что такое DataClass и почему его стоит использовать?
Dataclasses – это классы, предназначенные для хранения данных. Суть в том, чтобы не тратить много времени на написание "лишнего" кода, чтобы получить класс для хранения данных. Нам не нужно писать длинную реализацию, переопределять множество методов и пилить собственную логику некоторых операций, т.к. за нас уже сделали достаточно большую часть работы, дав множество плюшек "из коробки".
Если до датаклассов у нас код выглядел примерно так:
То с использованием датаклассов все выглядит чище и красивее:
Помимо уменьшения дополнительного кода, у нас есть и дополнительные плюшки, такие как:
1. Поддержка значений по умолчанию;
2. "Красивое" представление объектов при выводе;
3. Простой перевод в кортеж или словарь;
4. Возможность сделать наш объект
5. Возможность настраивать поведение атрибута посредством field и возможность использовать специальный метод
6. Возможность сравнения атрибутов и сортировки по ним из коробки (то есть нам не надо самим прописывать сравнения).
Стоит отметить, что можно реализовать нечто похожее просто сделав
Итого:
Получаем очень удобный способ работы с контейнерами данных в Python, который позволяет писать меньше кода и проще реализовывать полезные для нас операции (сравнение, преобразования после инициализации и т.п.).
Что такое DataClass и почему его стоит использовать?
Dataclasses – это классы, предназначенные для хранения данных. Суть в том, чтобы не тратить много времени на написание "лишнего" кода, чтобы получить класс для хранения данных. Нам не нужно писать длинную реализацию, переопределять множество методов и пилить собственную логику некоторых операций, т.к. за нас уже сделали достаточно большую часть работы, дав множество плюшек "из коробки".
Если до датаклассов у нас код выглядел примерно так:
class Person():
def __init__(self, first_name, last_name, age, hobby):
self.first_name = first_name
self.last_name = last_name
self.age = age
self.hobby = hobby
То с использованием датаклассов все выглядит чище и красивее:
from dataclasses import dataclass
@dataclass
class Person:
first_name: str
last_name: str
age: int
hobby: str
Помимо уменьшения дополнительного кода, у нас есть и дополнительные плюшки, такие как:
1. Поддержка значений по умолчанию;
2. "Красивое" представление объектов при выводе;
3. Простой перевод в кортеж или словарь;
4. Возможность сделать наш объект
frozen
, то есть неизменяемым;5. Возможность настраивать поведение атрибута посредством field и возможность использовать специальный метод
__post_init__
для добавления атрибутов уже после инициализации (например, для заполнения атрибута на основе значений других атрибутов);6. Возможность сравнения атрибутов и сортировки по ним из коробки (то есть нам не надо самим прописывать сравнения).
Стоит отметить, что можно реализовать нечто похожее просто сделав
tuple, dict
или отдельный класс. А исторически типичным вариантом такой реализации мог бы служить namedtuple
. Но количество дополнительных "танцев с бубном" при использовании вышеуказанных вариантов сильно большее, чем при использовании DataClass
. Итого:
Получаем очень удобный способ работы с контейнерами данных в Python, который позволяет писать меньше кода и проще реализовывать полезные для нас операции (сравнение, преобразования после инициализации и т.п.).
👍6
Я тут из-за праздников совершенно не заметил, а нас уже на канале более трехсот человек!
Спасибо всем, что меня читаете! Мне это греет душу ;)
Спасибо всем, что меня читаете! Мне это греет душу ;)
🎉9🔥3👍2