前言:参考《机器学习》,简单介绍朴素贝叶斯分类器
机器学习专栏:机器学习专栏
一、贝叶斯定理
贝叶斯定理(Bayes’ theorem)是概率论中的一个定理,描述在已知一些条件下,某事件的发生概率。
- 条件概率公式: P ( B ∣ A ) = P ( A , B ) P ( B ) P(B|A)=\frac {P(A,B)}{P(B)} P(B∣A)=P(B)P(A,B)
- 贝叶斯公式: P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B)=\frac{P(A,B)}{P(B)}=\frac {P(B|A)·P(A)}{P(B)} P(A∣B)=P(B)P(A,B)=P(B)P(B∣A)⋅P(A)
其中,
- P(A)是A的先验概率或边缘概率,它不考虑任何B方面的因素;
- P(A|B)是已知B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率;
- P(B|A)是已知A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率;
- P(B)是B的先验概率或边缘概率,也作标准化常量(normalized constant)。
二、贝叶斯分类法
现给定数据集 D = ( ( x ( 1 ) , y ( i ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) ) D={((x^{(1)},y^{(i)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}))} D=((x(1),y(i)),(x(2),y(2)),...,(x(m),y(m))),假设有K种可能的类别标记, C = { c 1 , c 2 , . . . , c K } C=\{c_1,c_2,...,c_K\} C={c1,c2,...,cK},则 , y ( i ) ∈ { c 1 , c 2 , . . . , c k } ,y^{(i)}\in\{c_1,c_2,...,c_k\} ,y(i)∈{c1,c2,...,ck}。
贝叶斯分类的实质就是:给定一个样本
x
(
i
)
x^{(i)}
x(i),其属于类别k的概率为:
P
(
c
k
∣
x
(
i
)
)
P(c_k|x^{(i)})
P(ck∣x(i)),贝叶斯分类的分类结果就是条件概率
P
(
c
∣
x
(
i
)
)
P(c|x^{(i)})
P(c∣x(i))(或者称为似然)最大的那个类别,即:
a
r
g
m
a
x
c
k
∈
C
P
(
c
k
∣
x
(
i
)
)
\mathop{arg\;max}\limits_{c_k\in C}\;P(c_k|x^{(i)})
ck∈CargmaxP(ck∣x(i))
我们将我们前面介绍的贝叶斯公式换成符合数据集D的形式:
P
(
c
∣
x
)
=
P
(
x
∣
c
)
⋅
P
(
c
)
P
(
x
)
P(c|x)=\frac {P(x|c)·P(c)}{P(x)}
P(c∣x)=P(x)P(x∣c)⋅P(c)
给定数据集的情况下,我们利用大数定律就可以确定
P
(
c
)
P(c)
P(c),对于确定的样本
x
x
x(
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
x=[x_1,x_2,...,x_n]
x=[x1,x2,...,xn])n为属性个数,对所有类别来说
P
(
x
)
P(x)
P(x)也是确定的。
假设各个属性相互独立(这就是“朴素”),则:
P
(
x
∣
c
)
=
∏
j
=
1
n
P
(
x
j
∣
c
)
P(x|c)=\prod_{j=1}^{n}P(x_j|c)
P(x∣c)=j=1∏nP(xj∣c)
基于上面所述的贝叶斯判定准则,可以得出朴素贝叶斯分类器的表达式为:
h
n
b
(
x
)
=
a
r
g
m
a
x
c
∈
C
P
(
c
)
∏
j
=
1
n
P
(
x
j
∣
c
)
h_{nb}(x)=\mathop{arg\;max}\limits_{c\in C}\;P(c)\prod_{j=1}^{n}P(x_j|c)
hnb(x)=c∈CargmaxP(c)j=1∏nP(xj∣c)
- 对离散属性,令
D
c
,
x
i
D_{c,x_i}
Dc,xi表示
D
c
D_c
Dc中在第j个属性上取值为
x
j
x_j
xj的样本组成的集合,则:
P ( x j ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ P(x_j|c)=\frac{|D_{c,x_i}|}{|D_c|} P(xj∣c)=∣Dc∣∣Dc,xi∣ - 对连续属性可使用概率密度函数,假定
p
(
x
j
∣
c
)
∼
N
(
μ
c
,
j
,
δ
c
,
i
2
)
p(x_j|c)\sim N(\mu_{c,j},\delta^2_{c,i})
p(xj∣c)∼N(μc,j,δc,i2),其中
μ
c
,
j
,
δ
c
,
i
2
\mu_{c,j},\delta^2_{c,i}
μc,j,δc,i2分别表示第c类样本在第i个属性上取值的均值和方差,则:
p ( x i ∣ c ) = 1 2 π δ c , i e x p ( − ( x i − μ c , i ) 2 2 δ c , i 2 ) p(x_i|c)=\frac{1}{\sqrt {2\pi}\delta_{c,i}}exp(-\frac{(x_i-\mu_{c,i})^2}{2\delta^2_{c,i}}) p(xi∣c)=2πδc,i1exp(−2δc,i2(xi−μc,i)2)
明显可以看出朴素贝叶斯分类器更适用于离散属性,所以我们也可以考虑连续离散化处理的方法。
三、sklearn实现贝叶斯分类
# -*- coding:utf-8 -*-
"""
@author: 1
@file: bayes.py
@time: 2019/11/30 1:25
"""
from sklearn.naive_bayes import GaussianNB
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df = pd.read_csv(r'D:\workspace\python\machine learning\data\iris.csv')
X = df.iloc[:, 0:3]
Y = df.iloc[:, 4]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
# 属性假设为高斯分布
gnb = GaussianNB()
model = gnb.fit(x_train, y_train)
y_pred = model.predict(x_test)
print('accuracy_score:', accuracy_score(y_test, y_pred))