图片由我可爱的女友比阿特丽斯·贝尔布特拍摄

销售预测:从传统时间序列到现代深度学习

从传统时间序列模型到现代深度学习的直观销售预测。

介绍

任何公司都有一种内在的愿望,即预测其未来的收入和销售。基本配方是:

收集与以前销售相关的历史数据,并使用它来预测预期销售。

图片由马库斯SpiskeUnsplash

在过去的十年里,深度学习的兴起是驱动因素f曾经是所有可以想象到的机器学习基准的背后,它彻底改变了这个领域:无论是在计算机视觉、语言还是其他许多领域。最近,有人可能会说,深度学习已经重构了销售预测的潜在未来,允许模型在单个模型中对多个时间序列进行编码,并考虑分类变量。我今天的目标是:

从时间序列的角度向您介绍销售预测的主要概念和模型背后的基本直觉,并讨论最近的深度学习模型可以带来什么样的功能。

阅读建议

如果你觉得你需要温习销售预测和时间序列的基础知识,我推荐你阅读这3本:

销售预测问题

销售预测就是利用历史数据为决策提供信息。

一个简单的预测周期是这样的:

作者图片

就其核心而言,这是一个时间序列问题:给定一些数据,我们想要预测相同数据在未来的动态。要做到这一点,我们需要这些动态的一些可训练的模型。

根据亚马逊的时间序列预测原理,预测是一个困难的问题,原因有两个:

  • 合并大量的历史数据,这可能导致丢失有关目标数据动态过去的重要信息。
  • 结合相关但独立的数据(假日/事件,地点,营销促销)

除此之外,销售预测的一个核心方面是准确性是关键:

  • 如果预测过高,可能会导致过度投资,从而导致亏损。
  • 如果预测过低,可能会导致投资不足,从而失去机会。

结合天气、时间和空间位置等外生因素可能有利于预测。在这个介质块通过Liudmyla Taranenko,她提到了一个很好的例子,讨论了像优步、Lyft或滴滴出行这样的按需出行服务如何必须考虑天气条件(如湿度和温度)、一天中的时间或一周中的哪一天等因素来进行需求预测。因此,好的预测模型应该具有能够解释这些因素的机制。

总之,到目前为止我们知道什么?

  • 我们知道,预测是一个很难的问题,准确与否至关重要。
  • 我们知道有外生因素在起作用,很难解释。

我们还不知道的是:

  • 什么是传统的预测方法,为什么它们可能会屈服于这些挑战。
  • 深度学习方法如何提供帮助,以及取代传统模型的一些前景是什么。

预测模型的类型

根据这个文章在《哈佛商业评论》中,有三种预测技巧:

  • 定性技术通常涉及专家意见或关于特殊事件的信息。
  • 时间序列分析和预测:涉及历史数据,在数据的动态中发现结构,如周期模式、趋势和增长率。
  • 因果关系模型:这些模型涉及相关的因果关系,可能包括库存或市场调查信息等管道考虑因素。它们可以结合时间序列分析的结果。

我们将重点介绍时间序列分析方法,它一直是传统预测方法背后的驱动力,它可以提供预测景观的全面布局。

时间序列法

时间序列是在连续的、等间隔的时间点上获得的一系列数据点,可以用来预测未来。时间序列分析模型包括使用历史数据来预测未来。它从数据集中寻找趋势、周期性波动、季节性和行为模式等特征。

当从时间序列的角度处理销售预测问题时,需要考虑的三个基本的关键概念是:

  • 重复模式
  • 静态模式
  • 趋势

现在,我们将研究这些因素,并编写代码,使我们能够直观地理解它们。在那之后,我们将看到现代深度学习模型能带来什么。

重复模式

在查看时间序列数据时,我们要寻找的一个元素是在时间上重复的模式。与这个想法相关的一个关键概念是自相关

直观地说,自相关对应于观测值之间的相似性作为它们之间的时间滞后的函数。

这是什么意思?它指的是通过观察不同时间点的观测值与自身(即“自”)之间的相关性来寻找时间序列中观测值的动态结构的思想。它是查找重复模式的主要工具之一。

为了澄清这一点,让我们看一下公开可用的数据天气数据集来自kaggle并绘制其原始温度数据和自相关图。

步骤如下:

  • 加载我们的数据集
  • 清理日期栏
  • 绘制原始天气数据
  • 绘制自相关图,使用statsmodels
进口熊猫作为pd
进口matplotlib。Pyplot为PLT
进口seaborn作为SNS
sns.set ()
从statmodels .graphics. tsatplots中导入plot_acf

绿色= sns。color_palette(“深”,8)[2]
蓝色= sns。color_palette(“深”,8)[0]

#加载数据集
df_weather = pd.read_csv("data/weatherHistory.csv")

#清理日期列
df_weather['格式化日期']= pd。to_datetime (df_weather['格式化日期'])

绘制原始天气数据
FIG = plt.figure(figsize=(17,8))
Ax1 = fig.add_subplot(121)

plt。scatter(df_weather["格式化日期"],df_weather["温度(C)")),颜色=绿色,s = 20)
plt。title("天气资料时间序列",font =15)
plt.xlabel(“日期”,字形大小= 15)
plt。ylabel(“温度(ºC)”,字形大小= 15)


#绘制自相关图
Ax2 = fig.add_subplot(122)
plot_acf (df_weather[“温度(C)”) = ax = ax2,颜色蓝色)
plt。title("天气资料自相关图",font =15)
plt.ylabel(“相关性”,字形大小= 15)
plt.xlabel(“滞后”,字形大小= 15)
plt.show ()
png

我们可以清楚地看到左边有一个重复的图案,它似乎有一个正弦形状。在右边,我们可以看到自相关图:线的大小表示给定滞后值的相关程度。当我们考虑到天气的季节性和重复性时,图表似乎表明了一种周期性的相关模式,这是有道理的。

然而,我们能从销售数据集的自相关图中得到什么呢?它会像这个简单的天气数据集一样呈现出同样清晰的重复模式吗?

让我们画出与上面相同的信息,但是用这个零售销售数据集

这里的步骤是:

  • 加载数据集
  • 求45家门店的总销售额
  • 绘制2010年至2013年的总销售额
进口熊猫作为pd
进口matplotlib。Pyplot为PLT
进口seaborn作为SNS
sns.set ()
从statmodels .graphics. tsatplots中导入plot_acf
进口matplotlib。候选日期
进口日期时间
Green = sns.color_palette("deep",8
Blue = sns.color_palette("deep",8


Retail_sales = "./sales_dataset.csv "

Df_sales = pd.read_csv(retail_sales)
FIG = plt.figure(figsize=(17,8))
Ax1 = fig.add_subplot(121)
Df_sales_sum = df_sales。groupby(=(“日期”),as_index = False) [' Weekly_Sales '] .sum ()
df_sales_sum["Date"] = pd.to_datetime(df_sales_sum["Date"])
df_sales_sum。情节(x =“日期”,y =“Weekly_Sales”,颜色=“g”,ax = ax₁,字形大小= 15)
plt.xlabel(“日期”,字形大小= 15)
plt。标题(“总销售额”,字体大小=15)
plt。ylabel(“销售”,字形大小= 15)
date_form = mdates.DateFormatter("%Y-%m-%d")
year_locator = mdates.YearLocator()
ax1.xaxis.set_major_locator (year_locator)
Ax2 = fig.add_subplot(122)
plot_acf (df_sales_sum.Weekly_Sales ax = ax2)
plt。标题(“自动校正”,字形大小= 15)
plt.xlabel(“滞后”,字形大小= 15)
plt。ylabel(“相关性”,字形大小= 15)
plt.show ()
png

在这里,我们可以看到在观察到的一个相对较高的相关性点滞后= 5。我们在前一张图中看到的结构缺乏是销售偶然性的结果:考虑到预测销售的因素数量,我们不应该期望数据像天气数据集那样具有完全明确的相关性。然而,观察与所涉及的产品类型相关的因素相关的峰值是很有趣的。例如,对于一家销售圣诞礼物的商店,我们应该期望看到从圣诞节开始相隔一年的观察结果之间的高度相关性,因为人们更有可能在这个特定时期购买更多的礼物。

静态模式

正如这个表达所暗示的那样,静态模式的概念与不变的概念有关。

在时间序列中,这个概念最著名的代表是平稳性,它指的是保持静态的时间序列的统计特性:平稳时间序列中的观测值不依赖于时间。

趋势和季节性会影响时间序列在不同时间的值。传统上,我们会寻找随时间的一致性,例如通过使用观察的平均值或方差。当一个时间序列是平稳的,它可以更容易地建模和统计建模方法通常假设或要求时间序列是平稳的。

如果你想更深入地研究平稳性,我建议你这样做一块通过谢Palachy

检查数据集是否平稳的标准程序包括使用一种称为Dickey-Fuller测试的测试,该测试检查数据是否具有静态统计属性的置信度。要了解更多细节,请查看这个文章

从statmodels .tsa.stattools导入adfuller

adf_test_sales = adfuller(list(df_sales_sum["Weekly_Sales"]))

adf_test_weather = adfuller(list(df_weather["Temperature (C)"])))

打印(“天气结果:”)
print("ADF = " + str(adf_test_weather[0]))
Print ("p-value = " +str(adf_test_weather[1]))

打印(“零售业绩:”)

print("ADF = " + str(adf_test_sales[0]))

Print ("p-value = " +str(adf_test_sales[1]))
天气结果:
Adf = -10.140083406906376
p值= 8.46571984130497e-18
零售业绩:
Adf = -2.6558148827720887
p值= 0.08200123056783876

在这里,我们可以看到天气数据集的测试结果指向平稳,这是一个我们应该持怀疑态度的结果,因为它在很大程度上取决于我们如何采样我们的数据,通常气候数据是循环平稳的。然而,在我们的零售数据集上,p值表明数据将是平稳的非显著置信度。

趋势

趋势表示在我们的数据中确定的趋势。在股票市场的情况下,这可能是一个给定的股票的趋势,似乎是上升或下降。对于销售预测,这是关键:确定趋势可以让我们知道时间序列的方向,这是预测未来销售的基础。

我们将使用fbprophet包,以确定我们两个数据集的总体趋势。步骤如下:

  • 选择天气资料的范围(2007至2009年)
  • 将数据提供给fbprophet。先知对象作为具有两列的数据框:"ds"(用于日期)和"y"(数据)。
  • 运行模型
  • 用上界和下界绘制趋势图
从fbprophet导入
从datetime导入datetime

Start_date = "2007-01-01"
End_date = "2008-12-31"
df_weather["格式化日期"]= pd。to_datetime(df_weather["格式化日期"],utc=True)

date_range = (df_weather["已格式化日期"]> start_date) & (df_weather["已格式化日期"]< end_date)

Df_prophet = df_weather.loc[日期范围]

m =先知()


ds = df_prophet["格式化日期"].dt. tz_locale(无)
y = df_prophet["温度(C)"]
df_for_prophet = pd.DataFrame(dict(ds=ds,y=y))
m.fit (df_for_prophet)

未来= m.make_future_dataframe(周期=120)


预测(未来)
Forecast = Forecast [["ds","trend", "trend_lower", "trend_upper"]]
fig = m.plot_components(forecast,plot_cap=False)
Trend_ax = fig.axes[0]


trend_ax.plot ()
plt。title("天气数据趋势",font =15)
plt。包含(“日期”,字形大小= 15)
plt。ylabel("天气趋势",font - size=15)
plt.show ()
信息:fbprophet:禁用年度季节性。运行带有yearly_seasonality=True的prophet来重写这个。
C:\Users\lucas\.conda\envs\env_1\lib\网站\ pystan \ misc.py: 399: FutureWarning:

将issubdtype的第二个参数从' float '转换为' np '。“浮动”已弃用。在未来,它将被视为“np”。Float64 == np.dtype(float).type '。
png

我们可以看到,对于天气,趋势遵循常规季节,正如我们所期望的那样,在夏季上升,在冬季下降。

现在,让我们对零售数据集做同样的事情。步骤将与上面的图类似,唯一的区别是这里我们将从零售数据集中选择一家商店。

从fbprophet导入


m =先知()
#选择一个商店
df_store_1 = df_sales[df_sales["Store"]==1]

df_store_1(“日期”)= pd.to_datetime (df_store_1[“日期”)
ds = df_store_1["Date"].dt. tz_localalize(无)
y = df_store_1["Weekly_Sales"]
df_for_prophet = pd.DataFrame(dict(ds=ds,y=y))
m.fit (df_for_prophet)
未来= m.make_future_dataframe(周期=15)
预测(未来)
Forecast = Forecast [["ds","trend", "trend_lower", "trend_upper"]]
fig = m.plot_components(forecast,plot_cap=False)
Trend_ax = fig.axes[0]
trend_ax.plot ()
plt。title("零售数据趋势",font =15)
plt。包含(“日期”,字形大小= 15)
plt。ylabel("销售趋势",font - size=15)

plt.show ()
C:\Users\lucas\.conda\envs\env_1\lib\网站\ ipykernel_launcher.py: 8: SettingWithCopyWarning:


试图在来自数据帧的切片副本上设置值。
尝试使用.loc[row_indexer,col_indexer] = value

请参阅文档中的说明:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

信息:fbprophet:禁用每日季节性。使用daily_seasonality=True运行prophet来覆盖这个。
C:\Users\lucas\.conda\envs\env_1\lib\网站\ pystan \ misc.py: 399: FutureWarning:

将issubdtype的第二个参数从' float '转换为' np '。“浮动”已弃用。在未来,它将被视为“np”。Float64 == np.dtype(float).type '。
png

所选店铺的销售业绩从2010年到2013年呈几乎完美的线性上升趋势,总销量增长超过1%。对这些结果的实际解释需要其他指标,如流失率和潜在的成本增加,所以上升趋势并不一定意味着利润增加。然而,一旦考虑到所有因素,趋势是整体表现的一个很好的指标。

销售预测的传统时间序列模型

到目前为止,我们已经涵盖了销售预测问题的基础知识,并从时间序列的角度确定了它的主要组成部分:重复模式、静态模式和趋势的概念。如果你想更深入地研究时间序列,我建议你这样做文章作者:will Koehrsen

现在我们来看看处理销售预测问题的传统时间序列方法:

  • 移动平均线
  • 指数平滑法
  • 华宇电脑

移动平均线

这个模型假设下一个观测值是所有过去观测值的平均值,它可以用来识别数据中有趣的趋势。我们可以定义一个窗口来应用移动平均模型来平滑时间序列,并突出不同的趋势。

让我们使用移动平均模型来预测天气和销售情况。步骤如下:

  • 选择一个范围
  • 为移动平均窗口定义一个值
  • 计算平均绝对误差
  • 绘制滚动均值的上界和下界
  • 绘制真实数据
从sklearn。度量导入mean_absolute_error

绿色= sns。color_palette(“深”,8)[2]
蓝色= sns。color_palette(“深”,8)[0]

Start_date = "2007-01-01"
End_date = "2008-12-31"
df_weather["格式化日期"]= pd。to_datetime(df_weather["格式化日期"],utc=True)
date_range = (df_weather["已格式化日期"]> start_date) & (df_weather["已格式化日期"]< end_date)
Df_weather_ma = df_weather.loc[日期范围]
series = df_weather_ma["温度(C)"]

窗口= 90
Rolling_mean = series.rolling(window=window).mean()
图,ax = plt.subplots(figsize=(17,8))

plt。title('天气数据集的移动平均模型',font =15)
plt。plot(rolling_mean, color=green, label='滚动平均趋势')
绘制平滑值的置信区间
Mae = mean_absolute_error(series[window:], rolling_mean[window:])
偏差= np。Std (series[window:] - rolling_mean[window:])
Lower_bound = rolling_mean - (mae + 2 * deviation)
Upper_bound = rolling_mean + (mae + 2 * deviation)
plt。plot(upper_bound, 'r——',label='上界/下界')
plt。情节(lower_bound r——)
plt。plot(series[window:],color=blue, label="Actual Values")

plt.legend (loc =“最佳”)
plt.grid(真正的)
plt.xticks ([])

plt.show ()
png

这个模型似乎捕捉到了天气的一些动态变化。让我们看看这个模型如何处理零售数据集。

系列= df_sales_sum。Weekly_Sales
窗口= 15

Rolling_mean = series.rolling(window=window).mean()
图,ax = plt.subplots(figsize=(17,8))


plt。标题(“零售销售的移动平均模型”,字体大小=15)

plt。plot(rolling_mean, color=green, label='滚动平均趋势')

绘制平滑值的置信区间
Mae = mean_absolute_error(series[window:], rolling_mean[window:])
偏差= np。Std (series[window:] - rolling_mean[window:])
Lower_bound = rolling_mean - (mae + 1.92 * deviation)
Upper_bound = rolling_mean + (mae + 1.92 * deviation)

plt。plot(upper_bound, 'r——',label='上界/下界')
plt。情节(lower_bound r——)

plt。plot(series[window:], color=blue,label='实际值')


plt.legend (loc =“最佳”)
plt.grid(真正的)
plt.xticks ([])
plt.show ()
png

对于销售数据集,匹配看起来不那么有希望,但与天气数据集相比,零售数据集的数据也少得多。此外,设置平均大小的窗口参数对我们的整体性能有很大影响,并且我没有进行任何额外的超参数调优。在这里,我们应该了解的是,复杂的销售数据集需要比简单的一维时间序列提供更多的信息。

指数平滑法

指数平滑类似于移动平均,但在这种情况下,分配给每个观察值的权重逐渐减少,因此随着我们从当前进一步移动,观察值的重要性就会降低。这样的假设可能是好的,也可能是坏的:减少时间序列动态中过期信息的权重可能是有益的,但是当过去的信息与数据的动态具有某种永久的因果关系时,它可能是有害的。

让我们在上面使用的天气数据集中使用指数平滑,我们将:

  • 拟合数据
  • 预测
  • 根据实际值绘制预测图
从statmodels .tsa.api导入ExponentialSmoothing
进口matplotlib。Pyplot为PLT
进口matplotlib。候选日期
进口seaborn作为SNS
sns.set ()
进口熊猫作为pd

fit1 = ExponentialSmoothing(df_weather["Temperature (C)"][0:200]).fit(smoothing_level=0.1, optimized=False)
fit2 = ExponentialSmoothing(df_weather["Temperature (C)"][0:200]).fit(smoothing_level=0.5, optimized=False)
Forecast1 = fit1.forecast(3).rename(r'$\alpha=0.1$')
Forecast2 = fit2.forecast(3).rename(r'$\alpha=0.5$')
8) plt.figure (figsize =(17日)

forecast1。情节(颜色=“蓝”,传说= True)
forecast2。情节(颜色=‘红’,传说= True)
df_weather[“温度(ºC)”][0:200]。情节(= "标志,颜色=“绿色”,传说= True)
fit1.fittedvalues.plot(颜色=“蓝”)
fit2.fittedvalues.plot(颜色= '红色')
plt。title(“指数平滑天气数据”,font =15)
plt.xticks ([])

plt.show ()
png

现在对于零售数据集:

#把正确的数据框放在这里!

fit1 = ExponentialSmoothing(df_sales_sum["Weekly_Sales"][0:200]).fit(smoothing_level=0.1, optimized=False)

fit2 = ExponentialSmoothing(df_sales_sum["Weekly_Sales"][0:200]).fit(smoothing_level=0.5, optimized=False)

Forecast1 = fit1.forecast(3).rename(r'$\alpha=0.1$')
Forecast2 = fit2.forecast(3).rename(r'$\alpha=0.5$')
8) plt.figure (figsize =(17日)

forecast1。情节(颜色=“蓝”,传说= True)
forecast2。情节(颜色=‘红’,传说= True)
df_sales_sum[“Weekly_Sales”][0:200]。情节(= "标志,颜色=“绿色”,传说= True)
plt。ylabel(“销售”,字形大小= 15)

fit1.fittedvalues.plot(颜色=“蓝”)
fit2.fittedvalues.plot(颜色= '红色')

plt。title(“指数平滑零售数据”,font =15)
plt。xticks([],小= True)
plt.show ()
png

这里我们使用平滑因子(最近时期的权重)alpha = 0.1和alpha = 0.5的两个值进行平滑,并用绿色绘制实际温度和零售数据。

正如我们在这里看到的,平滑因子越小,时间序列就越平滑。这很直观,因为当平滑因子接近0时,我们接近移动平均模型。第一个似乎很好地捕获了两个数据集上的动态,但它似乎未能捕获某些峰值活动的大小。

从概念上讲,考虑给定数据集的性质,模型的假设如何影响其性能是很有趣的。我可以预期,新信息对销售更重要,因为影响商店销售产品可能性的因素可能在不断变化和更新。因此,与假设动态保持恒定的模型相比,具有降低过去信息重要性的模型将更准确地捕捉到这种变化的动态。

华宇电脑

ARIMA是一种时间序列模型,旨在描述时间序列数据中的自相关性。它可以很好地用于短期预测,并且可以为用户指定的时间段提供预测值,显示需求、销售、计划和生产的良好结果。

ARIMA模型的参数定义如下:

  • p:模型中包含的滞后观测数
  • d:原始观测值差异的次数
  • q:移动平均窗口的大小

现在我将使用ARIMA模型对天气数据和零售销售进行建模。步骤如下:

  • 将数据分成训练和测试两部分
  • 拟合数据
  • 打印均方误差(我们的评估指标)
  • 绘制与实际值拟合的模型
从statsmodels.tsa。arima_model导入ARIMA
从sklearn。度量导入mean_squared_error
进口熊猫作为pd

X = df_weather["Temperature (C)"].values

Train_size = 600
Test_size = 200

test = X[0:train_size], X[train_size:train_size+test_size]

History = [x for x in train]
预测= []
对于range(len(test))中的t:
model = ARIMA(history, order=(5,1,0))
Model_fit = model.fit(disp=0)
输出= model_fit.forecast()
Yhat =输出[0]
predictions.append (yhat)
Obs = test[t]
history.append(观察)

Mse = mean_squared_error(test, predictions)
print(f"MSE错误:{MSE}")
8) plt.figure (figsize =(17日)

plt.plot(测试)
plt。图(预测、颜色= '红色')
plt。标题(“ARIMA拟合天气数据”)
plt.xticks ([])
plt.show ()
MSE错误:3.105596078192541
png

在这里,我们看到ARIMA模型与天气数据集的预期良好拟合,因为之前我们看到该数据集具有非常高的自相关性。让我们将其与模型对销售数据集的行为进行比较:

从statsmodels.tsa。arima_model导入ARIMA
从sklearn。度量导入mean_squared_error
进口熊猫作为pd

进口matplotlib。Pyplot为PLT
进口seaborn作为SNS
sns.set ()



X = df_sales_sum["Weekly_Sales"].values

split = int(0.66*len(X))
训练,测试= X[0:分裂],X[分裂:]

History = [x for x in train]
预测= []
对于range(len(test))中的t:
model = ARIMA(history, order=(5,1,0))
Model_fit = model.fit(disp=0)
输出= model_fit.forecast()
Yhat =输出[0]
predictions.append (yhat)

Obs = test[t]
history.append(观察)
Mse = mean_squared_error(test, predictions)

print(f"MSE错误:{MSE}")

8) plt.figure (figsize =(17日)
plt.plot(测试)
plt。图(预测、颜色= '红色')
plt。title("ARIMA适合销售数据",font =15)
plt.xticks ([])
plt.show ()
MSE错误:47664398980324.34
png

在这里,拟合并不像在天气数据集中那样好,这是可以预料的,因为ARIMA模型通常对高度平稳的数据集工作得很好。

让我们记住,这里的结果仅仅是为了展示模型,并不代表准确的估计。数据集是有限的(求和后的零售数据集小于200个数据点),我没有执行任何复杂的超参数调优。这里的目标只是演示这些模型是如何工作的,以及如何在python中实现它们。我们可以验证零售数据集似乎提出了传统模型无法克服的挑战。

我们可以看到,对于具有清晰模式的数据集,传统模型工作得很好。然而,在缺乏这种结构的情况下,这些模型似乎没有表现出适应的灵活性,因为它们依赖于关于目标时间序列动态的强假设。

现在,我们将讨论当前用于销售预测的深度学习方法,并尝试了解它们可以在传统模型不够的情况下带来哪些有利于预测准确性的方法。

现代销售预测与深度学习

在这里,我想概述一下我认为最适合深度学习用于销售预测的主要候选对象。

亚马逊的DeepAR模型

我们今天在这里讨论的模型适合每个单独的时间序列的单个模型。然而,在销售中,通常有多个时间序列与您试图建模的动态相关。由于这个原因,能够在所有相关的时间序列上联合训练一个模型是非常有益的。

亚马逊预测DeepAR+是一种监督学习算法,它使用循环神经网络来预测一维时间序列。它允许在一个模型上训练多个时间序列特征,并且在标准时间序列基准上优于传统模型。

这个模型的主要观点是它克服了传统模型只能在单个时间序列上训练的局限性之一。此外,该模型使用概率预测该模型不是传统的预测某一天或某一时期我们预期卖出多少的点,而是通过一组预测区间来预测未来不同情景的可能性分布。这些预测分位数可以用来表示预测中的不确定性,从而为我们提供每个预测的置信区间。当涉及到下游使用决策时,这些类型的预测特别重要,因为点预测几乎没有什么用处。

用于销售预测的NLP

有一种方法乍一看似乎不合常规,但很有希望,那就是使用自然语言处理模型进行预测。我想提两种方法:

实体嵌入

在这个LotusLabs撰写的文章它们描述了一种使用分类数据(彼此无关的数据)并利用该数据的嵌入表示来进行预测的想法。为了建立这种表示,使用传统的神经网络将输入映射到嵌入空间。

通过识别相似的输入并将它们映射到相似的位置,他们能够识别出原本很难看到的模式。使用这种方法的优点之一是您不必执行任何特征工程。

这种方法的一个有趣的细节是,它克服了简单的单热编码表示中的稀疏性等问题。

产品描述的NLP预测销售

采取了不同的方法。他们使用了日本电子商务市场上9万多种产品描述的数据乐天并确定了可操作的写作风格和词汇用法,这些都能高度预测消费者的购买行为。

该模型结合了词向量、lstm和注意力机制来预测销量。他们发现,季节性的、礼貌的、权威的和信息丰富的产品描述会带来最好的结果。

此外,他们还表明,即使考虑到品牌忠诚度和产品身份等其他因素,产品描述中嵌入的叙述中的词语也是销售的重要决定因素。他们使用神经网络的新特征选择方法具有良好的性能,并且该方法本身指出了在使用销售预测时必须考虑的数据集景观的异质性。

用于销售预测的WAVENET

第二名食品杂货销售预测公司竞争使用了Wavenet CNN模型的改编版。小波网络是一种生成模型,它可以在给定条件输入的情况下生成实值数据序列。作者认为,这里的主要思想在于概念扩展的因果卷积

WaveNet的结构是一个全卷积神经网络,其中卷积层具有各种扩展因子,使其接受域呈指数级增长,并使用可以保持特征图大小的采样滤波器覆盖许多时间点。这种方法可以增加内核的视野,并捕获输入的整体全局视图。要了解更多,我推荐这个文章来源:DeepMind

生成模型似乎是深度学习中销售预测的一个明显趋势,因为它们已经证明了对分布进行建模的能力,因此可以预测不同场景的可能性,在销售预测的偶然背景下,当有足够的数据时,生成模型似乎是比传统模型更好的方法。

关于元学习的简短说明

在最近在今年5月发表的一篇文章中,马绍辉(Shaohui Ma)和罗伯特·菲尔德斯(Robert Fildes)提出了一种销售预测的元学习方法。这个想法是使用元学习器来利用潜在的预测方法池,而不是单一的模型方法。

他们的方法使用元学习器来提取数据的相关特征,使用1-D卷积的堆叠序列和最后池化的校正线性单元。在集合阶段,他们使用密集层和softmax将多个预报的预测结合起来。

他们的方法点表明,该领域倾向于更多的混合自学习方法,而不是单一的模型解决方案。

结论

传统方法只能解释它们所训练的一维数据的动态。然而,像这样的方法指向了混合模型的未来,在混合模型中,多个时间序列可以被解释,分类变量可以包含在预测管道中。

通用性和灵活性似乎是渗透成功的销售预测模型的关键因素。深度学习能够开发复杂的、定制的预测模型,这些模型包含非结构化的零售数据集,因此只有在数据足够复杂时才有意义。

如果你想查看这篇文章的笔记本,你可以找到它在这里

如果你想更深入地使用Python进行预测,请查看Udemy的这些课程:

这些都是附属链接,如果你使用他们我得到一个小佣金,干杯!:)

如果你喜欢这篇文章,请与我联系LinkedIn推特

谢谢,下次见!:)

机器学习工程师。我写的是人工智能b|数据科学b|生产力与学习。加入中:https://lucas-soares.medium.com/membership

Baidu
map