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

news2024/9/26 1:16:06

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

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

  • plotnine 多数值映射绘图设置

  • 所有完整代码和拓展内容都已上传之课程店铺,有需要可以咨询哈

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

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")

总结

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

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

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

相关文章

4JS表达式和运算符expression and operator

表达式(expression)JavaScript中的一个短语,JavaScript解释器会将其计算(evaluate)出一个结果。程序中的常量是最简单的一类表达式。变量名也是一种简单的表达式,它的值就是赋值给变量的值。复杂表达式是由…

【第二天】蓝桥杯备战

题 1、星期一2、顺子日期3、修剪灌木4、最少砝码 1、星期一 https://www.lanqiao.cn/problems/611/learning/ 解法:星期一的天数总共的天数/7 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void ma…

AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)

AutoGen是微软推出的一个全新工具,它用来帮助开发者创建基于大语言模型(LLM)的复杂应用程序. AutoGen能让LLM在复杂工作流程启用多个角色代理来共同协作完成人类提出的任务。在我之前的一篇博客: AutoGen实战应用(一):代码生成、执行和调试 中我们通过一…

Web3:B站chainlink课程Lesson5遇到的小坑汇总

ethers代码 我用的ethers.js 6 ,和视频里一样用的是5的不用看代码部分 ethers.providers.JsonRpcProvider("server") //无了 ethers.JsonRpcProvider("server") //现在的wallet.getTransactionCount() //无了 wallet.getNonce() //现在的Big…

springboot的actuator

1、actuator简介 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题&am…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉语言导航

专属领域论文订阅 关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

字符串相关函数【超详细】(strcpy,strstr等string.h中的函数)

文章目录 strlen库中函数定义函数作用函数大概“工作”流程函数使用注意(要求)函数使用例举 strcpy库中函数定义函数作用函数使用注意(要求)函数大概“工作”流程函数使用例举 strcat库中函数定义函数作用函数使用注意&#xff08…

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]

阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式:2. C11方式: 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中&#xff0…

【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

kubeadm部署k8s1.27.2版本高可用集群(外部etcd集群带TLS认证)

文章目录 环境软件版本服务器系统初始化etcd 证书生成etcd集群部署负载均衡器部署部署k8s集群部署网络组件FAQ 环境 控制平面节点主机的配置最少是2C2G,否则kubeadm init的时候会报错 主机名IP组件系统os128192.168.177.128etcd、kubeadm、kube-apiserver、kube-controller-m…

Vue3 pinia全解(上)

pinia是什么? 如果你学过Vue2,那么你一定使用过Vuex。我们都知道Vuex在Vue2中主要充当状态管理的角色,所谓状态管理,简单来说就是一个存储数据的地方,存放在Vuex中的数据在各个组件中都能访问到,它是Vue生…

【学术论文写作 笔记02】 鲁棒性实验写作的行文逻辑

文章目录 一、声明二、行文思路三、示例范文一范文二 一、声明 自己总结的,有问题望指正! 二、行文思路 为什么要做鲁棒性测试怎么做实验结论对结果的解释 三、示例 PPT 范文一 2022, TIM, “A Robust and Reliable Point Cloud Recognition Netw…

Java零基础学习22:static关键字

编写博客目的:本系列博客均根据B站黑马程序员系列视频学习和编写目的在于记录自己的学习点滴,方便后续回忆和查找相关知识点,不足之处恳请各位有缘的朋友指正。 一、static的初步应用场景 我们开始时不使用static直接用public赋值&#xff…

租户认证系统中心设计与实践

租⼾认证中⼼设计、需求背景 1. 由于客⼾,租⼾之间缺乏严肃的关系,导致从经营⻆度看不清客⼾对于公司产品的真实使⽤情况,对于客⼾运营也造成⼀定影响。 2. 在各个业务产品中实际存在⼀些客⼾需要完善⾃⾝资料的场景,但这些场景收…

上位机图像处理和嵌入式模块部署(c/c++ opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 opencv可以运行在多个平台上面,当然windows平台也不意外。目前来说,opencv使用已经非常方便了,如果不想自己编译…

ANSYS 2023 下载安装教程,附安装包和工具,轻松安装,无套路

前言 ANSYS是一款融结构、流体、电场、磁场、声场分析于一体的大型通用有限元分析(FEA)软件,能与多数计算机辅助设计软件接口,实现数据的共享和交换,如Creo,NASTRAN、Algor、IDEAS、AutoCAD等. 准备工作 1、Win10及以上系统 2、提前准备好…

Keepalived 深度解析:高可用性的精髓及实践指南

Keepalived 深度解析:高可用性的精髓及实践指南 Keepalived 深度解析:高可用性的精髓及实践指南Keepalived 的工作原理1. VRRP 协议概述2. Keepalived 的角色3. VRRP 协议详解 Keepalived 的使用指南1. 安装 Keepalived使用 Yum 安装本地安装方式 2. 配置…

电商系统设计到开发03 引入Kafka异步削峰

一、前言 系统设计:电商系统设计到开发01 第一版设计到编码-CSDN博客 接着上篇文章:电商系统设计到开发02 单机性能压测-CSDN博客 本篇为大制作,内容有点多,也比较干货,希望可以耐心看看 已经开发的代码&#xff0…

基于Python的全国主要城市天气数据可视化大屏系统

1 绪论 1.1 研究的目的与意义 近年来,气候变化引发全球范围内的关注。天气数据的采集和分析对于气候预测、生态环境保护等方面都起着至关重要的作用。同时,随着科技的不断发展,数据可视化已经成为了许多领域中不可或缺的一部分。基于此&…

外包干了9个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…