判别式模型和生成模型
判别式模型 :
判别式模型的目的是直接建模条件概率 ,即给定输入
,预测输出
的概率。简而言之,判别式模型关注的是区分不同类别之间的边界。
生成式模型 :
生成式模型的目的是建模联合概率,即输入
和输出
的联合分布。生成式模型尝试模拟数据的生成过程,从而能够生成与训练数据相似的新样本。
案例分析:
|---|-----|-----|-----|-----|
| | 样本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,则预测失败
- 条件概率和先验分布计算复杂度高,高维计算困难
适用条件:
- 文本分类/垃圾文本过滤/情感判别
- 多分类实时预测
- 推荐系统
- 复杂问题建模