ML.NET执行Fit()时报找不到Features列错误的原因是什么
ML.NET找不到
Features列报错原因及解决方案 核心错误原因
你的管道执行顺序配置错误:在预训练处理管道中,你先调用了需要使用Features列的二分类训练器,后执行生成Features列的拼接操作,训练器运行时所需的输入列还未被生成,因此抛出列不存在的异常。
原预训练管道的执行逻辑顺序是错误的:
- 生成
Labels列 - 生成
TextFeaturized列 - 调用
SdcaLogisticRegression训练器,要求输入Features列(此时该列还未生成) - 执行
Concatenate生成Features列
你需要把Concatenate生成Features列的步骤,放到所有需要使用该列的训练器之前。
其他关联问题
- 标签列名不匹配:你前面通过
MapValueToKey生成的标签列名为Labels,但后续多分类训练器SdcaMaximumEntropy传入的标签列参数为Label,拼写不一致,修复Features问题后还会触发标签列找不到的报错。 - 冗余训练器逻辑:如果你最终的训练目标是基于
Subject字段的多分类任务,那么预训练管道中加入的二分类训练器SdcaLogisticRegression是多余的,还会改变管道输出的结构,建议删除。
修正后代码示例
修正后的预训练处理管道
static IEstimator<ITransformer> Subject_ProcessData() { var subjectModel = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Subject", outputColumnName: "Label") .Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Text", outputColumnName: "TextFeaturized")) // 先拼接生成Features列,再给训练器使用 .Append(_mlContext.Transforms.Concatenate("Features", "TextFeaturized")) .AppendCacheCheckpoint(_mlContext); return subjectModel; }
修正后的训练执行代码
var pipeline = Subject_ProcessData() .Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features")) .Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel")); var model = pipeline.Fit(_trainingDataView);
如果你需要同时保留二分类训练逻辑,也请遵循「先生成所需输入列、再调用训练器」的顺序调整管道步骤即可。
内容的提问来源于stack exchange,提问作者김미나
相关产品推荐
相关产品推荐

