ML.NET运行报错:Single类型Score列无法绑定到Single[]类型属性
问题根因
抛出该类型绑定异常的直接原因是预测输出类的字段类型和模型输出列类型不匹配:
FastForest回归模型训练完成后,输出的
Score列是单精度浮点值(Single/float),但你项目中自动生成的MLModel1预测类中,Score属性被定义为了浮点数组类型float[]/System.Single[],绑定过程中类型无法对齐就会触发该异常。
除此之外你的训练管道还存在两个会导致模型失效的逻辑错误:
- 拼接特征列时将待预测的标签列
Brightness_Level加入了特征集合,属于严重的数据泄露,训练出的模型没有实际预测能力 - 归一化转换的输出没有正确接入特征拼接步骤,归一化逻辑实际未生效
修复方案
- 修正
Score字段类型- 如果是手动定义预测输出类,直接将
Score属性的类型从float[]改为float即可 - 如果是用ML.NET Model Builder自动生成的
MLModel1代码,说明创建模型时选错了场景,删除现有自动生成的模型文件,重新选择回归场景生成代码,会自动匹配正确的字段类型
- 如果是手动定义预测输出类,直接将
- 修正训练管道逻辑,替换原有管道代码为以下实现,解决数据泄露和归一化失效问题:
var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(HousingData.Brightness_Level)) // 归一化时指定独立输出列,避免覆盖原始字段 .Append(mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "IsReservedNorm", inputColumnName: nameof(HousingData.IsReserved))) .Append(mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "SolarAltitudeNorm", inputColumnName: nameof(HousingData.SolarAltitude))) .Append(mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "SolarAzimuthNorm", inputColumnName: nameof(HousingData.SolarAzimuth))) .Append(mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "SunPowerNorm", inputColumnName: nameof(HousingData.SunPower))) // 特征集合仅包含归一化后的输入特征,禁止加入标签列 .Append(mlContext.Transforms.Concatenate("Features", "IsReservedNorm", "SolarAltitudeNorm", "SolarAzimuthNorm", "SunPowerNorm")) .Append(mlContext.Regression.Trainers.FastForest(labelColumnName: "Label", featureColumnName: "Features"));
- 校验输入类匹配
确认MLModel1.ModelInput中仅包含四个输入特征字段(IsReserved、SolarAltitude、SolarAzimuth、SunPower),类型均为float,和训练时的特征列一一对应即可。
验证
修改完成后重新运行训练、保存、预测流程,类型绑定异常会直接消失,同时模型预测结果的合理性也会因为特征逻辑修正得到保障。
内容的提问来源于stack exchange,提问作者TheFage
相关产品推荐
相关产品推荐

