машинное обучение
September 10, 2021

Как залатать дыры в прогнозах

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

Будем считать, что мы можем найти некий признак, характеризующий пропорциональную связь между подгруппами одного объекта. Это, например, может быть прогноз другой модели, адаптированной в отличие от заданной для предсказания на более мелких единицах, или некая другая мера (например, численность сотрудников организации и ее филиалов в случае предсказания потребления товаров). Тогда можно распределить прогноз заданной модели равномерно на подобъекты в соответствии с их соотношением.

Рассмотрим пример. Пусть имеется матрица из идентификаторов объектов, их групп и прогнозов альтернативной модели:

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'])

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Instagram

Яндекс Дзен

Telegram