概念
贝叶斯公式 :
P(A∣B)具体含义是:在事件B发生的条件下事件A发生的概率
朴素贝叶斯分类器采用了“属性条件独立性假设”,即每个属性独立地对分类结果发生影响。 为方便公式标记,不妨记P(C=c|X=x)为P(c|x),基于属性条件独立性假设,贝叶斯公式可重写为
其中d为属性数目,x_i 为 x 在第i个属性上的取值。
在使用朴素贝叶斯分类器进行垃圾邮件检测时,一般会将每封邮件表示为一个特征向量,并且使用这些特征向量来训练分类器。常见的朴素贝叶斯分类器包括多项式朴素贝叶斯(Multinomial Naive Bayes)和高斯朴素贝叶斯(Gaussian Naive Bayes)等。
过程
朴素贝叶斯分类器的训练过程主要包括以下步骤:
-
计算先验概率:根据训练数据集中各个类别的样本数量,计算各个类别的先验概率。
-
计算条件概率:对于每个特征(比如词语),计算在给定类别下该特征出现的条件概率。
-
根据训练集计算的先验概率和条件概率,构建朴素贝叶斯分类器模型。
对于垃圾邮件分类预测,简单来说就是判断一封邮件是垃圾邮件的概率和是正常邮件的概率,哪一个概率大就判定为是哪一种类型的邮件。以h + 为垃圾邮件,h − 为正常邮件,D代表需要验证的邮件,d代表邮件里面的的单词如下:
则一封测试邮件为垃圾邮件和正常邮件的概率公式如下:
因为独立事件间的概率计算更加简单,为了简便计算,朴素贝叶斯假定所有输入事件之间是相互独立的。也就是邮件里的每个单词相互独立与出现的先后顺序无关。由朴素贝叶斯定理公式可以分解为如下:
多项式朴素贝叶斯适用于特征是离散型的情况,比如文本分类中常用的词频统计;而高斯朴素贝叶斯适用于特征是连续型的情况,比如一些传感器数据的处理。
具体实现
import os
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
# 加载数据集
def load_data(root_dir, label):
texts = []
labels = []
for file in os.listdir(os.path.join(root_dir, label)):
with open(os.path.join(root_dir, label, file), 'r', encoding='latin1') as f:
texts.append(f.read()) #将打开的文件内容读取并添加到列表 texts
labels.append(label)
return texts, labels
ham_texts, ham_labels = load_data('D:/yy-study/python/machine-learning/5.朴素贝勒斯/Ch04/email', 'ham')
spam_texts, spam_labels = load_data('D:/yy-study/python/machine-learning/5.朴素贝勒斯/Ch04/email', 'spam')
all_texts = ham_texts + spam_texts
all_labels = ham_labels + spam_labels
# 特征提取
vectorizer = TfidfVectorizer()
#使用 TfidfVectorizer 对所有文本数据集 all_texts 进行拟合(fit)和转换(transform),得到特征矩阵 X
X = vectorizer.fit_transform(all_texts)
#将标签数据存储在变量 y
y = all_labels
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = clf.predict(X_test)
# 模型评估
print("准确率:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
小结
这个实验使用了朴素贝叶斯分类器对垃圾邮件进行了有效的识别,并使用准确率和分类报告对模型进行了评估。