LionKing数据科学专栏

购买普通会员高级会员可以解锁网站精华内容且享受VIP服务的优惠

想要查看更多数据科学相关的内容请关注我们的微信公众号知乎专栏

朴素贝叶斯(naive Bayes)原理及算法实现

朴素贝叶斯原理

朴素贝叶斯方法是一个适用于多分类的生成模型。不同于对$\Pr[Y=1|X]$直接建模的判别模型,例如逻辑回归;生成模型需要对$\Pr[Y]$和$\Pr[X|Y]$进行建模。

假设数据为$(x_1^{(1)}, x_2^{(1)}, \ldots, x_p^{(1)}, y^{(1)}), \ldots, (x_1^{(n)}, x_2^{(n)}, \ldots, x_p^{(n)}, y^{(n)})$。其中目标变量$y$取值于$\{C_1, \ldots, C_K\}$。

朴素贝叶斯假设每个类别有一个先验概率$p_k = \Pr[Y = C_k], p_1 + \ldots + p_K = 1$

核心假设是在给定$Y = C_k$的条件下,各个特征条件独立

$$\Pr[X_1 = x_1, \ldots, X_p = x_p|Y = C_k] = \prod_{j=1}^{p}\Pr[X_j = x_j|Y = C_k]$$

根据训练数据我们对先验概率$p_k$和条件概率$\Pr[X_j|Y = C_k]$进行学习,在预测阶段我们根据贝叶斯定理(Bayes' theorem)找到后验概率最大的类别$k$:

$$\begin{align*} \hat{y} &= \arg\max_{k = 1, \ldots, K}\Pr[Y = C_k|X_1 = x_1, \ldots, X_p = x_p]\\ &= \arg\max_k\Pr[Y = C_k]\Pr[X_1 = x_1, \ldots, X_p = x_p|Y = C_k]\\ &= \arg\max_kp_k\prod_{j=1}^{p}\Pr[X_j = x_j|Y = C_k] \end{align*}$$

算法

训练阶段

预测阶段

需要购买普通会员高级会员登录后刷新该页面查看

Python实现

我们来看一个简单的情感分析的实现:

from sklearn import naive_bayes
import numpy as np

# 生成数据
vocabulary = ['i', 'you', 'like', 'love', 'hate', 'is', 'am', 'are', 'not', 'smart', 'he', 'she', 'good', 'nice', 'bad', 'worse', 'her']
raw_sentence = ['i like you', 'i love her', 'i am smart', 'you are good', 'she is nice', 'she is bad', 'he hate you', 'he is not smart', 'he hate her', 'i have you', 'he is smart', 'she is good', 'i not like her', 'i like her', 'you love smart her', 'you hate he', 'he is not nice']
y = np.array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0])
p = len(vocabulary)
n_train = int(len(raw_sentence) * 0.8)
n_test = len(raw_sentence) - n_train
X = np.zeros((n_train + n_test, p))
for i in range(n_train + n_test):
    for j in range(p):
        X[i, j] = vocabulary[j] in raw_sentence[i].split()
X_train = X[:n_train, ]
y_train = y[:n_train]
X_test = X[n_train:, ]
y_test = y[n_train:]

# 创建朴素贝叶斯分类器
naive_bayes_classifier = naive_bayes.MultinomialNB()
# 训练模型
naive_bayes_classifier.fit(X_train, y_train)
# 预测句子
yhat_test = naive_bayes_classifier.predict(X_test)
# 打印预测结果
for i in range(n_test):
    print('%s => %s' % (raw_sentence[n_train + i], '正面情绪' if yhat_test[i] else '负面情绪'))
        
输出:

i like her => 负面情绪
you love smart her => 正面情绪
you hate he => 负面情绪
he is not nice => 负面情绪
        

常见面试问题

Q:朴素贝叶斯有哪些优缺点?

需要购买普通会员高级会员登录后刷新该页面查看

更多机器学习相关问题见本网站论坛机器学习理论版面机器学习实践版面

更多面试问题见面试真题汇总

想要查看更多数据科学相关的内容请关注我们的微信公众号知乎专栏