ML.NET文本二分类预测异常:输入含good却返回IsGood=false,求排查
ML.NET二分类预测结果异常问题修复
问题核心
你当前的代码只完成了文本特征化的步骤,没有构建完整的二分类训练流程,模型根本没有学习到文本与标签(IsGood)之间的关联,所以预测结果完全无效。
遗漏的关键步骤
- 未将文本特征映射为模型要求的
Features列:ML.NET的分类器需要明确的Features列作为输入特征,你当前的FeaturizeText只是生成了特征,但没有命名为模型期望的列名。 - 未添加二分类算法:没有引入任何分类训练器(比如逻辑回归、决策树等),无法让模型学习正负样本的规律。
- 预测类与模型输出不匹配:
SuggestedFeedBackPredition的IsGood标注了[ColumnName("Label")],但模型预测输出的是PredictedLabel,两者不对应,导致无法正确获取预测结果。 - 未执行模型训练:当前
Fit的只是特征化管道,没有基于训练数据训练分类模型。
修正后的完整代码
1. 修正预测类与数据类
class SuggestedFeedBackPrediction { // 对应模型输出的PredictedLabel,而非原始Label [ColumnName("PredictedLabel")] public bool IsGood { get; set; } // 可选:保留Score和Probability用于查看置信度 public float Score { get; set; } public float Probability { get; set; } } public class SuggestedFeedbackTrainingData { [LoadColumn(1), ColumnName("SuggestedFeedBackText")] public string? SuggestedFeedBackText { get; set; } [LoadColumn(0), ColumnName("Label")] public bool IsGood { get; set; } }
2. 修正训练与预测逻辑
var mlContext = new MLContext(); // 加载训练数据 var mlData = mlContext.Data.LoadFromEnumerable<SuggestedFeedbackTrainingData>(suggestedFeedbackTrainingData()); // 构建完整的训练管道 var trainingPipeline = mlContext.Transforms.Text.FeaturizeText( outputColumnName: "Features", inputColumnName: nameof(SuggestedFeedbackTrainingData.SuggestedFeedBackText)) // 添加二分类训练器(这里用SDCA逻辑回归,适合文本分类场景) .Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression( labelColumnName: "Label", featureColumnName: "Features")) // 将模型输出的PredictedLabel转换为bool类型 .Append(mlContext.Transforms.Conversion.MapValueToKey( outputColumnName: "PredictedLabel", inputColumnName: "PredictedLabel")) .Append(mlContext.Transforms.Conversion.MapKeyToValue( outputColumnName: "PredictedLabel", inputColumnName: "PredictedLabel")); // 训练模型 ITransformer model = trainingPipeline.Fit(mlData); // 创建预测引擎 var predictionsObj = mlContext.Model.CreatePredictionEngine<SuggestedFeedbackTrainingData, SuggestedFeedBackPrediction>(model); // 测试输入 var testInput = new SuggestedFeedbackTrainingData() { SuggestedFeedBackText = "this is good" }; var predictionResult = predictionsObj.Predict(testInput); var isGood = predictionResult.IsGood; // 现在会返回预期的true
3. 训练数据保持不变
public static List<SuggestedFeedbackTrainingData> suggestedFeedbackTrainingData() { List<SuggestedFeedbackTrainingData> sftd = new List<SuggestedFeedbackTrainingData>(); sftd.Add(new SuggestedFeedbackTrainingData() { SuggestedFeedBackText = "great", IsGood = true }); sftd.Add(new SuggestedFeedbackTrainingData() { SuggestedFeedBackText = "good", IsGood = true }); sftd.Add(new SuggestedFeedbackTrainingData() { SuggestedFeedBackText = "bad", IsGood = false }); sftd.Add(new SuggestedFeedbackTrainingData() { SuggestedFeedBackText = "nice", IsGood = true }); return sftd; }
额外说明
- 当前训练数据量极小,实际场景中需要更多样本才能保证模型泛化能力;
- 可以添加文本预处理步骤进一步优化特征质量:
.Append(mlContext.Transforms.Text.NormalizeText("SuggestedFeedBackText")) .Append(mlContext.Transforms.Text.RemoveDefaultStopWords("SuggestedFeedBackText"))
内容的提问来源于stack exchange,提问作者redoc01
相关产品推荐
相关产品推荐

