/// <summary> /// Computes the quality metrics for the multi-class classification PredictionModel /// using the specified data set. /// </summary> /// <param name="model"> /// The trained multi-class classification PredictionModel to be evaluated. /// </param> /// <param name="testData"> /// The test data that will be predicted and used to evaluate the model. /// </param> /// <returns> /// A ClassificationMetrics instance that describes how well the model performed against the test data. /// </returns> public ClassificationMetrics Evaluate(PredictionModel model, ILearningPipelineLoader testData) { var environment = new MLContext(); environment.CheckValue(model, nameof(model)); environment.CheckValue(testData, nameof(testData)); Experiment experiment = environment.CreateExperiment(); ILearningPipelineStep testDataStep = testData.ApplyStep(previousStep: null, experiment); if (!(testDataStep is ILearningPipelineDataStep testDataOutput)) { throw environment.Except($"The {nameof(ILearningPipelineLoader)} did not return a {nameof(ILearningPipelineDataStep)} from ApplyStep."); } var datasetScorer = new DatasetTransformScorer { Data = testDataOutput.Data, }; DatasetTransformScorer.Output scoreOutput = experiment.Add(datasetScorer); Data = scoreOutput.ScoredData; Output evaluteOutput = experiment.Add(this); experiment.Compile(); experiment.SetInput(datasetScorer.TransformModel, model.PredictorModel); testData.SetInput(environment, experiment); experiment.Run(); IDataView overallMetrics = experiment.GetOutput(evaluteOutput.OverallMetrics); if (overallMetrics == null) { throw environment.Except($"Could not find OverallMetrics in the results returned in {nameof(ClassificationEvaluator)} Evaluate."); } IDataView confusionMatrix = experiment.GetOutput(evaluteOutput.ConfusionMatrix); if (confusionMatrix == null) { throw environment.Except($"Could not find ConfusionMatrix in the results returned in {nameof(ClassificationEvaluator)} Evaluate."); } var metric = ClassificationMetrics.FromMetrics(environment, overallMetrics, confusionMatrix); if (metric.Count != 1) { throw environment.Except($"Exactly one metric set was expected but found {metric.Count} metrics"); } return(metric[0]); }
TrainAndGetMetrics(ILearningPipelineLoader dataTrain, ILearningPipelineLoader dataTest, ILearningPipelineItem trainer) { var pipeline = new LearningPipeline(); pipeline.Add(dataTrain); pipeline.Add(trainer); var model = pipeline.Train <MLNetData, MLNetPredict>(); var evaluator = new BinaryClassificationEvaluator(); var metrics = evaluator.Evaluate(model, dataTest); return(metrics.Accuracy, metrics.Auc, metrics.F1Score, model); }
/// <summary> /// Computes the quality metrics for the PredictionModel using the specified data set. /// </summary> /// <param name="model"> /// The trained PredictionModel to be evaluated. /// </param> /// <param name="testData"> /// The test data that will be predicted and used to evaulate the model. /// </param> /// <returns> /// A RegressionMetrics instance that describes how well the model performed against the test data. /// </returns> public RegressionMetrics Evaluate(PredictionModel model, ILearningPipelineLoader testData) { using (var environment = new TlcEnvironment()) { environment.CheckValue(model, nameof(model)); environment.CheckValue(testData, nameof(testData)); Experiment experiment = environment.CreateExperiment(); ILearningPipelineStep testDataStep = testData.ApplyStep(previousStep: null, experiment); if (!(testDataStep is ILearningPipelineDataStep testDataOutput)) { throw environment.Except($"The {nameof(ILearningPipelineLoader)} did not return a {nameof(ILearningPipelineDataStep)} from ApplyStep."); } var datasetScorer = new DatasetTransformScorer { Data = testDataOutput.Data, }; DatasetTransformScorer.Output scoreOutput = experiment.Add(datasetScorer); Data = scoreOutput.ScoredData; Output evaluteOutput = experiment.Add(this); experiment.Compile(); experiment.SetInput(datasetScorer.TransformModel, model.PredictorModel); testData.SetInput(environment, experiment); experiment.Run(); IDataView overallMetrics = experiment.GetOutput(evaluteOutput.OverallMetrics); if (overallMetrics == null) { throw environment.Except($"Could not find OverallMetrics in the results returned in {nameof(RegressionEvaluator)} Evaluate."); } return(RegressionMetrics.FromOverallMetrics(environment, overallMetrics)); } }
public NeualNetwork() { //初始化构建一个专用的pipline,用于传输操作 LearningPipeline pipeline = new LearningPipeline(); //1.加入数据 ILearningPipelineLoader loaderItem = CollectionDataSource.Create <LearningInput>(new List <LearningInput>() { new LearningInput() { Rawdata1 = 1.0, Rawdata2 = 2.0, Rawdata3 = 3.0, Rawdata4 = 4.0, Label = 1, } }); pipeline.Add(loaderItem); //2.指定属性 pipeline.Add(new ColumnConcatenator("Features", "Rawdata1", "Rawdata2", "Rawdata3", "Rawdata4")); //3.指定训练方法 pipeline.Add(new LogisticRegressionClassifier() { }); //4.指定prediction pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" }); var model = pipeline.Train <LearningInput, LearningOutput>(); var pred = model.Predict(new LearningInput() { Rawdata1 = 1.0, Rawdata2 = 2.0, Rawdata3 = 3.0, Rawdata4 = 4.0, }); }
/// <summary> /// Performs train-test on a pipeline. /// </summary> /// <typeparam name="TInput">Class type that represents input schema.</typeparam> /// <typeparam name="TOutput">Class type that represents prediction schema.</typeparam> /// <param name="pipeline">Machine learning pipeline that contains <see cref="ILearningPipelineLoader"/>, /// transforms and at least one trainer.</param> /// <param name="testData"><see cref="ILearningPipelineLoader"/> that represents the test dataset.</param> /// <returns>Metrics and predictor model.</returns> public TrainTestEvaluatorOutput <TInput, TOutput> TrainTestEvaluate <TInput, TOutput>(LearningPipeline pipeline, ILearningPipelineLoader testData) where TInput : class where TOutput : class, new() { using (var environment = new TlcEnvironment()) { Experiment subGraph = environment.CreateExperiment(); ILearningPipelineStep step = null; List <ILearningPipelineLoader> loaders = new List <ILearningPipelineLoader>(); List <Var <ITransformModel> > transformModels = new List <Var <ITransformModel> >(); Var <ITransformModel> lastTransformModel = null; Var <IDataView> firstPipelineDataStep = null; Var <IPredictorModel> firstModel = null; ILearningPipelineItem firstTransform = null; foreach (ILearningPipelineItem currentItem in pipeline) { if (currentItem is ILearningPipelineLoader loader) { loaders.Add(loader); continue; } step = currentItem.ApplyStep(step, subGraph); if (step is ILearningPipelineDataStep dataStep && dataStep.Model != null) { transformModels.Add(dataStep.Model); if (firstPipelineDataStep == null) { firstPipelineDataStep = dataStep.Data; firstTransform = currentItem; } }