我已经找到ML.NET的完美入门:https://www.codeproject.com/Articles/1249611/Machine-Learning-with-ML-Net-and-Csharp-VB-Net。它帮助我使用ML.NET解决了一些问题。
但是其中之一仍然是实际的:
当我向语言检测器发送一些文本时(LanguageDetection示例),我总是收到结果。即使对于非常短的文本片段,分类也不是很确定。我可以获得有关对多类分类的信心的信息吗?还是属于某个类别的概率在使用邻居句子语言的第二遍算法中使用它?
答案 0 :(得分:2)
根据@Jon的提示,我修改了CodeProject中的原始示例。可以通过以下链接找到此代码:https://github.com/sotnyk/LanguageDetector/tree/Code-for-stackoverflow-52536943
主要是(按乔恩的建议)添加字段:
public float[] Score;
进入类ClassPrediction。
如果此字段存在,我们将收到每个类别的多类别分类的概率/置信度。
但是对于原始示例,我们还有另一个困难。它使用浮点值作为类别标签。但这不是分数数组中的索引。要将分数索引映射到类别,我们应该使用TryGetScoreLabelNames方法:
if (!model.TryGetScoreLabelNames(out var scoreClassNames))
throw new Exception("Can't get score classes");
但是此方法不适用于作为浮点值的类标签。因此,我更改了原始.tsv文件和字段CategoriesData.LanguageClass和ClassPrediction.Class,以将字符串标签用作类名。
未直接提及问题主题的其他更改:
在名为Prediction的应用程序中打印的每种语言的分数。现在,这部分代码如下所示:
internal static async Task<PredictionModel<ClassificationData, ClassPrediction>> PredictAsync(
string modelPath,
IEnumerable<ClassificationData> predicts = null,
PredictionModel<ClassificationData, ClassPrediction> model = null)
{
if (model == null)
{
new LightGbmArguments();
model = await PredictionModel.ReadAsync<ClassificationData, ClassPrediction>(modelPath);
}
if (predicts == null) // do we have input to predict a result?
return model;
// Use the model to predict the positive or negative sentiment of the data.
IEnumerable<ClassPrediction> predictions = model.Predict(predicts);
Console.WriteLine();
Console.WriteLine("Classification Predictions");
Console.WriteLine("--------------------------");
// Builds pairs of (sentiment, prediction)
IEnumerable<(ClassificationData sentiment, ClassPrediction prediction)> sentimentsAndPredictions =
predicts.Zip(predictions, (sentiment, prediction) => (sentiment, prediction));
if (!model.TryGetScoreLabelNames(out var scoreClassNames))
throw new Exception("Can't get score classes");
foreach (var (sentiment, prediction) in sentimentsAndPredictions)
{
string textDisplay = sentiment.Text;
if (textDisplay.Length > 80)
textDisplay = textDisplay.Substring(0, 75) + "...";
string predictedClass = prediction.Class;
Console.WriteLine("Prediction: {0}-{1} | Test: '{2}', Scores:",
prediction.Class, predictedClass, textDisplay);
for(var l = 0; l < prediction.Score.Length; ++l)
{
Console.Write($" {l}({scoreClassNames[l]})={prediction.Score[l]}");
}
Console.WriteLine();
Console.WriteLine();
}
Console.WriteLine();
return model;
}
}