ML.NET 显示哪个分数与哪个标签相关



有了 ML.Net,我正在使用分类器进行文本解释。预测的分数列为 float[] 和预测标签。这适用于最高分数与预测标签相关,但其他分数只是没有特定顺序的浮动。我如何知道哪个分数与哪个标签相关?如何查看第二高的加权标签?

例如,我得到这个: 0.00005009 0.00893076 0.1274763 0.6209787 0.2425644

0.6 是我的预测标签,但我还需要看看 0.24 是哪个标签,这样我才能明白为什么它被混淆了。

标签是文本字符串,例如"问候语"或"笑话",它们在管道中被字典化,所以也许这就是为什么它们没有正确的顺序?

ML.Net 有什么办法将两者联系在一起吗?显示哪个分数与哪个标签相关?

对于较新的版本,这个版本可以解决问题,因为TryGetScoreLabelNames已被删除:

var scoreEntries = GetSlotNames(predictor.OutputSchema, "Score");
...
private static List<string> GetSlotNames(DataViewSchema schema, string name)
{
var column = schema.GetColumnOrNull(name);
var slotNames = new VBuffer<ReadOnlyMemory<char>>();
column.Value.GetSlotNames(ref slotNames);
var names = new string[slotNames.Length];
var num = 0;
foreach (var denseValue in slotNames.DenseValues())
{
names[num++] = denseValue.ToString();
}
return names.ToList();
}

(来源:http://www.programmersought.com/article/3762753756/(

当然,这需要更多的错误处理等。

您可以使用以下代码获取与分数对应的标签:

string[] scoreLabels;
model.TryGetScoreLabelNames(out scoreLabels);

其他详细信息可在此处和此处找到。

请注意,这可能会随着即将推出的 ML.NET 0.6 API 而改变。这些 API 将直接公开Schema,并启用获取此信息(以及其他有用信息(。这可能类似于TryGetScoreLabelNames今天的工作方式。

由于@Samuel的代码片段不适用于我得到的MulticlassClassificatoinMetrics,以下是对我有用的:

public static string[] GetSlotNames(this DataViewSchema schema)
{
VBuffer<ReadOnlyMemory<char>> buf = default;
schema["Score"].Annotations.GetValue("SlotNames", ref buf);
return buf.DenseValues().Select(x => x.ToString()).ToArray();
}

schema取自使用学习模型转换训练/验证数据时获得的IDataView

var dataView = _mlContext.Data.LoadFromEnumerable(validationSet.Data);
var features = _featureExtractor.Transform(dataView);
var predictions = _learnedModel.Transform(features);
var classLabels = predictions.Schema.GetSlotNames(),

我正在使用Microsoft.ML 1.5.5

从构建管道的角度就可以避免此问题。确保一个热编码或特征化列具有不同的列名称。输入列和输出列仍将存在于 DataView 中,因此您只需适当地构建输出模型即可。

例如:

构建管道时

var pipeline = mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "label_hotencoded", inputColumnName: "label")
// Append other processing in the pipeline 
.Append(...)
// Ensure that you override the default name("label") for the label column in the pipeline trainer and/or calibrator to your hot encoded label column
.Append(mlContext.BinaryClassification.Trainers.FastTree(labelColumnName: "label_hotencoded"))
.Append(mlContext.BinaryClassification.Calibrators.Platt(labelColumnName: "label_hotencoded"));

您现在可以构建输出模型 POCO 类以接收所需的值

public class OutputModel
{      
[ColumnName("label")]
public string Label{ get; set; }
[ColumnName("Score")]
public float Score{ get; set; }
}

这样,您的输出列是人类可读的,同时您向训练器输入的列格式正确。

注意:此技术也可以与数据中的其他列一起使用。只需确保在转换管道中的列时使用不同的列名称,并在连接到"功能"时传入正确的列名称。然后,可以编写输出模型类以提取所需的任何值。

仅供参考(至少在 1.7 ML.NET 版本中(,getslotnames 仅适用于文本/字符串。 如果您尝试使用单曲,它将在 GetType 上出现错误。

最新更新