用机器学习来提升你的用户增长:第六步,预测销量
作者头像
  • 韶华杂谈
  • 2020-06-07 13:52:11 2

预测销量有着广泛的应用,是一项时间序列预测任务,可以通过传统的时间序列回归方法或机器学习、深度学习的方法来实现。本文将介绍如何利用长短时记忆网络(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)

构建LSTM模型

我们已经准备好构建第一个深度学习模型。首先,我们需要将数据划分为训练集和测试集,并进行比例缩放: 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模型,我们能够有效地预测未来的销量。此外,还可以进一步优化模型,例如加入节假日、休息时间等季节性因素。未来,我们还将探讨如何预测促销活动对销量的影响。

    本文来源:图灵汇
责任编辑: : 韶华杂谈
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
销量机器提升预测增长用户学习
    下一篇