朴素贝叶斯算法 👉 naive_bayes.MultinomialNB
朴素贝叶斯算法,主要用于分类. 例如:需要对垃圾邮件进行分类
分类思想 , 如何分类 , 分类的评判标准???
预测文章的类别概率, 预测某个样本属于 N个目标分类的相应概率,找出最大的可能性.也就是找出准确率最高的.
概率基础 :
概率定义为 一件事情发生的可能性. 例如: 扔一枚硬币,结果是头像朝上. 又或者 明天是晴天
有这样一个样本数据,要我们算出如下结果.
- 女神喜欢的概率? (4/7)
- 职业是程序员, 并且体型匀称的概率? (3/7*4/7)
- 在女神喜欢的条件下,职业是程序员的概率? (2/4)
- 在女神喜欢的条件下,职业是产品, 体重是超重的概率? (2/4*1/4=1/8)
联合概率和条件概率:
联合概率 :
包含多个条件,且所有条件同时成立的概率,记作: P(A,B) ; P(A,B)=P(A)P(B)
条件概率:
事件A在另外一个事件B已经发生条件下的发生概率,记作P(A|B);P(A1,A2|B)=P(A1|B)P(A2|B)
此条件概率的成立, 是由于A1,A2相互独立的结果. (即所有特征之间是条件独立的)
朴素贝叶斯介绍
- 前提就是 特征独立
- 最常用在文档分类的问题中. P(科技|文档), P(娱乐|文档)...
贝叶斯公式:
公式分为三部分:
P(C) : 每个文档类别的概率 (某文档类别数/总文档数量).
P(W|C) : 给定类别下的特征 (被预测文档中出现的词) 的概率.
计算方法:
P(F1|C) = Ni/N (训练文档中去计算)
Ni 为该F1词在C类别所有文档中出现的次数.
N 为所属类别C下的文档所有词出现的次数和P(F1,F2,...)预测文档中每个词的概率.
从上面的例子我们得到娱乐概率为0, 这是不合理的. 如果词频列表里面有很多出现次数都为0. 很可能计算结果都为零!!!
解决方法 : 拉普拉斯平滑
添加了拉普拉斯平滑系数,那么值会变大,但是不影响结果并改变了结果为0的值不为零.
sklearn 朴素贝叶斯API
sklearn.naive_bayes.MultinomialNB MultinomialNB(alpha = 1.0) 朴素贝叶斯分类 alpha:拉普拉斯平滑系数,默认为1.0
案例 :案例 :案例 :案例 :
# 案例: sklearn 20类新闻分类 # 20个新闻组数据集包含20个主题的18000个帖子 # 流程 # 1. 加载20类新闻数据,并进行分割 # 2. 生成文章特征词 # 3. 朴素贝叶斯estimator 流程进行预估 # 代码 from sklearn.datasets import fetch_20newsgroups # 20类新闻数据 from sklearn.model_selection import train_test_split # 数据分割API from sklearn.feature_extraction.text import TfidfVectorizer # 特征抽取API from sklearn.naive_bayes import MultinomialNB # 朴素贝叶斯API
# 1.获取所有数据 news = fetch_20newsgroups(subset='all') # 2.进行数据分割 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 👆 先分割是因为不知道要预测哪些值,所以先分割
# 3.对数据集进行特征抽取 tf = TfidfVectorizer() # 以训练集当中的词的列表进行每篇文章重要性统计 x_train = tf.fit_transform(x_train) x_test = tf.transform(x_test) # 4.进行朴素贝叶斯算法 bys = MultinomialNB(alpha=0.1) bys.fit(x_train, y_train) # 5.进行预测 y_predict = bys.predict(x_test) print("预测的文章类别为:", y_predict) print("准确率为:", bys.score(x_test, y_test))
朴素贝叶斯算法总结:
优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快。
缺点:
- 由于使用样本独立性假设,所以 如果样本属性有关联时 其效果不好。
- 因为是使用训练集中的数据进行统计词,所以训练集的准确度对结果的影响很大。