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

贝叶斯估定理

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

朴素贝叶斯(演示结果与SVM进行对比)_第1张图片

借助战国谚语“三人成虎”例子来加深理解,皇帝一直以来对某大臣很信任,这时候出现第一个人向皇帝谏言说该大臣存在玩忽职守问题,第一次皇帝也许不信,但怀疑的种子已经发芽,接着第二个人、第三个人出现,一直向皇帝谏言该大臣有类似问题,那么皇帝最终会猜测这个人是否真的有该问题。

还有一个经典三扇门问题,三扇门有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)对参数进行估计求解。

朴素贝叶斯(演示结果与SVM进行对比)_第2张图片

优点

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]空间内,方便将高斯贝叶斯与多项式朴素贝叶斯的结果进行比较

朴素贝叶斯(演示结果与SVM进行对比)_第3张图片

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

朴素贝叶斯(演示结果与SVM进行对比)_第4张图片

#高斯朴素贝叶斯
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

混淆矩阵
朴素贝叶斯(演示结果与SVM进行对比)_第5张图片

#多项式朴素贝叶斯
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的正确率

你可能感兴趣的:(支持向量机,机器学习,算法)