处理 scikit learn 的朴素贝叶斯看不见的特征
Posted
技术标签:
【中文标题】处理 scikit learn 的朴素贝叶斯看不见的特征【英文标题】:Naive Bayes unseen features handling scikit learn 【发布时间】:2016-09-03 11:02:30 【问题描述】:我在 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
【问题讨论】:
【参考方案1】:它不处理看不见的功能,因为您没有传递任何参考命名功能。为什么在一种情况下有 1200 个特征,而在另一种情况下有 1000 个特征?可能是因为测试设置中的对象在训练中不存在 - 但是朴素贝叶斯应该如何找出这 1200 个中的哪些对象在 1000 个中丢失?在此实现中(当您假设数组作为输入时,这是唯一可能的),您有责任删除所有与训练集中的列不对应的列,如果是,则添加零列(在有效点)其他方式,最重要的是 - 确保一组中的“ith”列与第二组中的“ith”列相同(捕获相同单词/对象的出现)。因此,在您的情况下,实际上只有 500 列可以使用,而朴素贝叶斯没有如何找到这些列的信息。在测试场景中,您必须提供与训练中使用的相同的 1000 个特征,因此在您的情况下,这意味着删除训练期间未看到的 700 列,并添加(在有效位置!)500 列零。
特别是,scikit-learn 为您提供了大量的数据预处理实用程序,可以为您执行此操作(如 CountVectorizer 等)。
【讨论】:
以上是关于处理 scikit learn 的朴素贝叶斯看不见的特征的主要内容,如果未能解决你的问题,请参考以下文章
scikits learn 和 nltk:朴素贝叶斯分类器性能差异很大