Python 应用分位数损失函数优化指数平滑模型
我已经尝试过在其他地方发帖,但运气不好,所以我也会在这里尝试 我试图建立一个模型,从传统的winters-holt预测模型生成预测间隔。在statmodels中有一个内置函数可以实现这一点,但是有一些缺少的特性使我无法完全依赖它。我正在寻找评论家的眼光,不知道还有什么地方可以发表: 我所做的是使用分位数损失弹球函数来优化模型的参数(水平、趋势和季节性),并根据我在分位数损失函数中输入的不同分位数值生成不同的预测 首先:优化分位数的参数是一种良好的做法吗 第二,所描述的过程是否可行以获得预测区间 现在,在结果数据集中,我观察到分位数为0.05和0.95或最差的预测之间没有差异,甚至有时间序列的结果给出了0.95分位数的较低值 我很困惑,想知道这种方法会有什么错误,因为知道模型可以很好地使用均方误差损失函数找到规则的点序列 这是我的分位数损失函数:Python 应用分位数损失函数优化指数平滑模型,python,pandas,machine-learning,time-series,forecasting,Python,Pandas,Machine Learning,Time Series,Forecasting,我已经尝试过在其他地方发帖,但运气不好,所以我也会在这里尝试 我试图建立一个模型,从传统的winters-holt预测模型生成预测间隔。在statmodels中有一个内置函数可以实现这一点,但是有一些缺少的特性使我无法完全依赖它。我正在寻找评论家的眼光,不知道还有什么地方可以发表: 我所做的是使用分位数损失弹球函数来优化模型的参数(水平、趋势和季节性),并根据我在分位数损失函数中输入的不同分位数值生成不同的预测 首先:优化分位数的参数是一种良好的做法吗 第二,所描述的过程是否可行以获得预测区间
def quantile_loss(q,y_p, y):
a = np.where((y > y_p), q *(y-y_p), (y_p - y)*(1-q))
return a
下面是参数优化的代码:
def HoltWinterLowHightimeseriesCVscore(params,quantile_values, data, loss_function=quantile_loss,slen=12):
"""
Returns error on CV
params - vector of parameters for optimization
series - dataset with timeseries
slen - season length for Holt-Winters model
"""
# errors array
errors = []
values = data
alpha, beta, gamma = params
# set the number of folds for cross-validation
tscv = TimeSeriesSplit(n_splits=3)
# iterating over folds, train model on each, forecast and calculate error
for train, test in tscv.split(values):
model = HoltWintersLowHigh(series=values, slen=slen,
alpha=alpha, beta=beta, gamma=gamma, n_preds=12)
model.triple_exponential_smoothing()
predictions = model.result[-len(test):]
actual = values[test]
error = loss_function(quantile, predictions, actual)
errors.append(error)
return np.mean(np.array(errors))
最后,这里是调用函数进行预测的最后一部分:
forecast = {}
for i in seasonal_profile_df.index:
quantile_values = [0.92]
if seasonal_profile_df['trend'].loc[i] == 'trending' and seasonal_profile_df['seasonality'].loc[i] == 'seasonal' and seasonal_profile_df['demand_level'].loc[i] == 'low' or seasonal_profile_df['variability'].loc[i] == 'high':
index = pd.DatetimeIndex(new_df.index)
series = pd.Series(data=new_df.iloc[:, i], index=index)
print(len(series))
data = series[:-10] #leave some data for testing
x = [0, 0, 0]
#for i in quantile:
for j in quantile_values:
quantile_values = j
# Minimizing the loss function
opt = minimize(HoltWinterLowHightimeseriesCVscore, x0=x,
args=( quantile_values,data, quantile_loss,),
method="TNC", bounds=((0, 1), (0, 1), (0, 1))
)
alpha_final, beta_final, gamma_final = opt.x
print(opt.x)
##and then predict according to the quantile specified #####
model = HoltWintersLowHigh(series, slen=12,
alpha=alpha_final,
beta=beta_final,
gamma=gamma_final,
n_preds=12, scaling_factor=1.96)
model.triple_exponential_smoothing()
plotHoltWintersLowHigh(series, quantile_values)
result= {"Id": seasonal_profile_df['Id'].loc[i]}
result['results'] = model.result[-12:]
我真的希望得到一个新鲜的或更有经验的眼睛在这方面。我觉得这个过程是有意义的,但在python中找不到一个可靠的例子,我希望有人能告诉我这个方法是否有意义,或者代码是否有问题。任何反馈都将不胜感激 非常有趣。看看关于TFT和DeepAR以及其他使用分位数成本函数的论文。似乎正在成为深度学习方面的标准,因此可能会有有用的参考和验证?谢谢你的链接,它有点让我大吃一惊!