http://neuralprophet.com/hyperparameter-selection/
NeuralProphet有一些超参数需要用户指定。如果没有指定,将使用这些超参数的默认值。如下。
Parameter | Default Value |
---|---|
growth |
linear |
changepoints |
None |
n_changepoints |
5 |
changepoints_range |
0.8 |
trend_reg |
0 |
trend_reg_threshold |
False |
yearly_seasonality |
auto |
weekly_seasonality |
auto |
daily_seasonality |
auto |
seasonality_mode |
additive |
seasonality_reg |
None |
n_forecasts |
1 |
n_lags |
0 |
num_hidden_layers |
0 |
d_hidden |
None |
ar_sparsity |
None |
learning_rate |
None |
epochs |
None |
batch_size |
None |
loss_func |
Huber |
train_speed |
None |
normalize_y |
auto |
impute_missing |
True |
n_forecasts
是预测范围的大小。默认值为1,表示模型预测未来一步。
n_lags
定义AR-Net是否启用(如果n_lags
>0)。如果可能的话,通常建议n_lags'的值大于``n_forecasts
。FFNNs最好至少遇到过去的n_forecast
长度,以便预测未来的n_forecast
。因此,n_lags
决定应该考虑到过去多远的自动递减依赖性。这可以是根据专业知识或经验分析选择的一个值。
NeuralProphet采用随机梯度下降法进行拟合--更准确地说,是采用AdamW优化器和One-Cycle策略。如果没有指定参数learning_rate
,则进行学习率范围测试以确定最佳学习率。epochs
和loss_func
是另外两个直接影响模型训练过程的参数。如果没有定义,这两个参数会根据数据集大小自动设置。它们的设置方式是将训练步骤总数控制在1000到4000左右。
如果看起来模型对训练数据过度拟合(实时损失图在此很有用),可以减少 epochs
和 learning_rate
,并有可能增加 batch_size
。如果是低拟合,可以增加epochs
和learning_rate
的数量,并有可能减少batch_size
。
默认的损失函数是 "Huber "损失,该函数被认为对离群值具有鲁棒性。但是,您可以自由选择标准的 "MSE "或任何其他PyTorch torch.nn.modules.loss
损失函数。
num_hidden_layers
定义了整个模型中使用的FFNN的隐藏层数。这包括AR-Net和滞后回归项的FNNN。默认值为0,意味着FFNNs将只有一个大小为n_forecasts
的最后一层。增加更多的层数会导致复杂度增加,也会因此增加计算时间。然而,增加的隐藏层数可以帮助建立更复杂的关系,特别是对滞后回归者有用。为了在计算复杂性和提高精度之间进行权衡,建议将 num_hidden_layers
设置在1-2之间。然而,在大多数情况下,完全没有隐藏层可以获得足够好的性能。
d_hidden
是隐藏层的单位数。只有在指定了 "num_hidden_layers "的情况下才会考虑,否则忽略。如果没有指定,d_hidden
的默认值是(n_lags
+ n_forecasts
)。如果手动调整,建议的做法是在n_lags
和n_forecasts
之间为d_hidden
设置一个值。还需要注意的是,在当前的实现中,NeuralProphet为所有的隐藏层设置了相同的d_hidden
。
normalize_y
是关于在建模前对时间序列进行缩放。默认情况下,NeuralProphet会对时间序列进行(soft)最小-最大的归一化。如果序列值波动很大,归一化可以帮助模型训练过程。然而,如果序列没有这样的缩放,用户可以关闭这个功能或选择其他归一化。
impute_missing
是关于在一个给定的序列中推算缺失值。与Prophet类似,NeuralProphet也可以在没有AR-Net的回归模式下处理缺失值。然而,当需要捕获自相关时,有必要对缺失值进行估算,因为这时建模就变成了一个有序的问题。在大多数情况下,让这个参数处于默认状态可以完美地完成工作。
你可以在example_notebooks/trend_peyton_manning.ipynb
找到一个实践的例子。
如果趋势的灵活性主要由n_changepoints
控制,它设定了趋势率可能变化的点数。此外,可以通过将trend_reg
设置为大于零的值来规范趋势率的变化。
这是一个有用的功能,可以用来自动检测相关的变化点。
changepoints_range
控制用于拟合趋势的训练数据的范围。默认值为0.8,意味着在最后20%的训练数据中不设置变化点。
如果提供了一个changepoints
列表,n_changepoints
和 changepoints_range
将被忽略。这个列表用于设置允许趋势率变化的日期。
n_changepoints
是沿系列选择的趋势变化点的数量。默认值为5。
yearly_seasonality
、weekly_seasonality
和 daily_seasonality
是关于要模拟的季节成分。例如,如果你使用温度数据,你可能可以选择每天和每年。例如,使用使用地铁的乘客数量更可能有一个每周的季节性。将这些季节性设置在默认的auto
模式下,可以让NeuralProphet根据可用数据的多少来决定包括哪些季节性。例如,如果可用数据少于两年,则不会考虑年季节性。同样,如果可用数据少于两周,每周的季节性将不被考虑等等。然而,如果用户确定系列不包括年、周或日季节性,因此模型不应该被这些成分扭曲,他们可以通过设置相应的成分为False
来明确关闭它们。除此之外,参数 yearly_seasonality
、weekly_seasonality
和 daily_seasonality
也可以设置为各自季节性的傅里叶项数。默认值为年6,周4和日6。用户可以将其设置为任何他们想要的数字。如果每年的项数为6,那么实际上每年季节性的傅里叶项总数为12(6*2),以适应正弦和余弦项。增加Fourier项的数量可以使模型能够捕捉相当复杂的季节性模式。然而,与 num_hidden_layers
类似,这也会增加模型的复杂性。用户可以通过观察最终的分量图来了解最佳的Fourier项数。默认的seasonality_mode
是加法。这意味着在季节性方面,序列中没有异方差。然而,如果序列包含明显的方差,季节性波动与趋势成正比,则可以将seasonality_mode
设置为乘法。
NeuralProphet还包含一些正则化参数,用于控制模型系数,并将稀疏性引入模型。这也有助于避免模型对训练数据的过度拟合。对于seasonality_reg
,在0.1-1范围内的小值允许拟合大的季节性波动,而在1-100范围内的大值则会对傅里叶系数施加较重的惩罚,从而抑制季节性。对于 "ar_sparsity",预计值在0-1的范围内,0会引起完全的稀疏性,而1则完全不需要正则化。ar_sparsity
和n_lags
可以用于数据探索和特征选择。由于AR-Net的可扩展性,你可以使用更多的滞后数,并利用稀疏性来识别过去时间步长对预测精度的重要影响。对于 future_regressor_regularization
、event_regularization
和 country_holiday_regularization,其值可以设置在0-1之间,与 ar_sparsity
的概念相同。可以根据各个回归因子和事件需要更多的抑制,设置不同的正则化参数。