# 利用Facebook的Prophet模型进行时间序列数据预测 **Repository Path**: BentoMan/Time-Series-Data-Forecast ## Basic Information - **Project Name**: 利用Facebook的Prophet模型进行时间序列数据预测 - **Description**: 本项目利用Facebook开源的Prophet模型,根据历史市场规模数据对2020年2G、3G、4G、5G市场规模进行预测。该项目重点在于模型构建流程、Prophet模型原理及使用、机器学习模型与Prophet模型对比。由于数据隐私问题,不提供任何数据。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2020-11-17 - **Last Updated**: 2025-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 利用Facebook的Prophet模型进行时间序列数据预测 #### 一、介绍 本项目利用Facebook开源的Prophet模型,根据历史市场规模数据对2020年2G、3G、4G、5G市场规模进行预测。该项目重点在于模型构建流程、Prophet模型原理及使用、机器学习模型与Prophet模型对比。由于数据隐私问题,不提供任何数据。 **为了保证展示效果,从参考资料中借了几张图,如涉及侵权,请随时联系我删除。** #### 二、使用工具 **1.Facebook Prophet** Prophet是Facebook开源的一种基于加性模型预测时间序列数据的工具,它遵循sklearn库建模的应用程序接口,使用了拟合模型"fit"和预测"predict"方法。 时间序列数据不同于其他数据,它存在日、周、月、季节、年规律以及假期效应,Prophet能够很好地拟合这些强烈的规律效应,对丢失数据、异常数据和趋势变化具有较强的鲁棒性。 Prophet库的安装相对于其他库的安装比较复杂,具体安装教程请点击[这里](http://blog.csdn.net/anshuai_aw1/article/details/83377735)。 **2.Prophet-Linear模型** 默认情况下,Prophet会使用Linear模型进行预测,线性回归不存在饱和值,即无上限与下限,如下图。 ![Linear模型](https://images.gitee.com/uploads/images/2020/1117/154851_bcaa98f9_7878388.png "屏幕截图.png") **3.Prophet-Logistic模型** 在很多情况下,我们的预测结果可能会存在一个可到达的极限值,比如说市场规模数据不可能小于0,也不可能超过总人数。 这个时候,我们可以使用Logistic模型进行预测,同时指定上限和下限(虚线),使预测更具科学性。 ![Logistic模型](https://images.gitee.com/uploads/images/2020/1117/162702_326c3c28_7878388.png "屏幕截图.png") **4.KNN插值** 缺失值的处理包括删除、常量补充(平均值、众数、中位数)、插值填充(比如取缺失值前后值的均值进行填充)、KNN填充、随机森林填充(与KNN类似) 利用KNN插值算法填充,其实是把目标列当做目标标量,利用非缺失的数据进行KNN算法拟合,最后对目标列缺失进行预测。 对于连续特征一般是加权平均,对于离散特征一般是加权投票。 本项目由于数据量少,因此使用KNN插值算法。 #### 三、项目流程 **1.数据预处理** 1.1 数据存在缺失值 使用KNN算法对缺失值进行补充 1.2 数据存在异常值 各市场规模数据相加不等于总市场规模,利用python识别和修改即可。 **2.描述性统计** 在这里,借助了Arima模型中乘法分解的方式试着分解时间序列数据。 分解公式为: **Value = Trend * Base Level * Seasonality * Error** 在对数据进行分解后,可以发现以下规律: 2.1虽然各个地区总体市场规模不同,但2G\3G\4G\5G数据的发展规律非常相似,呈现先期后落的生命周期。 2.2当3G市场规模初露苗头时,每个地区2G市场规模开始从顶峰下降。 2.3到了2019年,各地区4G市场规模均未呈现上升趋势,可能已达顶峰。 2.4当4G市场规模初露苗头时,每个地方3G市场规模开始从顶峰下降。 **以上规律对后面使用Prophet模型非常有用** **3.时间序列预测模型的若干尝试** **3.1长短期记忆网络(LSTM)** 采用长短期记忆网络进行预测时,以输入为前4个时间步,输出为下一个时间步的单步预测。 由于总的数据量过小,而训练的迭代次数过多,导致模型出现了 **过拟合现象** 。 ![LSTM](https://images.gitee.com/uploads/images/2020/1117/174611_44dc8f48_7878388.png "屏幕截图.png") **3.2支持向量回归(SVR)** 采用支持向量回归进行预测时,切割数据集为训练集和验证集,用SVR进行训练后验证。 由于训练集较小导致模型出现过拟合,造成训练集误差较小且稳定,而验证集误差很大的结果。 ![SVR](https://images.gitee.com/uploads/images/2020/1117/174941_5922dafe_7878388.png "屏幕截图.png") **3.3ARIMA模型** 采用ARIMA模型对每条数据进行预测,可以看出模型只对后期市场规模稳定收敛于0的数据有效。 对于尚处衰退期的数据,预测数据会一直下降到0以下,这是不符合现实的。 ![ARIMA](https://images.gitee.com/uploads/images/2020/1117/175416_b32d3b28_7878388.png "屏幕截图.png") **4.Prophet模型构造** 阅读Prophet文档以及数据特征,可以看出Prophet模型适用于具有以下特征的数据预测。 **4.1时间序列数据** 无线网络市场规模数据只有日期和市场规模两项,无其余特征。 **4.2具有明显的趋势性** 无线网络数据具有清洗的进入、成长、成熟、衰退期。 **4.3非线性增长** 2G、3G无线网络数据存在饱和最小值。 **4.4异常值、离群点** 原数据可能存在一些未处理的异常值/离群点。 **5.Prophet模型输入与输出** **5.1输入** **5.1.1时间戳与相应值** 输入各地区各型号无线产品市场规模及时间戳,格式如下,ds表示时间戳,y表示市场规模 ![时间戳与相应值](https://images.gitee.com/uploads/images/2020/1117/180435_72a440ff_7878388.png "屏幕截图.png") **5.1.2趋势模型** 包括线性模型(Linear)和逻辑回归(Logistic)两种模型,并对趋势模型设置边界。 ``` import pandas as pd from fbprophet import Prophet df = pd.read_csv('examples/example_wp_log_R.csv') df['cap'] = 8.5 m = Prophet(growth='logistic') m.fit(df) ``` 预测结果如下图 ![预测结果](https://images.gitee.com/uploads/images/2020/1117/180910_89fc28ce_7878388.png "屏幕截图.png") **5.1.3相关参数** 利用模型自带的交叉验证方式对相关参数进行调整,从而得到最优的模型。 不同类型的网络参数设置不同,不作展示。 **5.2输出** **5.2.1预测值与未来走势** 利用相关函数输出未来的时间序列走势及预测区间。 ![预测值与未来走势](https://images.gitee.com/uploads/images/2020/1117/181840_2ac4fff2_7878388.png "屏幕截图.png") **5.2.2必要的统计指标** 输出预测后的拟合曲线,饱和上下界、变换点、趋势分解等指标。 ![必要的统计指标](https://images.gitee.com/uploads/images/2020/1117/182018_942ba0e0_7878388.png "屏幕截图.png") #### 四、参考资料 1.[时间序列模型Prophet使用详细讲解](https://blog.csdn.net/anshuai_aw1/article/details/83412058) 2.[Facebook Prophet主页](https://github.com/facebook/prophet)