预测销售是机器学习(ML)的常见和基本用途。预测销售可用于基准测试和确定新举措的增量影响、根据预期需求规划资源以及规划未来预算。在本文中,我将展示如何实施5种不同的ML模型来预测销售。初始准备首先我们加载数据并将其转换为结构,然后用于每个模型。在原始格式中,每一行数据代表十家商店一天的销售额。我们的目标是预测每月的销售额,所以我们首先将所有商店和天数组合成每月总销售额。defload_data():returnpd.read_csv('D:\Jupyter\dataset\demand-forecasting-kernels-only/train.csv')defmonthly_sales(data):monthly_data=data.copy()monthly_datamonthly_data.date=monthly_data.date.apply(lambdax:str(x)[:-3])monthly_datamonthly_data=monthly_data.groupby('date')['sales'].sum().reset_index()monthly_data.date=pd.to_datetime(monthly_data.date)returnmonthly_datamonthly_df=monthly_sales(sales_data)monthly_df.head()在我们的新数据框中,每一行现在代表给定月份所有商店的总销售额。如果我们绘制一段时间内的每月总销售额,我们会看到平均每月销售额随时间增加,这意味着我们的数据不是固定的。为了平滑它,我们将计算月销售额之间的差异并将其作为新列添加到我们的数据框中。defget_diff(data):data['sales_diff']=data.sales.diff()datadata=data.dropna()data.to_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/stationary_df.csv')returndatastationary_df=get_diff(monthly_df)下面是差值转换前后数据的可视化表示:接下来将为不同的模型类型设置数据。为此,我们将定义两种不同的结构:一种用于ARIMA建模,另一种用于其余模型。对于我们的Arima模型,我们只需要一个日期时间索引和因变量(销售差异)列。defgenerate_arima_data(data):dt_data=data.set_index('date').drop('sales',axis=1)dt_data.dropna(axis=0)dt_data.to_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/arima_df.csv')returnt_dataarima_datetime=generate_arima_data(stationary_df)对于其他模型,我们将创建一个新的数据框,其中每个特征代表上个月的销售额。为了确定在我们的特征集中包含多少个月,我们将查看自相关和部分自相关图,并使用ARIMA建模中选择滞后时间的规则。这样,我们可以为我们的ARIMA和回归模型保持一致的回顾期。自相关和部分自相关图基于以上内容,我们将选择12个月的回顾期。因此,我们将生成一个包含13列的数据框,12个月中的每一列,以及我们的因变量,即销售额差异作为第1列。defgenerate_supervised(数据):supervised_df=data.copy()#createcolumnforeachlagforiinrange(1,13):col_name='lag_'+str(i)supervised_df[col_name]=supervised_df['sales_diff'].shift(i)#dropnullvaluessupervised_dfsupervised_df_df=supervised.dropna().reset_index(drop=True)supervised_df.to_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/model_df.csv',index=False)returnsupervised_dfmodel_df=generate_supervised(stationary_df)现在我们有两个有两个独立的数据结构,一个Arima结构,它包含一个datetime索引,一个supervisory结构,它包含滞后时间特征。用于销售预测建模的ARIMA和监督数据框为了创建和评估所有模型,我们使用了一系列执行以下功能的辅助函数。训练、测试、拆分:我们拆分数据,使过去12个月的数据成为测试集的一部分,其余数据用于训练我们的模型缩放数据:使用最小-最大缩放器,我们将缩放数据以便所有变量都在-1到1的范围内反向缩放:运行模型后,我们将使用此辅助函数从步骤2中反转缩放创建预测数据框:生成一个包含捕获的实际销售额的数据框在测试集中对模型的预测求和,以便我们可以量化我们的成功对模型进行评分:此辅助函数将保存我们预测的均方根误差(RMSE)和平均绝对误差(MAE),以比较五个模型的性能1。回归模型:线性回归、随机森林回归、XGBoost对于我们的回归模型,我们可以使用scikit-learn库的拟合预测结构。因此,我们可以设置一个基础建模结构,我们将为每个模型调用该结构。下面的函数调用上面概述的一些辅助函数来拆分数据、运行模型并输出RMSE和MAE分数。defregressive_model(train_data,test_data,model,model_name):#CallhelperfunctionstocreateX&yandscaledataX_train,y_train,X_test,y_test,scaler_object=scale_data(train_data,test_data)#运行回归模型mod=modelmod.fit(X_train,y_train)predictions=mod.predict(X_test)#Callhelperfunctionstoundoscaling&createpredictiond=foriginal_datapd.read_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/train.csv')unscaled=undo_scaling(predictions,X_test,scaler_object)unscaled_df=predict_df(unscaled,original_df)#Callhelperfunctionstoprintscoresandplotresultsget_scores(unscaled_df,original_df,model_name)plot_results(unscaled_df,original_df,model_name)#Separatedataintotrainandtestsetstrain,test=tts(model_df)#Callmodelframeworkforlinearregressionregressive_model(train,test,LinearRegression(),'LinearRegression')#Callmodelframeworkforrandomforestregressorregressive_model(train,test,Random=Forest_0,maxRegressor(火车,测试,随机=ForestRegressor)),'随机森林')#CallmodelframeworkforXGBoostregressive_model(train,test,XGBRegressor(n_estimators=100,learning_rate=0.2),'XGBoost')下面的输出显示每个回归模型的预测(红色)都覆盖在实际销售额(蓝色)之上,尽管结果看起来非常相似,但细微差别相当于几千美元的销售额,正如我们将在下面的比较部分中看到的那样。2.长短期记忆(LSTM)LSTM是一种递归神经网络,对于使用顺序数据进行预测特别有用。为此,我们将使用一个非常简单的LSTM。为了提高准确性,可以添加周期性特征和额外的模型复杂性。deflstm_model(train_data,test_data):X_train,y_train,X_test,y_test,scaler_object=scale_data(train_data,test_data)X_trainX_train=X_train.reshape(X_train.shape[0],1,X_train.shape[1])X_testX_test=X_test.reshape(X_test.shape[0],1,X_test.shape[1])model=Sequential()model.add(LSTM(4,batch_input_shape=(1,X_train.shape[1],X_train.shape[2]),stateful=True))model.add(Dense(1))model.add(Dense(1))model.compile(loss='mean_squared_error',optimizer='adam')model.fit(X_train,y_train,epochs=200,batch_size=1,verbose=1,shuffle=False)predictions=model.predict(X_test,batch_size=1)original_df=load_original_df()unscaled=undo_scaling(predictions,X_test,scaler_object,lstm=True)unscaled_df=predict_df(未缩放,original_df)get_scores(unscaled_df,original_df,'LSTM')plot_results(unscaled_df,original_df,'LSTM')生成的图看起来类似于上面的三个回归图,因此我们将继续比较结果,直到我们看到下面的错误为止。LSTM模型预测与实际销售额3.ARIMAARIMA模型看起来与上面的模型略有不同。我们使用statsmodelsSARIMAX包来训练模型并生成动态预测。SARIMA模型分为几个部分。AR:表示为p,是自回归模型I:表示为d,是微分项MA:表示为q,是移动平均模型S:使我们能够添加一个周期性组件在下面的代码中,我们定义了我们的模型,动态预测然后对最近12个月的数据进行制作。对于标准的非动态预测,下个月的预测是使用前几个月的实际销售额进行的。相反,对于动态预测,前几个月的预测销售额用于预测下个月。deflstm_model(train_data,test_data):X_train,y_train,X_test,y_test,scaler_object=scale_data(train_data,test_data)X_trainX_train=X_train.reshape(X_train.shape[0],1,X_train.shape[1])X_testX_test=X_test.reshape(X_test.shape[0],1,X_test.shape[1])model=Sequential()model.add(LSTM(4,batch_input_shape=(1,X_train.shape[1],X_train.shape[2]),stateful=True))model.add(Dense(1))model.add(Dense(1))model.compile(loss='mean_squared_error',optimizer='adam')model.fit(X_train,y_train,epochs=200,batch_size=1,verbose=1,shuffle=False)predictions=model.predict(X_test,batch_size=1)original_df=load_original_df()unscaled=undo_scaling(predictions,X_test,scaler_object,lstm=True)unscaled_df=predict_df(未缩放,original_df)get_scores(unscaled_df,original_df,'LSTM')plot_results(unscaled_df,original_df,'LSTM')同样,结果看起来不错。我们将在下面进一步挖掘。ARIMA模型预测与实际销售比较模型为了比较模型性能,我们将查看均方根误差(RMSE)和平均绝对误差(MAE)。这些指标通常用于比较模型性能,但它们的直觉和数学含义略有不同。MAE:平均绝对误差告诉我们预测与真实值的差距。在这种情况下,所有错误的权重都相同。RMSE:我们通过对所有误差平方和求平方根来计算RMSE。当我们平方时,较大的误差对整体误差的影响较大,而较小的误差对整体误差的影响不大。从上面的辅助函数中,我们使用get_scores计算每个模型的RMSE和MAE分数。这些分数保存在字典中并保存。为了进行比较,我们会将字典转换为Pandas数据框并绘制结果。defcreate_results_df():results_dict=pickle.load(open("model_scores.p","rb"))results_dict.update(pickle.load(open("arima_model_scores.p","rb")))results_df=pd.DataFrame.from_dict(results_dict,orient='index',columns=['RMSE','MAE','R2'])results_dfresults_df=results_df.sort_values(by='RMSE',ascending=False).reset_index()returnresults_dfresults=create_results_df()这为我们提供了以下数据框。我们可以看到,虽然我们的模型输出在上图中看起来很相似,但它们的准确性确实不同。下面是一个可以帮助我们看到差异的视觉效果。比较模型性能结论我们看到的是,总体而言,XGBoost模型具有最佳性能,紧随其后的是ARIMA和LSTM模型。重要的是要注意,上述所有模型都是以最基本的形式派生的,以演示如何将它们用于销售预测。该模型仅经过微调以最大程度地降低复杂性。例如,LSTM可以有许多其他节点和层来提高性能。要确定哪种模型适合您的用例,您应该考虑以下因素:模型复杂程度与可解释性。可以调整模型并设计函数以包括周期性信息、假期、周末等。了解如何使用结果以及如何输入数据来更新模型。使用交叉验证或类似技术来调整模型以避免过度拟合数据。
