机器学习项目--库存需求预测2--Arima模型

 系列文章

机器学习项目--库存需求预测1_xgboost2.0.3对应sklearn版本-CSDN博客

机器学习项目--库存需求预测2--Arima模型-CSDN博客

机器学习项目--库存需求预测3--LSTM模型-CSDN博客

一、导入库和数据集

代码环境:

主要的包版本如下

python==3.10

scikit-learn==1.0.2

statsmodels==0.14.2

导入库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error as mae
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import itertools
import warnings

读取数据集加载到pandas,并打印前5行和列

dataframe = pd.read_csv("D:/data/rossmann-stores-clustering-and-forecast/train.csv")
dataframe.head()

dataframe.columns

二、数据预处理

过滤掉销量为0的数据

dataframe = dataframe[dataframe["Sales"] > 0]

获取一个门店的数据进行Arima建模

data = dataframe[dataframe["Store"] == 1].sort_values(by="Date", ignore_index=True)
data = data[["Sales"]].values

数据集划分,选取前731天数据作为训练集,其余全为测试集

train_days = 731
train_data = data[:train_days, :]
test_data = data[train_days:, :]

三、数据探索

确定ARIMA模型的阶数

绘制ACF图,确定p值

plot_acf(train_data)
plt.title('Autocorrelation Function (ACF)')
plt.show()

 绘制PACF图,确定q值

plot_pacf(train_data)
plt.title('Partial Autocorrelation Function (PACF)')
plt.show()

如图所示,ACF图和PACF图都可以看作拖尾,此时ACF和PACF图像无法帮助我们确定参数p和q的具体值,但能确认p和q一定都不为0。

通过网格搜索法定阶确定p值和q值

#自定义ARIMA模型的网格搜索函数
def ARIMA_search(data,diff):
    #data表示网格搜索定阶的数据
    #diff表示差分数量
    p=range(1,3)#参数p的搜索范围
    q=range(1,5)#参数q的搜索范围
    d=[diff]
    pdq=list(itertools.product(p,d,q))
    #itertools.product()得到的是可迭代对象的笛卡儿积
    #list是python中是序列数据结构,序列中的每个元素都分配一个数字定位位置
    params=[]
    results=[]
    grid=pd.DataFrame()
    for param in pdq:
        #建立模型
        mod= ARIMA(data,order=param)
        #实现数据在模型中训练
        result=mod.fit()
        print("ARIMA{}-AIC:{}".format(param,result.aic))
        #format表示python格式化输出,使用{}代替%
        params.append(param)
        results.append(result.aic)
    grid["pdq"]=params
    grid["aic"]=results
    print(grid[grid["aic"]==grid["aic"].min()])#选择使AIC最小的参数组合
warnings.filterwarnings("ignore")#忽略输出警告
ARIMA_search(train_data, 1)

 故定阶结果为ARIMA(2,1,4)模型

三、数据建模

拟合ARIMA模型

p, d, q = 2, 1, 4  # 根据ACF和PACF的结果设置p和q的值
arima_model = ARIMA(train_data, order=(p, d, q))
arima_result = arima_model.fit()

模型诊断

print(arima_result.summary())

 模型预测

forecast_steps = 50
forecast = arima_result.get_forecast(steps=forecast_steps)
test_predict = forecast.predicted_mean
print("mae : ", mae(test_data.flatten(), test_predict.flatten()))

四、结论 

 各个模型的效果如下

序号算法mae
1LinearRegression2534.60762743034
2XGBRegressor1610.615012757817
3Lasso2534.648771611585
4Ridge2534.607649225326
5lightGBM2453.607649225326
6Arima694.5774660612412

可以看出Arima算法的效果最好,Arima也有自己的局限性,例如预测时间较长的话,预测结果趋于一条直线。

五、数据来源和源码获取

训练数据来源于kaggle,读者可以去kagga下载。

或者加小编微信获取:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值