【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用

在这里插入图片描述

🌟 关于我 🌟

大家好呀!👋 我是一名大三在读学生,目前对人工智能领域充满了浓厚的兴趣,尤其是机器学习、深度学习和自然语言处理这些酷炫的技术!🤖💻 平时我喜欢动手做实验,探索各种有趣的算法和模型,并将我的实验过程、学习心得和技术分享发布在CSDN上。如果你对我的文章感兴趣,欢迎来我的主页逛逛哦:我的CSDN主页 🏠✨

在这里,我会不定期更新一些实验报告、技术教程以及学习笔记,希望能够与大家一起交流学习,共同进步!🚀📚 无论是AI小白还是技术大佬,都欢迎来我的主页留言互动,我们一起探讨技术的无限可能!💡🔥

🌈 Keep Learning, Keep Sharing! 🌈
🎉 Let’s Code the Future Together! 🎉


✨ 数据集及资源介绍 ✨

在本次实验中,我们使用了来自UCI机器学习仓库的SMSSpamCollection数据集,该数据集包含5572条短信,每条短信被标记为“spam”(垃圾短信)或“ham”(正常短信)。该数据集是垃圾短信分类任务中的经典数据集,广泛应用于文本分类和机器学习实验中。你可以通过以下链接下载数据集并查看更多相关信息:

  • 数据集下载链接: SMSSpamCollection.zip
  • UCI机器学习仓库资源链接: UCI Machine Learning Repository

通过访问这些链接,你可以获取数据集的详细描述、使用说明以及相关的研究文献,帮助你更好地理解和使用该数据集。

🌟 Happy Coding! 🌟

在这里插入图片描述


【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用

  • 一、引言
    • 垃圾邮件问题的背景与挑战
    • 机器学习在垃圾邮件过滤中的应用
    • 朴素贝叶斯分类器的优势与适用场景
  • 二、朴素贝叶斯分类器:原理与实现
    • 贝叶斯定理与条件概率
    • 朴素贝叶斯的“朴素”假设
    • 文本分类中的朴素贝叶斯算法
    • 朴素贝叶斯的优缺点分析
      • 优点
      • 缺点
      • 总结
  • 三、文本数据预处理:从原始文本到特征向量
    • 文本清洗:去标点、转小写、去除噪声
    • 分词与停用词处理
    • 文本向量化:词袋模型与TF-IDF模型
    • 数据预处理的常见挑战与解决方案
  • 四、构建垃圾邮件过滤系统
    • 数据集介绍:SMSSpamCollection
    • 数据探索与类别分布分析
    • 模型训练:朴素贝叶斯分类器的实现
    • 模型评估:精确率、召回率、F1分数与ROC曲线
  • 五、模型性能对比:词袋模型 vs. TF-IDF模型
    • 词袋模型的分类效果分析
      • 优点
      • 缺点
      • 分类效果
      • 评估指标
      • ROC曲线
    • TF-IDF模型的分类效果分析
      • 优点
      • 缺点
      • 分类效果
      • 评估指标
      • ROC曲线
    • 两种方法的性能对比与适用场景
      • 性能对比
      • 适用场景
  • 六、垃圾邮件过滤系统的实际应用
    • 系统部署与实时过滤
      • 系统部署
      • 实时过滤流程
      • 代码示例
    • 处理新邮件与动态更新模型
      • 处理新邮件
      • 动态更新模型
      • 代码示例
    • 垃圾邮件过滤系统的局限性
  • 七、总结与展望
    • 实验的主要发现与结论
    • 朴素贝叶斯在文本分类中的其他应用
    • 未来改进方向:深度学习与更复杂的特征提取方法

一、引言

垃圾邮件问题的背景与挑战

随着互联网的普及,电子邮件和短信已成为人们日常生活和工作中不可或缺的沟通工具。然而,伴随着这种便利性而来的,是垃圾邮件(Spam)问题的日益严重。垃圾邮件通常指未经用户请求而大量发送的无关或恶意信息,包括广告、诈骗信息、钓鱼链接、恶意软件等。根据相关统计,全球每天发送的电子邮件中,超过一半是垃圾邮件。这不仅浪费了用户的时间和网络资源,还对用户的隐私和网络安全构成了严重威胁。

垃圾邮件的主要挑战在于其多样性和动态性。垃圾邮件的内容和形式不断变化,发送者通过使用复杂的伪装技术(如改变邮件标题、内容结构、使用图片代替文字等)来规避传统的过滤规则。此外,垃圾邮件的发送者通常利用僵尸网络(Botnet)进行大规模发送,使得垃圾邮件的数量呈指数级增长。传统的垃圾邮件过滤方法,如基于规则的黑名单和关键词匹配,虽然在一定程度上能够过滤部分垃圾邮件,但在面对这些复杂和多变的垃圾邮件时,往往显得力不从心。

因此,如何有效地过滤垃圾邮件,成为了一个亟待解决的问题。随着机器学习技术的发展,基于数据驱动的垃圾邮件过滤方法逐渐成为主流。通过训练模型自动识别垃圾邮件,不仅可以提高过滤的准确性,还能适应垃圾邮件内容的变化。

机器学习在垃圾邮件过滤中的应用

机器学习在垃圾邮件过滤中的应用,主要是通过训练模型来自动识别垃圾邮件。与传统的基于规则的方法不同,机器学习方法能够从大量的邮件数据中学习垃圾邮件的特征,并根据这些特征进行分类。常见的机器学习算法包括朴素贝叶斯分类器、支持向量机(SVM)、决策树、随机森林以及深度学习模型等。

在垃圾邮件过滤任务中,机器学习模型通常通过以下步骤进行训练和预测:

  1. 数据收集与标注:收集大量的邮件数据,并对其进行标注(如“垃圾邮件”或“正常邮件”)。
  2. 特征提取:从邮件中提取有用的特征,如词频、TF-IDF值、邮件标题、发件人信息等。
  3. 模型训练:使用标注好的数据训练机器学习模型,使其能够学习垃圾邮件的特征。
  4. 模型评估与优化:通过测试集评估模型的性能,并根据评估结果对模型进行优化。
  5. 部署与应用:将训练好的模型部署到实际的邮件系统中,实时过滤垃圾邮件。

机器学习方法在垃圾邮件过滤中的优势在于其能够自动学习垃圾邮件的特征,并适应垃圾邮件内容的变化。与传统的基于规则的方法相比,机器学习方法具有更高的准确性和灵活性。

朴素贝叶斯分类器的优势与适用场景

朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类算法,广泛应用于文本分类任务,如垃圾邮件过滤、情感分析、新闻分类等。其核心思想是通过计算给定特征条件下类别的后验概率,选择概率最大的类别作为预测结果。尽管朴素贝叶斯分类器假设特征之间相互独立(即“朴素”假设),这一假设在现实中往往不成立,但在许多实际应用中,朴素贝叶斯分类器表现出了良好的性能。

在垃圾邮件过滤任务中,朴素贝叶斯分类器具有以下优势:

  1. 计算效率高:朴素贝叶斯分类器的计算复杂度较低,适合处理高维数据(如文本数据)。由于文本数据通常具有大量的特征(如单词),朴素贝叶斯分类器的高效性使其成为文本分类任务中的首选算法之一。
  2. 对小规模数据表现良好:即使在训练数据较少的情况下,朴素贝叶斯分类器仍能表现出较好的分类性能。这使得它在数据量有限的应用场景中具有优势。
  3. 易于实现与扩展:朴素贝叶斯分类器的实现相对简单,且易于扩展到多分类问题。此外,它能够与其他技术(如特征选择、模型集成等)结合使用,以进一步提高分类性能。
  4. 对噪声数据具有鲁棒性:由于朴素贝叶斯分类器基于概率模型,它对数据中的噪声和缺失值具有一定的鲁棒性,能够在数据质量较差的情况下仍保持较好的分类效果。

朴素贝叶斯分类器特别适用于以下场景:

  • 文本分类:如垃圾邮件过滤、情感分析、新闻分类等。
  • 高维数据:如文本数据、基因数据等。
  • 实时应用:由于朴素贝叶斯分类器的计算效率高,适合用于实时分类任务,如实时垃圾邮件过滤。

尽管朴素贝叶斯分类器在某些复杂任务中可能表现不如更复杂的模型(如深度学习模型),但其简单、高效且易于实现的特性,使其在许多实际应用中仍具有广泛的应用价值。


二、朴素贝叶斯分类器:原理与实现

朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类算法,广泛应用于文本分类、垃圾邮件过滤、情感分析等领域。其核心思想是通过计算给定特征条件下类别的后验概率,选择概率最大的类别作为预测结果。尽管朴素贝叶斯分类器假设特征之间相互独立(即“朴素”假设),这一假设在现实中往往不成立,但在许多实际应用中,朴素贝叶斯分类器表现出了良好的性能。

贝叶斯定理与条件概率

朴素贝叶斯分类器的理论基础是贝叶斯定理。贝叶斯定理描述了在已知某些条件下,事件发生的概率如何更新。具体来说,贝叶斯定理可以表示为:

P ( Y ∣ X ) = P ( X ∣ Y ) ⋅ P ( Y ) P ( X ) P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)} P(YX)=P(X)P(XY)P(Y)

其中:

  • P ( Y ∣ X ) P(Y|X) P(YX)后验概率,表示在已知特征 X X X的条件下,类别 Y Y Y的概率。
  • P ( X ∣ Y ) P(X|Y) P(XY)似然概率,表示在类别 Y Y Y的条件下,特征 X X X 出现的概率。
  • P ( Y ) P(Y) P(Y)先验概率,表示类别 Y Y Y 在训练数据中的出现概率。
  • P ( X ) P(X) P(X)证据概率,表示特征 X X X在训练数据中的出现概率。

在分类任务中,我们的目标是找到使后验概率 P ( Y ∣ X ) P(Y|X) P(YX)最大的类别 Y Y Y。由于 P ( X ) P(X) P(X)对于所有类别都是相同的,因此可以忽略,最终分类决策可以简化为:

Y pred = arg ⁡ max ⁡ Y P ( X ∣ Y ) ⋅ P ( Y ) Y_{\text{pred}} = \arg\max_{Y} P(X|Y) \cdot P(Y) Ypred=argYmaxP(XY)P(Y)

朴素贝叶斯的“朴素”假设

朴素贝叶斯分类器的“朴素”一词源于其假设特征之间相互独立,即一个特征的出现不依赖于其他特征的出现。尽管这一假设在现实中往往不成立(例如,在文本分类中,某些单词的出现可能与其他单词相关),但朴素贝叶斯分类器在许多实际应用中表现出了良好的性能。

基于“朴素”假设,似然概率 P ( X ∣ Y ) P(X|Y) P(XY)可以表示为各个特征条件概率的乘积:

P ( X ∣ Y ) = P ( x 1 ∣ Y ) ⋅ P ( x 2 ∣ Y ) ⋅ ⋯ ⋅ P ( x n ∣ Y ) P(X|Y) = P(x_1|Y) \cdot P(x_2|Y) \cdot \dots \cdot P(x_n|Y) P(XY)=P(x1Y)P(x2Y)P(xnY)

其中,( x_1, x_2, \dots, x_n ) 是特征向量 ( X ) 的各个特征。

文本分类中的朴素贝叶斯算法

在文本分类任务中,朴素贝叶斯分类器通常使用词频或TF-IDF(词频-逆文档频率)作为特征。具体来说,文本分类中的朴素贝叶斯算法可以分为以下几个步骤:

  1. 文本向量化
    将文本数据转换为数值形式,常用的方法包括词袋模型(Bag of Words)和TF-IDF模型。词袋模型通过统计每个单词在文本中出现的次数来表示文本,而TF-IDF模型则通过考虑单词在整个语料库中的重要性来加权词频。

  2. 计算先验概率
    先验概率 P ( Y ) P(Y) P(Y)表示每个类别在训练数据中的出现概率。对于二分类任务(如垃圾邮件过滤),先验概率可以表示为:

P ( Y = spam ) = 垃圾邮件的数量 总邮件数量 P(Y = \text{spam}) = \frac{\text{垃圾邮件的数量}}{\text{总邮件数量}} P(Y=spam)=总邮件数量垃圾邮件的数量
P ( Y = ham ) = 正常邮件的数量 总邮件数量 P(Y = \text{ham}) = \frac{\text{正常邮件的数量}}{\text{总邮件数量}} P(Y=ham)=总邮件数量正常邮件的数量

  1. 计算似然概率
    似然概率 P ( x i ∣ Y ) P(x_i|Y) P(xiY)表示在类别 Y Y Y 的条件下,特征 x i x_i xi出现的概率。在文本分类中,特征 x i x_i xi 通常是某个单词的出现与否。似然概率可以通过以下公式计算:

P ( x i ∣ Y ) = 类别  Y 中包含单词  x i 的文本数量 + α 类别  Y 中的总单词数 + α ⋅ ∣ V ∣ P(x_i|Y) = \frac{\text{类别 } Y \text{ 中包含单词 } x_i \text{ 的文本数量} + \alpha}{\text{类别 } Y \text{ 中的总单词数} + \alpha \cdot |V|} P(xiY)=类别 Y 中的总单词数+αV类别 Y 中包含单词 xi 的文本数量+α

其中, α \alpha α是平滑参数(通常取值为1,即拉普拉斯平滑), ∣ V ∣ |V| V 是词汇表的大小。

  1. 分类决策
    对于一个新的文本样本,朴素贝叶斯分类器会计算其属于每个类别的后验概率,并选择概率最大的类别作为预测结果:

    Y pred = arg ⁡ max ⁡ Y P ( Y ) ⋅ ∏ i = 1 n P ( x i ∣ Y ) Y_{\text{pred}} = \arg\max_{Y} P(Y) \cdot \prod_{i=1}^{n} P(x_i|Y) Ypred=argYmaxP(Y)i=1nP(xiY)

朴素贝叶斯的优缺点分析

优点

  1. 计算效率高
    朴素贝叶斯分类器的计算复杂度较低,适合处理高维数据(如文本数据)。由于文本数据通常具有大量的特征(如单词),朴素贝叶斯分类器的高效性使其成为文本分类任务中的首选算法之一。

  2. 对小规模数据表现良好
    即使在训练数据较少的情况下,朴素贝叶斯分类器仍能表现出较好的分类性能。这使得它在数据量有限的应用场景中具有优势。

  3. 易于实现与扩展
    朴素贝叶斯分类器的实现相对简单,且易于扩展到多分类问题。此外,它能够与其他技术(如特征选择、模型集成等)结合使用,以进一步提高分类性能。

  4. 对噪声数据具有鲁棒性
    由于朴素贝叶斯分类器基于概率模型,它对数据中的噪声和缺失值具有一定的鲁棒性,能够在数据质量较差的情况下仍保持较好的分类效果。

缺点

  1. 特征独立性假设
    朴素贝叶斯分类器假设特征之间相互独立,这一假设在现实中往往不成立。例如,在文本分类中,某些单词的出现可能与其他单词相关。这种假设的简化可能导致模型在某些复杂任务中表现不佳。

  2. 对数据分布的敏感性
    朴素贝叶斯分类器假设数据服从特定的概率分布(如高斯分布、多项式分布等)。如果实际数据分布与假设不符,模型的性能可能会受到影响。

  3. 处理连续特征的局限性
    在处理连续特征时,朴素贝叶斯分类器通常需要假设特征服从某种分布(如高斯分布)。如果特征的分布与假设不符,模型的分类效果可能会下降。

总结

尽管朴素贝叶斯分类器在某些复杂任务中可能表现不如更复杂的模型(如深度学习模型),但其简单、高效且易于实现的特性,使其在许多实际应用中仍具有广泛的应用价值。特别是在文本分类任务中,朴素贝叶斯分类器因其对高维数据的良好处理能力,成为了一个经典且有效的算法。


三、文本数据预处理:从原始文本到特征向量

在文本分类任务中,原始文本数据通常包含大量的噪声(如标点符号、停用词等),直接将其输入模型会导致分类效果不佳。因此,文本数据预处理是文本分类任务中的关键步骤。通过预处理,我们可以将原始文本转换为适合机器学习模型输入的特征向量。以下是文本数据预处理的主要步骤及其详细说明。


文本清洗:去标点、转小写、去除噪声

文本清洗是文本预处理的第一步,旨在去除文本中的无关字符和噪声,保留有用的信息。常见的文本清洗操作包括:

  1. 去除标点符号
    标点符号通常对文本分类任务没有贡献,反而可能增加噪声。通过去除标点符号,可以减少特征空间的维度,并提高模型的分类效果。
    例如,句子 "Hello, world!" 在去除标点后变为 "Hello world"

  2. 转换为小写
    在文本分类任务中,单词的大小写通常不影响其语义。例如,“Hello” 和 “hello” 表示相同的含义。通过将所有字符转换为小写,可以避免模型将同一个单词的不同大小写形式视为不同的特征。
    例如,"Hello World" 转换为小写后变为 "hello world"

  3. 去除噪声
    噪声包括特殊字符、数字、HTML标签等。这些字符通常对文本分类任务没有帮助,甚至可能干扰模型的训练。通过去除噪声,可以进一步简化文本数据。
    例如,"Call me at 123-456-7890!" 在去除噪声后变为 "Call me at"

代码示例

import stringdef preprocess_text(text):# 去标点text = text.translate(str.maketrans('', '', string.punctuation))# 转小写text = text.lower()return text

分词与停用词处理

分词是将文本分割成单独的单词或词组的过程,而停用词处理则是去除那些对文本分类任务贡献较小的常见词。

  1. 分词
    分词是文本预处理的重要步骤,它将连续的文本分割成单独的单词或词组。分词的效果直接影响后续的特征提取和模型训练。
    例如,句子 "I love machine learning" 分词后变为 ["I", "love", "machine", "learning"]

  2. 去除停用词
    停用词(Stop Words)是指在文本中频繁出现但对文本分类任务贡献较小的词,如 “the”、“is”、“and” 等。通过去除停用词,可以减少特征空间的维度,并提高模型的分类效果。
    例如,句子 "I love machine learning" 在去除停用词后变为 ["love", "machine", "learning"]

代码示例

from nltk.corpus import stopwordsdef preprocess_text(text):# 分词words = text.split()# 去除停用词stop_words = set(stopwords.words('english'))words = [word for word in words if word not in stop_words]return ' '.join(words)

文本向量化:词袋模型与TF-IDF模型

文本向量化是将文本数据转换为数值形式的过程,以便机器学习模型能够处理。常用的文本向量化方法包括词袋模型(Bag of Words)和TF-IDF模型。

  1. 词袋模型(Bag of Words)
    词袋模型通过统计每个单词在文本中出现的次数来表示文本。它将文本转换为一个稀疏向量,向量的每个维度对应一个单词,值表示该单词在文本中出现的次数。
    例如,文本 "I love machine learning""I love coding" 在词袋模型中的表示如下:

    单词Ilovemachinelearningcoding
    文本111110
    文本211001

    词袋模型的优点是简单易实现,但它忽略了单词的顺序和语义信息。

  2. TF-IDF模型(Term Frequency-Inverse Document Frequency)
    TF-IDF模型通过考虑单词在整个语料库中的重要性来加权词频。TF(Term Frequency)表示单词在文本中出现的频率,IDF(Inverse Document Frequency)表示单词在整个语料库中的稀有程度。TF-IDF值越高,表示该单词在当前文本中越重要。
    TF-IDF的计算公式如下:

    TF-IDF ( t , d ) = TF ( t , d ) × IDF ( t ) \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t) TF-IDF(t,d)=TF(t,d)×IDF(t)

    其中:

    • TF ( t , d ) \text{TF}(t, d) TF(t,d) 是单词 t t t 在文本 d d d 中出现的频率。

    • IDF ( t ) \text{IDF}(t) IDF(t) 是单词 t t t 的逆文档频率,计算公式为:

      IDF ( t ) = log ⁡ N 1 + DF ( t ) \text{IDF}(t) = \log \frac{N}{1 + \text{DF}(t)} IDF(t)=log1+DF(t)N

      其中, N N N 是语料库中的文本总数, DF ( t ) \text{DF}(t) DF(t) 是包含单词 t t t 的文本数量。

    TF-IDF模型的优点是能够更好地反映单词的重要性,但它仍然忽略了单词的顺序和语义信息。

代码示例

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer# 使用词袋模型
vectorizer_bow = CountVectorizer()
X_bow = vectorizer_bow.fit_transform(df['message'])# 使用 TF-IDF 模型
vectorizer_tfidf = TfidfVectorizer()
X_tfidf = vectorizer_tfidf.fit_transform(df['message'])

数据预处理的常见挑战与解决方案

  1. 高维稀疏性
    文本数据通常具有高维稀疏性,即特征空间的维度非常高,但大多数特征值为0。这种高维稀疏性会增加模型的计算复杂度,并可能导致过拟合。
    解决方案:通过特征选择(如选择出现频率较高的单词)或降维技术(如PCA)来减少特征空间的维度。

  2. 类别不平衡
    在文本分类任务中,某些类别的样本数量可能远多于其他类别,导致类别不平衡问题。类别不平衡会影响模型的分类效果,特别是对少数类别的识别能力。
    解决方案:通过过采样(如SMOTE)或欠采样来平衡类别分布,或使用加权损失函数来调整模型对不同类别的关注程度。

  3. 语义信息丢失
    词袋模型和TF-IDF模型忽略了单词的顺序和语义信息,可能导致语义信息的丢失。
    解决方案:使用更复杂的文本表示方法,如词嵌入(Word Embedding)或预训练语言模型(如BERT),以捕捉单词的语义信息。

  4. 停用词处理的局限性
    停用词处理虽然可以减少噪声,但也可能去除一些对分类任务有用的信息。例如,在某些情感分析任务中,停用词(如 “not”)可能对分类结果有重要影响。
    解决方案:根据具体任务调整停用词表,或使用更智能的停用词处理方法。


四、构建垃圾邮件过滤系统

在构建垃圾邮件过滤系统时,我们需要从数据集的加载与探索开始,逐步进行数据预处理、模型训练与评估。以下是构建垃圾邮件过滤系统的详细步骤。


数据集介绍:SMSSpamCollection

SMSSpamCollection 是一个广泛用于垃圾短信分类的公开数据集,由 UCI 机器学习仓库提供。该数据集包含 5572 条短信,每条短信被标记为 “spam”(垃圾短信)或 “ham”(正常短信)。数据集的格式为每行一条短信,第一列为标签(spam 或 ham),第二列为短信内容。

数据集示例

labelmessage
hamGo until jurong point, crazy…
spamFree entry in 2 a wkly comp to win FA Cup…

数据集特点

  • 类别分布:数据集中的类别分布不平衡,正常短信(ham)占大多数,垃圾短信(spam)占少数。
  • 文本长度:短信的文本长度较短,通常在几十个字符到几百个字符之间。
  • 多样性:垃圾短信的内容多样,包括广告、诈骗信息、促销信息等。

数据探索与类别分布分析

在构建模型之前,我们需要对数据集进行探索性分析,了解数据的基本信息和类别分布。

  1. 数据集基本信息
    通过查看数据集的行数、列数以及前几行数据,我们可以对数据集有一个初步的了解。

  2. 类别分布分析
    类别分布分析是了解数据集中各类别样本数量的过程。对于垃圾短信过滤任务,类别分布的平衡性直接影响模型的训练效果。

代码示例

import pandas as pd# 查看数据集的前几行
print(df.head())# 查看数据集的类别分布
print(df['label'].value_counts())

类别分布结果

label数量
ham4825
spam747

从类别分布可以看出,正常短信(ham)的数量远多于垃圾短信(spam),这表明数据集存在类别不平衡问题。


模型训练:朴素贝叶斯分类器的实现

在数据预处理完成后,我们可以使用朴素贝叶斯分类器来训练垃圾邮件过滤模型。朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类算法,特别适合处理高维稀疏的文本数据。

  1. 划分训练集和测试集
    为了评估模型的性能,我们需要将数据集划分为训练集和测试集。通常,训练集占 80%,测试集占 20%。

  2. 训练朴素贝叶斯分类器
    使用训练集数据训练朴素贝叶斯分类器。在文本分类任务中,常用的朴素贝叶斯分类器是多项式朴素贝叶斯(Multinomial Naive Bayes)。

代码示例

from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)

模型评估:精确率、召回率、F1分数与ROC曲线

模型训练完成后,我们需要对模型的性能进行评估。常用的评估指标包括精确率(Precision)、召回率(Recall)、F1 分数(F1-Score)以及 ROC 曲线(ROC Curve)。

  1. 混淆矩阵
    混淆矩阵是评估分类模型性能的基本工具,它展示了模型预测结果与真实标签的对比情况。

    预测为 ham预测为 spam
    实际为 hamTNFP
    实际为 spamFNTP
  2. 精确率、召回率与 F1 分数

    • 精确率(Precision):预测为垃圾短信的样本中,实际为垃圾短信的比例。
      Precision = T P T P + F P \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP
    • 召回率(Recall):实际为垃圾短信的样本中,被正确预测为垃圾短信的比例。
      Recall = T P T P + F N \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP
    • F1 分数(F1-Score):精确率和召回率的调和平均值,用于综合评估模型的性能。
      F1-Score = 2 × Precision × Recall Precision + Recall \text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1-Score=2×Precision+RecallPrecision×Recall
  3. ROC 曲线与 AUC 值
    ROC 曲线(Receiver Operating Characteristic Curve)是评估分类模型性能的重要工具,它展示了模型在不同阈值下的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)之间的关系。AUC 值(Area Under Curve)是 ROC 曲线下的面积,用于衡量模型的分类能力。AUC 值越接近 1,模型的性能越好。

代码示例

from sklearn.metrics import confusion_matrix, classification_report, roc_curve, auc
import matplotlib.pyplot as plt# 模型预测
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(cm)# 计算分类报告
report = classification_report(y_test, y_pred)
print("Classification Report:")
print(report)# 计算 ROC 曲线
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)# 绘制 ROC 曲线
plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (面积 = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('ROC曲线')
plt.legend(loc="lower right")
plt.show()

五、模型性能对比:词袋模型 vs. TF-IDF模型

在构建垃圾邮件过滤系统时,文本向量化是关键的步骤之一。常用的文本向量化方法包括词袋模型(Bag of Words, BoW)和TF-IDF模型(Term Frequency-Inverse Document Frequency)。这两种方法在特征提取上有不同的侧重点,因此会对模型的性能产生影响。以下是对词袋模型和TF-IDF模型的分类效果分析,以及它们的性能对比与适用场景。


词袋模型的分类效果分析

词袋模型通过统计每个单词在文本中出现的次数来表示文本。它将文本转换为一个稀疏向量,向量的每个维度对应一个单词,值表示该单词在文本中出现的次数。

优点

  1. 简单易实现:词袋模型的计算过程简单,易于理解和实现。
  2. 高效性:由于词袋模型仅统计词频,计算复杂度较低,适合处理大规模文本数据。
  3. 对高频词敏感:词袋模型能够捕捉到文本中出现频率较高的单词,这些单词通常对分类任务有重要贡献。

缺点

  1. 忽略单词顺序:词袋模型忽略了单词的顺序和上下文信息,可能导致语义信息的丢失。
  2. 对低频词不敏感:词袋模型对低频词的处理效果较差,这些单词可能对分类任务也有一定的贡献。

分类效果

在垃圾短信过滤任务中,词袋模型的表现通常较好,尤其是在捕捉高频词(如垃圾短信中的关键词)方面。例如,词袋模型能够有效识别垃圾短信中的常见词汇(如 “free”、“win”、“prize” 等),从而提高分类的准确性。

评估指标

  • 精确率:0.98
  • 召回率:0.97
  • F1 分数:0.98
  • ROC AUC:0.98

ROC曲线

1

从ROC曲线可以看出,词袋模型的AUC值为0.98,表明模型具有较高的分类能力。


TF-IDF模型的分类效果分析

TF-IDF模型通过考虑单词在整个语料库中的重要性来加权词频。TF(Term Frequency)表示单词在文本中出现的频率,IDF(Inverse Document Frequency)表示单词在整个语料库中的稀有程度。TF-IDF值越高,表示该单词在当前文本中越重要。

优点

  1. 反映单词重要性:TF-IDF模型能够更好地反映单词的重要性,尤其是那些在特定文本中频繁出现但在整个语料库中较少出现的单词。
  2. 减少高频词的权重:TF-IDF模型通过IDF值降低了高频词的权重,避免这些单词对分类结果产生过大的影响。

缺点

  1. 计算复杂度较高:TF-IDF模型需要计算每个单词的IDF值,计算复杂度高于词袋模型。
  2. 仍然忽略单词顺序:与词袋模型类似,TF-IDF模型也忽略了单词的顺序和上下文信息。

分类效果

在垃圾短信过滤任务中,TF-IDF模型的表现通常与词袋模型相当,但在某些情况下可能略逊于词袋模型。TF-IDF模型更适合处理那些包含特定关键词的文本,但在垃圾短信过滤任务中,词袋模型对高频词的捕捉能力可能更为重要。

评估指标

  • 精确率:0.97
  • 召回率:0.97
  • F1 分数:0.97
  • ROC AUC:0.98

ROC曲线

2

从ROC曲线可以看出,TF-IDF模型的AUC值为0.98,表明模型具有较高的分类能力。


两种方法的性能对比与适用场景

性能对比

指标词袋模型TF-IDF模型
精确率0.980.97
召回率0.970.97
F1 分数0.980.97
ROC AUC0.980.98

从性能对比可以看出,词袋模型在精确率、召回率和 F1 分数上略优于 TF-IDF模型,而两者的 ROC AUC 值相同。这表明词袋模型在垃圾短信过滤任务中的表现略好于 TF-IDF模型。

适用场景

  1. 词袋模型的适用场景

    • 高频词对分类任务重要:如果分类任务依赖于高频词(如垃圾短信中的关键词),词袋模型是更好的选择。
    • 计算资源有限:词袋模型的计算复杂度较低,适合在计算资源有限的情况下使用。
    • 简单任务:对于简单的文本分类任务,词袋模型通常能够提供足够好的性能。
  2. TF-IDF模型的适用场景

    • 低频词对分类任务重要:如果分类任务依赖于低频词(如特定领域的专业术语),TF-IDF模型是更好的选择。
    • 需要减少高频词的影响:如果高频词对分类任务的干扰较大,TF-IDF模型可以通过IDF值降低这些词的权重。
    • 复杂任务:对于复杂的文本分类任务,TF-IDF模型可能提供更好的性能。

六、垃圾邮件过滤系统的实际应用

在构建并评估了垃圾邮件过滤系统之后,下一步是将其部署到实际应用中,以实现对垃圾邮件的实时过滤。以下是垃圾邮件过滤系统在实际应用中的关键步骤、处理新邮件的方法、动态更新模型的策略以及系统的局限性。


系统部署与实时过滤

系统部署

垃圾邮件过滤系统的部署通常包括以下几个步骤:

  1. 模型导出:将训练好的朴素贝叶斯分类器导出为可部署的格式(如 .pkl 文件)。
  2. 集成到邮件系统:将导出的模型集成到现有的邮件系统中,通常通过API或插件的方式实现。
  3. 实时过滤:当用户收到新邮件时,系统会自动调用模型对邮件进行分类,判断其为垃圾邮件或正常邮件。

实时过滤流程

  1. 接收新邮件:当用户收到新邮件时,系统会捕获邮件内容。
  2. 文本预处理:对新邮件进行与训练数据相同的预处理操作,包括去标点、转小写、分词、去除停用词等。
  3. 文本向量化:使用与训练阶段相同的向量化方法(如词袋模型或TF-IDF模型)将邮件内容转换为特征向量。
  4. 分类预测:调用训练好的朴素贝叶斯分类器对特征向量进行分类预测。
  5. 过滤处理:如果邮件被分类为垃圾邮件,系统会将其移动到垃圾邮件文件夹或直接删除;如果邮件被分类为正常邮件,则将其放入收件箱。

代码示例

import pickle# 加载训练好的模型
with open('spam_filter_model.pkl', 'rb') as f:model = pickle.load(f)# 实时过滤函数
def filter_spam(email_content):# 文本预处理processed_content = preprocess_text(email_content)# 文本向量化vectorized_content = vectorizer.transform([processed_content])# 分类预测prediction = model.predict(vectorized_content)# 返回分类结果return 'spam' if prediction == 1 else 'ham'

处理新邮件与动态更新模型

处理新邮件

在实际应用中,系统需要能够高效地处理大量新邮件。为了提高处理效率,可以采用以下策略:

  1. 批量处理:将新邮件分批处理,减少系统调用的频率。
  2. 异步处理:使用异步任务队列(如Celery)处理邮件分类任务,避免阻塞主线程。
  3. 缓存机制:对频繁出现的邮件内容进行缓存,减少重复计算。

动态更新模型

垃圾邮件的内容和形式不断变化,因此模型需要定期更新以适应新的垃圾邮件特征。动态更新模型的策略包括:

  1. 定期重新训练:每隔一段时间(如每月)使用最新的邮件数据重新训练模型。
  2. 增量学习:使用增量学习算法(如在线朴素贝叶斯)动态更新模型,而无需重新训练整个模型。
  3. 用户反馈:允许用户标记误分类的邮件(如将正常邮件标记为垃圾邮件或反之),并将这些反馈数据用于模型更新。

代码示例

from sklearn.naive_bayes import MultinomialNB# 增量学习示例
def update_model(new_emails, new_labels):# 对新邮件进行预处理和向量化new_emails_processed = [preprocess_text(email) for email in new_emails]new_emails_vectorized = vectorizer.transform(new_emails_processed)# 使用新数据更新模型model.partial_fit(new_emails_vectorized, new_labels, classes=[0, 1])

垃圾邮件过滤系统的局限性

尽管垃圾邮件过滤系统在实际应用中表现良好,但它仍然存在一些局限性:

  1. 类别不平衡问题
    垃圾邮件的数量通常远少于正常邮件,这可能导致模型对垃圾邮件的识别能力不足。
    解决方案:通过过采样(如SMOTE)或调整类别权重来缓解类别不平衡问题。

  2. 语义理解有限
    朴素贝叶斯分类器基于词频或TF-IDF值进行分类,无法理解单词的语义和上下文信息。
    解决方案:使用更复杂的文本表示方法,如词嵌入(Word Embedding)或预训练语言模型(如BERT)。

  3. 对抗性攻击
    垃圾邮件发送者可能会通过修改邮件内容(如添加随机字符、使用同义词等)来规避过滤系统。
    解决方案:结合多种分类算法(如深度学习模型)或使用对抗性训练技术来提高系统的鲁棒性。

  4. 误分类问题
    系统可能会将正常邮件误分类为垃圾邮件,或将垃圾邮件误分类为正常邮件。
    解决方案:通过用户反馈机制不断优化模型,并设置白名单和黑名单来减少误分类。

  5. 多语言支持
    垃圾邮件过滤系统通常针对特定语言(如英语)进行训练,对其他语言的支持可能不足。
    解决方案:使用多语言文本分类模型或为每种语言单独训练模型。


七、总结与展望

在本次实验中,我们构建了一个基于朴素贝叶斯分类器的垃圾邮件过滤系统,并通过词袋模型和TF-IDF模型对文本数据进行特征提取。以下是对实验的主要发现与结论的总结,朴素贝叶斯在文本分类中的其他应用,以及未来改进方向的探讨。


实验的主要发现与结论

  1. 朴素贝叶斯分类器的有效性
    实验结果表明,朴素贝叶斯分类器在垃圾短信过滤任务中表现良好。无论是使用词袋模型还是TF-IDF模型,模型的精确率、召回率和F1分数均达到了较高的水平(均在0.97以上),且ROC AUC值接近1,表明模型具有较强的分类能力。

  2. 词袋模型 vs. TF-IDF模型
    词袋模型在垃圾短信过滤任务中的表现略优于TF-IDF模型,尤其是在捕捉高频词方面。然而,TF-IDF模型在处理低频词和减少高频词影响方面表现更好。两种方法各有优劣,具体选择取决于任务需求。

  3. 文本预处理的重要性
    文本预处理(如去标点、转小写、去除停用词等)对模型的性能有显著影响。通过有效的预处理,可以减少噪声并提高模型的分类效果。

  4. 类别不平衡问题
    数据集中正常短信的数量远多于垃圾短信,导致类别不平衡问题。虽然朴素贝叶斯分类器在一定程度上能够处理类别不平衡,但在实际应用中仍需采取额外措施(如过采样或调整类别权重)来进一步提高模型对少数类别的识别能力。


朴素贝叶斯在文本分类中的其他应用

朴素贝叶斯分类器不仅适用于垃圾邮件过滤,还在许多其他文本分类任务中表现出色。以下是一些常见的应用场景:

  1. 情感分析
    朴素贝叶斯分类器可以用于分析文本的情感倾向(如正面、负面、中性)。例如,在社交媒体评论、产品评价等场景中,朴素贝叶斯分类器能够快速判断用户的情感态度。

  2. 新闻分类
    在新闻分类任务中,朴素贝叶斯分类器可以根据新闻内容将其归类到不同的主题(如体育、政治、科技等)。由于其高效性,朴素贝叶斯分类器特别适合处理大规模的新闻数据。

  3. 垃圾评论过滤
    类似于垃圾邮件过滤,朴素贝叶斯分类器可以用于过滤网站上的垃圾评论(如广告、恶意言论等)。通过训练模型识别垃圾评论的特征,可以有效维护网站的内容质量。

  4. 文档分类
    在企业或学术环境中,朴素贝叶斯分类器可以用于对文档进行分类(如合同、报告、论文等)。通过自动分类,可以提高文档管理的效率。


未来改进方向:深度学习与更复杂的特征提取方法

尽管朴素贝叶斯分类器在文本分类任务中表现良好,但随着深度学习技术的发展,更复杂的模型和特征提取方法逐渐成为主流。以下是一些未来改进方向的探讨:

  1. 深度学习模型
    深度学习模型(如卷积神经网络CNN、循环神经网络RNN、Transformer等)在文本分类任务中表现出了强大的能力。与朴素贝叶斯分类器相比,深度学习模型能够捕捉单词的顺序和上下文信息,从而提高分类效果。例如,BERT(Bidirectional Encoder Representations from Transformers)在多个文本分类任务中取得了state-of-the-art的性能。

  2. 词嵌入(Word Embedding)
    词嵌入是一种将单词映射到低维向量空间的技术,能够捕捉单词的语义信息。与词袋模型和TF-IDF模型相比,词嵌入(如Word2Vec、GloVe、FastText)能够更好地表示单词之间的关系,从而提高模型的分类能力。

  3. 模型集成
    通过将朴素贝叶斯分类器与其他分类算法(如支持向量机SVM、随机森林、深度学习模型等)进行集成,可以进一步提高模型的性能。例如,可以使用投票法或加权平均法将多个模型的预测结果进行结合。

  4. 对抗性训练
    为了应对垃圾邮件发送者的对抗性攻击(如修改邮件内容以规避过滤系统),可以采用对抗性训练技术。通过在训练数据中加入对抗性样本,可以提高模型的鲁棒性。


🌟 总结与致谢 🌟

作为一名AI领域的小白,我深知自己在经验和表述上还有很多不足。如果在文章中有任何错误、不够清晰的地方,或者你有更好的建议和想法,欢迎在评论区留言交流!💬✨ 我非常期待与大家一起讨论,共同进步!🚀

感谢你花时间阅读我的文章,也希望我的分享能对你有所帮助。 📚,我会继续努力,带来更多有趣且实用的技术内容!💡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501709.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity学习5:创建一个自己的3D项目

目录 1 在unity里创建1个3D项目 1.1 关于选择universal 3d,built-in render pipeline的区别 1.2 创建1个universal 3d项目 2 打开3D项目 2.1 准备操作面板:操作界面 layout,可以随意更换 2.2 先收集资源:打开 window的 AssetStore 下载…

Vue3 内置组件之component

文章目录 Vue3 内置组件之component概述使用 Vue3 内置组件之component 概述 <component> 组件提供了动态组件加载功能&#xff0c;它可以在内置组件Component占位点上将自定义组件进行指定目标的渲染。比如页面中常见的Tabs选项卡效果就可以利用动态组件加载功能轻松实…

学习路之VScode--自定义按键写注释(插件)

1. 安装 "KoroFileHeader" 插件 首先&#xff0c;在 VScode 中搜索并安装名为 "KoroFileHeader" 的插件。你可以通过在扩展商店中搜索插件名称来找到并安装它。 2. 进入 VScode 设置页面 点击 VScode 左下角的设置图标&#xff0c;然后选择 "设置&q…

C++编程库与框架实战——ZeroMQ消息队列

一,消息队列简介 消息队列是一种进程间的通信机制,用于在不同进程之间同步消息。通信期间,一个进程将消息放入该队列中,然后另一个进程就可以从该队列中取出这条消息。 消息队列可以是异步的,即发送方无需等待接收方的确认或回复就可以立即执行下一步的操作。 消息队列…

seata分布式事务详解(AT)

目录 1、分布式事务特点 1.1、分布式事务是什么 1.2、分布式事务产生的场景 2、使用seata解决分布式事务 2.1、认识seata 2.1.1、seata是什么 2.1.2、seata三大角色 2.1.3、seata模式 2.1.3.1、AT模式 AT模式实现&#xff1a; 2.2、如何使用seata 3、seata基于idea软…

C语言渗透和好网站

渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…

机场安全项目|基于改进 YOLOv8 的机场飞鸟实时目标检测方法

目录 论文信息 背景 摘要 YOLOv8模型结构 模型改进 FFC3 模块 CSPPF 模块 数据集增强策略 实验结果 消融实验 对比实验 结论 论文信息 《科学技术与工程》2024年第24卷第32期刊载了中国民用航空飞行学院空中交通管理学院孔建国, 张向伟, 赵志伟, 梁海军的论文——…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…

【paddle】初次尝试

张量 张量是 paddlepaddle&#xff0c; torch&#xff0c; tensorflow 等 python 主流机器学习包中唯一通货变量&#xff0c;因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…

VBA 64位API声明语句第005讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

Redis(二)value 的五种常见数据类型简述

目录 一、string&#xff08;字符串&#xff09; 1、raw 2、int 3、embstr 二、hash&#xff08;哈希表&#xff09; 1、hashtable 2、ziplist 三、list&#xff08;列表&#xff09; ​编辑 1、linkedlist 2、ziplist 3、quicklist&#xff08;redis 3.2后的列表内…

Linux硬盘分区 --- 挂载分区mount、卸载分区umount、永久挂载

四、挂载分区 1.查看分区信息 在挂载分区之前&#xff0c;需要先确定要挂载的分区设备名称。可以使用命令lsblk来查看系统中的所有块设备及分区情况。例如&#xff0c;可能会看到类似/dev/sda1、/dev/sdb2等的设备名称&#xff0c;它们分别代表不同的硬盘分区。 2.创建挂载点…

基于51单片机和16X16LED点阵屏(74HC138和74HC595驱动)的小游戏《贪吃蛇》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、自制八位独立按键3、点阵屏模块 四、主函数总结 系列文章目录 前言 《贪吃蛇》&#xff0c;一款经典的、怀旧的小游戏&#xff0c;单片机入门必写程序。 以《贪吃蛇》为载体&#xff0c;熟悉各种屏…

[Qt] Qt介绍 | 搭建SDK

目录 1. Qt 简介 什么是 Qt&#xff1f; 1.1 引入 1.2 GUI 1.3 Qt 介绍 2. Qt 发展史 3. Qt 支持的平台 4. Qt 版本信息 5. Qt 的优点 6. Qt 应用场景 7. Qt 成功案例 8. Qt 发展前景及就业分析 二. Qt 开发环境搭建 1. 开发工具概述 2.Qt SDK 安装 3.使用 1. …

mysql连接时报错1130-Host ‘hostname‘ is not allowed to connect to this MySQL server

不在mysql服务器上通过ip连接服务提示1130错误怎么回事呢。这个错误是因为在数据库服务器中的mysql数据库中的user的表中没有权限。 解决方案 查询mysql库的user表指定账户的连接方式 SELECT user, host FROM mysql.user;修改指定账户的host连接方式 update mysql.user se…

Elasticsearch: 高级搜索

这里写目录标题 一、match_all匹配所有文档1、介绍&#xff1a; 二、精确匹配1、term单字段精确匹配查询2、terms多字段精确匹配3、range范围查询4、exists是否存在查询5、ids根据一组id查询6、prefix前缀匹配7、wildcard通配符匹配8、fuzzy支持编辑距离的模糊查询9、regexp正则…

把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用

将vue项目发布成npm库文件&#xff0c;第三方通过npm依赖安装使用&#xff1b;使用最近公司接了一个项目&#xff0c;这个项目需要集成到第三方页面&#xff0c;在第三方页面点击项目名称&#xff0c;页面变成我们的项目页面&#xff1b;要求以npm库文件提供给他们&#xff1b;…

实现一个通用的树形结构构建工具

文章目录 1. 前言2. 树结构3. 具体实现逻辑3.1 TreeNode3.2 TreeUtils3.3 例子 4. 小结 1. 前言 树结构的生成在项目中应该都比较常见&#xff0c;比如部门结构树的生成&#xff0c;目录结构树的生成&#xff0c;但是大家有没有想过&#xff0c;如果在一个项目中有多个树结构&…

【新教程】华为昇腾NPU的pytorch环境搭建

1 硬件配置 使用学校的集群&#xff0c;相关配置如下&#xff1a; CPU&#xff1a;鲲鹏920 NPU&#xff1a;昇腾910B 操作系统&#xff1a;openEuler 22.03 2 安装版本 根据昇腾官方gitee上的信息&#xff0c;Pytoch 2.1.0是长期支持版本&#xff0c;因此选择安装这一版本&a…

在Ubuntu 18.04.6 LTS安装OpenFace流程

一、修改配置:将gcc8&#xff0c;g8作为默认选项 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 sudo update-alternatives --config gcc 选择版本&#xff0c;再查看gcc --version sudo update-alternatives --install /usr/bin/g g /usr/bin/g-…