Дата канальи — про «специалистов» в данных / ML / AI
4.93K subscribers
205 photos
7 videos
12 files
189 links
Корпжиза аналитиков и DS. Если хотите анонимно поделиться историей на широкий круг -- го в личку @NikitaZelinskiy, аналогично по остальным вопросам
Download Telegram
#кейсы #ML

Раз уж пошло про KPI – вот безобидный прием против вредного манагера. Прием для настоящих каналий!

Если вразумлять и просвещать манагера на метрики регресии, распределения остатков и прочее сил уж больше нет, то могу предположить что каналья-манагер не знает разницу между MAPE и MDAPE (и наверняка про MASE, eB, варианты SMAPE, WAPE и тд).

Так что ничего не стоит вам выдать MDAPE за MAPE (и только если спросят – сказать что M это, совершенно очевидно, медиана, разве можно было предположить иначе?!).
В примере ниже мы не будем оптимизировать MAPE напрямую (хотя это не то чтобы сложно – один из методов – взвесить наблюдения на таргет), а просто посмотрите выигрыш (не повторяйте это дома!!!):

import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
x, y = make_regression(n_samples=10_000, n_features=10, n_informative=8, noise=5, shuffle=True, random_state=42)
x_train , x_test, y_train, y_test = train_test_split(x, y, test_size = 0.35, random_state = 42)
import xgboost as xgb
regressor=xgb.XGBRegressor(eval_metric='rmse')
regressor.fit(x_train, y_train)
preds = regressor.predict(x_test)
residuals = preds - y_test
r_mape = np.mean(abs(residuals) / abs(y_test))
r_mdape = np.median(abs(residuals) / abs(y_test))
print(f'MAPE {r_mape:.2f}')
print(f'MDAPE {r_mdape:.2f}')
>>> MAPE 3.74
>>> MDAPE 0.16


а вообще, если интересна тема метрик регрессии -- то лучше всего она освещена в неизданной книге Александра Дьконова
🔥186
Минутка хвастовства) но место-таки второе. Вообще не ожидал что буду преподавать, да еще в ВШЭ, МФТИ и MLInside! Кстати, через 50 мин уже и вебинар
❤‍🔥33
Forwarded from MLinside - школа ML
🤯 50% людей учат темы ML, которые не нужны бизнесу

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

Какие задачи бизнеса требуют решения с применением ML и как их решать? Расскажем на вебинаре 19 декабря в 20:00 (мск)!

Что вас ждет:

▪️Поделимся информацией о том, какие задачи компании хотят реализовать с помощью машинного обучения и как вы сможете их решить.
▪️Расскажем как проверить, что модель действительно работает?
▪️Разберем практические кейсы и проведем эксперименты.
▪️Презентация курса «ML в бизнесе»: Расскажем, как программа курса помогает освоить востребованные навыки, которые делают вас ценным специалистом в любой компании.

👉 Регистрируйтесь здесь

Присоединяйтесь и начните свой путь к успешной карьере в ML!
7
#ML

На вебинаре поступил вопрос про SOTA-трансформеры для временных рядов.
В ответ пообещал скинуть сюда в канал свою июньскую лекцию на RuCode по foundation models for time series. Заодно узнаете почему соревы по прогнозированию называются М1, ... M4, M5, M6 и тд.
PS: картинка с веточками в лекции из этой статьи
PPS: кажется, начало лекции не записалось — были тех траблы (
6
#корпжиза

Про KPI и роль HR в жизни DS

В одной крупной организации манагеры нажаловались топам что DS нанимать очень долго (потому лишь что ни они, ни HR нанимать DS не умеют, заинтересовать кандидата не могут, процесс найма выстроить тоже).
За что HR получили KPI на скорость найма DS.

Как реально выглядел найм к тому моменту: постишь вакансию в слаке ODS, получаешь в личку 100+ резюме в первые сутки и сидишь их вручную разбираешь. Потом сам прозваниваешь, сам договариваешься о встрече, сам собесишь, потом отдаешь в HR на оформление.

Услышав новости что HR-таки теперь будет заниматься этим всем я преждевременно возрадовался и попросил HR эту работу сделать (а это в любой компании первейший способ разругаться с HR – попросить их делать их работу).
На что, естественно, был послан в грубой форме – чтобы выполнить KPI HR взяли примерно 10% от ставок DS и объявили что избранные ставки имеют специальный код – и только их и будут нанимать. Когда я историю немного попушил – прилетели лишь разборки и предъявы – а чего это у нас DS не на тех ставках сидят, кто их вообще проверял и тд и тп. По принципу “лучшая оборона – это нападение”. Так что KPI свой на скорость найма DS HRы выполнили, а такие же CDO / CDS в бизнесе продолжили нанимать DS по-старому.

Прошло много лет, организация все так же не умеет ни в найм (ищут поболее чем полгода), ни в кадровые агенства, зато обещает заплатить копейку (или 80 копеек) если кого-то туда порекомендуете. Кстати, я бы советовал относиться скептически – к моменту выплаты может выясниться что рекомендуемый вами друг уже 3 года в HR-базе организации и выплата вам не положена (а поди проверь их базу).
👍7
по мотивам прошлого поста -- поделитесь, пожалуйста, как у вас устроена система найма?
например, я первый квартал собесил всех сам -- калибровался на рынок, затем сделал так:
1) скриннинг с рекрутером (10 случайных блиц-вопросов, вопросы генерит бот в телеге)
2) собес по ml (в зависимости от ветки -- classic / pricing / recsys / nlp)
3) собес sql + python
4) собес с продактом по кейсам / для более инженерных ролей -- system design с тех лидом
а как у вас? как вы к этому пришли?
👍61
#корпжиза

Про KPI и роль HR в жизни DS часть 2
В первой части было как попытка попросить каналий-HR начать нанимать DS привела к тому что внезапно и я оказался не-DS (как и ставки для найма).
Но сюр в том, что как-то за год до той истории, лично самый топовый топ поручил HR нанять не меньше половины списка ТОП 100 DS в РФ. Так как такого списка нигде не было (да и нет, к счастью), в лучших традициях корпоративного управления составить его было поручено тем же самым HR.
Как вы думаете, как же они реально закрыли поручению по найму половины списка ТОП 100 DS в РФ?
Подсказка – я в тот список попал. Потому во второй части было особенно забавно что я не DS.
4
#кейсы #ML

Пацан сказал — пацан сделал! Влад обещал подхватить эстафету — и вот его первая (?) встреча с DS-канальей
Forwarded from Sberloga (🇻 🇱 🇦 🇩)
Короч история будет длинная, сегодня будет первая серия 😁

Когда только в сбер устроился, дали задание поставить в прод рекомендательную систему для дочерней компании, которая с юл работает. Были артефакты, код для инференса, описание как поставить модель и сам отчет о построении. Выглядит все заебись 👍
Ну собственно раз отчет был, я не особо решил вдаваться в подробности, да и был он листов на 15 А4 😩 Наверное только его написание заняло минимум пару недель, читать его не особо хотелось и решил по максимуму сконцентрировать силы на самой задаче 💪
Как оказалось в рамках постановки в прод, должен был быть развернут postgres, и туда нужно было пролить таблицу с какимито эмбедингами по юр лицам. DS по какимто причинам подумал, что будет супер крутой идеей ее сохранить в формате csv, а каждое число хранить с точностью в 19 знаков. В итоге эта таблица оказалась 10млн х 50 в виде текста которая занимает 10Гб в не сжатом виде. Это нужно было выкачать из внутреннего контура и передать во внешнюю компанию. Как я это сделал я уж писать не буду, но я конечно удивлен, что никого после этого не уволили 😅
Кстати в сериализированном виде она весила 300мб всего
Все это отдавал разрабу в дочке (у меня прав не было) и писал ему какие команды запускать. Запустилось ли с первого раза? Конечно же нет (спасибо за охеренное качества код), в общем с разрабом неделю переписывались исправляя раз за разом все новые ошибки 😱
В итоге запустили рекомендашку раньше положенного, все как нужно. Но на следующий день разраб снова пишет
- Влад, а моделька то "твоя" чет хуевая, она же на сайте в риалтайм должна работать, а там время ответа 3сек. Да и то почти по всем клиентам рекомендашки одни и теже...
Ну собтвенно, я попробовал объяснить, что вообще модель то не моя, а девочки которая писала все с нами больше не работает, а ушла в яндекс. Столько мата в свой адрес я еще не слышал. Самый сок была фраза "вы что доверили кодить девушке???" 😂 ну собственно по итогу так и оказалось, не стоило 😅
Короч начал копать этот великолепный код с отчетом, чтобы понять что там не так и знаете что? После csv на 10гб я догадывался, что там будут странности, но вся дичь еще впереди...
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17
#кейсы #ML

История Влада про как ему отдали чужую модель напомнила мне похожую.

Мне тоже передали модель ребят, которые уволились, последний уволившийся был на связи – и на том спасибо. Код обучения и задачу за пару дней запустить модель во внутреннем контуре на инференс, при необходиомсти -- переобучить.

Проблемы начались сразу с pymystem3 – он упорно просился в инет (судя по коду ошибки - стучался в апи яндекса, 2017й год), и первым делом я заменил его на snowball.
Ок, прогоняю код, но на выходе 💩. Смотрю в разметку – там печаль, но это цветочки -- да и поговорим мы про это в сл постах (хотя, как мне сказали, разметку делали 12 человек фуллтайм один месяц). Но самое печальное дальше, трейн состоял из двух файлов – s3.csv и s4.csv, суммарно тысяч на 9,5 строк.

Возникло два вопроса:
- А где файлы s1 и s2????!! – как выяснилось, утеряны, потому как последнему уволившемуся каналье-DS их передавал другой каналья-DS и где-то при передаче они потерялись. Минус половина трейна – работа 12 человек за 2 недели.
- Как сделать так, чтобы каналья, которая сохранила в csv таблицы с текстовыми полями, в которых в полный рост спецсимволы и символы переноса строки, пришла к просветлению и больше никого так не подставляла?

Итого, задача: нужно раскидывать семплы по классам, которых неск десятков и при доразметке появляются новые, а исходных семплов с меткой примерно 9500. Базовых фичей -- несколько сотен, такая вот задачка).
В итоге задача заняла не пару дней, а пару недель до первой пром версии и пару лет до той версии, что несколько лет стояла в проме (а мб и сейчас стоит).

PS: забавно, сейчас такое поведение pymystem3 с выключенным инетом воспроизвести не получилось:

import pymystem3
mystem = pymystem3.Mystem()
text = 'дата канальи -- канал про каналий'
print(', '.join(mystem.lemmatize(text)))
>>> дата, , каналья, -- , канал, , про, , каналья,
👍9🫡1
#корпжиза #кейсы #ML

Москвичей испортил квартирный вопрос, а в нецентрализованной функции DSов портят KPI на фин эффекты.
Построили мы однажды на данных CRM модель оттока клиентских менеджеров.

Оно же как в b2b – продажи по личным контактам, КМ если уходит, старается клиентов с собой забрать, у нового год выходит чтобы выйти на тот же уровень дохода с тех же закрепленных клиентов.

Вопрос, куда внедрять? Попытка внедрить в hr-систему привлекла как муху на говно гопничка, назвавшегося DS тим лидом в HR. Сходу он затребовал половину фин эффекта от уже построенный и провалидированной в оффлайне модели.
Был послан на хуй, внедрили через рассылку в почте на руководителей руководителей и hrbp, провели пилоты, собрали фидбеки, защитили эффекты (кстати неплохие) у финансистов.

Так что если видите что-то внедренное очень криво, модель оттока не использует данные hr-систем и никак в них не отображается – возможно, этому были причины )

PS четверть тех, кому модель ставила высокий скор оттока – оказывались беременными
👍98😁3🤡3
#ML

Хотел расковырять ту старинную версию pymystem3, которая стучалась в инет, нашел что-то еще веселее. Назвали бы Джон Сноу, чтоли
😁12👎2
гугл в переводе тоже не стесняется. Вот такие code review в Яндексе
😁15
#кейсы #ML

Вторая серия каналья-стори от Влада
Forwarded from Sberloga (🇻 🇱 🇦 🇩)
Серия вторая 😄

Отчет значит читаю неспеша, решил сперва понять, что я за эмбединги то выгружал такие, а то вдруг я что неправильно выгрузил 😂
Короч изза того что клиентами были юрлица, то и эмбединги это были своего рода фичи по всем компаниям рф. Но как их сделать? Очень уж хочется понять, что компания 1 похожа на компанию 2. DS почесал то откуда руки росли и светлая мысль пришла откуда и ожидалось - у каждой компании же есть оквэд (код вида деятельности), значит их нужно использовать. Вроде даже и идея то прикольная, но при чем тут эмбеды? Т.е. банально коды в качестве фичей можно было бы использовать, но где же тут DATA SCIENCE а? 🤣
В общем по всем компаниям были спарсены эти коды из интернетов, эти коды были замапплены на словарь с описанием оквэдов, т.е. теперь у каждой компании есть теперь тексты...
Чувствуете, да, чем запахло? Если вы подумали, что тут сейчас NLP бригада подъедет, то вы ошиблись, это же уже DEEP LEARNING будет, а мы рексис ващет строим, поэтому на эти тексты мы натравим word2vec обученный и усредним 😦
Я конечно прихуел... блэд, это конечно было давно, но даже тогда это дерьмо только на курсах показывали, для примера, что "queen-king=woman" и все.
Но мало всего прочего, компании то появляются новые, где их оквэды брать? Как эту базу обновлять? Кто должен этот word2vec применять, а? А у DS лапки 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
Сидел как-то в панели в Сколково, называлась в духе “Data Science от маркетплейсов до промышленности.”
Все бы хорошо, мило болтали с коллегами и ведущим (кто не любит панели? к ним же доклад готовить не нужно).
Но все хорошее заканчивается, и после панели начинаются вопросы из зала.

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

Но вот на днях наткнулся на небольшой канал про каналий-DS на реальном таком металлургическом заводе. Жаль, не знаком с автором, но от историй реально кайфую. @na_zavod_blyat
🔥5
#ML

Все же здесь DS и знают базовые метрики?
Precision?
Precision@k?
А ничего вы не знаете, канальи! 🙈

Прошло пару лет как коллеги со светлой стороны Сбера выпустили свою замечательную статью на NIPS, примечательную такой картинкой

Про то как в разных recsys либах метрики считаются по-разному 😱
Но хотя бы precision@k вроде одинаково? Или нет? 🤔

Рассмотрим угловой кейс – на что делить, когда кандидатов сгенерилось меньше k? 🤓

Правильный ответ здесь– делить на k !!!!
Институт NIST– National Institute for Standards and Technology распространяет код как считать правильно 🥳

На для catboost закон не писан – он делит на число кандидатов 🤬😡🥵

Будьте внимательны! Или перепроверяйте за пакетами или считайте сами!
👍8🤔54🔥2🌚2
Зачем канальям алгоритмы? Например, можно ускорить расчёт дефолтной метрики из склерн раза в три — и на тысячах экспериментов при подборе гиперпараметров это существенно сэкономит время. Как это сделать рассказывает наш тим лид финтеха — Макс Шаланкин
Forwarded from Maxim.ML - канал
Наверняка у каждого на работе бывают моменты, когда нужно просто сесть и подождать чего-либо ☕️. Это может быть долгий запуск программы, долгий расчёт чего-либо, или просто неоптимальная работа не на вашей стороне, а на стороне коллеги, который сделал какой-то кривой процесс, который долго работает⌛️ .

Вот и у меня был один такой кейс, который удалось успешно решить. Он был связан с расчётом популярной метрики в машинном обучении в задаче классификации: ROC AUC. Ниже гайд, как можно оптимизировать и ваши расчеты тоже.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍117🔥5
Свалился под Новый год с температурой, в таком состоянии каждый убивает время по-разному.
Я вот люблю придумывать задачки вроде "приведите пример когда единичное дерево работает лучше случайного леса". Но сейчас у меня температура примерно 38 и в голову пришла совсем странная задачка -- придумать кейс когда изотоническая регрессия лучше бустинга.
И вот:

from sklearn.isotonic import IsotonicRegression
import numpy as np
from sklearn.datasets import make_regression
from xgboost import XGBRegressor
import plotly.graph_objs as go

x, y = make_regression(n_samples=1000, n_features=1, random_state=42, noise=3)
ir = IsotonicRegression()
ir.fit(x, y)
y_pred = ir.predict(x)
params = {'monotone_constraints':'(1)'}
xgb = XGBRegressor(**params, n_estimators=50, max_depth=3, verbosity=0, max_bin = 70, tree_method = 'hist')
xgb.fit(x, y)
y_pred_xgboost = xgb.predict(x)

fig2 = go.Figure()
fig2.add_trace(go.Scatter(x=np.array(x).squeeze(), y=y, mode='markers', name='исходные точки'
, marker=dict(color='LightSkyBlue', size=10)))
fig2.add_trace(go.Scatter(x=np.array(x).squeeze(), y=y_pred, mode='markers', name='изотоническая регрессия'
, line=dict(color='firebrick', width=4, dash='dashdot')))
fig2.add_trace(go.Scatter(x=np.array(x).squeeze(), y=y_pred_xgboost, mode='markers', name='XGB_regressor'
, line=dict(color='Green', width=4, dash='dashdot')))
fig2.update_layout(legend_orientation="v"
, legend=dict(x=.5, y = 0.95, xanchor="center")
, title="бустинг vs изотоник"
, xaxis_title="ордината"
, yaxis_title="абсцисса"
, margin=dict(l=0, r=0, t=50, b=0)
, hovermode="x"
, height=600
, width=900
, font_family="Arial"
, font_color="black"
, font_size = 20
, title_font_family="Times New Roman"
, title_font_size = 30
, title_font_color="black"
, legend_title_font_color="black"
, legend_title_font_size=20
, separators=", .*"
)
fig2.show()
👍5😁1