机器学习(10)

判别式模型和生成模型

判别式模型

判别式模型的目的是直接建模条件概率 ,即给定输入,预测输出 的概率。简而言之,判别式模型关注的是区分不同类别之间的边界。

生成式模型

生成式模型的目的是建模联合概率,即输入和输出的联合分布。生成式模型尝试模拟数据的生成过程,从而能够生成与训练数据相似的新样本。

案例分析:

|---|-----|-----|-----|-----|
| | 样本1 | 样本2 | 样本3 | 样本4 |
| x | 0 | 0 | 1 | 1 |
| y | 0 | 0 | 0 | 1 |

判别式模型p(y|x)(x=0时y=0的概率)

|-----|-----|-----|
| | y=0 | y=1 |
| x=0 | 1 | 0 |
| x=1 | 1/2 | 1/2 |

生成式模型p(y,x) ---> p(y|x)(x=0且y=0的概率,考虑全局的样本)

|-----|-----|-----|
| | y=0 | y=1 |
| x=0 | 1/2 | 0 |
| x=1 | 1/4 | 1/4 |

贝叶斯方法

贝叶斯公式

  • P(A∣B):在事件 B已经发生的情况下,事件 A发生的条件概率(后验概率)。

  • P(B∣A):在事件 A已经发生的情况下,事件 B 发生的条件概率(可能性,似然函数)。

  • P(A):事件 A的先验概率,即在没有任何条件信息时,事件 A发生的概率(先验概率)。

  • P(B):事件 B 的总概率。

核心思想

根据先验信息 和观测到的数据 ,计算后验概率 。通过这个后验概率,可以对未知的事件做出推断,即使用结果推测出产生这个结果的原因

朴素贝叶斯分类

假设我们有一个数据集,其中每个样本是由特征 和类别标签组成的。朴素贝叶斯的目标是计算每个类别的后验概率,然后选择具有最大后验概率的类别作为预测类别。

根据贝叶斯定理,类别给定输入特征的后验概率为:

朴素假设:特征条件独立

朴素贝叶斯的关键假设是特征之间的条件独立性,即在给定类别 的条件下,每个特征都是独立的,即:

朴素贝叶斯的特点

  • 逻辑简单,易于实现
  • 效率高,时空开销小
  • 条件独立假设不成立则分类效果一般
  • 适用于特征相关性较小时

朴素贝叶斯家族

分类器名称 特征类型 特征分布假设
高斯朴素贝叶斯(Gaussian NB) 连续型特征 假设特征服从高斯(正态)分布
多项式朴素贝叶斯(Multinomial NB) 离散型特征(计数型特征) 假设特征服从多项式分布(常用于文本分类)
伯努利朴素贝叶斯(Bernoulli NB) 离散型特征(0或1二值特征) 假设特征服从伯努利分布(即每个特征是二元的)
Complement朴素贝叶斯(Complement NB) 离散型特征(计数型特征) 基于多项式分布的补充方法,专门用于类别不平衡的数据,处理负类更好
Categorical朴素贝叶斯(Categorical NB) 离散型特征(分类特征) 假设特征服从多项分布,适用于每个特征是分类变量的情况(如颜色、品牌等)

代码实现

python 复制代码
from sklearn import datasets

iris = datasets.load_iris()
x = iris.data
y = iris.target

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=0)

from sklearn.naive_bayes import BernoulliNB,GaussianNB,MultinomialNB
bnb = BernoulliNB()
gnb = GaussianNB()
mnb = MultinomialNB()

bnb.fit(X_train,y_train)
bnb.score(X_test,y_test)

mnb.fit(X_train,y_train)
mnb.score(X_test,y_test)

gnb.fit(X_train,y_train)
gnb.score(X_test,y_test)

多项式朴素贝叶斯案例 ------ 文本分类

python 复制代码
from sklearn.datasets import fetch_20newsgroups

# subset:指定要加载的新闻组数据的子集,all:训练集和测试集都取出来
news = fetch_20newsgroups(subset='all')
print(news.DESCR)

# 纯文本数据不能直接使用模型去训练
# 使用特征抽取
# CountVectorizer是一个文本特征提取器,它将文本数据转化为词频矩阵。每个单词都会被映射到一个特定的特征空间,并计算文本中每个单词出现的次数
# stop_words='english'表示在进行词频统计时,会自动排除英文中的常用停用词(例如 "the", "and", "is" 等)
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(stop_words='english')

vec.fit_transform(X)
X_train_vec = vec.transform(X_train)
X_test_vec = vec.transform(X_test)

from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X_train_vec,y_train)

nb.score(X_test_vec,y_test)

y_predict = nb.predict(X_test_vec)
from sklearn.metrics import classification_report
print(classification_report(y_test,y_predict,target_names=news.target_names))

问题:数据集下载显示403错误

解决方案:

  • 手动下载fetch_20newsgroups数据集压缩包20-news-bydate.tar.gz
  • 将压缩包保存至:C:\Users\(用户名)\scikit_learn_data\20news_home

贝叶斯方法的优缺点和适用条件

优点:

  • 过程简单速度快
  • 对于多分类问题同样有效
  • 分布独立假设下效果好

缺点:

  • 条件独立假设在现实中往往难以保证
  • 只适用于简单的比大小问题
  • 如果个别类别概率为0,则预测失败
  • 条件概率和先验分布计算复杂度高,高维计算困难

适用条件:

  • 文本分类/垃圾文本过滤/情感判别
  • 多分类实时预测
  • 推荐系统
  • 复杂问题建模
相关推荐
风象南4 小时前
普通人用AI加持赚到的第一个100块
人工智能·后端
牛奶4 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶4 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
哥布林学者6 小时前
高光谱成像(一)高光谱图像
机器学习·高光谱成像
罗西的思考7 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
冬奇Lab8 小时前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab8 小时前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯
格砸9 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
可观测性用观测云9 小时前
可观测性 4.0:教系统如何思考
人工智能
sunny86510 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github