机器学习 ---朴素贝叶斯

一、概率的解释:频率与信念的交融

  1. 经典统计学视角下的概率:经典统计学认为概率是对事件发生频率的一种极限描述,这是一种基于客观事实的概率定义。以抛硬币为例,当我们进行大量重复抛硬币实验时,会发现硬币正面朝上和反面朝上的次数逐渐趋近相等,最终得到正面和反面出现的概率都约为 0.5。这种通过大量实验获取概率的方式,体现了经典统计学中概率源于客观实践的思想。(但现实中有些事情我们没办法进行试验,例如今天下雨的概率 50%,某城市下个月发生地震的概率 30%,这些我们无法通过试验来验证)
  2. 贝叶斯框架下的概率:贝叶斯框架下的概率理论虽然认可经典统计学的概率定义,但它同时把概率理解为人对随机事件发生可能性的一种信念,即使没有大量的实验数据支持,人们基于自身对这些事件的了解和经验,也能对其发生的可能性进行主观判断,这种主观判断就是贝叶斯框架下的概率,即主观概率。

二、贝叶斯学派与经典统计学派的交锋

  1. 经典统计学的理念:经典统计学主要基于总体信息和样本信息来进行统计推断。其核心观点是,只要能够进行足够多次的试验,就能够揭示出隐藏在数据背后的真实规律。基于此,人们可以直接通过对样本的深入研究,来推断总体的分布规律。例如,在研究某个地区居民的身高分布时,经典统计学方法会通过收集大量居民的身高数据(样本),进而推断出整个地区居民身高的总体分布情况。
  2. 贝叶斯学派的主张:贝叶斯学派有着独特的视角,他们将任意未知量 θ 看作一个随机变量,并使用一个概率分布来描述 θ 的未知状况。这个概率分布在初始阶段可以依据主观经验来设定。然而,这一观点遭到了频率学派的强烈反对,频率学派坚信参数应该是一个固定的、确定的值,而不应该具有随机性。例如,在估计一个未知的物理常数时,贝叶斯学派会用一个概率分布来描述这个常数可能的取值范围,而频率学派则认为这个常数是一个固定的客观存在,只是我们还没有准确测量出来。
  3. 两派的适用性与价值:实际上,贝叶斯方法在人们对事物认识尚不全面的情况下,能够很好地借助经验来做出更为合理的判断。它将概率与统计的研究和应用范围拓展到了那些无法进行大量重复实验的复杂问题中。但需要强调的是,主观概率的确定并非随意为之,它要求当事人对所考察的事件有深入透彻的了解和丰富的实践经验,甚至要是该领域的专家。贝叶斯学派和经典统计学派并无绝对的优劣之分,关键在于所选用的统计方法是否与具体问题的应用场景相契合。数据科学的本质并非偏袒某一方,而是致力于找出解决实际问题的最佳工具,能否有效解决实际问题才是衡量统计方法优劣的核心标准。在过往的实践中,两个统计学派在各自擅长的应用领域都展现出了卓越的表现,各有其独特的适用范围。

三、贝叶斯方法:先验与后验的完美结合

  1. 贝叶斯原理基础 :贝叶斯方法以贝叶斯原理为核心基石,它利用概率统计的知识对样本数据集进行分类。贝叶斯原理的核心公式为:,其中是在事件B发生的条件下事件A发生的概率,即后验概率;是在事件发生的条件下事件发生的概率,称为似然概率;是事件A发生的先验概率;是事件B发生的概率。
  2. **贝叶斯方法:**贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主观偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。
  3. 优势与特点:该方法的突出特点在于巧妙地融合了先验概率和后验概率。先验概率是在没有新数据或证据之前,我们对某个事件发生概率的初始估计,它可以基于以往的经验、常识或者历史数据来确定。而后验概率则是在获取了新的数据或证据之后,对先验概率进行更新和修正得到的概率。通过这种结合方式,贝叶斯方法既避免了仅仅依赖先验概率所可能产生的主观偏见,因为新的数据会对先验概率进行调整;同时也规避了单独使用样本信息可能导致的过拟合现象,因为先验概率提供了一种对样本信息的约束和平衡。在数据集规模较大的情况下,贝叶斯分类算法能够展现出较高的准确率,并且算法本身相对简单,易于理解和实现。

四、朴素贝叶斯算法:简化带来的高效

  1. 算法简化思路:朴素贝叶斯算法是贝叶斯算法家族中应用极为广泛的分类算法之一。它在贝叶斯算法的基础上进行了关键的简化,即假定在给定目标值(类别标签)的条件下,各个属性之间相互条件独立。这意味着在进行分类决策时,每个属性对结果的影响被认为是独立的,不存在某个属性变量对决策结果具有决定性的权重,也不存在某个属性变量对决策结果的影响微不足道的情况。例如,在对水果进行分类时,如果我们使用颜色、形状、味道等属性,朴素贝叶斯算法假设在已知水果类别(如苹果)的情况下,水果的颜色、形状和味道这几个属性之间是相互独立的,不会因为颜色的变化而影响形状和味道之间的关系。虽然这种简化方式在一定程度上牺牲了部分分类效果,因为现实中属性之间往往存在一定的关联,但在实际应用场景中,却极大地降低了贝叶斯方法的复杂性,使得算法的计算效率大幅提高。
  2. 算法优点
    • 逻辑简单清晰:由于假设数据集属性之间相互独立,朴素贝叶斯算法的逻辑结构变得十分直观和易于理解。无论是对于初学者快速掌握机器学习分类算法的基本原理,还是对于有经验的开发者在复杂项目中快速应用该算法,都具有很大的优势。这种简单的逻辑也使得算法的调试和优化更加容易。
    • 稳定性强:朴素贝叶斯算法具有良好的稳定性,当数据呈现出不同的特点时,其分类性能不会出现显著的波动。这是因为它基于属性独立的假设,对数据的局部变化不敏感。即使数据集中某些属性的值发生了改变,只要属性之间的独立性假设在一定程度上仍然成立,算法的分类结果就不会受到太大影响。例如,在文本分类任务中,即使文档中的某些词汇出现的频率略有变化,但只要词汇之间的相对独立性没有被严重破坏,朴素贝叶斯算法依然能够保持相对稳定的分类准确率。
    • 独立属性优势明显:当数据集属性之间的独立性条件得到较好满足时,朴素贝叶斯分类算法能够发挥出卓越的性能,展现出较高的分类准确率。在一些实际场景中,如基因序列分类、某些简单的图像特征分类等,属性之间的独立性相对较高,此时朴素贝叶斯算法能够取得很好的分类效果。
  3. 算法缺点:朴素贝叶斯算法的局限性主要源于其属性独立性假设。在现实世界中,数据集的属性之间往往存在着各种各样的关联,很难完全满足独立性条件。一旦在分类过程中遇到属性之间相互关联的情况,朴素贝叶斯算法的分类效果就会大打折扣,导致准确率下降。例如,在预测一个人是否患有某种疾病时,症状之间可能存在着复杂的因果关系,而朴素贝叶斯算法假设这些症状之间相互独立,就可能会忽略这些重要的关联信息,从而做出不准确的分类决策。

五、朴素贝叶斯分类算法流程

  1. 数据预处理
    • 数据清洗:首先要对原始数据集进行仔细的清洗,去除其中的噪声数据和错误数据。噪声数据可能是由于数据采集过程中的误差或者数据录入错误导致的,这些数据会干扰算法的学习过程,降低分类的准确性。例如,在一个学生成绩数据集中,如果某个学生的成绩被错误地记录为负数,就需要在数据清洗阶段将其修正或删除。
    • 缺失值处理:处理数据集中的缺失值也是数据预处理的重要环节。常见的缺失值处理方法包括删除缺失值所在的样本、使用均值、中位数或众数填充缺失值,以及基于模型预测来填充缺失值等。例如,在一个客户信息数据集中,如果某些客户的年龄信息缺失,可以使用该数据集的平均年龄来填充这些缺失值。
    • 数据转换:根据数据的特点和算法的要求,可能需要对数据进行转换。例如,对于连续型数据,可能需要进行标准化或归一化处理,将数据转换到一个特定的区间,以提高算法的收敛速度和分类效果。对于类别型数据,通常需要进行编码处理,将其转换为数值形式,以便算法能够处理。例如,将 "性别" 这一类别型变量编码为 0(表示男性)和 1(表示女性)。
  2. 计算先验概率: 在完成数据预处理后,需要根据训练数据集中各类别的出现频率,计算每个类别的先验概率。设数据集有个类别,为训练数据集,表示训练数据集的样本总数,表示类别的样本数,则类别的先验概率可以通过公式计算得到。例如,在一个包含 100 个样本的图像分类数据集中,有 30 个样本属于"猫"类,20 个样本属于"狗"类,50 个样本属于"其他动物"类,那么"猫"类的先验概率,"狗"类的先验概率,"其他动物"类的先验概率
  3. 计算条件概率: 对于每个类别,需要计算在该类别条件下各个属性取值的条件概率。由于朴素贝叶斯假设属性之间相互独立,这些条件概率可以独立计算。设属性有,类别为,则条件概率可以通过统计在类别c的样本中,属性取值的频率来计算。对于离散型属性,计算方法较为直接,例如对于"颜色"这一离散型属性,在"红色"类别的样本中,统计"圆形"这一形状属性出现的次数,再除以"红色"类别的样本总数,即可得到P(圆形|红色)。对于连续型属性,通常假设其服从某种概率分布(如高斯分布),然后通过样本数据估计分布的参数(如均值和方差),进而计算条件概率。例如,假设某个连续型属性在类别下服从高斯分布,则可以通过样本数据计算出均值和方差,然后利用高斯分布的概率密度函数计算
  4. 预测分类 :对于新的样本数据,根据贝叶斯公式计算每个类别下该样本的后验概率,选择后验概率最大的类别作为预测结果。具体来说,对于一个新样本,其属于类别的后验概率可以通过贝叶斯公式计算,其中(基于属性独立性假设)。由于对于所有类别都是相同的,在比较后验概率大小时可以忽略不计,因此只需比较的大小。例如,对于一个新的水果样本,已知其颜色、形状和味道等属性值,分别计算在"苹果""香蕉""橙子"等不同类别下的值,哪个类别对应的该值最大,就将该样本预测为哪个类别。

六、实现朴素贝叶斯模型

  1. 手搓

    python 复制代码
    import numpy as np
    
    
    class NaiveBayes:
        def fit(self, X, y):
            self.classes = np.unique(y)
            self.n_classes = len(self.classes)
            self.n_features = X.shape[1]
            self.mean = np.zeros((self.n_classes, self.n_features))
            self.var = np.zeros((self.n_classes, self.n_features))
            self.priors = np.zeros(self.n_classes)
    
            for c in self.classes:
                X_c = X[y == c]
                self.mean[c, :] = np.mean(X_c, axis=0)
                self.var[c, :] = np.var(X_c, axis=0)
                self.priors[c] = len(X_c) / len(X)
    
    #高斯概率密度函数为处理连续型特征提供了一个合理的概率分布假设和计算方法,使得朴素贝叶斯算法能 
    #够处理连续型数据。它将连续型特征的概率估计问题转化为基于高斯分布的参数估计和概率密度计算问题, 
    #结合先验概率,进而可以计算出后验概率,最终实现对新样本的分类预测。在实际应用中,它有助于对数据 
    #的连续型特征进行建模,使朴素贝叶斯算法能够应用于各种涉及连续型特征的分类任务,例如医疗数据中的 
    #生理指标预测、金融数据中的价格预测等领域,只要这些连续型特征在不同类别下可以合理地假设为服从高斯##分布。
        def gaussian_pdf(self, x, mean, var):
            # 计算高斯分布的概率密度函数
            # 这里使用了高斯分布的概率密度函数公式:(1 / sqrt(2 * pi * var)) * exp(-(x - mean)^2 / (2 * var))
            # x: 输入的特征值,mean: 均值,var: 方差
            coeff = 1.0 / np.sqrt(2 * np.pi * var)
            exp = np.exp(-(x - mean) ** 2 / (2 * var))
            return coeff * exp
    
        def predict(self, X):
            posteriors = []
            for x in X:
                posterior = np.zeros(self.n_classes)
                for c in range(self.n_classes):
                    # 计算先验概率乘以似然概率
                    likelihood = np.prod(self.gaussian_pdf(x, self.mean[c], self.var[c]))
                    posterior[c] = likelihood * self.priors[c]
                posteriors.append(posterior)
            posteriors = np.array(posteriors)
            # 返回具有最大后验概率的类别
            return np.argmax(posteriors, axis=1)
    
    
    if __name__ == "__main__":
        # 模拟数据集
        X = np.array([[1, 2], [2, 1], [3, 4], [4, 3], [5, 6], [6, 5], [7, 8], [8, 7], [9, 10], [10, 9]])
        y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
        nb = NaiveBayes()
        nb.fit(X, y)
        X_test = np.array([[2, 4], [7, 7], [1, 2]])
        predictions = nb.predict(X_test)
        print(predictions)
  2. 利用 sklearn 构建朴素贝叶斯模型

    python 复制代码
    from sklearn.naive_bayes import GaussianNB
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    # 加载数据集
    iris = load_iris()
    X = iris.data
    y = iris.target
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
    
    # 创建高斯朴素贝叶斯模型
    gnb = GaussianNB()
    
    # 训练模型
    gnb.fit(X_train, y_train)
    
    # 进行预测
    y_pred = gnb.predict(X_test)
    
    # 评估模型准确率
    accuracy = accuracy_score(y_test, y_pred)
    print(f"模型准确率: {accuracy}")

朴素贝叶斯算法以其独特的原理和特点,在数据分类领域占据着重要的地位。尽管它存在一定的局限性,但在许多实际应用场景中,尤其是在处理大规模数据集和对算法效率有较高要求的情况下,朴素贝叶斯算法依然是一种非常有效的选择。通过深入理解其原理、流程和应用方法,我们能够更好地利用这一工具来解决实际问题,为数据分析和机器学习项目提供有力的支持。

希望这篇博客能帮助你全面深入地理解朴素贝叶斯算法。如果你在实际应用中遇到了相关问题,或者对某些内容还有疑问,欢迎在评论区留言交流。你也可以分享自己在使用朴素贝叶斯算法过程中的经验和心得,让更多的人受益。

相关推荐
流烟默10 分钟前
NLP自然语言处理中Word2Vec和GloVe概述
人工智能·自然语言处理
羊小猪~~10 分钟前
深度学习基础--LSTM学习笔记(李沐《动手学习深度学习》)
人工智能·rnn·深度学习·学习·机器学习·gru·lstm
青松@FasterAI28 分钟前
Word2Vec如何优化从中间层到输出层的计算?
人工智能·深度学习·自然语言处理·nlp面题
CES_Asia34 分钟前
CES Asia 2025优惠期即将截止,独特模式助力科技盛会
人工智能·科技·数码相机·智能手表
paradoxjun35 分钟前
落地级分类模型训练框架搭建(1):resnet18/50和mobilenetv2在CIFAR10上测试结果
人工智能·深度学习·算法·计算机视觉·分类
sci_ei1231 小时前
高水平EI会议-第四届机器学习、云计算与智能挖掘国际会议
数据结构·人工智能·算法·机器学习·数据挖掘·机器人·云计算
Denodo1 小时前
10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据
大数据·数据库·数据仓库·人工智能·数据挖掘·数据分析·数据编织
神经星星1 小时前
登Nature子刊!北大团队用AI预测新冠/艾滋病/流感病毒进化方向,精度提升67%
人工智能·深度学习·机器学习
大哥喝阔落1 小时前
图片专栏——曝光度调整相关
人工智能·python·opencv