In this example, the MovieLens dataset is used. The column separator was changed to tab.

The file is ordered by timestamp (this is not necessary but allows implementations that take advantage of temporal effects, e. g., concept drift). The file rfr.csv has a sample of the the users in Both files are attached.

#DEFINE rating_data_input_file ${PROJECTPATH}/ml-100k/
#DEFINE rfr_data_input_file ${PROJECTPATH}/ml-100k/rfr.csv


// A data stream of ratings.
rating_data := ACCESS({source='rating_data', wrapper='GenericPull', transport='File', protocol='CSV', datahandler='Tuple', 
		['Delimiter', '\t'],
		['filename', '${rating_data_input_file}']],
			['user','Integer'], // some learners need Long instead of Integer
			['item','Integer'], // some learners need Long instead of Integer
// A data stream of request for recommendations of users.
rfr := TIMEWINDOW({size = 1}, ACCESS({source='rfr', wrapper='GenericPull', transport='File', protocol='CSV', datahandler='Tuple', 
		['Delimiter', '\t'], 
		['filename', '${rfr_data_input_file}']], 
			['user','Integer'], // some learners need Long instead of Integer

#QNAME RecommenderSystem
/// split learning and test data
splitted_rating_data = EXTRACT_TEST_DATA({strategy = 'ITTT'}, rating_data)

/// continuous learning
windowed_learning_data = TIMEWINDOW({size = [30, 'days']}, 0:splitted_rating_data)
models = TRAIN_RECSYS_MODEL({learner = 'BRISMF.MOA'}, windowed_learning_data)

/// recommending
recomm_candidates = RECOMMENDATION_CANDIDATES(JOIN(rfr, 1:models))
predicted_candidates = PREDICT_RATING(JOIN(models, recomm_candidates))
recommendations = RECOMMEND({top_n = 8, min_rating = 3.5}, predicted_candidates)

/// evaluation
predicted_test_data = PREDICT_RATING(JOIN(models, 1:splitted_rating_data))
model_errors = TEST_PREDICTION({aggregation_window_size = [24, 'hours']}, predicted_test_data)
  • No labels