贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。
朴素贝叶斯算法的核心思想是通过考虑特征概率来预测分类,即对于给出的待分类样本,求解在此样本出现的条件下各个类别出现的概率,哪个最大,就认为此待分类样本属于哪个类别。
贝叶斯定理中很重要的概念是先验概率、后验概率和条件概率。
先验概率:事件发生前的预判概率。可以是基于历史数据的统计,可以由背景常识得出,也可以是人的主观观点给出。一般都是单独事件概率。
举个例子:如果我们对西瓜的色泽、根蒂和纹理等特征一无所知,按照常理来说,西瓜是好瓜的概率是 。那么这个概率 就被称为先验概率。
后验概率:事件发生后求的反向条件概率。或者说,基于先验概率求得的反向条件概率。概率形式与条件概率相同。
举个例子:假如我们了解到判断西瓜是否好瓜的一个指标是纹理。一般来说,纹理清晰的西瓜是好瓜的概率大一些,大概是75% 。如果把纹理清晰当作一种结果,然后去推测好瓜的概率,那么这个概率 P(好瓜|纹理清晰) 就被称为后验概率。
贝叶斯定理(Bayes Theorem,也称贝叶斯公式)是基于假设的先验概率、给定假设下观察到不同数据的概率,提供了一种计算后验概率的方法,朴素贝叶斯公式:
给定数据如下:
问题是:如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?
通过问题我们转换为朴素贝叶斯求解:
因为我们用的是朴素贝叶斯方法,因此我们假定事件之间相互独立,互不影响,那么:
P(不帅、性格不好、身高矮、不上进|嫁) = P(不帅|嫁)*P(性格不好|嫁)*P(身高矮|嫁)*P(不上进|嫁)
因此,我们需要先求出 P(不帅|嫁)、P(性格不好|嫁)、P(身高矮|嫁)、P(不上进|嫁)的后验概率。
p(不帅|嫁) = 3/6 = 1/2
同理可求得:
p(性格不好|嫁)=1/6
p(身高矮|嫁)=1/6
p(不上进|嫁)=1/6
P(不帅、性格不好、身高矮、不上进|嫁) =1/2 * 1/6 * 1/6 * 1/6 = 1/432
通过统计样本可得:
p(嫁)=6/12 = 1/2
然后可以求解分母:
P(不帅、性格不好、身高矮、不上进) = P(不帅)*P(性格不好)*P(身高矮)*P(不上进)
因此我们可以通过样本统计得出:
P(不帅)=4/12=1/3
P(性格不好)=4/12=1/3
P(身高矮)=7/12
P(不上进)=4/12=1/3
P(不帅、性格不好、身高矮、不上进)=1/3 * 1/3 * 7/12 * 1/3 = 7/324
最后我们将先验概率代入:
P(嫁|不帅、性格不好、身高矮、不上进) = (1/432 * 1/2)/ (7/324) = 324/6048 =3/56
P(不嫁|不帅、性格不好、身高矮、不上进) = 1-P(嫁|不帅、性格不好、身高矮、不上进) = 53/56
所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!
使用朴素贝叶斯,有时候会面临零概率问题。零概率问题,指的是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。
在文本分类的问题中,当「一个词语没有在训练样本中出现」时,这个词基于公式统计计算得到的条件概率为 0,使用连乘计算文本出现概率时也为 0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是 0。
假定训练样本很大时,每个分量 x 的计数加 1 造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。
对应到文本分类的场景中,如果使用多项式朴素贝叶斯,假定特征 xi表示某个词在样本中出现的次数(当然用TF-IDF表示也可以)。拉普拉斯平滑处理后的条件概率计算公式为:
(1) 算法逻辑简单,易于实现
(2)分类过程中时空开销小
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。
但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
# load the iris dataset
from sklearn.datasets import load_iris
iris = load_iris()
# store the feature matrix (X) and response vector (y)
X = iris.data
y = iris.target
# splitting X and y into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
# training the model on training set
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)
# making predictions on the testing set
y_pred = gnb.predict(X_test)
# comparing actual response values (y_test) with predicted response values (y_pred)
from sklearn import metrics
print("Gaussian Naive Bayes model accuracy(in %):", metrics.accuracy_score(y_test, y_pred)*
阅读量:1206
点赞量:0
收藏量:0