预测销量有着广泛的应用,是一项时间序列预测任务,可以通过传统的时间序列回归方法或机器学习、深度学习的方法来实现。本文将介绍如何利用长短时记忆网络(LSTM)模型来进行销量预测。
销量预测有许多实际应用,这涉及到时间序列预测问题。我们可以使用传统的时间序列回归方法,也可以采用机器学习和深度学习的方法。接下来,我们将一起探讨如何利用LSTM模型来提升销量预测的准确性。
在前面的内容中,大多数预测模型都是针对客户层面的,比如客户流失预测、下一个购买日等。然而,有时候从整体视角出发,考虑全局的销售情况也非常重要。通过分析我们在客户层面所做的努力,我们可以更好地影响销售表现。
时间序列预测是机器学习的重要组成部分。有许多方法可以实现这一目标,包括自回归综合移动平均(ARIMA)、季节自回归综合移动平均(SARIMA)、向量自回归(VAR)等。
本文将重点介绍长短时记忆(LSTM)模型,这是一种流行的深度学习方法。我们将在项目中使用Keras框架来实现LSTM模型。
首先,销量预测可以作为业务发展的基准。如果我们不改变现有的策略,它可以帮助我们设定业务目标。此外,我们还可以在此基础上计算出新行为带来的增量效果。
其次,销量预测可以用于规划。通过预测未来的需求和供给,我们可以更好地安排资源和投资方向。
最后,销量预测还是制定预算和目标的重要参考依据。
我们构建销量预测模型分为三个主要步骤: 1. 数据整理 2. 数据变换 3. 构建LSTM模型并评估
我们使用来自Kaggle竞赛的数据集,其中包含了每个店铺和商品的每日销售额。
首先,我们需要导入必要的库并加载数据: ```python import pandas as pd from datetime import datetime import numpy as np import warnings warnings.filterwarnings("ignore") import plotly.graph_objs as go
dfsales = pd.readcsv('salesdata.csv') dfsales['date'] = pd.todatetime(dfsales['date']) ```
接下来,我们需要将数据按月汇总,并计算总销售额:
python
df_sales['date'] = df_sales['date'].dt.year.astype('str') + '-' + df_sales['date'].dt.month.astype('str') + '-01'
df_sales['date'] = pd.to_datetime(df_sales['date'])
df_sales = df_sales.groupby('date').sales.sum().reset_index()
为了让预测模型更加稳定和准确,我们需要进行以下变换: 1. 如果数据不平稳,则需要将其转换为平稳状态。 2. 将时间序列数据转换为监督学习问题。 3. 对数据进行比例缩放。
首先,我们绘制每月销售额的图表,以检查数据是否平稳:
python
plot_data = [go.Scatter(x=df_sales['date'], y=df_sales['sales'])]
plot_layout = go.Layout(title='Monthly Sales')
fig = go.Figure(data=plot_data, layout=plot_layout)
fig.show()
从图表可以看出,数据并不平稳。因此,我们可以通过计算相邻月份销售额的差值来处理这个问题:
python
df_diff = df_sales.copy()
df_diff['prev_sales'] = df_diff['sales'].shift(1)
df_diff = df_diff.dropna()
df_diff['diff'] = df_diff['sales'] - df_diff['prev_sales']
接下来,我们需要构建特征集。为了预测未来的销售额,我们需要利用过去的销售数据。我们创建从lag1到lag12的列,并使用shift()
方法进行赋值:
python
df_supervised = df_diff.drop(['prev_sales'], axis=1)
for inc in range(1, 13):
field_name = 'lag_' + str(inc)
df_supervised[field_name] = df_supervised['diff'].shift(inc)
df_supervised = df_supervised.dropna().reset_index(drop=True)
现在我们已经有了特征集。接下来,我们需要评估这些特征对预测的贡献程度。我们可以通过计算调整后的R平方值来衡量这一点:
python
import statsmodels.formula.api as smf
model = smf.ols(formula='diff ~ lag_1', data=df_supervised)
model_fit = model.fit()
regression_adj_rsq = model_fit.rsquared_adj
print(regression_adj_rsq)
通过添加更多的滞后特征,我们可以进一步提高模型的表现: ```python
model = smf.ols(formula='diff ~ lag1 + lag2 + lag3 + lag4', data=dfsupervised) modelfit = model.fit() regressionadjrsq = modelfit.rsquaredadj print(regressionadjrsq) ```
最终,我们使用整个特征集进行预测:
python
model = smf.ols(formula='diff ~ lag_1 + lag_2 + lag_3 + lag_4 + lag_5 + lag_6 + lag_7 + lag_8 + lag_9 + lag_10 + lag_11 + lag_12', data=df_supervised)
model_fit = model.fit()
regression_adj_rsq = model_fit.rsquared_adj
print(regression_adj_rsq)
我们已经准备好构建第一个深度学习模型。首先,我们需要将数据划分为训练集和测试集,并进行比例缩放:
python
from sklearn.preprocessing import MinMaxScaler
df_model = df_supervised.drop(['sales', 'date'], axis=1)
train_set, test_set = df_model[0:-6].values, df_model[-6:].values
scaler = MinMaxScaler(feature_range=(-1, 1))
scaler = scaler.fit(train_set)
train_set_scaled = scaler.transform(train_set)
test_set_scaled = scaler.transform(test_set)
接下来,我们创建特征和标签:
python
X_train, y_train = train_set_scaled[:, 1:], train_set_scaled[:, 0:1]
X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test, y_test = test_set_scaled[:, 1:], test_set_scaled[:, 0:1]
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
然后,我们构建和训练LSTM模型: ```python from keras.models import Sequential from keras.layers import LSTM, Dense
model = Sequential() model.add(LSTM(4, batchinputshape=(1, Xtrain.shape[1], Xtrain.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='meansquarederror', optimizer='adam') model.fit(Xtrain, ytrain, epochs=100, batch_size=1, verbose=1, shuffle=False) ```
最后,我们进行预测并评估结果: ```python ypred = model.predict(Xtest, batchsize=1) ypred = ypred.reshape(ypred.shape[0], 1, y_pred.shape[1])
predtestset = [] for index in range(0, len(ypred)): predtestset.append(np.concatenate([ypred[index], X_test[index]], axis=1))
predtestset = np.array(predtestset) predtestset = predtestset.reshape(predtestset.shape[0], predtestset.shape[2]) predtestsetinverted = scaler.inversetransform(predtestset)
resultlist = [] salesdates = list(dfsales[-7:].date) actsales = list(dfsales[-7:].sales) for index in range(0, len(predtestsetinverted)): resultdict = {} resultdict['predvalue'] = int(predtestsetinverted[index][0] + actsales[index]) resultdict['date'] = salesdates[index + 1] resultlist.append(resultdict) dfresult = pd.DataFrame(result_list)
dfsalespred = pd.merge(dfsales, dfresult, on='date', how='left') plotdata = [ go.Scatter(x=dfsalespred['date'], y=dfsalespred['sales'], name='actual'), go.Scatter(x=dfsalespred['date'], y=dfsalespred['predvalue'], name='predicted') ] plotlayout = go.Layout(title='Sales Prediction') fig = go.Figure(data=plotdata, layout=plot_layout) fig.show() ```
通过以上步骤,我们成功地使用LSTM模型进行了销量预测,并通过图表展示了预测结果与实际值的对比。
通过使用LSTM模型,我们能够有效地预测未来的销量。此外,还可以进一步优化模型,例如加入节假日、休息时间等季节性因素。未来,我们还将探讨如何预测促销活动对销量的影响。