首页 > 其他分享 >机器学习项目--库存需求预测2--Arima模型

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

时间:2024-06-18 19:02:39浏览次数:23  
标签:-- 需求预测 Arima dataframe ARIMA train import data

 系列文章

机器学习项目--库存需求预测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下载。

或者加小编微信获取:

标签:--,需求预测,Arima,dataframe,ARIMA,train,import,data
From: https://blog.csdn.net/u014460433/article/details/139768998

相关文章

  • 随着技术的不断发展,Perl 在处理大规模数据和高并发场景下的性能优化策略有哪些?
    Perl在处理大规模数据和高并发场景下的性能优化策略有以下几点:选择合适的数据结构:对于大规模数据,选择合适的数据结构可以提高Perl程序的性能。例如,使用数组而不是哈希表可以节省内存和加快访问速度。使用内置函数和操作符:Perl提供了许多内置函数和操作符,它们通常比自定......
  • ClickHouse 入门基本介绍
    一、简介官网:clickhouse.techClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。OLAP:联机分析处理,以ClickHouse等分析型数据库为代表,适合对数据进行一次插入多......
  • 微信小程序使用PAG动画
    uniapp开发微信小程序播放PAG动画准备工作pag动画文件网络地址uni插件市场搜索pag(腾讯pag)安装导入插件到项目中安装插件中的依赖npminstalllibpag-miniprogram--save注意事项:如果小程序控制台报错提示未加载wasm,请把node_modules/libpag-miniprogram/lib/libpa......
  • 多项目如何管理?盘点十大主流项目管理软件,轻松管理多个项目
    多项目同时进行已经成为很多企业的现状,项目经理手握几个项目成为常态。多项目管理之所以难,不仅在于项目数量的增加,而且在于项目资源分配不均、多项目进度比较难监控、沟通协作纷繁复杂。应该如何做好进度管理,力求每个项目都能成功呢?答案是:工具化(即合理利用工具,帮助团队完成......
  • Simulink仿真(超详细教程)
    由于最近电子电路仿真实验需要,故学习了一下Simulink仿真,接下来详细介绍一下Simulink的使用:本人所用MATLAB版本为R2023a(其他版本也大同小异),接下来我将介绍我的具体仿真过程:(1)打开MATLAB,会出现以下界面(2)在主页面中寻找并打开Simulink在MATLAB主界面,有以下三种打开“Simuli......
  • shell函数
    shell函数函数定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式函数作用:方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。函数的格式格式1functionshoping{​     命令序列......
  • 滚雪球学Java(65-3):详解Java IdentityHashMap的内部实现原理
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及JavaSE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~......
  • vector的特性及使用
    1、 vector的定义:单独定义一个vector的形式为:vector<typename>vector; 1.如上定义其实相当于一个大小可变化的序列容器,即变长数组。2.vector采用连续的储存空间来储存元素,意味着可以通过下标来访问元素,和数组一样高效,但是又比数组更优秀,它的大小是可以动态改变的,而且......
  • python系列&AI系列:cannot import name ‘ForkProcess‘ from ‘multiprocessing.conte
    cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决问题描述问题原因解决方案cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问......
  • python系列:使用Python快速读取PDF中的表单数据以及error处理
    使用Python快速读取PDF中的表单数据以及error处理使用Python快速读取PDF中的表单数据安装PythonPDF库Python读取PDF表单数据1、一次性读取多种PDF表单的数据2、读取特定PDF表单的数据python读取PDF文件中文本、表格、图片python读取PDF文件中文本、表格、图片一、文本......