我是scikit-learn的新手,我正在处理下面的一些数据。
data[0] = {"string": "some arbitrary text", "label1": "orange", "value1" : False }
data[0] = {"string": "some other arbitrary text", "label1": "red", "value1" : True }
对于单行文本,在TfidfTransformer
之前的管道中有CountVectorizer
和DictVectorizer
。可以将这些输出连接起来,我希望有以下警告:我不希望任意文本与特定的、有限的和定义良好的参数具有相同的重要性。
最后,一些其他的问题,可能与
- 这个数据结构可能表明哪个支持向量机内核是最好的? 或者随机森林/决策树,DBN或贝叶斯分类器在这种情况下可能做得更好?还是集成方法?(输出多类)
- 我看到有一个即将到来的特征联合功能,但这是在相同的数据上运行不同的方法并组合它们。
- 应该使用特征选择吗?
参见:
- 在NLTK中实现词袋朴素贝叶斯分类器
- 在scikit-learn中结合特征提取类
- http://scikit-learn.org/dev/modules/label_propagation.html
scikit-learn(*)中的所有分类器都期望样本的平面特征表示,因此您可能希望将string
特征转换为向量。首先,让我们排除一些不正确的假设:
-
DictVectorizer
不是用于处理"文本行",而是用于处理任意的符号特征。 -
CountVectorizer
也不是用于处理行,而是用于整个文本文档。 - 特征是否"同等重要"主要取决于学习算法,尽管使用核支持向量机,您可以人为地为特征分配较小的权重,以使其点积不同。不过,我并不是说这是个好主意。
- 构建一个
FeatureUnion
,其中CountVectorizer
(或TfidfVectorizer
)用于文本数据,DictVectorizer
用于附加功能。 手动将文本数据分割成单词,然后将每个单词作为
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,如果你实现自定义内核,这是一个非常高级的主题,我现在不会讨论它。