一.基础概念
贝叶斯分类器是各种分类器中分类错误概率最小或者在预先给定代价的情况下平均风险最小的分类器。它的设计方法是一种最基本的统计分类方法。其分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
先验概率:根据以往经验分析得到的概率。
后验概率:某件事发生是由某个因素引起的可能性大小。
联合概率:联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。假设X和Y都服从正态分布,那么P{X<4,Y<0}就是一个联合概率,表示X<4,Y<0两个条件同时成立的概率。表示两个事件共同发生的概率。A与B的联合概率表示为 P(AB) 或者P(A,B),或者P(A∩B)。
全概率:全概率公式为概率论中的重要公式,它将对一复杂事件A的概率求解问题转化为了在不同情况下发生的简单事件的概率的求和问题。如果事件B1、B2、B3…Bn 构成一个完备事件组,即它们两两互不相容,其和为全集;并且P(Bi)大于0,则对任一事件A有P(A)=P(A|B1)P(B1) + P(A|B2)P(B2) + ... + P(A|Bn)P(Bn)。或者:p(A)=P(AB1)+P(AB2)+...+P(ABn)),其中A与Bn的关系为交)。
贝叶斯定理:贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性。贝叶斯定理也称贝叶斯推理,早在18世纪,英国学者贝叶斯(1702~1761)曾提出计算条件概率的公式用来解决如下一类问题:假设H[1], H[2]…H[n]互斥且构成一个完全事件,已知它们的概率P(H[i])(i=1,2…n),现观察到某事件A与H[1], H[2]…H[n]相伴随机出现,且已知条件概率P(A|H[i]),求P(H[i]|A)。
贝叶斯公式:
若将上述定义中样本空间的划分Bi看做为类标,A看做为一个新的样本,则很容易将条件概率理解为样本A是类别Bi的概率。在机器学习训练模型的过程中,尽量优化风险函数。
寻找一个判定准则最小化所有样本的条件风险总和,因此就有了贝叶斯判定准则(Bayes decision rule):为最小化总体风险,只需在每个样本上选择那个使得条件风险最小的类标。
若损失函数λ取0-1损失,则有:
二.朴素贝叶斯分类器
原始的贝叶斯分类器最大的问题在于联合概率密度函数的估计,首先需要根据经验来假设联合概率分布,其次当属性很多时,训练样本往往覆盖不够,参数的估计会出现很大的偏差。为了避免这个问题,朴素贝叶斯分类器(naive Bayes classifier)采用了“属性条件独立性假设”,即对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响。
1.设置参数
设样本属性集合为x{x1,x2,x3......xn},n为数目,xi为取值;设c为类别集合,把样本划分为某一类,c={y1,y2,y3......ym}.
2.计算后验概率
其中,即每个特征相互独立。
3.计算概率:
计算各个划分的条件概率 是朴素贝叶斯分类的基础步骤,当特征属性为离散值时,能很方便的统计训练样本中各个划分在每个类别中出现的频率即可用来估计 ,
当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。即:
只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。
4.实例说明:
现有一个纹理清晰、色泽青绿、敲声沉闷的瓜
先验概率:P(好瓜)=8/17
条件概率:P(纹理清晰|好瓜)=7/8
条件概率:P(色泽青绿|好瓜)=3/8
条件概率:P(敲声沉闷|好瓜)=2/8
计算后验概率P(好瓜|纹理清晰、色泽青绿、敲声沉闷)分子部分:
P(好瓜)x P(纹理清晰|好瓜)x P(色泽青绿|好瓜)x P(敲声沉闷|好瓜)=8/17 × (7/8) × (3/8) × (2/8) = 336 / 8704。
同理P(坏瓜) × P(纹理清晰|坏瓜) × P(色泽青绿|坏瓜) × P(敲声沉闷|坏瓜) = 162 / 12393。
P(好瓜|纹理清晰、色泽青绿、敲声沉闷)> P(坏瓜|纹理清晰、色泽青绿、敲声沉闷),所以预测该为好瓜。
三.补充
1.拉普拉斯平滑:
需要注意的是:若某个属性值在训练集中和某个类别没有一起出现过,这样会抹掉其它的属性信息,因为该样本的类条件概率被计算为0。因此在估计概率值时,常常用进行平滑(smoothing)处理,拉普拉斯修正(Laplacian correction)就是其中的一种经典方法,具体计算方法如下:
其中N为出现的类别数,Ni为xi可能的的取值数
当训练集越大时,拉普拉斯修正引入的影响越来越小。对于贝叶斯分类器,模型的训练就是参数估计,因此可以事先将所有的概率储存好,当有新样本需要判定时,直接查表计算即可。
2.朴素贝叶斯分类器的优缺点
朴素贝叶斯分类器是贝叶斯分类器中最简单,也是最常见的一种分类方法。朴素贝叶斯算法是流行的十大挖掘算法之一,该算法是有监督的学习算法,解决的是分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。
但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
四.代码表示
%matplotlib inline
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
X,y = load_breast_cancer(return_X_y = True)
X_train,X_test,y_train,y_test = train_test_split(X,y,stratify = y,test_size = 0.2,random_state=31)
#lr = LogisticRegression(max_iter=10000)
lr = LogisticRegression()
nb = GaussianNB()
lr_scores = []
nb_scores = []
train_sizes = range(10,len(X_train),25)
for train_size in train_sizes:
X_slice,_,y_slice,_ = train_test_split(X_train,y_train,train_size = train_size,stratify = y_train,random_state = 31)
nb.fit(X_slice,y_slice)
nb_scores.append(nb.score(X_test,y_test))
lr.fit(X_slice,y_slice)
lr_scores.append(lr.score(X_test,y_test))
plt.plot(train_sizes,nb_scores,label='Naive Bayes')
plt.plot(train_sizes,lr_scores,linestyle='--',label='Logistic Regression')
plt.title("Naive Bayes and Logistic Regression Accuracies")
plt.xlabel("Number of training instances")
plt.ylabel("Test set accuracy")
plt.legend()
df = pd.read_csv('./pima-indians-diabetes.data.csv',header = None)
y = df[8]
X = df[[0,1,2,3,4,5,6,7]]
X_train,X_test,y_train,y_test = train_test_split(X,y,stratify = y,random_state=11)
lr = LogisticRegression()
nb = GaussianNB()
lr_scores = []
nb_scores = []
train_sizes = range(10,len(X_train),10)
for train_size in train_sizes:
X_slice,_,y_slice,_ = train_test_split(X_train,y_train,train_size = train_size,stratify = y_train,random_state = 11)
nb.fit(X_slice,y_slice)
nb_scores.append(nb.score(X_test,y_test))
lr.fit(X_slice,y_slice)
lr_scores.append(lr.score(X_test,y_test))
plt.plot(train_sizes,nb_scores,label='Naive Bayes')
plt.plot(train_sizes,lr_scores,linestyle='--',label='Logistic Regression')
plt.title("Naive Bayes and Logistic Regression Accuracies")
plt.xlabel("Number of training instances")
plt.ylabel("Test set accuracy")
plt.legend()