朴素贝叶斯法的学习与分类
先验概率
反映了我们在实际观察之前对某种状态的预期。绝大多数情况下,是根据过去的观测统计得到的数据计算可能性。且所有可能性概率之和为1。
例如,投掷硬币1000次,进行多个回合后的测试可发现,有1/2的概率丢到正面,1/2的概率成为反面。因此,可以说得到正面 或得到反面 的先验概率是 1/2 的。
正常情况下,可以基于先验做出决策。
例如,统计北京的天气情况可以发现,一年中近乎80%的时间天气是晴朗无雨的,那么在判断是否进行某种运动时,则可以根据此概率确定。
直接使用先验概率的局限很大 。
它在不同的时间段内总是做出同样的预测,这是极其不适用的;例如,预测同一年龄段的老年人是否有高血压时,不能单靠先验概率进行直接判断,而是需要考虑到个人的家庭因素、作息等情况。
其次,它无法利用现有的信息进行决策。
最后,如果先验概率是均匀的,那么规则效果不佳。例如,在投掷硬币时,正反面的概率均为1/2,对下一次的投掷结果进行预测,就没有任何的优势,基本是靠猜测。
解决办法 :引入特征。可以引入多个观测变量,形成一个特征空间,即进行观测值采样的空间。借助这些观测变量features,进一步推论结果。使得这一结果考虑了多个因素而更具准确率。
条件独立性
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) \begin{aligned} P(X&=x | Y=c_{k} )=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right) \\ &=\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) \end{aligned}
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) ∣ Y = c k ) = j = 1 ∏ n P ( X ( j ) = x ( j ) ∣ Y = c k )
后验概率
给定观测向量X,某个特定类别的概率P ( y ∣ x ) P(y|x) P ( y ∣ x )
选择拥有最大后验概率(MAP)的类别作为预测结果==>y ∗ = a r g m a x P ( y i ∣ x ) y^* = argmaxP(y_i | x) y ∗ = a r g m a x P ( y i ∣ x )
犯错概率 :P ( e r r ∣ x ) = m i n [ P ( y 1 ∣ x ) , P ( y 2 ∣ x ) ] P(err|x) = min[P(y_1|x),P(y_2|x)] P ( e r r ∣ x ) = m i n [ P ( y 1 ∣ x ) , P ( y 2 ∣ x ) ] ,错误分类在很多情况下导致的后果是很严重的,不同的错误带来的损失是不同的。λ i j \lambda_{ij} λ i j 表示正确的分类为 j ,但是预测结果是 i 时的损失。
条件风险
期望损失: $$R(y_i | x) = \sum_{j=1}^n \lambda_{ij}P(y_j | x) $$
也就是说,当某样本结果真实值为j,但却被预测为i,损 失 值 × 被 预 测 为 j 的 概 率 损失值 \times 被预测为j的概率 损 失 值 × 被 预 测 为 j 的 概 率
0 - 1条件风险: R ( y i ∣ x ) = 1 − P ( y i ∣ x ) R(y_i | x) = 1 - P(y_i | x) R ( y i ∣ x ) = 1 − P ( y i ∣ x ) ,即 (1 - 分类正确时的概率)。
贝叶斯最优分类:选择条件风险/0-1条件风险最小的结果。
当选择一个P ( y k ∣ x ) P(y_k | x) P ( y k ∣ x ) 最大的结果,表示当k为最后预测结果时,R ( y k ∣ x ) R(y_k | x) R ( y k ∣ x ) 此时最小,故风险也是最小的。那么K就是最优分类。
贝叶斯定理
朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。
P ( Y ∣ X ) = P ( X , Y ) P ( X ) = P ( Y ) P ( X ∣ Y ) ∑ Y P ( Y ) P ( X ∣ Y ) P(Y | X)=\frac{P(X, Y)}{P(X)}=\frac{P(Y) P(X | Y)}{\sum_{Y} P(Y) P(X | Y)}
P ( Y ∣ X ) = P ( X ) P ( X , Y ) = ∑ Y P ( Y ) P ( X ∣ Y ) P ( Y ) P ( X ∣ Y )
将输入x x x 分到后验概率最大的类y y y 。
y = arg max c k P ( Y = c k ) ∏ j = 1 n P ( X j = x ( j ) ∣ Y = c k ) y=\arg \max _{c_{k}} P\left(Y=c_{k}\right) \prod_{j=1}^{n} P\left(X_{j}=x^{(j)} | Y=c_{k}\right)
y = arg c k max P ( Y = c k ) j = 1 ∏ n P ( X j = x ( j ) ∣ Y = c k )
后验概率最大等价于0-1损失函数时的期望风险最小化。
sklearn实现
朴素贝叶斯类库概述
scikit-learn中,一共有3个朴素贝叶斯的分类算法类 ,分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。
这三个类适用的分类场景各不相同:
如果样本特征的分布大部分是连续值 ,使用GaussianNB 会比较好。
如果如果样本特征的分大部分是多元离散值 ,使用MultinomialNB 比较合适。
如果样本特征是二元离散值或者很稀疏的多元离散值 ,应该使用BernoulliNB 。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import numpy as npimport pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.naive_bayes import GaussianNBfrom sklearn.model_selection import train_test_splitdataset = load_iris() x, y = dataset.data, dataset.target x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2 ) clf = GaussianNB().fit(x_train, y_train) y_predict = clf.predict(x_test) acc = sum (y_test == y_predict) / x_test.shape[0 ] clf.score(x_test, y_test)