Exemplo n.º 1
0
        static void Main(string[] args)
        {
            //Load the trainingdata
            LoadTrainingData();

            //(Instead of shit say poo) Create object of MLContext
            var mlContext = new MLContext();

            //Step 3 Convert classes with data to IDataView
            IDataView trainingDataView = mlContext.Data.LoadFromEnumerable(trainingData);
            IDataView testDataView     = mlContext.Data.LoadFromEnumerable(testData);

            //Create pipeline and define workflow
            var pipeline = mlContext.Transforms.Text.FeaturizeText("Features", "FeedbackText")
                           .Append(mlContext.BinaryClassification.Trainers.FastTree(numberOfLeaves: 50, numberOfTrees: 50, minimumExampleCountPerLeaf: 1));

            //Training the algorithm
            var model = pipeline.Fit(trainingDataView);

            //Load and run TestData
            LoadTestData();

            var predictions = model.Transform(testDataView);
            var metrics     = mlContext.BinaryClassification.Evaluate(predictions, "Label");

            //Loop added so the code reruns without restarting every time
            string strcont = "Y";

            while (strcont == "Y")
            {
                //Reads feedback to string and predicts if IsGood = true or false
                Console.WriteLine("Enter feedback: ");
                string feedbackString = Console.ReadLine().ToString();

                var predictionFunction = mlContext.Model.CreatePredictionEngine <FeedbackTrainingData, FeedbackPrediction>(model);

                var feedbackInput = new FeedbackTrainingData();
                feedbackInput.FeedbackText = feedbackString;
                var feedbackPredicted = predictionFunction.Predict(feedbackInput);


                //Prints prediction together with accuracy
                string feedbackMessage;
                double accuracyToPercent = Convert.ToDouble(metrics.Accuracy) * 100;

                if (feedbackPredicted.IsGood == true)
                {
                    feedbackMessage = "Feedback is positive with " + accuracyToPercent + "% accuracy";
                }
                else
                {
                    feedbackMessage = "Feedback is negative with " + accuracyToPercent + "% accuracy";
                }

                Console.WriteLine(feedbackMessage);
            }
            Console.Read();
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            // Step 1 :- We need to load the training data
            //trainingData = SprinklerLab.LoadTrainingData(trainingData);
            trainingData.AddRange(ComfortLab.ReadDataForPassXDays());
            //System.Console.WriteLine(trainingData.Count);
            //SprinklerLab.LoadTrainingDataFromFile(trainingData);

            // Step 2 :- Create object of MLContext
            var mlContext = new MLContext();

            // Step 3 :- Convert your data in to IDataView
            IDataView dataView = mlContext.Data.LoadFromEnumerable <FeedbackTrainingData>(trainingData);

            var model     = ComfortLab.TrainMachine(mlContext, dataView);
            var modelHeat = ComfortLab.TrainHeatMachine(mlContext, dataView);

            //// Step 4 :- We need to create the pipeline and define the workflows in it.
            //var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(FeedbackTrainingData.TurnOnSprinklers))
            //    .Append(mlContext.Transforms.Concatenate("Features", nameof(FeedbackTrainingData.FeedbackRainfall)))
            //    .Append(mlContext.BinaryClassification.Trainers.FastTree(numberOfLeaves: 50, numberOfTrees: 50, minimumExampleCountPerLeaf: 1));

            //// Step 5 :- Train the algorithm and we want the model out
            //var model = pipeline.Fit(dataView);

            // Step 6 :- Load the test data and run the test data to check the models accuracy
            testData = ComfortLab.LoadTestData(testData);
            testData = ComfortLab.LoadTestDataFromFile(testData);

            IDataView testDataView = mlContext.Data.LoadFromEnumerable <FeedbackTrainingData>(testData);

            var predictions     = model.Transform(testDataView);
            var heatPredictions = modelHeat.Transform(testDataView);
            var metrics         = mlContext.BinaryClassification.Evaluate(predictions, "Label");
            var heatMetrics     = mlContext.BinaryClassification.Evaluate(heatPredictions, "Label");

            System.Console.WriteLine($"metrics accuracy: {metrics.Accuracy}");
            System.Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
            System.Console.WriteLine($"Auc: {metrics.AreaUnderRocCurve:P2}");
            System.Console.WriteLine($"F1Score: {metrics.F1Score:P2}");

            System.Console.WriteLine(Environment.NewLine);
            System.Console.WriteLine($"Heat metrics accuracy: {heatMetrics.Accuracy}");
            System.Console.WriteLine($"Heat Accuracy: {heatMetrics.Accuracy:P2}");
            System.Console.WriteLine($"Heat Auc: {heatMetrics.AreaUnderRocCurve:P2}");
            System.Console.WriteLine($"Heat F1Score: {heatMetrics.F1Score:P2}");

            // Step 7 :- use the model
            string strcont = "Y";

            while (strcont == "Y")
            {
                System.Console.WriteLine("Enter outdoor temp.");
                string outdoor = System.Console.ReadLine().ToString();
                float  output;
                float.TryParse(outdoor, out output);
                if (output == 0 && outdoor != "0")
                {
                    strcont = outdoor;
                }
                System.Console.WriteLine("Enter indoor temp.");
                string indoorTemperature = System.Console.ReadLine().ToString();
                System.Console.WriteLine("Enter time of day");
                string timeOfDay = System.Console.ReadLine().ToString();

                // Create single instance of sample data from first line of dataset for model input
                ComfortModelInput sampleData = new ComfortModelInput()
                {
                    OutdoorTemp    = float.Parse(outdoor),
                    IndoorTemp     = float.Parse(indoorTemperature),
                    IndoorHumidity = 0F,
                    TimeOfDay      = ((DateTimeOffset)DateTime.Parse(timeOfDay)).ToUnixTimeSeconds()
                };

                // Make a single prediction on the sample data and print results
                var predictionResult = HeatConsumeModel.Predict(sampleData);

                System.Console.WriteLine(Environment.NewLine + "Using model to make single prediction -- Comparing actual TurnOnHeat with predicted TurnOnHeat from sample data...\n\n");
                System.Console.WriteLine($"OutdoorTemp: {sampleData.OutdoorTemp}");
                System.Console.WriteLine($"IndoorTemp: {sampleData.IndoorTemp}");
                System.Console.WriteLine($"IndoorHumidity: {sampleData.IndoorHumidity}");
                System.Console.WriteLine($"TimeOfDay: {sampleData.TimeOfDay}");
                bool heatOn = predictionResult.Score > .5 ? true : false;
                System.Console.WriteLine($"\n\nPredicted TurnOnHeat: {heatOn}\n\n");

                // Make a single prediction on the sample data and print results
                var predictionACResult = ACConsumeModel.Predict(sampleData);

                System.Console.WriteLine(Environment.NewLine + "Using model to make single prediction -- Comparing actual TurnOnAC with predicted TurnOnAC from sample data...\n\n");
                System.Console.WriteLine($"OutdoorTemp: {sampleData.OutdoorTemp}");
                System.Console.WriteLine($"IndoorTemp: {sampleData.IndoorTemp}");
                System.Console.WriteLine($"IndoorHumidity: {sampleData.IndoorHumidity}");
                System.Console.WriteLine($"TimeOfDay: {sampleData.TimeOfDay}");
                bool ACOn = predictionACResult.Score > .5 ? true : false;
                System.Console.WriteLine($"\n\nPredicted TurnOnAC: {ACOn}\n\n");

                var predictionFunction  = mlContext.Model.CreatePredictionEngine <FeedbackTrainingData, FeedbackPrediction>(model);
                var predictionFunction2 = mlContext.Model.CreatePredictionEngine <FeedbackTrainingData, FeedbackHeatPrediction>(modelHeat);

                var feedbackInput = new FeedbackTrainingData();
                try
                {
                    feedbackInput.OutdoorTemp = float.Parse(outdoor);
                    feedbackInput.IndoorTemp  = float.Parse(indoorTemperature);
                    feedbackInput.TimeOfDay   = ((DateTimeOffset)DateTime.Parse(timeOfDay)).ToUnixTimeSeconds();
                    var feedbackPredicted = predictionFunction.Predict(feedbackInput);
                    System.Console.WriteLine(Environment.NewLine + $"TurnOnAC: {feedbackPredicted.TurnOnAC} | Prediction: {(System.Convert.ToBoolean(feedbackPredicted.TurnOnAC) ? "Positive" : "Negative")} | Probability: {feedbackPredicted.Probability} ");
                    System.Console.WriteLine($"TurnOnAC :- {feedbackPredicted.TurnOnAC}");
                    var feedbackPredicted2 = predictionFunction2.Predict(feedbackInput);
                    System.Console.WriteLine(Environment.NewLine + $"TurnOnHeat: {feedbackPredicted2.TurnOnHeat} | Prediction: {(System.Convert.ToBoolean(feedbackPredicted2.TurnOnHeat) ? "Positive" : "Negative")} | Probability: {feedbackPredicted2.Probability} ");
                    System.Console.WriteLine($"TurnOnHeat :- {feedbackPredicted2.TurnOnHeat}");
                    System.Console.WriteLine(Environment.NewLine);
                    System.Console.WriteLine("=============== End of process, hit <CTRL-C key to finish ===============");
                }
                catch { }
            }
        }