结合多个参数创建SVM向量



我是scikit-learn的新手,我正在处理下面的一些数据。

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

对于单行文本,在TfidfTransformer之前的管道中有CountVectorizerDictVectorizer。可以将这些输出连接起来,我希望有以下警告:我不希望任意文本与特定的、有限的和定义良好的参数具有相同的重要性。

最后,一些其他的问题,可能与

  • 这个数据结构可能表明哪个支持向量机内核是最好的?
  • 或者随机森林/决策树,DBN或贝叶斯分类器在这种情况下可能做得更好?还是集成方法?(输出多类)
  • 我看到有一个即将到来的特征联合功能,但这是在相同的数据上运行不同的方法并组合它们。
  • 应该使用特征选择吗?

参见:

    在NLTK中实现词袋朴素贝叶斯分类器
  • 在scikit-learn中结合特征提取类
  • http://scikit-learn.org/dev/modules/label_propagation.html

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

  • DictVectorizer不是用于处理"文本行",而是用于处理任意的符号特征。
  • CountVectorizer也不是用于处理行,而是用于整个文本文档。
  • 特征是否"同等重要"主要取决于学习算法,尽管使用核支持向量机,您可以人为地为特征分配较小的权重,以使其点积不同。不过,我并不是说这是个好主意。
有两种方法可以处理这类数据:
  1. 构建一个FeatureUnion,其中CountVectorizer(或TfidfVectorizer)用于文本数据,DictVectorizer用于附加功能。
  2. 手动将文本数据分割成单词,然后将每个单词作为DictVectorizer中的一个特征,例如

    {"string:some": True, "string:arbitrary": True, "string:text": True,
     "label1": "orange", "value1" : False }
    

然后是相关问题:

  • 这个数据结构可能表明哪个支持向量机内核是最好的?

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

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

不尝试是不可能知道的。不幸的是,Scikit-learn的随机森林和d树不能处理稀疏矩阵,因此它们很难应用。未实现dbn

  • 应该使用特征选择吗?

没有看到数据是无法判断的。

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

最新更新