我正在尝试将一些文档分为两类,其中使用TfidfVectorizer作为特征提取技术。
输入数据由数据行组成,其中包含十几个字段的浮点数据、标签和文档正文的文本块。为了使用主体,我应用了TFIDFvectorier并得到了一个稀疏矩阵(我可以通过toarray()转换为数组来检查)。这个矩阵通常非常大,千乘千维,我们称之为F,它的大小为1000 x 15000。
为了在Scikit中使用分类器,我给它一个输入矩阵X,它是(行数*特征数)。如果我不使用身体,我可能有一个大小为1000×15的X。
问题就在这里,假设我将这个F水平叠加到X上,那么X将变成1000 X 15015,这就带来了一些问题:1)前15个特性现在起的作用很小;2) 内存不足;
Scikit提供了一个仅使用TfidfVectorzer输入的示例,但没有说明如何在元数据旁边使用它。
我的问题是:如何使用TfidfVectorizer输出和元数据来适应分类器进行培训?
谢谢你。
>
提取元数据功能,调用这些X\u元数据
。
将它们堆叠在一起:
X = scipy.sparse.hstack([X_tfidf, X_metadata])
如果它不按预期工作,请尝试重新正常化:
from sklearn.preprocessing import normalize
X = normalize(X, copy=False)
如果您使用线性估计器,如LinearSVC
、逻辑回归
或SGD分类器
,您不应该担心特征在分类中的作用;这是估计器的工作。线性估计器为每个单独的特征分配一个权重,告诉特征的信息量,也就是说,他们会为你解决这个问题。
(非参数、基于距离/相似性的模型,如核支持向量机或k-NN,在此类数据集上可能会比较困难。)
没有将tf-idf描述符与其他类型的数据合并的通用方法,一切都取决于您特定的模型和数据:
具体方法的选择是针对具体问题的,但正如您所看到的,有很多可能性,不可能简单地选择“最佳方法”。
对于内存不足的问题,您应该考虑稀疏表示,这在ScKIT学习中是可用的。对于NLP数据来说,这是一个很好的选择,因为文档往往具有非常稀疏的特征向量。
一种可能的解决方案是使用主题模型(如sklearn.decomposition.NMF)执行X_tfidf
的语义投影。
这允许输入稀疏矩阵,并输出一组非稀疏和小尺寸的特征。因此,这克服了上述答案中提到的两个问题(稀疏输入和有限内存)。
将X_tfidf
矢量投影到20-D特征矢量的示例:
nmf = NMF(n_components=20)
nmf.fit(data)
X_transformed = nmf.transform(X_tf_idf)
这里的数据是指为适应因式分解模型而给出的任何一组特征(理想情况下,一组保留的特征)。
然后您就可以安全地将其与其他功能合并
X = scipy.sparse.hstack([X_transfored, X_metadata])
其他预测是可能的,如主成分分析,但通过矩阵分解(如NMF或SVD)的主题模型在文本分类中很常见。