Source code for alpenglow.experiments.BatchFactorExperiment

import alpenglow.Getter as rs
import alpenglow as prs


[docs]class BatchFactorExperiment(prs.OnlineExperiment): """BatchFactorExperiment(dimension=10,begin_min=-0.01,begin_max=0.01,learning_rate=0.05,regularization_rate=0.0,negative_rate=0.0,number_of_iterations=3,period_length=86400,timeframe_length=0,clear_model=False) Batch version of :py:class:`alpenglow.experiments.FactorExperiment.FactorExperiment`, meaning it retrains its model periodically nd evaluates the latest model between two training points in an online fashion. Parameters ---------- dimension : int The latent factor dimension of the factormodel. begin_min : double The factors are initialized randomly, sampling each element uniformly from the interval (begin_min, begin_max). begin_max : double See begin_min. learning_rate : double The learning rate used in the stochastic gradient descent updates. regularization_rate : double The coefficient for the L2 regularization term. negative_rate : int The number of negative samples generated after each update. Useful for implicit recommendation. number_of_iterations : int The number of iterations over the data in model retrain. period_length : int The amount of time between model retrains (seconds). timeframe_length : int The size of historic time interval to iterate over at every model retrain. Leave at the default 0 to retrain on everything. clear_model: bool Whether to clear the model between retrains. """ def _config(self, top_k, seed): model = rs.FactorModel(**self.parameter_defaults( begin_min=-0.01, begin_max=0.01, dimension=10, initialize_all=False, )) updater = rs.FactorModelGradientUpdater(**self.parameter_defaults( learning_rate=0.05, regularization_rate=0.0 )) updater.set_model(model) point_wise = rs.ObjectiveMSE() gradient_computer = rs.GradientComputerPointWise() gradient_computer.set_objective(point_wise) gradient_computer.set_model(model) gradient_computer.add_gradient_updater(updater) negative_sample_generator = rs.UniformNegativeSampleGenerator(**self.parameter_defaults( negative_rate=0, initialize_all=False, seed=67439852, filter_repeats=False, )) negative_sample_generator.add_updater(gradient_computer) offline_learner = rs.OfflineIteratingOnlineLearnerWrapper(**self.parameter_defaults( seed=254938879, number_of_iterations=3, shuffle=True, )) offline_learner.add_iterate_updater(negative_sample_generator) online_learner = rs.PeriodicOfflineLearnerWrapper(**self.parameter_defaults( write_model=False, read_model=False, clear_model=False, learn=True, base_out_file_name="", base_in_file_name="", )) online_learner.set_model(model) online_learner.add_offline_learner(offline_learner) data_generator_parameters = self.parameter_defaults( timeframe_length=0, ) if(data_generator_parameters['timeframe_length']==0): data_generator = rs.CompletePastDataGenerator() else: data_generator = rs.TimeframeDataGenerator(**data_generator_parameters) online_learner.set_data_generator(data_generator) period_computer = rs.PeriodComputer(**self.parameter_defaults( period_length=86400, start_time=-1, period_mode="time", )) online_learner.set_period_computer(period_computer) return (model, online_learner, [])