分类算法之朴素贝叶斯算法
一、朴素贝叶斯概述
之前通过k-近邻算法来进行电影的分类,但是此种方法易受异常点的干扰,本质是通过欧式距离来进行类别的判断,而朴素贝叶斯则是将预测电影属于每一个类别的概率计算出来,从而判断最有可能属于的类别。
该算法常用于垃圾邮件的分类以及文章分类。例如:
上面确定一篇文章究竟是属于科技、金融还是娱乐。那么需要计算出该篇文章在每一个类别下的概率,然后再进行分类。
二、概率基础
(一)联合概率
包含多个条件,且每个条件同时成立的概率。记作:P(A,B)=P(A)*P(B)
(二)条件概率
事件A在事件B已经发生的条件下发生的概率。记作:P(A|B)
三、朴素贝叶斯
(一)公式
\[P(C|W) = \frac{{P(W|C)*P(C)}}{{P(W)}}\]
其中:
W为给定文档的特征值(频数统计,预测文档给定)
C为文档类型
公式可以理解为:
\[P(C|{F_1},{F_2},...) = \frac{{P(W|{F_1},{F_2},...)*P(C)}}{{P({F_1},{F_2},...)}}\]
其中C可以是不同类别。
上面的公式可以分成三个部分去理解:
- P(C)每个文档类别的概率(某文档类别词数/总文档词数)
- P(W|C)给定类别下特征(被预测文档中出现的词)的概率
其中:
𝑃(F1│C)=𝑁𝑖/𝑁 (训练文档中去计算)
𝑁𝑖为该F1词在C类别所有文档中出现的次数
N为所属类别C下的文档所有词出现的次数和
- P(F1,F2,…) 预测文档中每个词的概率
(二)实例
特征\统计 |
科技 |
娱乐 |
汇总(求和) |
“商场” |
9 |
51 |
60 |
“影院” |
8 |
56 |
64 |
“支付宝” |
20 |
15 |
35 |
“云计算” |
63 |
0 |
63 |
汇总(求和) |
100 |
121 |
221 |
现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?
科技:𝑃(影院,支付宝,云计算 │科技)∗P(科技)=8/100∗20/100∗63/100∗(100/221) =0.00456109
娱乐:𝑃(影院,支付宝,云计算│娱乐)∗P(娱乐)=56/121∗15/121∗0/121∗(121/221)=0
你可以发现娱乐分类计算出的概率是0,这样显然是不合适的,所以需要引入一个系数来防止这种情况的产生。
(三)拉普拉斯平滑
\[P({F_1}|C) = \frac{{Ni + \sigma }}{{N + \sigma m}}\]
𝛼为指定的系数一般为1,m为训练文档中统计出的特征词个数。
(四)sklearn朴素贝叶斯实现
1、sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 朴素贝叶斯分类
- alpha拉普拉斯平滑系数
2、算法案例
- 描述
sklearn中20类新闻分类
- 案例流程
(1)加载20类新闻数据,并进行分割
(2)生成文章特征词
(3)朴素贝叶斯estimator流程进行预估
- 源码说明
from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB def naive_bytes(): """ 朴素贝叶斯进行文本分类 :return: None """ #获取数据 news = fetch_20newsgroups(subset='all') #进行数据分割 x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25) #对数据集进行特征抽取 tf = TfidfVectorizer() #以训练集当中的词的列表进行每篇文章重要性统计 x_train = tf.fit_transform(x_train) print(tf.get_feature_names()) #特征值 x_test = tf.transform(x_test) #进行朴素贝叶斯算法预测 mlt = MultinomialNB(alpha=1.0) mlt.fit(x_train,y_train) y_predict = mlt.predict(x_test) print("文章的预测类别为:",y_predict) #准确率 print("准确率为:",mlt.score(x_test,y_test)) return None if __name__ == '__main__': naive_bytes()
(五)朴素贝叶斯的优缺点
1、优点
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快
2、缺点
由于事先假设样本属性是相互独立的,所以对于属性有关联的样本预测效果并不好。