1. Introduction

本文基于前文说的朴素贝叶斯原理,参考圣地亚哥州立大学的实验编写了一个简单的朴素贝叶斯分类器,并利用测试数据进行了测试。

项目地址:

2. 分类器编写

2.1数据说明

采用“adult”数据集,输入文件是adult.data,测试文件是adult.test。数据中一行为一个条目,表示一个人

数据集中的变量

变量名

意义

age

年龄

type_employer

职业类型,个体,政府等等

fnlwgt

该变量将被我们忽略

education

学历

education_num

学历的数字等级(和上一个一样,将被忽略)

marital

婚姻状况

occupation

职业

relationship

不清楚如何表述

race

人种

sex

生理性别

capital_gain

资本收益

capital_loss

资本支出

hr_per_week

每周工作时长

country

国籍

income

年收入是否>50k

由于参考文章中使用的是R语言进行处理,R语言在数据挖掘和统计上优势极大,几乎就是为其而生。python中也有numpy库,但是这里仅用了numpy库的median取中位数功能,其他还是以python原生类型来处理。

2.2 框架规划

参考使用Python编写朴素贝叶斯分类器,我们也主要使用字典来实现统计,但是可以分成两个字典,一个是>50k的dataset_high,一个是<=50k的dataset_low。

class DataSet:

def __init__(self):

# 存储读入的原始数据

self.data = []

# 支出的中位数

self.loss_mid = 0

# 收入的中位数

self.gain_mid = 0

# 工作时长的中位数

self.hours_mid = 0

# 年龄的中位数

self.age_mid = 0

# 统计的数据,主要部分

self.classfied_dataset = None

# 总数据条目

self.len_data = 0

最后的计算是前文说的:

输入数据的特征年龄职业类型国籍输入数据的特征输入数据的特征年龄职业类型国籍输入数据的特征

最后两者取大者,则就是所建模型的判定,是否大于50k。

公式化简:

由于P(输入数据的特征)对于一条数据,两个公式来说,是相同的,所以略去计算。

2.3 输入数据预处理

a = ["age", "type_employer", "fnlwgt", "education", "education_num", "marital", "occupation", "relationship", "race",

"sex", "capital_gain", "capital_loss", "hr_per_week", "country", "income"]

classfiled_data = {}

loss_median = loss

gain_median = gain

for node in a:

classfiled_data[node] = {}

for line in data:

if len(line) < 10:

continue

for node in a:

if line[a.index(node)] in classfiled_data[node]:

classfiled_data[node][line[a.index(node)]] += 1

else:

classfiled_data[node][line[a.index(node)]] = 1

列表a就是所有的字段,将所有的数据都按照对应字段,统计到classfiled_data上去,最后形成的形式如下:

# 打印classfiled_data的输出,这是已经简化过的输出

,

marital:

{'Widowed': 908, 'Never-married': 10192, 'not-married': 5323, 'Married': 8297},

country:

{'other': 133, 'United-States': 21999, 'British-Commonwealth': 230, 'SE-Asia': 242, 'Euro_1': 159, 'Euro_2': 122, '?': 437, 'South': 64, 'China': 100, 'Latin-America': 1027, 'South-America': 207},

income:

{'<=50K': 24720},

capital_gain:

{'low': 0, 'none': 23685, 'high': 1035},

relationship:

{'Not-in-family': 7449, 'Own-child': 5001, 'Other-relative': 944, 'Husband': 7275, 'Wife': 823, 'Unmarried': 3228},}

即classfiled_data的第一层字段是a里面的字段,每个字段又对应不同类型的子字段,数字是统计所有数据的出现次数。

2.4 字段简化

舍弃没用的fnlwgt和重复的education_num字段

对于职业类型字段,Never-worked和without-Pay可以合并为Not-working字段,类似的,也可以把其他一些字段进行合并,合并的步骤是先在classfiled_data['type_employer']里新建一个'not-working'的key,然后其value就是原来['Never-worked', 'Without-pay']的数值之和。在写了很长的代码以后,我将其提取出来做成了一个函数:

def tiny(a_list, category, new_name):

if new_name not in classfiled_data[category]:

classfiled_data[category][new_name] = 0

for key in list(classfiled_data[category]):

if key in a_list and key != new_name:

classfiled_data[category][new_name] += classfiled_data[category][key]

del classfiled_data[category][key]

tiny(['Never-worked', 'Without-pay'], 'type_employer', 'not-working')

tiny(['Local-gov', 'State-gov'], 'type_employer', 'other-govt')

tiny(['Self-emp-inc', 'Self-emp-not-inc'], 'type_employer', 'self-employed')

同样对其他字段也进行了类似的化简。

这里有这样几个字段需要单独处理:

capital_gain 利用中位数划分成三部分:(-INF, 0] (0, mid] (mid, INF]

capital_loss 同上

hr_per_week 工作时间按照10小时间隔划分了。最大值99,映射到100s上

age 按照5为间隔划分了20组,

3. 测试数据

由于前面对数据进行了化简,所以测试数据的输入也需要按照上面的划分进行映射,我代码里直接使用生成好的字典进行映射。

针对每条数据,计算P(输入数据的特征|>50k) 和P(输入数据的特征|<=50k),取大的返回结果。

最后测试结果如下:

模型的判断正确的次数: 13206

错误的次数3075

正确率: 0.811130

贝叶斯分类python代码调试_数据挖掘实验2python编写贝叶斯分类器 – FindSpace相关推荐

  1. 转:Python 代码调试技巧

    Python 代码调试技巧 转载于:https://www.cnblogs.com/kira2will/p/4254754.html

  2. 【QA】Python代码调试之解决Segmentation fault (core dumped)问题

    Python代码调试之解决Segmentation fault 问题 问题描述 排查过程 1. 定位错误, 2. 解决办法 参考资料 问题描述 Python3执行某一个程序时,报Segmentatio ...

  3. python代码调试中间变量_Python代码调试的那些“最少且必要”技巧

    原标题:Python代码调试的那些"最少且必要"技巧 异常处理模块能帮助我们在运行期间处理异常信息,但Python代码还有更为基础的错误--语法错误和逻辑错误. 语法错误相对简单, ...

  4. python多进程调试_使用pyrasite进行python进程调试,改变运行中进程的代码

    后端开发中有时会遇到这种情况:进程运行中偶现,重启进程问题就消失:或者是,进程一定要运行一段时间才会出现问题:又或是,极难复现的问题出现了,然而已有的log不足以定位 对于这些情况,尽管大部分时候,我 ...

  5. Python 代码调试二三事

    ♚ 作者王维栋,网易游戏运维与基础架构部,产品软件设计师,专注于智能监控.性能优化等领域. 本文来自<网易游戏运维平台 (neteasegameops)>微信公众号的投稿,隶属于网易游戏运 ...

  6. ruby 代码调试_用撬调试Ruby代码

    ruby 代码调试 Your comprehensive guide to Pry and how to use it . 有关Pry及其使用方法的综合指南. Every programmer has ...

  7. Python代码调试方法

    对于每个程序开发者来说,调试几乎是必备技能.常用Pycharm编辑器里的方法有Print大法.log大法,但缺少类似Matlab的变量区,给代码调试带来不便,特别是在有函数的情况下,变量无法实时查看. ...

  8. python代码调试快捷键_6. Pycharm的传参、快捷键、执行代码、调试模式

    1.通过pycharm给python程序传递参数 脚本传入的参数.多个参数这个大家都比较熟悉,就不多说了 Pycharm如何传入参数? 先来认识python的参数: sys.argv[0]脚本本身 s ...

  9. python断点调试_「Python调试器」,快速定位各种疑难杂症!!!

    在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲 ...

最新文章

  1. OpenCV使用MSER检测末端区域的实例(附完整代码)
  2. SCM-SVN集成服务器
  3. 获取日志的等级_进阶之路:Java 日志框架全画传(中)
  4. 【恋上数据结构】复杂度知识以及LeetCode刷题指南
  5. 百度“追杀”66天后,景驰CEO王劲离职,原CTO韩旭接任
  6. 春运期间长江海事局开辟四类运输“绿色通道”
  7. Nginx 限制并发连接数。
  8. c语言秒表编程示例,求大神帮忙写一篇简单的C语言秒表程序, 谢谢。
  9. 欧姆龙PLC以太网modbusTCP通讯
  10. 显示器测试软件 绿色,DisPlayX-显示器测试工具
  11. 计算机论文2002,自动化仪表杂志|论文|流速仪信号计算机采集系统的设计2002年9月(2)...
  12. php微信开发之微信卡券
  13. 盘点员工工作效率低的8大原因
  14. 自然码双拼 使用总结
  15. VMware设置静态IP
  16. Apple ASA归因技术支持
  17. Unreal - Environment Query System(EQS)
  18. Linux--内核版本和发行版本
  19. (转载)基于LBS地图的开发,满足地图上有头像的需求
  20. Excel表格之——某一列生成UUID

热门文章

  1. 链表中是否存在环的问题,及环入口在链表中位置(Linked List Cycle II)
  2. mac os mojave也没有增加简体拼音的专用词汇
  3. MyEclipse_15字体设置
  4. [解决]Win7 操作系统不能安装VMware
  5. Android Relativelayout
  6. Delphi连接AutoCAD_计算任意线条的长度宏的嵌套
  7. Windows Server 2008 的十四大最新功能特性技术总结
  8. 关于B.M.W的最原始的说明
  9. 订餐系统之同步饿了么商家订单
  10. Namespace declaration statement has to be the very first statement in the script