Как включить предварительную информацию в гранат? Другими словами: поддерживает ли гранат постепенное обучение?

Скажем, я подхожу к модели, используя pomegranateк данным, доступным на тот момент. Когда появятся новые данные, я хотел бы соответствующим образом обновить модель. Другими словами, возможно ли это сpomegranateобновить существующую модель новыми данными без отмены предыдущего параметра? Для ясности: я не говорю о внешнем обучении, поскольку мой вопрос касается данных, доступных в разные моменты времени, а не наличия данных, слишком больших для памяти, доступных в один момент времени.

Вот что я пробовал:

>>> from pomegranate.distributions import BetaDistribution

>>> # suppose a coin generated the following data, where 1 is head and 0 is tail
>>> data1 = [0, 0, 0, 1, 0, 1, 0, 1, 0, 0]

>>> # as usual, we fit a Beta distribution to infer the bias of the coin
>>> model = BetaDistribution(1, 1)
>>> model.summarize(data1)  # compute sufficient statistics

>>> # presume we have seen all the data available so far,
>>> # we can now estimate the parameters
>>> model.from_summaries()

>>> # this results in the following model (so far so good)
>>> model
{
    "class" :"Distribution",
    "name" :"BetaDistribution",
    "parameters" :[
        3.0,
        7.0
    ],
    "frozen" :false
}

>>> # now suppose the coin is flipped a few more times, getting the following data
>>> data2 = [0, 1, 0, 0, 1]

>>> # we would like to update the model parameters accordingly
>>> model.summarize(data2)

>>> # but this fits only data2, overriding the previous parameters
>>> model.from_summaries()
>>> model
{
    "class" :"Distribution",
    "name" :"BetaDistribution",
    "parameters" :[
        2.0,
        3.0
    ],
    "frozen" :false
}


>>> # however I want to get the result that corresponds to the following,
>>> # but ideally without having to "drag along" data1
>>> data3 = data1 + data2
>>> model.fit(data3)
>>> model  # this should be the final model
{
    "class" :"Distribution",
    "name" :"BetaDistribution",
    "parameters" :[
        5.0,
        10.0
    ],
    "frozen" :false
}

Редактировать:

Другой способ задать вопрос: есть ли pomegranateподдержка инкрементального или онлайн-обучения? В основном ищу что-то похожее наscikit-learnс partial_fit()как вы можете найти здесь.

При условии pomegranateподдерживает внеклассное обучение, мне кажется, что я что-то упускаю. Любая помощь?

1 ответ

Это на самом деле from_summariesвот в чем проблема. В случае бета-версии:self.summaries = [0, 0]. Все изfrom_summariesметоды деструктивны. Они заменяют сводки параметрами в распределении. Резюме всегда можно обновить для дополнительных наблюдений, параметры не могут быть.

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

Если вы это сделаете:

model = BetaDistribution(1, 1)
model.summarize(data1)
model.summarize(data2)
model.from_summaries()
model

Вы обнаружите, что результат такой же, как если бы model.summarize(data1 + data2) был использован.

Другие вопросы по тегам