在解决单变量工夫序列数据时,咱们预测的一个最次要的方面是所有之前的数据都对将来的值有肯定的影响。这使得惯例的机器学习办法 (如训练 / 宰割数据和穿插验证) 变得辣手。
在本文中咱们应用《Apex 英雄》中数据分析的玩家流动工夫模式,并预测其增长或降落。咱们的数据来自 https://steamdb.info,这是一个 CSV 文件。
为了评估模型的性能,咱们将应用均方根误差(RMSE)和均匀绝对误差(MAE)作为指标来评估咱们的回归模型。RMSE 将给咱们一个数据差值的标准偏差,也就是数据点离最佳拟合线的间隔。而 MAE 度量是指观测值与实在值之间的差值,这将有助于确定模型的准确性。
EDA
拿到数据后,必定第一个操作就是进行 EDA。在解决工夫序列数据时,数据探索性剖析的次要目标是发现以下这些特色:
- 季节性 Seasonality
- 趋势 Trend
- 平稳性 Stationary
除此之外,咱们还能够计算出各种平均值:
- 简略的挪动平均线
- 指数挪动平均值
自 2019 年 2 月《Apex 英雄》首次公布以来的统计汇总,玩家的数量表明,Apex 英雄均匀约为 179,000 个玩家
这图为简略挪动均匀趋势线
这图为指数挪动平均线。
简略的挪动平均线表明 6 月份玩家流动有轻微的降落趋势。趋势线的斜率为 11,思考到玩家在 100k 到 300k 之间稳定,在统计上并不显著。因而能够说玩家在 6 月份的流动相当稳固。
这是依据星期来计算的每天玩家流动的小提琴图
这是每天中按小时散布的玩家流动图
小提琴图不仅能够显示一些汇总的统计数据,如最大值、最小值和中值,还能够直观地显示散布。咱们能够察看到,周末绝对于工作日,尤其是周六和周日,散布更平均。
玩家和 twitch 观看者在 6 月份的流动模式。
通过上图能够看到单变量工夫序列有一个确定的模式。一天中可预测的回升和降落。这在当前探讨模型预测时将十分重要。
察看值 = 趋势 + 季节性 + 残差
咱们须要确认的一个假如是工夫序列是安稳,也就是说均值和方差根本不会变动,这对于自回归模型非常重要。
然而从视觉上看很难判断平均值和差别是否在变动,咱们须要一种查看此问题的办法。只管从挪动平均线来看,咱们能够看到大多数状况下的变动并不大,然而咱们须要确保应用统计测试在统计上是有统计学意义的。
Dicky-Fuller 测验是一个假设检验,能够通过它来晓得工夫序列是否安稳。该测试的零假如是工夫序列是非安稳的。所以咱们须要 p 值小于 0.05,这样就能够回绝零假如。能够看到上面的 p 值小于 0.05,所以咱们的确能够回绝零假如,它是非安稳的,并说咱们的数据的确有安稳的均值和方差。(代码见最初的地址)
Test Statistic: -7.4339413132678205
p-value: 6.254742639140234e-11
建模
本文中测试了 3 种不同的模型:Naive, FB Prophet 和自回归。并比拟了这三个模型的性能
应用单变量数据创立训练集和验证集不同于典型的表格数据。所以 sklearn 的 TimeSeriesSplit 函数能够帮忙咱们实现这个工作,对单变量数据进行 4 次拆分,并执行穿插验证。在拆分之后,利用模型并为每次拆分计算评估指标 (RMSE 和 MAPE)。均方根误差(RMSE) 和均方根误差 (MAPE) 取平均值。
def eval_model_perf(df: pd.DataFrame , model: Callable[[pd.DataFrame, pd.DataFrame], List[any]]) -> None:
""" Evaluates the performance of a model using RMSE and MAPE.
Args:
df (DataFrame): The input DataFrame.
model (DataFrame, List): The predicted values by the model that is being evaluated.
"""
rmse_metrics = []
mape_metrics = []
tscv = TimeSeriesSplit(n_splits=4)
for train_index, test_index in tscv.split(df):
cv_train = df.iloc[train_index]
cv_test = df.iloc[test_index]
preds = model(cv_train, cv_test)
rmse_eval = rmse(cv_test, preds)
naive_eval = mean_absolute_percentage_error(cv_test, preds)
rmse_metrics.append(rmse_eval)
mape_metrics.append(naive_eval)
print("Cross Validation Results:")
print(f"RMSE: {np.mean(rmse_metrics)}")
print(f"MAPE: {np.mean(mape_metrics)}")
1、Naive
Naive 将前一个值作为下一个值进行预测,这个在理论中并没有任何意义,咱们这里只是用他来作为对照,如果其余模型的后果还不如它,那么其余模型就更没有任何存在的价值。
后果如下
2、FB Prophet
Prophet 模型应用 AM 进行预测。
后果如下:
他的益处有:
没有很多参数须要调整。
有自动化的缩放量能够很好地缩放数据。
在将数据集发送到模型之前,不须要对数据集进行过多的理解。
然而他毛病也很显著:
模型假如季节性变动是恒定的,不随工夫的变动而变动
比 AR 模型更难解释。
3、自回归模型
自回归模型通过后面的预测来预测前面的值,也就是说前面的预测值会应用后面的预测后果
后果如下:
劣势:
- 能够灵活处理宽泛的工夫序列模式
- 更容易解释该模型在做什么
毛病:
- 须要很多的参数
- 工夫序列数据须要先验信息才可能更加精确
总结
咱们测试了三种模型来预测玩家的流动(其实是 2 个无效模型)。原始模型作为评估其余模型的基线。Facebook Prophet 模型是由 Facebook 开发咱们能够间接拿来应用,还有一个是咱们依据已知特色(例如趋势和季节性等)的单变量的自回归模型。
在创立这些模型的过程中,最简单的是自回归模型,因为它须要大量的探索性数据分析。
FB Prophet 不波及超参数调优,并且不须要对于单变量数据特色的先验信息,模型的精度为 87%,RMSE ~19120。facebook Prophet 模型中一个显著的趋势是对降落趋势的夸张。然而这曾经相当好了
尽管 FB Prophet 模型很好,但它没有击败自回归模型。自回归模型是一个更直观、更容易了解的模型。与线性回归类似,单变量数据被分解成线性组合,因而,模型的一个长处是更容易解释。毛病是,尽管这个模型的性能比其余任何模型都要好,但它的确须要一些数据常识。
自回归模型另外一个毛病是,须要对底层数据有松软的了解。而 FB Prophet 模型不须要咱们了解任何数据。这也可能是 FB Prophet 模型的一个毛病是它应用可加模型,更难以解释,不像 AR 模型那样灵便。
自回归模型和 FB Prophet 模型仿佛都表明,尽管有轻微的降落趋势,但不具备统计学意义,如假设检验所示。咱们还发现咱们的工夫序列数据是安稳的,这是 AR 模型的要求。
本文的残缺代码在这里:
https://avoid.overfit.cn/post/c544acaecd8f4954879f28f36f64e083
作者:Salman Hossain