首页 > 解决方案 > ML.NET 中的多标签分类

问题描述

我希望使用 ML.NET 实现多标签分类。我读了几篇文章说这是不可能的,而是通过将问题转换为多个二进制分类问题来实现的。所以本质上,如果我的数据集有标签,我将需要创建n分类器。n我试图通过明智地拆分我的数据集标签来做到这一点。但是fit方法抛出异常。我正在传递标签列的值,就像1给定标签的所有条目一样。

System.ArgumentOutOfRangeException:'必须至少为 2。参数名称:numClasses'

这可以通过添加具有特定标签的1条目和所有其他条目来解决,0但由于每个标签的条目数量较少,我认为这会稀释学习并可能导致准确性降低。

有人可以建议任何其他方法来使用 ML.NET 实现多标签分类吗?

标签: c#machine-learningmultilabel-classificationml.net

解决方案


创建 N 个布尔列。示例命名模式:Label01、Label02、...LabelNN。

训练管道,添加 N 组:(每个布尔标签一个)

.Append(mlContext.BinaryClassification.Trainers.LightGbm(labelColumnName: "Label01", featureColumnName: "Features"))
.Append(mlContext.Transforms.CopyColumns("Score01", "Score")) // Copy to a unique name so the following models won't shadow (replace) the column. PredictedLabel column can also be saved.              

.Append(mlContext.BinaryClassification.Trainers.LightGbm(labelColumnName: "Label02", featureColumnName: "Features"))
.Append(mlContext.Transforms.CopyColumns("Score02", "Score"))

...

.Append(mlContext.BinaryClassification.Trainers.LightGbm(labelColumnName: "LabelNN", featureColumnName: "Features"))
.Append(mlContext.Transforms.CopyColumns("ScoreNN", "Score"))  

然后.fit()正常调用。管道中的所有模型都将适合。然后,您可以访问每个 ScoreXX 列以获取每个班级的分数。

要评估每个模型的质量,您可以从每个分数列与它们的输入 LabelXX 列创建指标。


推荐阅读