朴素贝叶斯实战:人群收入预测(基于美国人口普查收入数据)

  • 实战背景
  • 数据信息
  • 流程
  • 开始编码
    • 导入需要用到的类和方法
    • 数据加载与处理
    • 对样本特征值进行编码
    • 模型的创建与训练
    • 评判模型
    • 使用模型预测新数据
      • 对新数据特征值进行编码
      • 使用编码后的特征值进行预测
  • 编码器LabelEncoder小结

实战背景

根据一个人的14个属性建立分类器评估一个人的收入等级。

可能的输出类型是“高于50K”和“低 于或等于50K”。

数据信息

数据来源:

美国人口普查收入数据集中的数据: https://archive.ics.uci.edu/ml/datasets/Census+Income

数据标题:

(下载的数据中没有标题,标题可有可无)

'age', 'workclass', 'fnlwgt', 'education', 'education_num',
'marital_status', 'occupation', 'relationship', 'race', 'gender',
'capital_gain', 'capital_loss', 'hours_per_week', 'native_country',
'income_bracket'

数据格式:

流程

因为数据中的特征值包含字符型数据,所以需要对数据进行编码

sklearn.preprocessing.LabelEncoder 类可以在不损失数据的情况下对数据进行编码和解码

因为数据集中收入在 50k 以上 和 50k以下 的样本数量相差较大,会使模型偏向于样本数较多的类型,所以我们需要提取出相同数量的两种类型的样本

流程大致如下:

  • 数据加载与处理
  • 创建模型
  • 训练模型
  • 评判模型
  • 使用模型预测新数据

开始编码

导入需要用到的类和方法

# 用于编码的类
from sklearn.preprocessing import LabelEncoder# 朴素贝叶斯类
from sklearn.naive_bayes import GaussianNB# 交叉验证方法
from sklearn.model_selection import cross_val_scoreimport numpy as np

数据加载与处理

less_than_50k = []
more_than_50k = []# 记录一下含有空缺值的数据
blank_value = 0with open('adult.data.txt', 'r') as f:for line in f.readlines():# 若某行数据有缺失值,则舍弃掉这条数据if ' ?' in line:blank_value += 1continue# data 是一行的数据,每一行的最后一个是 \n 换行符,所以是 line[:-1],表示不处理换行符# 注意这里分隔符是 英文逗号加一个空格,建议直接在文件中复制data = line[:-1].split(', ')if data[-1] == '<=50K':less_than_50k.append(data)# 注意这里不能使用 else ,因为文件末尾有几行没有数据elif data[-1] == '>50K':more_than_50k.append(data)

我们可以查看下含有空缺值的样本数,两种收入类型的样本数

less_than_50k_length = len(less_than_50k)
more_than_50k_length = len(more_than_50k)print(less_than_50k_length)  # 22654
print(more_than_50k_length)  # 7508
print(blank_value)  # 2399

因为数据集中收入在 50k 以上 和 50k以下 的样本数量相差较大,会使模型偏向于样本数较多的类型,所以我们需要提取出相同数量的两种类型的样本

# 比较大于50k和不大于50k的数据量,从两个类别的数据中提取出相同数据量
if less_than_50k_length == more_than_50k_length:pass
elif less_than_50k_length > more_than_50k_length:less_than_50k = less_than_50k[:more_than_50k_length]
else:more_than_50k = more_than_50k[:less_than_50k_length]

我们使用的python的list保存的数据,训练模型需要使用 numpy 的 二维数组

所以,我们需要转换下数据类型

先分别将收入在50k以下和50k以上的列表转换为两个 numpy 的二维数组

# 先将两个list转换为 numpy的二维数组,再使用np.vstack将两个二维数组合并为一个大的二维数组
less_ndarray = np.array(less_than_50k)
more_ndarray = np.array(more_than_50k)

再将两个 numpy 的二维数组合并为一个大的二维数组

# 将两个二维数组合并为一个大的二维数组
data = np.vstack([less_ndarray, more_ndarray])

如果你分不清 np.hstack 和 np.vstack ,可以查看下合并后的数据的形状

# 查看合并和的二维数组的形状,检验是否合并成功
print(data.shape)
# (15016, 15)

对样本特征值进行编码

因为有多个列的数据是非数字型的,预测数据所属类型时也需要对特征值进行编码,所以为了后面对预测样本数据编码方便,我们创建一个列表,用于存放所有非数字列的编码器,当对预测样本特征值编码时,直接使用该列对应的编码器进行编码

编码器和用于预测的模型一样,也是需要训练的

例如使用“workclass”列的数据训练出来的编码器,当接受到其他列的数据时,就会编码失败

所以我们使用一个列表存放所有的非数字列的编码器

当对预测样本特征值编码时,直接使用该列对应的编码器进行编码

# 标签编码器列表
label_encoder = []# 存放编码后的数据,先指定为空的二维数组,再进行赋值
data_encoder = np.empty(data.shape)# index是data每一个元素的下标,item是data每一个元素的内容
for index, item in enumerate(data[0]):# 若该列数据是是数字,直接赋值,否则先进行编码if item.isdigit():data_encoder[:, index] = data[:, index]else:# 对于每一个非数字的列,分别创建一个标签编码器,便于后期用来预测样本# 每一个标签编码器分别使用各自列的数据进行编码,这样预测数据时可以不用再训练标签分类器,直接对需要预测的样本数据进行编码label_encoder.append(LabelEncoder())data_encoder[:, index] = label_encoder[-1].fit_transform(data[:, index])

合并后的大的二维数组包含了样本的特征数据和标签

将样本的特征数据和标签值分开(标签值是二维数组的最后一列)

分开特征值和标签时,将数据格式转换为int型

X_train = data_encoder[:, :-1].astype(int)
y_train = data_encoder[:, -1].astype(int)

模型的创建与训练

# 创建朴素贝叶斯分类器
gnb_clf = GaussianNB()
# 使用样本数据训练朴素贝叶斯模型
gnb_clf.fit(X_train, y_train)

评判模型

交叉验证返回的是一个 numpy 的一维数组

包含了每一组交叉验证测试的评分,这里我们直接查看各组评分的平均值

cv = 10 表示交叉验证将数据分为10组

# 使用交叉验证对模型进行评判
scores = cross_val_score(gnb_clf, X_train, y_train, cv=10)print(f"交叉验证得分:{round(np.mean(scores), 3)}")
# 交叉验证得分:0.627

使用模型预测新数据

对新数据特征值进行编码

# 创建一个新样本,使用训练好的模型对其进行预测,预测该样本的收入类别
input_data = ['39', 'State-gov', '77516', 'Bachelors', '13', 'Never-married', 'Adm-clerical', 'Not-in-family', 'White','Male', '2174', '0', '40', 'United-States']# 先初始化一个列表,用于存放新样本数据编码后的结果
input_data_encoder = [-1] * len(input_data)# 对新样本的数据进行编码# count表示新样本数据中非数字的列的顺序
# 在上面我们有一个训练好的编码器列表,通过count使用非数值的列对应的编码器对新样本数据进行编码
count = 0
for index, item in enumerate(input_data):if item.isdigit():input_data_encoder[index] = int(item)else:# tranform()对数据进行编码,参数是一个 numpy 的 ndarray,所以需要使用 np.array() 构建一个ndarraytemp = label_encoder[count].transform(np.array([item]))input_data_encoder[index] = int(temp)count += 1# 查看一下编码后的样本数据
print(input_data_encoder)
# [39, 5, 77516, 9, 13, 4, 0, 1, 4, 1, 2174, 0, 40, 37]print(type(input_data_encoder))
# <class 'list'>

使用编码后的特征值进行预测

对新样本进行预测
需要注意,predict 的参数是编码后的数据
predict 的参数是一个 numpy 的二维数组,所以需要使用 reshape() 将其转换为二维数组

y_predict = gnb_clf.predict(np.array([input_data_encoder]).reshape(1,-1))

reshape(1,-1) 表示只有一个样本
reshape(-1,1) 表示样本只有一个特征值

y_predict 是经过编码后的数据,需要使用编码器解码
inverse_transform() 将编码后的数据进行解码,返回的是一个一维数组

print(label_encoder[-1].inverse_transform(y_predict)[0])# <=50K

编码器LabelEncoder小结

编码器和用于预测的模型一样,也是需要训练的

导入用于编码的类

from sklearn.preprocessing import LabelEncoder

创建编码器类的对象

label = LabelEncoder()

训练编码器并将数据进行编码

label.fit_transform(X_data)

训练编码器

label.fit(X_data)

对数据进行编码

label.transform(X_data)

查看编码前的原始数据

inverse_transform(X_encoder)

由此可见:

label.fit_transform(X_data) = label.fit(X_data) + label.transform(X_data)

朴素贝叶斯实战:人群收入预测(基于美国人口普查收入数据)相关推荐

  1. 基于scikit-learn的朴素贝叶斯实战

    写在前面 学完了朴素贝叶斯的基本原理(机器学习算法总结之朴素贝叶斯法),现在利用sklearn平台的朴素贝叶斯类库来实战一下,加深印象. 1.sklearn中朴素贝叶斯(NB)简介 相比于前面的决策树 ...

  2. 朴素贝叶斯实战应用---单词拼写检查器(结合html直观展示)

    博文写于2020-05-10,于2020-07-07再次编辑 1.一个小小的引子: 写这篇博文的时候,日子有点特殊,啥日子大家应该都知道.用一篇某高二学生母亲节的英语作文,先祝天下所有母亲身体健康,母 ...

  3. 朴素贝叶斯--实战分析

    概率论及贝叶斯决策理论的一些知识请参阅相关书籍和博客 https://blog.csdn.net/amds123/article/details/70173402 这里给出源码及解析. 1. 使用py ...

  4. Python3《机器学习实战》学习笔记(五):朴素贝叶斯实战篇之新浪新闻分类

    转载请注明作者和出处:http://blog.csdn.net/c406495762 Github代码获取:https://github.com/Jack-Cherish/Machine-Learni ...

  5. 朴素贝叶斯实战——判断肿瘤是良性还是恶性

    1.接下来我们将使用朴素贝叶斯算法来进行一个小的项目实战--判断一个患者的肿瘤是良性还是恶性.这里我们将使用一个来自真实世界的数据集--威斯康星乳腺肿瘤数据集. 2.对数据集进行分析: 威斯康星乳腺肿 ...

  6. 朴素贝叶斯实战(Python屏蔽留言板的侮辱性言论)

    项目概述 构建一个快速过滤器来屏蔽留言板上的侮辱性言论.如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当.对此问题建立两个类别: 侮辱类和非侮辱类,使用 1 和 0 分别表示. 准 ...

  7. NLP系列(4)_朴素贝叶斯实战与进阶

    作者: 寒小阳 && 龙心尘 时间:2016年2月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/50629608 htt ...

  8. 朴素贝叶斯进行新闻主题分类,有代码和数据,可以跑通

    folder_path = '/Users/apple/Documents/七月在线/NLP/第2课/Lecture_2/Naive-Bayes-Text-Classifier/Database/So ...

  9. 机器学习实战(四)——基于概率论的分类方法:朴素贝叶斯

    朴素贝叶斯法 4.1 基于贝叶斯决策理论的分类方法 4.1.1 贝叶斯决策理论 4.1.2 条件概率 4.1.3 全概率公式 4.1.4 贝叶斯推断 4.1.5 朴素贝叶斯 4.2 使用朴素贝叶斯进行 ...

  10. 【白话机器学习】算法理论+实战之朴素贝叶斯

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

最新文章

  1. 国庆假期,推荐一款假日必备的看片神器!
  2. x shell 配置 和相关注意点(vm相关注意点)
  3. C-Lodop回调函数的触发
  4. zabbixdocker里的mysql_基于Docker安装与部署Zabbix
  5. 消息中间件学习总结(22)——MQ 面试专题
  6. MarkdownPad2
  7. 一道学吧上的题目,python3 - 解决高中的古典概率问题: 有A、B两个袋子。A袋中装有4个白球、2个黑球,B袋中装有3个白球、4个黑球。从A、B两个袋子中
  8. python自动下载酷狗音乐_python获取酷狗音乐top500的下载地址 MP3格式
  9. wacom linux 驱动下载,Ubuntu 8.04如何安装WACOM驱动
  10. 玉溪第一座智能变电站,造国际一流智能配电网,机器人来运维
  11. 企业微信和个人微信优劣势是什么?如何实现站外引流到微信?
  12. 6410 UBOOT 支持SD/SDHC卡启动 FAT32文件系统 yaffs2烧录 图片显示烧录状态
  13. 高斯定理在神经网络上的投影
  14. 有一根27厘米的细木杆java_百度笔试题 蚂蚁爬杆
  15. 一个人的心态好比琴弦
  16. 3ds Max 2014 SDK配置开发环境以及遇到的问题
  17. 一个由SEO优化展开的meta标签大讲解
  18. 计算机组成原理-入门篇-01冯·诺依曼体系结构
  19. 春节短视频暗战,微视后发制人
  20. compare()方法+使用compare方法

热门文章

  1. 【2022年度总结2023新年Flag】--2022:高考失利,我奋力奔跑的大一上;2023,朝着成为更优秀的自己迈进ing
  2. oracle数据库中TDS,某高校开发了一个学生信息管理系统TDS,里面使用了Oracle数据库。则TDS被称为...
  3. ijkPlayer点播/直播/VR视频播放器(解码器)研究(2)-Android
  4. 33-Jenkins-修改插件源
  5. COOC+VOSviewer可取代任何文献计量与知识图谱软件
  6. java如何使用barcode4j生成条形码_JAVA条形码生成组件barcode4j使用
  7. android ota升级服务,android OTA 升级包含增量升级
  8. 1026 程序运行时间
  9. 基于PGC相位生成载波调制及其解调算法实例分析
  10. 三代测序数据自纠错技术 和 二代测序数据对三代测序数据纠错的技术。