机器学习-朴素贝叶斯

一、算法简介

朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法。它假设特征之间相互独立,简化后验概率计算。朴素贝叶斯算法的优点包括坚实的数学基础、稳定的分类效率、所需估计的参数较少以及对缺失数据不太敏感。然而,其假设属性之间相互独立在实际应用中往往不成立,这可能影响分类效果。

二、算法示例

朴素贝叶斯算法在垃圾邮件分类中的应用示例:
假设我们有一封邮件,其中包含以下特征:

  • 邮件中包含“垃圾邮件”这个词。
  • 邮件中包含“免费”这个词。
  • 邮件中包含“商品”这个词。
  • 邮件的长度超过100个字符。
  • 现在我们要判断这封邮件是否是垃圾邮件。我们可以使用朴素贝叶斯算法来帮助我们进行分类。

根据训练数据集,我们可以计算出垃圾邮件和非垃圾邮件的后验概率:

P(垃圾邮件)=0.01(假设垃圾邮件在训练数据集中占1%)
P(非垃圾邮件)=0.99(非垃圾邮件在训练数据集中占99%)
然后,我们需要计算给定邮件属于垃圾邮件和非垃圾邮件的概率:

P(邮件中包含“垃圾邮件”∣垃圾邮件)=0.8(假设80%的垃圾邮件中包含“垃圾邮件”这个词)
P(邮件中包含“免费”∣垃圾邮件)=0.5(假设50%的垃圾邮件中包含“免费”这个词)
P(邮件中包含“商品”∣垃圾邮件)=0.3(假设30%的垃圾邮件中包含“商品”这个词)
P(邮件长度超过100字符∣垃圾邮件)=0.7(假设70%的垃圾邮件长度超过100字符)
同样地,我们也可以计算出给定邮件属于非垃圾邮件的概率。

最后,我们计算待分类邮件属于垃圾邮件的后验概率:

P(垃圾邮件∣邮件中包含“垃圾邮件”∧邮件中包含“免费”∧邮件中包含“商品”∧邮件长度超过100字符)
= P(邮件中包含“垃圾邮件”∣垃圾邮件) × P(邮件中包含“免费”∣垃圾邮件) × P(邮件中包含“商品”∣垃圾邮件) × P(邮件长度超过100字符∣垃圾邮件) × P(垃圾邮件) / P(邮件中包含“垃圾邮件”) × P(邮件中包含“免费”) × P(邮件中包含“商品”) × P(邮件长度超过100字符)
= 0.8 × 0.5 × 0.3 × 0.7 × 0.01 / (0.8 × 0.5 × 0.3 × 0.7 + 0.2 × 0.5 × 0.7 × 0.3) = 0.0288

由于计算出的后验概率大于0.5,因此我们判断这封邮件是垃圾邮件。

三、算法实现步骤

  • 特征条件独立假设:该算法假设特征之间相互独立,即给定某个特征下,其他特征的发生概率与该特征无关。
  • 计算先验概率:先验概率是指某一类别在训练集中出现的概率,通常表示为P©。
  • 计算似然函数:对于给定的待分类项,根据其特征,计算其属于各个类别的概率,通常表示为P(X∣C)。
  • 计算后验概率:后验概率是指在给定待分类项的条件下,某一类别出现的概率,通常表示为P(C∣X)。
  • 分类:将待分类项归为后验概率最大的类别。

四、代码实现

import numpy as np  
from sklearn.datasets import fetch_20newsgroups  
from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.naive_bayes import MultinomialNB  
from tarfile import open as tar_open  
  
# 加载本地fetch_20newsgroups语料库  
def load_local_data():  
    file_path = 'path/to/fetch_20newsgroups.tar.gz'  # 请替换为你的文件路径  
    with tar_open(file_path) as tar:  
        train_data = tar.extractall(b'')  
    return train_data  
  
# 加载数据集  
def load_data():  
    data = load_local_data()  
    categories = ['alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space']  
    twenty_sci_news = fetch_20newsgroups(subset='train', categories=categories, data_home=data)  
    return twenty_sci_news  
  
# 特征提取和训练模型  
def train_model(X, y):  
    vectorizer = CountVectorizer()  
    X_train_counts = vectorizer.fit_transform(X)  
    gnb = MultinomialNB()  
    gnb.fit(X_train_counts, y)  
    return gnb  
  
# 测试模型  
def test_model(model, X_test):  
    X_test_counts = vectorizer.transform(X_test)  
    y_pred = model.predict(X_test_counts)  
    return y_pred  
  
# 主程序  
if __name__ == "__main__":  
    # 加载数据集  
    twenty_sci_news = load_data()  
    X, y = twenty_sci_news.data, twenty_sci_news.target  
      
    # 训练模型  
    gnb = train_model(X, y)  
      
    # 测试模型(这里使用测试集)  
    X_test = ['This is a test email', 'Another test email']  # 你可以替换为其他测试文本数据  
    y_pred = test_model(gnb, X_test)  
    print(y_pred)  # 输出预测结果,例如:[0 1] 表示第一个分类被预测为0,第二个分类被预测为1(根据你选择的类别索引)

五、优缺点

朴素贝叶斯算法的优点包括:

  • 简单易行:该算法原理简单,实现容易,不需要大量的数据标注工作。
  • 高准确率:在许多数据集上,朴素贝叶斯算法具有较高的分类准确率。
  • 对异常值和缺失值不敏感:该算法在处理异常值和缺失值时相对稳健。-
    朴素贝叶斯算法的缺点包括:
  • 特征条件独立假设:该算法假设特征之间相互独立,这在许多实际情况下并不成立,可能会影响分类效果。
  • 对连续特征的处理能力有限:朴素贝叶斯算法对于连续特征的处理能力有限,需要将连续特征离散化或对数据进行归一化处理。
  • 对多分类问题处理能力有限:朴素贝叶斯算法适用于二分类问题,对于多分类问题需要进行改进或使用其他算法。
  • 22
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值