编程语言
首页 > 编程语言> > python-如何合并多个朴素贝叶斯分类器的输出?

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

作者:互联网

我是新来的.

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

我的问题是如何结合每个NBC的输出来做出最终决定.我希望我的决定是概率而不是标签.

我在python中制作了以下程序.我假设来自sklean的虹膜数据集的2类问题.为了进行演示/学习,我按如下方法制作了4个NBC.

from sklearn import datasets
from sklearn.naive_bayes import GaussianNB

import numpy as np
import cPickle
import math

iris = datasets.load_iris()

gnb1 = GaussianNB()
gnb2 = GaussianNB()
gnb3 = GaussianNB()
gnb4 = GaussianNB()

#Actual dataset is of 3 class I just made it into 2 class for this demo
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 = 0
y_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 

 # I just added it over all for each class
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 pos
print neg

您会注意到,我只是简单地将每个NBC的概率添加为最终得分.我想知道这是否正确?

如果我没有做错,请您提出一些建议,以便我纠正自己.

解决方法:

首先-为什么要这样做?您应该在这里拥有一个朴素贝叶斯,而不是每个功能一个.您似乎不了解分类器的概念.您所做的实际上是Naive Bayes在内部所做的事情-它独立对待每个功能,但是由于这些是概率,因此您应该将它们相乘或加对数,因此:

>您应该只有一个NB,gnb.fit(iris.data,目标)
>如果您坚持要拥有多个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直接获取对数.

但是,这种方法有一个错误-朴素贝叶斯也将在每个概率中包含pre,因此您的分布将非常不对称.所以你必须手动归一化

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”选项.

标签:bayesian,scikit-learn,machine-learning,artificial-intelligence,python
来源: https://codeday.me/bug/20191119/2036619.html