组合多个参数以创建SVM向量

时间:2013-04-01 09:14:54

标签: python svm scikit-learn

scikit-learn新手,我正在处理以下数据。

data[0] = {"string": "some arbitrary text", "label1": "orange", "value1" : False }
data[0] = {"string": "some other arbitrary text", "label1": "red", "value1" : True }

对于单行文本,CountVectorizer之前的管道中有DictVectorizerTfidfTransformer。这些的输出可以连接起来,我希望有以下警告:任意文本我不希望在特定的,有限的和明确定义的参数上相同。

最后,还有其他一些问题,可能是相关的

  • 这个数据结构可能表明哪个SVM内核最好?
  • 或者,在这种情况下,随机森林/决策树,DBN或贝叶斯分类器可能会做得更好吗?或Ensemble method? (输出为multi-class
  • 我看到feature union即将推出的功能,但这是针对相同的数据运行不同的方法并将它们组合在一起。
  • 我应该使用feature selection吗?

另见:

1 个答案:

答案 0 :(得分:1)

scikit-learn(*)中的所有分类器都需要样本的平面特征表示,因此您可能希望将string特征转换为矢量。首先,让我们做一些不正确的假设:

  • DictVectorizer不是用于处理“文本行”,而是用于处理任意符号功能。
  • CountVectorizer也不是用于处理行,而是用于整个文本文档。
  • 功能是否“重要性相同”主要取决于学习算法,尽管使用内核SVM,您可以为功能分配人为的小权重,以使其点产品以不同方式呈现。不过,我不是说这是个好主意。

有两种处理此类数据的方法:

  1. 为您的文字数据构建FeatureUnion CountVectorizer(或TfidfVectorizer},并为其他功能构建DictVectorizer
  2. 手动将文本数据拆分为单词,然后将每个单词用作DictVectorizer中的一项功能,例如

    {"string:some": True, "string:arbitrary": True, "string:text": True,
     "label1": "orange", "value1" : False }
    
  3. 然后是相关问题:

    • 这个数据结构可能表明哪个SVM内核最好?

    由于您正在处理文本数据,因此首先尝试LinearSVC,如果不起作用,请尝试2级多项式内核。 RBF内核与文本数据不匹配,而立方或更高阶的多内核往往会过度配合。作为内核的替代方案,您可以手动构建单个特征的产品并在其上训练LinearSVC;有时,这比内核更好。它还消除了要素重要性问题,因为LinearSVC学习了每个要素的权重。

    • 或者,在这种情况下,随机森林/决策树,DBN或贝叶斯分类器可能会做得更好吗?

    如果不尝试,这是不可能的。不幸的是,scikit-learn的随机森林和dtree不处理稀疏矩阵,所以它们很难应用。 DBN未实现。

    • 我应该使用功能选择吗?

    在没有看到数据的情况下无法判断。

    (*)除了SVM,如果你实现自定义内核,这是一个高级主题,我现在不讨论它。