多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【机器学习入门】朴素贝叶斯算法

【机器学习入门】朴素贝叶斯算法 文章目录前言一、核心理论贝叶斯定理与“朴素”假设1.1 贝叶斯定理基础公式1.2 朴素假设朴素贝叶斯的核心1.3 手工演算示例1.4 拉普拉斯平滑alpha参数的作用二、sklearn 朴素贝叶斯三、朴素贝叶斯算法案例3.1 GaussianNB 鸢尾花数据集分类3.2 MultinomialNB 垃圾邮件文本分类演示四、朴素贝叶斯优缺点总结五、适用场景总结六、总结前言在机器学习分类算法中朴素贝叶斯是极简、高效的概率型算法。它以贝叶斯定理为数学基础叠加特征条件独立朴素假设构建分类模型广泛应用于垃圾邮件过滤、文本分类、情感分析、多分类任务。一、核心理论贝叶斯定理与“朴素”假设1.1 贝叶斯定理基础公式贝叶斯定理原始公式P ( 类别 ∣ 特征 ) P ( 类别 ) ⋅ P ( 特征 ∣ 类别 ) P ( 特征 ) P(类别|特征)\frac{P(类别) \cdot P(特征|类别)}{P(特征)}P(类别∣特征)P(特征)P(类别)⋅P(特征∣类别)​多特征场景下若有特征A、B、C类别DP ( D ∣ A , B , C ) P ( D ) ⋅ P ( A , B , C ∣ D ) P ( A , B , C ) P(D|A,B,C)\frac{P(D) \cdot P(A,B,C|D)}{P(A,B,C)}P(D∣A,B,C)P(A,B,C)P(D)⋅P(A,B,C∣D)​符号说明P ( D ) P(D)P(D)先验概率类别D在全部样本中的占比P ( A , B , C ∣ D ) P(A,B,C|D)P(A,B,C∣D)联合条件概率类别D下特征A、B、C同时发生的概率P ( D ∣ A , B , C ) P(D|A,B,C)P(D∣A,B,C)后验概率已知特征A/B/C样本属于类别D的概率分母P ( A , B , C ) P(A,B,C)P(A,B,C)对所有类别均为同一个常数做分类判断时只需要比较分子大小分母可以省略。1.2 朴素假设朴素贝叶斯的核心朴素贝叶斯增加给定类别时所有特征条件相互独立的强朴素假设。于是联合条件概率可以直接拆解为每个特征条件概率的乘积P ( A , B , C ∣ D ) P ( A ∣ D ) ⋅ P ( B ∣ D ) ⋅ P ( C ∣ D ) P(A,B,C|D)P(A|D)\cdot P(B|D)\cdot P(C|D)P(A,B,C∣D)P(A∣D)⋅P(B∣D)⋅P(C∣D)这一步拆解极大降低计算量也是朴素贝叶斯速度快、轻量化的根本来源。注意现实业务中特征往往并不独立该假设大多不成立但朴素贝叶斯依然经常取得不错效果。1.3 手工演算示例数据集3个特征A/B/C标签D0/1二分类共6条样本ABCD101001110100100110000111需求预测样本 A1, B1, C0 所属类别。1. 计算先验概率P ( D 0 ) 3 / 6 0.5 P(D0) 3/6 0.5P(D0)3/60.5P ( D 1 ) 3 / 6 0.5 P(D1) 3/6 0.5P(D1)3/60.52. 分别计算两个类别下每个特征的条件概率类别 0 (D0)P ( A 1 ∣ 0 ) 2 / 3 P(A1|0) 2/3P(A1∣0)2/3D0的3个样本中A1有2个P ( B 1 ∣ 0 ) 1 / 3 P(B1|0) 1/3P(B1∣0)1/3D0的3个样本中B1有1个P ( C 0 ∣ 0 ) 2 / 3 P(C0|0) 2/3P(C0∣0)2/3D0的3个样本中C0有2个类别 1 (D1)P ( A 1 ∣ 1 ) 1 / 3 P(A1|1) 1/3P(A1∣1)1/3D1的3个样本中A1有1个P ( B 1 ∣ 1 ) 2 / 3 P(B1|1) 2/3P(B1∣1)2/3D1的3个样本中B1有2个P ( C 0 ∣ 1 ) 1 / 3 P(C0|1) 1/3P(C0∣1)1/3D1的3个样本中C0有1个3. 带入朴素贝叶斯公式计算每一类的后验分子类别 0 的后验分子P ( D 0 ) ⋅ P ( A 1 ∣ 0 ) ⋅ P ( B 1 ∣ 0 ) ⋅ P ( C 0 ∣ 0 ) 0.5 × 2 3 × 1 3 × 2 3 2 27 ≈ 0.074 P(D0) \cdot P(A1|0) \cdot P(B1|0) \cdot P(C0|0) 0.5 \times \frac{2}{3} \times \frac{1}{3} \times \frac{2}{3} \frac{2}{27} \approx 0.074P(D0)⋅P(A1∣0)⋅P(B1∣0)⋅P(C0∣0)0.5×32​×31​×32​272​≈0.074类别 1 的后验分子P ( D 1 ) ⋅ P ( A 1 ∣ 1 ) ⋅ P ( B 1 ∣ 1 ) ⋅ P ( C 0 ∣ 1 ) 0.5 × 1 3 × 2 3 × 1 3 1 27 ≈ 0.037 P(D1) \cdot P(A1|1) \cdot P(B1|1) \cdot P(C0|1) 0.5 \times \frac{1}{3} \times \frac{2}{3} \times \frac{1}{3} \frac{1}{27} \approx 0.037P(D1)⋅P(A1∣1)⋅P(B1∣1)⋅P(C0∣1)0.5×31​×32​×31​271​≈0.037结论对比分子大小类别 0 的后验概率更大0.074 0.037预测样本属于类别 0。1.4 拉普拉斯平滑alpha参数的作用朴素贝叶斯会遇到零概率问题某个特征在某类别样本中完全没有出现过P ( 特征 ∣ 类别 ) 0 P(特征|类别)0P(特征∣类别)0相乘之后整体后验概率直接归零分类直接失效。解决手段拉普拉斯平滑alpha1拉普拉斯平滑所有特征计数1分母同步增加特征取值数量彻底消除零概率0 alpha 1利德斯通平滑alpha0关闭平滑极易触发零概率bug在实际项目中通常不建议使用。二、sklearn 朴素贝叶斯sklearn提供三套朴素贝叶斯实现分别适配不同数据类型。GaussianNB高斯朴素贝叶斯适用于连续型数据假设每个类别中的特征服从高斯分布P ( x ∣ y ) 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 P(x|y) \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}P(x∣y)2πσ2​1​e−2σ2(x−μ)2​MultinomialNB多项式朴素贝叶斯适用于离散计数数据词频、统计计数文本分类首选。class sklearn.naive_bayes.MultinomialNB(alpha1.0, fit_priorTrue, class_priorNone)参数说明alpha平滑系数默认 1.0fit_priorTrue自动学习类别先验概率class_prior手动指定先验概率BernoulliNB伯努利朴素贝叶斯适用于二值特征只关注特征“有没有出现”。常用内置属性class_log_prior_各类别的对数先验概率feature_log_prob_每个类别下各个特征的对数条件概率class_count_训练集每个类别的样本总数feature_count_每个类别内部各特征出现总次数。三种朴素贝叶斯模型区分模型适用数据典型场景MultinomialNB离散计数特征文本词频、新闻、垃圾邮件GaussianNB连续浮点数值特征鸢尾花、身高温度等普通数值数据集BernoulliNB0/1 二值特征判断关键词是否出现三、朴素贝叶斯算法案例3.1 GaussianNB 鸢尾花数据集分类importpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportGaussianNBfromsklearnimportmetrics# 读取数据集datapd.read_csv(iris.csv)# 特征跳过第0列索引取到倒数第二列标签取最后一列xdata.iloc[:,1:-1]ydata.iloc[:,-1]# 划分训练集、测试集x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.2,random_state0)# 构建并训练高斯朴素贝叶斯模型classifierGaussianNB()classifier.fit(x_train,y_train)# 训练集预测与评估train_predictedclassifier.predict(x_train)print(训练集分类报告\n)print(metrics.classification_report(y_train,train_predicted,digits4))# 测试集预测与评估test_predictedclassifier.predict(x_test)print(测试集分类报告\n)print(metrics.classification_report(y_test,test_predicted,digits4))3.2 MultinomialNB 垃圾邮件文本分类演示importpandasaspdfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportMultinomialNBfromsklearn.metricsimportclassification_report# 模拟文本数据集文本标签垃圾邮件0/正常1text_datapd.DataFrame({text:[免费领现金点链接,今天下午三点开会,中奖通知速领,周末聚餐通知],label:[0,1,0,1]})X_texttext_data[text]y_texttext_data[label]# 文本转数字特征TF‑IDFtfTfidfVectorizer()X_vectf.fit_transform(X_text)X_train,X_test,y_train,y_testtrain_test_split(X_vec,y_text,test_size0.2,random_state1)# 多项式朴素贝叶斯适配离散词频mnbMultinomialNB(alpha1)mnb.fit(X_train,y_train)y_predmnb.predict(X_test)print(classification_report(y_test,y_pred,digits4))四、朴素贝叶斯优缺点总结优点训练、预测速度极快计算开销小原理通俗易懂代码实现简单天然支持多分类任务在小样本数据集上也可以输出稳定 baseline可并行计算适合海量文本工业场景。缺点条件独立假设过于理想化现实特征大多存在相关性会降低模型精度不同数据类型需要选择对应朴素贝叶斯模型连续特征不能直接使用 MultinomialNB对噪声、异常样本比较敏感在复杂图像等高维非稀疏数据集效果弱于树模型、神经网络。五、适用场景总结优先选择朴素贝叶斯文本分类任务垃圾邮件过滤、新闻分类、情感分析需要低延迟的轻量级实时分类数据集样本量较小快速搭建 baseline 基准模型简单二分类、多分类任务。六、总结贝叶斯定理是概率数学公式朴素贝叶斯 贝叶斯定理 特征条件独立假设是可直接使用的机器学习分类算法三套朴素贝叶斯模型对应不同数据连续数值用GaussianNB离散计数词频用MultinomialNB0‑1 二值特征使用BernoulliNBalpha平滑参数解决朴素贝叶斯的零概率问题文本任务默认设置alpha1朴素贝叶斯轻量化、速度快但受限于特征独立假设不适合特征高度相关的复杂业务。
返回列表