machine-learning - 在实践中如何使用 TfidfVectorizer 加元数据进行分类?

标签 machine-learning classification scikit-learn tf-idf

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

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

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

问题来了,假设我将这个 F 水平堆叠到 X 上,那么 X 将变成 1000 x 15015,这会引入一些问题: 1) 前 15 个功能现在发挥的作用很小; 2)内存不足;

Scikit 提供了一个仅使用 TfidfVectorizer 输入的示例,但没有说明如何与元数据一起使用它。

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

谢谢。

最佳答案

  1. 提取词袋 (tf-idf) 特征,将其命名为 X_tfidf

  2. 提取元数据特征,将其命名为X_metadata

  3. 将它们堆叠在一起:

    X = scipy.sparse.hstack([X_tfidf, X_metadata])
    
  4. 如果它没有按预期工作,请尝试重新规范化:

    from sklearn.preprocessing import normalize
    X = normalize(X, copy=False)
    

如果您使用线性估计器,例如 LinearSVCLogisticRegressionSGDClassifier,则不必担心特征在分类;这是估算器的工作。线性估计器为每个单独的特征分配一个权重,以说明该特征的信息量,即他们为您计算出这一点。

(非参数、基于距离/相似性的模型,例如内核 SVM 或 k-NN,在此类数据集上可能会遇到困难。)

关于machine-learning - 在实践中如何使用 TfidfVectorizer 加元数据进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19466868/

相关文章:

matlab - K-Means 的内部运算

python - 值错误: 'max' is not a supported norm

class - 需要有关 Matlab 多类分类器的帮助

r - 使用neuralnet和ROCR包绘制神经网络曲线

machine-learning - 如何使用Knime对文本进行分类

python - 在 ngrams 上训练朴素贝叶斯分类器

machine-learning - 使用 TensorFlow 1.2.1 和 InceptionV3 对图像进行分类

python - float 上的 += 运算符返回一个空的 numpy 数组,而不是抛出 TypeError

python - 导入 sklearn 时出现段错误

python - 为什么我使用更好的处理器后 GridSearchCV().fit() 运行速度变慢?