天天看点

【时序预测】4 机器学习算法介绍

作者:轮回路上打碟的小年轻

1 概述

机器学习和特征工程可以帮助提高时序预测的精度和效率。机器学习算法可以自动地学习时间序列数据中的模式和趋势,对于复杂的非线性模式,机器学习模型有很好的表达能力,常见的机器学习时序预测算法包括线性回归(LR)、支持向量机(SVM)、随机森林(RF)、XGBoost和LightGBM等。特征工程可以从原始数据中提取出更加有用的特征,用于训练机器学习模型,常见的特征工程方法包括差分、滑动窗口、指数加权平均等。综合使用机器学习和特征工程可以在时序预测中取得更好的效果,并且可以适用于多种时序预测场景。

【时序预测】4 机器学习算法介绍

2 算法展示

2.1 Prophet

Prophet是一种开源的时间序列预测框架,它是由Facebook所开发,可以用于预测具有季节性和非线性趋势的时间序列数据。Prophet的设计目标是使时间序列的预测变得更加容易,同时不需要用户了解复杂的统计学理论或时间序列建模技术。

Prophet的核心思想是将时间序列分解为三个部分:趋势、季节性和假期效应。然后,将每个部分建模为不同的函数形式,并使用拟合和优化技术来估计模型参数。最后,将这三个部分合并到一起,形成最终的时间序列预测模型。

  • Prophet的特点如下:
  • 灵活性:Prophet可以自动处理复杂的季节性和节假日效应,同时还可以对非线性趋势进行建模。用户只需要提供原始数据和一些相关的信息,就可以轻松地进行预测。
  • 可解释性:Prophet提供了丰富的可视化工具,可以帮助用户理解模型的预测结果和影响因素。
  • 鲁棒性:Prophet具有很好的鲁棒性,可以自动处理缺失值和异常值,并且可以处理大规模的时间序列数据。
  • 易用性:Prophet可以很容易地与Python等编程语言集成,同时还提供了许多实用的API和示例,使用户可以快速上手。
model = Prophet(
    add_seasonalities={'name': '时间', 'seasonal_periods': 90, 'fourier_order': 15, 'mode': 'multiplicative'},
    country_holidays='CN'
)
for feature in ['CPU利用率', '内存利用率', 'License利用率']:
    model.fit(train[f'{feature}'])
    backtest = model.historical_forecasts(
        series=ts[f'{feature}'],
        start=0.75,
        forecast_horizon=10,
        # retrain=False,
        verbose=True,
    )
    ts[f'{feature}'].plot(label="actual")
    backtest.plot(label="backtest (D=10)")

plt.title(label='Prophet')
plt.legend()
plt.show()           
【时序预测】4 机器学习算法介绍

2.2 LR

线性回归是一种用于拟合数据并预测未来趋势的常见统计学方法。在时序预测中,线性回归可以使用历史数据来建立一个线性模型,从而预测未来的趋势。它通过最小化残差平方和来优化模型参数,并且能够处理少量特征和样本数据。然而,线性回归在面对非线性关系和异常值时可能表现不佳,而且其预测精度也比较有限。尽管如此,基于线性回归的方法仍然被广泛应用于各种领域的时序预测问题中。

model = LinearRegressionModel(lags=15, random_state=42, output_chunk_length=13)
model.fit(train)
backtest = model.historical_forecasts(
    series=ts,
    start=0.75,
    forecast_horizon=10,
    # retrain=False,
    verbose=True,
)
ts.plot(label="actual")
backtest.plot(label="backtest (D=10)")

plt.title(label='LR')
plt.legend()
plt.show()           
【时序预测】4 机器学习算法介绍

2.3 SVM

支持向量机(SVM)是一种常见的非线性分类和回归方法。在时序预测中,SVM可以使用历史数据来建立一个非线性模型,从而预测未来的趋势。它通过构建超平面来区分正负样本,并且能够处理少量特征和样本数据。与其他机器学习算法相比,SVM具有较高的准确性和泛化能力,适用于各种复杂数据集的预测问题。但是,SVM训练时间较长,需要调整一些参数来优化模型性能。

2.4 RF

随机森林(RF)是一种基于决策树的集成学习算法,可以用于时序预测问题。它通过使用历史数据来建立多个决策树模型,并通过取平均值或投票来合并各模型的预测结果,从而提高预测精度和泛化性能。随机森林能够处理大量特征和样本数据,并且具有较好的鲁棒性和可解释性。此外,它还支持多种损失函数和评估指标,可以根据具体需求进行选择。

model = RandomForest(lags=15, random_state=42, output_chunk_length=13)
model.fit(train)
backtest = model.historical_forecasts(
    series=ts,
    start=0.75,
    forecast_horizon=10,
    # retrain=False,
    verbose=True,
)
ts.plot(label="actual")
backtest.plot(label="backtest (D=10)")

plt.title(label='RF')
plt.legend()
plt.show()           
【时序预测】4 机器学习算法介绍

2.5 CatBoost

CatBoost是一种基于梯度提升树的机器学习框架,特别适合于处理分类和回归问题。对于时序预测问题,CatBoost可以利用其自然地处理时间序列数据的能力进行建模。它支持各种特征处理技术和模型参数调优方法,以提高预测性能。CatBoost还具有处理缺失值和异常值的能力,以及进行交叉验证和模型解释的工具。

model = CatBoostModel(lags=30, random_state=42)
model.fit(train)
backtest = model.historical_forecasts(
    series=ts,
    start=0.75,
    forecast_horizon=10,
    # retrain=False,
    verbose=True,
)
ts.plot(label="actual")
backtest.plot(label="backtest (D=10)")

plt.title(label='CatBoost')
plt.legend()
plt.show()           
【时序预测】4 机器学习算法介绍

2.6 XGBoost

XGBoost是一种基于决策树的机器学习算法,具有高效性和准确性。在时序预测中,XGBoost可以通过使用历史数据来预测未来的趋势,并且能够自动调整模型参数以适应不同的数据集,从而提高预测的准确性。它还支持多种损失函数和评估指标,如均方根误差和平均绝对误差等。此外,XGBoost还具有可扩展性和灵活性,能够处理大量特征和样本数据。

model = XGBModel(lags=15, random_state=42)
model.fit(train)
backtest = model.historical_forecasts(
    series=ts,
    start=0.75,
    forecast_horizon=10,
    # retrain=False,
    verbose=True,
)
ts.plot(label="actual")
backtest.plot(label="backtest (D=10)")

plt.title(label='XGBoost')
plt.legend()
plt.show()           
【时序预测】4 机器学习算法介绍

2.7 LightGBM

LightGBM是一种基于决策树的机器学习算法,能够在时序预测中有效地处理大量的特征和样本数据,它使用了一些优化技术,如GOSS和EFB,来加快训练速度和提高准确性。在时序预测中,LightGBM可以通过使用历史数据来预测未来的趋势,并且能够自动调整模型参数以适应不同的数据集,从而提高预测的准确性。此外,LightGBM还支持多种损失函数和评估指标,可以根据具体需求进行选择。

model = LightGBMModel(lags=15, random_state=42)
model.fit(train)
backtest = model.historical_forecasts(
    series=ts,
    start=0.75,
    forecast_horizon=10,
    # retrain=False,
    verbose=True,
)
ts.plot(label="actual")
backtest.plot(label="backtest (D=10)")

plt.title(label='LightGBM')
plt.legend()
plt.show()           
【时序预测】4 机器学习算法介绍

继续阅读