自回归模型的部分拟合或增量学习
Partial fit or incremental learning for autoregressive model
我有两个时间序列代表两个独立的数据观察期。我想为这些数据拟合一个自回归模型。换句话说,我想进行两次部分拟合,或者两次增量学习。
这是对一种常见情况的简化描述,也适用于大型数据集的批量拟合。
我该怎么做(在 statsmodels 或其他方式中)?如果解决方案可以推广到 ARIMA 等其他时间序列模型,则加分。
在伪代码中,类似于:
import statsmodels.api as sm
from statsmodels.tsa.ar_model import AutoReg
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
data_1 = data[:len(data)//3]
data_2 = data[len(data)-len(data)//3:]
# This is the standard single fit usage
res = AutoReg(data_1, lags=12).fit()
res.aic
# This is more like what I would like to do
model = AutoReg(lags=12)
model.partial_fit(data_1)
model.partial_fit(data_2)
model.results.aic
Statsmodels 不直接具有此功能。正如 Kevin S 提到的,pmdarima 确实有一个提供此功能的包装器。具体更新方法。根据他们的文档:“用额外观察到的 endog/exog 值更新模型拟合。”.
请参阅下面有关您的特定代码的示例:
from pmdarima.arima import ARIMA
import statsmodels.api as sm
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
data_1 = data[:len(data)//3]
data_2 = data[len(data)-len(data)//3:]
# This is the standard single fit usage
model = ARIMA(order=(12,0,0))
model.fit(data_1)
# update the model parameters with the new parameters
model.update(data_2)
我不知道如何在 autoreg 中实现,但我认为它可以通过某种方式实现,但需要手动评估结果或以某种方式添加数据。
但是在ARIMA和SARIMAX中,已经实现了,而且很简单。
对于增量学习,有 3 个相关函数,并且已记录在案 here。首先是 apply
,它对新的不相关数据使用拟合参数。然后是extend
和append
。追加可以改装。不过我不知道确切的区别。
这是我的示例,不同但相似...
from statsmodels.tsa.api import ARIMA
data = np.array(range(200))
order = (4, 2, 1)
model = ARIMA(data, order=order)
fitted_model = model.fit()
prediction = fitted_model.forecast(7)
new_data = np.array(range(600, 800))
fitted_model = fitted_model.apply(new_data)
new_prediction = fitted_model.forecast(7)
print(prediction) # [200. 201. 202. 203. 204. 205. 206.]
print(new_prediction) # [800. 801. 802. 803. 804. 805. 806.]
这会替换所有数据,因此它可以用于不相关的数据(未知索引)。我对它进行了分析,并且与 fit 相比,应用速度非常快。
我有两个时间序列代表两个独立的数据观察期。我想为这些数据拟合一个自回归模型。换句话说,我想进行两次部分拟合,或者两次增量学习。
这是对一种常见情况的简化描述,也适用于大型数据集的批量拟合。
我该怎么做(在 statsmodels 或其他方式中)?如果解决方案可以推广到 ARIMA 等其他时间序列模型,则加分。
在伪代码中,类似于:
import statsmodels.api as sm
from statsmodels.tsa.ar_model import AutoReg
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
data_1 = data[:len(data)//3]
data_2 = data[len(data)-len(data)//3:]
# This is the standard single fit usage
res = AutoReg(data_1, lags=12).fit()
res.aic
# This is more like what I would like to do
model = AutoReg(lags=12)
model.partial_fit(data_1)
model.partial_fit(data_2)
model.results.aic
Statsmodels 不直接具有此功能。正如 Kevin S 提到的,pmdarima 确实有一个提供此功能的包装器。具体更新方法。根据他们的文档:“用额外观察到的 endog/exog 值更新模型拟合。”.
请参阅下面有关您的特定代码的示例:
from pmdarima.arima import ARIMA
import statsmodels.api as sm
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
data_1 = data[:len(data)//3]
data_2 = data[len(data)-len(data)//3:]
# This is the standard single fit usage
model = ARIMA(order=(12,0,0))
model.fit(data_1)
# update the model parameters with the new parameters
model.update(data_2)
我不知道如何在 autoreg 中实现,但我认为它可以通过某种方式实现,但需要手动评估结果或以某种方式添加数据。
但是在ARIMA和SARIMAX中,已经实现了,而且很简单。
对于增量学习,有 3 个相关函数,并且已记录在案 here。首先是 apply
,它对新的不相关数据使用拟合参数。然后是extend
和append
。追加可以改装。不过我不知道确切的区别。
这是我的示例,不同但相似...
from statsmodels.tsa.api import ARIMA
data = np.array(range(200))
order = (4, 2, 1)
model = ARIMA(data, order=order)
fitted_model = model.fit()
prediction = fitted_model.forecast(7)
new_data = np.array(range(600, 800))
fitted_model = fitted_model.apply(new_data)
new_prediction = fitted_model.forecast(7)
print(prediction) # [200. 201. 202. 203. 204. 205. 206.]
print(new_prediction) # [800. 801. 802. 803. 804. 805. 806.]
这会替换所有数据,因此它可以用于不相关的数据(未知索引)。我对它进行了分析,并且与 fit 相比,应用速度非常快。