我使用以下代码创建了我的机器学习模型。模型的准确率为0.76。我只是很好奇知道测试数据中哪些记录失败了?有什么方法可以查看这些数据吗?
// 1. 加载用于训练和测试的数据集 var trainData = ctx.Data.LoadFromTextFile<SentimentData>(trainDataPath, hasHeader: true); var testData = ctx.Data.LoadFromTextFile<SentimentData>(testDataPath, hasHeader: true); // 2. 构建一个转换器/估计器来转换输入数据,以便机器学习算法能够理解 IEstimator<ITransformer> estimator = ctx.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.Text)); // 3. - 设置训练算法并为模型构建器创建管道 var trainer = ctx.BinaryClassification.Trainers.SdcaLogisticRegression(); var trainingPipeline = estimator.Append(trainer); // 4. - 训练模型 var trainedModel = trainingPipeline.Fit(trainData); // 5. - 对测试数据进行预测 var predictions = trainedModel.Transform(testData); // 6. - 评估模型 var metrics = ctx.BinaryClassification.Evaluate(data: predictions);
回答:
通过使用GetColumn
和CreateEnumerable
方法,你可以找到模型未能正确预测的数据。
在你获取度量标准后,使用GetColumn
方法从测试数据集的预测中获取原始标签值。然后,使用CreateEnumerable
方法获取包含预测值的预测。你也可以选择获取情感文本。
var originalLabels = predictions.GetColumn<bool>("Label").ToArray();var sentimentText = predictions.GetColumn<string>(nameof(SentimentData.SentimentText)).ToArray();var predictedLabels = context.Data.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject: false).ToArray();
获取数据后,只需遍历其中一个(我统计了原始标签的数量),你就可以在每次迭代时访问数据。从那里你可以检查实际标签是否不等于预测值,以仅打印出模型未能正确预测的值。
for (int i = 0; i < originalLabels.Count(); i++){ string outputText = String.Empty; if (originalLabels[i] != predictedLabels[i].Prediction) { outputText = $"Text - {sentimentText[i]} | "; outputText += $"Original - {originalLabels[i]} | "; outputText += $"Predicted - {predictedLabels[i].Prediction}"; Console.WriteLine(outputText); }}
这样你就有了所需的数据。:)
希望这对你有帮助!