Как залатать дыры в прогнозах
В реальности возникают ситуации, когда необходимо адаптировать прогнозы моделей машинного обучения для новых условий, например, для работы на подгруппах из первоначальных объектов. В этой статье я расскажу, как сделать это без переобучения модели.
Будем считать, что мы можем найти некий признак, характеризующий пропорциональную связь между подгруппами одного объекта. Это, например, может быть прогноз другой модели, адаптированной в отличие от заданной для предсказания на более мелких единицах, или некая другая мера (например, численность сотрудников организации и ее филиалов в случае предсказания потребления товаров). Тогда можно распределить прогноз заданной модели равномерно на подобъекты в соответствии с их соотношением.
Рассмотрим пример. Пусть имеется матрица из идентификаторов объектов, их групп и прогнозов альтернативной модели:
import pandas as pd import numpy as np np.random.seed(0) gr_ids = np.random.randint(3, size=10) df = pd.DataFrame({'ids':np.arange(10), 'gr_ids':gr_ids, 'preds':np.random.randint(30, size=10)}) df
Также мы располагаем датафреймом с прогнозами заданной модели, рассчитанной для работы только на больших группах объектов:
df_preds_incor = pd.DataFrame({'gr_ids':np.unique(gr_ids), 'preds_incor':np.random.randint(100, size=3)}) df_preds_incor
df_m = df.merge(df_preds_incor) df_m
Далее пишем функцию для пропорционального распределения прогнозов и применяем ее к нашему столбцу preds_incor:
def split_preds(df_gr): props = df_gr['preds']/df_gr['preds'].sum() preds_cor = df_gr['preds_incor']*props preds_cor.name = 'preds_cor' return preds_cor pred_cor = df_m.set_index('ids').groupby('gr_ids').apply(lambda df_gr: split_preds(df_gr)) pred_cor.reset_index()
В результате получаем столбец со скорректированными прогнозами. Для сверки можно сджойнить его с исходной матрицей:
df_m.merge(pred_cor, on=['gr_ids','ids'])
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: