0

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

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

对于单行文本CountVectorizerDictVectorizerTfidfTransformer. 这些的输出可以连接起来,我希望有以下警告:我不希望任意文本与特定的、有限的和明确定义的参数同等重要。

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

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

也可以看看:

4

1 回答 1

1

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

  • DictVectorizer不是用于处理“文本行”,而是用于任意符号特征。
  • CountVectorizer也不是用于处理行,而是用于整个文本文档。
  • 特征是否“同等重要”主要取决于学习算法,尽管使用核化 SVM,您可以人为地为特征分配较小的权重,以使其点积不同。不过,我并不是说这是个好主意。

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

  1. 构建一个FeatureUnionCountVectorizer(或TfidfVectorizer)组成的文本数据和DictVectorizer附加功能。
  2. 手动将文本数据拆分为单词,然后将每个单词用作 a 中的一个特征DictVectorizer,例如

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

然后是相关问题:

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

由于您正在处理文本数据,LinearSVC如果它不起作用,请尝试第一个和 2 次多项式内核。RBF 内核与文本数据不匹配,三次或更高阶的多边形内核往往会严重过度拟合。作为内核的替代方案,您可以手动构建单个特征的产品并LinearSVC在此基础上进行训练;有时,它比内核效果更好。它还消除了特征重要性问题,因为它可以LinearSVC学习每个特征的权重。

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

不尝试就无法判断。不幸的是,scikit-learn 的随机森林和 dtree 不处理稀疏矩阵,因此它们很难应用。未实施 DBN。

  • 我应该使用特征选择吗?

不看数据就无法判断。

(*) 如果您实现自定义内核,则 SVM 除外,这是一个非常高级的话题,我现在不会讨论它。

于 2013-04-01T11:10:37.913 回答