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
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))