/// <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 }
/// <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 }