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

使用ML.NET随机森林调用EvaluateNonCalibrated报AUC未定义错误求助

问题分析与解决方案

核心原因

错误System.ArgumentOutOfRangeException: „AUC is not defined when there is no positive class in the data Arg_ParamName_Name”的直接原因是:你的测试集(甚至整个数据集)中没有正类样本(即Label为true的记录)。

查看FitAsync代码可知,创建MLFinancialChange对象时完全没有给Label属性赋值——bool类型默认值为false,导致所有样本的Label都是负类。而AUC(曲线下面积)的计算必须依赖正负样本同时存在,因此触发了该参数错误。

解决方案

1. 修复Label属性的赋值逻辑

在FitAsync的循环中,必须根据业务规则给Label赋值,明确区分正负样本。示例如下(需根据实际业务场景调整判断逻辑):

foreach(var item in list)
{
    var x = new MLFinancialChange
    {
        Value = item.Value,
        CategoryId = item.Category.Id,
        // 替换为你的实际业务判断逻辑,确定该样本是否为正类
        Label = item.IsPositiveCase 
    };
    output.Add(x);
}

2. 确保训练/测试集包含正负样本

  • 检查数据分布:在拆分数据前,先统计数据中正样本的数量,确认原始数据确实包含正类:
var dataEnumerable = MlContext.Data.CreateEnumerable<MLFinancialChange>(data, reuseRowObject: false);
int positiveCount = dataEnumerable.Count(d => d.Label);
int negativeCount = dataEnumerable.Count(d => !d.Label);
// 若positiveCount为0,说明原始数据无正样本,需先补充数据或调整业务逻辑
  • 使用分层拆分:如果原始数据中正样本占比极低,普通随机拆分可能导致测试集无正样本,此时通过分层拆分保证测试集包含正负样本:
// 指定按Label分层,确保拆分后训练/测试集的正负样本比例与原数据一致
DataOperationsCatalog.TrainTestData dataSplit = MlContext.Data.TrainTestSplit(data, stratificationColumn: nameof(MLFinancialChange.Label));

3. 临时应急方案(仅用于测试代码流程)

如果只是临时验证模型结构,无法获取正样本,可手动添加一条正样本到测试集跳过AUC报错,但此方案无实际业务价值:

// 临时添加一条正样本到测试集
var testEnumerable = MlContext.Data.CreateEnumerable<MLFinancialChange>(_dataSplit.TestSet, reuseRowObject: false).ToList();
testEnumerable.Add(new MLFinancialChange { Label = true, Value = 0, CategoryId = 0 });
var modifiedTestSet = MlContext.Data.LoadFromEnumerable(testEnumerable);
var testSetTransform = _trainedModel.Transform(modifiedTestSet);
return MlContext.BinaryClassification.EvaluateNonCalibrated(testSetTransform);

内容的提问来源于stack exchange,提问作者Bogdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:41:27