朴素贝叶斯法和文本分类中的代码实现
但是有一个不能忽略的问题就是:在训练集不充分的情况下,缺少某个维度的条件概率时,(例如,如果P ( X ( 1 ) = 1 ∣ Y = 1 ) P(X^{(1)}=1|Y=1)P(X (1)=1∣Y=1)为0的话)那么在预测的时候,将会产生很大的错差。后验概率(Posterior Probability):在一个事件发生后,人们分析计算导致该事件发生的各种原因的各自概率。朴素贝叶斯法分类时,对给定
朴素贝叶斯(naïve Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法,特征条件独立假设即‘朴素’。
首先是贝叶斯定理:
贝叶斯公式:
先验概率(Prior Probability):在一个事件发生前,人们根据已有的经验或知识预测该事件发生的概率。
后验概率(Posterior Probability):在一个事件发生后,人们分析计算导致该事件发生的各种原因的各自概率。(已知结果求原因的概率)
条件概率(Conditional Probability):事件A发生的情况下事件B发生的概率
特征条件独立假设:
条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。
朴素贝叶斯模型
因为分母是一个常数,所以化简为:
朴素贝叶斯法分类时,对给定的输入x,通过学习到的模型计算后验概率分布P(Y=ck|X=x),将后验概率最大的类作为x的类输出。
期望风险最小化原则等价于后验概率最大化原则(使用0-1损失函数推导,详情见《统计学习方法》)
朴素贝叶斯法的参数估计
假设有一个数据集D和一个参数模型θ,极大似然估计的目标是找到使得数据集D出现的概率
P ( D ∣θ) 最大的参数值θ(P (θ∣D)化简后约去定值)。假设数据相互独立,P ( D ∣θ) =θ)取对数,求导取极值点,就得到了要估计的参数。
先验概率的极大似然估计为
条件概率的极大似然估计为
证明
统计学习方法 第四章习题答案_统计学习方法 第四章答案-CSDN博客
贝叶斯估计
但是有一个不能忽略的问题就是:在训练集不充分的情况下,缺少某个维度的条件概率时,(例如,如果P ( X ( 1 ) = 1 ∣ Y = 1 ) P(X^{(1)}=1|Y=1)P(X (1)=1∣Y=1)为0的话)那么在预测的时候,将会产生很大的错差。解决这个问题的办法就是在各个估计中加入平滑项,即贝叶斯估计。
条件概率的贝叶斯估计是:
先验概率的贝叶斯估计是:
代码实现:
多项式朴素贝叶斯(适用于离散计数特征,如文本词频)
1. 准备文本数据集
2. 使用TF-IDF进行特征提取
TF 词频 词语在当前文档中出现的频率,衡量词语在单篇文档中的重要性。
IDF 逆文档频率 (语料库),衡量词语在整个语料库中的普遍程度
3. 划分数据集
4. 训练multinomialNB模型
5. 模型预测与评估
# 导入必要的库
from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
# 1. 准备数据:加载文本数据集
# 选择几个新闻类别作为示例
categories = ['rec.sport.baseball', 'rec.sport.hockey',
'sci.space', 'comp.graphics']
newsgroups = fetch_20newsgroups(subset='all', categories=categories,
remove=('headers', 'footers', 'quotes'))
X = newsgroups.data # 文本内容
y = newsgroups.target # 类别标签
# 2. 特征工程:将文本转换为词频特征
# 使用TF-IDF进行特征提取
vectorizer = TfidfVectorizer(
stop_words='english', # 移除英文停用词(如"the"、"is")
max_features=5000, # 只保留TF-IDF最高的5000个特征
ngram_range=(1, 2), # 同时考虑1-gram(单个词)和2-gram(词组)
min_df=5, # 词出现的文档数少于5次则忽略
max_df=0.8, # 词出现的文档比例超过80%则忽略(可能是通用词)
lowercase=True, # 自动转换为小写(默认True)
token_pattern=r'\b\w+\b' # 分词规则(默认匹配单词字符)
)
X_tfidf = vectorizer.fit_transform(X) # 转换为稀疏矩阵
# (0, 4979) 0.1443938571152747 # 第0个字符串,对应词典序号为4979的词的TFIDF为0.1443
# (0, 485) 0.1957511270993743
# (0, 4301) 0.1483284116495783
# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X_tfidf, y, test_size=0.3, random_state=42
)
# 4. 初始化并训练MultinomialNB模型
# alpha:平滑参数,避免出现零概率(默认1.0)
model = MultinomialNB(alpha=1.0)
model.fit(X_train, y_train)
# 5. 模型预测与评估
y_pred = model.predict(X_test)
# 输出评估指标
print(f"多项式朴素贝叶斯准确率: {accuracy_score(y_test, y_pred):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=newsgroups.target_names))
# 6. 实际预测示例
def predict_category(text):
# 将文本转换为特征向量
text_tfidf = vectorizer.transform([text])
# 预测类别
pred = model.predict(text_tfidf)
return newsgroups.target_names[pred[0]]
# 测试预测功能
test_texts = [
"The team scored three home runs in the ninth inning",
"The rocket successfully launched into orbit around Mars",
"Graphics card performance comparison for gaming"
]
for text in test_texts:
print(f"\n文本: {text}")
print(f"预测类别: {predict_category(text)}")
朴素贝叶斯算法与贝叶斯估计_朴素贝叶斯和贝叶斯估记-CSDN博客
【机器学习算法笔记系列】朴素贝叶斯(NB)算法详解和实战_gaussiannb英文缩写-CSDN博客
李航,著. 统计学习方法[M]. 清华大学出版社
更多推荐
所有评论(0)