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);
        }
示例#5
0
        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));
        }
示例#6
0
        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);
        }
示例#7
0
        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));
            }
        }
示例#9
0
        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);
        }
示例#10
0
        /// <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);
        }