LSTM模型预测时间序列:根据历史销量数据预测商品未来销量

经常会遇到一些需要预测的场景,比如预测品牌销售额,预测产品销量。

时间序列

今天分享一波使用 LSTM 进行端到端时间序列预测的完整代码和详细解释。

我们先来了解两个主题:

  • 什么是时间序列分析?

  • 什么是 LSTM?

时间序列分析:时间序列表示基于时间顺序的一系列数据。它可以是秒、分钟、小时、天、周、月、年。未来的数据将取决于它以前的值。

在现实世界的案例中,我们主要有两种类型的时间序列分析:

  • 单变量时间序列(只有一列,因此即将到来的未来值将仅取决于它之前的值。如:仅依据历史销量数据预测未来数据)

  • 多元时间序列(不同类型的特征值并且目标数据将依赖于这些特征。如:除历史销量数据外,还有促销活动、节假日等特征)

对于单变量时间序列数据,我们将使用单列进行预测。

LSTM

其他前置:LSTM:LSTM基本上是一个循环神经网络,能够处理长期依赖关系。

假设你在看一部电影。所以当电影中发生任何情况时,你都已经知道之前发生了什么,并且可以理解因为过去发生的事情所以才会有新的情况发生。RNN也是以同样的方式工作,它们记住过去的信息并使用它来处理当前的输入。RNN的问题是,由于渐变消失,它们不能记住长期依赖关系。因此为了避免长期依赖问题设计了lstm。
在这里插入图片描述

  • LSTM 是一个神经网络,更具体是RNN (Recurrent ),所以我们需要用keras 基于tensorflow库
  • LSTM 相比于一般的神经网络(NN),增加了长时记忆与短时记忆。
    LSTM 相比于一般的RNN,有效解决了梯度消失的问题。梯度消失通俗的影响就是“长期记忆的丢失”。
  • LSTM 相比于一般的RNN,从设计的角度来看,核心是多了一个cell。次核心是因为多了一个cell,每一步的迭代中重新设计了遗忘门,输入门和输出门,以及cell状态的更新。

下面开始编码实现

代码实现

数据集格式调整

为了便于方便,取出所需要的列,格式如下图所示,Date表示日期列,Product表示产品列,nums表示销售数量列。下面开始训练模型进行预测。
在这里插入图片描述

  • 1、导入需要用到的库
    请确保你已经安装了所需的库,可以使用以下命令进行安装:
pip install pandas numpy scikit-learn tensorflow

导入模型训练所需要的库:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
  • 读取CSV文件
df = pd.read_csv('weekly_product.csv')
  • 将日期转换为Datetime对象
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')
  • 按照日期升序排序
df.sort_values(by='Date', inplace=True)
  • 确保数据按日期升序排列
df.reset_index(drop=True, inplace=True)
  • 提取唯一的商品名称
products = df['Product'].unique()
  • 创建一个空的DataFrame,用于存储预测结果
predicted_df = pd.DataFrame(columns=['Date', 'Product', 'nums'])

针对每种商品进行预测

for product in products:product_df = df[df['Product'] == product].copy()# 提取销售数量并进行归一化sales = product_df['nums'].values.reshape(-1, 1)scaler = MinMaxScaler(feature_range=(0, 1))sales_scaled = scaler.fit_transform(sales)# 将数据拆分为输入序列和目标值X, y = [], []for i in range(len(sales_scaled) - 10):X.append(sales_scaled[i:i+10, 0])y.append(sales_scaled[i+10, 0])X, y = np.array(X), np.array(y)# 将数据重塑为LSTM模型所需的形状 (samples, time steps, features)X = np.reshape(X, (X.shape[0], X.shape[1], 1))# 构建LSTM模型model = Sequential()model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))model.add(LSTM(units=50))model.add(Dense(units=1))# 编译模型model.compile(optimizer='adam', loss='mean_squared_error')# 训练模型model.fit(X, y, epochs=50, batch_size=32)# 预测未来10周的销售数据future_dates = pd.date_range(start='2023-10-02', periods=10, freq='W')future_sales = []for i in range(10):input_data = sales_scaled[-10:].reshape(1, 10, 1)predicted_sales = model.predict(input_data)future_sales.append(predicted_sales[0, 0])# 更新输入数据,加入新的预测值sales_scaled = np.concatenate([sales_scaled, predicted_sales], axis=0)# 反归一化future_sales = scaler.inverse_transform(np.array(future_sales).reshape(-1, 1))# 计算模型的性能指标true_sales = product_df['nums'].values[-10:]mse = mean_squared_error(true_sales, future_sales)mae = mean_absolute_error(true_sales, future_sales)print(f"Product: {product}")print(f"Mean Squared Error: {mse}")print(f"Mean Absolute Error: {mae}")# 创建预测数据的DataFramefuture_df = pd.DataFrame({'Date': future_dates, 'Product': product, 'nums': future_sales.flatten()})# 将预测数据追加到原始数据框中predicted_df = pd.concat([predicted_df, future_df], ignore_index=True)

最后,保存最终的预测数据框到CSV文件

predicted_df.to_csv('predicted_sales_MAE.csv', index=False)

模型的性能指标

在时间序列预测任务中,精确率(precision)和召回率(recall)等常用的分类模型评价指标通常不直接适用。取而代之的是,可以使用回归模型的评价指标,例如均方根误差(RMSE)或平均绝对误差(MAE)来评估模型的性能。

在回归任务中,常用的评价指标包括均方根误差(Root Mean Squared Error,RMSE)和平均绝对误差(Mean Absolute Error,MAE)。这些指标用于衡量模型的预测值与实际值之间的差异。
在这里插入图片描述
这些指标的解释如下:

  • RMSE解释: 如果RMSE等于0,表示模型的预测完全准确,没有任何误差。RMSE的值越小越好,因为它表示预测值与实际值之间的差异越小。

  • MAE解释: MAE的值越小越好,它表示模型的平均预测误差有多大。与RMSE不同,MAE不会受到异常值的影响,因为它使用的是绝对值。

在使用这些指标时,通常会选择适合问题特点的一个或多个指标进行评估。

完整代码

为了使模型更加复用性,将上面代码拆分成两个文件,一个用于模型的训练和保存,另一个用于加载模型并进行预测。请确保你有 pandas, numpy, scikit-learn, 和 tensorflow 安装在你的环境中。

File 1: train_and_save_model.py

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.metrics import mean_squared_error, mean_absolute_error# Read the CSV file
df = pd.read_csv('weekly_product.csv')# Convert the 'Date' column to datetime
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')# Sort the dataframe by date
df.sort_values(by='Date', inplace=True)
df.reset_index(drop=True, inplace=True)# Extract unique product names
products = df['Product'].unique()# Train and save a model for each product
for product in products:product_df = df[df['Product'] == product].copy()# Extract and normalize sales datasales = product_df['nums'].values.reshape(-1, 1)scaler = MinMaxScaler(feature_range=(0, 1))sales_scaled = scaler.fit_transform(sales)# Prepare the input sequences and target valuesX, y = [], []for i in range(len(sales_scaled) - 10):X.append(sales_scaled[i:i + 10, 0])y.append(sales_scaled[i + 10, 0])X, y = np.array(X), np.array(y)# Reshape the data for LSTM modelX = np.reshape(X, (X.shape[0], X.shape[1], 1))# Build the LSTM modelmodel = Sequential()model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))model.add(LSTM(units=50))model.add(Dense(units=1))model.compile(optimizer='adam', loss='mean_squared_error')model.fit(X, y, epochs=50, batch_size=32)# Save the modelmodel.save(f'model_{product}.h5')# Evaluate the model on the training datatrain_predictions = model.predict(X)train_predictions = scaler.inverse_transform(train_predictions)true_sales = product_df['nums'].values[10:]mse = mean_squared_error(true_sales, train_predictions)mae = mean_absolute_error(true_sales, train_predictions)print(f"Product: {product}")print(f"Mean Squared Error on Training Data: {mse}")print(f"Mean Absolute Error on Training Data: {mae}")

File 2: load_and_predict_model.py

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import load_model
import datetime# Function to load the trained model and make predictions
def predict_sales(product, date_str):# Load the saved modelmodel = load_model(f'model_{product}.h5')# Read the CSV filedf = pd.read_csv('weekly_product.csv')# Convert the input date string to datetimeinput_date = datetime.datetime.strptime(date_str, '%Y/%m/%d')# Filter data for the given product and dateproduct_df = df[(df['Product'] == product) & (df['Date'] <= input_date)].copy()# Extract and normalize sales datasales = product_df['nums'].values.reshape(-1, 1)scaler = MinMaxScaler(feature_range=(0, 1))sales_scaled = scaler.fit_transform(sales)# Prepare the input sequence for predictioninput_sequence = sales_scaled[-10:].reshape(1, 10, 1)# Make predictionspredicted_sales_scaled = model.predict(input_sequence)# Inverse transform to get the actual sales valuespredicted_sales = scaler.inverse_transform(predicted_sales_scaled)return predicted_sales[0, 0]# Example usage
product_name = 'example_product'
prediction_date = '2023/11/20'
predicted_sales = predict_sales(product_name, prediction_date)
print(f"Predicted Sales for {product_name} on {prediction_date}: {predicted_sales}")

在上述代码中,train_and_save_model.py 文件用于训练模型并保存,而 load_and_predict_model.py 文件用于加载保存的模型并进行预测。在 load_and_predict_model.py 中,可以通过调用 predict_sales 函数来得到指定商品在指定日期的销售预测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/169465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盘点60个Python爬虫源码Python爱好者不容错过

盘点60个Python爬虫源码Python爱好者不容错过 爬虫&#xff08;Spider&#xff09; 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1JWrDgl46_ammprQaJiKqaQ?pwd8888 提取码&#xff…

External model DLL ”ADC083XDLL“ not found_proteus仿真报错解决方法

仿真运行报错 External model DLL ”ADC083XDLL“ not found 原因 是proteus仿真软件缺少ADC083X.DLL文件或者ADC083X.DLL文件损坏。 解决方法 1.下载没问题的ADC083x.DLL ADC083X.DLL下载链接&#xff1a; 2.找到库文件夹&#xff0c;替换库文件ADC083X.DLL 库文件夹位置…

【送书福利-第二十八期】《从概念到现实:ChatGPT和Midjourney的设计之旅》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

浅析智能电能表远程费控的推广及应用

安科瑞 华楠 摘 要: 电力资源是我国社会发展中一种必不可少的资源,随着我国经济的不断发展和人们生活水平的不断提升,对电力行业的要求也不断提升。因此,电力企业应该不断提升自身的服务水平和服务质量,强智能电能表远程费控的推广与应用,提升电力计量和收费工作的效率,提高电…

模拟退火算法应用——求解二元函数的最小值(极小值)

仅作自己学习使用 一、问题 二、代码 clear clcT1 cputime; xmax 5; xmin -5; ymax 5; ymin -5; L 20; % 马尔科夫链长度 dt 0.998; % 降温系数 S 0.02; % 步长因子 T 200; % 初始温度 TZ 1e-8; % 容差 Tmin 0.01;% 最低温度 P 0; % Metropolis接受…

接收网络包的过程——从硬件网卡解析到IP层

当一些网络包到来触发了中断&#xff0c;内核处理完这些网络包之后&#xff0c;我们可以先进入主动轮询 poll 网卡的方式&#xff0c;主动去接收到来的网络包。如果一直有&#xff0c;就一直处理&#xff0c;等处理告一段落&#xff0c;就返回干其他的事情。当再有下一批网络包…

基于51单片机的交通信号灯系统【程序+proteus仿真+参考论文+AD原理图等16个文件夹资料】

一、项目功能简介 整个设计系统由STC89C52单片机数码管显示模块LED指向灯模块三线八线译码器模块按键模块组成。 具体功能&#xff1a; 1、东西向、南北向依次进行周期通行&#xff0c;默认设置为&#xff1a;东西向直行&#xff08;绿灯&#xff09;时间30秒&#xff0c;左转…

Mindomo Desktop for Mac免费思维导图软件,助您高效整理思维

思维导图是一种强大的工具&#xff0c;可以帮助我们整理思维、提高记忆力、激发创造力。而Mindomo Desktop for Mac作为一款免费的思维导图软件&#xff0c;能够帮助我们更高效地进行思维整理和项目管理。在本文中&#xff0c;我们将介绍Mindomo Desktop for Mac的功能和优势&a…

曲线拟合:走进数据建模中的艺术与科学

在现代科学和工程领域&#xff0c;曲线拟合是一项重要的数据分析技术&#xff0c;它可以通过数学模型来近似描述实际数据中的复杂关系。本文将详细介绍曲线拟合的基本概念、方法和应用领域&#xff0c;并探究其在数据建模中的艺术与科学。 第一节&#xff1a;曲线拟合的基本概…

LabVIEW当鼠标悬停在图形曲线上时显示坐标

LabVIEW当鼠标悬停在图形曲线上时显示坐标 在波形图上显示波形数据后&#xff0c;当鼠标放在波形图的曲线上时&#xff0c;如何自动显示对应点的坐标&#xff1f; 1. 创建事件结构&#xff0c;选择“波形图”作为“事件源”&#xff0c;选择“鼠标移动”作为“事件”&a…

【Vue】vue指令

目录 V-html v-show和v-if v-show 显示 隐藏 v-if 显示 隐藏 总结 显示隐藏的应用场景 未登录的情况 登录的情况 v- else 和 v-else-if v-if 和v-else v-if 和 v-else-if 总结&#xff1a; v-on 语法一&#xff1a; 语法二&#xff1a; 调用传参 v-bind…

3D建模对制造企业的价值

除非你在过去几年一直躲在岩石下,否则你可能听说过“3D 建模”和“3D 渲染”这些术语。 但为什么这项技术如此重要,尤其是对于产品制造公司而言? 简而言之,它减少了项目时间和成本。 这为制造商提供了更多的设计试验空间。 未能利用 3D 建模技术的公司很快就会落后于竞争对…

12 月 3 日北京,工业互联网数据管理的前沿技术+行业应用洞察尽在于此!

下一个周末&#xff0c;12 月 3 日&#xff0c;2023 IoTDB 用户大会将在北京丽都皇冠假日酒店举办&#xff01; 为让大家收获专业、多样的行业前瞻&#xff0c;我们邀请到了超 20 位产、学、用、研大咖嘉宾&#xff0c;将从技术与应用两个方向&#xff0c;带来你最想了解的工业…

论文阅读_生成式Agent

英文名称: Generative Agents: Interactive Simulacra of Human Behavior 中文名称: 生成代理&#xff1a;**人类行为的交互式模拟** 文章: http://arxiv.org/abs/2304.03442 代码: https://github.com/joonspk-research/generative_agents 作者: Joon Sung Park 机构: 斯坦福大…

【教学类-06-08】20231125(55格版)X-Y之间“减法-题”(以10-20之间为例)(必须X>Y,题目少)

图片展示 需求&#xff1a; 20以内减法&#xff0c;不需要再练习其中10以内部分&#xff0c;改为10-20以内的减法&#xff0c;X-Y大于10&#xff0c;小于20的所有减法题。 代码展示&#xff1a; “-”减法 X-Y 之间的所有减法-题&#xff08;如10-20之间的所有减法&#xff0…

TDA笔记:夏克林老师,南洋理工大学

TDA比传统的统计方法有优势&#xff1a;benchmark中展现了这种优势 laplacian矩阵 多种单纯复形构造方式&#xff0c;可以构造出不同表征 二部图&#xff1a;Dowker complex Tor algebra可以用到多大数据 目前较新

Python基础教程之循环结构详解,循环结构逻辑解析。

文章目录 前言一、While循环二、While…else…循环三、for循环四、for…else…循环五、循环体结束语句六、嵌套循环关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…

NX二次开发UF_CURVE_ask_curve_turn_angle 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_turn_angle Defined in: uf_curve.h int UF_CURVE_ask_curve_turn_angle(tag_t curve, double orientation [ 3 ] , double * angle ) overview 概述 Returns …

[架构之路-250]:目标系统 - 设计方法 - 软件工程 - 需求工程 - 需求开发:如何用图形表达需求,面向对象需求分析OOA与UML视图

目录 一、面向对象需求分析 1.1 面向对象的基本概念 1.2 什么是面向对象的需求分析 2.3 什么是UML图 2.4 UML视图 2.4 UML图与UML视图的关系 2.5 UML图与面向对象需求分析的关系 二、需求分析相关的UML图形与视图&#xff1a;14视图 2.1 用例模型与用例图&#xff1a;…

面试题:工作中做过 JVM 调优吗?怎么做的?

文章目录 前言cpu占用过高死锁内存泄漏上面只是其中一种处理方法 总结 前言 最近很多小伙伴跟我说&#xff0c;自己学了不少JVM的调优知识&#xff0c;但是在实际工作中却不知道何时对JVM进行调优。今天&#xff0c;我就为大家介绍几种JVM调优的场景。 在阅读本文时&#xff…