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

2023-09-13 12:24:11

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

在这里插入图片描述

一、引言

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

六、总结

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

更多推荐

ELK日志分析系统

ELK概述是一套基于Elasticsearch(存储)、Logstash(过滤)、Kibana(前端展示)三个开源工具的日志收集、存储、检索和可视化的解决方案ELK可以帮助用户快速定位和分析应用程序的故障,监控应用程序的性能和安全性,以及提供丰富的数据分析和展示功能Elasticsearch(存储)是一个分布式搜索和分

springboot整合aop,实现日志操作

前言:整合之前,我们要明白aop是什么,为什么要用aop,aop能帮我们做什么。答:AOP是面向切面编程(Aspect-OrientedProgramming)的简称,它是一种编程思想,旨在在面向对象编程(OOP)的基础上进行功能模块的解耦和隔离。在传统的业务处理代码中,通常需要进行事务处理、日志记录等操作,这些操作会

redis深度历险 1 - Redis基础数据结构-001

Redis有5种基础数据结构,分别为:string(字符串)、list(列表)、set(集合)、hash(哈希)和zset(有序集合)。熟练掌握这5种基本数据结构的使用是Redis知识最基础也最重要的部分,它也是在Redis面试题中问到最多的内容。1字符串string字符串string是Redis最简单的数据结构。Re

AI在玩一种很新的艺术,700万网友在线围观,ControlNet又立功了

量子位|公众号QbitAIAI又在玩一种很新的艺术。一组“在离谱与合理的边缘反复试探”的图席卷各大平台,最火的一条𝕏已有近700万查看16.8万点赞,到处有人在求教程。除了棋盘样式,还有一种螺旋样式的也很流行。连知名投资机构YCombinator的创始人PaulGraham都来围观:这一刻,AI生成的艺术通过了我的图

Unity-Input System新输入系统插件学习

1.键盘、鼠标操作usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.InputSystem;usingUnityEngine.UI;publicclassNewInputSystem:Mon

【Vue】入门及生命周期(前后端分离)

目录一、Vue简介1、Vue.js是什么2、库和框架的区别2.1库(Library)2.2框架(Framework)3、MVVM的介绍二、Vue入门1、Vue快速入门2、Vue的优势三、Vue事件四、Vue生命周期1、实例一、Vue简介1、Vue.js是什么Vue是一款流行的构建用户界面(UI)的[渐进式]JavaSc

Unix和Linux、GNU和GPL、RHEL和Centos、Debian和Ubuntu

文章目录Unix和LinuxGNU和GPLGNU/Linux名称的来源RHEL和CentosDebian和Ubuntu以上都是操作系统,服务器操作系统、桌面操作系统。对于刚刚接触Linux系统或者从事运维相关工作的人来说,肯定会听过很多名词,但是不知道他们的区别和联系,比如Unix和Linux、RHEL和Centos等

【JVM】经典垃圾收集器

文章目录说明新生代收集器Serial收集器ParNew收集器ParallelScavenge收集器老年代收集器SerialOld收集器ParallelOld收集器CMS收集器GarbageFirst收集器需要解决的问题运作过程CMS和G1的区别说明Java中有许多垃圾收集器(GarbageCollector,GC)可供

程序员基操——如何应对需求变更的“范畴”和“形状”

前言架构整洁之道读后感,随笔原文引用有删减,虽然我认为原文每一个字都很有价值,值得推敲,但是考虑到自己程序员的身份,必须懒点,才能融入大家喜欢交流的小伙伴私信加群引用文字为了达到软件的本来目的,软件系统必须够“软”——也就是说,软件应该容易被修改。当需求方改变需求的时候,随之所需的软件变更必须可以简单而方便地实现。变更

docker day05

昨日内容回顾:-dockerfile的优化-编译速度-充分利用缓存镜像,将不常变更的指令放在靠前的位置;-在不影响功能的前提下,最好是可以合并多条指令,可以减少中间容器或者镜像的产生;-软件源最高更换国内较稳定的软件源,相比国外的软件源速度会更快;-使用".dockerignore"文件忽略Dockerfile编译不需

python爬虫爬取电影数据并做可视化

思路:1、发送请求,解析html里面的数据2、保存到csv文件3、数据处理4、数据可视化需要用到的库:importrequests,csv#请求库和保存库importpandasaspd#读取csv文件以及操作数据fromlxmlimportetree#解析html库frompyecharts.chartsimport

热文推荐