朴素贝叶斯分类【原理推导+实例】

机器学习笔记——朴素贝叶斯分类器

第一章 机器学习简介
第二章 感知机
第三章 支持向量机
第四章 朴素贝叶斯分类器
第五章 Logistic回归
第六章 线性回归和岭回归
第七章 多层感知机与反向传播【Python实例】
第八章 主成分分析【PCA降维】
第九章 隐马尔可夫模型
第十章 奇异值分解


回顾支持向量机模型中,从训练样本集 { ( x i , y i ) } i = 1 N \{(x_i,y_i)\}_{i=1}^N {(xi,yi)}i=1N 直接学得决策函数
f ( x ) = sign ⁡ ( ∑ i = 1 N α i y i ( x i ⋅ x ) + b ) , f( x) = \operatorname{sign}( \sum _{i= 1}^N\alpha_iy_i (x_i\cdot x) + b), f(x)=sign(i=1Nαiyi(xix)+b),对新数据实例 x x x的预测 y ^ \hat{y} y^直接由决策函数给出,即 y ^ = f ( x ) \hat{y}=f(x) y^=f(x)。而朴素贝叶斯分类是以条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX)而非决策函数 f ( x ) f(x) f(x)为模型的分类方法:

  • 通常先从训练样本集 T = { ( x i , y i ) } i = 1 N T=\{(x_i,y_i)\}_{i=1}^N T={(xi,yi)}i=1N学得条件概率分布 P ( Y ∣ X ) . P(Y|X). P(YX).
  • 再对新数据实例 x x x 按照后验概率最大化原则确定预测 y ^ \hat{y} y^, 即
    y ^ = argmax ⁡ y ∈ Y P ( y ∣ x ) . \hat{y}=\operatorname*{argmax}_{y\in\mathcal{Y}}P(y|x). y^=yYargmaxP(yx).

一、后验概率最大化分类准则

假设有 N N N 种可能的类别标记,即 Y = { y 1 , y 2 , … , y N } , λ i j \mathcal{Y}=\{y_1,y_2,\ldots,y_N\},\lambda_{ij} Y={y1,y2,,yN},λij 是将一个真实标记为 y j y_j yj的样本误分类为 y i y_i yi所产生的损失。基于后验概率 P ( y i ∣ x ) P(y_i\mid\boldsymbol{x}) P(yix) 可获得将样本 x \boldsymbol{x} x 分类为 y i y_i yi 所产生的期望损失, 即在样本 x x x 上的“条件风险”。那么我们可以得到将 x x x的类别预测为 y i y_i yi所产生的风险(期望损失)为
R ( Y = y i ∣ x ) = ∑ j = 1 K λ i j P ( Y = y j ∣ x ) , R(Y=y_i|x)=\sum_{j=1}^K\lambda_{ij}P(Y=y_j|x), R(Y=yix)=j=1KλijP(Y=yjx),最优预测依据贝叶斯决策论(期望损失最小化),对输入实例 x x x的最优预测 y ^ \hat{y} y^应该满足:

y ^ = argmin ⁡ y i R ( Y = y i ∣ x ) \hat{y}=\operatorname*{argmin}_{y_i}R(Y=y_i|x) y^=yiargminR(Y=yix)
如果我们采用0-1损失函数,即 λ i j = { 1 , i ≠ j 0 , i = j . \lambda_{ij}=\left\{\begin{array}{ll}1,&i\neq j\\0,&i=j\end{array}\right. . λij={1,0,i=ji=j.
R ( Y = y i ∣ x ) = ∑ j ≠ i 1 × P ( Y = y j ∣ x ) + 0 × P ( Y = y i ∣ x ) = ∑ j ≠ i P ( Y = y j ∣ x ) = 1 − P ( Y = y i ∣ x ) . \begin{aligned}R(Y=y_i|x)=&\sum_{j\neq i}1\times P(Y=y_j|x)+0\times P(Y=y_i|x)\\=&\sum_{j\neq i}P(Y=y_j|x)\\ =&1-P(Y=y_i|x). \end{aligned} R(Y=yix)===j=i1×P(Y=yjx)+0×P(Y=yix)j=iP(Y=yjx)1P(Y=yix).
相应地,输入实例 x x x的最优预测 y ^ \hat{y} y^应该满足:
y ^ = argmin ⁡ y i R ( Y = y i ∣ x ) = argmin ⁡ y i [ 1 − P ( Y = y i ∣ x ) ] = argmax ⁡ y i P ( Y = y i ∣ x ) ( 1 ) \begin{aligned} \hat{y}&=\operatorname*{argmin}_{y_i}R(Y=y_i|x)\\ &=\underset{y_i}{\operatorname*{argmin}}[1-P(Y=y_i|x)]\\ &=\underset{y_i}{\operatorname*{argmax}}P(Y=y_i|x) \end{aligned} \qquad (1) y^=yiargminR(Y=yix)=yiargmin[1P(Y=yix)]=yiargmaxP(Y=yix)(1)

  • 输入实例 x x x的最优预测 y ^ \hat{y} y^为使得后验概率 P ( y ∣ x ) P(y|x) P(yx)最大的类标记,也就是把后验概率最大那个类别当作预测类别;
  • 关键是怎么求这个后验概率 P ( y ∣ x ) P(y|x) P(yx).

二、生成式模型和判别式模型

如何计算相应的后验概率 P ( Y = y i ∣ x ) ? P(Y=y_i|x)? P(Y=yix)?

  1. 判别式模型
  • 直接从训练样本集 D = { ( x i , y i ) } i = 1 N D=\{(x_i,y_i)\}_{i=1}^N D={(xi,yi)}i=1N学习出后验概率 P ( Y = y i ∣ x ) P(Y=y_i|x) P(Y=yix)
  • 也就是说学一个后验概率的函数,这个函数给定形式,学习参数,比如Logistic回归。
  1. 生成式模型
  • 不直接学习后验概率 P ( Y = y i ∣ x ) P(Y=y_i|x) P(Y=yix),而是需要学习出联合概率分布 P ( Y = y i , x ) P(Y=y_i,x) P(Y=yi,x)
  • 然后利用贝叶斯公式
    P ( Y = y i ∣ x ) = P ( Y = y i , x ) P ( x ) , P(Y=y_i|x)=\frac{P(Y=y_i,x)}{P(x)}, P(Y=yix)=P(x)P(Y=yi,x), 计算出 P ( Y = y i ∣ x ) . P(Y=y_i|x). P(Y=yix).

朴素别叶斯模型就是很典型的生成式模型,而支持向量机、Logistic回归等属于判别式模型。

三、 朴素贝叶斯分类原理

下面我们介绍怎么学习联合概率 P ( Y = c i , x ) P(Y=c_i,x) P(Y=ci,x),回顾一下贝叶斯公式:
P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A \mid B)=\frac{P(A, B)}{P(B)}=\frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(A,B)=P(B)P(BA)P(A)

在分类问题中(这里先假设特征是离散的),可以这样来看:
P ( 类别 ∣ 特征 ) = P ( 类别 , 特征 ) P ( 特征 ) = P ( 特征 ∣ 类别 ) P ( 类别 ) P ( 特征 ) P(类别 \mid 特征)=\frac{P(类别, 特征)}{P(特征)}=\frac{P(特征|类别)P(类别)}{P(特征)} P(类别特征)=P(特征)P(类别,特征)=P(特征)P(特征类别)P(类别)

用类别集合: Y = { y 1 , y 2 … , y n } \mathcal{Y}=\{y_1,y_2…,y_n\} Y={y1,y2,yn}和特征集合 X = { x 1 , x 2 , ⋯   , x d } X=\{x_1,x_2,\cdots,x_d\} X={x1,x2,,xd}来写,后验概率计算如下:
P ( y i ∣ X ) = P ( y i , X ) P ( X ) = P ( X ∣ y i ) P ( y i ) P ( X ) = P ( x 1 , x 2 ⋯ x d ∣ y i ) P ( y i ) P ( X ) P(y_i \mid X)=\frac{P(y_i, X)}{P(X)}=\frac{P(X|y_i)P(y_i)}{P(X)}=\frac{P(x_1,x_2\cdots x_d|y_i)P(y_i)}{P(X)} P(yiX)=P(X)P(yi,X)=P(X)P(Xyi)P(yi)=P(X)P(x1,x2xdyi)P(yi)

观察一下最右边的式子:

  • P ( x 1 , x 2 ⋯ x n ∣ y i ) P(x_1,x_2\cdots x_n|y_i) P(x1,x2xnyi):某个类别下特征的联合概率,特征组合比较多的话,比如每个特征 x i x_i xi有两个取值,那么特征一共有 2 d 2^d 2d种组合,特征数比较多的话,样本中有些组合根本不会出现,所以不好算.
  • P ( y i ) P(y_i) P(yi):样本中每个类别的概率,可以从样本中直接统计频率当作概率(大数定理).
  • P ( X ) P(X) P(X)计算每一个类别的 P ( y i ∣ X ) P(y_i \mid X) P(yiX)都有的,我们通过(1)式比较大小,相同的可以不用计算.

条件独立性假设

刚刚提到 P ( X ∣ y i ) = P ( x 1 , x 2 ⋯ x n ∣ y i ) P(X|y_i)=P(x_1,x_2\cdots x_n|y_i) P(Xyi)=P(x1,x2xnyi)是联合概率,不好求,所以朴素贝叶斯分类做了一个很强的假设:假设特征是相互独立的!(所以叫朴素贝叶斯),那么联合概率就能拆开了:
P ( y i ∣ X ) = P ( x 1 , x 2 ⋯ x d ∣ y i ) P ( y i ) P ( X ) = P ( y i ) ∏ j = 1 d P ( x j ∣ y i ) P ( X ) P(y_i \mid X)=\frac{P(x_1,x_2\cdots x_d|y_i)P(y_i)}{P(X)}=\frac{P(y_i)\prod_{j=1}^dP(x_j|y_i)}{P(X)} P(yiX)=P(X)P(x1,x2xdyi)P(yi)=P(X)P(yi)j=1dP(xjyi)

这样给定特征后,可以在训练集中通过右边的公式计算每一类的概率,从而给出预测的类别。

四、 典例:垃圾邮件分类

1 实例

通过一封邮件的内容来判断是正常邮件还是垃圾邮件,由后验概率 P ( y ^ ∣ X ) P(\hat{y}|X) P(y^X)的形式我们知道

  • 这个问题特征 X X X为邮件的内容;
  • y ^ \hat{y} y^:垃圾邮件或者不是垃圾邮件两种取值;

特征是每封邮件的内容,而内容我们可以细分为句子,而句子可以进一步细分为。如下面垃圾邮件截图:

截屏2022-04-11 下午4.17.20

以这句话为例,设这句话分词集合为 X X X,判断是不是垃圾邮件,计算:
P ( 垃圾邮件 ∣ X ) = P ( X ∣ 垃圾邮件 ) P ( 垃圾邮件 ) P ( X ) = P ( 垃圾邮件 ) ∏ j = 1 n P ( x j ∣ 垃圾邮件 ) P ( X ) P(垃圾邮件|X)=\frac{P(X|垃圾邮件)P(垃圾邮件)}{P(X)}=\frac{P(垃圾邮件)\prod_{j=1}^nP(x_j|垃圾邮件)}{P(X)} P(垃圾邮件X)=P(X)P(X垃圾邮件)P(垃圾邮件)=P(X)P(垃圾邮件)j=1nP(xj垃圾邮件)
假设训练集给出24封垃圾邮件和24封正常邮件,则

  • P ( 垃圾邮件 ) = 1 2 P(垃圾邮件)=\frac{1}{2} P(垃圾邮件)=21.
  • ∏ j = 1 n P ( x j ∣ 垃圾邮件) \prod_{j=1}^nP(x_j|垃圾邮件) j=1nP(xj垃圾邮件)就去统计训练集中垃圾邮件这些词出现的概率
    P ( x j ∣ 垃圾邮件) = ∣ x j ∣ n , P(x_j|垃圾邮件)=\frac{|x_j|}{n}, P(xj垃圾邮件)=nxj,
    其中 ∣ x j ∣ 为词 x j |x_j|为词x_j xj为词xj在垃圾邮件中出现的次数,n为垃圾邮件的总词数,用频率估计概率。
  • 前面我们说过 P ( X ) P(X) P(X)对于每一类来说都是一样的,所以可以不计算相同的这一项!

2 拉普拉斯平滑

而这里有个问题是,如果有一个词在训练集中没有出现过,那么 P ( x j ∣ 垃圾邮件 ) = 0 P(x_j|垃圾邮件)=0 P(xj垃圾邮件)=0导致整个 P ( 垃圾邮件 ∣ X ) = 0 P(垃圾邮件|X)=0 P(垃圾邮件X)=0,这显然不合理,所以我们需要平滑

零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库训练集中没有出现过,会导致整个实例的概率结果是0。在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0。

为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做拉普拉斯平滑。 假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。

所以在垃圾邮件分类的问题中,可以得到:
P ( x j ∣ 垃圾邮件) = ∣ x j ∣ + 1 n P(x_j|垃圾邮件)=\frac{|x_j|+1}{n} P(xj垃圾邮件)=nxj+1
其中 ∣ x j ∣ 为词 x j |x_j|为词x_j xj为词xj在垃圾邮件中出现的次数,n为垃圾邮件的总词数。

五、朴素贝叶斯的两种模型

上面的例子我们假设特征取值是离散值,当特征取连续值时,概率的计算方式不同。而根据特征的取值不同,朴素贝叶斯可以分为两种模型:

  1. 多项式模型(multinomial model):特征取值为离散值;
  2. 高斯模型(Gaussian model):特征取值为连续变量.

1 多项式模型

在多项式模型中,特征取值为离散值,概率计算就同上面一样,统计每一个特征的频率当作概率。该模型常用于文本分类,特征是单词,值是单词的出现次数。设某文档 d = { t 1 , t 2 , . . . , t k } d=\{t_1,t_2,...,t_k\} d={t1,t2,...,tk} ,其中 t i t_i ti为在该文档d中出现的单词,允许重复,上面垃圾邮件分类就属于多项式模型。

2 高斯模型

当特征是连续变量的时候,运用多项式模型就会导致很多0(不做平滑的情况下),此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采用高斯模型。

高斯朴素贝叶斯模型是假设每个特征的条件概率 P ( x i ∣ y i ) P(x_i\mid y_i) P(xiyi) 服从高斯分布 N ( μ t , σ t 2 ) N\left(\mu_{t}, \sigma_{t}^{2}\right) N(μt,σt2)。在 c c c 类下第 i \mathrm{i} i 个词对应的高斯分布为:
P ( x i ∣ y i ) = 1 σ i , y i 2 π e − ( x i − μ i , y i ) 2 2 σ i , y i 2 P(x_i\mid y_i)=\frac{1}{\sigma_{i, y_i} \sqrt{2 \pi}} e ^{-\frac{\left(x_{i}-\mu_{i, y_i}\right)^{2}}{2 \sigma_{i, y_i}^{2}}} P(xiyi)=σi,yi2π 1e2σi,yi2(xiμi,yi)2
其中, μ i , y i , σ i , y i 2 \mu_{i, y_i} , \sigma_{i, y_i}^{2} μi,yiσi,yi2 表示 y i y_i yi类下第 i \mathrm{i} i 个特征的均值和方差。所以关键是对高斯分布的均值和方差的估计,采用的方法极大似然估计,由概统的知识可得:

  • 均值的估计 μ i , y i \mu_{i, y_i} μi,yi 是在样本类别 y i y_i yi 中,所有 x i x_{i} xi 的平均值;
  • 方差的估计 σ i , y i 2 \sigma_{i, y_i}^{2} σi,yi2 为样本类别 y i y_i yi 中所有 x i x_{i} xi 的方差;

对于一个连续的样本值, 带入高斯分布,就可以求出它的概率分布了,所有参数估计完成之后,就可以计算给定样本的条件概率 P ( x 1 , x 2 ⋯   , x d ∣ y i ) P\left(x_1,x_2\cdots,x_d \mid y_i\right) P(x1,x2,xdyi) ,进而可以计算 P ( y i ) P ( x 1 , x 2 ⋯   , x d ∣ y i ) P(y_i)P\left(x_1,x_2\cdots,x_d \mid y_i\right) P(yi)P(x1,x2,xdyi),之后就可以确定样本类别,完成模型预测。

六、参考资料

  1. 周志华.机器学习.清华大学出版社,2016.
  2. 朴素贝叶斯分类算法
  3. 朴素贝叶斯原理
  4. 朴素贝叶斯之拉普拉斯平滑
  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个基于Python的朴素贝叶斯分类器实例,用于分类电子邮件是否为垃圾邮件。 ```python import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # 加载数据集 data = pd.read_csv('spam.csv', encoding='latin-1') data = data[['v1', 'v2']] data = data.rename(columns={"v1": "label", "v2": "text"}) # 将标签转换为二进制变量 data['label'] = data['label'].map({'ham': 0, 'spam': 1}) # 分割数据集为训练集和测试集 train_data = data[:4400] test_data = data[4400:] # 特征工程 count_vectorizer = CountVectorizer(stop_words='english') train_feature_vectors = count_vectorizer.fit_transform(train_data['text']) test_feature_vectors = count_vectorizer.transform(test_data['text']) # 训练模型 naive_bayes_classifier = MultinomialNB() naive_bayes_classifier.fit(train_feature_vectors, train_data['label']) # 预测测试集 predictions = naive_bayes_classifier.predict(test_feature_vectors) # 测试模型准确度 accuracy = (predictions == test_data['label']).mean() print("准确度:", accuracy) ``` 这个示例中,我们首先加载数据集,将标签转换为二进制变量,并将数据集分成训练集和测试集。然后,我们使用CountVectorizer将文本数据转换为数值特征。接着,我们使用MultinomialNB训练朴素贝叶斯分类器。最后,我们使用训练好的模型预测测试集,并计算模型准确度。 ### 回答2: 朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类方法,在文本分类、垃圾邮件过滤等领域有广泛应用。而Python中有丰富的机器学习库,如scikit-learn,提供了方便的朴素贝叶斯分类器的实现。 下面是一个简单的朴素贝叶斯分类器的Python实例: # 导入所需的库 from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # 定义训练集和测试集 train_X = ["这个电影太好看了", "这个电影真的很差"] train_y = [1, 0] # 1代表好评,0代表差评 test_X = ["这个电影非常棒"] # 文本特征提取 count_vec = CountVectorizer() train_X_vec = count_vec.fit_transform(train_X) test_X_vec = count_vec.transform(test_X) # 构建并训练朴素贝叶斯分类器 naive_bayes = MultinomialNB() naive_bayes.fit(train_X_vec, train_y) # 对测试集进行预测 test_y = naive_bayes.predict(test_X_vec) # 输出预测结果 print(test_y) 在上述代码中,首先导入了所需的库,包括CountVectorizer用于文本特征提取和MultinomialNB用于朴素贝叶斯分类器的构建。然后定义了训练集train_X和对应的标签train_y,测试集test_X。 接着通过CountVectorizer对文本进行特征提取,将文本转换为向量形式,方便后续的分类器训练和预测。然后使用MultinomialNB构建并训练朴素贝叶斯分类器,使用fit方法将训练集输入模型进行训练。最后,使用predict方法对测试集进行预测,得到预测结果test_y。 以上就是一个简单的朴素贝叶斯分类器的Python实例,该示例展示了如何使用scikit-learn库来实现朴素贝叶斯分类器进行文本分类任务。 ### 回答3: 朴素贝叶斯分类器是一种常用的机器学习算法,通过统计特征出现的概率来进行分类。Python中有许多库可以实现朴素贝叶斯分类器,常见的有scikit-learn和NLTK库。 下面是一个基于scikit-learn库的朴素贝叶斯分类器的示例: 首先,需要导入需要的库: ``` from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB ``` 接下来,准备训练数据和测试数据,通常是一些文本数据和对应的标签。文本数据可以是一篇文章、一封邮件、一段对话等等。标签通常是表示文本所属类别的一个字符串或数字。 然后,需要对文本数据进行特征提取,将文本转化为可以输入模型的向量形式。可以使用CountVectorizer类来实现。 ``` vectorizer = CountVectorizer() X_train = vectorizer.fit_transform(train_data) X_test = vectorizer.transform(test_data) ``` 接下来,初始化一个朴素贝叶斯分类器对象,并使用训练数据对其进行训练。 ``` clf = MultinomialNB() clf.fit(X_train, train_labels) ``` 最后,使用训练好的模型对测试数据进行预测,并输出预测结果。 ``` predicted_labels = clf.predict(X_test) ``` 以上就是一个基于scikit-learn库的朴素贝叶斯分类器的实现示例。通过这个实例,我们可以学会如何使用Python来实现一个简单的朴素贝叶斯分类器,用于文本分类、情感分析等任务。需要注意的是,这个示例只是朴素贝叶斯分类器的一种实现方式,实际应用中可能会有一些调参和预处理的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值