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(); } }
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)); }
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)); }
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"); }
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(); } }