机器学习-贝叶斯分类和朴素贝叶斯

1. 贝叶斯准则

首先介绍一下基本概念(概率论基础就不多了):

  • x \in \mathbb{R}^d:d维特征向量
  • y:分类编号,对于二分类问题就是{0,1}或者{-1, +1}
  • p(y):先验概率
  • p(x):证据因子(d维特征空间的特征分布)
  • p(x,y):联合概率密度函数
  • p(x | y):类条件密度
  • p(y|x):后验概率
  • 贝叶斯准则
    p(y|x)=\frac{p(y) \cdot p(x|y)}{p(x)}

L(y_1, y_2)是一个损失函数,其中y_1表示预测的分类, y_2表示真实的分类,那么这个损失函数就是:L(y_1, y_2) = \begin{cases} 0, if \quad y_1=y_2\\ 1,else \end{cases}
我们想要寻找一个最优的判定准则,使得分类的平均损失最小:
y^* = \mathop{argmin}_{y} \sum_{y'}L(y',y) \cdot p(y'|x)
计算可得贝叶斯最优分类器:
\begin{equation} y^* = \mathop{argmax}_{y}(p(y|x)) =\mathop{argmax}_{y} \frac{p(y) \cdot p(x|y)}{p(x)} \end{equation}
可以看到,对于一个分类模型,关键在于计算后验概率 p(y|x)。直接建模估计后验概率p(y|x)的被称为判别模型(discriminative model);而根据贝叶斯公式,估计先验概率p(y)和条件概率p(x| y)的模型被称为生成模型(generative model)。

常见的生成模型包括朴素贝叶斯,隐马可夫模型等;常见的判别模型有决策树、神经网络、SVM等。

2. 朴素贝叶斯

上面提到的贝叶斯分类器需要估计联合概率,在计算上会遇到组合爆炸的问题。而朴素贝叶斯假设特征之间相互独立,可以说是非常简单朴素的假设,又被叫做“Idiot's Bayes”。

特征向量的所有d个特征都是相互独立的,因此可以得到:
p(x|y) = \sum_{i+1}^d p(x_i|y)
根据上面贝叶斯判定准则,可以得到朴素贝叶斯的判定准则:
y^* = \mathop{argmax}_{y} p(y|x)
\quad = \mathop{argmax}_{y} p(y)p(\mathbf{x}|y)
\quad = \mathop{argmax}_{y} p(y)\prod_{i=1}^d p(x_i|y)

朴素贝叶斯虽然很简单,但是应用仍然很广泛。

放一个调用sklearn的代码(调包真的快乐):

from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

data = load_iris() #读入iris数据集
X, y, column_names = data['data'], data['target'], data['feature_names']
X = pd.DataFrame(X, columns=column_names)
X_train, X_val, y_train, y_val = train_test_split(X,y, random_state=44) #划分训练集和测试集

model = GaussianNB() #调用朴素贝叶斯模型
model.fit(X_train, y_train) #训练
acc = accuracy_score(y_val, model.predict(X_val)) #预测

print(acc)
# 0.9210526315789473

如果想自己实现朴素贝叶斯,也可以参考:https://towardsdatascience.com/implementing-naive-bayes-in-2-minutes-with-python-3ecd788803fe

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容