matplotlib 时间序列数据的回归模型拟合

pkln4tw6  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(108)

我正在尝试用Python将回归模型拟合到时间序列数据(基本上是为了预测趋势)。我之前使用statsmodels应用了季节分解,它将数据提取到包括数据趋势在内的三个组成部分。然而,我想知道如何使用基于回归分析的回归得出与我的数据的最佳拟合(通过定义任何函数)并检查平方和以比较各种模型并选择最适合我的数据的模型。我应该提到,我不是在寻找依赖于训练的基于学习的回归。测试数据。如果有人能帮助我,我将不胜感激,甚至介绍了这个问题的教程。

vwoqyblh

vwoqyblh1#

既然你提到:
我想知道我如何使用基于回归的回归(通过定义任何函数)来得出最适合我的数据的回归,并检查平方和来比较各种模型并选择最适合我的数据的回归。我应该提到我不是在寻找依赖于训练/测试数据的基于学习的回归。
可能是ARIMA(自回归积分移动平均)模型,具有给定的设置(P,D,Q),可以在历史和predict()/预测()上学习。请注意,将数据分为训练和测试是为了使用向前走验证方法进行评估。

python 3.11.4pandas 2.1.0matplotlib 3.7.2sklearn v1.2.2statsmodels v0.14.0中测试

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
from math import sqrt

# load dataset
def parser(x):
    return datetime.strptime('199'+x, '%Y-%m')

# read into a dataframe
df = pd.read_csv('shampoo_sales.csv', header=0)

# format the Month column as datetime64[ns]
df.Month = df.Month.apply(parser)

# split into train and test sets
X = df.Sales.values
size = int(len(X) * 0.66)
train, test = X[0:size], X[size:len(X)]
history = [x for x in train]
predictions = list()

# walk-forward validation
for t in range(len(test)):
    model = ARIMA(history, order=(5,1,0))
    model_fit = model.fit()
    output = model_fit.forecast()
    yhat = output[0]
    predictions.append(yhat)
    obs = test[t]
    history.append(obs)
    # print('predicted=%f, expected=%f' % (yhat, obs))
    
# evaluate forecasts
rmse = sqrt(mean_squared_error(test, predictions))
rmse_ = 'Test RMSE: %.3f' % rmse

# plot forecasts against actual outcomes
plt.plot(test, label='test')
plt.plot(predictions, color='red', label='predict')
plt.xlabel('Months')
plt.ylabel('Sale')
plt.title(f'ARIMA model performance with {rmse_}')
plt.legend()
plt.show()

请参阅其他post1post2以获取更多信息。也许您也可以添加trend line

shampoo_sales.csv

Month,Sales
1-01,266.0
1-02,145.9
1-03,183.1
1-04,119.3
1-05,180.3
1-06,168.5
1-07,231.8
1-08,224.5
1-09,192.8
1-10,122.9
1-11,336.5
1-12,185.9
2-01,194.3
2-02,149.5
2-03,210.1
2-04,273.3
2-05,191.4
2-06,287.0
2-07,226.0
2-08,303.6
2-09,289.9
2-10,421.6
2-11,264.5
2-12,342.3
3-01,339.7
3-02,440.4
3-03,315.9
3-04,439.3
3-05,401.3
3-06,437.4
3-07,575.5
3-08,407.6
3-09,682.0
3-10,475.3
3-11,581.3
3-12,646.9

相关问题