ML Advertising
Пишу про AdTech и инструменты по работе с данными на проде Для связи: @evgenii_munin
Show more- Subscribers
- Post coverage
- ER - engagement ratio
Data loading in progress...
Data loading in progress...
/Users/<user_name>/.ipython/profile_default/startup
, или если она отсутствует, создайте ее
2. Создайте файл start.py
. Название может быть любым - по сути будут выполнены все .py файлы находящиеся в этой папке
3. Добавьте в него нужные импорты.
Теперь при каждом открытии ноутбука ваши библиотеки уже будут импортированы.From its upfront stage, Netflix announced plans to launch its own ad tech platform, plus new partnerships with programmatic platforms.
Очередной канал про создание и развитие цифровых продуктов который украсит ваш архив Автор @i_merkurev Yandex, ex-MegaFon, ex-Sber
sklearn.datasets.load_diabetes
. Создадим два регрессора CatBoostRegressor
и RandomForestRegressor
. Прогоним для каждой из модели кросс валидацию на 5 фолдов и запишем метрики MSE
двух моделей.
X, y = load_diabetes(return_X_y=True)
rf = RandomForestRegressor()
cb = CatBoostRegressor(verbose=False)
folds = KFold(n_splits=5)
scores_rf = cross_val_score(rf, X, y, scoring='neg_mean_squared_error', cv=folds)
scores_cb = cross_val_score(cb, X, y, scoring='neg_mean_squared_error', cv=folds)
Когда мы получили метрики, нам нужно выбрать какой тест проводить:
- параметрический в предположении, что наши метрики лежат в каком-то распределении
- или более консервативный непараметрический.
Рассмотрим три самых популярных
▶️ Т-тест Стьюдента
Допустим, мы считаем распределение метрик нормальным и их дисперсии равны. Тогда мы можем использовать параметрический Т-тест Стьюдента. Чтобы попрактиковаться, мы можем посчитать Т-тест руками
- Сформулируем гипотезы
- нулевую H0 avg(scores_cb) != avg(scores_r)
- альтернативную гипотезы H1
- двухсторонняя гипотеза avg(scores_cb) != avg(scores_r)
- односторонняя гипотеза avg(scores_cb) < avg(scores_r)
- Вычислим попарные разницы diff
между метриками MSE
моделей
- Вычислим среднюю разницу M
между метриками
- Вычислим стандартное отклонение разниц sd
- Вычислим стандартную ошибку SE = sd / sqrt(n)
- Посчитаем Т-статистику: t = M / SE
- Посчитаем число степеней свободы df = n - 1
(количество значений для расчета стат. величиный, которые могут свободно меняться)
- Далее вносим T-статистику t
и df
в калькулятор T-распределения и по таблице находим уровень значимости pvalue
(вероятности ошибки первого рода)
- Сравним pvalue
с порогом alpha
(как правило, берем 0.05).
- Если тест односторонний, т.е. мы предполагаем, что scores_cb < scores_rf
, то при pvalue < 0.05
мы можем опровергнуть нашу нулевую гипотезу и сказать, что MSE
катбуста значимо меньше случайного леса
- Для двусторонней гипотезы мы делим порог значимости пополам и уже опровергаем H0 из условия pvalue < 0.025
На питоне тест Стьюдента выглядит следующим образом
stats.ttest_rel(scores_rf, scores_cb)
# output: Ttest_relResult(statistic=1.9353919550011929, pvalue=0.12503)
поскольку pvalue > 0.05
, мы не можем опровергнуть нулевую гипотезу
▶️ Т-тест Уэлча
Давайте предположим, что мы по проводили кроссвалидацию с разным числом фолдов:
scores_rf = cross_val_score(rf, X, y, cv=5, scoring='neg_mean_squared_error')
scores_cb = cross_val_score(cb, X, y, cv=10, scoring='neg_mean_squared_error')
В таком случае, тести Стьюдента нам не подходит, поскольку мы уже не можем вычислить попарные разницы. Тогда прибегаем к тесту Уэлча. Здесь нет предположения о равенстве дисперсий, соответственно и выборки могут быть разного размера. Алгоритм следующий:
- H0, H1 формулируем аналогично
- Вычислим средние метрик M1
, M2
- Вычислим дисперсии метрик var1
, var2
- Посчитаем Т-статистику: t = (M1 - M2) / sqrt(var1/n1 + var2/n2)
- Посчитаем число степеней свободы df = n - 1
- Далее также по таблице из t
и df
считаем pvalue
и сравниваем с порогом значимости
На питоне для этого есть функция ttest_ind
stats.ttest_ind(scores_rf, scores_cb, equal_var=False)
# output: Ttest_indResult(statistic=0.8564592491178395, pvalue=0.4077)
A simple calculator that generates a P Value from a T score.
median(scores_cb) != median(scores_r)
- H1
- двухсторонняя гипотеза median(scores_cb != median(scores_r)
- односторонняя гипотеза median(scores_cb) < median(scores_r)
- Также, как и для Т-теста Стьюдента вычислим попарные разницы diff
между моделями (здесь то же самое ограничение на равенство дисперсий и соответсвенно размеров выборок)
- Проранжируем в порядке возрастания их модулей (при этом для повторяющихся значений назначается одинаковый ранг, равный среднему их рангов)
- Суммируем ранги с положительной разницей и обозначим результат, как W+
- То же самое делаем для суммы рангов с отрицательной разницей W-
- Расчитем W-статистику, как W = min(W-, W+)
и сравниваем ее с табличным порогом, чтобы опровергнуть или нет H0.
На питоне пользуемся встроенной функцией
stats.wilcoxon(scores_rf, scores_cb)
# output: WilcoxonResult(statistic=1.0, pvalue=0.125)
A simple calculator that generates a P Value from a T score.
trtexec --workspace=4096 --onnx=model.onnx --saveEngine=engine.trt --best --useSpinWait --outputIOFormats=fp16:chw --inputIOFormats=fp16:chw --verbose
- Здесь первый аргумент задаёт максимальный объём используемой памяти в мегабайтах, то есть для вычисления модели будет доступно 4 гигабайта видеопамяти.
- Следующие два аргумента указывают пути до модели в формате ONNX и до собранного engine (один из результатов запуска утилиты).
- Флаг --best
разрешает использовать любые типы данных для достижения максимальной производительности. Чаще - это низкоразрядные типы данных.
- Следующие флаги задают порядок осей и тип входных / выходных данных модели (как правило FP16).Продолжаем тему портирования и оптимизации ML моделей на проде. Сегодня речь пойдет про TensorRT TensorRT — это фреймворк от Nvidia, который позволяет учитывать нюансы аппаратного устройства вычислителей. В нём модель оптимизируется перед запуском таким образом, чтобы для вычисления каждой операции использовались самые быстрые алгоритмы на конкретном железе с определённым количеством свободной памяти. Чтобы отправить модель в TensorRT, ее сперва нужно конвертировать в ONNX (про ONNX я уже писал в постах раз, два). TensorRT поддерживает и динамическое построение модели через создание NetworkDefinition. Также у ONNX моделей на TensorRT есть преимущества - Во-первых, это применение оптимизаций из onnx-simplifier или onnx-graphsurgeon. Если мы портируем модель на PyTorch, то он конвертирует модель в ONNX операция за операцией, а последний распознает их паттерны, заменяют на более простые аналоги, не нарушая семантику вычислительного графа. - Во-вторых, при оптимизации модели TensorRT заменяет операции в ONNX…
Your current plan allows analytics for only 5 channels. To get more, please choose a different plan.