在数据科学领域,预测未来趋势是一项重要任务。时间序列预测算法从简单的移动平均和指数平滑到深度学习方法如循环神经网络和XGBoost不等。混合预测技术结合多种方法也是常用的,以提高准确性。独立变量,如折扣百分比或温度,可以影响预测。算法的选择取决于数据集和手头的业务问题。时间序列分析对于基于历史数据做出明智的决策至关重要。
Holt-Winters是一种时间序列行为模型。预测总是需要一个模型,Holt-Winters是模拟时间序列的三个方面的一种方式:典型值(平均值)、随时间变化的斜率(趋势)和周期性重复模式(季节性)。实际数据,如任何行业的需求数据,通常具有很多季节性和趋势。在这种情况下,预测需求需要模型,这些模型将考虑数据中的趋势和季节性,因为业务决策将基于这个模型的结果。对于这些情况,Holt-Winters方法是众多时间序列预测方法中的一种,可以用于预测。
Holt-Winters指数平滑以其两位贡献者Charles Holt和Peter Winters的名字命名,是最早的时间序列分析技术之一,它在进行预测时考虑了趋势和季节性。这种方法有三个主要方面来进行预测。它有一个平均值,趋势和季节性。这三个方面是三种类型的指数平滑,因此Holt-Winters方法也被称为三重指数平滑。
让详细看看每个方面。
因此,Holt-Winters方法在进行时间序列预测时考虑了平均值、趋势和季节性。
让通过一个例子来看Holt-Winters时间序列分析。有某个网站几天的访客数量,让尝试使用Holt-Winters方法预测接下来3天的访客数量。以下是Python代码。
# 导入所需的库
import pandas as pd
from matplotlib import pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 使用pandas输入访客数据
visitors = pd.read_excel('website_visitors.xlsx', index_col='month', parse_dates=True)
print(visitors.shape)
print(visitors.head()) # 打印数据框
visitors[['no_of_visits']].plot(title='访客数据')
visitors.sort_index(inplace=True) # 根据索引排序数据
# 分解数据框以获得趋势、季节性和噪声
decompose_result = seasonal_decompose(visitors['no_of_visits'], model='multiplicative', period=12)
decompose_result.plot()
plt.show()
# 设置Alpha值,并定义x为时间段
x = 12
alpha = 1 / (2 * x)
# 访客数据集的单指数平滑
visitors['HWES1'] = SimpleExpSmoothing(visitors['no_of_visits']).fit(smoothing_level=alpha, optimized=False, use_brute=True).fittedvalues
visitors[['no_of_visits', 'HWES1']].plot(title='Holt Winters单指数平滑图')
# 访客数据集的双指数平滑(加法和乘法)
visitors['HWES2_ADD'] = ExponentialSmoothing(visitors['no_of_visits'], trend='add').fit().fittedvalues
visitors['HWES2_MUL'] = ExponentialSmoothing(visitors['no_of_visits'], trend='mul').fit().fittedvalues
visitors[['no_of_visits', 'HWES2_ADD', 'HWES2_MUL']].plot(title='Holt Winters图:加法趋势和乘法趋势')
# 分割为训练集和测试集
train_visitors = visitors[:9]
test_visitors = visitors[9:]
# 拟合模型
fitted_model = ExponentialSmoothing(train_visitors['no_of_visits'], trend='mul', seasonal='mul', seasonal_periods=12).fit()
test_predictions = fitted_model.forecast(5)
# 绘制训练、测试和预测数据点
train_visitors['no_of_visits'].plot(legend=True, label='TRAIN')
test_visitors['no_of_visits'].plot(legend=True, label='TEST', figsize=(6, 4))
test_predictions.plot(legend=True, label='PREDICTION')
plt.title('使用Holt Winters指数平滑的训练、测试和预测数据点')