提问者:小点点

如何在实践中使用TfidfVectorzer加上元数据进行分类?


我正在尝试将一些文档分为两类,其中使用TfidfVectorizer作为特征提取技术。

输入数据由数据行组成,其中包含十几个字段的浮点数据、标签和文档正文的文本块。为了使用主体,我应用了TFIDFvectorier并得到了一个稀疏矩阵(我可以通过toarray()转换为数组来检查)。这个矩阵通常非常大,千乘千维,我们称之为F,它的大小为1000 x 15000。

为了在Scikit中使用分类器,我给它一个输入矩阵X,它是(行数*特征数)。如果我不使用身体,我可能有一个大小为1000×15的X。

问题就在这里,假设我将这个F水平叠加到X上,那么X将变成1000 X 15015,这就带来了一些问题:1)前15个特性现在起的作用很小;2) 内存不足;

Scikit提供了一个仅使用TfidfVectorzer输入的示例,但没有说明如何在元数据旁边使用它。

我的问题是:如何使用TfidfVectorizer输出和元数据来适应分类器进行培训?

谢谢你。


共3个答案

匿名用户

>

提取元数据功能,调用这些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描述符与其他类型的数据合并的通用方法,一切都取决于您特定的模型和数据:

  • 有些模型设计用于处理具有任意尺度的数据,因此-它们使用最强的预测值,不管它们是否仅占整个特征向量的1%。一些决策树信息标准可以作为此类方法的一个很好的例子
  • 一些模型允许您直接“加权”特征,使其比其他模型更重要,因此您可以包含一些专家知识,以便使用大型非元部分对元数据进行加权,例如N_not_meta/N_meta scale,其中N_x是x型特征维度的数量。支持向量机可以让你做这样的事情,因为它们是依赖于比例的线性模型,所以简单的特征重缩放可以产生这样的效果。同样,在概率模型(如朴素贝叶斯)中,您可以通过将其各自的“概率估计数”乘以某个预定义因子来强制某些预测值“强”
  • 更高级的方法是创建一组分类器-一个用于元数据,一个用于tfidf和一些元分类器(因为两个模型的投票方案相当无用),并根据其输出进行训练
  • 您还可以通过执行一些降维方法(例如PCA)简单地降低第二部分的维数

具体方法的选择是针对具体问题的,但正如您所看到的,有很多可能性,不可能简单地选择“最佳方法”。

对于内存不足的问题,您应该考虑稀疏表示,这在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)的主题模型在文本分类中很常见。