コード例 #1
0
ファイル: Program.cs プロジェクト: mavidian/PendAdvisor
        static void Main(string[] args)
        {
            var inputFile  = $"..{sep}..{sep}..{sep}Data{sep}{_fileName}.csv";
            var outputFile = $"{_fileName}_withActions.csv";

            Console.WriteLine($"{DateTime.Now} Testing the ML model by calling the Web API for a set of test claims...");
            Console.WriteLine($"Input file containing test claims: {Path.GetFullPath(inputFile)}");
            Console.WriteLine($"Output file with added predicted actions: {Path.GetFullPath(outputFile)}");


            using (var reader = File.OpenText(inputFile))
                using (var writer = File.CreateText(outputFile))
                {
                    string currLine;
                    bool   currLineIsHeader = true;
                    // currentLine will be null when the StreamReader reaches the end of file
                    while ((currLine = reader.ReadLine()) != null)
                    {
                        if (currLineIsHeader)
                        {
                            const string expectedHeader = "MemberID,ClaimID,DateReceived,providerNPI,Diagnosis1,Diagnosis2,POS,ProcedureCode,Units,Price,PendReason,Action,Status";
                            Debug.Assert(currLine == expectedHeader);
                            writer.WriteLine(currLine + ",ActionScore,ReleaseScore,DenyScore,ReprocessScore,MedReviewScore"); // the actual prediction will be placed in Action column (11)
                            currLineIsHeader = false;
                            continue;
                        }

                        var elems = currLine.Split(',').ToList();
                        Debug.Assert(elems.Count == 13);
                        var modelInput = new ModelInput()
                        {
                            Diagnosis1    = elems[4],
                            Diagnosis2    = elems[5],
                            POS           = elems[6],
                            ProcedureCode = elems[7],
                            Units         = int.Parse(elems[8]),
                            Price         = float.Parse(elems[9]),
                            PendReason    = elems[10]
                        };
                        var predictedOutput = PendPredictor.PredictEx(modelInput);
                        elems[11] = predictedOutput.Action;
                        elems.Add(GetScoreForAction(predictedOutput, predictedOutput.Action));
                        elems.Add(GetScoreForAction(predictedOutput, "Release"));
                        elems.Add(GetScoreForAction(predictedOutput, "Deny"));
                        elems.Add(GetScoreForAction(predictedOutput, "Reprocess"));
                        elems.Add(GetScoreForAction(predictedOutput, "MedReview"));
                        writer.WriteLine(string.Join(',', elems.ToArray()));
                    }
                }


            Console.WriteLine();
            Console.WriteLine($"{DateTime.Now} ALL DONE!");

            if (Debugger.IsAttached)
            {
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey();
            }
        }
コード例 #2
0
        public IActionResult ObtainPendAdvice([FromBody] ClaimData claim)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }
            //For simplicity, the entire client logic is implemented inside the controller
            var modelInput  = _mapper.Map <ModelInput>(claim);
            var modelOutput = PendPredictor.PredictEx(modelInput);
            var adviceData  = _mapper.Map <AdviceData>(modelOutput);

            adviceData.ClaimID = claim.ClaimID;
            return(Ok(adviceData));
        }
コード例 #3
0
        public void Predict_SampleInput_CorrectOutput()
        {
            //arrange
            var sampleInput = new ModelInput()
            {
                Diagnosis1    = "E10",
                Diagnosis2    = "I11",
                POS           = "21",
                ProcedureCode = "34907",
                Units         = 1,
                Price         = 100f,
                PendReason    = "PAUT"
            };

            //act
            var predictedOutput = PendPredictor.Predict(sampleInput);

            //assert
            predictedOutput.Action.Should().BeOneOf("RePend", "Release", "Deny", "MedReview");
            predictedOutput.Scores.Count().Should().Be(4);
            predictedOutput.Scores.ToList().ForEach(s => s.Should().BeGreaterThan(0f).And.BeLessThan(1f));
        }
コード例 #4
0
        public void PredictEx_SampleInput_CorrectOutput()
        {
            //arrange
            var sampleInput = new ModelInput()
            {
                Diagnosis1    = "E10",
                Diagnosis2    = "I11",
                POS           = "21",
                ProcedureCode = "34907",
                Units         = 1,
                Price         = 100f,
                PendReason    = "PAUT"
            };

            //act
            var predictedOutput = PendPredictor.PredictEx(sampleInput);

            //assert
            predictedOutput.ActionsAndScores.Count().Should().Be(4);
            predictedOutput.ActionsAndScores.Select(t => t.Score).Should().BeInDescendingOrder();
            predictedOutput.ActionsAndScores.Select(t => t.Action).Should().BeEquivalentTo("RePend", "Release", "Deny", "MedReview");
        }
コード例 #5
0
        static void Main(string[] args)
        {
            // Load the data
            var allData = _mlContext.Data.LoadFromTextFile <ModelInput>(_dataPath, hasHeader: true, separatorChar: ',');

            // Split the data into a training set (80%) and a test set (20%)
            var trainTestData = _mlContext.Data.TrainTestSplit(allData, testFraction: 0.2, seed: 0);
            var trainData     = trainTestData.TrainSet;
            var testData      = trainTestData.TestSet;

            //Build training pipeline
            (IEstimator <ITransformer> trainingPipeline, string algorithmDesc) = BuildTrainingPipeline();

            //Train the model
            Console.WriteLine($"{DateTime.Now} Training the model...");
            Console.WriteLine($"Training algorithm used: {algorithmDesc}");
            ITransformer mlModel = TrainModel(trainingPipeline, trainData);

            // Evaluate quality of the model
            Console.WriteLine();
            Console.WriteLine($"{DateTime.Now} Evaluating the model...");
            (var metrics, var crossValidationMetrics) = EvaluateModel(mlModel, testData, trainingPipeline, allData);

            Console.WriteLine($"Macro accuracy = {metrics.MacroAccuracy:P2}");
            Console.WriteLine($"Micro accuracy = {metrics.MicroAccuracy:P2}");
            Console.WriteLine(metrics.ConfusionMatrix.GetFormattedConfusionTable());

            if (crossValidationMetrics == null)
            {
                Console.WriteLine("Cross-validation skipped.");
            }
            else
            {
                Console.WriteLine($"Mean cross-validated macro accuracy = {crossValidationMetrics.Average(s => s.Metrics.MacroAccuracy):P2}");
                Console.WriteLine($"Mean cross-validated micro accuracy = {crossValidationMetrics.Average(s => s.Metrics.MicroAccuracy):P2}");
            }

            // Use the model to make a sample prediction
            Console.WriteLine();
            Console.WriteLine($"{DateTime.Now} Using the model to make prediction...");

            var input = new ModelInput
            {
                Diagnosis1    = "E10",
                Diagnosis2    = "I11",
                POS           = "21",
                ProcedureCode = "34907",
                Units         = 1,
                Price         = 100f,
                PendReason    = "PAUT"
            };

            var predictor = _mlContext.Model.CreatePredictionEngine <ModelInput, ModelOutput>(mlModel);

            var prediction = predictor.Predict(input);

            var labelMap = PendPredictor.GetLabelMap(predictor); //translates 0-based index to the actual value in the Label column.

            Console.WriteLine("Predictions and their scores (high to low):");
            prediction.Scores.Zip(Enumerable.Range(0, int.MaxValue))
            .OrderByDescending(t => t.First).ToList()               //First = Score, Second = index
            .ForEach(t => Console.WriteLine($"{t.Second}.{labelMap[t.Second],8} - {t.First:N8}"));

            Console.WriteLine();
            Console.WriteLine($"So, the predicted action is {prediction.Action}.");

            // Save the trained model to a .ZIP file
            Console.WriteLine();
            Console.WriteLine($"{DateTime.Now} Saving the trained model into {PendPredictor.PathToSaveModel} file...");
            SaveModel(mlModel, allData.Schema, PendPredictor.PathToSaveModel);
            Console.WriteLine($"{DateTime.Now} Saving the trained model into {PendPredictor.PathToSaveModel2} file...");
            SaveModel(mlModel, allData.Schema, PendPredictor.PathToSaveModel2);
            Console.WriteLine("Rebuild the API and Tester projects in order for the new model to be in effect!");

            Console.WriteLine();
            Console.WriteLine($"{DateTime.Now} ALL DONE!");

            if (Debugger.IsAttached)
            {
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey();
            }
        }