本文是个人学习笔记,该篇主要学习朴素贝叶斯算法概念,并应用sklearn.naive_bayes算法包解决Kaggle入门级Digit Recognizer。

  • 贝叶斯定理
  • 朴素贝叶斯
  • Python 代码

贝叶斯定理

对于贝叶斯定理的了解和学习大部分都是从概率论开始的,但实际贝叶斯定理应用范围极其广泛,在我们学习贝叶斯定理在算法中的应用前,在复习下其基本概念。

贝叶斯公式:

P(A,B)=P(A)∗P(B|A)=P(B)∗P(A|B)

P(A,B) =P(A)*P(B|A)=P(B)*P(A|B)

简单转换后,即可得到:

P(A|B)=P(A)∗P(B|A)/P(B)

P(A|B)=P(A)*P(B|A)/P(B)

应用到分类算法中时:这里可以认为A为类别B为特征

P(A|B)是已知B发生后A的条件概率,也称作A的后验概率(根据样本分布和未知参数的先验概率分布求得的条件概率分布)。

P(A)是A的先验概率或边缘概率(基于主观判断而非样本分布的概率分布),称作”先验”是因为它不考虑B因素。

P(B|A)是已知A发生后B的条件概率,也称作B的后验概率,这里称作似然度

P(B)是B的先验概率或边缘概率,这里称作标准化常量

P(B|A)/P(B)称作标准似然度

朴素贝叶斯

当然,实际分类问题往往都是多类别多特征的判断,则贝叶斯公式将转化为如下: 类别AiA_i,特征 B1,...BnB_1,...B_n

P(Ai|B1,...,Bn)=P(Ai)∗P(B1,...,Bn|Ai)P(B1,...,Bn)=P(Ai)∗P(B1|Ai)∗P(B2,...,Bn|AiB1)P(B1,...,Bn)=...=P(Ai)∗P(B1|Ai)∗P(B2|AiB1)∗...∗P(Bn|AiB1...Bn−1)P(B1,...,Bn)

P(A_i|B_1,...,B_n)=\frac{P(A_i)*P(B_1,...,B_n|A_i)}{P(B_1,...,B_n)} =\frac{P(A_i)*P(B_1|A_i)*P(B_2,...,B_n|A_iB_1)}{P(B_1,...,B_n)}=...=\frac{P(A_i)*P(B_1|A_i)*P(B_2|A_iB_1)*...*P(B_n|A_iB_1...B_{n-1})}{P(B_1,...,B_n)}

从公式上不难发现存在许多的似然值,相互关系复杂计算量大。为了解决该问题且简化计算,就衍生了朴素贝叶斯假设:特征之间相互独立。虽然该假设看上去与实际符合度低,但经过大量实践证明其应用效果其实相当出色。

基于朴素贝叶斯假设,公式将可以简化为:

P(Ai|B1,...,Bn)=P(B1|Ai)∗P(B2|Ai)...P(Bn|Ai)P(B1,...,Bn)

P(A_i|B_1,...,B_n)=\frac{P(B_1|A_i)*P(B_2|A_i)...P(B_n|A_i)}{P(B_1,...,B_n)}

朴素贝叶斯的分类原理就是根据新样本的特征计算分别其在各类的别概率大小,选取概率最大的类别为其最终类别。因为每个类别计算的分母都是相同的,所以实际可以省略分母的概率计算。

朴素贝叶斯的流程可以通过下图表示:

总体上,朴素贝叶斯分类实现经历三个阶段

第一阶段——准备工作阶段,根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对部分待分类项进行分类,形成训练样本集。这一阶段的输入是待分类数据,输出是特征属性和训练样本。分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

第二阶段——分类器训练阶段,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。

其中需要注意的是,计算条件概率是非常重要的阶段,当特征属性为离散值时,只要统计训练样本中各个划分在每个类别中出现的频率即可进行推算, 而当特征属性为连续值时,通常假定其值服从高斯分布。
另外,为了避免条件概率为0的情况(某个类别下某个特征项划分没有出现),在这里引入了Laplace校准,即对没类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的情况。

第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。


Python 代码

Python的sklearn中有已集成的朴素贝叶斯算法包naive_bayes,根据特征值的分布可以选择对应的分类计算方法(MultinomialNB,GaussianNB等)

import pandas as pd
import numpy as np
import time
from sklearn import naive_bayesdef data_load():# 利用pandas读取csv文件内容train_ttl=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\train.csv')train_label=pd.DataFrame(train_ttl['label'])train_data=pd.DataFrame(train_ttl.ix[:,1:])test_data=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\test.csv')# dataframe归整化test_data[test_data!=0]=1# train_data[train_data!=0]=1m,n=train_data.shape#这里似乎因为dataframe太大,用bool判断更改时总会异常跳出,所以选择循环更改for i in range(m):for j in range(n):if train_data.ix[i,j]!=0:train_data.ix[i,j]=1return train_data,train_label,test_data#利用Python Sklearn包,进行test样本集分类判别
def bayes_classify(traindata,trainlabel,testdata):bayes_clf = naive_bayes.MultinomialNB()#设置函数和参数bayes_clf.fit(traindata,trainlabel.values.ravel())#训练Train样本bayes_result=bayes_clf.predict(testdata)#预测Test样本return bayes_resultif __name__=='__main__':start = time.clock()traindata,trainlabel,testdata=data_load()#加载raw datam,n=testdata.shaperesult_labels=bayes_classify(traindata,trainlabel,testdata)#将结果转化成Dataframe结构result={}ImageId=np.arange(m)+1result['Label']=result_labelsresult_frame=pd.DataFrame(result,index=ImageId)#导出结果result_frame.to_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\result_bayes.csv')end = time.clock()print('总耗时:', (end - start)/3600.0)#接近1.6小时,效果不理想只有0.81

学习笔记——Kaggle_Digit Recognizer (朴素贝叶斯 Python实现)相关推荐

  1. 人工智障学习笔记——机器学习(5)朴素贝叶斯

    一.概念 1.1贝叶斯定理:假设H[1],H[2]-,H[n]互斥且构成一个完全事件,已知它们的概率P(H[i]),i=1,2,-,n,现观察到某事件A与H[1],H[2]-,H[n]相伴随机出现,且 ...

  2. sklearn学习笔记5:朴素贝叶斯

    sklearn为我们提供了四个朴素贝叶斯的分类器 naive_bayes.BernoulliNB:伯努利分布下的朴素贝叶斯 naive_bayes.GaussianNB:高斯分布下的朴素贝叶斯 nai ...

  3. 学习笔记——Kaggle_Digit Recognizer (Random Forest算法 Python实现)

    本文是个人学习笔记,该篇主要学习随机森林算法概念,并应用sklearn.ensemble.RandomForestClassifier算法包解决Kaggle入门级Digit Recognizer. 随 ...

  4. python程序员买西瓜代码_朴素贝叶斯python代码实现(西瓜书)

    本文将要为您介绍的是朴素贝叶斯python代码实现(西瓜书),具体完成步骤:朴素贝叶斯python代码实现(西瓜书) 摘要: 朴素贝叶斯也是机器学习中一种非常常见的分类方法,对于二分类问题,并且数据集 ...

  5. 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析

    基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...

  6. 【机器学习算法笔记系列】朴素贝叶斯(NB)算法详解和实战

    朴素贝叶斯(NB)算法概述 朴素贝叶斯(Naïve Bayes, NB)算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法.朴素:特征条件独立:贝叶斯:基于贝叶斯定理.属于监督学习的生成模型,实现 ...

  7. 数据挖掘十大算法(九):朴素贝叶斯 python和sklearn实现

    第三个算法终于算是稍有了解了,其实当你结合数据了解了它的实现原理后,你会发现确实很朴素.这里对朴素贝叶斯算法做一个介绍和总结,包括(原理.一个代码示例.sklearn实现),皆为亲自实践后的感悟,下面 ...

  8. 朴素贝叶斯python代码_朴素贝叶斯模型及python实现

    1 朴素贝叶斯模型 朴素贝叶斯法是基于贝叶斯定理.特征条件独立假设的分类方法.在预测时,对输入x,找出对应后验概率最大的 y 作为预测. NB模型: 输入: 先验概率分布:P(Y=ck),k=1,2, ...

  9. 朴素贝叶斯 python 实现

    百度文库 文库2 机器学习实战的朴素贝叶斯的代码太复杂 """ Created on Thu Aug 10 15:08:59 2017@author: luogan &q ...

最新文章

  1. leetcode 82. 删除排序链表中的重复元素 II
  2. Oracle 应用归档 卡死,关于Oracle归档进程的运行机制
  3. 给定年月日计算是一年的第几天
  4. kafka--Struct Streaming--hdfs案例
  5. 学习MyBatis之简单入门HelloWorld
  6. Clickhouse:分区和数值化优化实测
  7. php 连接 sybase,thinkphp连接sybase数据库
  8. lisp 读取样条曲线座标点_autolisp绘制样条曲线
  9. 谷歌翻译失效,解决网页谷歌翻译的问题-只能解决页面翻译
  10. 现代企业管理的12个指南针
  11. MSDC 4.3 接口规范(11)
  12. Mac下挂载NTFS硬盘
  13. 一张显卡卖5-6万?Tesla计算卡你凭什么这么贵!
  14. 垃圾邮件过滤优化方法
  15. java打字小游戏源码_求JAVA编写打字游戏源代码!
  16. copy-to-clipboard 的拷贝使用
  17. 谷歌三篇重要论文读后感
  18. 实木地板被机器人弄成坑_钱花光哭成泪人,28个让人撕心裂肺装修坑,不注意新房就会被毁!...
  19. 配置ST_Geometry查询
  20. objection 基础知识

热门文章

  1. mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法
  2. 简单易懂的汉明码(海明码)校验原理
  3. 【公平锁和非公平锁有什么区别?】
  4. Flink-----Flink CDC 实现数据实时同步
  5. ggplot2——图例篇
  6. 详解Bash命令行处理
  7. 王牌英雄(Awesomenauts)研究报告
  8. 什么是奇异值分解(SVD)?
  9. Linux流量监控工具 - iftop (最全面的iftop教程),查看服务器的网络情况
  10. matlab里surf函数,matlab surf 函数画3维图