当前位置: 首页 > 科技观察

贝叶斯机器学习:经典模型与代码实现!

时间:2023-03-20 00:03:32 科技观察

贝叶斯定理是概率模型中最著名的理论之一,在机器学习中也被广泛应用。常见的基于贝叶斯理论的机器学习概率模型包括朴素贝叶斯和贝叶斯网络。本文在介绍贝叶斯理论的基础上,详细推导了朴素贝叶斯和贝叶斯网络理论,并给出了相应的代码实现。对于朴素贝叶斯模型,本文给出了其NumPy和sklearn的实现方法,而贝叶斯网络的实现是借助于pgmpy。贝叶斯理论简介自从托马斯·贝叶斯在1763年发表了著名的文章《论有关机遇问题的求解》之后,以贝叶斯公式为核心的贝叶斯理论就得到了发展。贝叶斯理论认为任何未知量都可以看作是一个随机变量,对未知量的描述可以用概率分布来概括,这是贝叶斯学派最基本的观点。当这种概率分布在进行现场实验或抽样之前就已经确定了,这个分布就可以称为先验分布,结合给定数据集X计算样本的似然函数,可以应用贝叶斯公式计算后验概率分布对于这个未知数。经典的贝叶斯公式表示如下:上式左边是后验分布,右边的分母是边缘分布,排除了任何未知量的信息,所以贝叶斯公式的等价形式可以可以写成:上式可以概括贝叶斯公式的本质是基于先验分布和似然函数的统计推断。其中,先验分布的选择和后验分布的推断是贝叶斯领域的两个核心问题。先验分布的选择目前没有统一的标准。不同的先验分布对后验计算的准确性影响很大,这也是贝叶斯领域的研究热点之一;形式化和高维的数值积分使得后验推理变得非常困难,然后随着计算机技术的发展,基于计算机软件的数值技术使这些问题得以解决,贝叶斯理论再次复活。与机器学习的结合是贝叶斯理论的主要应用方向。朴素贝叶斯理论是基于贝叶斯理论的概率分类模型,而贝叶斯网络是将贝叶斯理论应用于概率图的分类模型。朴素贝叶斯朴素贝叶斯原理及推导朴素贝叶斯是一种基于贝叶斯定理和特征独立假设的分类算法。具体来说,对于给定的训练数据,朴素贝叶斯首先基于特征条件独立假设学习输入和输出的联合概率分布,然后利用贝叶斯定理计算新实例的最大后验概率。朴素贝叶斯并不直接学习输入和输出的联合概率分布,而是通过学习类先验概率和类条件概率。朴素贝叶斯的概率计算公式如图1所示。图1朴素贝叶斯的基本公式朴素贝叶斯中朴素的含义,即特征的条件独立假设,条件独立假设是指用于分类的特征在类确定的条件下是条件独立的,这假设使得朴素贝叶斯学习成为可能。假设输入特征向量为X,输出为类标签的随机变量Y,P(X,Y)为X和Y的联合概率分布,T为给定的训练数据集。朴素贝叶斯基于训练数据集学习联合概率分布P(X,Y)。具体来说,是通过学习类先验概率分布和类条件概率分布来实现的。朴素贝叶斯学习步骤如下。首先计算类别先验概率分布:其中Ck代表第k个类别,yi代表第i个样本的类别标签。类先验概率分布可以通过最大似然估计得到。然后计算类别条件概率分布:直接估计P(X=x|Y=Ck)是不可行的,因为参数数量太多。但朴素贝叶斯最重要的假设之一是条件独立性假设,即在条件独立性假设下,类别条件概率可以基于最大似然估计计算。计算出类先验概率分布和类条件概率分布后,可以根据贝叶斯公式计算类后验概率:代入类条件计算公式,有:基于上述可学习朴素贝叶斯分类模型公式。当给定一个新的数据样本时,计算它的最大后验概率就可以了:其中,分母都是一样的,所以上式可以进一步简化为:以上就是朴素贝叶斯的简单推导过程分类模型。基于NumPy的朴素贝叶斯实现在本节中,我们将基于NumPy实现一个简单的朴素贝叶斯分类器。朴素贝叶斯因为条件独立的假设而被简化,所以实现思路比较简单。这里就不给出实现的思维导图了。根据前述推导,关键是利用极大似然估计法计算类先验概率分布和类条件概率分布。我们直接定义朴素贝叶斯模型训练过程,如代码1所示。defnb_fit(X,y):类=y[y.columns[0]].unique()class_count=y[y.columns[0]].value_counts()class_prior=class_count/len(y)prior=dict()forcolinX.columns:forjinclasses:p_x_y=X[(y==j).values][col].value_counts()foriinp_x_y.index:prior[(col,i,j)]=p_x_y[i]/class_count[j]returnclasses,class_prior,prior代码1中,给定的数据输入和输出都是Pandas数据框格式,先统计标签类别的个数,根据最大似然估计计算类先验分布。然后循环遍历数据特征和类别,计算类别条件概率。式(10)是朴素贝叶斯的核心公式。接下来,我们需要根据等式(10)和nb_fit函数返回的类先验概率和类条件概率来编写朴素贝叶斯的预测函数。朴素贝叶斯的预测函数如代码2defpredict(X_test):res=[]forcinclasses:p_y=class_prior[c]p_x_y=1foriinX_test.items():p_x_y*=prior[tuple(list(i)+[c])]res.append(p_y*p_x_y)returnclasses[np.argmax(res)]代码2中定义了朴素贝叶斯的预测函数,以测试样本X_test为输入,初始化结果列表,得到先验概率当前类的,遍历测试样本字典,先计算类条件概率的乘积,再计算先验概率与类条件概率的乘积。最后根据式(21.10)取argmax,得到最大后验概率所属的类别。最后,我们用数据样本测试编写的朴素贝叶斯代码。手动创建两类样本数据,使用nb_fit进行训练,如代码3所示。###创建数据集并训练#FeatureX1x1=[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]#FeatureX2x2=['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L']#标签列表y=[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]#形成一个pandas数据框df=pd.DataFrame({'x1':x1,'x2':x2,'y':y})#得到训练输入输出X,y=df[['x1','x2']],df[['y']]#NaiveBayesianmodeltrainingclasses,class_prior,prior_condition_prob=nb_fit(X,y)print(classes,class_prior,prior_condition_prob)图2代码3中代码21-3输出截图,我们构建了一个基于列表的Pandas数据帧格式的数据集,得到训练输入和输出并传入朴素贝叶斯训练函数,输出结果如图21.2所示。可以看出数据标签包括1/-1的二分类数据集,类别先验概率分布为{1:0.6,-1:0.4},各种条件概率如图所示。最后,我们创建一个测试样本并基于nb_predict函数对其进行类别预测,如下所示。###朴素贝叶斯模型预测X_test={'x1':2,'x2':'S'}print('测试数据预测类别为:',nb_predict(X_test))output:测试数据预测类别为:-1最后模型将这个测试样本预测为负类。基于sklearn的朴素贝叶斯实现sklearn也提供了朴素贝叶斯算法的实现,sklearn为我们提供了不同似然函数分布的朴素贝叶斯算法实现。比如高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯等。我们以高斯朴素贝叶斯为例。高斯朴素贝叶斯是一种朴素贝叶斯模型,它假设似然函数是正态分布。高斯朴素贝叶斯的似然函数如下式所示。sklearn中高斯朴素贝叶斯的调用接口为sklearn.naive_bayes.GaussianNB,以鸢尾花数据集为例给出调用示例,如代码4所示。###sklearn##frotsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportgaussimportgaussiannbfromskfromskfromskfromsklearn.mmporticsimporticsimportacccuracy_scor_seastyrether__score_estire_train_est(X,y,test_size=0.5,random_state=0)#创建高斯朴素贝叶斯实例gnb=GaussianNB()#模型拟合和预测y_pred=gnb.fit(X_train,y_train).predict(X_test)print("AccuracyofGaussianNBinirisdatatest:",accuracy_score(y_test,y_pred))output:AccuracyofGaussianNBinirisdatatest:0.9466666666666667代码4中,先导入sklearn中的朴素贝叶斯相关模块,导入鸢尾花数据集,进行训练测试划分。然后创建高斯朴素贝叶斯模型实例,基于训练集进行拟合并预测测试集,最终准确率为0.947。贝叶斯网络原理及贝叶斯网络的推导朴素贝叶斯最大的特点是特征的条件独立性假设,但在现实中,条件独立性的假设通常过于严格,在实践中难以成立。特征之间的相关性限制了朴素贝叶斯的性能,因此本节我们将继续介绍一种放宽条件独立性假设的贝叶斯算法,即贝叶斯网络。我们先用一个例子来介绍一下。假设我们需要根据头像的真实性、粉丝数、动态更新频率来判断一个微博账号是否为真实账号。各个特征属性之间的关系如图3所示。图3微博账号属性关系图3是一个有向无环图(DAG),每个节点代表一个特征或随机变量,特征之间的关系用箭头表示,例如动态更新频率,关注人数,以及头像的真实性都会影响一个微博账号的真实性,而头像的真实性对粉丝数有一定的影响。但是仅仅特征之间的关系对于贝叶斯分析是不够的。此外,贝叶斯网络中的每个节点都有一个对应的概率表。假设账户是否真实和头像是否真实有如下概率表:图4贝叶斯网络概率表图4是反映头像和账户是否真实的概率表。第一个概率表表示账户是否真实,因为该节点没有父节点,所以可以直接用先验概率表示,表示账户是否真实的概率。第二张概率表显示了账户真实性对头像真实性的条件概率。例如,在头像为真实头像的情况下,账号为真实的概率为0.88。有了DAG和概率表之后,我们就可以用贝叶斯公式进行定量因果推理了。假设我们知道一个微博账号使用的是假头像,那么它的账号是假账号的概率可以推导出为:利用贝叶斯公式,我们知道在这种情况下,它的账号是假账号的概率是0.345的假头像。通过上面的例子,我们可以直观的感受到贝叶斯网络的用法。贝叶斯网络通常由有向无环图和节点对应的概率表组成。其中,DAG由节点(nodes)和有向边(edges)组成。节点表示特征属性或随机变量,有向边表示变量之间的依赖关系。贝叶斯网络的一个重要性质是,当一个节点的父节点的概率分布确定时,节点条件独立于其所有非直接父节点。这个性质方便我们计算变量之间的联合概率分布。一般来说,多变量相关随机变量的联合概率分布计算公式如下:具有节点条件独立性后,上式可以简化为:当DAG表示的节点关系和概率表确定后,相关的先验概率分布,可以确定条件概率分布,然后根据贝叶斯公式,我们可以使用贝叶斯网络进行推理。贝叶斯网络借助pgmpy的实现本节使用pgmpy构建贝叶斯网络并进行建模训练。pgmpy是一个基于Python的概率图模型包,主要包括贝叶斯网络、马尔可夫蒙特卡洛等常见概率图模型的实现和推理方法。我们以学生获得的推荐信质量为例构建贝叶斯网络。相关特征之间的DAG和概率表如图5所示。图5DAG和推荐信质量概率表从图5可以看出,考试的难易程度和你聪明与否,都会影响你的个人成绩。另外,个人天赋的高低也会影响你的SAT成绩,个人表现的好坏会直接影响你的推荐信。的质量。我们直接用pgmpy实现上面的贝叶斯网络模型吧。(1)构建模型框架,明确变量之间的关系。如代码5.#导入pgmpy相关模块frompgmpy.factors.discreteimportTabularCPDfrompgmpy.modelsimportBayesianModeletter_model=BayesianModel([('D','G'),('I','G'),('G','L'),('I','S')])(2)构造每个节点的条件概率分布,需要指定相关参数和传入概率表,如代码6所示。#学生成绩条件概率分布grade_cpd=TabularCPD(variable='G',#节点名称variable_card=3,#节点取值个数values=[[0.3,0.05,0.9,0.5],#节点的概率表[0.4,0.25,0.08,0.3],[0.3,0.7,0.02,0.2]],evidence=['I','D'],#节点的依赖节点evidence_card=[2,2]#依赖节点获取编号ofvalues)#考试难度的条件概率分布difficulty_cpd=TabularCPD(variable='D',variable_card=2,values=[[0.6],[0.4]])#个人天赋的条件概率分布intel_cpd=TabularCPD(variable='i',variable_card=2,values=[[0.7],[0.3]])#推荐信质量的条件概率分布letter_cpd=TabularCPD(variable='L',variable_card=2,values=[[0.1,0.4,0.99],[0.9,0.6,0.01]],evidence=['G'],evidence_card=[3])#SAT考试成绩条件概率分布sat_cpd=TabularCPD(variable='S',variable_card=2,values=[[0.95,0.2],[0.05,0.8]],evidence=['I'],evidence_card=[2])(3)添加每个节点模型构建贝叶斯网络。如代码7所示。#将每个节点添加到模型中构建贝叶斯网络good而且考试不难,推断学生推荐信的质量prob_G=letter_infer.query(variables=['G'],evidence={'I':1,'D':0})print(prob_G)输出如图6所示。从图6的输出可以看出,当聪明的学生遇到比较容易的考试时,获得一等成绩的概率高达90%。总结贝叶斯定理是经典的概率模型之一。基于先验信息和数据观察得到目标变量的后验分布的方法是贝叶斯的核心理论。贝叶斯理论在机器学习领域也有广泛的应用。最常用的贝叶斯机器学习模型包括朴素贝叶斯模型和贝叶斯网络模型。朴素贝叶斯模型是一种生成式学习方法,通过从数据中学习联合概率分布来计算后验概率分布。之所以命名为朴素贝叶斯,是因为特征的条件独立假设可以大大简化朴素贝叶斯算法的学习和预测过程,但同时也会带来一定的精度损失。此外,放宽了朴素贝叶斯的条件独立性假设,认为特征间相关的贝叶斯模型就是贝叶斯网络模型。贝叶斯网络是一种概率无向图模型,它通过有向图和概率表来构建贝叶斯概率模型。当有向图和概率表表示的节点关系确定后,就可以确定相关的先验概率分布和条件概率分布,然后根据贝叶斯公式,利用贝叶斯网络进行概率推理。本文参考代码地址:https://github.com/luwill/Machine_Learning_Code_Implementation/tree/master/charpter21_Bayesian_models