Exemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ToyDataRunner"/> class.
        /// </summary>
        /// <param name="trainModel">Train model.</param>
        /// <param name="testModel">Test model.</param>
        public static void Run(BinaryModel trainModel, BinaryModel testModel, bool testTransfer, bool testActive, bool testActiveTransfer)
        {
            var phase1PriorMean = new Gaussian(4, 1);
            var phase1PriorPrecision = new Gamma(1, 1);
            var phase2PriorMean = new Gaussian(4, 1);
            var phase2PriorPrecision = new Gamma(1, 1);

            // Generate data for 5 individuals
            var data = new List<ToyData>();
            for (int i = 0; i < 3; i++)
            {
                var toy = new ToyData
                {
                    // NumberOfInstances = 200,
                    // NumberOfHoldoutInstances = i == 0 ? 0 : 1000,
                    NumberOfResidents = 5,
                    NumberOfFeatures = NumberOfFeatures,
                    NumberOfActivities = 2,
                    UseBias = false,
                    TruePriorMean = i == 0 ? phase1PriorMean : phase2PriorMean,
                    TruePriorPrecision = i == 0 ? phase1PriorPrecision : phase2PriorPrecision
                };

                toy.Generate(i == 2 ? NoisyExampleProportion : 0.0, 200);
                if (i != 0)
                {
                    // no need for holdout data in training set
                    toy.Generate(0.0, 1000, true);
                }

                data.Add(toy);
            }

            var priors = new Marginals
            {
                WeightMeans = DistributionArrayHelpers.CreateGaussianArray(NumberOfFeatures, 0, 1).ToArray(),
                WeightPrecisions = DistributionArrayHelpers.CreateGammaArray(NumberOfFeatures, 1, 1).ToArray()
            };

            Console.WriteLine("Data Generated");

            // TODO: Create meta-features that allow us to do the first form of transfer learning

            // Train the community model
            Console.WriteLine("Training Community Model");
            var communityExperiment = new Experiment { TrainModel = trainModel, TestModel = testModel, Name = "Community" };
            communityExperiment.RunBatch(data[0].DataSet, priors);
            // PrintWeightPriors(communityExperiment.Posteriors, trainData.CommunityWeights);

            // Utils.PlotPosteriors(communityExperiment.Posteriors.Weights, data[0].Weights);
            // Utils.PlotPosteriors(communityExperiment.Posteriors.WeightMeans, communityExperiment.Posteriors.WeightPrecisions, null, "Community weights", "Feature");

            // return;

            if (testTransfer)
            {
                // Do online learning
                // Console.WriteLine("Testing Online Model");
                var onlineExperiment = new Experiment { TrainModel = trainModel, TestModel = testModel, Name = "Online" };
                onlineExperiment.RunOnline(data[1].DataSet, data[1].HoldoutSet, priors);

                // Do transfer learning
                // Console.WriteLine("Testing Community Model");
                var personalisationExperiment = new Experiment { TrainModel = trainModel, TestModel = testModel, Name = "Community" };
                personalisationExperiment.RunOnline(data[1].DataSet, data[1].HoldoutSet, communityExperiment.Posteriors);

                // Plot cumulative metrics
                Utils.PlotCumulativeMetrics(new[] { onlineExperiment, personalisationExperiment }, "Toy Transfer");
            }
            else
            {
                Console.WriteLine("Skipping Transfer Learning");
            }

            // ACTIVE MODEL
            if (testActive)
            {
                ActiveTransfer(trainModel, testModel, data, "Toy Active", priors);
            }
            else
            {
                Console.WriteLine("Skipping Active Learning");
            }

            if (testActiveTransfer)
            {
                Console.WriteLine("Note that the transfer learning is very effective here, so the active learning doesn't add much");
                ActiveTransfer(trainModel, testModel, data, "Toy Active Transfer", communityExperiment.Posteriors);
            }
            else
            {
                Console.WriteLine("Skipping Active Transfer Learning");
            }

            // Now create different costs for acquiring labels - want to demonstrate that we choose from all 3 possible labels
        }
Exemplo n.º 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ToyDataRunner"/> class.
        /// </summary>
        /// <param name="trainModel">Train model.</param>
        /// <param name="testModel">Test model.</param>
        public static void Run(BinaryModel trainModel, BinaryModel testModel, bool testTransfer, bool testActive, bool testActiveTransfer)
        {
            var phase1PriorMean      = new Gaussian(4, 1);
            var phase1PriorPrecision = new Gamma(1, 1);
            var phase2PriorMean      = new Gaussian(4, 1);
            var phase2PriorPrecision = new Gamma(1, 1);

            // Generate data for 5 individuals
            var data = new List <ToyData>();

            for (int i = 0; i < 3; i++)
            {
                var toy = new ToyData
                {
                    // NumberOfInstances = 200,
                    // NumberOfHoldoutInstances = i == 0 ? 0 : 1000,
                    NumberOfResidents  = 5,
                    NumberOfFeatures   = NumberOfFeatures,
                    NumberOfActivities = 2,
                    UseBias            = false,
                    TruePriorMean      = i == 0 ? phase1PriorMean : phase2PriorMean,
                    TruePriorPrecision = i == 0 ? phase1PriorPrecision : phase2PriorPrecision
                };

                toy.Generate(i == 2 ? NoisyExampleProportion : 0.0, 200);
                if (i != 0)
                {
                    // no need for holdout data in training set
                    toy.Generate(0.0, 1000, true);
                }

                data.Add(toy);
            }

            var priors = new Marginals
            {
                WeightMeans      = DistributionArrayHelpers.CreateGaussianArray(NumberOfFeatures, 0, 1).ToArray(),
                WeightPrecisions = DistributionArrayHelpers.CreateGammaArray(NumberOfFeatures, 1, 1).ToArray()
            };

            Console.WriteLine("Data Generated");

            // TODO: Create meta-features that allow us to do the first form of transfer learning

            // Train the community model
            Console.WriteLine("Training Community Model");
            var communityExperiment = new Experiment {
                TrainModel = trainModel, TestModel = testModel, Name = "Community"
            };

            communityExperiment.RunBatch(data[0].DataSet, priors);
            // PrintWeightPriors(communityExperiment.Posteriors, trainData.CommunityWeights);

            // Utils.PlotPosteriors(communityExperiment.Posteriors.Weights, data[0].Weights);
            // Utils.PlotPosteriors(communityExperiment.Posteriors.WeightMeans, communityExperiment.Posteriors.WeightPrecisions, null, "Community weights", "Feature");

            // return;

            if (testTransfer)
            {
                // Do online learning
                // Console.WriteLine("Testing Online Model");
                var onlineExperiment = new Experiment {
                    TrainModel = trainModel, TestModel = testModel, Name = "Online"
                };
                onlineExperiment.RunOnline(data[1].DataSet, data[1].HoldoutSet, priors);

                // Do transfer learning
                // Console.WriteLine("Testing Community Model");
                var personalisationExperiment = new Experiment {
                    TrainModel = trainModel, TestModel = testModel, Name = "Community"
                };
                personalisationExperiment.RunOnline(data[1].DataSet, data[1].HoldoutSet, communityExperiment.Posteriors);

                // Plot cumulative metrics
                Utils.PlotCumulativeMetrics(new[] { onlineExperiment, personalisationExperiment }, "Toy Transfer");
            }
            else
            {
                Console.WriteLine("Skipping Transfer Learning");
            }

            // ACTIVE MODEL
            if (testActive)
            {
                ActiveTransfer(trainModel, testModel, data, "Toy Active", priors);
            }
            else
            {
                Console.WriteLine("Skipping Active Learning");
            }

            if (testActiveTransfer)
            {
                Console.WriteLine("Note that the transfer learning is very effective here, so the active learning doesn't add much");
                ActiveTransfer(trainModel, testModel, data, "Toy Active Transfer", communityExperiment.Posteriors);
            }
            else
            {
                Console.WriteLine("Skipping Active Transfer Learning");
            }

            // Now create different costs for acquiring labels - want to demonstrate that we choose from all 3 possible labels
        }