コード例 #1
0
        public async Task CreateAsyncAddsEntity()
        {
            var dbContext = ApplicationDbContextInMemoryFactory.InitializeContext();

            var recommendationsRepository = new EfDeletableEntityRepository <Recommendation>(dbContext);
            var service = new RecommendationsService(recommendationsRepository);

            await service.CreateAsync("TestUser1", "TestUser8", "Recommendation");

            Assert.Equal(1, recommendationsRepository.All().Count());
        }
コード例 #2
0
ファイル: Evaluator.cs プロジェクト: cmu-sei/GHOSTS-SPECTRE
        public static BrowseRecommendationsResults Run(Configuration config = null)
        {
            if (config == null)
            {
                Config = new Configuration();
            }
            else
            {
                Config = config;
            }

            var stopwatch = System.Diagnostics.Stopwatch.StartNew();

            results.Add($"Building test {Config.TestNumber} directories...");
            if (!Directory.Exists(Configuration.BaseDirectory))
            {
                Directory.CreateDirectory(Configuration.BaseDirectory);
            }
            if (!Directory.Exists($"{Configuration.BaseDirectory}/{Config.TestNumber}"))
            {
                Directory.CreateDirectory($"{Configuration.BaseDirectory}/{Config.TestNumber}");
            }
            if (!Directory.Exists($"{Configuration.BaseDirectory}/dependencies"))
            {
                Directory.CreateDirectory($"{Configuration.BaseDirectory}/dependencies");
            }

            if (!File.Exists(Config.AgentsFile))
            {
                results.Add("Generating agents file...");
                Generators.GenerateAgentsFile(Config);
            }
            if (!File.Exists(Config.SitesFile))
            {
                results.Add("Generating sites file...");
                Generators.GenerateSitesFile(Config);
            }

            if (!File.Exists(Config.InputFilePref) || !File.Exists(Config.InputFileRand))
            {
                results.Add("Generating browse history files...");
                Generators.GenerateNewBrowseFiles(Config);
            }

            var typesToProcess = new[] { "pref", "rand" };

            foreach (var typeToProcess in typesToProcess)
            {
                Config.CurrentType = typeToProcess;
                results.Add($"Initializing {Config.CurrentType}...");

                results.Add("Extracting test file...");
                if (!File.Exists(Config.TestFile))
                {
                    //build test file from input
                    var lines = File.ReadAllLines(Config.InputFile);

                    var numberForTest = (lines.Length * Config.PercentOfDataIsTest);
                    var linesToRemove = new List <int>();
                    using (StreamWriter w = File.AppendText(Config.TestFile))
                    {
                        w.WriteLine("user_id,item_id,rating,timestamp,iteration".ToLower());

                        int recordsCopied = 0;
                        while (recordsCopied < numberForTest)
                        {
                            var r = new Random();
                            var randomLineNumber = r.Next(1, lines.Length - 1);
                            while (linesToRemove.Contains(randomLineNumber))
                            {
                                randomLineNumber = r.Next(1, lines.Length - 1);
                            }
                            var line = lines[randomLineNumber];
                            w.WriteLine(line);
                            linesToRemove.Add(randomLineNumber);
                            recordsCopied++;
                        }
                    }

                    //remove test data from input file
                    if (File.Exists(Config.InputFile + ".backup"))
                    {
                        File.Delete(Config.InputFile + ".backup");
                    }
                    File.Move(Config.InputFile, Config.InputFile + ".backup");
                    using (StreamWriter w = File.AppendText(Config.InputFile))
                    {
                        w.WriteLine("user_id,item_id,rating,timestamp,iteration".ToLower());

                        int i = -1;
                        foreach (var line in lines)
                        {
                            i++;
                            if (i == 0 || linesToRemove.Contains(i))
                            {
                                continue;
                            }
                            w.WriteLine(line);
                        }
                    }
                }

                MLContext mlContext = new MLContext();
                (IDataView trainingDataView, IDataView testDataView) = LoadData(mlContext);

                Agents = new List <Agent>();

                using (var fileStream = File.OpenRead(Config.AgentsFile))
                {
                    using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, 128))
                    {
                        var    i = -1;
                        String line;
                        while ((line = streamReader.ReadLine()) != null)
                        {
                            i++;
                            if (i == 0)
                            {
                                continue;
                            }
                            var o = line.Split(Convert.ToChar(","));
                            Agents.Add(new Agent(Convert.ToInt32(o[0]), o[1], Convert.ToInt32(Convert.ToDouble(o[2]))));
                        }
                    }
                }

                Sites = new List <Site>();
                using (var fileStream = File.OpenRead(Config.SitesFile))
                {
                    using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, 128))
                    {
                        String line;
                        while ((line = streamReader.ReadLine()) != null)
                        {
                            var o = line.Split(Convert.ToChar(","));
                            try
                            {
                                Sites.Add(new Site(Convert.ToInt32(o[0]), o[1]));
                            }
                            catch { } //lazy, don't @ me
                        }
                    }
                }

                results.Add($"Initializing model and associated requirements...");
                if (!File.Exists(Config.ModelFile))
                {
                    ITransformer model = BuildAndTrainModel(mlContext, trainingDataView);
                    EvaluateModel(mlContext, testDataView, model);
                    UseModelForSinglePrediction(mlContext, model);
                    SaveModel(mlContext, trainingDataView.Schema, model);
                }


                /*
                 * results.Add("=============== Running Experiment ===============");
                 * var experimentSettings = new RecommendationExperimentSettings();
                 * experimentSettings.MaxExperimentTimeInSeconds = 3600;
                 * experimentSettings.OptimizingMetric = RegressionMetric.MeanSquaredError;
                 * var experiment = mlContext.Auto().CreateRecommendationExperiment(experimentSettings);
                 * ExperimentResult<RegressionMetrics> experimentResult = mlContext.Auto()
                 *  .CreateRecommendationExperiment(new RecommendationExperimentSettings() { MaxExperimentTimeInSeconds = 3600 })
                 *  .Execute(trainingDataView, testDataView,
                 *      new ColumnInformation()
                 *      {
                 *          LabelColumnName = "Label",
                 *          UserIdColumnName = "userId",
                 *          ItemIdColumnName = "itemId"
                 *      });
                 * // STEP 3: Print metric from best model
                 * RunDetail<RegressionMetrics> bestRun = experimentResult.BestRun;
                 * results.Add($"Total models produced: {experimentResult.RunDetails.Count()}");
                 * results.Add($"Best model's trainer: {bestRun.TrainerName}");
                 * results.Add($"Metrics of best model from validation data --");
                 * PrintMetrics(bestRun.ValidationMetrics);
                 * Environment.Exit(1);
                 */


                //now that we have a model, we'll loop through that model x times - same model, growing dataset over iteration
                for (var i = 1; i < Config.Iterations; i++)
                {
                    Config.CurrentIteration = i;
                    //Define DataViewSchema for data preparation pipeline and trained model
                    DataViewSchema modelSchema;
                    // Load trained model
                    var trainedModel = mlContext.Model.Load(Config.ModelFile, out modelSchema);

                    // Load data preparation pipeline and trained model
                    UseModelForSinglePrediction(mlContext, trainedModel);
                }

                results.Add("Generating final reports...");
                Generators.GenerateReportFile(Config);

                results.Add($"{Config.CurrentType} completed in {stopwatch.ElapsedMilliseconds} ms");
            }

            stopwatch.Stop();
            results.Add($"Test completed in {stopwatch.ElapsedMilliseconds} ms");

            //load result file
            var recommendations = RecommendationsService.Load(config.ResultFileOut);
            var browseRecommendationsResults = new BrowseRecommendationsResults {
                JobOutput = results, Recommendations = recommendations
            };

            return(browseRecommendationsResults);
        }