You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:37:25