ML.Net 0.7-获取用于多类分类的分数和标签

jon*_*dow 6 c# ml.net

我正在使用ML.NET 0.7,并且具有一个带有以下结果类的MulticlassClassification模型:

public class TestClassOut
{
  public string Id { get; set; }
  public float[] Score { get; set; }
  public string PredictedLabel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想知道该Scores物业的分数和相应的标签。感觉像我应该能够使该属性成为a Tuple<string,float>或类似属性以获得得分所代表的标签。

我了解V0.5上有一种方法:

model.TryGetScoreLabelNames(out scoreLabels);
Run Code Online (Sandbox Code Playgroud)

但似乎找不到V0.7中的等效项。

能做到吗?如果是这样怎么办?

小智 1

这可能不是您正在寻找的答案,但我最终从 TryGetScoreLabelNames 复制了代码(它位于 0.7 版本的 Legacy 命名空间中),并对其进行了调整以使用输入数据中的架构。下面的 dataView 是我根据预测输入数据创建的 IDataView,这样我就可以从中获取架构。

public bool TryGetScoreLabelNames(out string[] names, string scoreColumnName = DefaultColumnNames.Score)
{
    names = (string[])null;
    Schema outputSchema = model.GetOutputSchema(dataView.Schema);
    int col = -1;
    if (!outputSchema.TryGetColumnIndex(scoreColumnName, out col))
        return false;
    int valueCount = outputSchema.GetColumnType(col).ValueCount;
    if (!outputSchema.HasSlotNames(col, valueCount))
        return false;
    VBuffer<ReadOnlyMemory<char>> vbuffer = new VBuffer<ReadOnlyMemory<char>>();
    outputSchema.GetMetadata<VBuffer<ReadOnlyMemory<char>>>("SlotNames", col, ref vbuffer);
    if (vbuffer.Length != valueCount)
        return false;
    names = new string[valueCount];
    int num = 0;
    foreach (ReadOnlyMemory<char> denseValue in vbuffer.DenseValues())
        names[num++] = denseValue.ToString();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我还在 gitter for ml.net ( https://gitter.im/dotnet/mlnet ) 中提出了这个问题,并得到了 Zruty0 的回复

我最好的建议是预先将标签转换为 0..(N-1),然后训练,然后检查生成的“分数”列。它将是一个大小为 N 的向量,包含每个类别的分数。PredictedLabel实际上只是argmax(Score),你可以通过对Score进行排序来得到第二个和其他候选者

如果您有一组静态的类,这可能是一个更好的选择,但我的情况是有一组不断增长的类。