系列文章
机器学习项目--库存需求预测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 |
1 | LinearRegression | 2534.60762743034 |
2 | XGBRegressor | 1610.615012757817 |
3 | Lasso | 2534.648771611585 |
4 | Ridge | 2534.607649225326 |
5 | lightGBM | 2453.607649225326 |
6 | Arima | 694.5774660612412 |
可以看出Arima算法的效果最好,Arima也有自己的局限性,例如预测时间较长的话,预测结果趋于一条直线。
五、数据来源和源码获取
训练数据来源于kaggle,读者可以去kagga下载。
或者加小编微信获取: