sklearn中的朴素贝叶斯模型

引入

朴素贝叶斯方法是一系列的监督学习方法, 其中朴素(naive)的含义是假设特征之间是相互独立的. 给定类别yy和特征向量x\mathbf{x}之后, 有:

P(yx1,,xn)=P(y)P(x1,xny)P(x1,,xn)P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots x_n \mid y)}{P(x_1, \dots, x_n)}

根据朴素性, 即特征之间相互独立的性质, 有:

P(xiy,x1,,xi1,xi+1,,xn)=P(xiy),P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y),

因此, 朴素贝叶斯通过下面的方法进行分类:

P(yx1,,xn)P(y)i=1nP(xiy)y^=argmaxyP(y)i=1nP(xiy)\begin{aligned} P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) \\ \Downarrow \\ \hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y) \end{aligned}

可以使用最大后验概率(Maximum A Posteriori, MAP)来对P(y)P(y)P(xiy)P(x_i \mid y)进行估计.

各种朴素贝叶斯分类器之间的区别, 主要在于假设的P(xiy)P(x_i \mid y)的分布形式的不同.

尽管假设条件过于理想, 朴素贝叶斯分类器在显示中很多情况下的表现还是很不错的, 例如:

  • 文档分类

  • 垃圾邮件分类

等各种分类问题. 仅需要很少量的数据来训练模型的参数. 关于朴素贝叶斯表现良好的理论解释, 在The optimality of Naive Bayes中有详细的说明.

此外, 相对于其他模型, 朴素贝叶斯一个巨大的优点是训练速度超级快.

但尽管朴素贝叶斯模型是一个表现相当不错的分类器, 但又是一个相当糟糕的estimator, 这里指的是它预测得到的每个类别的概率(predict_proba)是很不可靠的, 没有多少参考价值.

多种朴素贝叶斯模型

Gaussian Naive Bayes

对应于sklearn.naive_bayes.GaussianNB模型. 模型中, 关于特征的似然函数被假设为服从如下的高斯分布:

P(xiy)=12πσy2exp((xiμy)22σy2)P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right)

训练过程就是使用最大似然法估计分布参数σy\sigma_yμy\mu_y.

Multinomial Naive Bayes

对应于sklearn.naive_bayes.MultinomialNB模型. 适用于符合多项分布的数据. 多使用在text classification场景中, 例如特征是word counts或者tf-idf vectors. 假设有nn个特征, 对于每一个类yy, 特征向量的分布服从如下的参数向量θy=(θy1,,θyn)\theta_y = (\theta_{y1},\ldots,\theta_{yn}). 其中θyi\theta_{yi}即是P(xiy)P(x_i \mid y), 即对于一个样本, 特征ii在类别yy出现的概率.

训练的过程即是评估参数θy\theta_y的过程, 这里使用带有平滑的最大似然估计, 即参数由以下的方式得到:

θ^yi=Nyi+αNy+αn\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}

其中Nyi=xTxiN_{yi} = \sum_{x \in T} x_i是训练集中, 特征ii在类别yy中出现的次数, Ny=i=1nNyiN_{y} = \sum_{i=1}^{n} N_{yi}是类别yy中所有特征出现的总次数.

加入平滑项α0\alpha \ge 0防止在预测中, 某个特征永远不会出现的情况. 其中, 当α=1\alpha = 1时, 称为Laplace smoothing, 当α<1\alpha \lt 1时称为Lidstone smoothing.

Complement Naive Bayes

sklearn.naive_bayes.ComplementNB是标准的multinomial naive Bayes(MNB)的一种变形. 特别适用于不平衡的数据集. CNB使用每个类别统计量的互补部分来计算模型的参数权重. 相对于MNB来说, CNB估计得到的参数更稳定, 因此在text classification任务中往往有由于MNB的表现. 模型的参数如下得到:

θ^ci=αi+j:yjcdijα+j:yjckdkjwci=logθ^ciwci=wcijwcj\begin{aligned} \hat{\theta}_{ci} = \frac{\alpha_i + \sum_{j:y_j \neq c} d_{ij}}{\alpha + \sum_{j:y_j \neq c} \sum_{k} d_{kj}} \\ w_{ci} = \log \hat{\theta}_{ci} \\ w_{ci} = \frac{w_{ci}}{\sum_{j} |w_{cj}|} \end{aligned}

可以看到, 对于类别cc相关参数的计算, 是在所有非cc类的样本中加和计算得到的. 其中dijd_{ij}是样本jj中特征项ii的值, 可以是出现的次数统计或者tf-idf的值. 而且此时的平滑项跟细致, 对于每个特征ii都有对应的平滑项αi\alpha_i.

此外, 为了消除长样本对于模型参数的较大影响, 使用如下的方法预测样本的分类结果:

c^=argmincitiwci\hat{c} = \arg\min_c \sum_{i} t_i w_{ci}

样本被指认为补足量最小的类, 且与每个特征在该样本中的出现次数tit_i相关.

相关论文见: Tackling the poor assumptions of naive bayes text classifiers.

Bernoulli Naive Bayes

sklearn.naive_bayes.BernoulliNB假设所有特征都是符合伯努利分布的, 即特征值是二值的. 如果使用在文本分类任务中, 对应的特征就是该单词是否在这个样本中出现过. 程序中如果传入的训练数据是非二值的, 模型也会自动地将其转换成二值类型.

由于xix_i是二值的, 因此有:

P(xiy)=P(iy)xi+(1P(iy))(1xi)P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i)

由于它的训练过程与MNB类似, 只是特征值的不同, 因此如果时间允许, 最好使用两套特征分别训练MNB和BNB. 特别的, BNB适用于样本较短的情况(评论, 微博等情况).

参考资料

最后更新于

这有帮助吗?