机器学习算法之--朴素贝叶斯总结

一、朴素贝叶斯算法数学原理

朴素贝叶斯算法属于监督学习的生成学习模型,实现简单,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。

(1)算法思路: 通过从训练数据学习先验概率分布和条件概率分布来学习联合概率分布,然后基于特征条件独立贝叶斯定理求得后验概率,将输入x分到后验概率最大的类别中,采用基于0,1损失函数下的期望风险最小化原则学习模型。

(2)两个特点

朴素: 假设各特征之间相互独立;(很强的假设,在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。在现实中不太可能成立,但是它可以大大简化计算,而且有研究表明对分类结果的准确性影响不大)
贝叶斯: 基于贝叶斯定理。

贝叶斯公式推导如下:
贝叶斯公式推导
贝叶斯分类器
(3)参数估计方法:采用极大似然估计法/贝叶斯估计
采用极大似然估计法来估计先验概率和条件概率分布,但会出现所要估计的概率值为0的情况,所以采用贝叶斯估计,思路就是在随机变量各个取值后加一个正数a,当a=0时,即为极大似然估计法

特别的,当a=1时,叫做拉普拉斯平滑(参数为1时的贝叶斯估计),就是对先验概率的分子(划分的计数)加1,分母加上类别数;对条件概率分子加1,分母加上对应特征的可能取值数量。这样在解决零概率问题的同时,也保证了概率和依然为1。

(4)应用:
文本分类(互联网新闻的分类)
垃圾邮件的筛选

(5)优缺点:
优点:
算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化即可!)
数据较小的时候仍然有效,可分类多类别
分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)
缺点:
朴素贝叶斯假设属性之间相互独立,这种假设在实际过程中往往是不成立的。在属性之间相关性越大,分类误差也就越大。

(6)小结
贝叶斯概率及贝叶斯准则提供了一种利用已知值来估计未知概率的有效方法。
需要考虑下溢出问题,可以通过取对数方法来解决,
对于文档分类问题,采用词袋模型比词集模型更有效,可以移除 停用词

二、朴素贝叶斯代码实现

分为两种实现
sklearn(调用库)
python3(机器学习实战源代码实现文本分类,垃圾邮件过滤)
代码在github

sklearn实现

sklearn中有3种不同类型的朴素贝叶斯:

  • 高斯分布型GaussianNB:用于classification问题,假定属性/特征服从正态分布的。
  • 多项式型MultinomialNB:用于离散值模型里。文本分类单词统计,以出现的次数作为特征值,特征非负。
  • 伯努利型BernoulliNB:用于离散特征,最后得到的特征只有0(没出现)和1(出现过)。BernoulliNB为以阈值来划分二进制或布尔型特性, 具体来说,每个特征的取值是布尔型的。

**

一、高斯朴素贝叶斯:sklearn.naive_bayes.GaussianNB(priors=None)

用于处理连续值高斯方式处理的是连续值
**

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(priors=[0.625, 0.375])#默认priors=None
clf.fit(X, y, sample_weight=None)#训练样本,X表示特征向量,y类标记,sample_weight表各样本权重数组
print (clf.class_prior_)#priors属性:获取各个类标记对应的先验概率
print (clf.priors)#class_prior_属性:同priors一样,
print (clf.class_count_)#class_count_属性:获取各类标记对应的训练样本数
print (clf.theta_)#theta_属性:获取各个类标记在各个特征上的均值
print (clf.sigma_)#sigma_属性:获取各个类标记在各个特征上的方差
print (clf.get_params(deep=True))#get_params(deep=True):返回priors与其参数值组成字典
clf.set_params(priors=[ 0.6,  0.4])#set_params(**params):设置估计器priors参数
print (clf.get_params(deep=True))
print (clf.predict([[-6,-6],[4,5]]))#预测样本分类
print (clf.predict_proba([[-6,-6],[4,5]]))#predict_proba(X):输出测试样本在各个类标记预测概率值
print (clf.predict_log_proba([[-6,-6],[4,5]]))#predict_log_proba(X):输出测试样本在各个类标记上预测概率值对应对数值
print (clf.score([[-6,-6],[-4,-2],[-3,-4],[4,5]],[1,1,2,2])) #score(X, y, sample_weight=None):返回测试样本映射到指定类标记上的平均得分(准确率)

# output:
# [0.625 0.375]
# [0.625, 0.375]
# [5. 3.]
# [[-3. -3.]
#  [ 2.  2.]]
# [[2.00000001 2.00000001]
#  [0.66666667 0.66666667]]
# {'priors': [0.625, 0.375]}
# {'priors': [0.6, 0.4]}
# [1 2]
# [[1.00000000e+00 3.29099984e-40]
#  [5.13191647e-09 9.99999995e-01]]
# [[ 0.00000000e+00 -9.09122123e+01]
#  [-1.90877867e+01 -5.13191623e-09]]
# 0.75

二、多项式朴素贝叶斯:sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

主要用于离散特征分类,例如文本分类单词统计,以出现的次数作为特征值,特征非负
参数说明:

  • alpha:浮点型,可选项,默认1.0(拉普拉斯平滑)
  • fit_prior:布尔型,可选项,默认True,表示学习先验概率,参数为False表示所有类标记具有相同的先验概率,不学习先验概率
  • class_prior:类似数组,数组大小为(n_classes,),默认None,类先验概率
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[1,2,3,4],[1,3,4,4],[2,4,5,5],[2,5,6,5],[3,4,5,6],[3,5,6,6]])
y = np.array([1,1,4,2,3,3])
clf = MultinomialNB(alpha=1, class_prior=None, fit_prior=False)
clf.fit(X, y, sample_weight=None)#训练样本,X表示特征向量,y类标记,sample_weight表各样本权重数组
print(clf.class_log_prior_)
#class_log_prior_:各类标记的平滑先验概率对数值,其取值会受fit_prior和class_prior参数的影响,三种情况
#若指定了class_prior参数,不管fit_prior为True或False,class_log_prior_取值是class_prior转换成log后的结果
#若fit_prior参数为False,class_prior=None,则各类标记的先验概率相同等于类标记总个数N分之一
#若fit_prior参数为True,class_prior=None,则各类标记的先验概率相同等于各类标记个数除以各类标记个数之和
print (clf.class_count_)#class_count_属性:获取各类标记对应的训练样本数
print (clf.feature_count_)#:各类别各个特征出现的次数,返回形状为(n_classes, n_features)数组)
print (clf.get_params(deep=True))#get_params(deep=True):返回priors与其参数值组成字典
print (clf.predict_log_proba([[3,4,5,4],[1,3,5,6]]))#predict_log_proba(X):输出测试样本在各个类标记上预测概率值对应对数值
print (clf.predict_proba([[3,4,5,4],[1,3,5,6]]))#predict_proba(X):输出测试样本在各个类标记预测概率值
print (clf.score([[3,4,5,4],[1,3,5,6]],[1,1]))#score(X, y, sample_weight=None):输出对测试样本的预测准确率的平均值
clf.set_params(alpha=2.0)#set_params(**params):设置估计器参数
print (clf.get_params(deep=True))

# output:
# [-1.38629436 -1.38629436 -1.38629436 -1.38629436]
# [2. 1. 2. 1.]
# [[ 2.  5.  7.  8.]
#  [ 2.  5.  6.  5.]
#  [ 6.  9. 11. 12.]
#  [ 2.  4.  5.  5.]]
# {'fit_prior': False, 'class_prior': None, 'alpha': 1}
# [[-1.70084964 -1.31750168 -1.29059819 -1.29257843]
#  [-1.00382273 -1.59845908 -1.58396998 -1.48652445]]
# [[0.18252837 0.26780353 0.27510617 0.27456193]
#  [0.36647582 0.20220787 0.205159   0.22615731]]
# 0.5
# {'fit_prior': False, 'class_prior': None, 'alpha': 2.0}

三、伯努利朴素贝叶斯:sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True,class_prior=None)

,类似于多项式朴素贝叶斯,也主要用户离散特征分类
与MultinomialNB的区别是:
MultinomialNB以出现的次数为特征值,BernoulliNB为二进制或布尔型特性,具体来说,每个特征的取值是布尔型的,即true和false,或者1和0。在文本分类中,就是一个特征有没有在一个文档中出现。
参数说明:
binarize:将数据特征二值化的阈值,大于此阈值为1,小于此阈值为0,(就多了一个参数,其他参数与多项式朴素贝叶斯相同)

猜你喜欢

转载自blog.csdn.net/qq_39751437/article/details/86521044