处理 scikit 学习的朴素贝叶斯看不见的特征

Naive Bayes unseen features handling scikit learn

我在 scikit-learn 中使用朴素贝叶斯 (MultinominalNB) 对小文本(推文)进行分类。 我的训练数据有 1000 个特征,我的测试数据有 1200 个特征。 假设 500 个特征对于训练数据和测试数据都是通用的。

我想知道为什么 scikit learn 中的 MultinominalNB 不处理看不见的特征,并给我一个错误:

Traceback (most recent call last):
  File "/Users/osopova/Documents/00_KSU_Masters/01_2016_Spring/Twitter_project/mda_project_1/step_4.py", line 60, in <module>
    predict_Y = classifiers[i].predict(test_X)
  File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 65, in predict
    jll = self._joint_log_likelihood(X)
  File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 672, in _joint_log_likelihood
    return (safe_sparse_dot(X, self.feature_log_prob_.T)
  File "/Library/Python/2.7/site-packages/sklearn/utils/extmath.py", line 184, in safe_sparse_dot
    return fast_dot(a, b)
ValueError: matrices are not aligned

它不处理看不见的特征,因为您没有传递任何引用命名特征。为什么一种情况下有 1200 个特征,而另一种情况下有 1000 个特征?可能是因为测试设置中有一些对象在训练中不存在——但是朴素贝叶斯应该如何找出这 1200 个中的哪些对象在 1000 个中丢失了?在此实现中(当您假设数组作为输入时,这是唯一可能的),您有责任删除所有与训练集中的列不对应的列,如果是,则添加零列(在有效位置)反过来,最重要的是 - 确保一组中的 "ith" 列与第二组中的 "ith" 列相同(捕获相同 word/object 的出现)。因此,在您的情况下,实际上只能使用 500 列,朴素贝叶斯不知道如何找到这些列。在测试场景中,您必须提供与火车中使用的相同的 1000 个功能,因此在您的情况下,这意味着删除火车期间未看到的 700 列,并添加(在有效位置!)500 列零。

特别是,scikit-learn 为您提供了大量数据预处理实用程序,它们可以为您执行此操作(例如 CountVectorizer 等)。