机器学习和可视化还能一起这样用?Python教你全搞定

今天这篇推文,我们继续空间数据可视化的最后一个系列-类别插值(categorical-spatial-interpolation) 可视化绘制的推文教程,这期我们使用Python进行绘制,涉及的知识点如下:

  • sklearn.KNeighborsClassifier()机器学习应用

  • plotnine 多数值映射绘图设置

  • 所有完整代码都已整理之我们的线上课程,有需要的同学+v yidianshuyulove 咨询

(两大知识点,其中还会涉及几个小点知识,会明确指出)

sklearn.KNeighborsClassifier()

终于这篇推文将机器学习可视化完美的结合起来,即:机器学习处理数据,数据可视化技术展现、美化数据(以后的深度学习部分也会延续这个风格,只不过比重不同而已)。首先,我们给出我们今天的数据:散点数据和四川省的地图文件,python读取操作如下:

import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

data = pd.read_excel(r"sichuan_df_label.xlsx")
import geopandas as gpd
si_map = gpd.read_file(r"四川省.json")

预览如下: 散点:

地图文件

计算网格插值

这一步之前的推文中已说了很多次,这次我们设置800x800的网格,边界设置依据还是我们地图文件的经纬度范围,代码如下:

bounds = si_map.total_bounds
grid_size = 800
grid_lon = np.linspace(bounds[0],bounds[2],grid_size)
grid_lat = np.linspace(bounds[1],bounds[3],grid_size)
xgrid, ygrid = np.meshgrid(grid_lon, grid_lat)
#将插值网格数据整理
df_grid =pd.DataFrame(dict(lon=xgrid.flatten(),lat=ygrid.flatten()))
df_grid.head()

结果如下:

接下来,我们就是使用机器学习技术在基于点数据属性的基础上构建分类模型,再将训练好的模型应用到我们插值生成的数据上(尽量大白话,让你们更加好理解)

构建knn类模型

这一部分,我们将使用机器学习中最常用的sklearn包进行分类模型的构建及在新数据(网格插值数据)上的应用。详细代码如下:

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=100,weights="distance")
neigh_al = neigh.fit(X.values,y.values)

这样我们就构建了一个机器学习的分类模型了,其中KNeighborsClassifier的其他属性,大家可以去 sklearn 官网 进行查看哈。接下来,我们将使用构建好的neigh_al模型应用在我们的插值数据上,代码如下:

x_test = df_grid[["lon",'lat']].values
knn_result = neigh_al.predict(x_test)
knn_result
##
#array([2, 2, 2, ..., 1, 1, 1], dtype=int64)

可以看到,我们已经对每一组数据生成相应的分类结果了,由于我们作图还需使用到分类可能性数据,我们使用predict_proba方法计算其分类结果在不同类别上的可能性(最终的分类结果是取可能性最大的对应结果的)。

knn_result_pro = neigh_al.predict_proba(x_test)

我们需要将结果保存,则需要对knn_result_pro结果进行操作,即筛选出每一个结果的最大值,这里使用np.amax() 方法操作,代码如下:

knn_result_pro_max = np.amax(knn_result_pro,axis=1)

结果另存:

df_grid["knn_result"] = knn_result
df_grid["knn_result_pro"] = knn_result_pro_max
df_grid.head()

plotnine 可视化绘制

使用分类模型将结果计算出,并规整完毕,接下来就可以进行可视化绘制了,这里我们使用Plotnine 包进行绘制,代码如下:

「散点分布图:」

import plotnine
from plotnine import *
plotnine.options.figure_size = (5, 4.5)
point_map = (ggplot() + 
           geom_map(sichuan,fill='none',color='gray',size=0.4) +
           geom_point(data,aes(x='lon',y='lat',color='label'),size=1) +
           scale_color_cmap_d(name = "Dark2")+
           xlim(97,109)+
           ylim(25.8,34.5)+
           scale_x_continuous(breaks=[98,100,102,104,106,108])+
           scale_y_continuous(breaks=[26,28,30,32,34,36,38])+
           labs(title="Map Charts in Python Exercise 03: Map point",
                )+
           #添加文本信息
           annotate('text',x=97,y=35.3,label="processed map charts with plotnine",ha="left",
                   size=10)+
           annotate('text',x=104.5,y=26,label="Visualization by DataCharm",ha="left",size=9)+
           theme(
               text=element_text(family="Roboto Condensed"),
               #修改背景
               panel_background=element_blank(),
               axis_ticks_major_x=element_blank(),
               axis_ticks_major_y=element_blank(),
               axis_text=element_text(size=12),
               axis_title = element_text(size=14),
               panel_grid_major_x=element_line(color="gray",size=.5),
               panel_grid_major_y=element_line(color="gray",size=.5),
            ))

可视化结果如下:

「插值网格可视化:」

import plotnine
from plotnine import *
plotnine.options.figure_size = (5, 4.5)

#mycolor = ["#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E"]
knn_map_grid = (ggplot(data=knn_grid) + 
           geom_map(sichuan,fill='none',color='gray',size=0.4) +
           aes(fill="knn_result")+
           geom_tile(knn_grid,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
                    show_legend={'alpha': False}) +
           scale_color_cmap_d(name = "Dark2")+
           xlim(97,109)+
           ylim(25.8,34.5)+
           scale_x_continuous(breaks=[98,100,102,104,106,108])+
           scale_y_continuous(breaks=[26,28,30,32,34,36,38])+
           labs(title="Map Charts in Python Exercise 03: Categorical Interpolation Grid",
                )+
           #添加文本信息
           annotate('text',x=97,y=35.3,label="processed map charts with plotnine",ha="left",
                   size=10)+
           annotate('text',x=104.5,y=26,label="Visualization by DataCharm",ha="left",size=9)+
           theme(
               text=element_text(family="Roboto Condensed"),
               #修改背景
               panel_background=element_blank(),
               axis_ticks_major_x=element_blank(),
               axis_ticks_major_y=element_blank(),
               axis_text=element_text(size=12),
               axis_title = element_text(size=14),
               panel_grid_major_x=element_line(color="gray",size=.5),
               panel_grid_major_y=element_line(color="gray",size=.5),
            ))
knn_map_grid

可视化结果如下:

这里由于将类别(label)和可能性(pro)分别映射在color(颜色和)alpha(透明度),注意如下代码(与ggplot2绘制有所不同):

(ggplot(data=knn_grid) + 
           geom_map(sichuan,fill='none',color='gray',size=0.4) +
           aes(fill="knn_result")+
           geom_tile(knn_grid,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
                    show_legend={'alpha': False}) +

若是采用类似ggplot2的映射理念绘图,即采用如下代码绘制:

ggplot() + 
           geom_map(sichuan,fill='none',color='gray',size=0.4) +
           geom_tile(knn_grid,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
                    show_legend={'alpha': False}) 

得到的可视化结果如下:

图中红框部分怎不能很好的表达图表含义。

裁剪操作

这一步也是说了很多次了,将模型预测结果转换geopandas 数据 类型,再使用clip() 方法裁剪即可,我们直接给出绘图代码:

#绘图
import plotnine
from plotnine import *
plotnine.options.figure_size = (5, 4.5)

#mycolor = ["#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E"]
knn_map_grid_clip = (ggplot(data=knn_grid_clip) + 
           geom_map(sichuan,fill='none',color='gray',size=0.7) +
           aes(fill="knn_result")+
           geom_tile(knn_grid_clip,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
                    show_legend={'alpha': False}) +
           scale_color_cmap_d(name = "Dark2")+
           xlim(97,109)+
           ylim(25.8,34.5)+
           scale_x_continuous(breaks=[98,100,102,104,106,108])+
           scale_y_continuous(breaks=[26,28,30,32,34,36,38])+
           labs(title="Map Charts in Python Exercise 03: Categorical Interpolation",
                )+
           #添加文本信息
           annotate('text',x=97,y=35.3,label="processed map charts with plotnine",ha="left",
                   size=10)+
           annotate('text',x=104.5,y=26,label="Visualization by DataCharm",ha="left",size=9)+
           theme(
               text=element_text(family="Roboto Condensed"),
               #修改背景
               panel_background=element_blank(),
               axis_ticks_major_x=element_blank(),
               axis_ticks_major_y=element_blank(),
               axis_text=element_text(size=12),
               axis_title = element_text(size=14),
               panel_grid_major_x=element_line(color="gray",size=.5),
               panel_grid_major_y=element_line(color="gray",size=.5),
            ))

最终我们的可视化结果如下:

注意:

由于以上数据的*类别列(label)*是直接随机生成的,可能是连续性数值,所以在绘图之前,需要添加如下类型转换操作代码:

knn_grid["knn_result"] = knn_grid["knn_result"].astype("object")

总结

这一期的可视化绘制推文,我们加入了机器学习的内容(也算是机器学习相关的第一篇推文),原理性的东西我这边尽量少介绍,我们关注的是实际应用,无论是可视化的数据处理、各个领域的应用等,希望这篇推文对大家的可视化设计或者机器学习等知识面都有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人机界面和三菱PLC之间以太网通信

本文主要描述人机界面WinCC如何与三菱Q系列PLC进行以太网通讯,主要介绍了CPU自带以太网口和扩展以太网模块两种情况以及分别使用TCP、UDP两种协议进行通讯组态步骤及其注意事项。 一、 说明 WinCC从V7.0 SP2版本开始增加了三菱以太网驱动程序,支持和三…

芯课堂 | 上位机快速上手指南

​01.工具准备 1、硬件:SWMDM-QFP100-34SVEA3驱屏板TFT屏800x480(触摸IC-GT911)Jlink; 2、PC端:上位机keil。 02.实验现象 通过屏幕上的按钮控制uart发送。 03.创建文件工程 1、可以通过论坛 https://bbs.synwit.cn 获…

C# paddlerocrsharp识别身份证号

https://gitee.com/raoyutian/paddle-ocrsharp 项目搭建 新建控制台项目 安装paddleocrsharp 下载训练好的模型 解压放到对应的文件夹中,都修改为如果较新则复制 编写代码OCRHelper.cs using PaddleOCRSharp;namespace OCRTest02;public class OCRHelper {//…

JVM跨代引用垃圾回收

1. 跨代引用概述 在Java堆内存中,年轻代和老年代之间存在的对象相互引用,假设现在要进行一次新生代的YGC,但新生代中的对象可能被老年代所引用的,为了找到新生代中的存活对象,不得不遍历整个老年代。这样明显效率很低…

代码随想录|学习工具分享

工具分享 画图 https://excalidraw.com/ 大家平时刷题可以用这个网站画草稿图帮助理解!如果看题解很蒙或者思路不清晰的时候,跟着程序处理流程画一个图,90%的情况下都可以解决问题! 数据结构可视化 https://www.cs.usfca.edu/…

vscode连接服务器与FileZilla上传到服务器

https://www.cnblogs.com/qiuhlee/p/17729647.html(这个是vscode连接服务器) 主机:就是服务器的主机号 使用者名称:比如ALmax的用户名 密码:比如ALmax的密码

(十八)devops持续集成开发——使用docker安装部署jenkins流水线服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins,选择一个最新稳定版本,避免一些插件不兼…

Android Jni的介绍和简单Demo实现

Android Jni的介绍和简单Demo实现 文章目录 Android Jni的介绍和简单Demo实现一、JNI的简单介绍JNINDKJni的开发背景:**JNI在 Android 开发里的主要应用场景:** 二、JNI的简单Demo1、Demo主要界面和效果展示2、CMake编译加载文件add_library 指令的加载库…

[算法沉淀记录] 排序算法 —— 堆排序

排序算法 —— 堆排序 算法基础介绍 堆排序(Heap Sort)是一种基于比较的排序算法,它利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,其中每个节点的值都必须大于或等于(最大堆)或小于或等于&am…

JVM相关面试题

【面试题一】谈谈JVM内存模型 JVM内存区域的划分,之所以划分是为了JVM更好的进行内存管理。就好比一间卧室,这块放床,这块放个电脑桌,每块地方各自有各自的功能,床用来睡觉,电脑桌用来办公打游戏。而JVM划…

SpringBoot快速入门(黑马学习笔记)

需求 需求:基于SpringBoot的方式开发一个Web应用,浏览器发起请求/hello后,给浏览器返回字符串"Hello World~"。 开发步骤 第一步:创建SpringBoot工程项目 第二步:定义HelloController类,添加方…

【Python_11】Python基础语法(数据容器之字典详解)

文章目录 概述Python中的数据容器字典1.1 定义字典1.2取值与改值1.3 遍历字典1.3.1 遍历字典的key1.3.2 遍历字典的值1.3.3 遍历字典键值对1.3.4 sorted()函数排序 1.4 字典常用方法 概述 数据容器是用来存储和组织数据的数据结构和对象。可以以不同的方式存储和操作数据&…

主数据管理是数字化转型成功的基石——江淮汽车案例分享

汽车行业数字化转型的背景 在新冠疫情导火索的影响下,经济全球化政治基础逐渐动摇。作为全球最大的汽车市场,我国的汽车市场逐渐由增量转为存量市场。 在数字化改革大背景下,随着工业4.0时代的到来,江淮汽车集团力争实现十四五数…

goland配置新增文件头

参考: goland函数注释生成插件 goland函数注释生成插件_goland自动加函数说明-CSDN博客 GoLand 快速添加方法注释 GoLand 快速添加方法注释_goland批量注释-CSDN博客 goland 如何设置头注释,自定义author和data goland 如何设置头注释,自定…

苹果上架App被拒绝的原因

苹果上架App被拒绝的原因有很多种,主要包括以下几个方面: 1.功能问题:苹果认为你的App存在功能问题,不符合App Store的要求。比如,你的App可能存在漏洞,会影响用户体验或者安全性,或者涉及到隐…

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?

毫末智行是一家致力于自动驾驶的人工智能技术公司,其前身是长城汽车智能驾驶前瞻分部,以零事故、零拥堵、自由出行和高效物流为目标,助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中,是什么原因让毫末智行…

【可实战】被测系统业务架构、系统架构、技术架构、数据流、业务逻辑分析

一、为什么要学习 更深的理解业务逻辑(公司是做什么的?它最重要的商务决策是什么?它里面的数据流是怎么做的?有哪些业务场景?考验你对这家公司、对所负责业务的熟悉程度。公司背后服务器用什么软件搭建的?…

js 对象总结

文章目录 1、创建对象的6种方式总结一、new 操作符 Object 创建对象二、字面式创建对象 2、js 如何判断对象是否为空3、获取对象长度4、js 遍历对象的 5 种方法1、for … in2、Object.keys(obj)3、Object.values(obj)4、Object.getOwnPropertyNames(obj)5、使用Reflect.ownKey…

领先科技2024年3月5-7日第12届国际生物发酵展-宁泰橡塑

参展企业介绍 湖南宁泰橡塑有限公司(简称“宁泰”)位于国家 级湖南省浏阳经济技术开发区,距离省会城市长沙35公里,距离黄花国际机场18公里,交通便利,区位和地缘优势明显。宁泰是一家专业从事卫生级橡塑制品…

通过 Java 中 5 种流行的方法提取电子邮件

在开发电子邮件处理应用程序时,建立一种从收件箱中提取消息的有效机制对于可靠、及时的传递和可访问性至关重要。处理不断增长的传入消息的组织和企业尤其赞赏它。在本文中,我们将探讨如何利用 Java 库的强大功能,通过 POP3、IMAP、EWS、Grap…