我想使用ML.NET实现多标签分类。我读了一些帖子,说不能直接实现,而是通过问题转换,将其转换为多个二元分类问题。因此,如果我的数据集有n
个标签,我需要创建n
个分类器。我尝试通过按标签拆分数据集来实现这一点。但是fit
方法抛出了下面的异常。我为给定标签的所有条目传递标签列的值为1
。
System.ArgumentOutOfRangeException: ‘必须至少为2。参数名称:numClasses’
这个问题可以通过为特定标签的条目添加1
,而所有其他条目为0
来解决,但由于每个标签的条目数量较少,我认为这会稀释学习并可能导致较低的准确性。
有人能建议其他方法使用ML.NET实现多标签分类吗?
回答:
创建N个布尔列。例如命名模式:Label01, Label02, …LabelNN。
训练管道,添加N组:(每组对应一个布尔标签)
.Append(mlContext.BinaryClassification.Trainers.LightGbm(labelColumnName: "Label01", featureColumnName: "Features")).Append(mlContext.Transforms.CopyColumns("Score01", "Score")) // 复制到一个独特的名称,以便后续模型不会覆盖(替换)该列。也可以保存PredictedLabel列。 .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列创建指标。