Geopandas 实践:构建地理空间机器学习管道
最后一部分:关于如何处理地理空间机器学习的教程
第 1 部分:地理空间概念介绍( 跟随此处 )
第 2 部分:地理空间可视化和几何创建( 跟随此处 )
第 3 部分:地理空间操作( 跟随此处 )
第 4 部分:构建地理空间机器学习管道(本文)
Marjan Blan | @marjanblan 在 Unsplash 上的照片
在这篇文章中,我们将通过涵盖不同类别的地理空间机器学习任务以及如何实现它们来结束关于 Geopandas 动手操作的系列。
目录:
- 概述
- 地理空间回归
- 地理空间分类
- 地理空间聚类
- 下一步是什么
概述
现在,我们将熟悉不同类型的地理空间机器学习任务,并获得关于它们与典型的非空间问题如何不同的早期直觉。我们将要讨论的常见任务是地理空间回归、分类和聚类。
地理空间回归
非空间回归问题考虑多个输入变量来估计目标输出的值。典型地,目标变量是连续变量的形式。
以一个回归任务为例,在给定一些其他预测因素的情况下,例如单元的大小、房间数量及其过去 20 年的历史销售价格,来预测房价。然后,您会找到使某个误差函数最小化的最佳拟合方程。
但是,在地理空间回归任务中,您需要将空间相关性作为因变量的一部分。
地理空间回归任务
如上图所示,您的房价(目标变量)现在具有空间感知能力。这意味着一所房子的位置可能会影响其邻近房子的价格。
不仅如此,独立输入变量也有其对应的空间依赖关系。例如,一栋房屋的历史价格会对其他房屋的历史价格产生影响。
在更一般的情况下,即使是独立变量也会对其他变量产生空间影响(例如,住宅区的房间数量会影响附近地区家庭的平均规模)。这些空间相互依赖性是地理空间回归问题的关键。
通常,可以获取这些空间相关性的一些更常见的地理空间回归算法有:
- 普通最小二乘(OLS)回归,以及
- 地理加权回归(GWR)
地理空间分类
同样,非空间分类任务会考虑多个输入变量来估计目标输出的类别。通常,目标输出以离散变量的形式表示一个特定的类(例如一只猫或一只狗)。
但是,在地理空间分类任务中,您通常会对像素级或整个栅格数据集执行分类。这可以包括语义分割、实例分割或栅格分类。
地理空间分类任务
上图说明了在给定栅格数据的情况下确定土地利用(如水体、森林、旱地、城市地区)的逐像素语义分割任务。
与典型的分类问题类似,地理空间分类任务可以使用深度神经网络(计算机视觉)、随机森林、支持向量机(SVM)或最大似然模型来解决。
地理空间聚类
最后但同样重要的是,另一个常见的地理空间机器学习任务包括地理空间聚类。在传统的非空间任务中,我们可以通过根据一些相似性度量(如距离、密度、等)将大量观察结果分组为几个“热点”来执行聚类。
但是根据地理第一定律:
“一切事物都与其他事物相关,但近的事物比远的事物更相关。”—瓦尔多·托布勒
这使得地理空间机器学习环境中的聚类更加困难,因为我们还需要考虑每个观察在其空间环境中如何彼此相关(即空间受限的)。
地理空间聚类任务
一个有趣的地理空间聚类问题是时空模式挖掘。除了考虑不同观察点或多边形之间的空间依赖性,这类算法还考虑了时间依赖性。为了能够对空间-时间-观察点进行聚类,通常会构建一个三维图表,然后聚类算法可以在该图表中工作。
3D 时空地理空间聚类任务
解决地理空间聚类问题的一些更常见的模型有:
- 空间约束多元聚类
- 热点分析
- 基于密度的聚类
- 三维时空模式挖掘
做订阅我的邮件简讯:【https://tinyurl.com/2npw2fnz】在这里我定期用通俗易懂的语言和漂亮的可视化总结 AI 研究论文。
下一步是什么
地理空间机器学习领域非常广阔,我希望这篇文章能给你一瞥这个领域的多样性。如果你对任何相关的话题感兴趣,请不要犹豫让我知道。你也可以看看我的其他地理空间机器学习帖子:
* *
Geopandas 动手操作:地理空间数据可视化和几何学介绍
第 2 部分:关于如何处理地理空间机器学习的教程
第一部分:地理空间概念介绍( 跟随此处 )
第二部分:地理空间可视化和几何创建(本文 )
第三部分:地理空间操作( 跟随此处 )
第四部分:构建地理空间机器学习管道( 跟随此处 )
Marjan Blan | @marjanblan 在 Unsplash 上的照片
在本帖中,我们将介绍地理空间可视化的各个方面,并向您介绍如何使用 Geopandas 创建您自己的地理空间数据。
目录:
- 概述
- 地理空间可视化
- 几何简介和创建您自己的地理空间数据
概述
在之前的文章这里中,我们讨论了 geopandas 的基础知识,比如它的底层数据类型、几何列和内置属性,我们可以很容易地对它们进行操作。
现在,我们将更深入地挖掘 geopandas,例如如何生成漂亮的地理空间可视化,并创建您自己的地理空间数据,供后续在机器学习管道中使用。
地理空间可视化
我们仍将使用 geopandas 提供的纽约行政区内置数据集。
import geopandas
path_to_data = geopandas.datasets.get_path("nybb")
gdf = geopandas.read_file(path_to_data)
gdf = gdf.set_index("BoroName")
假设我们想要可视化纽约每个区的相对面积大小。我们可以轻松地调用 plot()函数,与 Matplotlib 中的函数相同,并传入您想要绘制的列名,在本例中是“area”。
gdf["area"] = gdf.areagdf.plot("area", legend=True)
纽约行政区的面积大小
颜色似乎不能自然地表示连续变量,比如面积,让我们通过传递参数 cmap 来尝试改变颜色。
gdf.plot("area", legend=True, cmap="OrRd")
自然着色区
现在,哪一个区域更大就更明显了:被暗红色阴影笼罩的区域。如果您想查看配色方案及其相应标识符的列表,请点击此链接。
画两层或者标绘两层怎么样?回想一下,我们有先前的质心点:
gdf["centroid"] = gdf.centroid
我们可以绘制 2 个或更多的层,首先创建一个轴,我们将绘制 2 个或更多的层,并告诉 plot()函数在这个新创建的轴上绘制。
import matplotlib.pyplot as pltfig, ax = plt.subplots()
gdf.plot(ax=ax, color='white', edgecolor='black')
gdf['centroid'].plot(ax=ax)
plt.show()
两层绘图
几何学导论
下一个问题随之而来:我们能从现有的几何图形中创造出新的几何图形吗?是的,这篇文章将展示两个这样的例子。
A.缓冲器
比方说,你想在纽约周围设立一个无人驾驶飞机禁飞区,因为有贵宾进入该州,我们可以在该地区周围划出 10,000 英尺的缓冲区。
# Get the boundary of each area
gdf["boundary"] gdf.boundary# buffering the active geometry by 10 000 feet (geometry is already in feet)
gdf["buffered"] = gdf.buffer(10000)
ax = gdf["buffered"].plot(alpha=.5)
gdf["boundary"].plot(ax=ax, color="white", linewidth=.5)
区域边界周围有 10,000 英尺的缓冲区
B.信封
如果你想找到包围一个区域的最小的矩形,你也可以调用 envelope 函数并绘制出类似于上面的 Buffer 的几何图形。
Get the envelope of each area
gdf["enveloped"] = gdf.envelope# plotting the smallest rectangle envelope around an area
ax = gdf["enveloped"].plot(alpha=.5)
gdf["boundary"].plot(ax=ax, color="white", linewidth=.5)
感兴趣区域周围的最小包络
结论
就是这样!希望你今天能学到新东西。在下一篇文章中,我们将深入探讨如何执行地理空间操作,如合并、聚合、空间连接等。敬请期待!
做订阅我的邮件简讯:【https://tinyurl.com/2npw2fnz】在这里我定期用通俗易懂的语言和漂亮的可视化总结 AI 研究论文。
Geopandas 实践:地理空间关系和操作
关于如何处理地理空间机器学习的教程
第 1 部分:地理空间概念介绍( 跟随此处 )
第 2 部分:地理空间可视化和几何创建( 跟随此处 )
第 3 部分:地理空间操作(本帖 )
第 4 部分:构建地理空间机器学习管道( 跟随此处 )
Marjan Blan | @marjanblan 在 Unsplash 上的照片
在前两篇文章中,我们讨论了 geopandas 的基础知识以及如何可视化地理空间数据集。这里,我们将介绍地理空间操作的基本概念,包括关系和空间连接。
目录:
- 概述
- 地理空间关系
- 空间连接
概述
在我们继续本教程之前,请确保我们恢复了之前帖子的地理数据框。
# Import the necessary libraries
import geopandas
import shapely.geometry
import matplotlib.pyplot as plt# Initialize our geodataframe (gdf)
path_to_data = gpd.datasets.get_path("nybb")
gdf = gpd.read_file(path_to_data)# Set borough name as index
gdf = gdf.set_index("BoroName")# Get buffered region and centroid points
gdf["buffered"] = gdf.buffer(10000)
gdf['centroid'] = gdf.centroid
既然初步步骤已经定下来了,那就从教程开始吧。
地理空间关系
几何图形(如定义单个区的多边形或表示区域或点之间的边界以指示质心位置的线)可以彼此相关。
A.交叉
假设我们提出以下问题:缓冲区是否与纽约的布鲁克林区相交?
首先我们得到布鲁克林的多边形
brooklyn = gdf.loc["Brooklyn", "geometry"]
布鲁克林区
然后我们可以检查缓冲区域是否与它相交。
gdf["buffered"].intersects(brooklyn)>>BoroName
>>Staten Island True
>>Queens True
>>Brooklyn True
>>Manhattan True
>>Bronx False
>>dtype: bool
布朗克斯似乎离布鲁克林很远,边界外 10,000 英尺的缓冲区根本不与布鲁克林相交。
B.在…之内
另一个问题可能类似地出现:形心是否包含在它们各自的区(即。唯一的质心)?这可以通过指定点的集合是否包含在所述多边形中的内关系来执行。
gdf["centroid"].within(brooklyn)>>BoroName
>>Staten Island False
>>Queens False
>>Brooklyn True
>>Manhattan False
>>Bronx False
>>dtype: bool
不出所料,布鲁克林的质心位于布鲁克林多边形内,而不在其他区域内。
空间连接
我们可以使用 geopandas 执行的另一个重要的地理空间操作是空间连接。顾名思义,它允许两个不同的几何图形基于特定的几何标准进行连接。
让我们假设在这个区域内有几个公共汽车站,我们想要识别每个车站所在的行政区。
# Generate some points
b = [int(x) for x in gdf.total_bounds]
N = 6pointdf = gpd.GeoDataFrame([
{'geometry': shapely.geometry.Point(x, y), 'value1': x + y, 'value2': x - y}
for x, y in zip(range(b[0], b[2], int((b[2] - b[0]) / N)),
range(b[1], b[3], int((b[3] - b[1]) / N)))])# Make sure they're using the same projection reference
pointdf.crs = gdf.crs
随机生成的公交车站
想到的第一个解决方案是像以前一样执行一个 within 操作,然后对于每个区,将真正的索引值分配给该点(例如,如果汽车站 1 在布鲁克林,则将布鲁克林分配给该点项目)。从视觉上看,它可以表示为:
然后,可以按如下方式执行空间连接:
from geopandas.tools import sjoin# Joining the NYC borough INTO the pointdf
sjoin(pointdf, gdf, how="left", op="intersects")# The NaNs are the points that do not intersect with any borough
或者,如果您想删除 nan,可以执行一个内部连接来代替。
sjoin(pointdf, gdf, how="inner", op="intersects")
结论
就是这样!希望你今天能学到新东西。在下一篇文章中,我们将最终准备好建立我们的第一个地理空间机器学习管道。敬请期待!
做订阅我的邮件简讯:【https://tinyurl.com/2npw2fnz】在这里我定期用通俗易懂的语言和漂亮的可视化总结 AI 研究论文。
geo pandas hand-on:地理空间机器学习介绍
关于如何处理地理空间机器学习的教程
第一部分:地理空间概念介绍(本帖 )
第二部分:地理空间可视化和几何创建( 跟随此处 )
第三部分:地理空间操作( 跟随此处 )
第四部分:构建地理空间机器学习管道( 跟随此处 )
Marjan Blan | @marjanblan 在 Unsplash 上的照片
在这篇文章中,我们将介绍基本的地理空间数据类型、属性,以及如何使用 geopandas 来实现这些。
目录:
- 什么是 Geopandas
- 装置
- 地理空间概念
- 基本几何属性介绍
什么是 Geopandas
Geopandas 是一个开源库,支持使用和操作 Python 中的地理空间数据。它扩展了 pandas 中使用的通用数据类型,允许许多独特的几何操作:地理系列和地理数据框架。Geopandas 也是建立在 shapely 之上进行几何运算;它的底层数据类型允许 Geopandas 以惊人的速度运行,并且适用于许多需要大型地理空间数据集的机器学习管道。
装置
现在我们已经对 Geopandas 有所了解,让我们开始安装过程。
有很多选择,但是我推荐使用 conda 安装,因为它为你的项目创建了一个新的环境,而不会影响你系统中的其他库。要安装 conda,请遵循以下链接:安装 conda 。
- 创建一个新的 conda 环境并设置一些配置
conda create -n geo_env
conda activate geo_env
conda config --env --add channels conda-forge
conda config --env --set channel_priority strict
2.用康达安装
conda install python=3 geopandas
地理空间概念
A.地理空间公共数据类型
您需要熟悉一些常见的地理空间数据类型:Shapefile(。shp)和 GeoJSON(。geojson)。
Shapefile 是一种矢量数据格式,主要由一家名为 ESRI 的公司开发和维护。它存储许多重要的地理空间信息,包括拓扑结构、形状几何等。
Shapefile 数据格式
GeoJSON ,与 JSON 类似,除了你与对象相关的典型属性(索引、名称等)之外,还存储几何信息(坐标、投影等)。
在 JSON 对象中添加了“geometry”关键字的 GeoJSON 格式示例
一旦使用 Geopandas 加载了这些数据格式中的任何一个,库将创建一个带有额外的几何图形列的数据帧。
地理数据框架(来源:geopandas.org)
这就是如何导入 Geopandas 库中内置的默认地理数据,我们将在本文和后续文章中使用这些数据。
import geopandas
path_to_data = geopandas.datasets.get_path("nybb")
gdf = geopandas.read_file(path_to_data)
gdf
基本几何属性介绍
现在,我们已经对地理空间数据以及如何使用 Geopandas 导入我们的第一个地理空间数据有了一些概念,让我们执行一些基本的方法来进一步巩固我们的理解。
首先,让我们把行政区的名称作为索引,使我们的探索更容易。
gdf = gdf.set_index("BoroName")
区域
从几何列,我们可以测量面积(如果它们是多边形或多多边形:因为我们不能测量线或点的面积)
gdf["area"] = gdf.areagdf["area"]
>>BoroName
>>Staten Island 1.623822e+09
>>Queens 3.045214e+09
>>Brooklyn 1.937478e+09
>>Manhattan 6.364712e+08
>>Bronx 1.186926e+09
>>Name: area, dtype: float64
多边形边界
由于我们的几何图形是多边形或多多边形,我们可以提取出对象的线坐标。比如说,当我们想要测量多边形物体的周长时,这是很有用的。
多边形边界线(来源:维基百科)
gdf['boundary'] = gdf.boundary>>gdf['boundary']
>>BoroName
>>Staten Island MULTILINESTRING ((970217.022 145643.332, 97022...
>>Queens MULTILINESTRING ((1029606.077 156073.814, 1029...
>>Brooklyn MULTILINESTRING ((1021176.479 151374.797, 1021...
>>Manhattan MULTILINESTRING ((981219.056 188655.316, 98094...
>>Bronx MULTILINESTRING ((1012821.806 229228.265, 1012...
>>Name: boundary, dtype: geometry
图心
如果你想找到给定多边形的质心点,你可以如下调用 gdf 属性。
多边形质心(来源:维基百科)
gdf['centroid'] = gdf.centroid>>gdf['centroid']
>>BoroName
>>Staten Island POINT (941639.450 150931.991)
>>Queens POINT (1034578.078 197116.604)
>>Brooklyn POINT (998769.115 174169.761)
>>Manhattan POINT (993336.965 222451.437)
>>Bronx POINT (1021174.790 249937.980)
>>Name: centroid, dtype: geometry
距离
现在我们已经知道了质心的位置,并想找出皇后和其他地方之间的距离,使用 distance()方法可以很容易地做到这一点:
queens_point = gdf['centroid'].iloc[1]
gdf['distance'] = gdf['centroid'].distance(queens_point)
然后,您可以执行许多空间聚合功能来找出平均、最大或最小距离。
gdf['distance'].mean() #To find the mean distance
gdf['distance'].max() #To find the maximum distance
gdf['distance'].min() #To find the minimum distance
结论
就是这样!希望你今天能学到新东西。在下一篇文章中,我们将深入探讨如何可视化这些地理空间数据并从头开始创建。敬请期待!
做订阅我的邮件简讯:https://tinyurl.com/2npw2fnz在这里我定期用通俗易懂的英语和漂亮的可视化总结 AI 研究论文。
欧洲发电的排放强度
数据在循证决策中的作用
“任何可以衡量的东西都是可以改进的。”
T 迈克尔·戴尔的上述引述在几个方面和领域都适用。如果一个指标可以衡量,那么就有可能对其采取行动并加以改进。相比之下,没有衡量的东西是无法提高的。数据在决策中的作用越来越重要,因为数据提供证据,而证据是制定或改革政策的前提。
关于国家能源平衡和排放时间序列的统计数据集在能源和气候政策分析中至关重要。这些数据不仅揭示了历史趋势,还揭示了社会、政治、经济和技术因素如何推动能源消耗和温室气体排放。反过来,这些数据构成了评估一个国家未来排放轨迹以及满足特定气候目标和可持续性目标所需的能源系统转型的基础。
从全球来看,电力部门约占 GHG 排放量的四分之一,是最大的排放部门[1]。然而,电力部门也有可能与运输、供暖和工业等其他最终用途部门相结合。因此,终端使用部门的电气化和电力部门的去碳化被认为是减少 GHG 排放的两项重要措施。意识到这一点,全球几个国家正在从化石燃料发电转向低碳技术,如可再生能源。燃料在发电组合中的份额决定了发电的排放强度,即每生产一单位电力排放多少温室气体。
在这篇文章中,我将展示过去二十年欧洲发电的排放强度趋势,并讨论这一趋势背后的潜在原因。为此,我将使用 Python 的 geopandas 和 matplotlib 库。数据和笔记本都在这个 GitHub 仓库里。我们开始吧!
导入包
我从导入所需的包开始。我使用的 geopandas 版本是 0.8.2。由于我稍后将使用的裁剪功能与旧版本的 geopandas 不兼容。
import pandas as pd
import geopandas
import matplotlib.pyplot as plt
%matplotlib inline
from shapely.geometry import Polygon
import warnings
warnings.filterwarnings(action=”ignore”)
因为我想显示地图,所以我希望我的图形和字体稍微大一点。在这里,我为所有的图设置了图形大小和字体大小。
plt.rcParams[“figure.figsize”]=(12,10)
plt.rcParams[“font.size”]=12
Geopandas 为 matplotlib 库提供了一个高级接口来创建地图。它类似于 pandas 库,只是它由多边形或多多边形形式的特定位置的几何图形组成。首先,我将得到如下世界地图:
world = geopandas.read_file(geopandas.datasets.get_path(‘naturalearth_lowres’))
world.plot()
世界地图
Geoplotting 还允许根据此处的列表将数据重新投影到 CartoPy 提供的任何地图投影中。
fig=geoplot.polyplot(world,projection=geoplot.crs.Orthographic(), figsize=(8, 4))
plt.show()
投影到正交投影的世界地图
从世界地图中获取欧洲地图
接下来,我从世界地图中只选择了欧洲地图。
europe=world[world.continent==”Europe”]
europe.plot()
从世界地图中提取的欧洲地图
上面的欧洲地图还包括俄罗斯和冰岛。基于现有的数据,我想画出一些欧洲国家的排放强度。因此,我将俄国和冰岛排除在欧洲地理数据框架之外,如下所示:
#Remove Russia and Iceland from map of Europe
europe=europe[(europe.name!=”Russia”) & (europe.name!=”Iceland”)]
europe.plot()
不包括俄罗斯和冰岛的欧洲地图
用 Geopandas 裁剪矢量数据
在地图的左下角,有一个南美洲的小区域。这个地区被称为法属圭亚那,行政上属于法国领土。因此,它将作为法国包含在地理数据框架中。但是,由于我要绘制法国(欧洲大陆的一部分)发电的排放强度,所以我想从地图中排除法属圭亚那。
我创建了一个自定义的形状良好的多边形,以便在地图中只包含我想要的欧洲地区。我创建了一个从西经 25°延伸到东经 40°和北纬 35°延伸到北纬 75°的多边形。我将多边形转换为地理数据框架,以便与我在上面创建的欧洲地理数据框架兼容。通过这种方式,我只捕获我想用作地理绘图参考的欧洲地区。
# Create a custom polygon
polygon = Polygon([(-25,35), (40,35), (40,75),(-25,75)])
poly_gdf = geopandas.GeoDataFrame([1], geometry=[polygon], crs=world.crs)fig,ax=plt.subplots()
ax=europe.plot(ax=ax)
poly_gdf.plot(edgecolor=”red”,ax=ax, alpha=0.1)plt.show()
阴影部分表示要使用的区域。非阴影部分表示要剪切掉的区域。
我使用的 geopandas 版本(0.8.2)允许将几何裁剪到多边形几何的边界。这是一个很酷的功能,以前我只能在 GIS 软件中使用。裁剪允许从输入中提取要素。在 geopandas 中进行裁剪就像一行代码一样简单。
#Clip polygon from the map of Europe
europe=geopandas.clip(europe, polygon)
europe.plot()
欧洲地图裁剪后可用。
现在我已经准备好了地图,我想用它来进行地理绘图。下一步我会研究数据。
数据准备
本分析中使用的数据基于 2021 年 12 月,可从我们的世界数据的页面访问。该数据包括 2000 年至 2020 年欧洲发电的碳强度。
#Read csv file
df=pd.read_csv(“carbon-intensity-electricity.csv”)
df
从 csv 文件中读取数据
数据框由名为“国家实体”的列组成。接下来,我检查在 df 数据框架和欧洲地理数据框架中列出的国家。
检查组成 df 和欧洲的国家名单和数量
我看到欧洲的国家比德国多。从 df,我只保留了同时出现在欧洲的国家。我还在 df 中只保留了 2000 年、2005 年、2010 年、2015 年和 2020 年的值,我想把它们可视化。我还将 df 转换为数据透视表,然后使用国家名称作为索引,五年作为列,转换为数据框架。
处理后的数据帧
接下来,我创建了另一个名为 selected_countries 的地理数据框架,作为 europe 的子集,它只包含 df 中的国家。我将来自 df 的排放强度值合并到选定国家中。
selected_countries=europe[europe.name.isin(list(df.name))]
selected_countries=selected_countries.merge(df,on=”name”,how=”left”)
将它们放在一起
我的目标是设想从 2000 年到 2020 年每五年欧洲发电的排放强度。为了在所有年份的地图上有一个统一的颜色范围,我选择所有年份和所有国家的最小和最大排放强度值作为变量的范围。
#Range of Variable you see as map color. Here I select the minimum and maximum of all the years selected.vmin=selected_countries[[“2000”,”2005",”2010",”2015",”2020"]].min().min()
vmax=selected_countries[[“2000”,”2005",”2010",”2015",”2020"]].max().max()
我在两行三列中创建了六个支线剧情,五个剧情对应五个不同的年份,第六个是一个空画布,上面画着一个问号,表示未来会怎样。组合地图的标题被指定,并且行之间的间距也被调整。
对于每个支线剧情,我用白烟色的欧洲地理数据框作为画布。在这个画布上,我绘制了特定年份的排放强度值,这些值来自 selected_countries 地理数据框架,颜色图(cmap)设置为“红色”。地图颜色的变量范围对所有支线剧情都是一样的。
增加了一个共同的颜色条,因为所有支线剧情的范围都是一样的。颜色条(cax)将被绘制到的轴是由我自己定义的。matplotlib . cm . scalar maptable()参数通过定义颜色图(此处为 cmap = " Reds ")并将变量的归一化范围取为[0.0,1.0]区间来描述颜色条。
#Create subplots with 2 rows and 3 columns
fig,axs=plt.subplots(2,3)
fig.suptitle(“Emissions Intensity from electricity generation in Europe 2000–2020”, fontweight=”bold”,fontsize=15)#Adjust space betweeen rows
plt.subplots_adjust(bottom=0.2, top=0.9, hspace=0.25)axs[0,0]=europe.plot(color=”whitesmoke”,edgecolor=”black”,ax=axs[0,0])
selected_countries.plot(“2000”,cmap=”Reds”,edgecolor=”black”,ax=axs[0,0], vmin=vmin, vmax=vmax)
axs[0,0].set_title(“2000”)
axs[0,0].xaxis.set_visible(False)axs[0,1]=europe.plot(color=”whitesmoke”,edgecolor=”black”,ax=axs[0,1])
selected_countries.plot(“2005”,cmap=”Reds”,edgecolor=”black”,ax=axs[0,1], vmin=vmin, vmax=vmax)
axs[0,1].set_title(“2005”)
axs[0,1].xaxis.set_visible(False)
axs[0,1].yaxis.set_visible(False)axs[0,2]=europe.plot(color=”whitesmoke”,edgecolor=”black”,ax=axs[0,2])
selected_countries.plot(“2010”,cmap=”Reds”,edgecolor=”black”,ax=axs[0,2], vmin=vmin, vmax=vmax)
axs[0,2].set_title(“2010”)
axs[0,2].xaxis.set_visible(False)
axs[0,2].yaxis.set_visible(False)axs[1,0]=europe.plot(color=”whitesmoke”,edgecolor=”black”,ax=axs[1,0])
selected_countries.plot(“2015”,cmap=”Reds”,edgecolor=”black”,ax=axs[1,0], vmin=vmin, vmax=vmax)
axs[1,0].set_title(“2015”)axs[1,1]=europe.plot(color=”whitesmoke”,edgecolor=”black”,ax=axs[1,1])
selected_countries.plot(“2020”,cmap=”Reds”,edgecolor=”black”,ax=axs[1,1], vmin=vmin, vmax=vmax)
axs[1,1].set_title(“2020”)
axs[1,1].yaxis.set_visible(False)axs[1,2]=europe.plot(color=”whitesmoke”,edgecolor=”black”,ax=axs[1,2])
axs[1,2].set_title(“Future?”)
axs[1,2].yaxis.set_visible(False)# add colorbar
cax = fig.add_axes([0.92, 0.2, 0.03, 0.7]) #[left, bottom, width, height]
sm = plt.cm.ScalarMappable(cmap=’Reds’, norm=plt.Normalize(vmin=vmin, vmax=vmax))
# fake up the array of the scalar mappable.
sm._A = []
lgd=fig.colorbar(sm, cax=cax).set_label(“gCO$_2$e/kWh”, rotation=0,y=1.05, labelpad=-35)plt.savefig(“Emissions Intensity over the past two decades.jpeg”,
dpi=300)
plt.show()
结果图如下所示。有六条副曲线,五条副曲线分别代表 2000 年、2005 年、2010 年、2015 年和 2020 年的排放强度,第六条是一个空画布,上面有一个未来可能会发生什么的问号。所有前五个支线剧情都有一个共同的颜色条,其值在 10 到 1100 gCO₂/kWh.之间类似地,一些国家(如挪威、乌克兰、白俄罗斯和瑞士)出现在欧洲地理数据框架中,但这些国家的数据在*选定国家中不可用。因此,这些国家的颜色是基于欧洲的白烟,*表示空值。如果数据可用,那么使用与上述相同的方法可视化这些国家的排放强度是可行的。
过去二十年欧洲发电排放强度的地理绘图
评估排放强度趋势和 2020 年现状
如果仔细观察上面的剧情,可以注意到每五年支线剧情对比的细微变化。例如,如果观察每个支线剧情中的西班牙地图,颜色对比在每隔一个支线剧情中变浅。这意味着在五年的时间间隔内,西班牙发电的排放强度逐渐降低。同样,相对于 2000 年的支线剧情,2020 年的支线剧情要轻很多。这意味着在过去的二十年里,欧洲的排放强度值总体上已经显著下降。
2020 年欧洲发电的排放强度
欧洲各国的排放强度值差异很大。例如,在 2020 年,排放强度值的范围在 10 到 725 gCO₂/kWh 之间,如上图中颜色条的范围所示。根据对 2020 年烈度值的观察,这些国家可分为三类:
- 更高的排放强度:波兰、爱沙尼亚和希腊等国家的排放强度值更高(大于 500 gCO₂/kWh )
- 中等排放强度:英国、德国和荷兰等国家的中等排放强度值在大约 100 到 500 gCO₂/kWh 的范围内
- 较低的排放强度:瑞典、法国和澳大利亚等国家的排放强度值要低得多(小于 100 gCO₂/kWh).
强度值差异的原因可以用这些国家的发电组合来解释。根据国际能源署(IEA)的数据,排放强度较高的国家(波兰、爱沙尼亚和希腊)的发电组合以化石燃料为主,主要是煤,燃烧时会释放更多的 co₂[2]。
可再生能源技术的成本,如太阳能光伏、陆上风能和海上风能,在过去的十年里已经大幅下降[3]。随着支持政策的到位,在英国和德国,可再生能源的份额已经增加到一半左右,取代了煤炭在燃料组合中的地位[2]。从煤炭转向天然气也有助于降低英国的排放量,因为天然气的排放强度低于煤炭。
核能也是一种低碳技术,历史上一直是法国电力的主要来源。目前,法国约四分之三的电力来自核能,其次是水力、风力和天然气[2,4]。这解释了为什么法国的排放强度值较低,大约相当于 2020 年的 55 gCO₂/kWh。最后,水电和核能在瑞典的电力组合中各占近 40%的份额,其次是风能、生物质能和废物[2]。因此,在选定的欧洲国家中,瑞典的发电排放密度最低,约为 10 gCO₂/kWh.
欧洲选定的六个国家排放强度的变化
结论
欧洲电力部门的去碳化是欧洲经济的前沿。过去 20 年来,发电的排放强度有所下降,甚至在新冠肺炎引发经济危机之前,这一下降速度就已经明显加快。可再生能源支持机制的引入和成员国逐步淘汰化石燃料发电的决定是排放和排放强度趋势的主要驱动因素[5]。
通过结合 Python 中不同包的优势来分析数据,可以产生各种有用的见解。在本文中,geopandas 和 matplotlib 软件包被用来可视化欧洲发电排放强度的趋势。然而,该方法也可用于在不同国家和地区的地图上显示不同的指标。
正如我在本文开头提到的,数据提供证据。利用适当的工具和技术,以正确的方式评估数据,对于从数据中获得洞察力至关重要,这可以成为循证决策的基石。
参考文献
[1]联合国环境规划署,排放差距报告(2020 年)。【2020 年排放差距报告| UNEP —联合国环境规划署
[2]国际能源机构,《数据和统计》(2021 年)。数据&统计— IEA
[3]国际可再生能源机构,2019 年可再生能源发电成本(2020)。【irena.org 2019 年可再生能源发电成本
[4]世界核协会,《法国的核电》(2021 年)。【法国 法国核能|法国核能—世界核协会(world-nuclear.org)
[5]气候分析,欧盟电力部门的脱碳途径:政策框架、主要驱动因素、案例研究和情景分析:与巴黎协定(2020 年)保持一致的经验教训。sgccc _ ca _ report _ eu _ power _ sector-2020–11–30 . pdf(climateanalytics.org)
佐治亚理工学院 OMSA 分校 vs 德克萨斯大学 MS 数据科学
两个顶尖的以数据为中心的研究生院项目的比较。
介绍
在一个有无限选择的世界里,选择合适的研究生院来为你的数据专业人员职业生涯做准备可能会令人瘫痪。虽然读研并不是每个人的最佳选择,但它是一条值得许多人考虑的道路。在为大数据时代做准备的技术学位领域,这两个硕士项目在众多选项中脱颖而出。我选择双击这两个项目有三个主要原因:学校排名、支付能力和灵活性。
原因 1:学校排名
虽然学校排名不是选择学校的最重要因素,但它确实为更严格的项目提供了保证。接受挑战和学习技能对于在科技行业长期发展非常重要。不太严谨的学位会让你远离技术性更强的职位,也不会让你为面试做好充分准备。技术职位经常在面试中测试你的技能,尤其是在更理想的公司。
排名较高的学校更有可能聘请各自领域的专家担任教授,并拥有更强大的同行群体。你的同学越聪明、越有抱负,你从这个项目中学到的就越多。根据你的来源,这两个项目通常都排在美国计算机科学系的前 20 名。《美国新闻》将佐治亚理工学院和德克萨斯大学分别列为最佳计算机科学(CS)学校的第八名和第十名。
原因 2:负担能力
绝大多数为你成为数据专家做准备的研究生课程都非常昂贵,尤其是如果你专注于排名更高的课程。KDnuggets,一个受欢迎的技术资料来源,发布了两个奇妙的可视化结果,通过 CS 排名和成本总结了顶级程序。这些顶级项目的平均学费约为 40,000 美元。你会注意到佐治亚理工学院 OMSA 项目以 9900 美元的价格脱颖而出,成为最实惠的选择之一。因为德克萨斯大学 MS 数据科学项目刚刚在 2021 年初开始,所以它没有出现在这些可视化上。然而,我可以想象他们会被安排在佐治亚理工学院附近,因为他们的学费只有 10,000 美元。
KDnuggest Viz #1: 2019 年数据科学和分析最佳硕士——在线
KDnuggest Viz #2: 分析、商业分析、数据科学领域的顶级在线大师——更新
原因 3:灵活性
在线教育的浪潮使得学习任何东西都变得容易得多,只要你有互联网连接。这两个程序都有在线选项。这为个人选择其地理区域之外的学校提供了灵活性,并使您更容易调整您的时间表,因为您可以异步工作。
来源: Unsplash
课程结构
许多数据专业人员的招聘信息会将技术学位和技能与不顾后果的放弃放在一起。未来的学生负担不起(双关语)以同样的方式处理他们的决策过程。深入到这两个项目中,他们正在为学生准备略有不同的职业道路选择。
正如我之前在另一篇文章中所述,佐治亚理工学院 OMSA 项目是“跨学科”的,侧重于分析领域的广度。必修课程涵盖广泛的主题,包括金融、会计、面向对象编程、数据分析、机器学习、统计学、web 开发、云计算、数据清理、脚本语言和数据可视化。他们的“专业”更多的是为了展示,而不是他们之间的实际差异,因为他们只占该计划的 6/36 学分。因为这个项目涉及如此多的主题,机会成本就变成了在任何一个特定主题上缺乏深度和专业性。专业化和深度的主要机会来自最后的顶点项目。
OMSA 项目强调分析和数据科学领域的广度,而德州大学数据科学项目则强调深度。整个项目专注于机器学习、算法、统计、数据分析和可视化。他们为个人分析、预测和解释数据做准备。在数据已经在一个已建立的系统(即数据工程、数据产品开发、API 等)中进行工程化之后,这些技能集对于操纵数据和从数据中获取洞察力非常有用。).
这两个项目的课程结构有几个主要区别:
- OMSA 有一个顶点工程,而 UT 没有
- UT 有一门算法课程,涵盖了更基础的计算机科学主题,而 OMSA 的数据分析计算入门课程更侧重于操纵数据
- UT 在构建预测模型方面更深入
- OMSA 包括更多的数据工程科目和课程(例如,大数据技术、云、数据库模型)
- OMSA 将更多的商业课程列为必修课
职业道路
随着更多的课程和专业化,OMSA 计划为数据专业人员提供了更广泛的职业道路。因为每个人都有不同的背景,所以很难推断你一毕业就能胜任哪些职位。然而,如果你用 OMSA 计划增强你目前的技能,它会让你走上追求最数据职业生涯的正轨。在我看来,一个拥有 OMSA 学位和零年工作经验的毕业生,符合你典型的寻找 3-5 年工作经验的分析职位的要求。示例包括数据分析师、高级数据分析师、商业智能工程师、初级数据科学家和数据科学助理。如果你用自己的经验增加学位,那么你可以很容易地胜任更高级别的职位,如数据科学家、分析经理或数据产品经理。然而,大多数毕业生将而不是有资格获得更专业的数据科学、人工智能或数据工程职位(例如,应用科学家、机器学习研究员、数据工程师、机器学习工程师)。总的来说,做好计划的学生可以稍微修改计划,以便更加重视大多数数据专业职业道路。
通过 UT 数据科学计划,他们为您准备了更专业的数据科学职业道路。由于更加强调预测建模,它们将把你引向任何不需要博士学位的数据科学职业的正确轨道。这些职业将强调建立、优化和解释机器学习和统计模型。一些例子包括高级分析师、数据科学家、应用科学家、机器学习研究人员、决策科学家和统计学家。该计划没有为更多强调业务/领域知识或数据工程的大多数职业做好充分准备(例如,商业智能工程师、分析经理、数据产品经理、数据工程师)。
其他因素
显然,上面的讨论并没有解决你对这两个项目的利弊清单上的所有问题。在做出决定之前,还有一些问题需要考虑:
- 存在更长的时间会给 OMSA 带来优势吗,因为他们这些年来一直在进步?
- 如果你经常在 OMSA 的商业、统计和编程之间转换,科目的广度会不会让你更难学习材料?如果每学期只上一门课,情况会更糟。
- 你更喜欢职业选择上的灵活性(如 OMSA)还是认为专业化(如 UT)会让你在招聘过程中更有优势?
- 您更喜欢亚特兰大或奥斯汀地区的强大网络?
- 通过顶点项目深入研究特定问题有多重要?
- 哪些数据专业职业在 3-5 年内会有更高的需求?
快速警告
在你因为这两个项目价格低廉而选择其中一个之前,你确实需要考虑潜在的不利因素。更低的成本通常意味着更高的师生比。这意味着教学质量可能比那些能负担得起雇佣更多资源的项目更差。如果 UT 数据科学项目类似于我在 OMSA 的经历,那么你的大部分学习将是自学的。你主要是为学习环境的结构和学位买单。
来源; Unsplash
建议
-
我们无法预测数据科学和分析的未来会如何发展;然而,在可预见的未来,理解如何操作和解释数据可能是一项有用的技能。这两个项目都将为数据专业人员打开新的机会之门。如果你一直有统计学的诀窍,喜欢建立预测模型,不喜欢分析的“商业方面”,那么 UT 数据科学课程可能是更好的选择。然而,如果你更喜欢更好地理解分析和数据科学的广阔前景,并希望在职业选择上更加多样化,那么 OMSA 计划就是你的选择。作为一名数据专业人员,我完全知道我只是做了大量的假设,并将我的 n=1 经验推广给其他人。我的建议不会对每个人都完美,但对大多数人来说方向是正确的。如果你对你的职业有任何疑问,我的大门永远为你敞开。
- 数据通才
*价格仅包括学费
佐治亚理工学院的 MS 分析程序:我的评论第二部分
来源: Unsplash
在写完我对 OMSA 项目的第一篇评论后,许多未来的和现在的学生联系了我。因为这个项目吸引了来自各种背景的学生,所以提供适用于每个人的建议可能具有挑战性。以下是我收到的一些最常见的问题,以及我试图回答的问题。
OMSA 适合我吗?
如果你阅读他们学位概述页面上的项目描述,他们会用“跨学科”这个词。我认为这是这个项目最完美的词汇选择。本课程涵盖的主题范围来自各种各样的学科。必修课程涵盖金融、会计、面向对象编程、数据分析、机器学习、统计学、web 开发、云计算、数据清理、脚本语言和数据可视化。这个高技术项目的重点是广度而不是深度。如果这听起来有吸引力,那么这可能是你的计划。然而,如果你想成为专家,专攻其中任何一门学科,有比这个项目更好的选择。
虽然这个项目强调广度,但不要低估材料的难度。精通商业、计算机科学和统计学绝非易事。通常情况下,个人会在本课程所涵盖的至少一门学科上苦苦挣扎。如果你担心这个学位的技术难度,我建议你在入学前提高自己的技能,或者考虑其他项目。其他在线定量硕士学位包括数据科学、应用经济学、统计学、计算机科学、商业分析和 MBA:分析集中。大学商学院的分析课程在数学和计算机科学方面可能不太严谨。
我应该选择哪个 OMSA 专业?
完成必修课程后,有 3 个专业可供选择。专业化这个词有点误导,因为这个项目的大部分对每个学生都是一样的。只有 6/36 学分是为该专业定制的;否则,其余的是必需的或由您决定。您可以用以下内容快速总结这三个专业化:
作者图片
虽然难度有点主观,但我想大多数学生都会同意我的评估。计算机科学课程往往需要每周最多的工作时间。
你会推荐特定的课程顺序吗?
这个项目涵盖了这么多不同的学科,要决定合适的上课顺序是很棘手的。在做决定时,有许多可变因素需要考虑。在你制定理想的 2-4 年研究生计划之前,这里有几个问题需要回答。
你一学期可以上多少课?
平均工作量从每周 8-20 小时每 3 学分不等,视课程而定。您需要根据班级期望考虑哪些班级可以配对。你个人的时间投入将不同于平均水平,这取决于你在该领域的技能水平。例如,如果你在统计学方面有很强的背景,那么你可能会承担低于平均水平的统计学课程时间。
每学期开设哪些课程? 夏季学期比秋季和春季学期短。因此,他们只提供进度较快的课程,这是全部课程的一个子集。因为他们跑得更快,每周的平均工作量比平均水平高 20%。
哪些班级最适合在附近上课?
把两个相关的学科拿得很近要容易得多。就我个人而言,在完成《数据分析计算入门》之后,我处于编程技能的巅峰。我希望在这门课结束后,我马上去上最难的计算机科学课程,数据和视觉分析。你应该考虑哪些课程可以很好地作为互补主题。
OMSA 项目值得吗?
为了确定价值,你需要估计项目的成本和完成项目的预期回报。该计划的货币成本为 13,000 美元*,但完成该计划的人工成本为 2,160 小时**。就可比的研究生学位而言,这个项目的学费是最低的。然而,如果你认为证书主义在社会中的价值正在减弱,有更便宜的选择来学习这种材料(例如 Coursera 、免费在线资源等)。).如果学费不是你关心的问题,时间投入应该是。如前所述,该计划是关于分析空间的广度,而不是深度。如果你希望成为分析子集的专家,比如实验、人工智能或数据工程,那么你的时间最好花在其他地方。
图片作者:ROI =利润/(人工+学费)
从回报的角度来看,该项目主要提供两样东西:一个结构化的学习环境,以及至少一个入门级的数据分析职位。该计划提供了一个深思熟虑的教学大纲,由各自领域的专家教授大多数课程。作业是有组织的,通常会有自动评分系统,以便及时反馈。该环境包括多种沟通模式,以寻求任务方面的帮助,包括 Piazza 、Slack 和办公时间会议。通读 Piazza 上的几十个帖子来寻找解决某个特定问题的提示可能有点混乱。这是关于他们在多大程度上促进了你的学习。你会注意到我没有在上面任何地方提到讲座。它们可能被击中,也可能未击中,这取决于课程。许多讲座的水平如此之高,你最好完全跳过它们。一些讲座或作业会包含有用的链接;然而,你的大部分学习是在 GT 环境之外通过你自己的研究(又名谷歌搜索)进行的。从回报的角度来看,你从这个项目中获得的知识很大程度上取决于你对学习材料的投入,而不仅仅是获得一个学位。
转到大多数人参加研究生项目的主要原因,工作机会。我不需要重申数据分析技能非常受欢迎。随着每个行业对技术的依赖越来越大,我看不到计算机科学和统计技能没有市场的未来。人工智能只会增加我们对这些技能的依赖,因为每个自动化过程都需要安装和持续维护。因为有这么多类型的人报名参加这个项目,所以很难说这个学位能在多大程度上帮助你找到你想要的工作。在我看来,一个拥有 OMSA 学位和零年工作经验的毕业生,符合你典型的寻找 3-5 年工作经验的分析职位的要求。示例包括数据分析师、高级数据分析师、商业智能工程师、初级数据科学家和数据科学助理。然而,如果你想在一家顶级公司获得这些职位中的一个或更高级的分析职位,你需要用额外的工作经验或个人项目来增加学位。
增加相当于额外 3-5 年的数据分析经验是否值得这个项目的成本,取决于您自己。我认为这个项目对那些至少符合以下标准之一的人来说是最有价值的:
- 一位有一定定量/编程背景的经验丰富的专业人士,希望将职业生涯转向数据分析
- 一位经验丰富的分析专业人士,希望将自己的职业发展提升 3-5 年
- 需要结构来促进学习的学生
- 不怕需要坚持的复杂问题的学生
- 不想专攻特定数据分析或数据科学学科(如人工智能、机器学习工程、数据工程、数据可视化等)的有经验的专业人士。)
(每学分 275 小时 36 学分)+((每学期 194 + 107 费用)* 9 学期)
**(每 3 学分每周 12 小时每学期 15 周) (36/3 三学分块)
我该如何准备这个节目?
如果你决定申请并参加这个项目,你需要确认你已经准备好了材料。入学要求在为学生准备这个项目方面是次优的。为了在这个项目中取得成功,我建议在数据分析、数学和计算机科学方面拥有一定的经验。
你应该熟悉的数据分析主题和工具:
- 结构化查询语言
- 擅长
- 数据可视化
- 数据清理
- 数据分析
在数学方面,你应该熟悉以下内容:
- 微积分-积分,导数,函数,极限
- 统计学—假设检验、p 值、置信区间、抽样
- 概率分布,误差
- 线性代数-矩阵,矩阵运算,向量,方程组
至于计算机科学,你应该在这个项目之前完成相当于两门严格的本科计算机科学课程。严格意味着他们要求每 3 学分每周 10 小时以上。你需要成为至少一门面向对象编程语言的中级程序员。这包括调试和诊断代码中的问题的经验。熟悉 web 开发也会有所帮助。最重要的是,你需要一个永不满足的胃口来解决困难的问题,这些问题很少在第一次尝试中就能解决。
重新评估城市结构的地理空间分析
利用 Geohash 和数据科学模型解决当前城市结构导致的交通拥堵和空间不平等问题
图片来自Unsplash.com
背景
在当今的科技时代,位置数据对一些科技公司的业务运营至关重要。通过使用户能够将他们的设备位置与公司的平台联系起来,数据团队可以使用可用数据构建模型和洞察报告。这种情况可以是基于位置需求的价格设置或按城市的可视化销售覆盖。在处理这些数据时,我不禁想象出商业之外的潜在用例。作为一名城市爱好者,想到的第一个用例是为解决城市地区的交通拥堵和空间不平等提供见解。
交通拥堵会产生如此高的社会经济和环境成本,从降低劳动生产率到增加碳排放。对于雅加达这样的城市,每年交通拥堵的成本高达 45 亿美元(Roberts,2019)。这也值得全球关注,因为它加剧了气候变化。空间不平等可以定义为优质公共产品和服务的不平等分配,如交通、医疗和教育。在城市地区,它导致生活质量的差异,犯罪率上升,城市人口的总体幸福指数较低(Glaeser 等人,2009 年)。
仔细观察,交通拥堵和空间不平等都是城市结构、土地使用安排和连接程度的结果。缺乏交通便利性、主干道、靠近工作地点和便利设施将迫使居民使用私人车辆进行长途通勤。与此同时,那些没有私人车辆的人将很难进入这些地方,从而减少了他们创收的机会。一些家庭可能会因为距离近而搬到经济活跃地区的非正规住区。这是不平等的一个例子。
根据上一段陈述的问题,我定义了两个基本解决方案:改善服务水平低下的社区的可及性增加城市便利设施的分布。当前的技术可以用来为当地决策者提供见解,以确定每个地区的正确解决方案。这些见解不仅可以显示这些地区的迫切需求,还可以用来制定资助计划。****
在这篇文章中,我将讨论地理空间分析的使用,特别是 geohash,以获得改善城市结构的见解和建议。在进入技术细节之前,我们首先需要在经济活动方面接受跨地区的相互依赖。
城市经济中的结构性相互依赖
为了确定地理空间分析模型,我们需要了解城市经济是如何运作的。根据 Hewings (2021),城市经济的特点通常是对一组地区或区域的粗略了解。然而,更深入地看,各区域之间有很强的相互依赖性。对芝加哥大都市的详细分析显示了商品和服务、人员流动(通勤者)和家庭支出流动(购物)方面的强大贸易关系。这揭示了地区之间在收入分配和消费支出方面的互惠经济效应。
潘等人(2018)的早期研究重新评估了城市结构和土地利用模式,以芝加哥为例,分别使用胡佛数据目录、美国人口普查、和道路密度地图的数据,基于就业、人口、指示名胜(poi)的评论和可达性吸引力。一个关键的发现是,居民被吸引到具有高可达性和“生活质量”便利设施或名胜古迹的地方。这显示了到中央商务区(CBD)模型的距离的偏差,这是吸引力的主要衡量标准。其他发现表明,新企业更喜欢在 CBD 内远离现有竞争对手的位置,创造新的就业中心。我从这篇文章中得到的主要结论是:便利设施的可达性和空间分布是住宅区的重要元素。前者使居民能够获得创收和/或就业机会,而后者表明生活质量。Hewings 的方法可以用作地理空间分析项目的框架,这将在下一节中讨论。
地理空间分析的应用
Hewings 的研究启发我看一眼印度尼西亚万隆的建筑,我大半生都在这个城市度过。像东南亚大多数主要城市一样,万隆有着浓厚的购物中心文化。购物中心可以被视为主要的休闲设施或兴趣点,其位置反映了该地区的发展水平。其商业活动的密度产生了大量的就业机会。因此,商场的分布可以被认为是空间公平的一个指标。为了得到一个大概的了解,我简单地在谷歌地图上搜索了“万隆的购物中心”。从下图中,我们可以看到所有的商场都位于城市的西侧。此外,我们可以看到,只有两条主要道路将这些地区连接到东侧(用红框标出),其中大部分是住宅区。这是一个明确的指标,表明城市目前的结构已经产生了拥挤和空间不平等的问题。从个人经验来看,这些道路以及通往商场的道路在上下班高峰期和周末都非常拥堵。通过观察也可以看出东西方整体繁荣程度的反差。万隆政府确实在寻求将其单核结构转变为双核结构,因此地理空间分析可能会大有用处。
印度尼西亚万隆的商场分布(图片由作者提供,由谷歌地图生成)
为了构建更强大的分析,可以使用 GIS 工具来显示高峰时段的道路拥堵情况。相关数据可以从众包平台、谷歌地球图像或其他可用的政府数据中提取。为了捕捉不平等指标,从卫星图像生成的夜灯数据集目前正被用于经济发展分析。夜灯的密度表明更高的经济活动,因为它是实时的,用户也可以分析运动来表明增长。后者将有助于衡量政策干预的成功。
从理论上讲,这是城市规划者面临的一个普遍问题,因为东区通常被用作制造区,以减轻气流引起的烟雾运动。由于发展和结构转型之间缺乏同步性,再加上人口增加,像东万隆这样的地区没有足够的基础设施来为居民提供无障碍环境和吸引企业。为了确定克服这一问题的正确行动,地方政府和发展实践者可以利用地理空间分析工具在社区层面产生洞察力。
使用 Geohash 作为分析的主要维度
我发现一个非常有用的工具是 geohash,它将一个位置坐标(经度和纬度)定位到一个矩形单元中,该单元用一个简短的字母数字字符串表示。geohash 的大小可以很容易地从 1 到 12 的精度级别进行调整,换句话说,更多的字符会生成更低的地理级别。当在地图上可视化时,geohashes 形成一个网格,便于用户获得洞察力(明尼阿波利斯的例子可以在这个链接中找到)。我最常用的级别是 7 和 6,可以分别定义为街区和子区。这些地理哈希的样本可以在下面的图片中找到。这些是通过将特定的位置坐标(我指的是万隆的一个受欢迎的购物中心)输入到活字字体网站生成的。这个网站有助于检查 geohash 覆盖率,它还提供了 JavaScript 源代码,也可以在 Github 上找到。SQL servers 上还有用于转换经度和纬度数据的内置函数,这使我们能够在数据转换后编写简单的聚合查询。
Geohash 7 网格示例(图片由作者提供,由可移动字体脚本生成)
Geohash 6 网格的示例(图片由作者提供,由可移动字体脚本生成)
由于 geohash 是一种显示位置的便捷方式,因此可用作分析城市结构中可达性和空间分布的主要维度。Geohash7 可用于可访问性是所有邻域的重要要求。对于空间分布,geohash 6 将更适合,因为便利设施/兴趣点和其他就业中心可以服务于更广泛的居民。
geohash 的局限性在于,由于其格网形式,它不能根据行政区域的大小进行定制。根据人口密度的不同,区、县或自治市的大小也不同。对于某些行政办公室所需的更精确的分析,GeoPandas 将是一个更可行的工具。这个数据科学库使用从点和多边形派生的几何列。位置坐标,经度-纬度,可以转换成这种几何数据格式。在此链接中可以找到显示俄亥俄州哥伦布市犯罪率热图的用例示例。
易接近
无障碍的主要促成因素是道路和公共交通基础设施。作为城市网络的主干,社区与主要道路和公共交通节点的良好连接至关重要。要分析公共交通覆盖的充分性,我们只需向包含每个公交车站和火车站的经度和纬度的数据集中添加一个 geohash 列。这通常可以在当地交通部门的数据库或档案中找到。从这里,我们可以生成一个地图,显示每个 geohash 网格中的公交车站的可用性。为了确定为没有公交车站的格网提供服务的紧迫性,我们可以像 Hewings 等人所做的那样,将 geohash 列与人口普查数据中的人口数据集连接起来。Python 库(如 polygon-geohasher)可用于创建可视化。这种方法可应用于道路基础设施,即获取格网到主干道坐标的距离。
对于许多城市,尤其是发展中城市,基础设施不足对利益相关者来说可能已经很明显了。主要挑战是缺乏提供所需基础设施的资金,因为大多数地方政府的财政能力有限。基础设施项目不仅需要高额的建设、运营和维护成本,而且还要承受征地成本。为了提供一种替代解决方案,一种越来越广泛用于这种情况的机制是土地价值捕获(LVC)。这基本上是一种为交通基础设施融资的方法,通过获取因可达性提高而产生的土地附加值(Medda,2012)。只有受益人(居民或私人开发商)以改善税或开发费的形式预付款项,才能享受基础设施项目创造的无障碍环境。
机器学习算法可以用来计算潜在的提升。第一步是通过导入土地价值数据库在 Python 笔记本中创建数据框,该数据库通常用于税收计算。在这里,我们可以使用线性回归建立一个预测模型,根据基础设施类别,将到主要道路和/或公共交通节点的距离作为主要属性。为了预测计划项目的价值提升,我们可以创建一个模拟列,假设它当前存在。结果将揭示项目周围地质散列中的预期平均土地价值。另一种方法是使用包含最近基础设施项目前后的值的历史数据。将周边地区作为处理组,其他地区作为对照组,我们可以进行因果影响分析,以计算项目实施后的土地价值提升。
算法的结果将成为创建基于税收的价值获取方案的有用参考。这通常被称为改善税,已在波哥大实施。土地所有者根据出售或开发时的土地收益支付税款。所得资金将用于基础设施投资。另一个机制是土地整合,这在日本很受欢迎,土地所有者愿意牺牲部分土地来改善道路,以获得更好的可达性。这些计划的主要挑战是让土地所有者相信经济增长,因为它还不具体,而且往往仅限于那些有兴趣出售其财产的人。另一种方案是基于开发的,与下一节讨论的兴趣点的空间分布相关。
便利设施的空间分布
随着通过移动设备进行的社交媒体签到、评论和 GPS 导航数量的增加,有大量的数据与这个问题相关。我们可以看到,Hewings 等人可以利用 yelp.com 评论数据来衡量吸引力,我可以简单地搜索谷歌地图来获得商场分布的大致概况。便利设施不仅限于商场和餐厅,还包括公共场所、生鲜市场和诊所/医疗保健中心(这是当今的重中之重)。上述平台可以对一个地区的吸引力产生高质量的见解,例如过去两周 Instagram 上整体入住率最高的地区。另一个有趣的数据集将包含谷歌地图上的热门目的地,其中包括用户的起点。这些信息将有助于城市规划者确定吸引商业和通勤活动的区域。后者还可以揭示由不均匀的空间分布造成的拥挤。然而,这里的主要障碍是这些数据集大部分都不公开。一种可以使用的技术是抓取,从可访问的网站中提取数据。谷歌地图将是这种情况下的一个很好的平台,因为它有各种类别的评级数据。
为了开始探索性的数据分析,我们可以提取谷歌地图上每个类别前 500–1000 个地方的经度和纬度。将数据点转换为 geohash 6 后,我们可以使用一个过滤列生成一个热图,按类别显示每个网格的吸引力。该市的人口分布图也有必要作为分析的补充。理想的结果是在城市的不同部分(不包括农业和绿色空间)显示暖色。另一方面,令人担忧的结果将显示大多数暖色网格完全集中在特定区域,与人口分布相矛盾。这将导致在哪里和如何重新开发的问题。
对于第一个问题,可以应用 k-means 聚类模型来了解有吸引力的区域的特征和当前欠发达区域的倾向。换句话说,识别不太吸引人的区域与吸引人的区域具有最高水平的相似性。假设是一个地区的吸引力与主要道路、空气质量、绿色空间和人行道有关。重新开发的潜在地点(当然是以可持续的方式)将具有这些属性,但目前设施/兴趣点的数量较少。为了促进经济活动和增长,政策制定者可以给予企业税收优惠,鼓励他们在这些地方迁移或建立业务。这将吸引私营部门投资于服务不足的地区,并在长期内建立公平。
一个具有挑战性的情况是,如果这些潜在的位置也是有限的或者甚至不存在。另一种选择是简单地选择居住区附近的棕色地带,并使用 k 均值模型的关键属性作为规划框架。这将意味着这些属性,像主要道路和绿地,必须建设。这让我们回到了融资挑战和 LVC。
如前所述,除了讨论的基于税收的计划之外,还有基于发展的低消费量计划。地方政府不用向土地所有者收费,而是可以与私人开发商合作,以开发权作为激励,帮助为再开发项目(包括必要的基础设施)提供资金。简而言之,开发商不能享受来自新地点的收入,除非他们帮助投资基础设施,带来租户和消费者。这种机制已经在伦敦被用来重新开发巴特西地区,这需要地下铁路延伸。可以应用类似于可访问性的机器学习算法,更关注经济活动。结果将有助于吸引与开发商的合作。
结束语
地理空间数据可以通过多种方式进行分析,包括重新评估城市结构。有几个可用的工具可以帮助政策制定者获得关于潜在问题的见解,如缺乏无障碍环境和空间分布不均。还可以使用数据科学模型进一步分析这些见解,以论证解决这些问题的解决方案。
然而,地理空间分析实际上只是一个支持决策者的工具。根本方面在于政策、制度和市场。首先要问的问题是,决策者和市场利益相关者是否有兴趣寻求信息并采取必要的行动。主要的挑战实际上是建立变革的动力和执行行动计划。地理空间分析确实是一个强大的工具,但决定因素是消费数据洞察力的人。
进一步讨论地理空间分析的一个有趣话题是疫情。随着大量的人在家工作和网上购物需求的增加,我一直在想这些模式会在多大程度上改变后疫情时代的城市结构。这只是一个极端事件,事情很快就会恢复正常,还是技术已经证明通勤的需求减少了?地理空间分析可以帮助提供关于社交距离限制前后行为变化的见解,因为它在一些城市已经开始和停止。然而,研究结果也可能偏向于不那么脆弱/谨慎/外向的人群。然而,这样的研究应该持续到疫情之后的几年。
参考
Glaeser,e .,Resseger,m .,Tobio,k .,2009 年。城市不平等。哈佛大学肯尼学院:州和地方政府陶班中心。
赫因斯,G. 2021。可持续性与城市经济。大型网络研讨会!系列#11,印度尼西亚大学
梅达,女,2012 年。交通可达性的土地价值获取融资:综述。运输地理杂志,25 期,第 154–161 页。
潘,h,迪勒,b,陈,y,海文斯,G. 2018。对城市结构和土地利用模式的重新评估:到 CBD 的距离还是基于网络的?—来自芝加哥的证据。区域科学和城市经济学,70,215–228
罗伯茨,男,吉尔·桑德,女,蒂瓦里,S. 2019。行动起来:实现印度尼西亚的城市潜力。华盛顿 DC:世界银行
地理空间数据文件格式转换(KML、SHP、GeoJSON)
使用这些 JavaScript 实用程序。没有成本。没有安装。没有配额。(包括 HTML 实用程序文件)
在我最初的几个地理空间项目中,我不得不面对的最令人沮丧的障碍之一是缺乏将空间数据集转换为 GeoJSON 格式文件的工具。虽然有诸如在线 GIS/CAD 数据转换器| SHP、KML、KMZ、TAB、CSV、……(mygeodata . cloud)等 GIS 网站,但它们往往会对一天的上传数量加以限制:
作者截图|当我尝试使用在线工具转换空间数据文件时,我会看到一个典型的弹出窗口
另一方面,由于安装诸如 QGIS 之类的桌面应用程序只是为了文件转换*(更不用说它会占用大量磁盘空间)*是一件麻烦的事情,我决定求助于替代方案,并最终决定创建一个离线 JavaScript 实用工具,将常见的空间文件格式,如 SHP、& GEOJSON 转换为 KML & GEOJSON 可互换。
幸运的是,由于 npm 站点上的几个节点模块已经有了我所寻求的功能,我所要做的就是用 browserify 将这些 npm 包转换成普通的 VanillaJS。本质上,browersify 将节点模块的所有 JavaScript 依赖项捆绑到一个基于浏览器的 JavaScript 客户端库中,从而可以轻松导入到任何 HTML 文档中。
注意:对于任何想了解 browserify 的人,请参考下面的文章🙃
https://medium.com/weekly-webtips/import-use-npm-modules-in-the-browser-easily-e70d6c84fc31
然后在不到一个小时的时间里,我终于创建了我自己的离线空间文件转换工具,没有使用限制🤩
作者演示| SHP 文件格式到 GEOSJON 格式的转换。请注意,对于较大的文件,在选择**【转换】**之前,需要等待加载信号停止
对于希望获得上述内容副本的读者,请随意在我的 GitHub 下载该文件(单个 HTML 文件):链接或在这里试用!
关于地图工具为何应保持离线的总体评论
除了能够在有或没有互联网连接的情况下使用这些工具的显著优势之外,另一个要考虑的方面是所用数据集的保密性。无论数据集在本质上是不是空间数据集,数据分析师都有责任在处理信息(如个人居住地址的地理分布,其中可能包含也可能不包含居民的个人详细信息)时保持极度谨慎。因此,这样做的直接后果将是需要限制基于 web 的实用程序用于其数据处理的任何部分。
考虑到通过在线平台处理的任何个人数据都将面临被泄露的风险,这一部分实际上是不言而喻的,但我通过不同的场合认识的许多数据分析师经常忽略这一点。
总而言之,我个人对数据处理的立场是:
虽然 web 上部署了多种多样的数据实用程序,但最好还是小心谨慎地处理数据集。更好的是,离线处理它,以更好地保护您可能忽略的任何机密信息。
非常感谢您阅读这篇文章,希望您发现它对您的使用案例有用。如果您想了解更多地理空间相关内容,请随时关注我的 Medium 。会非常感激😀
https://geek-cc.medium.com/membership
使用闪电和光线调整更好地构建 Pytorch 模型
伊利亚·巴甫洛夫在 Unsplash 上的照片
Pytorch 是领先的深度学习框架之一,因其易用性、丰富的功能和可靠性而在研究和行业中得到广泛应用。
然而,尽管现代深度学习框架在允许快速建立模型方面做得非常好,但仍然需要大量的样板代码。
为了解决这个问题,新的库和框架正在开发中,它们旨在改善开发复杂深度学习模型的整体体验。
我们将讨论其中的两个框架,它们都可以单独与 Pytorch 一起使用,或者组合在一起快速原型化和开发新模型:
- Pytorch-lightning :通过在常规 Pytorch 代码上添加一个抽象层,提供了许多方便的特性,并允许用更少的代码获得相同的结果。
- Ray-tune :超参数调谐库,适用于任何比例的高级调谐策略。
模型开发:Pytorch 闪电
https://www.pytorchlightning.ai/
Pytorch Lightning 是一个旨在通过加快模型开发来增强 Pytorch 的框架。“多花点时间在研究上,少花点时间在工程上”
主要思想是深度学习模型共享大量样板代码,这些代码可能需要大量时间来正确编码和实现。日志记录、检查点、GPU/TPU 支持或分布式训练等功能是与模型无关的,通常会一遍又一遍地重复开发。
该框架提供了大量的功能,但这些好处是有代价的:为了使用该框架,您需要根据给定的结构开发您的模型:
class MyModel(pl.LightningModule):
def__init__(self)
def forward(self, x)
def configure_optimizers(self)
def training_step(self, train_batch, batch_idx)
def training_epoch_end(self, outs)
def validation_step(self, val_batch, batch_idx)
def validation_epoch_end(self, outs)
- 前进:与香草 Pytorch 相同
- 培训/验证步骤:从数据加载器接收输入,执行损失计算,计算指标并记录下来
- 训练/验证时期(可选):接收时期期间所有步骤的输出,以便计算整个时期的度量
- Configure _ optimizers:应该为您的模型返回一个优化器和一个调度器对象
一旦将模型重构到这个新结构中,并将数据打包到 Pytorch 数据加载器中,就可以开始了。
有许多不同的特性旨在使您的生活更轻松,因为框架是有据可查的,我将只列出我一直使用的那些:
- 在 Tensorboard 上自动登录:通过一个简单的函数调用,您可以在 Tensorboard 上记录任何指标并获得可视化效果。
- 分布式训练,GPU/TPU 支持:训练可以通过一个简单的命令行参数在不同的节点上分割,支持 TPU 和 GPU。
- 对多个数据加载器的评估:您可以将您的验证或测试数据分割成多个数据加载器(例如在 NLP 中,每种语言一个数据加载器)并单独评估性能。
- **简单的检查点和早期停止:**检查点是通过监控任何记录的指标来创建的。
- 渐变裁剪:为了避免“爆炸式渐变”干扰训练,您可以在训练器上用一个简单的参数裁剪渐变。
- 验证集区间评估:一个简单但强大的技巧,特别是对于较大的数据集,通过在每个时期对验证集进行多次评估,您可以更好地了解模型的性能,并且可以更快地迭代。如果将它与检查点结合使用,它还可以为您提供一个更好的模型。
尽管采用了强制结构,但该框架可以处理复杂的嵌套模型,并且对于多任务和多损失非常适用。已经采取了特别的措施来确保框架对训练几乎没有性能影响,它也非常健壮,到目前为止我还没有遇到任何稳定版本的错误。
一个警告是,根据我的经验,这个框架并没有真正被设计来处理复杂的训练过程,比如在同一个脚本中一个接一个地训练不同的模型。因此,如果您的用例非常奇特,那么检查您的培训过程是否得到支持可能是值得的。
请记住,该框架还很年轻,仍在积极开发中,新功能会定期添加进来。
如果你想自己尝试一下,你可以按照官方文档上的这个教程,它会经过安装和使用框架的第一步。
超参数调整:光线调整
https://docs.ray.io/en/latest/tune/
超参数调整是建立机器学习模型时必不可少的一步。虽然自己做网格搜索或随机搜索很快,但你可能想尝试更复杂的搜索算法(比如贝叶斯优化),这些算法更难编码。
Tune 是一个超参数调整库,它是更大的 Ray 框架的一部分,有助于构建和服务分布式应用。
具体来说, Tune 允许您选择一个 搜索算法 ,该算法将用于选择一组特定的超参数,以在每次迭代中进行测试。可用的算法主要包括:
- 随机搜索/网格搜索
- 贝叶斯/Bandit 优化
- 树 Parzen 估计量(超点)
- 无梯度优化
除了搜索算法,您还可以使用**试用调度程序。**调度程序从头到尾管理超参数搜索。根据调度程序,它们可以与搜索算法一起使用,也可以完全替代搜索算法。
与只关注于选择一组足够的超参数进行测试的搜索算法不同,调度器将具有元学习策略,并具有及早停止不成功的尝试、暂停、克隆或改变它们的能力。这可以通过提前终止一些试验来加速搜索,并将时间分配给更有希望的试验。
Tune 提供了一些不同的调度程序,但它们基本上是两种技术的变体:
Tune 与各种框架配合良好,为 Pytorch 和 Pytorch-lightning 提供了教程,你可以在他们的图库中找到其他框架的代码示例,如 Keras 。
结论
这两个框架都旨在通过向所有用户提供先进技术,使机器学习模型的开发更快、更方便和更强大。
作为一名软件开发人员,重新发明轮子总是很诱人的,但是如果你追求生产率,你可能更喜欢让一些库做繁重的工作,而把你的精力集中在提供更多价值的部分。
如何使用自动引导方法计算机器学习中性能指标的置信区间
实践教程
您的模型性能度量是因为“大”测试集而非常精确,还是因为“小”或不平衡的测试集而非常不确定?
橙色线显示 89.7%为平衡准确度置信区间的下限,绿色线表示原始观察到的平衡准确度=92.4%(点估计),红色线表示上限为 94.7%。(此图及所有图片均由作者所有,除非另有说明。)
介绍
如果您报告您的分类器在测试集上的性能为准确率=94.8%,F1=92.3%,在不了解测试集的大小和组成的情况下,这没有多大意义。这些性能测量的误差幅度将根据测试集的大小而变化很大,或者,对于不平衡的数据集,主要取决于它包含多少个 minority 类的独立实例(来自过采样的相同实例的更多副本对此没有帮助)。
如果您能够收集另一个类似来源的独立测试集,您的模型在该数据集上的准确性和 F1 不太可能相同,但它们可能有多大的差异呢?与此类似的问题在统计学中被回答为测量的置信区间。
如果我们要从基础人群中抽取许多独立的样本数据集,那么对于这些数据集的 95%,该指标的真实基础人群值将在我们为该特定样本数据集计算的 95%置信区间内。
在本文中,我们将向您展示如何一次计算任意数量的机器学习性能指标的置信区间,使用 bootstrap 方法,自动确定默认情况下要生成多少引导样本数据集。
如果您只想了解如何调用此代码来计算置信区间,请跳到“计算结果一节!“下面下来。
自助方法
如果我们能够从数据的真实分布中提取额外的测试数据集,我们将能够看到跨这些数据集的感兴趣的性能指标的分布。(在绘制这些数据集时,我们不会做任何事情来防止多次绘制相同或相似的实例,尽管这种情况可能很少发生。)
既然我们不能这样做,那么下一个最好的办法就是从这个测试数据集的经验分布中提取额外的数据集,这意味着从它的实例中取样,替换,以生成新的引导样本数据集。替换采样意味着一旦我们绘制了一个特定的实例,我们就把它放回去,这样我们就可以为同一个样本数据集再次绘制它。因此,每个这样的数据集通常具有一些实例的多个副本,并且不包括基本测试集中的所有实例。
如果我们在没有替换的情况下对进行采样,那么我们每次都会简单地得到原始数据集的相同副本,以不同的随机顺序进行洗牌,这将没有任何用处。
用于估计置信区间的百分点 bootstrap 方法如下:
- 生成
*nboots*
“引导样本”数据集,每个数据集的大小与原始测试集相同。每个样本数据集都是通过从测试集中随机抽取实例并替换而获得的。 - 在每个样本数据集上,计算指标并保存。
- 95%的置信区间由指标的
*nboots*
计算值中的第 2.5 个至第 97.5 个百分位给出。如果*nboots*
=1001,并且您对长度为 1001 的序列/数组/列表 X 中的值进行排序,则第 0 个百分位是 X [0】,第 100 个个百分位是 X [1000】,因此置信区间将由 X [25】到X[970]给出**
当然,您可以在步骤 2 中为每个样本数据集计算尽可能多的指标,但是在步骤 3 中,您将分别找到每个指标的百分位数。
数据集和置信区间结果示例
我们将使用上一篇文章中的结果作为例子: 如何处理不平衡的分类,而不重新平衡数据 : 在考虑对倾斜的数据进行过采样之前,尝试调整分类决策阈值 。
在那篇文章中,我们使用了高度-不平衡两类 Kaggle 信用卡欺诈识别数据集。我们选择使用一个与默认的 0.5 阈值完全不同的分类阈值,默认的 0.5 阈值隐含在使用 predict()方法中,使得没有必要平衡数据。这种方法有时被称为阈值移动,其中我们的分类器通过将选择的阈值应用于由 predict _proba ()方法提供的预测类概率来分配类。
我们将把本文(和代码)的范围限制在二进制分类:类 0 和 1,按照惯例,类 1 是“正”类,特别是不平衡数据的少数类,尽管代码也应该适用于回归(单个连续目标)。
生成一个引导样本数据集
虽然我们的置信区间代码可以处理传递给度量函数的各种数量的数据参数,但我们将专注于 sklearn 风格的度量,它总是接受两个数据参数 y_true 和 y_pred,其中 y_pred 将是二进制类预测(0 或 1),或者是连续的类概率或决策函数预测,如果 y_true 也是连续的,甚至是连续的回归预测。以下函数生成单个引导示例数据集。它接受任何 data_args,但是在我们的例子中,这些参数将是ytest
(我们在之前的文章中的实际/真实测试集目标值)和hardpredtst_tuned_thresh
(预测类)。两者都包含 0 和 1,以指示每个实例的真实或预测类。
自定义指标 specificity_score()和效用函数
我们将为特异性定义一个定制的度量函数,这只是召回负类(类 0)的另一个名称。还有一个 calc_metrics 函数,它将一系列感兴趣的指标应用于我们的数据,还有几个实用函数:
在这里,我们列出了度量标准,并将它们应用于数据。我们不认为准确性是一个相关指标,因为假阴性(将真实的欺诈错误分类为合法)比假阳性(将真实的合法错误分类为欺诈)对业务的成本高得多,而准确性认为两种类型的错误分类都是不好的,因此有利于正确分类那些真实类别为多数类别的人,因为这些发生得更频繁,因此对整体准确性的贡献更大。
met=[ metrics.recall_score, specificity_score,
metrics.balanced_accuracy_score
]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)
制作每个启动样本数据集并计算其指标
在 raw_metric_samples()中,我们实际上将逐个生成多个样本数据集,并保存每个数据集的指标:
您给 raw_metric_samples()一个感兴趣的指标(或仅一个指标)列表以及真实和预测的类数据,它获取 nboots 样本数据集并返回一个 dataframe,其中仅包含从每个数据集计算的指标值。通过 _boot_generator(),它在生成器表达式中一次调用一个 _boot(),而不是一次将所有数据集存储为一个潜在的巨大的列表。
查看 7 个启动示例数据集的指标
我们列出度量函数并调用 raw_metric_samples()来获得 7 个样本数据集的结果。为了便于理解,我们在这里调用 raw_metric_samples(),这对于使用下面的 ci_auto()获得置信区间是不必要的,尽管为 ci_auto() 指定一个度量列表(或仅仅一个度量)是必要的。
np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh,
nboots=7).style.format('{:.2%}') #optional #style
上面的每一列都包含从一个引导样本数据集(编号为 0 到 6)计算的指标,因此计算出的指标值会因随机采样而有所不同。
启动数据集的数量,带有计算的默认值
在我们的实现中,默认情况下,引导数据集的数量nboots
将从期望的置信水平(例如 95%)自动计算,以便满足由 North、Curtis 和 Sham 提出的在分布的每个尾部具有最小数量的引导结果的建议。(实际上,该建议适用于p-值,因此假设检验接受区域,但是置信区间与那些将此作为经验法则的区间足够相似。)虽然那些作者推荐尾部最少 10 个引导结果,Davidson&MacKinnon推荐 95%置信度下最少 399 个引导,这需要尾部 11 个引导,所以我们用这个更保守的推荐。
我们指定α为 1**置信水平。例如 95%的置信度变成 0.95,α= 0.05。如果您指定了一个明确的启动次数(也许是一个较小的nboots
,因为您想要更快的结果),但这对于您所请求的 alpha 来说是不够的,那么将会自动选择一个更高的 alpha,以便获得该启动次数的准确置信区间。将使用最少 51 个 boots,因为任何更少的 boots 都只能精确地计算非常小的置信水平(例如 40%的置信度,给出了从第 30 个百分点到第 70 个百分点的区间,其中 40%在区间内,60%在区间外),并且不清楚最小 boots 建议是否考虑了这种情况。****
函数 get_alpha_nboots()设置缺省的 nboots,或者根据上述内容修改所请求的 alpha 和 nboots:
让我们展示不同 alpha 值的默认 nboots:
g = get_alpha_nboots
pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02),
g(alpha=0.01, nboots=None), g(0.005, nboots=None)
], columns=['alpha', 'default nboots']
).set_index('alpha')
如果我们请求显式 nboots,会发生以下情况:
req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))
较小的 nboots 值将 alpha 增加到 0.05 和 0.40,nboots=2 被更改为最小值 51。
bootstrap 样本数据集的直方图显示了平衡精度的置信区间
同样,我们不需要通过调用 ci_auto()来获得下面的置信区间。
np.random.seed(13)
metric_boot_histogram\
(metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)
橙色线显示 89.7%为平衡准确度置信区间的下限,绿色线表示原始观察到的平衡准确度=92.4%(点估计),红色线表示上限为 94.7%。(同样的图片出现在本文的顶部。)
如何计算度量列表的所有置信区间
下面是调用上述内容的主函数,它根据度量结果的百分位数计算置信区间,并将点估计值作为结果输出数据帧的第一列插入。
计算结果!
这就是我们真正需要做的:调用 ci_auto(),如下所示,使用一个度量列表(met
在上面赋值)来获得它们的置信区间。百分比格式是可选的:
np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh
).style.format('{:.2%}')
对结果置信区间的讨论
下面是来自原文的混淆矩阵。类别 0 是阴性(多数类别),类别 1 是阳性(极少数类别)
134/(134+14)的召回率(真阳性率)具有最宽的置信区间,因为这是涉及少量计数的二项式比例。
特异性(真阴性率)为 80,388/(80,388+4,907),涉及多大的计数,因此其置信区间极窄,仅为【94.11%至 94.40%】。
由于平衡的准确性是简单地计算召回率和特异性的平均值,其置信区间的宽度介于两者之间。
由于测试数据的变化和训练数据的变化导致的度量测量不精确
这里,我们没有考虑基于我们的训练数据的随机性的模型中的可变性(尽管这对于某些目的也是有意义的,例如,如果你已经自动重复重新训练,并且想要知道未来模型的性能可能变化多少),而是仅仅考虑由于我们的测试数据的随机性而导致的这个特定模型(从一些特定训练数据创建)的性能测量中的可变性。
如果我们有足够的独立测试数据,我们可以非常精确地测量这个特定模型在底层人群中的性能,并且我们将知道如果部署这个模型,它将如何执行,而不管我们如何构建该模型,以及我们是否可以通过不同的训练样本数据集获得更好或更差的模型。
单个实例的独立性
bootstrap 方法假设您的每个实例(案例、观察结果)都是从基础总体中独立抽取的。如果您的测试集包含多组彼此不独立的行,例如,对同一实体的重复观察可能彼此相关,或者从测试集中的其他实例中过度采样/复制/生成实例,则结果可能无效。您可能需要使用分组采样,在这种情况下,您随机地将整个组集合在一起,而不是单独的行,同时避免分解任何组或只使用其中的一部分。
此外,您还希望确保没有跨训练集和测试集拆分的组,因为这样测试集不一定是独立的,您可能会发现未被发现的过度拟合。例如,如果您使用过采样,您通常应该只在从测试集中分离出来之后进行,而不是之前。通常情况下,您会对训练集而不是测试集进行过采样,因为测试集必须能够代表模型在未来部署时将看到的实例。对于交叉验证,您可能希望使用 scikit-learn 的model_selection.GroupKFold()
。****
结论
您总是可以为您的评估度量计算置信区间,以查看您的测试数据使您能够多精确地测量您的模型的性能。我计划撰写另一篇文章来展示评估概率预测(或置信度得分——与统计置信度无关)的指标的置信区间,即软分类,如 Log Loss 或 ROC AUC,而不是我们在此使用的评估模型对类别的离散选择的指标(硬分类)。同样的代码适用于这两种情况,也适用于回归(预测一个连续的目标变量)——您只需要传递给它一个不同类型的预测(在回归的情况下,传递给它不同类型的真实目标)。
这款 jupyter 笔记本在 github 有:bootconfintautov 1 o _ standalone . ipynb
这篇文章信息丰富和/或有用吗?请张贴回复(语音气泡图标在左下方,黑/白旁边👏如果您对本文或置信区间、引导、引导数、实施、数据集、模型、阈值移动或结果有任何意见或问题。
除了前面提到的前一篇文章之外,您可能还对我的 感兴趣,如何在 Pandas 中读取 CSV 文件时自动检测日期/日期时间列并设置它们的数据类型,尽管它与本文没有直接关系。
get-Git:Git 入门
说得足够快,听起来就像明白了…
多年来,它一直津津乐道于自己作为合作典范的地位。作为一名开发人员,我每天都与 Git 打交道;当事情出错时,犯错误、推遥控器和偶尔扯头发(解释了我的脱发)。最近在思考“Git 实际上是如何工作的?”,我意识到我对这种根深蒂固的软件开发方式知之甚少。不言而喻,如果我知道支配 Git 的结构/功能,那么让我猜测几个小时的许多错误有时是可以避免的。
Git 是软件开发项目的重要组成部分。它提供了,
- 跟踪 — Git 维护一个历史记录,它本质上是你的代码库随时间变化的快照
- 特性隔离——当你开发特性时,你创建了你自己的分支——你没有破坏工作/稳定版本
- 协作——现在,任何数量的开发人员都可以开发不同的功能,开发他们的本地副本,准备好了就推送到一个中央远程存储库
- 同行评审 — Git 有助于同行评审,当开发人员 A 完成特性 X 后,在将它合并到主分支之前,他可以要求开发人员 B 评审它(以拉请求的形式)
在本文中,您将了解到,
- 几个方便的 Git 命令,比如,
git add
,git commit
,git push
,git fetch
,git merge
,git pull
,git checkout
,git reset
。 - 运行这些命令时,您的代码会经历不同的阶段,如工作目录、索引、本地存储库和远程存储库。
最近我在 LinkedIN 上分享了这个工作流程
我不觉得浏览 Git 文档的数百页并被来自四面八方的术语轰炸有什么意思。因此,我创建了一个可视化 Git 备忘单,并在 LinkedIN 上分享。我看到这个 LinkedIn 帖子引起了很多人的兴趣。所以让这成为我在那篇文章中想要传达的更详细的论述。
在您当地的街区游览…
这一切都是从一串位开始的…
是的,但我们不会从那里开始。我们将从您在本地创建的代码存储库开始。现在,这可以使用git init
在我们的本地环境中创建,或者使用git clone <url to git repo>
从远程存储库中克隆。
要了解这些概念,请见见戴夫!Dave 和其他开发人员一样,和你我一样讨厌上午 9 点的会议。他创建了一个代码目录(我们姑且称之为code
),其中有三个文件a.py
、b.txt
和c.py
。
本地代码库称为工作树或 工作目录
Dave 理解 Git 的价值,然后运行git init
。这将为代码库创建一个本地 Git 存储库。您可以在code
文件夹中创建的.git
文件夹中看到这个存储库的组成。通过跟踪 Git 存储库中的代码,他知道何时何地引入了各种变更。
首先,Dave 希望将三个文件a.py
、b.txt
和c.py
添加到他的本地存储库中。这是一个双重过程。他首先呼叫git add a.py b.txt c.py
。这会将这些文件添加到索引(或索引树/缓存/暂存区)中。这是当前代码和本地存储库中的代码之间的过渡空间。换句话说,您的代码还没有被存储库跟踪。把这里想象成剧院的后台。你可以随心所欲地修改(演员、道具、剧本等)。)后台,上台前。
索引是一个空间,您可以在这里准备/存放您需要提交到本地存储库的内容。
一旦您对阶段化的更改感到满意,您就可以通过调用git commit -m <message>
将文件提交到您的存储库中。这将在存储库中记录您当前工作目录的快照(更确切地说是跟踪的文件的快照)。
提交后,代码的当前版本将作为带有时间戳和 ID 的快照记录在本地存储库中
git 添加和 git 提交的效果
在提交期间,您可以使用git status
来查看文件的状态。它将显示已转移、已跟踪但未转移和未跟踪的文件。
太好了,我们完成了第一次提交。但我们才刚刚开始开心起来。假设戴夫对a.py
和b.txt
做了一些改动。然后戴夫决定他只想将a.py
添加到索引中,而不是b.txt
(即执行git add a.py
)。这意味着工作目录中的新版本b.txt
将不会成为索引的一部分。换句话说,在这一轮中,a.py
被跟踪/索引并登台用于提交,b.txt
被跟踪但不登台用于提交。
此外,Dave 认为,c.py
不是很有用,并决定从索引中删除该文件。他可以通过调用git rm c.py
或git rm --cached c.py
来做到这一点。两者的区别在于git rm --cached c.py
从索引中只移除了文件和(并保留了物理副本)。
指数如何变化取决于你做了什么
Git 什么都看得到…
Dave 完成了两次提交,它们被记录在本地存储库中。正如我前面提到的,git 的优势之一是能够跟踪随时间的变化。这意味着本地存储库维护一个历史。历史如下所示。
我们所做的每一次提交都被记录为历史中的单个节点。每个提交都由一个哈希函数生成的唯一 ID 来区分(这是一个字母数字 ID,看起来像47970bc91aa7daec9def3...
)。你从一个单独的分支(master
)开始,随着你开发新的特性,你分叉并创建分支。例如,如果你正在制造一辆汽车,你会有一个名为feature/eject_seats
的分支。但是,一旦你意识到弹射座椅是一个坏主意,你可能会放弃那个分支,回到主分支。然后你开发feature/doors
,一旦特性完成并被测试,你将特性合并到主分支。
从本地到远程…
Dave 非常了解如何维护自己的本地存储库。但是 Git 是关于协作的。Dave 需要与团队的其他成员共享代码库,以及它随时间的变化。为此,您通常需要维护一个中央远程存储库。您可以让 Git 知道远程存储库,
git remote add origin https://github.com/smart-vroom/*car*.git
然后,Dave 将本地存储库中的更改推送到远程存储库中。假设戴夫正在处理默认分支(master
),然后戴夫打电话给git push origin master
。这将把本地存储库中的更改推送到远程存储库中。现在任何开发人员都可以看到 Dave 引入的变化。
图:Git push 将提交给本地存储库的更改推送到远程存储库。本地回购和远程回购有各自的历史
远程存储库是一个中央在线存储库,可供多个合作者查看。远程存储库和本地存储库一样有一个历史记录
约翰是个糟糕的开发人员…
戴夫是团队的一员。换句话说,戴夫对代码有贡献,约翰、安娜和蒂姆也是。开发人员越多,维护远程代码库的问题就越多。例如,约翰没有告诉戴夫,约翰也在为master
分公司工作,并承诺为master
工作,就在戴夫告诉他之前。现在戴夫无法推进远程回购。因为他没有最新版本。Dave 必须回去更新他的本地存储库和工作目录,并解决由于 John 的更新而发生的任何冲突。别担心,Git 也有答案。
现在戴夫将经历三件事
- 戴夫试图
push
,但是出错了,因为他的本地回购没有约翰提交的更新 - Dave 需要更新本地存储库以与远程 repo 同步(
git fetch
)(如下图中橙色所示) - Dave 需要将本地 repo 中的更新更改集成到工作目录中。如果 John 编辑了 Dave 编辑过的文件,这可能会导致合并冲突(
git merge
) - Dave 需要通过手动编辑冲突的文件(下图中以蓝色显示)来解决冲突,这将在下面进一步讨论。
- Dave 转移文件、提交文件并将它们推送到远程位置(下图中以蓝色显示)
解决 Git 冲突
还可以看到一个名为 git pull 的命令。它只是一气呵成地执行git fetch
和git merge
。这意味着git pull
是入侵性的,会修改你的工作目录
git pull = git fetch + git 合并
第三步中发生的事情在图的左边用灰色圈了出来。当您键入git merge
时,如果 John 编辑了一个 Dave 也编辑过的文件,很可能会导致合并冲突。假设约翰和戴夫都编辑过b.txt
。现在b.txt
有一场冲突需要解决。合并冲突后,冲突的文件看起来像来自另一个世界。
冲突后文件的外观
好吧,人们放下你们的喷火器,这很正常。它只是说<<<<<<<HEAD
和======
之间的部分是你在本地回购中拥有的。但是远程回购具有=======
和>>>>>>> AB123CDE
之间的部分(在文件的那些行中)。这里的AB123CDE
是最新的提交 ID。现在戴夫有三个选择:
- 挑选约翰的更新(只保留
yyyy
) - 保留您的更新(仅保留
xxxx
) - 将两者结合起来
取决于戴夫需要什么。但是最后,它必须产生一个有效的文件,没有合并冲突带来的语法上的麻烦。解决冲突后,您可以转移文件,提交它们并将它们推送到远程存储库。唷!好险。希望约翰将来能更多地谈论他的作品!
汽车越来越智能
戴夫的老板想让他开发一个重要的功能(feature/self_drive
),并解释了一切。几个不眠之夜的想法对戴夫来说变得很明显,因为这是一件大事。戴夫也需要一个单独的分支来处理这个功能。因为汽车没有self_drive
依然可以放行。
为此,Dave 用git checkout -b feature/self_drive
创建了一个新分支(-b
告诉 Git 这是一个新分支)。如果分支已经存在,可以做git checkout feature/self_drive
。分支是 git 历史中采用自己路径的提交流。它从一个现有的分支(比如主分支)中分支出来,您可以向它添加一系列提交,而不会影响父分支。然后,一旦您实现了该特性并对其进行了测试,您就可以将它合并回父特性(可以选择解决冲突)。
在 Git 中,分支在回购中维护。你可以通过进入.git/refs/head
目录来查看你去的所有分支。每个分支都有一个文件,只记录该分支的最新提交。
一旦您的本地开发在feature/self_drive
分支上准备就绪,您就可以使用git push origin feature/self_drive
提交远程回购。这将在远程回购中创建一个新分支(如果尚不存在)。
戴夫犯了一个错误…
戴夫回到了master
分部,他一直在研究a.py
上的几个 bug。但是,他掉进了兔子洞,再也出不来了。“让沉没成本谬误见鬼去吧”,他想,“我要用我在回购中最后一次提交的文件来重置我的工作目录”。
戴夫需要做的就是,跑git checkout master -- a.py
。它将使用本地 repo 中的快照a.py
恢复工作目录中的a.py
。如果你认为还有更高版本的a.py
,你可以先做一个git fetch
,然后再做checkout
。
用这些动作打动你的同事
也可以使用git checkout
在分支之间移动。简单说git checkout feature/eject_seats
或者git checkout feature/self_drive
。您也可以使用git checkout <commit ID>
(例如git checkout 47970bc91a
)来检查特定的提交。
如果你用
git checkout
指定一个提交,这意味着你的头和分支引用是不一样的,指向两个东西。这就是所谓的分离头。
另一个有用的命令是git reset
。git 复位有三种模式;
--soft
—影响本地回购(如果您的头处于分离模式,这很有用)--mixed
—影响本地回购和指数--hard
—影响所有本地回购、指数和工作树
比方说,Dave 需要重置索引/暂存区域,以删除他已经暂存的一些更改,但不更改工作目录。他可以用git reset --mixed HEAD
做到这一点。这里的HEAD
指的是你对回购的最新承诺。
这里有一些其他的命令会派上用场
git stash
—如果你想在工作树中暂时保存你的更新git diff
—给出两个文件的区别(如工作树与索引)git rebase
—如果您想要将您的分支的开始更新为您分支后发生的稍后提交,这是要使用的命令git reflog
—显示存储库的历史记录
结论
让我们回顾一下我们所学的内容。我们了解到,
- 为什么 Git 很重要
- 工作目录、索引、本地存储库和远程存储库之间的区别
- 基本命令如
git add
、git commit
、git push
- 解决合并冲突
git fetch
,git merge
- Git 分支及其用途
git checkout
和git reset
改正错误
我希望,如果你阅读了这篇文章,你会发现阅读关于 Git 如何工作的 Git 文档(例如 Git-scm )更加容易。
如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!
https://thushv89.medium.com/membership
通过 Docker 了解 Neo4j 和 Jupyter 实验室
当你可以两个都做的时候,为什么每次只做一个呢?
安托万·佩蒂特维尔在 Unsplash 上拍摄的照片
Docker 为数据科学家(实际上是软件中的每个人)提供了以可复制的方式共享代码的能力。我记得几年前我第一次接触它的时候。我曾经是一个使用老式虚拟桌面的人,这些虚拟桌面很笨重,仅仅凭借其架构就占用了大量内存。我第一次了解 Docker 的那一天,我是如此兴奋,以至于晚上大部分时间都醒着想着它!像一个过圣诞节的孩子一样,我收集了一大堆不同的容器,因为我可以这样做,也因为这让我对我可以在其中开发(玩耍)的所有这些伟大的新环境感到眩晕。
这让我想到了今天。当然,我可以在虚拟环境中做事,但是如果我搞砸了一些重大的事情怎么办?(想想:和 CUDA 驱动之类的乱搞。)我能够搞砸我的本地系统以及下一个人。在一个容器中完成我所有的开发可以防止我造成任何永久性的伤害。(因为你需要多长时间才能把你的 linux 环境设置好就像你喜欢的那样???)此外,我可以轻松地与其他人共享该环境,而不必担心系统和软件包的差异。它只是工作。这对数据科学家来说非常好,因为我们倾向于对 Python 包之类的东西有很多软件依赖。
这篇博客文章将是在 Neo4j 做数据科学系列文章的第一篇。用图形数据进行数据科学真的很有趣,但是我将在以后的博客文章中深入探讨这个问题。作为开始,任何可能跟进这些未来帖子的人都能够拥有和我一样的环境,这真的很有帮助。为此,您可以在 GitHub repo 中找到 Docker 容器的代码。
代码遍历
作为一名图形数据科学家,我需要能够与 Neo4j 数据库以及许多常见的数据科学工具和软件包进行交互,比如 Jupyter 笔记本。理想情况下,我希望 Jupyter 与 Neo4j 交谈时不要太大惊小怪。这就是docker-compose
的用武之地。
让我们来看看回购中的一些文件,我们将使用这些文件来完成这项工作。
首先是一个明显的requirements.txt
文件,它详细说明了基本容器之外的任何附加需求:
请注意,我有两个不同的 python 包,用于与我们将要创建的 Neo4j 数据库进行交互。第一个是官方驱动,第二个是社区写的驱动。挑你最喜欢的。
接下来,我有Dockerfile
,这只是我们在 Jupyter 的朋友推出的标准。它里面有很多很好的公共数据科学包,但是你可以随时通过pip3 list
检查安装的包。你需要的任何不在列表中的东西都应该放到requirements.txt
中。
最后,我们需要获得一个 Neo4j 实例,并在容器的 Neo4j 和 Jupyter 部分之间建立某种网络。所以这里我们要用docker-compose
:
关于这个设置的一些事情。首先,我使用的是 Neo4j 4.2.3,但显然版本号会发生变化,所以你应该考虑使用最新版本(尽管我注意到:latest
并不总是获得绝对的最新版本)。接下来,我们将打开和转发几个端口。Neo4j 浏览器使用 7474,而 7687 是 bolt 连接器,将用于数据库的 python 连接。在第 15 行,我们用密码1234
创建用户neo4j
(比这更有创意!)使用第 16 行中的内容,我们将两个重要的库导入 Neo4j,即 Cypher (APOC)上的 Awesome 程序和图形数据科学(GDS)库。这两者在我们解决数据科学问题时都非常有用。接下来,注意第 18–20 行被注释掉了。GDS 是记忆密集型的。除了默认配置之外,您还需要添加内存。这些值的确切值取决于您的本地系统,因此相应地调整它们,然后取消注释这些行。最后,我们看到我们正在端口 8888 上运行 Jupyter 容器。两个容器都通过neo_net
网络连接在一起,这样它们就可以互相对话。
运行容器
与任何 Docker 容器一样,第一步是构建它。为此,我们从命令行发出通常的命令:
docker-compose build
这将通过和组装整个事情。接下来,我们通过
docker-compose up
这将点燃容器的 Neo4j 和 Jupyter 部分。你会看到许多东西滚动而过,但其中之一将是 Jupyter 的链接,其中包含打开它所需的令牌。点击那个链接应该会在你的浏览器中打开 Jupyter。接下来,我们可以导航到localhost:7474
以进入 Neo4j 浏览器。
现在,我们应该让 Jupyter 和 Neo4j 能够相互通信。为了测试这一点,您可以在notebooks/test_db_connection.ipynb
中运行笔记本。如果运行时没有错误,就可以开始了!现在,您可以在 Jupyter 笔记本中与 Neo4j 进行交互,也可以直接从 Neo4j 网络浏览器中进行交互。
当然,一旦你完成了,你发出命令
docker-compose down
干净利落地关闭容器。不过最棒的是,因为我们已经链接了一些像notebooks/
这样的卷,我们的工作被保存在我们的本地计算机上,并且可以在任何时候再次使用。
敬请关注下一篇博客文章,通过图表了解数据科学之旅!感谢您的阅读!
在您的置信区间中获得更大的信心
什么是引导复制以及如何使用它?
彼得·H 论 Pixabay.com
什么是引导复制?
对于这里的读者来说,bootstrap 采样指的是对给定数据集进行“替换”采样的过程……这是大多数人容易迷失的地方。你取许多样本,建立一个分布来标记你的置信区间。
让我们举一个简单的例子。
大学时代的密码
比方说,你想了解大学里的普通人对加密货币的看法;嗯,你可能无法收集到学校里每个人的回应;可能会发生的是,你会分发一些调查,然后你会得到一些回复,你希望这些回复能代表大众的意见,好的或坏的。
虽然您对回答者的分布有一个清晰的概念,但您希望生成一个更能代表整个学校的实际置信区间。这就是 boostrap 复制的用武之地!
补替抽样法
到目前为止,我们知道自举复制是一种抽样方法。这里的主要思想是,当一个样本被选择时,它可以被反复选择。这用于重新创建可能实际上是由于随机机会的应答类型的随机重现。
每个引导样本被称为一个复制。在这种情况下,我们假设复制 1000 次。
一旦我们有了 1000 个重复或样本,我们现在就有了 1000 个样本平均值。
从这个分布中,我们可以得到实际的置信区间。
假设我们想要 95%的置信区间;我们将通过查看我们的 bootstrap 分布,并将 2.5 的值和 97.5 的值作为我们的区间来得到这个结果。
我们来看一些代码!
library(infer)
replicates <- crypto_opinions %>%
specify(response = opinion, success = "positive") %>%
generate(reps = 1, type = "bootstrap")replicates %>%
summarize(prop_high = mean(response == 'positive')) %>%
pull()
我们使用specify
来隔离我们关心的响应变量以及变量值决定‘成功’的因素。从那里,我们使用generate
来创建我们的第一个引导复制。您还会注意到我们将type
指定为bootstrap
。然后,我们使用汇总和拉取来生成指定级别“正”的比例。
replicates <- crypto_opinions %>%
specify(response = opinion, success = "positive") %>% generate(reps = 1000, type = "bootstrap")%>% calculate(stat = "prop")
类似于前面的代码块,我们已经将重复次数扩展到了 1000 次,现在正在链接calculate
函数。calculate
函数为对应于该复制的每个复制“stat”创建一个带有一个记录的数据帧。
ggplot(replicates, aes(stat)) +
geom_density()
上图显示了每次重复的平均结果的密度图或分布。
从这里开始,它只是一个简单的计算问题,标准偏差,并使用它来确定你的范围的顶部和底部!
Lower_bound <- mean(replicates$stat) - sd(replicates$stat) * 2 upper_bound <- mean(replicates$stat) + sd(replicates$stat) * 2
结论
我希望你喜欢这篇文章,它能为你节省一些时间!请分享什么有用,什么没用!
请随意查看我在 datasciencelessons.com 的其他帖子
祝数据科学快乐!
直接和熊猫获取互动剧情。
实践教程
使用 Pandas 绘图语法直接创建 Plotly 和 Bokeh 绘图的教程
【www.freepik.com 宏矢量制作的 T2 信息图矢量
到目前为止,数据探索是任何数据分析任务中最重要的方面之一。我们使用大量可视化工具执行的初始探测和初步检查,为我们提供了对数据本质的可操作的见解。然而,可视化工具的选择有时比任务本身更复杂。一方面,我们有更容易使用的库,但在显示数据中的复杂关系时却不是很有帮助。此外,还有一些提供交互性,但需要相当长的学习曲线。幸运的是,已经创建了一些开源库,试图有效地解决这一难题。
在本文中,我们将研究两个这样的库,即 pandas_bokeh 和 cufflinks。我们将学习如何用基本的熊猫绘图语法创建 plotly 和 bokeh 图表,我们都很熟悉。由于本文的重点是语法而不是图表类型,我们将把自己限制在五种基本图表上,即折线图、条形图、直方图、散点图和饼图。我们将首先用 pandas 绘图库创建这些图表,然后用 plotly 和 bokeh 重新创建它们,尽管有些扭曲。
目录
- 导入数据集
- 直接和熊猫密谋
- 熊猫的后端——和一起策划。
- 为熊猫绘制后端——用袖扣绘制
- 结论
资料组
我们将使用 NIFTY-50 数据集。NIFTY 50 指数是印度股票市场的基准。数据集在 Kaggle 上公开提供,但我们将使用仅包含四个行业股票价值的数据子集,即银行、制药、IT 和快速消费品。
你可以从这里下载样本数据集。
让我们导入可视化所需的必要库和数据集:
# Importing required modules
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline# Reading in the data
nifty_data = pd.read_csv('NIFTY_data_2020.csv',parse_dates=["Date"],index_col='Date')
nifty_data.head()
由银行、制药、IT 和快速消费品行业的漂亮指数组成的组合数据框架
我们还可以在月底之前对数据进行重新取样/汇总。熊猫图书馆有一个[resample()](https://pandas.pydata.org/docs/reference/api/pandas.Series.resample.html)
功能,可以对时间序列数据进行重新采样。
nifty_data_resample = nifty_data.resample(rule = 'M').mean()
nifty_data_resample
现在我们已经准备好了数据框架,是时候通过不同的图来可视化它们了。
直接和熊猫密谋
让我们从最简单的绘图技术开始——熊猫的绘图功能。为了使用 pandas 绘制一个图形,我们将在 dataframe 上调用.plot()
方法。
语法 : dataframe.plot()
plot
方法只是 matplotlib 的[**plt.plot()**](https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html#matplotlib.axes.Axes.plot)**.**
的简单包装,我们还可以指定一些附加参数,如下所述:
Some of the important Parameters
--------------------------------
**x** : label or position, default None
Only used if data is a DataFrame.
**y** : label, position or list of label, positions, default None**title**: title to be used for the plot**X and y label:** Name to use for the label on the x-axis and y-axis.**figsize** : specifies the size of the figure object.
**kind** : str
The kind of plot to produce:
- 'line' : line plot (default)
- 'bar' : vertical bar plot
- 'barh' : horizontal bar plot
- 'hist' : histogram
- 'box' : boxplot
- 'kde' : Kernel Density Estimation plot
- 'density' : same as 'kde'
- 'area' : area plot
- 'pie' : pie plot
- 'scatter' : scatter plot
- 'hexbin' : hexbin plot.
有关参数及其用法的完整列表,请参考文档。现在让我们看看创造不同情节的方法。在本文中,我们不会详细解释每个情节。我们将只关注语法,如果你有一些熊猫的经验,这是不言自明的。要详细了解熊猫的故事情节,下面的文章将会很有帮助:
https://neptune.ai/blog/pandas-plot-deep-dive-into-plotting-directly-with-pandas [## 熊猫情节:深入到直接与熊猫密谋
在本文中,我们将了解如何使用 pandas 来探索和可视化您的数据,然后我们将更深入地研究 pandas 的一些高级可视化功能。](https://neptune.ai/blog/pandas-plot-deep-dive-into-plotting-directly-with-pandas)
1.线形图
nifty_data.plot(title='Nifty Index values in 2020',
xlabel = 'Values',
figsize=(10,6);
熊猫绘图的线图
2.散点图
nifty_data.plot(kind='scatter',
x='NIFTY FMCG index',
y='NIFTY Bank index',
title = 'Scatter Plot for NIFTY Index values in 2020',
figsize=(10,6));
熊猫散点图
3.直方图
nifty_data[['NIFTY FMCG index','NIFTY Bank index']].plot(kind='hist',figsize=(9,6), bins=30);
熊猫柱状图
4.条形图
nifty_data_resample.plot(kind='bar',figsize=(10,6));
带熊猫图案的条形图
- 4.1 堆积条形图
nifty_data_resample.plot(kind='barh',figsize=(10,6));
带熊猫图的堆积条形图
5.饼图
nifty_data_resample.index=['Jan','Feb','March','Apr','May','June','July']
nifty_data_resample['NIFTY Bank index'].plot.pie(legend=False, figsize=(10,6),autopct='%.1f');
带有熊猫图案的饼图
这些是一些可以用熊猫的数据框直接创建的图表。然而,这些图表缺乏交互性和缩放、平移等功能。现在,让我们将这些现有图表的语法更改为完全交互式的图表,只需在语法上稍作修改。
熊猫后端-用熊猫绘图。
作者图片
在数据可视化方面,散景库显然脱颖而出*。**Pandas-Bokeh为 Pandas 、 GeoPandas 和 Pyspark DataFrames 提供了一个 Bokeh 绘图后端。这个后端向数据帧和系列添加了一个plot_bokeh()
方法。*
装置
Pandas-Bokeh 可以通过 pip 或 conda 从 PyPI 安装
*pip install pandas-bokehorconda install -c patrikhlobil pandas-bokeh*
使用
Pandas-Bokeh 库应该在 Pandas、GeoPandas 和/或 Pyspark 之后导入。
*import pandas as pd
import pandas_bokeh*
然后需要定义绘图输出,它可以是以下两者之一:
***pandas_bokeh.output_notebook()**: for embedding plots in Jupyter Notebooks.**pandas_bokeh.output_file(filename):** for exporting plots as HTML.*
语法
现在,熊猫数据框架可以通过dataframe.plot_bokeh()
访问绘图 API。
有关绘图输出的更多详细信息,请参见此处的参考或散景文档。现在让我们画出上一节中画出的所有五种图。我们将使用与上面相同的数据集。
*import pandas as pd
import pandas_bokeh
**pandas_bokeh.output_notebook()***
1.线形图
*nifty_data.plot_bokeh(kind='line') #equivalent to nifty_data.plot_bokeh.line()*
熊猫线条图 _ 散景
2.散点图
*nifty_data.plot_bokeh.scatter(x='NIFTY FMCG index', y='NIFTY Bank index');*
熊猫散点图 _ 散景
3.直方图
*nifty_data[['NIFTY FMCG index','NIFTY Bank index']].plot_bokeh(kind='hist', bins=30);*
熊猫直方图 _ 散景
4.条形图
*nifty_data_resample.plot_bokeh(kind='bar',figsize=(10,6));*
有熊猫的条形图 _ 散景
- 4.1 堆积条形图
*nifty_data_resample.plot_bokeh(kind='barh',stacked=True);*
带熊猫的堆积条形图 _ 散景
5.饼图
*nifty_data_resample.index=['Jan','Feb','March','Apr','May','June','July']
nifty_data_resample.plot_bokeh.pie(y ='NIFTY Bank index')*
熊猫饼图 _ 散景
此外,您还可以在同一个图中创建多个嵌套饼图:
*nifty_data_resample.plot_bokeh.pie()*
带有熊猫 _ 散景的嵌套饼图
本节讲述了我们如何无缝地创建散景图,而无需对 pandas 绘图语法进行任何重大更改。现在我们可以两全其美,而不必学习任何新的格式。
熊猫的神秘后台——用袖扣来描绘。
作者图片
另一个常用的数据可视化库是 Plotly 。使用 plotly,您可以用 Python、R 和 JavaScript 制作交互式图表。从 4.8 版本开始,plotly 为熊猫绘图提供了一个 Plotly Express 驱动的后端,这意味着人们甚至不需要导入 Plotly 来创建 Plotly 般的可视化。
*不过这里我要提到的库并不是 plotly express,而是围绕 plotly 的一个独立的第三方包装库,叫做 袖扣 **。*袖扣的妙处在于更百搭,功能更多,有类似熊猫绘图的 API。这意味着你只需要添加一个.iplot()
方法到 Pandas 数据帧来绘制图表。
装置
在安装袖扣之前,请确保您已经安装了 plotly。阅读本指南获取说明。
*pip install cufflinks*
使用
库有很多有用的例子和笔记本可以开始使用。
*import pandas as pd
import cufflinks as cf
from IPython.display import display,HTML#making all charts public and setting a global theme
cf.set_config_file(sharing='public',theme='white',offline=True)*
仅此而已。我们现在可以用 plotly 的能力和熊猫的轻松来创建可视化。语法上唯一的变化是dataframe.iplot()
。
1.线形图
*nifty_data.iplot(kind='line')*
带袖扣的线图
2.散点图
创建散点图时,需要提到散点图的模式。模式可以是线条、标记、文本或它们的组合。
*nifty_data.iplot(kind='scatter',x='NIFTY FMCG index', y='NIFTY Bank index',**mode='markers'**);*
带袖扣的散点图
3.直方图
*nifty_data[['NIFTY FMCG index','NIFTY Bank index']].iplot(kind='hist', bins=30);*
带袖扣的直方图
4.条形图
*nifty_data_resample.iplot(kind='bar');*
带袖扣的条形图
- 4.1 堆积条形图
*nifty_data_resample.iplot(kind='barh',barmode = 'stack');*
带袖扣的堆积条形图
5.饼图
*nifty_data_resample.index=['Jan','Feb','March','Apr','May','June','July']
nifty_data_resample.reset_index().iplot(kind='pie',labels='index',values='NIFTY Bank index')*
带袖扣的饼图
袖扣库提供了一种在 plotly 中获得 plotly 力量的简单方法。语法上的相似是另一个优势。
结论
散景或情节在传达整个信息方面是自给自足的。基于你的选择和偏好,你可以两者都选,也可以两者都选;主要目的是使可视化更直观,同时更具交互性。阅读完本文后,您应该能够将静态的可视化转换成它们的交互式副本,并使您的分析更上一层楼。
👉有兴趣自己看其他文章。这个 回购 包含了我分类写的所有文章。
进入状态!🐍
塑造和重新塑造 NumPy 和 pandas 对象以避免错误
形状误差是许多学习数据科学的人的祸根。我敢打赌,人们已经放弃了他们的数据科学学习之旅,因为无法将数据整理成机器学习算法所需的形状。
更好地了解如何重塑您的数据将使您不再流泪,节省您的时间,并帮助您成长为一名数据科学家。在本文中,您将看到如何以您需要的方式获取数据。🎉
雅典有许多行和列。资料来源:pixabay.com
正在做
首先,让我们确保使用相似的包版本。让我们用它们通常的别名导入我们需要的库。所有代码都可以在这里获得。
import sys
import numpy as np
import pandas as pd
import sklearn
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LogisticRegression
如果您没有安装所需的库,请取消对以下单元格的注释并运行它。然后再次运行单元格导入。您可能需要重启您的内核。
# !pip install -U numpy pandas scikit-learn
让我们检查一下我们的软件包版本。
print(f"Python: {sys.version}")
print(f'NumPy: {np.__version__}')
print(f'pandas: {pd.__version__}')
print(f'scikit-learn: {sklearn.__version__}')Python: 3.8.5 (default, Sep 4 2020, 02:22:02)
[Clang 10.0.0 ]
NumPy: 1.19.2
pandas: 1.2.0
scikit-learn: 0.24.0
规模
熊猫数据帧有两个维度:行和列。
让我们用一些飓风数据做一个小小的数据框架。
df_hurricanes = pd.DataFrame(dict(
name=['Zeta', 'Andrew', 'Agnes'],
year=[2020, 1992, 1972 ]
))
df_hurricanes
您可以使用 ndim 属性查看熊猫数据结构的维数。
df_hurricanes.ndim2
一个数据帧既有行又有列,所以它有两个维度。
形状
形状属性显示每个维度中的项目数。检查数据帧的形状会返回一个包含两个整数的元组。第一个是行数,第二个是列数。👍
df_hurricanes.shape(3, 2)
我们有三行两列。酷毙了。😎
大小 属性显示我们有多少单元格。
df_hurricanes.size6
3 * 2 = 6
从 shape 属性中很容易得到维度和大小的数量,所以这是我们要记住和使用的一个属性。🚀
让我们从我们的数据框架制作一个熊猫系列。使用仅方括号语法通过将列名作为字符串传递来选择列。你会得到一系列。
years_series = df_hurricanes['year']
years_series0 2020
1 1992
2 1972
Name: year, dtype: int64type(years_series)pandas.core.series.Series
熊猫系列的外形是什么样子的?我们可以用系列 形状 属性来了解一下。
years_series.shape(3,)
我们有一个只有一个值的元组,即行数。请记住,索引不能算作一列。☝️
如果我们再次只使用方括号会发生什么,除了这次我们传递一个包含单个列名的列表?
years_df = df_hurricanes[['year']]
years_df
type(years_df)pandas.core.frame.DataFrame
我的变量名可能泄露了答案。😉如果你传递一个列名列表,你总是得到一个数据帧。
years_df.shape(3, 1)
拿走:熊猫系列的造型和一栏熊猫数据框的造型是不一样的!数据帧的形状为行乘列,系列的形状为行。这是让人犯错的关键点。
现在我们知道了如何在熊猫身上找到形状,让我们看看如何使用 NumPy。熊猫扩展 NumPy。
列。资料来源:pixabay.com
NumPy
NumPy 的 ndarray 是它的核心数据结构——从现在开始我们就把它称为数组。根据您的目标,有许多方法可以创建 NumPy 数组。点击查看我的主题指南。
让我们从数据帧中创建一个 NumPy 数组,并检查它的形状。
two_d_arr = df_hurricanes.to_numpy()
two_d_arrarray([['Zeta', 2020],
['Andrew', 1992],
['Agnes', 1972]], dtype=object)type(two_d_arr)numpy.ndarraytwo_d_arr.shape(3, 2)
返回的形状与我们使用熊猫时看到的形状相匹配。熊猫和 NumPy 共享一些属性和方法,包括形状属性。
让我们将之前制作的熊猫系列转换成 NumPy 数组,并检查其形状。
one_d_arr = years_series.to_numpy()
one_d_arrarray([2020, 1992, 1972])type(one_d_arr)numpy.ndarrayone_d_arr.shape(3,)
同样,我们在熊猫和熊猫身上看到了同样的结果。酷!
行和列。资料来源:pixabay.com
问题是
当一个对象期望数据以某种形式到达时,事情就变得棘手了。例如,大多数 scikit-learn 变压器和估算器都希望获得二维形式的预测 X 数据。目标变量 y 应该是一维的。让我们用一个愚蠢的例子来演示如何改变形状,在这个例子中,我们使用年来预测飓风名称。
我们将使 x 小写,因为它只有一维。
x = df_hurricanes['year']
x0 2020
1 1992
2 1972
Name: year, dtype: int64type(x)pandas.core.series.Seriesx.shape(3,)
我们的输出变量 y 也是如此。
y = df_hurricanes['name']
y0 Zeta
1 Andrew
2 Agnes
Name: name, dtype: objecttype(y)pandas.core.series.Seriesy.shape(3,)
让我们实例化并拟合一个逻辑回归模型。
lr = LogisticRegression()
lr.fit(x, y)
你会得到一个值错误。最后几行写道:
ValueError: Expected 2D array, got 1D array instead:
array=[2020\. 1992\. 1972.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
让我们试着按照错误消息的指示去做:
x.reshape(-1, 1)
如果你通过一个 NumPy 数组,整形是很棒的,但是我们通过了一个 pandas 系列。所以我们得到了另一个错误:
AttributeError: 'Series' object has no attribute 'reshape'
我们可以把我们的系列变成一个 NumPy 数组,然后把它重新做成二维的。然而,正如你在上面看到的,有一种更简单的方法可以让 x 成为 2D 对象。只需使用方括号语法将列作为列表传递。
我将结果设为大写 X ,因为这将是一个 2D 数组——大写字母是 2D 数组(也称为矩阵)的统计命名约定。
我们开始吧!
X = df_hurricanes[['year']]
X
type(X)pandas.core.frame.DataFrameX.shape(3, 1)
现在我们可以准确无误地拟合我们的模型了!😁
lr.fit(X, y)LogisticRegression()
重塑 NumPy 数组
如果我们的数据存储在 1D NumPy 数组中,那么我们可以按照错误消息的建议,用reshape
将它转换成 2D 数组。让我们用之前保存为 1D NumPy 数组的数据来尝试一下。
one_d_arrarray([2020, 1992, 1972])one_d_arr.shape(3,)
让我们重塑它!
hard_coded_arr_shape = one_d_arr.reshape(3, 1)
hard_coded_arr_shapearray([[2020],
[1992],
[1972]])hard_coded_arr_shape.shape(3, 1)
传递一个正整数意味着给出那个维度的形状。所以现在我们的数组有了形状 3,1 。
然而,使用灵活、动态的选项是更好的编码实践。所以还是用 -1 搭配吧。shape() 。
two_d_arr_from_reshape = one_d_arr.reshape(-1, 1)
two_d_arr_from_reshapearray([[2020],
[1992],
[1972]])two_d_arr_from_reshape.shape(3, 1)
让我们解开代码。我们传递了一个 1 ,所以第二维度——列——得到了 1。
我们为另一个维度传递了一个负整数。这意味着剩余的维度变成了保存所有原始数据所需的任何形状。
把 -1 想象成填空做一个维度让所有的数据都有个家。🏠
在这种情况下,您最终得到一个 3 行 1 列的 2D 数组。 -1 取值 3 。
让我们的代码变得灵活是一个很好的实践,这样它就可以处理我们向它抛出的任何观察。所以不要硬编码两个维度,使用-1
。🙂
资料来源:pixabay.com
高维数组
同样的原理可以用于整形更高维的阵列。我们先做一个三维数组,然后再把它重塑成四维数组。
two_d_arrarray([['Zeta', 2020],
['Andrew', 1992],
['Agnes', 1972]], dtype=object)two_d_arr.shape(3, 2)three_d_arr = two_d_arr.reshape(2, 1, 3)
three_d_arrarray([[['Zeta', 2020, 'Andrew']],
[[1992, 'Agnes', 1972]]], dtype=object)
使用 -1 ,指示应该计算哪个尺寸,以准确地给出所有数据的位置。
arr = two_d_arr.reshape(1, 2, -1, 1)
arrarray([[[['Zeta'],
[2020],
['Andrew']],
[[1992],
['Agnes'],
[1972]]]], dtype=object)
注意,如果整形尺寸没有意义,你会得到一个错误。像这样:
two_d_arr.reshape(4, -1)
two_d_arr--------------------------------------------------------------------
ValueError: cannot reshape array of size 6 into shape (4,newaxis)
我们有六个值,所以我们只能将数组调整为恰好能容纳六个值的维数。
换句话说,维数必须形成乘积的六个。记住 -1 就像一个可以变成任意整数值的通配符。
预测
Scikit-learn 希望大多数预测都使用 2D 阵列。
假设列表中有一个样本,您想用它来进行预测。您可能会天真地认为下面的代码可以工作。
lr.predict(np.array([2012]))
并没有。☹️
ValueError: Expected 2D array, got 1D array instead:
array=[2012].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
但是,我们可以按照有帮助的错误建议,用reshape(1, -1)
做一个二维数组。
lr.predict(np.array([2012]).reshape(1, -1))array(['Zeta'], dtype=object)np.array([2012]).reshape(1, -1).shape(1, 1)
您已经使第一个维度(行) 1 和第二个维度(列)与特征数量 1 相匹配。酷!
不要害怕检查一个物体的形状——即使只是确认它是你所想的那样。🙂
当我们讨论 scikit-learn 的整形主题时,请注意文本矢量化转换器,如 CountVectorizer 的行为与其他 scikit-learn 转换器不同。他们假设你只有一列文本,所以他们期望一个 1D 数组而不是 2D 数组。你可能需要重塑。⚠️
制作 1D 阵列的其他方法
除了用reshape
整形,NumPy 的flatten
和ravel
都返回一个 1D 数组。区别在于它们是创建原始阵列的拷贝还是视图,以及数据是否连续存储在内存中。查看这个不错的堆栈溢出答案了解更多信息。
让我们看看将 2D 数组压缩成 1D 数组的另一种方法。
挤压重塑。资料来源:pixabay.com
挤出不需要的维度
当你有一个多维数组,但其中一个维度不包含任何新信息时,你可以用.squeeze()
将挤出不必要的维度。举个例子,我们用之前做的数组。
two_d_arr_from_reshapearray([[2020],
[1992],
[1972]])two_d_arr_from_reshape.shape(3, 1)squeezed = np.squeeze(two_d_arr_from_reshape)squeezed.shape(3,)
哒哒!
请注意,TensorFlow 和 PyTorch 库与 NumPy 配合得很好,可以处理表示视频数据等内容的高维数组。将数据转换成神经网络输入层所需的形状是一个常见的错误来源。您可以使用上面的工具将数据调整到所需的维度。🚀
包装
您已经看到了如何重塑 NumPy 数组。希望您看到的未来代码会更有意义,您将能够快速地将 NumPy 数组处理成您需要的形状。
如果你觉得这篇关于重塑 NumPy 数组的文章很有帮助,请在你最喜欢的社交媒体上分享。😀
我帮助人们学习如何用 Python、熊猫和其他工具来处理数据。如果你觉得这听起来很酷,请查看我的其他指南并加入我在 Medium 上的 15,000 多名粉丝,获取最新内容。
快乐重塑!🔵🔷
介入
你能做些什么来帮助这个领域朝着正确的方向发展?
无论你是刚刚开始还是已经在建立你的职业生涯,你都可以帮助数据科学和机器学习以一种有益于人类和社区的方式发展。如果你有兴趣,这里有一些想法可以指导你接下来的步骤。
1。了解更多信息
参与并帮助该领域朝着正确方向发展的一个关键因素是跟上数据科学和机器学习的最新发展。我们创建了这个资源页面来支持您的学习之旅。
“做好事”是一个崇高的目标,但有时很难知道如何开始——例如,一些行动可能会带来我们最初没有意识到的负面影响。作为第一步,我们建议您进行一些初步研究,以了解您应该考虑的因素。比如,你可以读 做好事更好 一本介绍有效利他主义概念的书,或者看这个短视频。
接下来,你可能希望具体放大随着机器学习和人工智能变得更加强大而出现的问题和潜在风险。这是一个复杂的话题,为了帮助您驾驭它,我们基于 TDS 播客第二季创建了一个音频课程,在该课程中,我们重点关注数据科学和相邻领域中出现的问题。我们关于这些主题的精选专栏是另一个有用的资源,您可以按照自己的节奏浏览——它们涵盖了广泛的真实世界用例(和解决方案)。
除了 TDS,还有许多其他在线空间,在那里你可以找到关于类似主题的有见地的文章、播客和视频。我们最喜欢的包括开放慈善项目、未来生命研究所、人类兼容人工智能中心、关于新技术和新伦理的 TED 播放列表,以及80000 小时的对话。
2。讨论、贡献和联系
阅读和教育自己是很好的开始,但是加入对话更好。你可以直接联系从事这些主题的人,并提供你的支持。Twitter 和 LinkedIn 是找到和你有共同兴趣的社区成员的好地方,TDS 也是其中之一。
浏览我们策划的关于这些主题的专栏,如果有任何文章或项目引起你的共鸣,在评论区联系作者是建立初步联系的好方法。许多作者也欢迎通过他们的 Twitter 和 LinkedIn 账户联系。
如果你有兴趣就这些话题发表自己的见解,你可以向我们的团队提交一篇文章。如果我们选择出版它,我们将帮助突出它,以便它在 TDS 上更长时间可见,在我们的社交媒体帐户上推广它,并通过我们的新闻稿与读者分享它。
3。通过你的职业生涯提供帮助
如果你正在寻找一个能产生直接积极影响的职业,我们鼓励你去看看 80000hours.org 大学。借用他们的话:
你的职业生涯中大约有 8 万个工作小时。这意味着你对职业的选择是你一生中做出的最大决定之一,所以弄清楚如何善用这段时间是非常值得的。
《80,000 小时》出版了一个指南来帮助你思考你可以做出积极贡献的方法。他们还列出了你可能会考虑处理的问题的问题简介,任务驱动型角色的工作板,以及关于重要想法的有趣对话的播客。
4。志愿参与一些项目,这些项目的使命与你息息相关
有许多有价值的项目和社区,你的贡献可以发挥很大的作用。志愿服务也是一种很好的方式来练习你的技能,并结识志同道合的人,他们热衷于利用技术和数据做好事。以下是一些需要考虑的链接:
- DataKind —一个将数据科学家与社会变革组织联系起来的计划,在这个计划中,他们的技能可以发挥作用。
- DrivenData —提供持续的挑战,数据科学家竞相创建“对困难的预测问题有所影响的最佳统计模型”
- Solve for Good —一个平台,让致力于社会问题的组织请求志愿者帮助完成数据密集型任务。
- 在线志愿者——一项由联合国支持的倡议,允许具有研究、技术和其他背景的专家支持解决新冠肺炎相关问题的组织。
- Catchafire —专业人士寻找机会为激励他们的事业贡献时间和技能的社区。
你也可以创建自己的项目:从新冠肺炎和 T21 的污染到当地社区的帮助,有很多方法可以利用你的知识和数据专长做好事。如果你需要一些现实世界的灵感,请查看我们在改变数据专栏中的工作。
5。向推动该领域向正确方向发展的非营利组织捐款
如果你想支持那些致力于让人工智能更安全、更有益于所有人的组织,我们建议去看看开放慈善项目、应该、 MIRI 、 GovAI 、未来生命研究所和人类兼容人工智能中心。
如果你不确定该选哪一个,你可以向一个基金捐款,该基金支持围绕类似使命的多个组织。例如,长期未来基金支持众多项目和研究计划;你也可以阅读这篇评论来更详细地探索以人工智能为重点的非营利领域。
我们的专栏
变更数据
人工智能和算法偏见的风险是众所周知的,但数据科学也可以——而且经常是——成为一股好的力量。从环境研究和警察改革到公共卫生举措,数据为人们提供了信息并增强了他们的权能,使他们能够要求更好的政策并努力为边缘化社区实现更大的公平。请访问我们的数据促进变革专栏,了解讨论数据改善人们生活的潜力的各种文章。
模型可解释性
机器学习算法每天都在影响着我们。我们用这些算法来做决策,解决问题,让我们的生活更轻松。但是驱动应用程序的算法没有固定的规则和规定。依赖这些算法的企业、政府机构和学校不一定了解模型如何工作的细节或结果的真正含义。我们有权理解一个模型是如何做出决定的,以及为什么人们应该(或不应该)信任它。如果我们要使用这些算法来为我们做出法律、医疗和金融决策,我们需要确保我们理解一个模型是如何创建的,以及它为什么会得到它的结果。
公平和偏见
人工智能和机器学习模型只与它们接受训练的数据一样公平。算法不会自己思考,它们做出的预测是基于它们的创造者做出的选择。如果没有意识到这些问题,偏见通常会在每个层次的模型中形成。我们需要学习如何避免偏见,并在每一步都将公平融入我们的模型。
数据隐私
几乎每时每刻都在收集我们所有人的数据。保持任何表面上的隐私越来越难了。我们不断向公司提供信息,帮助他们改善业务运营。无论我们是为了更好的推荐而提供音乐品味,还是为了路线建议而提供我们的位置,或者关于我们健康和身份的信息,我们都需要意识到我们正在做出的选择和我们的数据将去往何处。我们需要问如何保护我们的数据,以及如何在各个层面维护我们的隐私。
人工智能校准和安全
随着我们提高人工智能的能力,我们如何对人类决策的微妙和复杂之处进行编程?AI 的目标会和我们自己的一样吗?人工智能不太可能默认与人类价值观保持一致。尽管制定一套不伤害人类的法律很好,但有令人信服的理由相信这是不可能的,而且对齐问题实际上很难解决。人工智能正在迅速进步:时间正在流逝,我们应该引导人工智能在每种情况下做出正确的选择,并随着它变得更加聪明而继续这样做。现在讨论这些问题对人工智能的未来至关重要。
我们创建了这份媒体出版物,因为我们相信数据相关知识对于让世界变得更美好至关重要。它不仅能让我们了解自己和周围的世界,还能帮助我们做出更好的决定。几乎在每个领域,数据科学都可以帮助我们更准确地理解手头的事情,从而更好地告知决策者他们的行动的潜在后果。
随着时间的推移,我们认识到,随着我们领域的进展,一些重要的问题正在出现。例如,与隐私、可解释性和一致性相关的问题。这就是为什么我们决定接触我们的社区,研究我们的领域面临的潜在问题以及我们如何帮助解决这些问题。
通过继续这项工作,我们希望更接近这些关键问题和挑战。这有助于我们确保我们的社区走上让世界变得更美好的道路。