Как включить предварительную информацию в гранат? Другими словами: поддерживает ли гранат постепенное обучение?
Скажем, я подхожу к модели, используя 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)
был использован.