Exemple #1
0
def createHoltWintersModel(series, nextPredictHours=1, threshold=2, slen=1):
    y = series.y
    x = [0, 0, 0]
    # Minimizing the loss function
    ret = None
    alpha_final, beta_final, gamma_final = 0.1, 0.002, 0.06
    try:
        ret = minimize(tsCrossValidationScore,
                       x0=x,
                       args=(y, mean_squared_log_error),
                       method="TNC",
                       bounds=((0, 1), (0, 1), (0, 1)))

        alpha_final, beta_final, gamma_final = ret.x
    except Exception as e:
        logging.error("Data is not seasonality model", e)

    model = HoltWinters(y,
                        slen=slen,
                        alpha=alpha_final,
                        beta=beta_final,
                        gamma=gamma_final,
                        n_preds=nextPredictHours,
                        scaling_factor=threshold)

    model.triple_exponential_smoothing()

    return model
Exemple #2
0
def tsCrossValidationScore(params, series,loss_function=mean_squared_error, nsplits=3, slen=1):
    """

    #Parameters:
        
        params : vector of parameters for optimization (three parameters: 
                 alpha, beta, gamma for example
        series : dataset with timeseries
        sle:
        
    Returns:
        error on CrossValidation  
    """
    # errors array
    errors = []
    
    values = series.values
    alpha, beta, gamma = params
    
    # set the number of folds for cross-validation
    tscv = TimeSeriesSplit(n_splits=nsplits) 
    
    # iterating over folds, train model on each, forecast and calculate error
    for train, test in tscv.split(values):

        model = HoltWinters(series=values[train], slen=slen, 
                            alpha=alpha, beta=beta, gamma=gamma, n_preds=len(test))
        model.triple_exponential_smoothing()
        
        predictions = model.result[-len(test):]
        actual = values[test]
        error = loss_function(predictions, actual)
        errors.append(error)
        
    return np.mean(np.array(errors))