朴素贝叶斯(演示结果与SVM进行对比)

贝叶斯估定理

贝叶斯定理以18世纪英国数学家托马斯命名,如图已知先验概率P(A),再得知在A发生条件下B发生的可能性,推算出后验概率,可以看成由结果追溯原因类型问题。

在这里插入图片描述

借助战国谚语“三人成虎”例子来加深理解,皇帝一直以来对某大臣很信任,这时候出现第一个人向皇帝谏言说该大臣存在玩忽职守问题,第一次皇帝也许不信,但怀疑的种子已经发芽,接着第二个人、第三个人出现,一直向皇帝谏言该大臣有类似问题,那么皇帝最终会猜测这个人是否真的有该问题。
还有一个经典三扇门问题,三扇门有2个门里是羊,1个门有汽车,你选定1个门,但并没有打开,这个时候主持人帮答题者排除一个有羊的门,这个时候主持人问你,现在是否需要换门。
现可知,汽车在1门、2门、3门的概率记为P(Ai)=𝟏/𝟑;已经由答题者指定1门、主持人2门 记为B;当汽车在1号门条件概率𝐏(B|A1)=1/2;当汽车在2号门𝐏(B|A2)=0;当汽车在3号门𝐏(B|A3)=1/2
𝐏(A|B)=(𝐏(𝐁|𝐀)∗𝐏(𝐀))/(𝐏(𝐁))
P(B)=𝐏(B|A1)*P(A1)+𝐏(B|A2)*P(A2) + 𝐏(B|A3)*P(A3)
           =1/2*1/3+1*/2+0*1/3+1*1/3=1/2
𝐏(A1|B)=(𝟏/𝟔)/(𝟏/𝟐) =1/3  
𝐏(A2|B)=𝟎/(𝟏/𝟐) =0
𝐏(A3|B)=(𝟏/𝟑)/(𝟏/𝟐) =2/3  
可见答题者由1号门换3号门后的概率由原来的1/3提升至2/3,理应换门
当然做出换门游戏最快的决策的方式,就是可以想象主持人给你N(趋于无穷)扇门,你选择了1号门,主持人帮你排除了掉没有奖品的n-2扇门,这个时候必须要换门,因为主持人帮你排除n-2扇门后,这个时候换门概率由原来的1/N趋于100%,换门获得奖品概率大幅度增加

朴素贝叶斯

朴素贝叶斯(Naive Bayesian)估计是一种二分类及多分类监督学习算法,与密度函数估计相结合,用已知的数据样本来实现对未知类别数据的判断,整体原理基于上述贝叶斯公式,由于朴素贝叶斯假设为独立同分布,如图,后验概率最大可以等价于似然函数最大,用极大似然估计(MLE)对参数进行估计求解。

在这里插入图片描述

优点

1因为没有迭代,直接计算概率,所以训练时间更短,且对样本数量要求比较少
2.处理连续和离散数据,对无关特征不敏感
3.非常简单、快速且易于实施
4.适用于二分类和多分类
5.调参很少

缺点

朴素贝叶斯所做的假设模型内各个特征独立且平等的,但现实中独立性假设永远不会正确,而在实践中通常效果很好,所以叫“naive(天真)”,造成了在很多情况下,效果并不如其他模型分类

常见朴素贝叶斯类别

Gaussian naive Bayes(高斯朴素贝叶斯),为朴素贝叶斯变形,它遵循高斯正太分布并支持连续数据,如果数据连续特征不符合正态分布,可使用变换或不同的方法将其转换为正态分布
Multinomial naive Bayes(多项式朴素贝叶斯分类器):主要对离散特征数据,对每个特征使用多项分布,给定特征项出现的次数,多用于NLP预测
Bernoulli naive Bayes(伯努利朴素贝叶斯):同为离散数据,主要为二进制、布尔类型设计使用
Complement Naive Bayes(补充贝叶斯):如果执行分类的数据集不平衡,则多项式以及高斯贝叶斯可能会产生低准确度

常用场景

文本分类
邮件分类
情感分类
天气分类
…更侧重于离散特征分类

适用数据

当naive的假设与实际数据匹配时,实际数据很难
能够非常好分离数据,模型复杂度显不得重要
对于非常高维的数据,模型复杂度显得不重要

本次选取数据集为心脏病数据集,数据集本身质量较高,无需过多处理
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import MinMaxScaler
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix
df = pd.read_csv("heart.csv")
sns.pairplot(df,hue="target")
plt.show()
#如下图,这里部分特征类别分离不是很明显,需要进一步进行标准化,这里采用归一化操作,将数据映射到[0,1]空间内,方便将高斯贝叶斯与多项式朴素贝叶斯的结果进行比较

在这里插入图片描述

plt.figure(figsize=(10,10))
sns.heatmap(df.corr(),annot=True,fmt='.1f')
plt.show()

在这里插入图片描述

#高斯朴素贝叶斯
y = df.target.values
X = df.drop(['target'],axis=1)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=10)
scaler = MinMaxScaler(feature_range=(0., 1.))
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
gaussian = GaussianNB()
gaussian.fit(X_train, y_train)
Y_pred = gaussian.predict(X_test) 
accuracy = accuracy_score(y_test,Y_pred)
cm = confusion_matrix(y_test, Y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='YlGnBu')
print('accuracy: %.3f' %accuracy)
accuracy: 0.831

混淆矩阵
在这里插入图片描述

#多项式朴素贝叶斯
classifier = MultinomialNB()
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
accuracy
0.7987012987012987
由此明显可以看出高斯贝叶斯准确率0.831明显高于多项式朴素贝叶斯0.798
前一章SVM(支持向量机) SVM数据结果不是很好,这里再次用SVM与高斯贝叶斯模型估计进行对比一下
svc=SVC() 
parameters = [ 
               {'C':[1, 10, 100, 1000], 'kernel':['rbf'], 'gamma':[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]},
              ]
grid_search = GridSearchCV(estimator = svc,  
                           param_grid = parameters,
                           scoring = 'accuracy',
                           cv = 5,
                           verbose=0)
grid_search.fit(X_train, y_train)
print('GridSearch CV 最好分数 : {:.3f}\n'.format(grid_search.best_score_))
print('最佳参数 :', (grid_search.best_params_))
GridSearch CV 最好分数 : 0.968
最佳参数 : {'C': 1000, 'gamma': 0.5, 'kernel': 'rbf'}
这里明显可以感受到SVM的强大,正确率达到0.968,明显高于高斯朴素贝叶斯0.831的正确率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值