朴素贝叶斯看不见的功能处理scikit学习

时间:2016-05-08 21:41:32

标签: machine-learning scikit-learn text-classification naivebayes

我正在使用Naive Bayes(MultinominalNB)在scikit-learn中对小文本(推文)进行分类。 我的列车数据有1000个功能,我的测试数据有1200个功能。 我们假设列车和测试数据共有500个功能。

我想知道为什么MultinominalNB在scikit学习中无法处理看不见的功能,并给我一个错误:

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

1 个答案:

答案 0 :(得分:2)

它不会处理看不见的功能,因为您没有传递任何参考命名功能。为什么一个案例有1200个特征而另一个案例有1000个特征?可能是因为测试环境中的对象没有出现在训练中 - 但Naive Bayes应该如何确定1000中哪些1200缺失?在这个实现中(当你假设数组作为输入时,这是唯一可能的),你有责任删除所有与训练集中的列不对应的列,如果它是,则添加零列(在有效点中)另一种方式,最重要的是 - 确保&#34; ith&#34;一组中的列与#34; ith&#34;相同(捕获相同单词/对象的出现);列中的第二个。因此,在您的情况下,实际上只有500列可以使用,Naive Bayes没有关于如何找到它们的信息。在测试场景中,您必须提供在列车中使用的相同1000个功能,因此在您的情况下,它意味着删除列车期间未见的700列,并添加(在有效位置!)500列零。

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