SVM 机器学习:LibSVM 中的特征表示

SVM Machine Learning: Feature representation in LibSVM

我正在使用 Libsvm 对书面文本进行分类。 (性别分类)

我在理解如何创建具有多个特征的 Libsvm 训练数据时遇到问题。

Libsvm 中的训练数据是这样构建的:

label index1:value1 index2:value2 

假设我想要这些功能:

例如,计数将如下所示:

               Word count             Bigram count
         |-----|-----------|         |-----|-----------|
         |word |   counts  |         |bigra|   counts  |
         |-----|-----|-----|         |-----|-----|-----|
  index  |text | +1  | -1  |  index  |text | +1  | -1  |
         |-----|-----|-----|         |-----|-----|-----|
      1  |this | 3   | 3   |      4  |bi   | 6   | 2   |
      2  |forum| 1   | 0   |      5  |gr   | 10  | 3   |
      3  |is   | 10  | 12  |      6  |am   | 8   | 10  |
         |...  | ..  | ..  |         |..   | ..  | ..  |
         |-----|-----|-----|         |-----|-----|-----|

假设 k = 2,这是训练实例的样子吗?(计数与之前无关)

Label Top_kWords1:33 Top_kWords2:27 Top_kBigrams1:30 Top_kBigrams2:25

还是看起来像这样(特征混在一起有关系吗)?

Label Top_kWords1:33 Top_kBigrams1:30 Top_kWords2:27  Top_kBigrams2:25

我只是想知道具有多个不同特征的特征向量看起来如何以及如何实现。

编辑:

根据上面更新的table,这个训练数据是否正确?:

例子

 1 1:3 2:1 3:10 4:6 5:10 6:8
-1 1:3 2:0 3:12 4:2 5:3  6:10 

libSVM 表示是纯数字,所以

label index1:value1 index2:value2 

表示每个"label"、"index"和"value"必须是。在您的情况下,您必须枚举您的功能,例如

 1 1:23 2:47 3:0 4:1

如果某些特征的值为 0,则可以省略它

 1 1:23 2:47 4:1

记得按升序保留特征。

一般来说,libSVM 不是为处理文本而设计的,我不建议你这样做——而是使用一些已经存在的库,这些库可以使处理文本变得容易和环绕 libsvm(例如 NLTK or scikit-learn

您用于训练的任何 k most words/bigrams 在您的测试集中可能不是最受欢迎的。如果您想使用英语中最流行的词,您将以 theand 等结尾。 Maybee beerfootball 即使不太受欢迎,也更适合分类男性。此过程步骤称为 feature selection,与 SVM 无关。当您发现选择性特征(啤酒、肉毒杆菌素……)时,您会枚举它们并将它们填充到 SVM 训练中。

对于二元组,您也许可以省略特征选择,因为最多有 26*26=676 个二元组产生 676 个特征。但是我再次假设像 be 这样的二元组没有选择性,因为 beer 中的选择性匹配完全被埋没在 to be 中的许多匹配中。但那是推测,你必须学习你的特征质量。

此外,如果您使用 word/bigram 计数,您应该将它们归一化,即。 e.除以文档的总数 word/bigram。否则你的训练集中较短的文档将比较大的文档具有更小的权重。