sklearn:朴素贝叶斯分类器的准确性低

Posted

技术标签:

【中文标题】sklearn:朴素贝叶斯分类器的准确性低【英文标题】:sklearn: Naive Bayes classifier gives low accuracy 【发布时间】:2017-03-24 23:20:25 【问题描述】:

我有一个数据集,其中包含 200000 个标记的训练示例。 对于每个训练示例,我有 10 个特征,包括连续的和离散的。 我正在尝试使用sklearn python 包来训练模型并进行预测,但我遇到了一些麻烦(还有一些问题)。

首先让我写一下我到目前为止写的代码:

from sklearn.naive_bayes import GaussianNB
# data contains the 200 000 examples
# targets contain the corresponding labels for each training example
gnb = GaussianNB()
gnb.fit(data, targets)
predicted = gnb.predict(data)

问题是我的准确率非常低(错误分类的标签太多)——大约 20%。 但是,我不太确定数据(例如需要更多数据或其他)或代码是否存在问题。

在给定具有离散和连续特征的数据集的情况下,这是实现朴素贝叶斯分类器的正确方法吗?

此外,在机器学习中,我们知道数据集应该分为训练集和验证/测试集。这是由sklearn 自动执行的,还是我应该使用训练数据集fit 模型,然后使用验证集调用predict

任何想法或建议将不胜感激。

【问题讨论】:

训练/测试拆分不会自动完成,但有许多内置功能可让您轻松完成。 看看cross validation的slearn函数 另一方面,您正在将模型拟合到所有数据,因此在预测相同数据时会期望相对较高的准确性。您可能想研究调整模型的超参数(请参阅sklearn's page on parameter tuning 向我们提供您的代码和数据示例 【参考方案1】:

问题是我的准确率非常低(错误分类的标签太多)——大约 20%。但是我不太确定数据(例如需要更多数据或其他)或代码是否存在问题。

对于朴素贝叶斯来说这不是大错误,这是一个非常简单的分类器,你不应该期望它很强大,更多的数据可能无济于事。您的高斯估计器可能已经非常好,只是简单的假设是问题所在。使用更强的模型。您可以从 Random Forest 开始,因为即使非该领域的专家也很容易使用它。

在给定具有离散和连续特征的数据集的情况下,这是实现朴素贝叶斯分类器的正确方法吗?

不,不是,您应该在离散特征中使用不同的分布,但是 scikit-learn 不支持,您必须手动执行此操作。如前所述 - 更改您的模型。

此外,在机器学习中,我们知道数据集应该分为训练集和验证/测试集。这是由 sklearn 自动执行的,还是我应该使用训练数据集拟合模型,然后使用验证集调用 predict?

这种方式不会自动完成,您需要自己完成(scikit learn 有很多工具可以做到这一点 - 请参阅交叉验证包)。

【讨论】:

我想测试多个模型,以便使用各种算法进行一些预测并生成报告。我上面提到的 20% 是准确率,而不是错误分类的预测。顺便说一下,你提到我需要离散特征中的不同分布。你能告诉我我该怎么做(甚至手动)。 不幸的是,朴素贝叶斯仍然可以做到这一点。你们那里有几节课?

以上是关于sklearn:朴素贝叶斯分类器的准确性低的主要内容,如果未能解决你的问题,请参考以下文章

性能:提高朴素贝叶斯分类器的准确性

Sklearn 中的朴素贝叶斯分类器

朴素贝叶斯分类器

分类器的选择

朴素贝叶斯分类算法的sklearn实现

sklearn-朴素贝叶斯