深入理解贝叶斯分类与朴素贝叶斯模型(Naive Bayes, NB):从基础到实战
目录
贝叶斯分类
公式
决策规则
优点
贝叶斯分类器的例子——垃圾邮件问题
1. 特征(输入):
2. 类别:
3. 数据:
4. 模型训练:
注:类别先验概率
5. 模型预测:
朴素贝叶斯模型
模型定位&模型假设
模型算法
例子
sklearn朴素贝叶斯代码实现
贝叶斯分类
公式
在贝叶斯分类中,我们关注的是样本属于某个类别的概率。设是输入特征向量,是类别。根据贝叶斯公式,我们可以计算后验概率 :
其中,
- 是在给定输入 x 的条件下,属于类别的概率。
- 是在给定类别的条件下,输入 x 的概率(类别条件概率)。
- 是类别 的先验概率。
- 是输入的概率。
决策规则
选择具有最高后验概率的类别作为最终的分类结果。
优点
贝叶斯分类器的优点之一是它对小样本数据具有较好的鲁棒性,而且能够自然地处理多类别问题。然而,它的性能可能会受到输入特征之间的独立性假设的影响。在实际应用中,朴素贝叶斯分类器(Naive Bayes Classifier)是一种常见的贝叶斯分类器,其中假设特征之间是相互独立的。
贝叶斯分类器的例子——垃圾邮件问题
我反正看了上面那些个公式,不慎理解,虽然是数学专业的但是对于类别分布仍然有一些迷茫,所以这里举一个例子
假设我们要使用朴素贝叶斯分类器来判断一封电子邮件是否为垃圾邮件(Spam)或非垃圾邮件(Ham),我们可以使用以下特征:
1. 特征(输入):
- : 邮件中包含词语 "money" 的概率。
- : 邮件中包含词语 "free" 的概率。
- : 邮件中包含词语 "meeting" 的概率。
2. 类别:
- : 垃圾邮件(Spam)。
- : 非垃圾邮件(Ham)。
3. 数据:
我们有一个已标记的训练数据集,其中包含一些垃圾邮件和非垃圾邮件。对于每封邮件,我们统计了的取值。
4. 模型训练:
于每个类别,我们计算先验概率 。对于每个特征和类别,我们计算类别条件概率 (这里的计算后面在朴素贝叶斯那里有详细说明)。
注:类别先验概率
类别的先验概率是指在没有任何观测数据的情况下,我们对每个类别的初始信念或概率。这个先验概率表示我们在了解任何具体数据之前对各个类别的预期信念。
数学上,假设有K个类别,类别的先验概率表示为,其中。
在实际问题中,我们可以通过观察训练数据集中每个类别的样本数量,来估计先验概率。具体而言,如果训练数据中类别出现的次数为,总样本数为 ,那么类别的先验概率 可以估计为:
在训练模型时,这些先验概率是模型的一部分,用于计算后验概率。在实际应用中,如果没有特定的先验知识,有时候也会使用均匀先验,即假设每个类别的先验概率相等。这意味着对于每个都相等。
5. 模型预测:
对于一封新的邮件,我们计算它属于每个类别的后验概率。选择具有最高后验概率的类别作为最终的分类结果。
在朴素贝叶斯分类器中,特征之间的独立性假设是一个简化,但在实际应用中,该方法在垃圾邮件过滤等任务上表现良好。
朴素贝叶斯模型
模型定位&模型假设
贝叶斯模型属于生成式模型,它对样本的观测值和类别状态的联合分布进行建模。在实际应用中,联合分布转换成为类别的先验分布与类条件分布乘积的形式:
前者可以分别使用伯努利分布(二分类)和类别分布(多分类)建模先验概率,但是类条件分布的估计一直是贝叶斯模型的难题。
注:在贝叶斯分类中,朴素贝叶斯模型通常涉及到计算后验概率,其中分母是用于归一化的。在实际计算中,我们通常只关注后验概率的相对大小,因此并不需要计算完整的分母。这种做法被称为"朴素",因为它简化了计算,假设特征之间是独立的,从而避免了计算联合概率分布的复杂性。
在文本分类任务中为例解决类条件分布的估计的难题,需要对文本的类条件分布做进一步简化。一种通常的做法是忽略文本中的词序关系,假设各个特征词的位置都是可以互换的,即词袋模型(Bag Of Word,BOW)。基于这一假设类条件分布可以用多项式分布刻画。基于以上条件的贝叶斯模型,称为朴素贝叶斯模型(naive Bayes, NB),它的本质是用混合的多项式分布刻画文本分布。
朴素贝叶斯模型是一种简化的贝叶斯分类器,对观测向量和类别y的联合分布
进行建模。通常假设类别变量y(类别先验概率)服从伯努利分布(0-1分布)或分类分布(多分类问题),并根据实际任务对(类别条件概率)进行合理假设。在图像分类任务中,常常将假设为服从高斯分布,而在文本分类中任务中,常见的分布假设有两种:多项分布模型和多变量伯努利分布模型。其中多变量伯努利分布假设只关心特征项是否出现,而不记录出现的频次,在实际应用中效果不及多项分布假设。因此,在文本分类任务中,不加特别说明的朴素贝叶斯模型往往都是基于多项式分布假设的朴素贝叶斯模型。
模型算法
首先将一个文档表示为一个词的序列
在条件独立性假设下,可以具有多项分布的形式:
其中,V是词汇表维度,表示词汇表中的第i个特征项。令表示在类条件下出现的概率,表示在文档中的词频。
同时,我们以多分类问题为例,假设类别y服从类别分布:
根据多项式分布模型假设,的联合分布为
其中均为模型参数。
朴素贝叶斯模型基于最大似然估计算法进行参数学习,给定训练集,模型以对数似然函数作为优化目标。对优化目标求导置零,求解得到模型的参数估计值为:
从参数估计的结果例可以看出,在多项式分布假设下,频率正是概率的最大似然估计值,例如,类别概率的最大似然估计结果是训练集中第j类样本出现的频率;类条件下特征想概率的最大似然估计结果是第j类文档中所有特征项中出现频率。为了防止零概率的出现,常常对进行拉普拉斯平滑:
例子
利用朴素贝叶斯模型,在降维后的文本分类训练集(表5.7)上进行模型学习,分别令计算机,t2 = 排球,t3 = 运动会,t4 = 高校,t5 = 大学,y = 1表示教育类,y = 0表示体育类,可以得到如下参数估计结果。
基于上述模型参数,对test_d1的文本表示为,它与教育类和体育类的联合概率分别为
根据贝叶斯分布可得属于两类的后验概率分布为:
所以可以预测属于教育类。
同理可以计算得属于体育类。
sklearn朴素贝叶斯代码实现
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# 示例数据(文本和对应的标签)
corpus = [
("This is a positive statement", "positive"),
("I feel great", "positive"),
("This is a negative statement", "negative"),
("I don't like this", "negative"),
("I feel awful", "negative")
]
# 将数据分为训练集和测试集
texts, labels = zip(*corpus)
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)
# 将文本转换为词频向量
vectorizer = CountVectorizer()
X_train_vectorized = vectorizer.fit_transform(X_train)
X_test_vectorized = vectorizer.transform(X_test)
# 训练朴素贝叶斯模型
nb_classifier = MultinomialNB()
nb_classifier.fit(X_train_vectorized, y_train)
# 在测试集上进行预测
y_pred = nb_classifier.predict(X_test_vectorized)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# 打印分类报告
print("\nClassification Report:")
print(classification_report(y_test, y_pred))