算法总结2:朴素贝叶斯算法
1.概率基础
联合概率:包含多个条件,且所有条件同时成立的概率
记作 𝑃(𝐴,𝐵) 、 P(AB) 、 P(A∩B):𝑃(𝐴,𝐵) = P(A) * P(B)
条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率
记作:𝑃(𝐴|𝐵) = P(A,B) / P(B)
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果
2.算法原理
朴素贝叶斯-贝叶斯公式
注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别。
公式可以理解为:
其中c可以是不同类别。
公式分为三个部分:
-
- 𝑃(𝐶):每个文档类别的概率(某文档类别词数/总文档词数)。
- 𝑃(𝑊│𝐶):给定类别下特征(被预测文档中出现的词)的概率。
计算方法:𝑃(𝐹1│𝐶)=𝑁𝑖/𝑁 (训练文档中去计算)。
𝑁𝑖为该𝐹1词在C类别所有文档中出现的次数。
N为所属类别C下的文档所有词出现的次数和。
-
- 𝑃(𝐹1,𝐹2,…) 预测文档中每个词的概率。
例子:
训练集统计结果(指定统计词频):
现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?
思考:属于某个类别为0,合适吗?
3. 拉普拉斯平滑
问题:从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面有很多出现次数都为0,很可能计算结果都为零
解决方法:拉普拉斯平滑系数
𝛼为指定的系数一般为1,m为训练文档中统计出的特征词个数
4.sklearn朴素贝叶斯实现API
sklearn.naive_bayes.MultinomialNB
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)朴素贝叶斯分类
alpha:拉普拉斯平滑系数
5. 分类模型的评估
(1) 准确率
estimator.score()
一般最常见使用的是准确率,即预测结果正确的百分比。
(2) 精确率和召回率
-
- 混淆矩阵
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
-
- 精确率
预测结果为正例样本中真实为正例的比例(查得准)
-
- 召回率
真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)
-
- 其他分类标准,F1-score,反映了模型的稳健型
(3) 分类模型评估API
sklearn.metrics.classification_report
sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
-
- y_true:真实目标值
- y_pred:估计器预测目标值
- target_names:目标类别名称
- return:每个类别精确率与召回率
6. 朴素贝叶斯算法案例
sklearn20类新闻分类
20个新闻组数据集包含20个主题的18000个新闻组帖子
# coding=utf-8 from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier, export_graphviz import pandas as pd def naviebayes(): """ 朴素贝叶斯进行文本分类 :return: None """ news = fetch_20newsgroups(subset="all") # print(news.data) # print(news.target) # 进行数据集分割 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25) # print(x_test) # 对数据集进行特征抽取 tf = TfidfVectorizer() # 对训练集中的列表进行每篇文章重要性统计 x_train = tf.fit_transform(x_train) print(tf.get_feature_names()) x_test = tf.transform(x_test) # 进行朴素贝叶斯算法预测 mlt = MultinomialNB(alpha=1.0) # print(x_train.toarray()) mlt.fit(x_train, y_train) y_predict = mlt.predict(x_test) print("预测文章类别为:\n", y_predict) print("准确率为:\n", mlt.score(x_test, y_test)) print("每个类别的精确率和召回率\n", classification_report(y_test, y_predict, target_names=news.target_names)) if __name__ == '__main__': naviebayes()
7. 朴素贝叶斯分类优缺点
优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快
缺点:
- 需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验
- 模型的原因导致预测效果不佳。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!