朴素贝叶斯(Naive Bayes)
一、简介
首先介绍一下贝叶斯:
贝叶斯(约1702-1761) Thomas Bayes,英国数学家。
约1702年出生于伦敦,做过神甫。1742年成为英国皇家学会会员。1761年4月7日逝世。贝叶斯在数学方面主要研究概率论。
他首先将归纳推理法用于概率论基础理论,并创立了贝叶斯统计理论,对于统计决策函数、统计推断、统计的估算等做出了贡献。
朴素贝叶斯算法:
朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法。
朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。
二、概率基础
1.联合概率
联合概率:表示两个事件共同发生的概率。A与B的联合概率记为P(A,B)。
2.条件概率
条件概率:指事件A在另外一个事件B已经发生条件下的发生概率。记为P(A|B),读作“在B的条件下A的概率”。
三、贝叶斯公式
在给定类变量y和从属特征向量x1到xn的情况下,贝叶斯定理表明了以下关系:
egin{align} otag P(y|x_{1},x_{2},...,x_{n}) = frac{P(x_{1},x_{2},...,x_{n} | y)P(y)}{P(x_{1},x_{2},...,x_{n}))} end{align}
使用条件独立假设:egin{align} otag P(x_{1},x_{2},...,x_{n}|y) = P(x_{1}|y)P(x_{2}|y)...P(x_{n}|y) end{align}
可以得到:egin{align} otag P(y|x_{1},x_{2},...,x_{n}) = frac{P(y)prod_{i=1}^{n}P(x_{i}| y)}{P(x_{1},x_{2},...,x_{n})} end{align}
四、计算举例
在一个训练集中,m类文章有30篇,n类文章有70篇,其中出现A、B、C、D四个词的个数如下表所示。
m | n | |
---|---|---|
A | 7 | 55 |
B | 11 | 51 |
C | 21 | 15 |
D | 64 | 0 |
总计 | 103 | 121 |
当要预测的文章中出现了B、C、D三个词,则该文章属于m类还是n类?
属于m类的概率为:
egin{align} otag P(m|B,C,D) = frac{P(m)P(B,C,D| m)}{P(B,C,D)} =frac{11}{103}cdot frac{21}{103}cdot frac{64}{103}cdot frac{30}{100} div P(B,C,D) =frac{0.00405}{P(B,C,D)} end{align}
属于n类的概率为:egin{align} otag P(n|B,C,D) = frac{P(n)P(B,C,D| n)}{P(B,C,D)} =frac{51}{121}cdot frac{15}{121}cdot frac{0}{121}cdot frac{70}{100} div P(B,C,D) =frac{0}{P(B,C,D)} end{align}
由上面计算得:egin{align} otag P(m|B,C,D) > P(n|B,C,D) end{align}
则预测该文章属于m类。五、拉普拉斯平滑(Laplace smoothing)
当某个分量在训练集某个分类中从没出现过,会导致整个实例的计算结果为0,如上面属于n类的概率。为了解决这个问题,使用拉普拉斯平滑进行处理,公式如下。
egin{align} otag hat{} heta_{yi} = frac{N_{yi}+alpha}{N_{y}+alpha n} end{align}
其中alpha为平滑系数,一般取值为1。上式表示在分子上加1,在分母上加上1乘以特征的数量即可。上述例子中属于n类的概率为:
egin{align} otag P(m|B,C,D) = frac{P(m)P(B,C,D| m)}{P(B,C,D)} =frac{51+1}{121+1 imes 4}cdot frac{15+1}{121+1 imes 4}cdot frac{0+1}{121+1 imes 4}cdot frac{70}{100} div P(B,C,D) =frac{0.00298}{P(B,C,D)} end{align}
六、优缺点
1. 优点
- 发源于古典数学理论,有稳定的分类效率
- 对缺失数据不太敏感,算法简单,常用于文本分类
- 分类准确率高,速度快
2. 缺点
- 基于样本特征独立的假设,如果特征有关联是效果不好
七、API
sklearn.naive_bayes.MultinomialNB(alpha=1.0)
alpha
:平滑系数
八、简单示例
from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
news_train = fetch_20newsgroups(subset="train")
news_test = fetch_20newsgroups(subset="test")
tfidf = TfidfVectorizer()
news_train_data = tfidf.fit_transform(news_train.data)
news_train_target = news_train.target
news_test_data = tfidf.transform(news_test.data)
news_test_target = news_test.target
mnb = MultinomialNB()
mnb.fit(news_train_data,news_train_target)
print("准确率为:",mnb.score(news_test_data,news_test_target))
我一直在,守着你的天真和笑容。——《哆啦A梦》