public void BinaryRecommendationCustomSerializationRegressionTest() { // TODO: We need a static class which implements mapping chainings Rand.Restart(12347); var positiveOnlyMapping = new PositiveOnlyDataMapping(); var negativeDataGeneratorMapping = positiveOnlyMapping.WithGeneratedNegativeData(1.0); using (Stream stream = new MemoryStream()) { negativeDataGeneratorMapping.SaveForwardCompatibleAsBinary(stream); stream.Seek(0, SeekOrigin.Begin); using (var reader = new WrappedBinaryReader(new BinaryReader(stream))) { var deserializedMapping = new NegativeDataGeneratorMapping <PositiveOnlyDataset, Tuple <string, string>, string, string, FeatureProvider, Vector>(reader, positiveOnlyMapping); var recommender = MatchboxRecommender.Create(deserializedMapping); recommender.Train(this.positiveOnlyDataset, this.featureProvider); // must not throw foreach (var instance in positiveOnlyMapping.GetInstances(this.positiveOnlyDataset)) { var user = positiveOnlyMapping.GetUser(this.positiveOnlyDataset, instance); var item = positiveOnlyMapping.GetItem(this.positiveOnlyDataset, instance); Assert.Equal(1, recommender.Predict(user, item, this.featureProvider)); } } } }
/// <summary> /// Runs the module. /// </summary> /// <param name="args">The command line arguments for the module.</param> /// <param name="usagePrefix">The prefix to print before the usage string.</param> /// <returns>True if the run was successful, false otherwise.</returns> public override bool Run(string[] args, string usagePrefix) { string datasetFile = string.Empty; string trainedModelFile = string.Empty; string predictionsFile = string.Empty; var parser = new CommandLineParser(); parser.RegisterParameterHandler("--data", "FILE", "Dataset to make predictions for", v => datasetFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--model", "FILE", "File with trained model", v => trainedModelFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--predictions", "FILE", "File with generated predictions", v => predictionsFile = v, CommandLineParameterType.Required); if (!parser.TryParse(args, usagePrefix)) { return(false); } RecommenderDataset testDataset = RecommenderDataset.Load(datasetFile); var trainedModel = MatchboxRecommender.Load <RecommenderDataset, User, Item, RatingDistribution, DummyFeatureSource>(trainedModelFile); IDictionary <User, IDictionary <Item, int> > predictions = trainedModel.Predict(testDataset); RecommenderPersistenceUtils.SavePredictedRatings(predictionsFile, predictions); return(true); }
/// <summary> /// Runs the module. /// </summary> /// <param name="args">The command line arguments for the module.</param> /// <param name="usagePrefix">The prefix to print before the usage string.</param> /// <returns>True if the run was successful, false otherwise.</returns> public override bool Run(string[] args, string usagePrefix) { string datasetFile = string.Empty; string trainedModelFile = string.Empty; string predictionsFile = string.Empty; int maxRelatedItemCount = 5; int minCommonRatingCount = 5; int minRelatedItemPoolSize = 5; var parser = new CommandLineParser(); parser.RegisterParameterHandler("--data", "FILE", "Dataset to make predictions for", v => datasetFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--model", "FILE", "File with trained model", v => trainedModelFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--predictions", "FILE", "File with generated predictions", v => predictionsFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--max-items", "NUM", "Maximum number of related items for a single item; defaults to 5", v => maxRelatedItemCount = v, CommandLineParameterType.Optional); parser.RegisterParameterHandler("--min-common-users", "NUM", "Minimum number of users that the query item and the related item should have been rated by in common; defaults to 5", v => minCommonRatingCount = v, CommandLineParameterType.Optional); parser.RegisterParameterHandler("--min-pool-size", "NUM", "Minimum size of the related item pool for a single item; defaults to 5", v => minRelatedItemPoolSize = v, CommandLineParameterType.Optional); if (!parser.TryParse(args, usagePrefix)) { return(false); } RecommenderDataset testDataset = RecommenderDataset.Load(datasetFile); var trainedModel = MatchboxRecommender.Load <RecommenderDataset, User, Item, RatingDistribution, DummyFeatureSource>(trainedModelFile); var evaluator = new RecommenderEvaluator <RecommenderDataset, User, Item, int, int, RatingDistribution>( Mappings.StarRatingRecommender.ForEvaluation()); IDictionary <Item, IEnumerable <Item> > relatedItems = evaluator.FindRelatedItemsRatedBySameUsers( trainedModel, testDataset, maxRelatedItemCount, minCommonRatingCount, minRelatedItemPoolSize); RecommenderPersistenceUtils.SaveRelatedItems(predictionsFile, relatedItems); return(true); }
/// <summary> /// Creates an instance of the Matchbox-based recommender using the settings from this configuration element. /// </summary> /// <param name="mapping">The mapping for the recommender being created.</param> /// <returns>An instance of the Matchbox-based recommender.</returns> public override IRecommender <SplitInstanceSource <RecommenderDataset>, User, Item, int, RatingDistribution, DummyFeatureSource> Create( IStarRatingRecommenderMapping <SplitInstanceSource <RecommenderDataset>, RatedUserItem, User, Item, int, DummyFeatureSource, Vector> mapping) { var inferNetRecommender = MatchboxRecommender.Create(mapping); this.SetupMatchboxModel(inferNetRecommender.Settings); return(inferNetRecommender); }
public void RecommenderDatasetExample() { GenerateRecommenderDatasetFile("RatingsDataset.csv"); RecommenderDataset trainingDataset = RecommenderDataset.Load("RatingsDataset.csv"); var recommender = MatchboxRecommender.Create(Mappings.StarRatingRecommender); recommender.Settings.Training.TraitCount = 5; recommender.Settings.Training.IterationCount = 20; recommender.Train(trainingDataset); var recommendations = recommender.Recommend(new User("Person 1", Vector.FromArray(2.3)), 10); CheckRecommendations(recommendations.Select(item => item.Id)); }
public void CsvMappingExample() { GenerateCsvFile("Ratings.csv"); var dataMapping = new CsvMapping(); var recommender = MatchboxRecommender.Create(dataMapping); recommender.Settings.Training.TraitCount = 5; recommender.Settings.Training.IterationCount = 20; recommender.Train("Ratings.csv"); var recommendations = recommender.Recommend("Person 1", 10); CheckRecommendations(recommendations); }
static void Main(string[] args) { var dataMapping = new CsvMapping(); var recommender = MatchboxRecommender.Create(dataMapping); recommender.Settings.Training.TraitCount = 5; recommender.Settings.Training.IterationCount = 20; recommender.Train("C:\\Python\\data\\ml-latest-small\\ratings.csv"); recommender.Save("C:\\Python\\data\\ml-latest-small\\TrainedModel.bin"); var recommends = recommender.Recommend("1", 10); int rating = recommender.Predict("23", "6669"); rating = recommender.Predict("1", "31"); rating = recommender.Predict("2", "17"); }
public void BinaryRecommendationRegressionTest() { // TODO: We need a static class which implements mapping chainings Rand.Restart(12347); var positiveOnlyMapping = new PositiveOnlyDataMapping(); var negativeDataGeneratorMapping = positiveOnlyMapping.WithGeneratedNegativeData(1.0); var recommender = MatchboxRecommender.Create(negativeDataGeneratorMapping); recommender.Train(this.positiveOnlyDataset, this.featureProvider); // must not throw foreach (var instance in positiveOnlyMapping.GetInstances(this.positiveOnlyDataset)) { var user = positiveOnlyMapping.GetUser(this.positiveOnlyDataset, instance); var item = positiveOnlyMapping.GetItem(this.positiveOnlyDataset, instance); Assert.Equal(1, recommender.Predict(user, item, this.featureProvider)); } }
GetRecommender( IStarRatingRecommenderMapping <SplitInstanceSource <string>, RatingTriple, string, Movie, int, NoFeatureSource, Vector> dataMapping, int traitCount) { // In this chapter Infer.NET Learner is used to make recommendations // You can find its source code here: // https://github.com/dotnet/infer/tree/master/src/Learners/Recommender // This recommender has a model that matches the one described in the book. // Its source code is situated here: // https://github.com/dotnet/infer/blob/master/src/Learners/RecommenderModels/Models.cs var recommender = MatchboxRecommender.Create(dataMapping); if (traitCount == 0) { //workaround to make recommender work with 0 traits var training = recommender.Settings.Training; var countField = training.GetType().GetField("traitCount", BindingFlags.NonPublic | BindingFlags.Instance); countField.SetValue(training, 0); } else { recommender.Settings.Training.TraitCount = traitCount; } // This value allows to normalize the sum of trait affinity variances to 1.0. var traitVariance = 1.0 / Math.Sqrt(traitCount); recommender.Settings.Training.IterationCount = IterationCount; recommender.Settings.Training.BatchCount = 1; recommender.Settings.Training.UseUserFeatures = false; recommender.Settings.Training.UseItemFeatures = false; recommender.Settings.Training.Advanced.AffinityNoiseVariance = 1.0; recommender.Settings.Training.Advanced.UserThresholdNoiseVariance = EpsilonPriorVariance; recommender.Settings.Training.Advanced.ItemTraitVariance = traitVariance; recommender.Settings.Training.Advanced.ItemBiasVariance = 1.0; recommender.Settings.Training.Advanced.UserTraitVariance = traitVariance; recommender.Settings.Training.Advanced.UserBiasVariance = 1.0; recommender.Settings.Prediction.SetPredictionLossFunction(LossFunction.ZeroOne); return(recommender); }
/// <summary> /// Runs the module. /// </summary> /// <param name="args">The command line arguments for the module.</param> /// <param name="usagePrefix">The prefix to print before the usage string.</param> /// <returns>True if the run was successful, false otherwise.</returns> public override bool Run(string[] args, string usagePrefix) { string trainingDatasetFile = string.Empty; string trainedModelFile = string.Empty; int traitCount = MatchboxRecommenderTrainingSettings.TraitCountDefault; int iterationCount = MatchboxRecommenderTrainingSettings.IterationCountDefault; int batchCount = MatchboxRecommenderTrainingSettings.BatchCountDefault; bool useUserFeatures = MatchboxRecommenderTrainingSettings.UseUserFeaturesDefault; bool useItemFeatures = MatchboxRecommenderTrainingSettings.UseItemFeaturesDefault; var parser = new CommandLineParser(); parser.RegisterParameterHandler("--training-data", "FILE", "Training dataset", v => trainingDatasetFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--trained-model", "FILE", "Trained model file", v => trainedModelFile = v, CommandLineParameterType.Required); parser.RegisterParameterHandler("--traits", "NUM", "Number of traits (defaults to " + traitCount + ")", v => traitCount = v, CommandLineParameterType.Optional); parser.RegisterParameterHandler("--iterations", "NUM", "Number of inference iterations (defaults to " + iterationCount + ")", v => iterationCount = v, CommandLineParameterType.Optional); parser.RegisterParameterHandler("--batches", "NUM", "Number of batches to split the training data into (defaults to " + batchCount + ")", v => batchCount = v, CommandLineParameterType.Optional); parser.RegisterParameterHandler("--use-user-features", "Use user features in the model (defaults to " + useUserFeatures + ")", () => useUserFeatures = true); parser.RegisterParameterHandler("--use-item-features", "Use item features in the model (defaults to " + useItemFeatures + ")", () => useItemFeatures = true); if (!parser.TryParse(args, usagePrefix)) { return(false); } RecommenderDataset trainingDataset = RecommenderDataset.Load(trainingDatasetFile); var recommender = MatchboxRecommender.Create(Mappings.StarRatingRecommender); recommender.Settings.Training.TraitCount = traitCount; recommender.Settings.Training.IterationCount = iterationCount; recommender.Settings.Training.BatchCount = batchCount; recommender.Settings.Training.UseUserFeatures = useUserFeatures; recommender.Settings.Training.UseItemFeatures = useItemFeatures; recommender.Train(trainingDataset); recommender.Save(trainedModelFile); return(true); }