机器学习技术(八)——朴素贝叶斯算法实操

2023-11-19

机器学习技术(八)——朴素贝叶斯算法实操

在这里插入图片描述

一、引言

上文讲述了逻辑回归在分类任务上的应用及算法原理:https://blog.csdn.net/tianhai12/article/details/132632208

本文着重实践,采用贝叶斯方法对大样本犯罪信息进行训练,得出关于特征的预测方法并与逻辑回归模型进行多维度的比较。关于算法原理参考西瓜书150-154页

二、导入相关依赖库

#导入相关依赖库
import pandas as pd
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import log_loss
from sklearn.naive_bayes import BernoulliNB
from sklearn.linear_model import LogisticRegression
import time

import warnings
warnings.filterwarnings('ignore')

三、读取并查看数据

将大样本犯罪数据读入,其中样本被分为训练集以及测试集。

数据集:https://download.csdn.net/download/tianhai12/88275733

输入:

#用pandas载入csv训练数据,并解析第一列为日期格式
train=pd.read_csv('ml/train.csv', parse_dates = ['Dates'])
test=pd.read_csv('ml/test.csv', parse_dates = ['Dates'])
train

部分训练集数据显示如下,每位用户共有9组特征。
在这里插入图片描述

四、数据预处理

我们将样本中犯罪类型进行编号,并选择其中的Dayofweek(星期几),PdDistrict(地区)以及Dates中的小时作为犯罪罪刑的预测的影响因素,建立新的数据集。

#用LabelEncoder对不同的犯罪类型编号
leCrime = preprocessing.LabelEncoder()
crime = leCrime.fit_transform(train.Category)

#因子化星期几,街区,小时等特征
days = pd.get_dummies(train.DayOfWeek)
district = pd.get_dummies(train.PdDistrict)
hour = train.Dates.dt.hour
hour = pd.get_dummies(hour) 

#组合特征
trainData = pd.concat([hour, days, district], axis=1)
trainData['crime']=crime

#对于测试数据做相同的处理
days = pd.get_dummies(test.DayOfWeek)
district = pd.get_dummies(test.PdDistrict)

hour = test.Dates.dt.hour
hour = pd.get_dummies(hour) 

testData = pd.concat([hour, days, district], axis=1)
trainData.head()

编码完成的数据前五个样本如下所示。
在这里插入图片描述

五、构建两种模型进行比较

1、只考虑Dayofweek以及District

首先我们先只考虑Dayofweek以及District两组特征,将数据集按照训练集以及测试集3:2的比例划分,在训练集上建立朴素贝叶斯模型,计算建模所需时间并输出,并在测试集上进行预测输出损失函数的log值;再在训练集上建立逻辑回归模型,计算建模所需时间并输出,并在测试集上进行预测输出损失函数的log值。

#只取星期几和街区作为分类器输入特征
features = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION',
 'NORTHERN', 'PARK', 'RICHMOND', 'SOUTHERN', 'TARAVAL', 'TENDERLOIN']

#分割训练集(3/5)和测试集(2/5)
training, validation = train_test_split(trainData, train_size=.60)

#朴素贝叶斯建模,计算log_loss
model = BernoulliNB()
nbStart = time.time()
model.fit(training[features], training['crime'])
nbCostTime = time.time() - nbStart
predicted = np.array(model.predict_proba(validation[features]))
print ("朴素贝叶斯建模耗时 %f 秒" %(nbCostTime))
print ("朴素贝叶斯log损失为 %f" %(log_loss(validation['crime'], predicted)))

#逻辑回归建模,计算log_loss
model = LogisticRegression(C=.01)
lrStart= time.time()
model.fit(training[features], training['crime'])
lrCostTime = time.time() - lrStart
predicted = np.array(model.predict_proba(validation[features]))
log_loss(validation['crime'], predicted)


print ("逻辑回归建模耗时 %f 秒" %(lrCostTime))
print ("逻辑回归log损失为 %f" %(log_loss(validation['crime'], predicted)))

输出结果如下,发现两个模型在测试集上损失函数log值差不多,但朴素贝叶斯模型建模消耗时间只需要4.8秒,远小于逻辑回归的107秒。(由于本人电脑有点拉,在你们的电脑可能时间短些,朴素贝叶斯建模甚至能达到0.4秒)

输出:

朴素贝叶斯建模耗时 4.868469 秒
朴素贝叶斯log损失为 2.613760
逻辑回归建模耗时 107.135925 秒
逻辑回归log损失为 2.613217

2、加入犯罪时间节点

将犯罪的时间节点也加入特征,进行二次建模比较两个模型的表现

#添加犯罪的小时时间点作为特征
features = ['Friday', 'Monday', 'Saturday', 'Sunday', 'Thursday', 'Tuesday',
'Wednesday', 'BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION',
'NORTHERN', 'PARK', 'RICHMOND', 'SOUTHERN', 'TARAVAL', 'TENDERLOIN']

hourFea = [x for x in range(0,24)]
features = features + hourFea

#分割训练集(3/5)和测试集(2/5)
training, validation = train_test_split(trainData, train_size=.60)

#朴素贝叶斯建模,计算log_loss
model = BernoulliNB()
nbStart = time.time()
model.fit(training[features], training['crime'])
nbCostTime = time.time() - nbStart
predicted = np.array(model.predict_proba(validation[features]))
print ("朴素贝叶斯建模耗时 %f 秒" %(nbCostTime))
print ("朴素贝叶斯log损失为 %f" %(log_loss(validation['crime'], predicted)))

#逻辑回归建模,计算log_loss
model = LogisticRegression(C=.01)
lrStart= time.time()
model.fit(training[features], training['crime'])
lrCostTime = time.time() - lrStart
predicted = np.array(model.predict_proba(validation[features]))
log_loss(validation['crime'], predicted)
print ("逻辑回归建模耗时 %f 秒" %(lrCostTime))
print ("逻辑回归log损失为 %f" %(log_loss(validation['crime'], predicted)))

利用三组特征进行建模所得与上相似,朴素贝叶斯算法效率更高

输出:

朴素贝叶斯建模耗时 12.705698 秒
朴素贝叶斯log损失为 2.582038
逻辑回归建模耗时 112.633900 秒
逻辑回归log损失为 2.583173

六、总结

通过基于朴素贝叶斯方法探索通过犯罪时间,星期几以及区域来判断犯罪类型,并选择不同特征进行两次建模与逻辑回归方法进行关于建模时间以及在测试集上表现的比较,发现面对相同数据集,朴素贝叶斯方法效率更高

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习技术(八)——朴素贝叶斯算法实操 的相关文章

随机推荐

  • AltiumDesigner下载安装

    原文来自公众号 工程师看海 AltiumDesigner的特点是交互人性化 上手简单 显示画面美观 是很多硬件工程师入门之选 在我的公众号 后台回复 altium designer 可以得到altium designer的安装包和和谐方法
  • 【ES】QueryBuilder构造ES查询条件:精准匹配、模糊搜索、范围查询、and、or

    private QueryBuilder getQueryBuilder termsQuery key obj1 obj2 一次匹配多个值 matchQuery key Obj 单个匹配 field不支持通配符 前缀具高级特性 multiM
  • Mysql分库分表方案

    Mysql分库分表方案 Mysql分库分表方案 1 为什么要分表 当一张表的数据达到几千万时 你查询一次所花的时间会变多 如果有联合查询的话 我想有可能会死在那儿了 分表的目的就在于此 减小数据库的负担 缩短查询时间 mysql中有一种机制
  • Hadoop知识点整理

    知识点大纲 一 初识Hadoop 1 mapreducer 和rdbms区别 2 结构化数据 非结构化数据 半结构化数据 3 hadoop发展历程 二 关于MapReducer 1 新老API对比 2 MapReducer 执行步骤 3 c
  • filebeat多个日志输出多条索引

    vim filebeat yml filebeat prospectors type log enabled true paths opt zcsy hbase logs hbase hadoop regionserver cd zcsy
  • Windows 10 安装Qt5.15.2以及vs2019

    Windows 10 安装Qt5 15 2以及vs2019 一 安装Qt5 15 2 下载Qt5 15 2 下载地址 阿里云盘 安装 Qt5 15 2 输入账号进行在线安装 点击NEXT进入下一步 注 账号密码需要去QT官网申请帐号 账号申
  • WebSocket + kafka实时推送数据(springboot纯后台)

    逻辑 kafka订阅消费者主题 消费后通过webSocket推送到前端 kafka vue financial webSocket 学习引用 SpringBoot2 0集成WebSocket 实现后台向前端推送信息 World Of Mos
  • Java_web初级学习01搭建环境

    一 安装jdk以及JAVA HOME JRE HOME配置 1 安装jdk 这里可以修改路径 2 设置JAVA HOME和JRE HOME环境变量 计算机 图标上右键 gt 属性 gt 高级系统设置 配置JAVA HOME环境变量 到jdk
  • nginx负载均衡之健康检查

    严格来说 nginx到目前为止没有针对负载均衡后端节点的健康检测的模块 但是可以通过upstream负载均衡组中的max fails number和fail timeout time来间接实现 但还是会把请求转发给故障服务器的 然后再转发给
  • 求最大子序列和及其位置(四种经典方法)

    算法部分 include
  • R

    ggplot plot 画图时 都会有自带的颜色配置 但是比较难看 个人偏向自定义颜色 当然也有很多现成好用的配色方案 如RColorBrewer包 RColorBrewer包 提供了3套很好的配色方案 连续型sequential 生成一系
  • Linux C++: error: redefinition of ‘class xxx’ 的解决方法

    我在Ubuntu上写C 运行程序时遇到error ThinkBook 15p data150 study projects 0408 g g src cpp I include o bin test01 In file included f
  • L - Candy Machine(二分+贪心)

    题意 大体就是查找大于等于这个选定集合的平均值个数的数 选定集合 分析 前提就是这个集合有序 这个可以反着理解当最后一个数加上前缀必然使平均值降低 然后大于平均的增多 不断贪心求最大 代码 include
  • IDEA使用Gradle报错:你的主机中的软件中止了一个已建立的连接

    问题详情 问题解决 关闭电脑的热点分享 再重新加载项目即可
  • 什么是HIS、PACS、LIS、RIS

    HIS 医院bai信息系统 Hospital Information System HIS 利用电子计算机和通讯设备du 为医院所属各部门提zhi供病人诊疗信息dao和行政管理信息的收集 存储 处理 提取和数据交换的能力 并满足所有授权用户
  • dubbo分布式服务

    架构 节点角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次调和调用时间的监控中心 Container 服务运行容器 调
  • Linux磁盘管理命令大全

    1 cd命令 Linux cd命令用于切换当前工作目录至 dirName 目录参数 其中 dirName 表示法可为绝对路径或相对路径 若目录名称省略 则变换至使用者的 home 目录 也就是刚 login 时所在的目录 另外 也表示为 h
  • RedHat7.2系统中安装snmp工具并配置服务

    简单介绍 snmpwalk是SNMP的一个工具 用户可以通过snmpwalk查看支持SNMP协议设备的一些信息 比如IP地址 内存使用率等 snmpwalk是一款比较好用的采集系统信息的工具 安装snmp工具 输入以下指令安装软件包 以普通
  • 常用的 Druid 参数

    Druid 参数 连接池初始化大小 最大连接数 最小空闲连接数这几个连接数有什么作用 他们的关系是怎么样的 初始连接数如果都被占用了 连接池会创建最小空闲数个连接吗 官网 Druid Database for modern analytic
  • 机器学习技术(八)——朴素贝叶斯算法实操

    机器学习技术 八 朴素贝叶斯算法实操 文章目录 机器学习技术 八 朴素贝叶斯算法实操 一 引言 二 导入相关依赖库 三 读取并查看数据 四 数据预处理 五 构建两种模型进行比较 1 只考虑Dayofweek以及District 2 加入犯罪