【机器学习 | 第八篇】- 朴素贝叶斯

张开发
2026/4/4 0:52:57 15 分钟阅读
【机器学习 | 第八篇】- 朴素贝叶斯
前言朴素贝叶斯作为概率论中的概念通过对文本内容的训练可以概率的方式进行情感分析!一、概率基础复习1.1 条件概率定义在事件 B 已经发生的条件下事件 A 发生的概率记作 P(A∣B)。公式1.2 联合概率定义多个事件同时发生的概率记作 P(AB)。一般公式P(AB)P(A)⋅P(B∣A)P(B)⋅P(A∣B)。独立事件若 A 与 B 独立则 P(AB)P(A)P(B)。1.3 条件概率与联合概率示例根据示例数据表包含职业、体型、是否喜欢P(程序员∣喜欢)2/40.5P(程序员且匀称)3/7×1/31/7P(程序员且超重∣喜欢)0.5×0.50.25在独立假设下二、贝叶斯公式2.1 公式数学公式等同于注释P(C)先验概率没有观察到任何特征证据的情况下类别C在样本空间中出现的概率P(W∣C)似然/条件概率已知样本属于类别 C的条件下该样本具有特征 W的概率P(W)证据/全局概率在整个样本集中特征 W 出现的概率P(C∣W)后验概率已知特征 W样本属于类别 C 的概率核心逻辑通过先验概率 条件概率推导后验概率实现样本分类。2.2 示例三、朴素贝叶斯朴素贝叶斯的核心思想可以概括为利用贝叶斯定理计算后验概率并假设特征之间相互独立以简化计算。它通过统计先验和条件概率实现对样本的分类。虽然独立假设在现实中可能不成立但其简单高效和较好的性能使其成为机器学习中的经典算法之一特别适合文本分类等任务。3.1 特征条件独立假设如果特征不止一个比如既有天气又有温度、湿度那么计算似然概率会非常复杂因为需要知道特征之间的联合分布。为了简化计算朴素贝叶斯引入了一个强假设所有特征在给定类别的条件下相互独立。即例P(程序员,超重∣喜欢) P(程序员∣喜欢)⋅P(超重∣喜欢)P(程序员,超重) P(程序员)⋅P(超重)这个假设称为“朴素”naive因为在现实中特征往往并不独立例如“晴天”和“高温”可能相关但实践表明它仍然能取得不错的效果。为什么这样假设将联合概率分解为多个边缘概率的乘积大大简化了计算。每个可以独立地从训练数据中统计得到避免了高维联合分布估计的困难。3.2 拉普拉斯平滑也称为加一平滑问题若某特征在训练集中未出现则概率为 0导致后验概率为 0影响分类。解决引入拉普拉斯平滑系数 α通常取 1等同于注释核心逻辑它主要解决的是**“零概率问题”—— 当某个特征在训练集中从未出现过时直接计算为 0 会导致整个模型预测失效平滑机制可以给它一个很小的非零值。避免零概率保证所有特征都有非零概率。**核心原理为什么要这么写1. 为什么要加 α解决零概率如果不加分当0没见过这个词时概率会变成 0。这会导致后续的乘积计算变成 0模型无法判断。加上 α通常取 1)就是给这个没见过的词留一条活路让它拥有一个极小的概率。2. 为什么分母要乘 m归一化保证和为 1不加 m 时这会导致该类别下所有概率之和 ≠1。加上 m 后相当于给每一个特征哪怕是没见过的都预先分配了一个的概率保证所有可能的特征概率之和为 1符合概率定义。3.3 朴素贝叶斯的三种常见变体根据特征分布假设的不同朴素贝叶斯有以下几种常用模型模型适用特征假设典型应用高斯朴素贝叶斯连续特征特征服从高斯分布正态分布身高、体重等连续值分类多项式朴素贝叶斯离散特征计数特征服从多项分布文本分类词频伯努利朴素贝叶斯布尔特征0/1特征服从伯努利分布文本分类词是否出现多项式朴素贝叶斯是最常用的文本分类模型因为它能很好地处理词频。高斯朴素贝叶斯适用于连续特征如鸢尾花数据集。伯努利朴素贝叶斯适合特征为二值的情况如“是否包含某词”。3.4 朴素贝叶斯的优缺点优点算法简单易于实现只需要统计先验和条件概率。训练速度快一次扫描数据即可完成统计。对小规模数据表现良好不需要大量训练样本。可解释性强分类结果基于概率可以给出置信度。适合多分类任务天然支持多类别。缺点特征独立假设在现实中往往不成立可能导致概率估计偏差。对输入数据的表达形式敏感例如连续特征需假设分布。零概率问题需要平滑处理已通过拉普拉斯解决。四、朴素贝叶斯 API 及案例4.1 API 介绍sklearnfromsklearn.naive_bayesimportMultinomialNB modelMultinomialNB(alpha1.0)alpha拉普拉斯平滑系数默认 1.0。适用于离散特征如文本分类中的词频。4.2 案例商品评论情感分析需求根据评论内容判断是好评还是差评。4.2.1 需求说明任务目标利用已有的商品评论数据包含评论文本和对应的情感标签训练一个文本分类模型使其能够自动判断新的评论是好评还是差评。这是一个典型的二分类问题。数据概况数据来源书籍评价.csv样本片段共13条实际完整数据可能更多字段内容评论的文本内容中文评价情感标签“好评”或“差评”数据特点文本长度不一包含口语化表达、标点符号等标签为二值类别。业务意义帮助电商平台或内容网站自动分析用户反馈量化产品口碑及时发现负面评价辅助产品改进和运营决策。4.2.2 处理思维流程1. 数据加载与理解读取CSV文件查看数据结构和样本分布好评、差评各自数量。检查是否存在缺失值或空文本若有则进行剔除或填充。2. 文本预处理标签编码将“好评”映射为1“差评”映射为0或其他数值便于模型计算。文本清洗去除无关符号如标点、数字、特殊字符统一大小写英文但中文需保留汉字。分词使用中文分词工具如jieba将评论文本切分成词语序列。去停用词加载停用词表过滤掉“的”、“了”、“是”等无实际意义的词语减少噪声。3. 特征提取将分词后的文本转换为数值特征向量常用方法词袋模型CountVectorizer统计每个词在文档中出现的次数。TF-IDF可选不仅考虑词频还考虑词语在整个语料中的稀有程度可提升效果。注意特征维度可能较高但朴素贝叶斯对此有较好的适应性。4. 数据集划分将数据划分为训练集和测试集例如80%训练20%测试。由于数据量可能较小可采用分层采样stratify确保训练/测试集中正负样本比例与原始数据一致。若数据极少可考虑交叉验证。5. 模型选择与训练选择朴素贝叶斯分类器具体为多项式朴素贝叶斯MultinomialNB因为它适合离散计数特征如词频。设置拉普拉斯平滑系数alpha默认1.0避免零概率问题。用训练集拟合模型。6. 模型评估在测试集上进行预测输出分类报告精确率、召回率、F1-score和混淆矩阵评估模型对好评和差评的识别能力。若数据不平衡可重点关注少数类的召回率。也可计算准确率但需结合其他指标综合判断。7. 模型优化可选调整特征提取参数如ngram_range、max_features。尝试不同的分词工具或停用词表。若效果不佳可考虑其他模型如支持向量机、逻辑回归但朴素贝叶斯在文本分类中通常表现良好且高效。8. 模型保存与应用将训练好的模型和向量化器保存为文件如.pkl便于后续对新评论进行实时预测。部署时可封装为API接收文本返回情感类别。4.2.2 代码实现# 导入必要的包importre# 导入正则表达式包importpandasaspd# 导入数据处理包importjieba# 导入分词包“结巴”fromsklearn.feature_extraction.textimportCountVectorizer# 导入词频统计工具fromsklearn.naive_bayesimportMultinomialNB# 导入朴素贝叶斯对象fromsklearn.metricsimport(classification_report,# 评价报告包confusion_matrix)# 混淆矩阵包fromsklearn.model_selectionimporttrain_test_split# 导入数据集划分工具importpickle# 导入pickle包##### 1. 数据加载与理解# 读取数据datapd.read_csv(rfile/书籍评价.csv,encodinggbk)# 文件内容是中文在win系统下需要GBK编码# 查看数据结构和样本分布好评、差评各自数量print(数据结构,data.shape)# 样本结构(13行, 3列)print(字段信息,data.info())print(样本分布\n,data[评价].value_counts())# 检查是否存在缺失值或空文本若有则进行剔除或填充。print(缺失值,data.loc[:,data.isnull().any()].sum())# 仅显示有缺失值的字段print(重复值,data.duplicated().sum())# # 缺失值处理若存在缺失采用中位数填充或删除。# data.fillna(data.median(), inplaceTrue)# # 删除重复行# data.drop_duplicates(inplaceTrue)print(数据预览\n,data.head())##### 2. 文本预处理### 标签映射编码# 将“好评”映射为1“差评”映射为0或其他数值便于模型计算。data[标签]data[评价].apply(lambdax:1ifx好评else0)# 映射标签print(标签映射\n,data.head())### 文本清洗# 去除无关符号如标点、数字、特殊字符统一大小写英文但中文需保留汉字。# 保留中文字符、英文字母将其他字符替换为空格# 中文字符范围\u4e00-\u9fff# 英文字母a-zA-Z# 使用re.sub将不匹配保留字符的任意字符替换为空格cleaneddata[内容].apply(lambdax:re.sub(r[^a-zA-Z\u4e00-\u9fff], ,x))# 将英文字母转为小写cleanedcleaned.apply(lambdax:x.lower())# 合并多个空格为一个空格cleanedcleaned.apply(lambdax:re.sub(r\s, ,x).strip())data[内容]cleanedprint(文本清洗\n,data.head())### 文本分词# 对用户的评论信息做切词comment_list[]forlineindata[内容]:# 对每一行进行切词resultjieba.lcut(line)comment_list.append( .join(result))print(文本分词\n,comment_list)### 去停用词加载停用词表过滤掉“的”、“了”、“是”等无实际意义的词语减少噪声。withopen(file/stopwords.txt,encodingutf-8)asf:stopwords_listf.readlines()# 逐行读取文件stopwords_list[x.strip()forxinstopwords_list]# 去掉换行符stopwords_listlist(set(stopwords_list))# 去重print(停用词\n,stopwords_list)### 3.特征提取# 将分词后的文本转换为数值特征向量常用方法# 词袋模型CountVectorizer统计每个词在文档中出现的次数。# 定义词袋模型吗创建CountVectorizer对象参数停用词列表transferCountVectorizer(stop_wordsstopwords_list)xtransfer.fit_transform(comment_list)# 返回词频矩阵# print(特征矩阵\n, x, x.shape) # (13行, 37列)### 4.数据集划分# 将数据划分为训练集和测试集例如80%训练20%测试。x_train,x_test,y_train,y_testtrain_test_split(x,data[标签],train_size0.8,test_size0.2,random_state42)### 5. 模型选择与训练# 选择朴素贝叶斯分类器具体为多项式朴素贝叶斯MultinomialNB因为它适合离散计数特征如词频。# 创建贝叶斯对象bayesMultinomialNB(alpha1.0)# 模型训练bayes.fit(x_train,y_train)print(模型训练完成)# 模型预测y_predictbayes.predict(x_test)print(预测结果,y_predict)print(真实结果,y_test)print(准确率,bayes.score(x_test,y_test))### 6. 模型评估# 在测试集上进行预测# 输出分类报告精确率、召回率、F1-score和混淆矩阵# 评估模型对好评和差评的识别能力。print(分类报告\n,classification_report(y_test,y_predict))print(混淆矩阵\n,confusion_matrix(y_test,y_predict))print(准确率,bayes.score(x_test,y_test))# 测试模型# 创建测试用例test_case[我非常喜欢这个书非常推荐给朋友,这个书 sucks, 垃圾]test_case[ .join(jieba.lcut(x))forxintest_case]test_casetransfer.transform(test_case)y_predictbayes.predict(test_case)print(预测结果,y_predict)# 7. 模型调参,意义不大所以跳过# 8. 模型保存pickle.dump(bayes,open(file/商品评论情感分析.pkl,wb))

更多文章