Machine Learning——“朴素“ 贝叶斯算法(分类算法)

一、朴素贝叶斯概述

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法

朴素:代表特征独立,为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独立,那么这个等式就成立了!

分类思想:对不同类别都进行统计,得出当前事件属于每个分类的概率,最终根据类别占比大的为当前事件定类。

1、算法原理

朴素贝叶斯,它是一种简单但极为强大的预测建模算法。之所以称为朴素贝叶斯,“朴素” 是因为它假设每个输入变量是独立的,这个假设很硬,现实生活中根本不满足,但是这项技术对于绝大部分的复杂问题仍然非常有效。

那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?

是下面这个贝叶斯公式:

换个表达形式就会明朗很多,如下:

我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。

2、朴素贝叶斯的研究流程

可以看到,整个朴素贝叶斯分类分为三个阶段:

  •       第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
  •       第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
  •       第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

3、贝叶斯原理、贝叶斯分类和朴素贝叶斯这三者之间是有区别的

贝叶斯原理是最大的概念,它解决了概率论中“逆向概率”的问题,在这个理论基础上,人们设计出了贝叶斯分类器,朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最常用的分类器。朴素贝叶斯之所以朴素是因为它假设属性是相互独立的,因此对实际情况有所约束,**如果属性之间存在关联,分类准确率会降低。**不过好在对于大部分情况下,朴素贝叶斯的分类效果都不错。

二、拉普拉斯平滑

在某些案例中,我们得到某事件的概率为0,这是不合理的,如果词频列表里面有很多次数都为0,很可能计算结果都为零

解决方案:使用   拉普拉斯平滑系数

拉普拉斯平滑(Laplace Smoothing)又被称为加 1 平滑,是比较常用的平滑方法。平滑方法的存在是为了解决零概率问题。


1、为什么要做平滑处理?

  零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0。

2、拉普拉斯的理论支撑

  为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做拉普拉斯平滑。 假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。

三、朴素贝叶斯算法API

sklearn.naive_bayes.MultinomialNB(alpha=1.0)

  • 朴素贝叶斯分类
  • 该算法不需要调参
  • alpha:拉普拉斯平滑系数

四、新闻分类案例

使用sklearn自带的数据集:fetch_20newsgroups

  • sklearn 20类新闻分类
  • 20个新闻组数据集包含20个主题的18000个新闻组帖子

问题处理流程:(朴素贝叶斯案例流程)

  1. 加载20类新闻数据,进行分割
  2. 生成文章特征词
  3. 朴素贝叶斯   estimator   流程进行评估
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer

def naivebayes():
    """
    朴素贝叶斯进行文本分类
    :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) #以训练集当中的词的列表进行每篇文章重要性统计
    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__':
    naivebayes()

五、朴素贝叶斯分类优缺点

优点:

  • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
  • 对缺失数据不太敏感,算法也是比较简单,常用于文本分类
  • 分类准确度好,速度更快

缺点:

  • 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其实效果不好。

六、算法应用领域

1、文本分类

分类是数据分析和机器学习领域的一个基本问题。文本分类已广泛应用于网络信息过滤、信息检索和信息推荐等多个方面。数据驱动分类器学习一直是近年来的热点,方法很多,比如神经网络决策树、支持向量机、朴素贝叶斯等。相对于其他精心设计的更复杂的分类算法,朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。直观的文本分类算法,也是最简单的贝叶斯分类器,具有很好的可解释性,朴素贝叶斯算法特点是假设所有特征的出现相互独立互不影响,每一特征同等重要。但事实上这个假设在现实世界中并不成立:首先,相邻的两个词之间的必然联系,不能独立;其次,对一篇文章来说,其中的某一些代表词就确定它的主题,不需要通读整篇文章、查看所有词。所以需要采用合适的方法进行特征选择,这样朴素贝叶斯分类器才能达到更高的分类效率。

2、其他

  • 朴素贝叶斯算法在文字识别, 图像识别方向有着较为重要的作用。 可以将未知的一种文字或图像,根据其已有的分类规则来进行分类,最终达到分类的目的。
  • 现实生活中朴素贝叶斯算法应用广泛,如文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等等。
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
由于朴素贝叶斯算法模型涉及到数据预处理、特征选择、概率计算等复杂过程,因此整个模型的实现需要一定的编程基础和数据处理经验。下面给出一个简单的朴素贝叶斯算法模型的代码实现示例,供参考。 首先,我们需要导入需要用到的库: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import classification_report, confusion_matrix ``` 接下来,我们需要读取数据并进行预处理。这里以鸢尾花数据集为例: ```python # 读取数据 df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) # 将类别标签转化为数字 df[4] = pd.Categorical(df[4]).codes # 将数据分为特征和标签 X = df.iloc[:, :4].values y = df.iloc[:, 4].values # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) ``` 接下来,我们需要选择合适的特征,并进行概率计算。这里使用高斯朴素贝叶斯算法: ```python # 创建高斯朴素贝叶斯分类器对象 gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测测试集结果 y_pred = gnb.predict(X_test) # 输出混淆矩阵和分类报告 print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) ``` 最后,我们可以通过调用预测函数预测新数据的分类: ```python # 预测新数据 new_data = np.array([[5.1, 3.5, 1.4, 0.2]]) print(gnb.predict(new_data)) ``` 完整代码如下: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import classification_report, confusion_matrix # 读取数据 df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) # 将类别标签转化为数字 df[4] = pd.Categorical(df[4]).codes # 将数据分为特征和标签 X = df.iloc[:, :4].values y = df.iloc[:, 4].values # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 创建高斯朴素贝叶斯分类器对象 gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测测试集结果 y_pred = gnb.predict(X_test) # 输出混淆矩阵和分类报告 print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) # 预测新数据 new_data = np.array([[5.1, 3.5, 1.4, 0.2]]) print(gnb.predict(new_data)) ``` 输出结果如下: ``` [[16 0 0] [ 0 17 1] [ 0 0 11]] precision recall f1-score support 0 1.00 1.00 1.00 16 1 1.00 0.94 0.97 18 2 0.92 1.00 0.96 11 accuracy 0.98 45 macro avg 0.97 0.98 0.98 45 weighted avg 0.98 0.98 0.98 45 [0] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值