def _batch_prediction_test_helper_function(self, targets): epsilon = 1e-4 model = TCNModel( input_chunk_length=50, output_chunk_length=10, n_epochs=10, random_state=0, ) model.fit(series=targets[0], past_covariates=self.covariates_past) preds_default = model.predict( n=160, series=targets, past_covariates=[self.covariates] * len(targets), batch_size=None, ) # make batch size large enough to test stacking samples for batch_size in range(1, 4 * len(targets)): preds = model.predict( n=160, series=targets, past_covariates=[self.covariates] * len(targets), batch_size=batch_size, ) for i in range(len(targets)): self.assertLess( sum(sum((preds[i] - preds_default[i]).values())), epsilon)
def test_call_predict_global_models_multivariate_input_no_covariates(self): naive_ensemble = NaiveEnsembleModel([ RNNModel(12, n_epochs=1), TCNModel(10, 2, n_epochs=1), NBEATSModel(10, 2, n_epochs=1), ]) naive_ensemble.fit(self.seq1) naive_ensemble.predict(n=5, series=self.seq1)
def test_future_covariates(self): # models with future covariates should produce better predictions over a long forecasting horizon # than a model trained with no covariates model = TCNModel( input_chunk_length=50, output_chunk_length=5, n_epochs=20, random_state=0, ) model.fit(series=self.target_past) long_pred_no_cov = model.predict(n=160) model = TCNModel( input_chunk_length=50, output_chunk_length=5, n_epochs=20, random_state=0, ) model.fit(series=self.target_past, past_covariates=self.covariates_past) long_pred_with_cov = model.predict(n=160, past_covariates=self.covariates) self.assertTrue( mape(self.target_future, long_pred_no_cov) > mape( self.target_future, long_pred_with_cov), "Models with future covariates should produce better predictions.", ) # block models can predict up to self.output_chunk_length points beyond the last future covariate... model.predict(n=165, past_covariates=self.covariates) # ... not more with self.assertRaises(ValueError): model.predict(n=166, series=self.ts_pass_train) # recurrent models can only predict data points for time steps where future covariates are available model = RNNModel(12, n_epochs=1) model.fit(series=self.target_past, future_covariates=self.covariates_past) model.predict(n=160, future_covariates=self.covariates) with self.assertRaises(ValueError): model.predict(n=161, future_covariates=self.covariates)
def test_call_predict_global_models_univariate_input_no_covariates(self): naive_ensemble = NaiveEnsembleModel([ RNNModel(12, n_epochs=1), TCNModel(10, 2, n_epochs=1), NBEATSModel(10, 2, n_epochs=1), ]) with self.assertRaises(Exception): naive_ensemble.predict(5) naive_ensemble.fit(self.series1) naive_ensemble.predict(5)
def test_call_predict_global_models_multivariate_input_with_covariates( self): naive_ensemble = NaiveEnsembleModel([ RNNModel(12, n_epochs=1), TCNModel(10, 2, n_epochs=1), NBEATSModel(10, 2, n_epochs=1), ]) naive_ensemble.fit(self.seq1, self.cov1) predict_series = [s[:12] for s in self.seq1] predict_covariates = [c[:14] for c in self.cov1] naive_ensemble.predict(n=2, series=predict_series, past_covariates=predict_covariates)
def test_backtest_forecasting(self): linear_series = lt(length=50) linear_series_int = TimeSeries.from_values(linear_series.values()) linear_series_multi = linear_series.stack(linear_series) # univariate model + univariate series score = NaiveDrift().backtest( linear_series, start=pd.Timestamp("20000201"), forecast_horizon=3, metric=r2_score, ) self.assertEqual(score, 1.0) # very large train length should not affect the backtest score = NaiveDrift().backtest( linear_series, train_length=10000, start=pd.Timestamp("20000201"), forecast_horizon=3, metric=r2_score, ) self.assertEqual(score, 1.0) # window of size 2 is too small for naive drift with self.assertRaises(ValueError): NaiveDrift().backtest( linear_series, train_length=2, start=pd.Timestamp("20000201"), forecast_horizon=3, metric=r2_score, ) # test that it also works for time series that are not Datetime-indexed score = NaiveDrift().backtest( linear_series_int, start=0.7, forecast_horizon=3, metric=r2_score ) self.assertEqual(score, 1.0) with self.assertRaises(ValueError): NaiveDrift().backtest( linear_series, start=pd.Timestamp("20000217"), forecast_horizon=3, overlap_end=False, ) NaiveDrift().backtest( linear_series, start=pd.Timestamp("20000216"), forecast_horizon=3 ) NaiveDrift().backtest( linear_series, start=pd.Timestamp("20000217"), forecast_horizon=3, overlap_end=True, ) # Using forecast_horizon default value NaiveDrift().backtest(linear_series, start=pd.Timestamp("20000216")) NaiveDrift().backtest( linear_series, start=pd.Timestamp("20000217"), overlap_end=True ) # Using an int or float value for start NaiveDrift().backtest(linear_series, start=30) NaiveDrift().backtest(linear_series, start=0.7, overlap_end=True) # Set custom train window length NaiveDrift().backtest(linear_series, train_length=10, start=30) # Using invalid start and/or forecast_horizon values with self.assertRaises(ValueError): NaiveDrift().backtest(linear_series, start=0.7, forecast_horizon=-1) with self.assertRaises(ValueError): NaiveDrift().backtest(linear_series, start=-0.7, forecast_horizon=1) with self.assertRaises(ValueError): NaiveDrift().backtest(linear_series, start=100) with self.assertRaises(ValueError): NaiveDrift().backtest(linear_series, start=1.2) with self.assertRaises(TypeError): NaiveDrift().backtest(linear_series, start="wrong type") with self.assertRaises(ValueError): NaiveDrift().backtest(linear_series, train_length=0, start=0.5) with self.assertRaises(TypeError): NaiveDrift().backtest(linear_series, train_length=1.2, start=0.5) with self.assertRaises(TypeError): NaiveDrift().backtest(linear_series, train_length="wrong type", start=0.5) with self.assertRaises(ValueError): NaiveDrift().backtest( linear_series, start=49, forecast_horizon=2, overlap_end=False ) # univariate model + multivariate series with self.assertRaises(AssertionError): NaiveDrift().backtest( linear_series_multi, start=pd.Timestamp("20000201"), forecast_horizon=3 ) # multivariate model + univariate series if TORCH_AVAILABLE: tcn_model = TCNModel( input_chunk_length=12, output_chunk_length=1, batch_size=1, n_epochs=1 ) pred = tcn_model.historical_forecasts( linear_series, start=pd.Timestamp("20000125"), forecast_horizon=3, verbose=False, last_points_only=True, ) self.assertEqual(pred.width, 1) self.assertEqual(pred.end_time(), linear_series.end_time()) # multivariate model + multivariate series with self.assertRaises(ValueError): tcn_model.backtest( linear_series_multi, start=pd.Timestamp("20000125"), forecast_horizon=3, verbose=False, ) tcn_model = TCNModel( input_chunk_length=12, output_chunk_length=3, batch_size=1, n_epochs=1 ) pred = tcn_model.historical_forecasts( linear_series_multi, start=pd.Timestamp("20000125"), forecast_horizon=3, verbose=False, last_points_only=True, ) self.assertEqual(pred.width, 2) self.assertEqual(pred.end_time(), linear_series.end_time())
exogenous_input = 'Median' if style == 'all': n_windows = 5 elif style == '20_percent': n_windows = 1 else: raise ValueError('The style has to be "all" or "20_percent".') # Note: Only use filler for now, remove after resampling script is fixed filler = MissingValuesFiller() # Create model model = TCNModel( input_chunk_length=input_length, output_chunk_length=output_length, batch_size=input_length ) # batch_size must be <= input_length (bug fixed in Darts version 0.9.0) for parameter in parameters: print( f'\n##############################\nCurrent Parameter: {parameter.upper()}\n' f'##############################\n', file=sys.stderr) start_time = time.time() # Create sub folder for each parameter if not os.path.isdir( f'./data/{approach}/{n_chunks}_chunks/{style}/{parameter}'): os.mkdir(f'./data/{approach}/{n_chunks}_chunks/{style}/{parameter}')
def test_input_models_global_models(self): NaiveEnsembleModel([RNNModel(12), TCNModel(10, 2), NBEATSModel(10, 2)])