机器学习(四)--- 朴素贝叶斯

目录

概述

朴素贝叶斯算法原理

代码练习

1、留言分类

2、垃圾邮件分类

3、My Data

Reference


概述

朴素贝叶斯法(Naive Bayes Classifier)是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集,首先基于特征条件独立假设学习输入输出的联合概率分布(朴素贝叶斯法这种通过学习得到模型的机制,显然属于生成模型);然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y。

首先 我们先来了解一下部分概念

比如我们已经知道袋子里面有 10 个球,不是黑球就是白球,其中 6个是黑球,那么把手伸进去摸一个球,就能知道摸出黑球的概率是多少。但这种情况往往是上帝视角,即了解了事情的全貌再做判断。

但是 我们事先不知道袋子里黑球和白球的比例 通过我们后面摸出来球的颜色能判断袋子里黑白球的比例吗

先验概率:
通过经验来判断事情发生的概率,比如说“贝叶死”的发病率是万分之一,就是先验概率。

后验概率:
后验概率就是发生结果之后,推测原因的概率。比如说某人查出来了患有“贝叶死”,那么患病的原因可能是 A、B 或 C。**患有“贝叶死”是因为原因 A 的概率就是后验概率。它是属于条件概率的一种。

条件概率:
事件 A 在另外一个事件 B 已经发生条件下的发生概率,表示为 P(A|B)。比如原因 A 的条件下,患有“贝叶死”的概率,就是条件概率。

 

接下来了解一下机器学习中的判别式模型和生成式模型

在机器学习中,对于有监督学习可以将其分为两类模型:判别式模型和生成式模型。简单地说,判别式模型是针对条件分布建模,而生成式模型则针对联合分布进行建模。

简单来说就是

  • 对于判别式模型,只需要学习二者差异即可。比如说好瓜和坏瓜  比如好瓜的藤比坏瓜更绿一些。
  • 而生成式模型则不一样,需要学习好瓜的特征是什么样,坏瓜的特征是么样。有了二者的特征以后,再根据各自的特征去区分。

生成式模型:由数据学习联合概率分布P(X,Y), 然后由P(Y|X)=P(X,Y)/P(X)求出概率分布P(Y|X)作为预测的模型。该方法表示了给定输入X与产生输出Y的生成关系

判别式模型:由数据直接学习决策函数Y=f(X)或条件概率分布P(Y|X)作为预测模型,即判别模型。判别方法关心的是对于给定的输入X,应该预测什么样的输出Y。
 

而这次实验所学的贝叶斯就是生成式模型

对每一个类建立一个模型,有多少个类别,就建立多少个模型。比如说类别标签有{好瓜,坏瓜},那首先根据好瓜的特征学习出一个好瓜的模型,再根据坏瓜的特征学习出坏瓜的模型,之后分别计算新样本  跟两个类别的联合概率 \large p(x,y) ,然后根据贝叶斯公式:

分别计算,选择最大的\large p(x,y)作为样本的分类

 

朴素贝叶斯算法原理

贝叶斯公式 

在贝叶斯公式中,P(A)称为"先验概率"(Prior probability),即在B事件发生之前,对A事件概率的一个判断。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,对A事件概率的重新评估。

<

### 朴素贝叶斯分类器简介 朴素贝叶斯分类器是一种基于贝叶斯定理的监督学习算法,其核心假设是特征之间相互独立[^2]。尽管这一假设在现实中往往不成立,但该模型仍然表现出良好的性能,在许多实际应用中取得了不错的效果[^3]。 以下是关于如何设计和实现一个简单的朴素贝叶斯分类器实验的具体说明: --- ### 数据集准备 为了验证朴素贝叶斯分类器的有效性,可以选择经典的文本分类数据集(如垃圾邮件检测)或者数值型数据集(如鸢尾花数据集 Iris Dataset)。这里以鸢尾花数据集为例进行演示。 #### 加载数据 可以使用 `scikit-learn` 提供的数据加载工具快速获取鸢尾花数据集: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 data = load_iris() X, y = data.data, data.target # 将数据划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` --- ### 构建朴素贝叶斯分类器 利用 Python 中的 `sklearn.naive_bayes` 模块可以直接构建并训练朴素贝叶斯分类器。常见的变体包括高斯分布下的朴素贝叶斯(GaussianNB),适用于连续型变量。 #### 训练模型 以下是一个完整的代码示例: ```python from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score, classification_report # 初始化朴素贝叶斯分类器 model = GaussianNB() # 使用训练数据拟合模型 model.fit(X_train, y_train) # 对测试集进行预测 y_pred = model.predict(X_test) # 输出评估指标 print(f"Accuracy: {accuracy_score(y_test, y_pred):.2f}") print("\nClassification Report:") print(classification_report(y_test, y_pred)) ``` 上述代码实现了以下几个功能: 1. **初始化模型**:创建了一个基于高斯分布的朴素贝叶斯分类器实例。 2. **训练阶段**:通过调用 `.fit()` 方法完成模型参数的学习。 3. **预测与评估**:对测试集执行预测操作,并计算准确率以及详细的分类报告。 --- ### 自定义实现朴素贝叶斯分类器 如果希望深入了解内部机制,可以通过手动编写代码来实现朴素贝叶斯的核心逻辑。以下是针对二元分类问题的一个简化版本: #### 手动实现 ```python import numpy as np class NaiveBayesClassifier: def __init__(self): self.class_prior = {} self.feature_likelihoods = {} def fit(self, X, y): n_samples, n_features = X.shape classes = np.unique(y) # 计算先验概率 P(C_k) for c in classes: X_c = X[y == c] self.class_prior[c] = len(X_c) / n_samples # 计算条件概率 P(x_i|C_k),假定各特征服从正态分布 mean = np.mean(X_c, axis=0) var = np.var(X_c, axis=0) self.feature_likelihoods[c] = (mean, var) def predict(self, X): predictions = [] for x in X: posteriors = [] # 遍历每个类别的后验概率 P(C_k|x) for c, prior in self.class_prior.items(): likelihood = np.log(prior) # 基于正态分布的概率密度函数计算似然值 mean, var = self.feature_likelihoods[c] numerator = np.exp(-((x - mean)**2) / (2 * var)) denominator = np.sqrt(2 * np.pi * var) likelihood += np.sum(np.log(numerator / denominator)) posteriors.append(likelihood) # 取最大后验对应的类别作为预测结果 pred_class = np.argmax(posteriors) predictions.append(pred_class) return np.array(predictions) # 测试自定义实现 nb_custom = NaiveBayesClassifier() nb_custom.fit(X_train, y_train) y_pred_custom = nb_custom.predict(X_test) print(f"Custom Accuracy: {accuracy_score(y_test, y_pred_custom):.2f}") ``` 此部分展示了如何从零开始构建朴素贝叶斯分类器,涉及的关键概念包括先验概率 \(P(C_k)\) 和条件概率 \(P(x_i | C_k)\)[^2]。 --- ### 总结 以上提供了两种方式来理解和实践朴素贝叶斯分类器:一种是借助成熟的库(如 scikit-learn)快速搭建模型;另一种则是深入底层原理,自行编码实现基本框架。无论采用哪种方法,都可以加深对该算法的认识及其适用场景的理解。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值