如何在ML.NET中获取单个预测的百分比置信度分数
在ML.NET中获取二分类正类的百分比置信度分数
ML.NET提供了内置的校准组件,可以直接将模型输出的原始分数(raw score)转换为符合概率分布的置信度(即属于正类的百分比概率),不需要手动处理rawScores和trueLabels向量。下面是具体实现步骤:
1. 修改训练管道,添加校准器
在你的训练管道末尾,追加一个校准器组件。针对树模型(比如你用的FastTree),推荐使用Platt校准或等渗校准(Isotonic),ML.NET都有内置实现:
var pipeline = context.Transforms.Concatenate("Features", "feature1", "feature2") .Append(context.Transforms.Conversion.ConvertType("Features", "Features", DataKind.Single)) .Append(context.Transforms.NormalizeMinMax("Features")) .Append(context.BinaryClassification.Trainers.FastTree()) // 添加Platt校准器,将raw score转换为概率 .Append(context.BinaryClassification.Calibrators.Platt(labelColumnName: "Label"));
如果你有单独的校准数据集(而非用训练数据校准),可以使用
Calibrators.Platt().Fit(calibrationData)的方式,但通常用训练数据校准已经足够。
2. 获取校准后的置信度(百分比)
模型预测后,校准后的正类概率会存储在Probability列中,直接提取该列的值即可,范围是0~1,乘以100就是百分比:
var predictions = model.Transform(testData); // 获取每个测试点的正类概率(0~1) var probabilities = predictions.GetColumn<float>("Probability"); // 转换为百分比 var percentageConfidences = probabilities.Select(p => p * 100).ToList(); // 示例:遍历输出每个数据点的置信度 foreach (var conf in percentageConfidences) { Console.WriteLine($"正类置信度:{conf:F2}%"); }
修改后的完整代码
public class Inputs { [LoadColumn(0)] public double feature1; [LoadColumn(1)] public double feature2; [LoadColumn(2)] public bool Label; } void _function(IDataView calibrationData) { var context = new MLContext(seed: 0); // Load data into a list of Input objects var dataList = new List<Inputs>(); Random random = new Random(); for (int i = 0; i < 100; i++) { double feature1 = random.NextDouble(); double feature2 = random.NextDouble(); bool label = random.Next(2) == 1; // Generate random true (1) or false (0) for the label dataList.Add(new Inputs { feature1 = feature1, feature2 = feature2, Label = label }); } // Load the data from the list var data = context.Data.LoadFromEnumerable(dataList); var trainTestData = context.Data.TrainTestSplit(data, testFraction: 0.2, seed: 0); var trainData = trainTestData.TrainSet; var testData = trainTestData.TestSet; // Define the data preprocessing pipeline with calibration var pipeline = context.Transforms.Concatenate("Features", "feature1", "feature2") .Append(context.Transforms.Conversion.ConvertType("Features", "Features", DataKind.Single)) .Append(context.Transforms.NormalizeMinMax("Features")) .Append(context.BinaryClassification.Trainers.FastTree()) // 添加Platt校准器 .Append(context.BinaryClassification.Calibrators.Platt(labelColumnName: "Label")); var model = pipeline.Fit(trainData); // Train the model var predictions = model.Transform(testData); // Make predictions var metrics = context.BinaryClassification.Evaluate(predictions, labelColumnName: "Label"); MessageBox.Show($"整体准确率:{metrics.Accuracy:P2}"); // 获取每个测试点的正类百分比置信度 var probabilities = predictions.GetColumn<float>("Probability"); var percentageConfidences = probabilities.Select(p => p * 100).ToList(); // 示例:输出所有置信度 foreach (var conf in percentageConfidences) { Console.WriteLine($"正类置信度:{conf:F2}%"); } }
关键说明
Score列是模型输出的原始分数,没有概率意义;Probability列是经过校准后的正类概率,范围0~1,直接可用。- 如果你坚持手动校准(不推荐),可以使用
CalibratorEstimatorBase相关API,但内置管道方式更简洁且符合ML.NET的数据流设计,避免手动处理向量的繁琐。
内容的提问来源于stack exchange,提问作者Lofiman
相关产品推荐
相关产品推荐

