朴素贝叶斯
朴素贝叶斯(Naive Bayes)是一种基于概率理论的监督学习算法。
这里提下贝叶斯公式,
\(P(C,X) = P(C|X)P(X)=P(X|C)P(C)\)
\(P(C|X) = \frac{P(X|C)P(C)}{P(X)}\)
现在我希望我预测的 \(\hat{C} = argmax_{c_j\in C}P(c_j|T)\),C表示所有label,T是测试数据
从而有,\(\hat{C} = argmax_{c_j\in C} \frac{P(T|c_j)P(c_j)}{P(T)} = argmax_{c_j\in C}P(T|c_j)P(c_j)\)
假设\(T=(x1,x2,x3,...,xn)\),得到
为了简化问题,我们naive地假设数据是依条件相互独立的,从而
另外,还有两个实际操作中的假设是1. 频率=概率 2. 训练集与测试集同分布。
sklearn
官方文档放在这里,里面包括几种NB的形式,下面展示了一个多项NB的使用。
# class sklearn.naive_bayes.MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)
>>> import numpy as np
>>> rng = np.random.RandomState(1)
>>> X = rng.randint(5, size=(6, 100))
>>> y = np.array([1, 2, 3, 4, 5, 6])
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.fit(X, y)
MultinomialNB()
>>> print(clf.predict(X[2:3]))
[3]
最后是注意Smoothing的事项,因为实际中会出现很多0的概率(频率)导致整个概率乘积为0。在sklearn中也可以指定。
另外朴素贝叶斯也可以处理特征是连续值的情况,这时我们就需要知道这个特征是服从什么分布的,然后根据样本来估计这个分布的密度函数从而得到这个特征的密度代入公式进行计算。