朴素贝叶斯分类器(Navie Bayes)
一、原理:贝叶斯原理(基于条件概率、全概率公式的贝叶斯公式)
已知类别概率:
∑
i
=
1
n
C
i
=
1
\sum^n_{i=1}{C_i = 1}
i=1∑nCi=1
已知属性概率:
∑
j
=
1
m
A
j
=
1
\sum^m_{j=1}{A_j = 1}
j=1∑mAj=1
求:在
A
j
A_j
Aj 组合发生时,
C
i
C_i
Ci的概率。
P
(
C
i
∣
A
1
⋯
A
m
)
=
P
(
A
1
⋯
A
m
∣
C
i
)
⋅
P
(
C
i
)
P
(
A
1
⋯
A
m
)
=
∑
i
=
1
n
P
(
A
1
⋯
A
m
⋅
C
i
)
P(C_i|A_1 \cdots A_m) = \frac{P(A_1 \cdots A_m | C_i)\cdot P(C_i)}{P(A_1 \cdots A_m) =\sum^n_{i=1}{P(A_1 \cdots A_m \cdot C_i)}}
P(Ci∣A1⋯Am)=P(A1⋯Am)=∑i=1nP(A1⋯Am⋅Ci)P(A1⋯Am∣Ci)⋅P(Ci)
名字中的朴素体现在所有属性变量是独立的: P ( A 1 ⋯ A m ∣ C i ) = P ( A 1 ∣ C i ) ⋯ P ( A m ∣ C i ) P(A_1 \cdots A_m|C_i) = P(A_1|C_i) \cdots P(A_m|C_i) P(A1⋯Am∣Ci)=P(A1∣Ci)⋯P(Am∣Ci)
当属性为离散值时,概率可直接根据频率求得;
当属性为连续值时,可由其服从的概率分布求得:
Excel中的NORMDIST函数:
NORMDIST(x,mean,standard_dev,cumulative)
x:正态分布中,需要计算的数值;
Mean:正态分布的平均值;
Standard_dev:正态分布的标准差;
Cumulative:取值为逻辑值,即False或True,决定了函数的形式当为True时,函数结果为累积分布
当为False时,函数结果为概率密度
NORMDIST(180,179.5,3.697,0)=0.1069
from scipy import stats
mu = 179.5
sigma = 3.697
x = 180
prob = stats.norm.pdf(x, mu, sigma)
print(prob)
import numpy as np
print(np.log2(0.4))
print(np.log2(0.2))
此时的先验概率:
P
(
C
i
)
P(C_i)
P(Ci)
此时的后验概率:
P
(
C
i
∣
A
1
⋯
A
m
)
P(C_i|A_1 \cdots A_m)
P(Ci∣A1⋯Am)
二、Python中的朴素贝叶斯分类器
sklearn中包括三种不同分布的朴素贝叶斯分类器:正态分布、伯努利分布、多项式分布。
1.伯努利分布即为两点分布(0-1分布)
P
(
X
=
1
)
=
p
P(X = 1) = p
P(X=1)=p
P
(
X
=
0
)
=
1
−
p
P(X = 0) = 1-p
P(X=0)=1−p
from sklearn.naive_bayes import BernoulliNB
#伯努利朴素贝叶斯:特征变量是布尔变量,符合0/1分布,在文档分类中特征是单词是否出现
BernoulliNB(alpha=1.0, fit_prior=True, class_prior=None)
#alpha:平滑因子,与多项式中的alpha一致
#fit_prior:是否去学习类的先验概率,默认是True
#class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,即类别数N分之一
#模型对象的属性:
#class_count_: 训练样本中各类别对应的样本数
#feature_count_: 每个类别中各个特征出现的次数
# 创建BernoulliNB分类器
model = BernoulliNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('BernoulliNB准确率: %0.4lf' % accuracy_score(predict_y, test_y))
2.二项分布
n
n
n重伯努利试验成功次数的概率分布,被称为二项分布。
X
B
(
n
,
p
)
X~B(n, p)
X B(n,p)
P
(
X
=
k
)
=
C
n
k
p
k
(
1
−
p
)
n
−
k
P(X = k) = C^k_np^k(1-p)^{n-k}
P(X=k)=Cnkpk(1−p)n−k
显然:
∑
k
=
0
n
P
(
X
=
k
)
=
∑
k
=
0
n
C
n
k
p
k
(
1
−
p
)
n
−
k
=
1
\sum^n_{k=0}{P(X = k)} =\sum^n_{k=0}{C^k_np^k(1-p)^{n-k}} = 1
∑k=0nP(X=k)=∑k=0nCnkpk(1−p)n−k=1
3.多项式分布
若对于每个实验的结果不止有两个,二是有多个(掷色子问题),则对应的每个结果的概率分布服从多项式分布。
from sklearn.naive_bayes import MultinomialNB
#多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,
#在文档分类中特征变量体现在一个单词出现的次数,或者是单词的TF-IDF值等
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
#alpha:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑
#fit_prior:是否去学习类的先验概率,默认是True
#class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,即类别数N分之一
#模型对象的属性:
#class_count_: 训练样本中各类别对应的样本数
#feature_count_: 每个类别中各个特征出现的次数
# 创建MultinomialNB分类器
model = MultinomialNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('MultinomialNB准确率: %0.4lf' % accuracy_score(predict_y, test_y))
print(model.class_log_prior_)
print(model.intercept_)
print(model.feature_log_prob_)
print(model.coef_)
print(model.class_count_)
print(model.feature_count_)
4.高斯分布(正态分布)
sklearn工具使用:
from sklearn.naive_bayes import GaussianNB
#高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度
GaussianNB(priors=None) #模型创建
#priors,先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法)
#查看模型对象的属性:
#class_prior_:每个类别的概率
#class_count_:每个类别的样本数量
#theta_:每个类别中每个特征的均值
#sigma_:每个类别中每个特征的方差
# 创建GaussianNB分类器
model = GaussianNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('GaussianNB准确率: %0.4lf' % accuracy_score(predict_y, test_y))
print(model.class_prior_)
print(model.class_count_)
print(model.theta_)
print(model.sigma_)
三、 朴素贝叶斯分类:
- 常用于文本分类,文本过滤、情感预测、推荐系统等,尤其是对于英文等语言来说,分类效果很好
0)准备阶段,需要确定特征属性,属性值以及label => 训练集
1)训练阶段,输入是特征属性和训练样本,输出是分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率
2)应用阶段,使用分类器对新数据进行分类