如何组合多个朴素贝叶斯分类器的输出?

我对此很新手。

我使用Sklearn工具包中的朴素贝叶斯分类器(NBC)构建了一组弱分类器。

我的问题是如何组合每个NBC的输出以做出最终决策。我希望我的决策是以概率形式而不是标签形式给出的。

我用Python编写了以下程序。我假设使用sklearn中的iris数据集进行二分类问题。为了演示/学习,我创建了4个NBC如下。

from sklearn import datasetsfrom sklearn.naive_bayes import GaussianNBimport numpy as npimport cPickleimport mathiris = datasets.load_iris()gnb1 = GaussianNB()gnb2 = GaussianNB()gnb3 = GaussianNB()gnb4 = GaussianNB()#实际数据集是3类,我只是为了这个演示将其简化为2类target = np.where(iris.target, 2, 1)gnb1.fit(iris.data[:, 0].reshape(150,1), target)gnb2.fit(iris.data[:, 1].reshape(150,1), target)gnb3.fit(iris.data[:, 2].reshape(150,1), target)gnb4.fit(iris.data[:, 3].reshape(150,1), target)#y_pred = gnb.predict(iris.data)index = 0y_prob1 = gnb1.predict_proba(iris.data[index,0].reshape(1,1))y_prob2 = gnb2.predict_proba(iris.data[index,1].reshape(1,1))y_prob3 = gnb3.predict_proba(iris.data[index,2].reshape(1,1))y_prob4 = gnb4.predict_proba(iris.data[index,3].reshape(1,1))#print y_prob1, "\n", y_prob2, "\n", y_prob3, "\n", y_prob4  # 我只是将每个类别的概率相加作为最终得分pos = y_prob1[:,1] + y_prob2[:,1] + y_prob3[:,1] + y_prob4[:,1]neg = y_prob1[:,0] + y_prob2[:,0] + y_prob3[:,0] + y_prob4[:,0]print posprint neg

如你所见,我只是简单地将每个NBC的概率相加作为最终得分。我想知道这样做是否正确?

如果我做错了,请你提出一些建议,以便我可以改正自己。


回答:

首先 – 为什么要这样做?你应该在这里使用一个朴素贝叶斯分类器,而不是每个特征一个。你看起来并不理解分类器的概念。你所做的是朴素贝叶斯内部正在做的事情 – 它独立处理每个特征,但由于这些是概率,你应该相乘它们,或者相加对数,所以:

  1. 你应该只使用一个NB,gnb.fit(iris.data, target)
  2. 如果你坚持要使用多个NB,你应该通过相乘或相加对数来合并它们(从数学角度来看这是相同的,但相乘在数值上不太稳定)

    pos = y_prob1[:,1] * y_prob2[:,1] * y_prob3[:,1] * y_prob4[:,1]

    或者

    pos = np.exp(np.log(y_prob1[:,1]) + np.log(y_prob2[:,1]) + np.log(y_prob3[:,1]) + np.log(y_prob4[:,1]))

    你也可以直接通过gnb.predict_log_proba而不是gbn.predict_proba来预测对数。

    然而,这种方法有一个错误 – 朴素贝叶斯会在你的每个概率中包含先验概率,因此你会得到非常偏斜的分布。所以你必须手动进行归一化

    pos_prior = gnb1.class_prior_[1] # 所有模型都有相同的先验概率,所以我们可以使用gnb1的

    pos = pos_prior_ * (y_prob1[:,1]/pos_prior_) * (y_prob2[:,1]/pos_prior_) * (y_prob3[:,1]/pos_prior_) * (y_prob4[:,1]/pos_prior_)

    这可以简化为

    pos = y_prob1[:,1] * y_prob2[:,1] * y_prob3[:,1] * y_prob4[:,1] / pos_prior_**3

    而对于对数来说是

    pos = ... - 3 * np.log(pos_prior_)

    所以再次强调 – 你应该使用“1”选项。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注