机器学习实战——朴素贝叶斯
机器学习实战——朴素贝叶斯
1 模型介绍
1.1 朴素贝叶斯分类器
朴素贝叶斯是基于贝叶斯定理及特征条件独立的假设来实现分类的方法,就是在已知先验概率的前提下,求后验概率的最大值。
设样本集合为
x
x
x ,其属性集合为
{
x
1
,
x
2
,
⋯
 
,
x
d
}
\{x_1,x_2,\cdots,x_d\}
{x1,x2,⋯,xd} ,即某一样本的特征属性数目为
d
d
d ,对应的类标记(标签)为
y
=
{
c
1
,
c
2
,
⋯
 
,
c
N
}
y=\{c_1,c_2,\cdots,c_N\}
y={c1,c2,⋯,cN} ,则特征集合
x
x
x 具有类标记
c
c
c 的条件概率可以表示为:

基于贝叶斯定理,等价于如下形式

通过对条件概率分布作独立同分布的强假设,可以转化成如下形式

其中
d
d
d 为属性数目,
x
i
x_i
xi为
x
x
x 在第
i
i
i 个属性上的取值。
由上式可知,
P
(
x
)
P(x)
P(x) 与类标记无关,要求条件概率
P
(
c
∣
x
)
P(c\mid x)
P(c∣x) 的最大值,只需要求分子的最大值,即:

1.2 朴素贝叶斯的参数估计
一般可以使用两种方法对其参数进行估计,即:极大似然估计与贝叶斯估计。
极大似然参数估计:依据上述求最大值的公式

利用样本的已知先验概率来计算最大的后验概率。
贝叶斯参数估计:利用极大似然估计可能会出现所要估计的概率值为 0 的情况(某一属性在样本集中没有出现,无论其它属性多明显的表明所属的类别,但连乘计算的概率值都为 0 ),为了解决这一问题,可以引入合理的
λ
,
K
\lambda,K
λ,K ,其条件概率可以表示为:
P ( x i ∣ c ) = P ( x i , c ) + λ P ( c ) + K λ P(x_i\mid c)=\frac{P(x_i,c)+\lambda}{P(c)+K\lambda} P(xi∣c)=P(c)+KλP(xi,c)+λ
2 朴素贝叶斯在Sklearn中的实现
根据处理 P ( x i ∣ c ) P(x_i\mid c) P(xi∣c) 分布所做的假设不同,在 scikit-learn中,一共有 3 个朴素贝叶斯的分类算法类,分别是 GaussianNB,MultinomialNB 和 BernoulliNB 。这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用 GaussianNB 会比较好;如果如果样本特征的分大部分是多元离散值,使用 MultinomialNB 比较合适;而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用 BernoulliNB。
2.1 GaussianNB分类算法
GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布:

class sklearn.naive_bayes.GaussianNB(priors=None)
priors:默认不给出,表示获取各类别的先验概率。
朴素贝叶斯在sklearn中的调用,与sklearn中其他机器学习方法的训练与预测类似,但其有一个比较特殊的增量式训练方法,另外两个模型也有同样的增量模型算法:
partial_fit(X, y, classes=None, sample_weight=None):若训练数据集数据量非常大,不能一次性全部载入内存时,可以将数据集划分若干份,重复调用partial_fit在线学习模型参数,在第一次调用partial_fit函数时,必须制定classes参数(一般是训练集的全部分类类型),在随后的调用可以忽略。
import numpy as np
from sklearn.naive_bayes import GaussianNB
X = np.array([[-1, -1], [-2, -2], [-3, -3],[-4,-4],[-5,-5], [1, 1], [2,2], [3, 3]])
Y = np.array([1, 1, 1,1,1, 2, 2, 2])
# 定义朴素贝叶斯对象
clf = GaussianNB()
# 调用对象
clf.fit(X,Y)
# 测试数据
clf.predict([[-6,-6],[4,5]])
# 调用增量训练模型
clf_pf = GaussianNB()
clf_pf.partial_fit(X, Y, np.unique(Y))
clf_pf.predict([[-0.8, -1]])
2.2 MultinomialNB分类算法
MultinomialNB 假设特征的先验概率为多项式分布,即如下式:

class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
alpha:浮点数,就是引入平滑的值 α \alpha α , α = 1 \alpha=1 α=1 表示拉普拉斯平滑;
fit_prior:表示先验概率,默认True,学习先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率;
class_prior:指定分类的先验概率,默认为空;
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
clf = MultinomialNB()
clf.fit(X, y)
clf.predict(X[2:3])
2.3 BernoulliNB分类算法
BernoulliNB 假设特征的先验概率为二元伯努利分布,即如下式:

class sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
binarize:一个浮点数或者None,如果为浮点数则以该数值为界,特征值大于它的取1,小于的为0 。如果为None,假定原始数据已经二值化
其它参数同上。
import numpy as np
from sklearn.naive_bayes import BernoulliNB
X = np.random.randint(2, size=(6, 100))
Y = np.array([1, 2, 3, 4, 4, 5])
clf = BernoulliNB()
clf.fit(X, Y)
clf.predict(X[2:3])
参考资料
1 https://www.cnblogs.com/pinard/p/6074222.html
2 https://blog.csdn.net/kancy110/article/details/72763276
3 http://sklearn.apachecn.org/cn/0.19.0/modules/naive_bayes.html
更多推荐

所有评论(0)