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

ML.NET使用CSV样本预测时CreateEnumerable生成NaN问题求助

解决ML.NET CreateEnumerable方法生成NaN的问题

你遇到的NaN问题,大概率是CSV解析时的类型不匹配、字段格式错误,或是ModelInput类的字段定义和实际数据不兼容导致的,尤其是239列的场景下,很容易出现个别列的解析异常。以下是具体解决方法:


1. 修正ModelInput的字段类型定义

  • 对所有数值类型字段,改用可空类型(Nullable<T>,比如float?/double?),避免解析空值或无效值时强制转为NaN
  • 确保字段类型和CSV中对应列的数据完全匹配:比如CSV里是整数就用int?,是小数就用double?,不要混用
  • 示例修改:
    // 原定义(易产生NaN)
    public float Feature1 { get; set; }
    // 修改后
    public float? Feature1 { get; set; }
    

2. 强化CSV加载的解析规则

  • 加载CSV时添加更严格的参数,处理带引号的字段、空格等常见格式问题:
    var data = mlContext.Data.LoadFromTextFile<MLModel1.ModelInput>(
        @"csv file path",
        separatorChar: ';',
        hasHeader: true,
        allowQuoting: true, // 处理带引号的字段(比如"123;456")
        trimWhitespace: true, // 去除字段前后的空格
        ignoreMissingColumns: false // 强制检查列匹配,避免遗漏字段
    );
    

3. 过滤或预处理无效数据

  • 在转成IEnumerable之前,先过滤掉包含NaN的行,或者用ML.NET的预处理API填充缺失值:
    // 方式1:过滤掉包含NaN的行(以Puan列为例)
    var cleanData = mlContext.Data.FilterRowsByColumn(data, "Puan", double.NaN, double.NaN, negate: true);
    
    // 方式2:填充缺失值(用均值填充所有数值列)
    var pipeline = mlContext.Transforms.ReplaceMissingValues(
        outputColumnName: "*", 
        replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean);
    var cleanData = pipeline.Fit(data).Transform(data);
    
    // 再转成IEnumerable
    var dataEnumerable = mlContext.Data.CreateEnumerable<MLModel1.ModelInput>(cleanData, reuseRowObject: false);
    

4. 绕过CreateEnumerable,直接用IDataView批量预测

  • 既然是批量预测,没必要转成IEnumerable,直接用ML.NET的批量预测API,效率更高且避免类型转换问题:
    // 直接对IDataView进行批量预测
    var predictions = MLModel1.Predict(data);
    
    // 遍历预测结果(如需)
    var predictionEnumerable = mlContext.Data.CreateEnumerable<MLModel1.ModelOutput>(predictions, reuseRowObject: false);
    foreach (var pred in predictionEnumerable)
    {
        Console.WriteLine($"Gerçek Puan: {pred.Puan}");
        // 处理排序后的分数逻辑
    }
    

额外注意事项

  • 239列的场景下,务必确保ModelInput类的字段名称和顺序与CSV表头完全匹配,否则会出现映射错误
  • 如果CSV中有特殊格式的数值(比如千位分隔符、逗号作为小数位),需要自定义解析器,或者先预处理CSV统一格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:30:28