Exemplo n.º 1
0
    def instance(self, repeat: int, lookback: int, loss: str,
                 history_size: Dict[str, float], iterations: Dict[str, int],
                 model_type: str):
        dataset = M4Dataset.load(training=True)

        forecasts = []
        for seasonal_pattern in M4Meta.seasonal_patterns:
            history_size_in_horizons = history_size[seasonal_pattern]
            horizon = M4Meta.horizons_map[seasonal_pattern]
            input_size = lookback * horizon

            # Training Set
            training_values = group_values(dataset.values, dataset.groups,
                                           seasonal_pattern)

            training_set = TimeseriesSampler(
                timeseries=training_values,
                insample_size=input_size,
                outsample_size=horizon,
                window_sampling_limit=int(history_size_in_horizons * horizon))

            if model_type == 'interpretable':
                model = interpretable(input_size=input_size,
                                      output_size=horizon)
            elif model_type == 'generic':
                model = generic(input_size=input_size, output_size=horizon)
            else:
                raise Exception(f'Unknown model type {model_type}')

            # Train model
            snapshot_manager = SnapshotManager(
                snapshot_dir=os.path.join(self.root, 'snapshots',
                                          seasonal_pattern),
                total_iterations=iterations[seasonal_pattern])
            model = trainer(
                snapshot_manager=snapshot_manager,
                model=model,
                training_set=iter(training_set),
                timeseries_frequency=M4Meta.frequency_map[seasonal_pattern],
                loss_name=loss,
                iterations=iterations[seasonal_pattern])

            # Build forecasts
            x, x_mask = map(to_tensor, training_set.last_insample_window())
            model.eval()
            with t.no_grad():
                forecasts.extend(model(x, x_mask).cpu().detach().numpy())

        forecasts_df = pd.DataFrame(
            forecasts,
            columns=[f'V{i + 1}' for i in range(np.max(M4Meta.horizons))])
        forecasts_df.index = dataset.ids
        forecasts_df.index.name = 'id'
        forecasts_df.to_csv(os.path.join(self.root, 'forecast.csv'))
Exemplo n.º 2
0
    def instance(self, repeat: int, lookback: int, loss: str,
                 history_size: int, iterations: Dict[str,
                                                     int], model_type: str):
        dataset = TrafficDataset.load()

        for split_name, split_date in splits.items():
            horizon = TrafficMeta.horizon
            input_size = lookback * horizon

            # Training Set
            training_set, test_set = dataset.split_by_date(split_date)
            training_values = training_set.values
            test_values = test_set.values

            training_set = TimeseriesSampler(
                timeseries=training_values,
                insample_size=input_size,
                outsample_size=horizon,
                window_sampling_limit=history_size * horizon)

            if model_type == 'interpretable':
                model = interpretable(input_size=input_size,
                                      output_size=horizon)
            elif model_type == 'generic':
                model = generic(input_size=input_size, output_size=horizon)
            else:
                raise Exception(f'Unknown model type {model_type}')

            # Train model
            snapshot_manager = SnapshotManager(
                snapshot_dir=os.path.join(self.root, 'snapshots', split_name),
                total_iterations=iterations[split_name])
            model = trainer(snapshot_manager=snapshot_manager,
                            model=model,
                            training_set=iter(training_set),
                            timeseries_frequency=TrafficMeta.frequency,
                            loss_name=loss,
                            iterations=iterations[split_name])

            # Build forecasts
            forecasts = []
            model.eval()
            with t.no_grad():
                for i in range(test_windows):
                    window_input_set = np.concatenate([
                        training_values,
                        test_values[:, :i * TrafficMeta.horizon]
                    ],
                                                      axis=1)
                    input_set = TimeseriesSampler(timeseries=window_input_set,
                                                  insample_size=input_size,
                                                  outsample_size=horizon,
                                                  window_sampling_limit=int(
                                                      history_size * horizon))
                    x, x_mask = map(to_tensor,
                                    input_set.last_insample_window())
                    window_forecast = model(x, x_mask).cpu().detach().numpy()
                    forecasts = window_forecast if len(
                        forecasts) == 0 else np.concatenate(
                            [forecasts, window_forecast], axis=1)

            forecasts_df = pd.DataFrame(forecasts,
                                        columns=[
                                            f'V{i + 1}'
                                            for i in range(test_windows *
                                                           TrafficMeta.horizon)
                                        ])
            forecasts_df.index.name = 'id'
            forecasts_df.to_csv(
                os.path.join(self.root, f'forecast_{split_name}.csv'))