Python 应用分位数损失函数优化指数平滑模型

Python 应用分位数损失函数优化指数平滑模型,python,pandas,machine-learning,time-series,forecasting,Python,Pandas,Machine Learning,Time Series,Forecasting,我已经尝试过在其他地方发帖,但运气不好,所以我也会在这里尝试 我试图建立一个模型,从传统的winters-holt预测模型生成预测间隔。在statmodels中有一个内置函数可以实现这一点,但是有一些缺少的特性使我无法完全依赖它。我正在寻找评论家的眼光,不知道还有什么地方可以发表: 我所做的是使用分位数损失弹球函数来优化模型的参数(水平、趋势和季节性),并根据我在分位数损失函数中输入的不同分位数值生成不同的预测 首先:优化分位数的参数是一种良好的做法吗 第二,所描述的过程是否可行以获得预测区间

我已经尝试过在其他地方发帖,但运气不好,所以我也会在这里尝试

我试图建立一个模型,从传统的winters-holt预测模型生成预测间隔。在statmodels中有一个内置函数可以实现这一点,但是有一些缺少的特性使我无法完全依赖它。我正在寻找评论家的眼光,不知道还有什么地方可以发表:

我所做的是使用分位数损失弹球函数来优化模型的参数(水平、趋势和季节性),并根据我在分位数损失函数中输入的不同分位数值生成不同的预测

首先:优化分位数的参数是一种良好的做法吗

第二,所描述的过程是否可行以获得预测区间

现在,在结果数据集中,我观察到分位数为0.05和0.95或最差的预测之间没有差异,甚至有时间序列的结果给出了0.95分位数的较低值

我很困惑,想知道这种方法会有什么错误,因为知道模型可以很好地使用均方误差损失函数找到规则的点序列

这是我的分位数损失函数:

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以及其他使用分位数成本函数的论文。似乎正在成为深度学习方面的标准,因此可能会有有用的参考和验证?谢谢你的链接,它有点让我大吃一惊!