Source code for autompc.evaluation.holdout_evaluator
# Created by William Edwards (wre2@illinois.edu)
import math, time
from pdb import set_trace
import numpy as np
from .evaluator import ModelEvaluator
from .. import utils
[docs]class HoldoutModelEvaluator(ModelEvaluator):
"""
Evaluate model prediction accuracy according to a holdout set.
"""
[docs] def __init__(self, *args, holdout_prop = 0.1, holdout_set=None, verbose=False, **kwargs):
"""
Parameters
----------
system : System
System for which prediction accuracy is evaluated
trajs : List of Trajectory
Trajectories to be used for evaluation
metric : string or function (model, [Trajectory] -> float)
Metric which evaluates the model against a set of trajectories.
If string, one of "rmse", "rmsmens". See `model_metrics` for
more details.
rng : np.random.Generator
Random number generator used in evaluation
horizon : int
Prediction horizon used in certain metrics. Default is 1.
holdout_prop : float
Proportion of dataset to hold out for evaluation
holdout_set : List of Trajectory
This argument can be passed to explicitly set holdout set, rather
than randomly selecting it. Pass None otherwise.
verbose : bool
Whether to print information during evaluation
"""
super().__init__(*args, **kwargs)
self.verbose = verbose
if holdout_set is None:
holdout_size = round(holdout_prop * len(self.trajs))
holdout_indices = self.rng.choice(np.arange(len(self.trajs)),
holdout_size, replace=False)
self.holdout = [self.trajs[i] for i in sorted(holdout_indices)]
else:
self.holdout = holdout_set
self.training_set = []
for traj in self.trajs:
if traj not in self.holdout:
self.training_set.append(traj)
def __call__(self, model_factory, configuration):
if self.verbose:
print("Evaluating Configuration:")
print(configuration)
print("----")
m = model_factory(configuration, self.training_set)
metric_value = self.metric(m, self.holdout)
return metric_value