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

news2024/11/23 2:09:25

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

在这里插入图片描述

文章目录

  • 机器学习技术(八)——朴素贝叶斯算法实操
    • 一、引言
    • 二、导入相关依赖库
    • 三、读取并查看数据
    • 四、数据预处理
    • 五、构建两种模型进行比较
      • 1、只考虑Dayofweek以及District
      • 2、加入犯罪时间节点
    • 六、总结

一、引言

上文讲述了逻辑回归在分类任务上的应用及算法原理: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

六、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式,如下: select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

【LeetCode-简单题】383. 赎金信

文章目录 题目方法一&#xff1a;数组方法二&#xff1a;哈希表 题目 方法一&#xff1a;数组 先将magazine中的字符转换为26大小的数组中字符的数量然后再遍历ransomNote中的字符&#xff0c;每遍历一个就让字符数量- 1&#xff0c;若字符数量<0 了 &#xff0c;说明magaz…

9.12号

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…

java.lang.NoClassDefFoundError: com/sun/jna/Callback

添加依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.13.0</version></dependency> 其他版本查看 https://mvnrepository.com/artifact/net.java.dev.jna/jna

leetcode 第454题.四数相加II

给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 454. 四数相加 II - 力扣&#xff08;LeetCode&#xf…

荣23转债上市价格预测

荣23转债113676 基本信息 转债名称&#xff1a;荣23转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;5.76亿元。 正股名称&#xff1a;荣晟环保&#xff0c;今日收盘价&#xff1a;15.64元&#xff0c;转股价格&#xff1a;15.74元。 当前转股价值 转债面…

Redis 缓存过期淘汰策略

面试题&#xff1a; 生产上你们的redis内存设置多少&#xff1f;如何配置、修改redis的内存大小如果内存满了你怎么办redis清理内存的方式&#xff1f;定期出测除和惰性曲除了解过吗redis缓存淘太策略有哪些&#xff1f;分别是什么&#xff1f;你用那个&#xff1f;redis的LRU…

阿里云CDN架构接入WAF应用防火墙案例实践

文章目录 1.网站架构变化2.配置WAF应用防火墙2.1.配置网站接入WAF防火墙2.2.WAF防火墙生成CNAME地址2.3.配置WAF防火墙HTTPS证书2.4.WAF防火墙开启HTTP回源SLB 3.配置CDN加速器回源WAF防火墙4.将域名DNS解析指向CDN的域名5.测试网站是否能正常访问6.模拟攻击观察WAF的作用7.解除…

4.5 指针与数组的转换

typedef struct {unsigned char head_first; //包头首字节unsigned char head_last; //包头末字节unsigned char ad[5][96][2];unsigned char end_first; //包尾首字节unsigned char end_last; //包尾末字节 …

python-爬虫-urllib3

导入模块 import urllib3urllib3&#xff1a;功能强大、条理清晰、用于HTTP客户端的python网络请求库 重要特征 1.线程安全 2.连接池 3.客户端SSL/TLS验证 4.使用分段编码长传文件 5.重试请求和处理HTTP复位的助手 6.支持gzip和deflate编码 7.HTTP和SOCKS的代理支持 8.100%的…

【送书活动】借助ChatGPT和Python,轻松实现办公自动化✨

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

群晖(Synology)NAS 后台安装 Docker 后配置 Activemq Artemis

因最近需要在本地调试消息策略。 如果搞个服务器装就太辛苦了&#xff0c;所以就想到了 NAS&#xff0c;我们的 NAS 上已经装了 Docker&#xff0c;我们直接运行一个 Activemq Artemis 的镜像不就好了。 下载镜像 在进入 NAS 的容器管理后&#xff0c;访问 Registry。 然后…

弱引用回调引发的坑

在开发中&#xff0c;常常会用到回调模型&#xff0c;为了避免回调监听未被主动释放&#xff0c;导致内存泄露&#xff0c;我们会用到 WeakReference 来存放回调引用&#xff0c;然而要注意的是回调类被回收的坑。本文记录笔者开发中遇到弱引用回调被回收的坑及思考。 奇怪的现…

删除的快捷键ctrl加什么?快捷键删除的文件怎么恢复

在许多情况下&#xff0c;我们可以利用电脑的快捷键&#xff0c;即键盘上的组合按键&#xff0c;来执行特定的操作&#xff0c;例如使用组合键删除文件。当我们熟练掌握这些快捷键时&#xff0c;能够显著提升工作效率。那么&#xff0c;你知道ctrl哪个键可以删除文件吗&#xf…

花西子口碑下降,国产化妆品应该如何增加自己的品牌曝光

过去几天&#xff0c;因为花西子一支眉笔克重单价比大牌还贵&#xff0c;而某直播间的主播在面对消费者的质疑时&#xff0c;没有选择解答用户的疑惑&#xff0c;而是质疑消费者的工作能力等等&#xff0c;导致花西子的口碑下降&#xff0c;而主播的印象也逐渐负面&#xff0c;…

【四】3D Object Model之创建Creation——read_object_model_3d()算子

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; Halcon算子太多&#xff0c;学习查找都没有系统的学习查找路径&#xff0c;本专栏主要分享Halcon各类算子含义及用法&#xff0c;有…

一、Mediasoup源码介绍

一、Mediasoup 整体结构 整个Mediasoup库通过Nodejs管理&#xff0c;比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。 其底层的数据传输是通过C部分进行控制的&#xff0c;通过NodeJs来控制C部分&#xff0c;以实现整体的数据传输效 二、Mediasou…

【C语言】指针详解(3)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解指针(2)&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.函数指针数组二.指向函数指针数组的指针&#xff08;不重要&#xff09;三.回调函数 一.函…

9.13 | day 6 |day 45| to 完全平方数

● 70. 爬楼梯 &#xff08;进阶&#xff09; class Solution {public int climbStairs(int n) {int[] dp new int[n1];//设置背包容量&#xff1a;n个int m 2;//有两个物品&#xff0c;注意这是一个完全背包问题dp[0] 1;//initialize ​for(int i 1;i<n;i){//遍历背包f…

前缀和思想

何为前缀和 有一个数组a, 为 ...... 前缀和 ...... 有两个问题: 1.如何求? 只需要从前往后遍历,令 就可以了,最开始是 ,定义 0 2. 有什么用? 能够快速地求出原数组中某一段的和,预处理的…