深度学习 神经网络python专题python干货

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

2021-03-01  本文已影响0人  升不上三段的大鱼

1. 贝叶斯准则

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

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

上一篇下一篇

猜你喜欢

热点阅读