朴素贝叶斯种类
-
GaussianNB:高斯朴素贝叶斯就是先验为高斯分布(正态分布)的朴素贝叶斯。公式为:
P ( X j = x j ∣ Y = C k ) = 1 2 π σ k 2 exp ( − ( x j − μ k ) 2 2 σ k 2 ) P\left(X_{j}=x_{j} | Y=C_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{k}^{2}}} \exp \left(-\frac{\left(x_{j}-\mu_{k}\right)^{2}}{2 \sigma_{k}^{2}}\right) P(Xj=xj∣Y=Ck)=2πσk21exp(−2σk2(xj−μk)2)
-
MultinomialNB就是先验为多项式分布的朴素贝叶斯,例如某个特征表示某个词语出现的次数。公式为
P ( X j = x j l ∣ Y = C k ) = x j l + λ m k + n λ P\left(X_{j}=x_{j l} | Y=C_{k}\right)=\frac{x_{j l}+\lambda}{m_{k}+n \lambda} P(Xj=xjl∣Y=Ck)=mk+nλxjl+λ -
BernoulliNB就是先验为伯努利分布的朴素贝叶斯。假设特征的先验概率为二元伯努利分布,即如下式:
P ( X j = x j l ∣ Y = C k ) = P ( j ∣ Y = C k ) x j l + ( 1 − P ( j ∣ Y = C k ) ( 1 − x j l ) P\left(X_{j}=x_{j l} | Y=C_{k}\right)=P\left(j | Y=C_{k}\right) x_{j l}+\left(1-P\left(j | Y=C_{k}\right)\left(1-x_{j l}\right)\right. P(Xj=xjl∣Y=Ck)=P(j∣Y=Ck)xjl+(1−P(j∣Y=Ck)(1−xjl)- 一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。 - 如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。 - 而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
2.高斯朴素贝叶斯python代码实现
主要代码:
def gnb_classify(train,test):
labels = train.iloc[:,-1].value_counts().index #提取训练集的标签种类
mean =[] #存放每个类别的均值
std =[] #存放每个类别的方差
result = [] #存放测试集的预测结果
for i in labels: # labels:['Iris-versicolor', 'Iris-virginica', 'Iris-setosa']
item = train.loc[train.iloc[:,-1]==i,:] #分别提取出每一种类别
m = item.iloc[:,:-1].mean() #当前类别的平均值
s = np.sum((item.iloc[:,:-1]-m)**2)/(item.shape[0]) #当前类别的方差
mean.append(m) #将当前类别的平均值追加至列表
std.append(s) #将当前类别的方差追加至列表
means = pd.DataFrame(mean,index=labels) #变成DF格式,索引为类标签
stds = pd.DataFrame(std,index=labels) #变成DF格式,索引为类标签
for j in range(test.shape[0]):
iset = test.iloc[j,:-1].tolist() #当前测试实例
iprob = np.exp(-((iset-means)**2)/(2 * stds**2))/(stds * np.sqrt(2 * np.pi)) #正态分布公式
prob = 1 #初始化当前实例总概率
for k in range(test.shape[1]-1): #遍历每个特征
prob *= iprob[k] #特征概率之积即为当前实例概率
cla = prob.index[np.argmax(prob.values)] #返回最大概率的类别
result.append(cla)
test['predict']=result
acc = (test.iloc[:,-1]==test.iloc[:,-2]).mean() #计算预测准确率
print(f'模型预测准确率为{acc}')
数据demo: