机器学习2:朴素贝叶斯分类器Naïve Bayes Classifier(基于R language&Python)

  朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法(朴素贝叶斯法与贝叶斯估计是不同的概念)。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对个给定的输入 x x x,利用贝叶斯定理求出后验概率最大的输出 y y y。朴素贝叶斯方法实现简单,学习与预测的效率都很高,是一种常用的方法1

  假如对于机器学习是用来干什么的也不是很清楚的话,可以先阅读一下周志华老师的西瓜书(清华大学出版社)或者李航老师的统计学习方法(清华大学出版社)。可以粗糙地理解为,机器学习是通过一些已知结果的样本来训练一个训练器,再将这个训练器运用到未知结果的样本上,用以推测其结果。我们在机器学习中通常要做的就是预测问题、参数优化问题和模型比较问题。

还有阿里云大学上的免费公开课:https://edu.aliyun.com/course/838?spm=5176.13345299.1392555.36.458ef153vkLC1h

基本原理方法

模型目标

  设输入空间(又称样本空间、属性空间) X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n XRn n n n 维向量的集合,输出空间为类别标记的集合 Y = { C 1 , C 2 , ⋯   , C K } \mathcal{Y}=\{C_1,C_2,\cdots,C_K\} Y={ C1,C2,,CK}。输入为特征向量 x ∈ X x\in \mathcal{X} xX,输出为类标记 y ∈ Y y\in \mathcal{Y} yY X X X 是定义在输入空间 X \mathcal{X} X 上的随机变量, Y Y Y 是定义在输出空间 Y \mathcal{Y} Y 上的随机变量。

  首先,我们需要确定一个损失函数,将最小化该损失函数的期望值(即,最小化期望风险函数)作为建模目标:期望风险越小,说明模型预测结果和真实结果越相近。不妨考虑 0-1 损失函数作为损失函数的例子:

L ( Y , f ( X ) ) = { 0 , f ( X ) = Y , 1 , f ( X ) ≠ Y . L(Y,f(X))= \begin{cases} 0, & f(X)= Y, \\ 1, & f(X) \neq Y. \end{cases} L(Y,f(X))={ 0,1,f(X)=Y,f(X)=Y.

这里 f ( X ) f(X) f(X) 为预测值, Y Y Y为真实类别值。这个损失函数意味着,当样本的模型预测结果和真实类别一致时,损失函数值为0;样本的模型预测结果和真实类别不一致时,损失函数值为1。

  其次,期望风险/平均损失(Expected Prediction Error,EPE) 可以写作:

E [ L ( Y , f ( X ) ) ] E[L(Y,f(X))] E[L(Y,f(X))]

其中,

L ( Y , f ( X ) ) = { 0 , f ( X ) = Y , 1 , f ( X ) ≠ Y . L(Y,f(X))= \begin{cases} 0, & f(X)= Y, \\ 1, & f(X) \neq Y. \end{cases} L(Y,f(X))={ 0,1,f(X)=Y,f(X)=Y.

  根据重期望公式,EPE可以分解为:

E [ L ( Y , f ( X ) ) ] = E X [ E Y ∣ X [ L ( Y , f ( X ) ) ] ] E[L(Y,f(X))]=E_X[E_{Y|X}[L(Y,f(X))]] E[L(Y,f(X))]=EX[EYX[L(Y,f(X))]]

  最后,我们寻找的朴素贝叶斯训练器 f ( ⋅ ) f(\cdot) f() 要能够最小化EPE。为了最小化 EPE,我们找到了一个它的充分条件:在 X = x X=x X=x 给定情况下,让 E Y ∣ X = x [ L ( Y , f ( X ) ) ] E_{Y|X=x}[L(Y,f(X))] EYX=x[L(Y,f(X))] 都达到最小。能达到这个条件,就足以达到最小化 EPE 的目的。该充分条件可以表达为:

a r g m i n   E Y ∣ X = x [ L ( Y , f ( X ) ) ] =   a r g m i n   0 ⋅ P ( L ( Y , f ( X ) ) = 0 ∣ X = x ) + 1 ⋅ P ( L ( Y , f ( X ) ) = 1 ∣ X = x ) =   a r g m i n   0 ⋅ P ( f ( X ) = Y ∣ X = x ) + 1 ⋅ P ( f ( X ) ≠ Y ∣ X = x ) =   a r g m i n   1 − P ( f ( X ) = Y ∣ X = x ) =   a r g m a x P ( f ( X ) = Y ∣ X = x ) \begin{aligned} & argmin\ E_{Y|X=x}[L(Y,f(X))] \\ =\ & argmin\ 0 \cdot P(L(Y,f(X))= 0|X=x) + 1 \cdot P(L(Y,f(X))= 1|X=x) \\ =\ & argmin\ 0 \cdot P(f(X)= Y|X=x) + 1 \cdot P(f(X) \neq Y|X=x) \\ =\ & argmin\ 1-P(f(X) = Y|X=x) \\ =\ &argmax P(f(X) = Y|X=x) \end{aligned} = = = = argmin EYX=x[L(Y,f(X))]argmin 0P(L(Y,f(X))=0X=x)+1P(L(Y,f(X))=1X=x)argmin 0P(f(X)=YX=x)+1P(f(X)=YX=x)argmin 1P(f(X)=YX=x)argmaxP(f(X)=YX=x)

  因此,基于最小化EPE的最优贝叶斯训练器 f ( ⋅ ) f(\cdot) f() 要满足以下条件:

f ( x ) =   a r g m a x P ( f ( X ) = Y ∣ X = x ) =   a r g m a x k ∈ { 1 , 2 , ⋯   , K } P ( f ( X ) = C k ∣ X = x ) \begin{aligned} f(x) =\ &argmax P(f(X) = Y|X=x) \\ =\ &argmax_{k \in \{1,2,\cdots,K\}} P(f(X) = C_k|X=x) \end{aligned} f(x)= = argmaxP(f(X)=YX=x)argmaxk{ 1,2,,K}P(f(X)=CkX=x)

这是寻找最优训练器的后验概率最大化准则。根据这个准则,得到的训练器 f ( ⋅ ) f(\cdot) f() 对于输入 X = x X=x X=x 得到的训练结果分类为:使条件概率 P ( f ( X ) = C k ∣ X = x ) P(f(X) = C_k|X=x) P(f(X)=CkX=x) 取值最大的那个分类 C k C_k Ck。 比如 i , j ∈ { 1 , 2 , ⋯   , K } i,j \in \{1,2,\cdots,K\} i,j{ 1,2,,K},若

P ( f ( X ) = c i ∣ X = x ) > P ( f ( X ) = c j ∣ X = x ) P(f(X) = c_i|X=x) > P(f(X) = c_j|X=x) P(f(X)=ciX=x)>P(f(X)=cjX=x)

X = x X=x X=x 通过得到训练器 f ( ⋅ ) f(\cdot) f() 的训练结果分类为第 i i i 类。

贝叶斯错误 Bayes error

  贝叶斯分类器的错误率称为贝叶斯错误。理论上,贝叶斯分类器是基于“后验概率最大化准则”进行分类的最优分类器,因此,贝叶斯错误常用来作为比较其他分类器效果如何的基底

模型假设

  朴素贝叶斯分类器是一系列基于贝叶斯定理的简单概率分类器,输入空间需要满足假设:在特征(又称属性)之间具有很强的相互独立性,需注意这是一种条件独立性(下文会解释)。

概率模型 Probabilistic Model

  给定一个分类实例问题,用向量 X = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( m ) ) X=(x^{(1)},x^{(2)},\cdots,x^{(m)}) X=(x(1),x(2),,x(m)) 来表示 m m m 个属性/特征的输入。利用贝叶斯定理,条件概率 P ( f ( X ) = C k ∣ X = x ) P(f(X) = C_k|X=x) P(f(X)=CkX=x) 可以分解为:

P ( f ( X ) = C k ∣ X = x ) = P ( f ( X ) = C k ) p ( X = x ∣ f ( X ) = C k ) P ( X = x ) P(f(X) = C_k|X=x)=\frac{P(f(X) = C_k)p(X = x|f(X) = C_k)}{P(X = x)} P(f(X)=CkX=x)=P(X=x)P(f(X)=Ck)p(X=xf(X)=Ck)

简记为

p ( C k ∣ x ) = p ( C k ) p ( x ∣ C k ) p ( x ) = p ( C k , x ) p ( x ) p(C_k|x)=\frac{p(C_k)p(x|C_k)}{p(x)}=\frac{p(C_k,x)}{p(x)} p(Ckx)=p(x)p(Ck)p(xCk)=p(x)p(Ck,x)

其中的原理即

p o s t e r i o r ( 后 验 分 布 ) = p r i o r ( 先 验 分 布 ) × l i k e l i h o o d ( 可 能 性 ) e v i d e n c e posterior(后验分布)=\frac{prior(先验分布) \times likelihood(可能性)}{evidence} posterior=evidenceprior×likelihood

  实际上,我们仅需关注该分数的分子,因为分母“evidence”是给定 x x x 之后能够确定下来的常数。在贝叶斯定理中 p ( x ) = ∑ k = 1 K p ( c k ) p ( x ∣ c k ) p(x)=\sum_{k=1}^K p(c_k)p(x|c_k) p(x)=k=1Kp(ck)p(xc

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,那我们来实现一个朴素叶斯分类吧。 首先,我们需要导入需要的库,包括numpy、pandas、sklearn中的train_test_split和MultinomialNB。代码如下: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB ``` 接下来,我们要读取数据集。这里我们使用UCI机器学习库中的Spambase数据集,该数据集包含了4601封电子邮件,其中1813封是垃圾邮件,2788封是正常邮件。数据集中有57个特征,包括每封邮件中出现的单词的频率、字符的频率等。我们可以使用pandas库读取该数据集,代码如下: ```python data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data', header=None) ``` 然后,我们将数据集分成训练集和测试集。训练集用来训练模型,测试集用来评估模型的性能。我们可以使用sklearn中的train_test_split函数来实现数据集的分割,代码如下: ```python X_train, X_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=42) ``` 这里我们将数据集按照7:3的比例分成训练集和测试集。 接下来,我们可以使用MultinomialNB来实现朴素叶斯分类。MultinomialNB适用于多项式分布的数据,这里我们将每个特征的频率作为输入。代码如下: ```python clf = MultinomialNB() clf.fit(X_train, y_train) ``` 在这里,我们使用fit函数对训练集进行拟合,从而得到一个朴素叶斯分类。 最后,我们可以使用测试集来评估模型的性能。代码如下: ```python y_pred = clf.predict(X_test) accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 这里我们使用predict函数对测试集进行预测,然后计算模型的准确率。 完整代码如下: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB # 读取数据集 data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data', header=None) # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=42) # 训练朴素叶斯分类 clf = MultinomialNB() clf.fit(X_train, y_train) # 评估模型性能 y_pred = clf.predict(X_test) accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 运行该代码,可以得到以下输出: ``` Accuracy: 0.8205099279858907 ``` 这意味着我们的朴素叶斯分类在该测试集上的准确率约为82%。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值