python基于机器学习模型开发实践kaggle旧金山犯罪案件分类预测模型

news2024/7/4 5:57:04

旧金山犯罪案件分类本质是一个文本的多分类任务,kaggle官网地址在这里,如下所示:

本文主要是以kaggle比赛数据集为基准,开发实践文本多分类任务。

比赛背景

从 1934 年到 1963 年,旧金山因高犯罪率而臭名昭著。时至今日,旧金山虽以高科技闻名于世,但随着财富不平等的加剧、住房短缺以及乘坐 BART 上班的人数激增,这座海湾城市的犯罪率仍然居高不下。

  本次比赛数据集提供了旧金山所有社区近 12 年的犯罪报告。 给定时间和地点,需要我们做的是预测犯罪的类型。除外,比赛还鼓励我们探索数据集,比如可以通过犯罪地图可视化来了解这座城市的哪些信息?我们具体来看一下数据。

数据描述

 建模流程

 数据处理

首先借助于pandas等工具包实现数据的加载处理

train = pd.read_csv("./train.csv", parse_dates=['Dates'])
test = pd.read_csv("./test.csv", parse_dates=['Dates'], index_col='Id')
print('训练集开始日期: ', str(train.Dates.describe()['first']))
print('训练集结束日期: ', str(train.Dates.describe()['last']))
print('测试集开始日期: ', str(test.Dates.describe()['first']))
print('测试集结束日期: ', str(test.Dates.describe()['last']))
print('训练集大小: ', train.shape)
print('测试集大小: ', test.shape)

输出如下:

训练集开始日期:  2003-01-06 00:01:00
训练集结束日期:  2015-05-13 23:53:00
测试集开始日期:  2003-01-01 00:01:00
测试集结束日期:  2015-05-10 23:59:00
训练集大小:  (878049, 9)
测试集大小:  (884262, 6)

数据概览如下:

 接下来对数据进行EDA探索分析

首先将经纬度转化为地理坐标如下:

train_gdf = create_gdf(train)world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))  # shp文件
ax = world.plot(figsize=(6, 10), color='white', edgecolor='black')
train_gdf.plot(ax=ax, color='red')
plt.show()

结果如下所示:

 让我们具体来看看有多少点错位了,可以通过纬度大于 50 来检索。我们将使用它们所属区域的平均坐标替换错误的坐标。

 这里一个简单的修正方法就是使用错位坐标点所属区域的平均坐标将其替换,如下:

train.replace({'X': -120.5, 'Y': 90.0}, np.NaN, inplace=True)
test.replace({'X': -120.5, 'Y': 90.0}, np.NaN, inplace=True)

imp = SimpleImputer(strategy='mean')
for district in train['PdDistrict'].unique():
    for df in [train, test]:
        df.loc[df['PdDistrict'] == district, ['X', 'Y']] = imp.fit_transform(df.loc[df['PdDistrict'] == district, ['X', 'Y']])

接下来逐一分析主要变量
Category 有 39 个类别,最常见的事件是:Larceny/Theft 盗窃案/盗窃(19.91%)、Non-Criminal 非犯罪分子(10.50%)、Assault 袭击(8.77%),详情分布图如下所示:

 接下来绘制每天发生的犯罪事件数量的核密度估计图,并绘制中位数的垂直线,如下所示:

 绘制5个犯罪类型的平均每小时事件数折线图,核心实现如下:

Category_5 = ['ROBBERY', 'GAMBLING', 'BURGLARY', 'ARSON', 'PROSTITUTION']
HourCategory_5 = HourCategory.loc[HourCategory['Category'].isin(Category_5)]
fig, ax = plt.subplots(figsize=(14, 6))
ax = sns.lineplot(x='Hour', y='Incidents', data=HourCategory_5,
                  hue='Category', hue_order=Category_5, style="Category", markers=True, dashes=False)
ax.legend(loc='upper center', ncol=5)
plt.suptitle('一天中每个时间段每种犯罪类型的平均事件数折线图')
fig.tight_layout()
plt.show()

结果如下:

 为了探索不同一周内不同日期下犯罪频率的波动,这里绘制对应的统计直方图,如下:

 总体可见:犯罪波动与周几没有明显的联系。

之后计算每个警察区区域平均一天中发生的犯罪频率并绘图,如下所示:

 由于原始案件均为文本数据,这里对其进行预处理,并统计词频等信息,绘制词云图,如下:

# 应用函数并统计词频
text = ' '.join(train.Address.values)
words = tokenize(text)
word_counts = collections.Counter(words)
word_counts_top = word_counts.most_common(20)  # 获取前20个最高频的词

输出如下:

[('block', 615322),
 ('mission', 47947),
 ('market', 42333),
 ('bryant', 31772),
 ('geary', 20098),
 ('turk', 18645),
 ('eddy', 15377),
 ('elli', 14714),
 ('ofarrell', 13729),
 ('jones', 12754),
 ('hyde', 12513),
 ('folsom', 12032),
 ('leavenworth', 11616),
 ('polk', 10931),
 ('gate', 10716),
 ('golden', 10484),
 ('larkin', 10383),
 ('taylor', 9937),
 ('harrison', 9862),
 ('powell', 9619)]

绘制词云图的代码在我之前的文章中都有,这里简单看下即可:

my_mask = np.array(Image.open('bg.png'))
plt.figure(figsize=(10, 10))
wc = WordCloud(width=1400, height=2200,
               background_color='black',
               mode='RGB',
               mask=my_mask,
               max_words=200,
               random_state=50,
               scale=2
               ).generate_from_frequencies(word_counts)
plt.axis('off')
plt.imshow(wc.recolor(colormap='viridis', random_state=17), alpha=0.98)

如下所示:

 接下来绘制不同犯罪类型的地理密度图,如下所示:

 完成数据的EDA之后就可以开始着手建模处理了。

特征工程

这里主要是构造相关时间特征和关键地址特征,如下:

train = feature_engineering(train)
train.drop(columns=['Descript', 'Resolution'], inplace=True)
test = feature_engineering(test)
train.head()

输出如下:

 这里为了对不同模型进行对比分析,这里将数据存储为json文件方便重复加载,如下:

X_train, X_test, y_train, y_test = train_test_split(train, y, test_size=0.3)
dataset={}
dataset["X_train"]=X_train
dataset["y_train"]=y_train
dataset["X_test"]=X_test
dataset["y_test "]=y_test 
with open("dataset.json","w") as f:
    f.write(json.dumps(dataset))

接下来就可以搭建模型了。

首先是决策树模型,如下:

model=DecisionTreeClassifier()

之后是lightGBM模型,如下:

model_lgb = lgb.LGBMClassifier(boosting_type='gbdt',
                               objective='multiclass',
                               num_class=39,
                               max_delta_step=0.9,
                               min_data_in_leaf=21,
                               learning_rate=0.4,
                               max_bin=465,
                               num_leaves=41)

之后是GBDT模型,如下:

model=GradientBoostingClassifier(n_estimators=100)

然后是Adaboost模型,如下:

model=AdaBoostClassifier(n_estimators=100)

还有随机森林模型,如下:

RandomForestClassifier(n_estimators=100)

最后是SVM模型,如下:

model=SVC()

考虑到时间问题,这里仅以决策树模型为例看下具体的结果:
【混淆矩阵】

 详情结果如下:

 因为数据量非常大,模型的训练时间很久,我只好关掉了,这里决策树是比较轻量的模型了,所以仅以这个模型结果为例进行展示说明了,感兴趣的话可以自行尝试其他的模型。

当然了也可以自己做采样去缩减数据量都是可以的。

 

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

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

相关文章

opengl绘制三角形

1.绘制两个三角形 GLfloat vertices1[] { 0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f } GLfloat vertices2[] { 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f } 也可以用索引的方式: GLfloat vertices[] { 0.5f, 0.5f, 0…

并发编程常见问题复盘

并发编程常见问题复盘 大家好,我是易安! 并发编程在计算机科学领域占有举足轻重的地位,它使得程序能够在多个处理器核心上同时执行,从而显著提升程序的性能。然而,并发编程也伴随着许多挑战和问题。这些年来&#xff0…

eacharjs饼状图带百分比

var myChart1 echarts.init(document.getElementById(main1)); myChart1.setOption({title:{text:近30天异常停机的类型TOP5,x:center,y:10px,// textStyle:{// fontSize:12// }},tooltip: {trigger: item//提示 鼠标移动上去},// legend: { // 上面的提示// top: 25%…

端口映射工具PortTunnel

PortTunnel应该是目前最好的端口转发器、端口映射工具(它解决了内外网访问的问题) 可以在我的资源中下载:https://download.csdn.net/download/qq_39569480/87717704 使用该工具前应该保证双方机器网络互通 下面我们模拟一下环境 比如现在有三台机器 A&#xff1a…

Mac环境SpringBoot项目Docker部署(独家完整版)

一、Docker 简介 Docker 是一种开源的容器化平台,允许开发人员将应用程序和所有其依赖项打包成轻量级、可移植的容器,以便在任何地方运行。Docker 的优势和劣势分析如下: 优势: 轻量级:Docker 容器仅包含应用程序及其依赖项,因…

家庭智能吸顶灯一Homekit智能

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”,除了实用的照明功能外,对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢? 照度 可以简单理解为清晰度,复杂点套公式来说照度光通量(亮度&#x…

【社区图书馆】二、LED子系统——硬件驱动层

个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、gpio_led_probe分析1.1 相关数据结构1.1.1 gpio_led_platform_data1.1.2 gpio_leds_priv 1.2 实…

Nextjs 处理 css3 前缀兼容

Nextjs 处理 css3 前缀兼容 虽然css3现在浏览器支持率已经很高了, 但有时候需要兼容一些低版本浏览器,需要给css3加前缀,可以借助插件来自动加前缀, postcss-loader就是来给css3加浏览器前缀的,安装依赖: npm i postcss-loader autoprefixer -Dpostcss-loader&…

前端使用国密SM4进行加密、解密

目录 需求【方法1】 - 使用 sm4util 依赖【方法2】sm4.js引入1. /public/sm4.js2. body 标签上引入该文件3. 使用 - ECB 模式加密 【方法3】1. 本地写 js 文件2. 使用 - ECB 模式加解密 需求 前端/后端使用 国密SM4 进行加密/解密, 【注意】前后端配合加解密时&…

06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密

这里记录的是学习分享内容,文章维护在 Github:studeyang/leanrning-share。 优化查询语句的性能是 MySQL 数据库管理中的一个重要方面。在优化查询性能时,选择正确的索引对于减少查询的响应时间和提高系统性能至关重要。但是,如何…

scrapy框架爬取某壁纸网站美女壁纸 + MySQL持久化存储

文章目录 准备工作创建项目:设置(settings) 主程序入口meinv.py思路源代码 items 配置管道pipelines源代码 效果图总结 准备工作 创建项目: scraoy startproject bizhi cd bizhi scrapy genspider meinv bizhi360.com 设置&#…

ROS学习第二十九节——URDF之joint

此处留疑问,link,joint的origin子标签到底是怎么样的一种位置关系??? https://download.csdn.net/download/qq_45685327/87717336 urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的…

大数据-玩转数据-IDEA创建Maven工程

一、 IDEA集成Maven插件 打开IDEA,进入主界面后点击 file,然后点击 settings,在上面的快捷查找框中输入maven,查找与maven相关的设置,然后点击maven 修改maven的路径(使用本地的Maven),以及修…

【流畅的Python学习笔记】2023.4.22

此栏目记录我学习《流畅的Python》一书的学习笔记,这是一个自用笔记,所以写的比较随意 元组 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。简单试试元组的特性: char…

kong(1):Kong介绍

Kong是一款基于OpenResty(Nginx Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,…

复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

“人是什么?”这是亘古以来人们反复追问的一个古老命题。从元宇宙到ChatGPT,这个人人都在讨论、理解和实践互联网的时代,对“人”的自我定义和认知产生了哪些影响?    在3月12日复旦大学-华盛顿大学EMBA项目主办的“复调艺文沙龙”上&am…

计算长方形、三角形、圆形的面积和周长

系统设计框图: 图形模块的 概要设计(设计数据结构和接口): 数据结构: float 表示面积和周长 长方形的数据(一般typedef都是定义在对应模块的头文件中) typedef struct{ float width; float he…

三菱GX Works2梯形图程序分段显示设置的具体方法示例

三菱GX Works2梯形图程序分段显示设置的具体方法示例 大家平时在使用GX Works2进行梯形图程序编辑时,默认是一整段在一起,程序步数较多时查看起来不是那么方便,下面就和大家分享如何通过声明编辑来实现程序分段显示。 具体方法可参考以下内容: 如下图所示,打开GX Works2编…

数据结构与算法(一):基础数据结构 算法概念、数组、链表、栈、队列

判断一个数是否是2的N次方? N & (N-1) 0 (N > 0)算题: 力扣 https://leetcode.cn/POJ http://poj.org/ 算法 算法概念 算法代表: 高效率和低存储 内存占用小、CPU占用小、运算速度快 算法的高效率与低存储:内存 C…

Oracle 定时任务job实际应用

Oracle 定时任务job实际应用 一、Oracle定时任务简介二、dbms_job涉及到的知识点三、初始化相关参数job_queue_processes四、实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数据4.1 创建需要定时插入数据的目标表4.2 创建定…