LIBSVM 的多类表示

multiclass representation of LIBSVM

我的目标是制作一个 multiclass classifier,以处理不同的文件,这些文件将至少标记两个 classes(或标签)。这些文件是议会倡议,因此每个文件都将以至少一对值在同义词库中编制索引。

我在 python 版本中使用“libsvm”,因为在 python 中删除停用词、标记化和词干化似乎更容易,这要归功于 Snowball、NLTK 等工具...

这个版本不能直接使用多class化
但是,可以编写一个 multiclass classifier 模型,生成总共 k * (k-1) / 2(其中 'k' 是 class 的数量es)。

LIBSVM 的表示是:

<class/target>[ <attribute number>:<attribute value>]*   

那么对于一个有 5 个 class 的文件,我是否应该只改变 class 生成前一行的 5 倍?

例如:

1 1:3 2:4 6:5....
2 1:3 2:4 6:5....
3 1:3 2:4 6:5....
4 1:3 2:4 6:5….
5 1:3 2:4 6:5….

感谢和问候。

你搞糊涂了

  • 多类场景 - 通常有超过 2 个 类,但每个对象都被分配 恰好一个
  • 多标签场景 - 每个对象分配了多个标签

SVM 在其基本 formulation/implementation 中无法完成上述任何一项。虽然这两个问题都可以轻松分解。

通常使用一对一或一对一来处理第一个,两者都在 scikit-learn 中实现,其中您 python 绑定到 libsvm。

您的场景看起来很像 multilabel,在这种情况下,基本 svm 可以 通过将您的问题拆分为 K 个独立问题来使用,只需创建 K 个不同的训练集,每个都回答问题 "Does given file have label i?" 并训练 K 个不同的 SVM,每个只给你一个答案(我们假设标记过程是独立的,这是一种简化,但其他方法会需要结构 SVM 方法,例如 svmstruct 中可用的方法)。

不能为多标签分类创建单个 libsvm 训练文件。您引用的文档是指 multiclass不是您的情况,只需要使用 K 个不同的标签名称,而不是复制行。