我正在使用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进行排序来得到第二个和其他候选者
如果您有一组静态的类,这可能是一个更好的选择,但我的情况是有一组不断增长的类。
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |