TowardsDataScience 博客中文翻译 2020(九百六十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用 Catscatter 可视化分类关系

原文:https://towardsdatascience.com/visualize-categorical-relationships-with-catscatter-e60cdb164395?source=collection_archive---------16-----------------------

如果您可以创建分类特征的散点图会怎么样?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2015 年至 2019 年间,欧洲 100 家顶级风投和 50 家顶级行业的种子投资更加活跃

如果你曾经需要一种方法来绘制显示其关系的类别特征,我已经为你建立了这个资源。基于 matplotlib.pyplot 对象构建的 catscatter 函数,使用 pandas 来可视化类别变量之间的关系,就像散点图一样。(我知道,这里没有相关性,但它看起来像是建立在散点图上,对吗?).

[## my things/cat scatter

我是一名数据分析师,运用一点数据科学和大量的数据可视化。去年 12 月,一位同事给了我…

github.com](https://github.com/myrthings/catscatter)

语境

我是一名数据分析师,运用一点数据科学和大量的数据可视化。去年 12 月,一位同事送给我一本书作为圣诞礼物《知识是美丽的》,我非常喜欢。它的数据可视化是惊人的并且非常复杂。当我想获得灵感时,我喜欢读它。

同时,我在一家 VC 基金工作,在那里框架和关系真的很重要。由于分类变量的“字符串”性质,显示它们之间的关系并不总是一件容易的事情。

这两种情况促使我创建并使用一个 catscatter 函数。该函数基于散点图关系,但以一种美丽而简单的方式使用分类变量。实际上,可视化更接近于“邻接矩阵”而不是“散点图”:这意味着我们对标记在哪里找到相关性不感兴趣,而是对哪些类别相互关联,或者哪些类别与某个事物的关联度更高。它们可以被视为一种“图形”关系。为此,重要的是不仅要在特征之间的交叉点绘制标记,还要在背景中绘制水平线和垂直线,以便于跟踪连接。

绘制您自己的 catscatter

函数是在 Matplotlib 和 Pandas 上为 Python 构建的。它有以下输入:

  • df: 熊猫数据框,必选。它需要至少两列包含您要关联的分类变量,以及两者的值(如果它只是一个相邻的矩阵,请写一列)
  • colx: *字符串,必选。*要水平显示的列的名称。
  • coly: *string,必选。*要垂直显示的列的名称。
  • cols: *字符串,必选。*值介于两个变量之间的列的名称。
  • 颜色: *列表,可选。*可视化中要显示的颜色,长度可以是两个或三个。前两个是矩阵中线条的颜色,最后一个是字体颜色和标记颜色。默认[‘灰色’,‘黑色’]
  • ratio: int 或 float,可选。用于控制标记相对大小的比率。默认 10
  • 字体: *字符串,可选。*矩阵上刻度的字体。默认‘Helvetica’
  • 保存: *bool,可选。*如果为 True,则在与代码相同的路径中保存为图像。默认假
  • 保存 _ 名称: *字符串,可选。*用于保存图像的名称(然后是代码 ads。png) 默认:【默认】

没有输出。该对象未关闭,因此用户可以在此之前或之后启动或更改它。

基本示例

想象一下,你邀请你的一些朋友来家里吃饭。你可以建立一个 catscatter 来查看每个人最喜欢的食物,并购买更适合他们的食物。你需要一个包含你的朋友和食物之间关系的数据框架。例如,您知道 Ignacio 喜欢 Hamburguers,但也喜欢 Pizza,因此您构建了等级为“5”的“Ignacio”和“Hamburguer”之间的关系,以及等级为“3”的“Ignacio”和“Pizza”之间的关系。你对你所知道的关于你朋友的一切都做了同样的事情,并绘制了一个猫散点

import pandas as pd
import matplotlib as plt
from catscatter import catscatter# example data frame
data=pd.DataFrame({‘friend’:[‘Peter’,’Marc’,’Ignacio’,’Marta’,’Marta’,’Ignacio’,’Maria’,’Pedro’,’Bea’,’Pedro’],
 ‘favorite_food’:[‘Salmon’,’Chocolate’,’Hamburguer’,’Pizza’,’Apples’,’Pizza’,’Pizza’,’Hamburguer’,’Salmon’,’Banana’],
 ‘favorite_grade’:[1,5,5,3,2,3,4,4,3,1]})#plot it
catscatter(data,’friend’,’favorite_food’,’favorite_grade’)
plt.show()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里你可以看到披萨是最受欢迎的食物,但是如果你邀请 Bea 和 Peter,也许点三文鱼塔塔基是最好的选择。不要浪费时间买水果。对于 Marc,我肯定你只和他吃过甜点,你应该邀请他共进晚餐来收集更多的数据!

个性化示例

这个例子和上一个一样,但是更大更丰富多彩。

import pandas as pd
import matplotlib as plt
from catscatter import catscatter# example dataframe
data=pd.DataFrame({‘friend’:[‘Peter’,’Marc’,’Ignacio’,’Marta’,’Marta’,’Ignacio’,’Maria’,’Pedro’,’Bea’,’Pedro’],
 ‘favorite_food’:[‘Salmon’,’Chocolate’,’Hamburguer’,’Pizza’,’Apples’,’Pizza’,’Pizza’,’Hamburguer’,’Salmon’,’Banana’],
 ‘favorite_grade’:[1,5,5,3,2,3,4,4,3,1]})colors=[‘green’,’grey’,’orange’]# create the plot
plt.figure(figsize=(8,8))
catscatter(data,’friend’,’favorite_food’,’favorite_grade’,color=colors,ratio=100)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亲例(本文封面)

在我的办公室,我们想知道哪些欧盟种子投资者在哪些行业更活跃。我收集了 2015 年至 2019 年欧洲所有种子轮的信息,并准备了一个数据集**,其中包含每个投资者通过行业达成的交易数量**(如果没有交易,就没有行)。交易的数量是行业和投资者之间关系的强弱。

import pandas as pd
import matplotlib.pyplot as plt
from catscatter import catscatter# read the dataframe
df=pd.read_csv(“top-european-investors-seed-rounds-15–19.csv”)
df

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

kcolors=[‘#F73972’,’#F2B3C6',’#144962']# create the plot
plt.figure(figsize=(50,20))catscatter(df,’Investor’,’Company Industry’,’Announced Date’,color=kcolors, ratio=20)plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.show()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们有 700 名投资者和 600 个行业,但是为了这个可视化,我只留下前 100 名投资者和前 50 名更活跃的行业。在我的办公室,我们制作了两张海报,你可以在这里找到,在这里找到。

在这里展示的一个案例中,你可以看到“高科技基金”在几乎所有的顶级领域都有交易,但更多地集中在“信息技术”和“软件”领域。“Innogest Capital”和“Inbox Capital”也达成了几乎相同数量的交易,但“Inbox Capital”是多面手,“Innogest Capital”只专注于“电子商务”和“时尚”。我们还可以看到**“广告”并不常见,但“软件”很常见**,有些投资者关注“医疗”而不是“旅游”

我不能分享上一篇文章使用的 df,但是我希望它能帮助我在更大的范围内看到我的小代码片段的潜力。

如果你想试试 catscatter,这里有代码给你!👇

[## my things/cat scatter

我是一名数据分析师,运用一点数据科学和大量的数据可视化。去年 12 月,一位同事给了我…

github.com](https://github.com/myrthings/catscatter)

你怎么看?你觉得有用吗?你还有什么其他方法来描绘分类特征之间的关系?请在评论区告诉我!

如果你使用它,我也很想知道它🤗

使用 Tableau 可视化西班牙巴塞罗那的手机移动性

原文:https://towardsdatascience.com/visualize-cellphone-mobility-in-barcelona-spain-using-tableau-e3f7ab99d7e9?source=collection_archive---------50-----------------------

有很多来自手机的地理空间数据…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

处理地理空间数据时,直观地查看地图上的数据通常很有用。在本教程中,我们将使用来自加泰罗尼亚政府的真实手机地理空间数据。这些数据存在于谷歌的公共数据集中。

如果你不熟悉谷歌云,请查看我的水平与谷歌的公共数据集教程,以访问加泰罗尼亚蜂窝覆盖数据集

导入数据

一旦数据被加载到 Tableau 中,我们可以看到移动数据有许多地理空间信息的记录。让我们深入画面去想象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的第一步是将纬度和经度从度量转换为维度。通过将 Lat 和 Long 转换为维度,我们告诉 Tableau 分别处理每条记录,而不是将它们聚合在一起。

接下来,我们将双击纬度和经度将数据加载到地图上。正如我们所见,蜂窝数据是全球性的,但主要集中在欧洲,尤其是西班牙。这是因为数据是由位于西班牙巴塞罗那的加泰罗尼亚政府提供的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改地块设置

放大到西班牙的巴塞罗那,我们可以从我们的数据集中看到大量的地理空间手机数据。似乎有很多重叠的数据点,这使得我们无法完全可视化巴塞罗那的细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了更好地可视化数据,我们可以减小每个数据点的大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此外,我们可以改变颜色和减少不透明度为 20%。不透明度为 20%时,地图上的纯色表示有 5 个重叠的数据点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想象一段时间内的运动

由于我们的数据是时间序列,我们可以利用 Tableau 的 Pages 函数来制作地图动画。单击日期维并将其拖至页面,然后将详细程度更改为连续的一天。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

地图旁边会出现一个新的控制面板。点击右边的三角形,地图会随着时间向前移动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瞧啊。您刚刚使用 Tableau 成功地将西班牙巴塞罗那的手机地理空间动画化和可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Tableau 地图图层中使用深色样式

支持

谢谢你看我的教程!几股走很远!

对其他酷技术感兴趣吗?查看我的教程2020 年云上 Jupyter + Spark 入门

用 pandas 和 Plotly 可视化错误日志

原文:https://towardsdatascience.com/visualize-error-log-with-pandas-and-plotly-d7796a629eaa?source=collection_archive---------39-----------------------

Plotly 和 pandas timedelta 在“数据帧>重采样>绘图”管道中的优势和问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最近,我收到了一个来自性能测量的数据集,其中包含关于处理时间和错误的数据。简单看了一眼后,我想这可能是一个问题;我需要把它形象化,让每个人都看到。视觉化很简单,但是它可以教你一些关于熊猫的概念,以及你可能面临的困难。主要是:

  • 与熊猫一起工作timedelta列类型
  • 熊猫resampling(一分钟或 5 秒钟图表)
  • Plotly.Express一起制图
  • 多么神秘。用subplots 表达斗争(或两轴绘图)
  • 对齐 Plotly 的轴

和往常一样,你可以在 GitHub 笔记本中看到框架、计算、情节背后的代码。它会带你经历:

1.错误日志的 EDA

2.剧情简介。快递

3.【timedelta 的优势和问题

4.剧情支线剧情

5.共享轴的 Plotly 图表

错误日志

我将错误简化为仅包含 3 列:

  • 陈述 —结果或过程(好或错)
  • 开始时间 —流程开始的时间
  • 结束时间 —流程结束的时间

在我的例子中,应用程序试图将报告呈现到.pdf中,但是类似的技术可以用于处理包含resultduration.的任何类型的错误日志

# Example error logState,StartTime,EndTime
Ok,2020-08-13 19:55:22,2020-08-13 19:55:27
Er,2020-08-13 19:55:22,2020-08-13 19:55:30
Ok,2020-08-13 19:55:24,2020-08-13 19:55:30

作为第一步,我必须解压日志(也包含在 Github repo 中)。当然,您可以手动解压缩,但是如果您想要创建一个自动化管道,您应该学习如何用代码来完成。

import zipfile# first let's unzip the error log
with zipfile.ZipFile("log.zip", 'r') as zip_ref:
    zip_ref.extractall("")

探索性数据分析

无论数据看起来有多简单,都要花一点时间在 EDA 上,以确保不会出现诸如丢失值、意外范围或重复等意外情况。

# load the data into the pandas's dataframe
df = pd.read_csv("error.log")# run predefined EDA function and optionally style the output
[In]: data_frame_stats(df)\
.style.format({"notnulls%": "{:,.2%}", "unique%": "{:,.2%}"})[Out]: 
          type   notnulls notnulls% unique unique%
State     object 1725     100.00%    2     0.12%
StartTime object 1725     100.00%    733   42.49%
EndTime   object 1725     100.00%    586   33.97%

快速概览显示没有价值丢失。State包含两个值,而时间戳是非常唯一的,即使有些发生在同一秒钟。

[In]: list(df["State"].unique())
[Out]: ['Ok', 'EndedWithError']

State的现有值为“Ok”和“EndedWithError”。知道我们可以通过将时间戳列转换为日期时间格式,并可选地将状态转换为分类列或 bool 列来润色数据帧。

# Convert strings to datetimes using `pd.to_datetime` and specifying the format
df["StartTime"] = pd.to_datetime(df["StartTime"], 
                                 format="%Y-%m-%d %H:%M:%S")# convert the State column into categorical. Mainly to decrease dataframe's memory footprint
df["State"] = df["State"].astype("category")# convert errro column to bool `.map()
df["Error"] = df["State"].map({"Ok": False, "EndedWithError": True}).astype("bool")# If there would be more error types, e.g. Error1, Error2 etc, we can apply if function through lambda expression
# df["Error"] = df["State"].apply(lambda x: False if x =="Ok" else True).astype("bool")# let's have a look on the final sample
df.sample(3)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

已分析错误日志中的示例行

持续时间

我们主要对StartTimeEndTime都不感兴趣,而是对记录事件的持续时间感兴趣。由于这两列都是 pandas 的数据时间,我们可以简单地将它们相减得到一个timedelta列。

# calculate the duration
df["Duration"] = df["EndTime"]-df["StartTime"]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加 timedelta 类型的持续时间列

Plotly Express

看起来我们已经拥有了生成一些有趣情节所需的所有列。让我们研究一下错误的数量与事件的数量的对比。我们将使用 Plotly。Express,流行的 Plotly 库的高级 API,它创建交互式(使用 JavaScript)图表。普洛特利。Express 以数据帧作为输入非常强大。使用 Plotly express,生成一个简单的图表是一行程序。

import plotly.express as px# With Plotly express you can quickly review the counts of varibles in the dataframe, even though I'm not sure which plotly have picked such low contract for their standard chart.**px.bar(df, x="State", title="Count of states")**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plotly express 图表。它可以缩放,平移,并提供悬停工具提示。

Plotly 图表提供了许多伟大的功能。它们可以缩放,您可以通过拖动鼠标来平移图表,并且每个元素的数据都会在工具提示中进行汇总,工具提示会在您将鼠标悬停在元素上后出现。不幸的是,闪光的并不都是金子,还有一些令人讨厌的细节。

Plotly 自动计算你的分类值,但是工具提示显示count=1,并且这样的条形图的自动颜色与背景没有对比。px.pie piechart 根本不会自动计算发生次数。

时间增量及其相关问题

我们知道我们的错误日志包含相当多的错误。它们的总数是惊人的,但是这些错误会持续发生吗?它们会反映在处理时间中吗?为了表明我们可以利用熊猫的resample功能,并计算每一分钟的事件。不幸的是,timedelta列不容易平均。

# you can average time delta for full dataframe
[In]: df["Duration"].mean()
[Out]: Timedelta('0 days 00:01:01.371594')  # ~one minute 

但是尝试在重新采样的数据帧上应用mean:

# but you cannot average it `.mean()
try:
    df.set_index("StartTime")["Duration"]**.resample("1min").mean()**
except Exception as e:
    print(e)[Out]: No numeric types to aggregate

您可以resample.sum().count(),但由于某种原因,您无法对重新采样的 timedelta 值求平均值。

编程带来了意想不到的问题,但也带来了简单的解决方案。

  • 您可以将时间增量转换为秒,然后取平均值
  • 因为你可以sumcount,你也可以平均为sum/count
# you can turn timedelta into int, which give nanosecond represantation of the time delta which you divide by 1 bilion
df["duration_seconds"] = df["Duration"].astype('int64').divide(1000000000)# or you can use timedelta's .to_seconds() method
df["duration_seconds_2"] = df["Duration"].dt.total_seconds()

用熊猫重新采样

为了对任何数据帧进行重新采样,最简单的方法是将日期时间列之一设置为索引。我们将为StartTime做这件事。

stats = df.set_index("StartTime")

我们希望看到每分钟错误和成功的计数,以及成功和错误流程的处理时间(持续时间)。

stats = stats\
        .groupby("State")\
        .resample("1min")\
        .agg({"State":"count", "duration_seconds": "mean", "Duration": ["sum","count"]})

一次执行多个聚合会产生多级列名,我们使用reset_index将这些列名转换回一个级别,并根据每个级别对列进行重命名。

# State appear in index (due to groupby) and in values, because we count states. We must rename the column before we reset the index
stats = stats\
       .rename(columns={"State":"Count"}) 
       .reset_index(level=[0,1])

将两级列名合并成一个:

# two level column index turned into single level by joining zipped values from each levelstats.columns = ["_".join(z) for z in zip(stats.columns.get_level_values(0),
    stats.columns.get_level_values(1))]

最后,我们通过将sum列除以count列来计算平均持续时间

# calculate the average duration from the sum and count
stats["duration_mean"] = stats["Duration_sum"]/stats["Duration_count"]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果统计。每个状态的计数和每分钟的平均持续时间。

产生的数据帧stats可以使用单线绘图表达式绘制。

fig_count = px.bar(stats, x="StartTime", y="Count", barmode="group", color="State")
fig_count.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每分钟的事件计数

同样,持续时间可以绘制成折线图。

fig_duration = px.line(stats, x="StartTime", y="duration_mean", color="State")
fig_duration.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 Plotly 持续时间。用 y 轴上的 timedelta 列表示

注意 y 轴上的120B, 100B, etc.值。timedelta值的另一个弱点是许多库,包括 Plotly express 都很难正确使用它们。

因为我知道这个问题,所以我已经提前创建了duration_seconds_mean列,并将持续时间显示为float

情节复杂的次要情节

关于同一个问题的两个图表就像是分离的恋人。这可能行得通,但合在一起更理想。每个可视化库都可以创建支线剧情,Plotly 也不例外。不幸的是,它不适用于 Plotly。Express 而且你还得用更低级的go API。

尽管每个 Plotly 图表的背景都有一个数据字典:

# each Plotly chart stores a dictionary of date and settings 
[In]: fig_duration.to_dict()
[Out]: 
{'data': [{'hovertemplate': 'State=EndedWithError<br>StartTime=%{x}<br>duration_seconds_mean=%{y}<extra></extra>',
   'legendgroup': 'EndedWithError', 
...

这些字典不能被输入到 Plotly 的支线剧情中

import plotly.graph_objects as go
from plotly.subplots import make_subplots# initialize the subplots
fig = make_subplots(rows=2, cols=1, shared_xaxes=True)# traying to add plotly express trace to the subplot will results in an error
try: 
    fig.add_trace(fig_duration)
    # neither the following would help
    # fig.add_trace(fig_duration.to_dict())
    # fig.add_trace(fig_duration.to_dict()["date"])
except Exception as e:
    print(e)**[Out]: Invalid element(s) received for the 'data' property of ...**

另一个恼人的特点是你不能用 Plotly 制作支线剧情。Express(还没有),你必须回到较低级别的 API,它不能很好地处理数据帧。

要制作一个子情节,你必须使用Plotly.graph_objects.go并分别指定每个输入——例如x=df["StartTime"], y=df["duration]。Plotly express 可以通过categorical列分割数据,但是对于go API,您必须手动将它们分开。

err = stats[stats["State"]=="EndedWithError"]
ok = stats[stats["State"]=="Ok"]

然后初始化子情节:

from plotly.subplots import make_subplots
fig = make_subplots(rows=2, cols=1)

添加所有跟踪(图表项目),同时您可以指定细节,如系列的颜色或名称:

# add scatter (which includes line charts as well) as the top chart containing duration of successful events
**fig.add_trace**(
    go.Scatter(x=ok["StartTime"], 
               y=ok["duration_seconds_mean"], 
               name="success duration",
               marker_color="Green",
              ),
    row=1, col=1
)

最后,您自定义图表的布局并显示它:

fig.update_layout(title="Processing speed and number of errors with missaligned x-axis",
                  yaxis_tickformat = '.2f',
                  xaxis_title="Time of Request",
                  yaxis = {"title": "processing time"},
                  yaxis2 = {"title": "number of requests"}fig.show()

将所有这些放在一起,制作出普洛特利的围棋支线剧情

我们再次面临一个令人不快的困难:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即使 x 轴具有相同的范围,它们在折线图和条形图中也是不对齐的。

即使 x 轴具有相同的范围,折线图的 x 轴也不会与条形图中的同一轴对齐。(参见完整代码获取证明)

幸运的是,您可以使用shared_xaxes=True迅速修复它。这带来了另一个好处,当你放大一个图表时,另一个也会放大。

fig = make_subplots(rows=2, cols=1, **shared_xaxes=True**)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个图被缩放在一起

共享 y 轴的绘图

这一初步探索表明:

  1. 最初,没有错误
  2. 随着处理时间的增加,错误的数量开始增加
  3. 错误数量下降并开始再次增长,而时间继续增加
  4. 有一段时间,处理时间减少了,但是成功的事件也减少了
  5. 然后会有更多的成功发生,但也需要更长的时间来处理它们
  6. 最后,所有请求都以错误结束,开始时需要一些时间,但最终,所有事件都在一秒钟内以错误结束。

你没看到吗?也许我们可以用两个 y 轴一起绘制图表。

带有主轴和副轴的图表也是子图,通过参数specs=[[{“secondary_y”: True}]]组合。通过secondary_y=Truesecondary_y=False将每个轨迹分配给相关轴

让我们尝试用两个轴绘制带有计数的条形图和显示持续时间的折线图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发生了什么,为什么我们的线藏在栅栏后面?

我最初将处理时间放在主轴上的决定是错误的,因为 Plotly 总是将副轴(条形图)显示在顶部,所以这条线在背景中消失了。

好了,普洛特利,让我们换一下轴。副轴为线,主轴为条。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管如此,图表并不理想。可以看到每个轴的网格线彼此之间只有几毫米的距离。

如果你希望现在有一个好的图表,你可能会失望。两个轴共享(意外地)非常相似的范围(~[0,130]),但是 Plotly 决定绘制每个网格线,只是稍微偏离另一个轴上的相应网格线。

这种情况也有解决方法。只需强制两个轴使用相同的范围。

fig.update_yaxes(range=[0, 130])

我已经把图表给开发者看了,他们很快就明白了这个问题。随着事件越积越多,处理它们需要更长的时间,并且越来越多的事件以错误告终。这个系统非常聪明,它决定偶尔终止部分进程,这样我们就不会有错误了。有一次,它甚至试图重新开始整个过程,但由于场景重复,最终,一切都被拒绝。

为了确定模式,不使用1min而是使用5s (seconds).很容易重新采样数据

df.set_index("StartTime").groupby("State")**.resample("5s")**.agg(...)

这里,一个轴的事件范围为 0–30,而另一个轴的事件范围为 0–150。Plotly 不会对齐网格线,我们必须试验每个轴的设置,以获得两个轴的相同网格线。

# you can specify the range and ticks of any axis
fig.update_layout(yaxis={"range":[0,30]},
                  yaxis2={"range":[0,150],
                         "tickvals": [25,50, 75, 100, 125, 150]}
                 )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样的情况样本由 5 秒钟与 Plotly 的美丽的工具提示

由于 Plotly 的交互性,您可以放大图表并探索任何部分。使用单个参数fig.update_layout(hovermode=”x unified”)创建了一个包含所有 4 个显示值的漂亮工具提示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

利用 Plotly 的交互性探索 5s 样品的细节

结论

在本文中,我们探讨了如何将一个简单的错误日志转换成图表,以帮助我们找到一个可以解释的模式。我们曾经和熊猫timedeltaPlotly斗争过。不要误解我,Plotly 是一个很棒的库,但有时简单的事情会很复杂。

然而,大多数时候,你受益于把复杂的事情变得简单。

如果你想了解股票市场公司的财务状况,请阅读:

[## 股票基本面分析:SEC 季度数据汇总的 EDA

大熊猫 2020 SEC 申报的探索性数据分析

towardsdatascience.com](/stock-fundamental-analysis-eda-of-secs-quarterly-data-summary-455e62ff4817)

或者用人工智能进行哲学思考

[## AI 能教会我们快乐吗?

如何利用大脑的模式识别能力为我们造福?

medium.com](https://medium.com/@vaaasha/can-ai-teach-us-happiness-2629b600a4e0) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 Slack Bot 的新冠肺炎案例更新的文本中可视化

原文:https://towardsdatascience.com/visualize-from-text-for-covid-19-cases-update-from-slack-bot-2590ea780887?source=collection_archive---------67-----------------------

获得最新的新冠肺炎全球跟踪使用人类文本与命名实体识别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新冠肺炎跟踪松弛应用程序。(图片作者)

如果我们能在一个地方看到所有的新冠肺炎信息,那该有多好?在这篇文章中,我们将研究如何开发一个系统,通过问一些自然的问题来提供全世界新冠肺炎病例的更新。

我们许多人都听说过 Alexa 设备,但有些人经常使用它。它试图通过高级机器学习工作流来解释文本。我们将建立一些类似于 Alexa 的技能,可以回答相关问题。

我们将创建新冠肺炎跟踪机器人,它试图理解多种意图,提取命名实体识别(NER)值,实现自定义新冠肺炎视觉响应,并具有松散集成。

我们将讨论以下主题:

  1. 解决方案架构
  2. 意图分类
  3. 命名实体识别
  4. 新冠肺炎海关行动
  5. 松散集成

1.解决方案架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决方案架构(图片作者)

RASA 聊天机器人框架提供了与 Slack App 连接的最简单方式。让我们看看 RASA 聊天机器人的幕后发生了什么。人类文本作为输入传递到 RASA 框架中的管道,以执行自然语言处理(NLP)操作。以下是 RASA 中用于识别话语的意图的示例可配置 NLP 管道。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本 RASA NLP 管道。(作者图片)

命名实体识别(NER) 是流行的自然语言处理任务之一**。**从文本中获取特定的 NER 将使用 Spacy,由 wit.ai 提供的 duckling,以及使用 CRF 实体提取器(RASA)的自定义实体。

接下来,**我们如何为 RASA Bot 生成动态视觉响应?**是的,可以使用 RASA 进行自定义操作。RASA 提供了一个定制的动作服务器来实现特定的业务逻辑,以便机器人做出响应。我们的新冠肺炎跟踪器逻辑将在自定义操作中实现。自定义新冠肺炎机器人响应将有图像输出。然而,slack 应用程序只会识别可从公共 URL 访问的图像。因此,需要包含来自 RASA bot 响应的公共 URL 图像。

**我如何向 Slack 应用程序提供新冠肺炎视觉图像?**这里使用了一个简单的 flask web 应用程序。整个解决方案部署在 AWS EC2 实例中。RASA 自定义动作生成图像输出,并保存在 flask app 目录的静态文件夹下。Slack 使用这个 flask 端点 URL 来访问图像。下面是样品瓶代码。

Flask web 应用程序访问图像。

新冠肺炎案例追踪器示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例句 1 ( 图片作者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例句 2 ( 作者图片)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例句 3 ( 图片作者)

在上面的例子中,每个句子都被称为话语。RASA 框架执行配置管道中指定的意图分类和实体识别。让我们看看下面的每个主题:

2.意图分类

意图分类是聊天机器人的强大模块之一。这是一个分类问题,输入文本需要分类。RASA 提供各种分类算法来执行意图识别。每个意图都与要执行的特定动作相关联。

3.命名实体识别

我们需要将位置名称、日期和自定义实体标识为 COVID 案例类型(活动、已确认、已恢复和死亡)。我们的管道中使用了以下库:

  1. 空间
  2. 小鸭子
  3. RASA 实体提取器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

样本实体提取信息。(作者图片)

空间

Spacy 库在这里用于标识位置名称,如印度、美国、中国、澳大利亚。有不同的预训练模型可供使用。你可以点击查看空间 NER 演示。您可以在 RASA 管道中使用 Spacy NER,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RASA 管道中的 Spacy NER。(作者图片)

我们可以选择预先训练的模型以及从话语中提取哪种实体。我们指定了 LOC 和 GPE 实体来标识位置名称。

小鸭子

Duckling 是一个 Haskell 库,它将文本解析成结构化数据。脸书开发了一个小鸭图书馆。它可以处理多个实体,如时间、日期、持续时间、距离、数量、温度、数量。在我们的场景中,我们使用从文本中提取日期信息。您可以在 RASA 管道中使用小鸭 NER,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RASA 管道中的小鸭子 NER。(图片作者)

小鸭库怎么安装?

  1. 安装 docker。你可以参考这里的进行安装。
  2. RASA 提供了小鸭码头工人图像。您可以将 docker 图像克隆为docker pull rasa/duckling
  3. 您可以使用docker run命令启动 docker 映像。
  4. 使用docker ps命令检查状态。

小鸭子在8000港口奔跑。你可以在你的 RASA 管道中提到 duckling URL 和具体的实体名称。

CRF 实体提取器

条件随机字段(CRF)是 RASA 框架的一个组件,用于标识定制实体。我们使用来标识自定义实体,如电晕状态(确认、活动、恢复和死亡)。RASA 框架自行训练自定义实体。

4.新冠肺炎海关行动

现在,我们如何根据给定的人类文本生成视觉输出?到目前为止,我们从文本中解释了意图和实体。它帮助我们实现自定义新冠肺炎跟踪器逻辑。互联网上有新冠肺炎的开源 API,它提供每个国家的信息。我们将使用来自 API 的新冠肺炎信息来绘制可视化输出。下面是项目中使用的 COVID API:

  1. 邮递员新冠肺炎 API
  2. 小说电晕 API

你可以在这里找到自定义动作 Python 代码

5.松散集成

在 Slack 应用中设置 RASA bot 的最后阶段。

  1. 在此创建一个新的 Slack 应用
  2. 转到 OAuth 令牌&重定向 URL >订阅 Bot 令牌范围:channels.history,chat:write,groups:history,im:history,mpim:history。
  3. OAuth 令牌&重定向 URL >工作区的令牌。您将获得 OAuth 访问令牌作为xoxb-xxxxxxxxx.
  4. 点击Install App to Workspace.
  5. 获取 OAuth 访问令牌,在 RASA 中打开credentials.yml文件,并更改值slack_token: “access-token<xoxb-xxxxxxx>”.
  6. 转到事件订阅>订阅 bot 事件:message.channels、message.groups、message.im、message.mpim。
  7. 现在,你已经成功地在 Slack 应用中集成了 RASA bot。

恭喜你!您已成功完成时差集成。新冠肺炎追踪者机器人源代码可在 GitHub 中获得。如果你有什么要说的,请提出你的意见。

感谢阅读!你可以通过 LinkedIn 联系到我。

资源:

[## covid 19-印度 API

一个志愿者驱动的新冠肺炎统计 API&印度病人追踪(非官方)…

documenter.getpostman.com](https://documenter.getpostman.com/view/10724784/SzYXXKmA?version=latest) [## NovelCOVID API

更新:1591782903866,病例:7342359,今日病例:31527,死亡:414124,今日死亡:1152,痊愈…

科罗娜. lmao .忍者](https://corona.lmao.ninja/) [## Rasa:开源对话式人工智能

利用我们的开源机器学习框架,在文本和语音中构建上下文相关的人工智能助手和聊天机器人。缩放它…

rasa.com](https://rasa.com/) [## 小鸭子

用 Clojure 编写的日期解析器

小鸭. wit.ai](https://duckling.wit.ai/)

用 Python 从零开始的神经网络

原文:https://towardsdatascience.com/visualize-how-a-neural-network-works-from-scratch-3c04918a278?source=collection_archive---------16-----------------------

通过可视化每一步的结果,您可以更好地理解简单的神经网络是如何工作的

神经网络通常被认为是一种黑盒算法。数据可视化可以帮助我们更好地理解这种算法的原理。由于标准软件包没有给出如何找到参数的所有细节,我们将从头开始编写一个神经网络。为了直观地显示结果,我们选择了一个简单的数据集。

简单的数据集和神经网络结构

让我们使用这个只有一个特征 x 的简单数据集。

import numpy as npX=np.array([[-1.51], [-1.29], [-1.18], [-0.64],
[-0.53], [-0.09], [0.13], [0.35],
[0.89], [1.11], [1.33], [1.44]])y=np.array([[0], [0], [0], [0],
[1], [1], [1], [1],[0], [0], [0], [0]])

x 是具有 12 个观察值的单列向量,y 也是具有 12 个值的列向量,这些值表示目标。我们可以将这个数据集可视化。

import matplotlib.pyplot as plt
plt.scatter(X,y)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于那些已经知道神经网络如何工作的人来说,通过看到这个图表,你应该能够找到一个简单的结构。在下一部分中,激活函数将是 sigmoid 函数。

所以问题是:我们需要多少层和多少个神经元来建立一个适合上面数据集的神经网络?

如果我们只使用一个神经元,这与进行逻辑回归是一样的,因为激活函数是 sigmoid 函数。我们知道这是行不通的,因为数据集不是线性可分的,简单的逻辑回归不适用于非线性可分的数据。所以我们必须添加一个隐藏层。隐藏层中的每个神经元将导致线性决策边界。

通常,逻辑回归创建一个超平面作为决策边界。由于这里我们只有一个特征,那么这个超平面只是一个点。从视觉上,我们可以看到我们需要两个点来区分两个类。它们的值一个是-0.5,另一个是 0.5。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,具有以下结构的神经网络将是我们数据集的良好分类器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你不清楚,你可以看看这篇文章。

[## 直观来看,神经网络是如何工作的?

“神经网络”这个术语可能看起来很神秘,为什么一个算法叫做神经网络?它真的模仿真实的…

towardsdatascience.com](/intuitively-how-do-neural-networks-work-d7710b602e51)

使用 scikit 学习 MLPClassifier

在从头开始构建神经网络之前,让我们首先使用已经构建的算法来确认这样的神经网络是合适的,并可视化结果。

我们可以使用 scikit learn 中的 MLPClassifier 。在下面的代码中,我们用参数 hidden_layer_sizes 指定隐藏层的数量和神经元的数量。

from sklearn.neural_network import MLPClassifierclf = MLPClassifier(solver=’lbfgs’,hidden_layer_sizes=(2,), activation=”logistic”,max_iter=1000)clf.fit(X, y)

然后我们就可以计算分数了。(您应该得到 1.0,否则,由于局部最小值,您可能必须再次运行代码)。

clf.score(X,y)

太棒了,怎么才能把算法的结果可视化呢?由于我们知道这个神经网络是由 2+1 逻辑回归构成的,所以我们可以用下面的代码得到参数。

clf.coefs_
clf.intercepts_

我们如何解释这些结果?

对于 clf.coefs_ ,你会得到(例如):

[array([[-20.89123833, -8.09121263]]), array([[-20.19430919], [ 17.74430684]])]

并且对于 clf.intercepts_

[array([-12.35004862, 4.62846821]), array([-8.19425129])]

列表的第一项包含隐藏层的参数,第二项包含输出层的参数。

有了这些参数,我们可以绘制曲线:

def sigmoid(x):
    return 1.0/(1+ np.exp(-x))plt.scatter(X,y)
a1_1=sigmoid(xseq*clf.coefs_[0][0,0]+clf.intercepts_[0][0])
a1_2=sigmoid(xseq*clf.coefs_[0][0,1]+clf.intercepts_[0][1])
output=sigmoid(a1_1*clf.coefs_[1][0]+a1_2*clf.coefs_[1][1]+clf.intercepts_[1])plt.plot(xseq,a1_1,c=”red”)
plt.plot(xseq,a1_2,c=”blue”)
plt.plot(xseq,output,c=”black”)

我们可以得到下面的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 红色的是隐藏层的神经元 1 的结果
  • 蓝色的是隐藏层的神经元 2 的结果
  • 黑色的是输出

如果您运行代码,您可能会得到另一个结果,因为损失函数有几个全局最小值。

keras 中,当然也可以创建相同的结构:

from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(2, activation=’sigmoid’))
model.add(Dense(1, activation=’sigmoid’))
model.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
model.fit(X_train, y_train, epochs=300)

从头开始编码

现在的问题是这七个参数是怎么找到的?一种方法是使用梯度下降。

正向传播

首先,让我们做正向传播。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于每个神经元,我们必须找到权重 w 和偏差 b。让我们尝试一些随机值。

plt.scatter(X,y)
plt.plot(xseq,sigmoid(xseq*(-11)-11),c="red")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于有两个神经元,我们可以通过为参数创建矩阵来进行矩阵乘法:

  • 权重矩阵应该有两列。(因为这里输入数据有一列,所以权重矩阵应该有一行两列)。我们可以做一个随机的初始化,选择一些值。
  • 偏置应该具有相同的结构。
w1=np.random.rand(X.shape[1],2) # random initialization
w1=np.array([[-1,9]])
b1=np.array([[-1,5]])z1=np.dot(X, w1)+b1
a1=sigmoid(z1)

如果您只是在阅读,而不是同时运行笔记本,可以做的一个练习是回答以下问题:

  • np.dot(X,w1)的维数是多少?
  • z1 的尺寸是多少?
  • 为什么做加法可以?如果 b1 是一个简单的一维数组呢?
  • a1 的维数是多少?

如果我们用之前创建的 xseq 替换输入 X,我们可以绘制曲线:

a1_seq=sigmoid(np.dot(xseq.reshape(-1,1), w1)+b1)plt.scatter(X,y)
plt.plot(xseq,a1_seq[:,0],c="red")
plt.plot(xseq,a1_seq[:,1],c="blue")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在对于输出,这是一个非常相似的计算。

  • 权重矩阵现在有了行,因为隐藏层产生了两列的矩阵。
  • 偏差矩阵是一个标量
w2 = np.random.rand(2,1)
b2=0
output=sigmoid(np.dot(a1,w2)+b2)

然后我们可以用其他曲线来绘制输出

output_seq=sigmoid(np.dot(a1_seq,w2)+b2)plt.scatter(X,y)
plt.plot(xseq,a1_seq[:,0],c=”red”)
plt.plot(xseq,a1_seq[:,1],c=”blue”)
plt.plot(xseq,output_seq,c=”black”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,随机选择的参数并不好。

总结一下正向传播:

def feedforward(input,w1,w2,b1,b2):
    a1 = sigmoid(np.dot(input, w1)+b1)
    output = sigmoid(np.dot(a1, w2)+b2)
    return output

成本函数的可视化

合适的参数是那些最小化成本函数的参数。我们可以使用交叉熵:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该函数可以编码如下:

def cost(y,output):
    return -np.sum(y*np.log(output)+(1-y)*np.log(1-output))/12

由于有 7 个参数,可视化成本函数并不容易。我们就选择其中一个来变化吧。例如 w1 中的第一重量。

b1=np.array([[16.81,-23.41]])
w2= np.array([28.8,-52.89])
b2=-17.53p = np.linspace(-100,100,10000)for i in range(len(p)):
    w1=np.array([[p[i],-37.94]])
    output=feedforward(X,w1,w2,b1,b2)
    cost_seq[i]=cost(y,output)

你可以看到它一点也不凸。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

也有可能改变两个参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了更好地形象化成本函数,我们还可以制作一个动画。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们用梯度下降法找到这个成本函数的一些合适的全局最小值,这叫做反向传播。

反向传播

偏导数可能会很难看,但幸运的是,有了交叉熵作为损失函数,最终的结果会有一些简化。

这又是成本函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 请注意,当您使用成本函数来计算模型的成本时,此函数的输入变量是模型的输出和目标变量的真实值。
  • 如果我们试图找到模型的最佳参数,那么我们认为这个成本函数的输入变量就是这些参数。我们要计算成本函数对每个参数的偏导数。

对于 w1 的偏导数,使用链式法则,我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,对于 sigmoid 函数,导数可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(请注意,代价函数是函数之和,函数之和的偏导数是函数的偏导数之和,所以为了简化记法,我们将去掉和符号,确切地说是均值计算)。

我们先按如下计算前两项:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而且我们可以注意到,它们可以简化为(yhat-y)。

然后我们得到 w1 的最终结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 b1,表达式非常相似,因为唯一的区别是最后的偏导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将用矩阵乘法对计算进行编码。在编码之前,我们可以问自己一些问题(并回答它们):

  • 残差的维数是多少(yhat — y)?它是一个列向量,行数等于总观察数。
  • w2 的维度是多少?这是一个两行一列的矩阵。记住,它是两个隐藏神经元的权重矩阵,用来计算输出。
  • (yhat — y)*w2 的维数是多少?因为维数 w2 是(2,1),所以我们不能做简单的乘法。我们做什么呢我们可以转置 w1 矩阵。然后(yhat — y)*w2 会给我们一个两列和 12 个观察值的矩阵。这是完美的,因为我们想要计算每一个重量。
  • a1 的维数是多少?这是隐藏层的结果。因为我们有两个神经元,a1 有两列和 12 个观察值。并且与先前矩阵的乘法将是逐元素的乘法。
  • 所有这些都是非常一致的,因为最终,我们将得到一个包含 2 列和 12 个观察值的矩阵。第一列与第一个神经元的权重相关联,第二列与隐藏层中第二个神经元的权重相关联。

让我们做一些编码:

d_b1_v=np.dot((output-y), w2.T) * a1*(1-a1)

这个矩阵代表什么?我们可以再次展示对 b1 的偏导数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

矩阵 d_b1_v 是所有观测值的偏导数。而要得到最终的导数,就要计算那些与所有观测值相关的和(记住,L 是函数的和),并计算平均值。

d_b1=np.mean(d_b1_v,axis=0)

对于 w1,我们必须考虑 x。对于每一个观察值,我们必须用 x 的值乘以以前偏导数得到的值,然后将它们全部相加。这就是一个点积。为了得到平均值,我们必须除以观察次数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

d_w1 = np.dot(X.T, d_b1_v)/12

现在,让我们继续输出层的参数。会简单很多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们已经有了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以 w2 和 b2 的导数是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 b2,我们只需对残差求和

np.sum(output-y)/12

对于 w2,它是 a1(层 1 的结果)和残差之间的点积。

np.dot(a1.T, (output-y))/12

包装中的最终算法

现在我们可以创建一个类来包含向前传播和向后传播这两个步骤。

我使用了基于这篇非常受欢迎的文章的 python 代码。你可能已经看过了。不同之处在于

  • 损失函数(交叉熵代替均方误差)
  • 添加学习率
class NeuralNetwork:
    def __init__(self, x, y):
        self.input = x
        self.w1 = np.random.rand(self.input.shape[1],2)
        self.w2 = np.random.rand(2,1)
        self.b1 = np.zeros(2)
        self.b2 = 0.0
        self.y = y
        self.output = np.zeros(self.y.shape) def feedforward(self):
        self.a1 = sigmoid(np.dot(self.input, self.w1)+self.b1)
        self.output = sigmoid(np.dot(self.a1, self.w2)+self.b2) def backprop(self):
        lr=0.1 res=self.output-self.y d_w2 = np.dot(self.a1.T, res)
        d_b2 = np.sum(res)
        d_b1_v=np.dot(res, self.w2.T) * self.a1*(1-self.a1)
        d_b1 = np.sum(d_b1_v,axis=0)
        d_w1 = np.dot(self.input.T, d_b1_v) self.w1 -= d_w1*lr
        self.w2 -= d_w2*lr
        self.b1 -= d_b1*lr
        self.b2 -= d_b2*lr

然后可以在梯度下降过程中存储 7 个参数的中间值,并绘制曲线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

动画是用 R 代码中的图形制作的。所以如果你对神经网络的 R 代码从零开始感兴趣,请评论。

如果你的代码对你来说很难理解,我还创建了一个 Excel (Google Sheet)文件来做梯度下降。如果你感兴趣,请在评论中告诉我。是的,你可能会认为在 Excel 中进行机器学习是疯狂的,我同意你的观点,尤其是在完成了所有七个参数的梯度下降的所有步骤之后。但目的是为了更好地理解。为此,Excel 是一个非常好的工具。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化缺失值和缺失号

原文:https://towardsdatascience.com/visualize-missing-values-with-missingno-ad4d938b00a1?source=collection_archive---------18-----------------------

浏览数据集中缺失的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伊琳娜Unsplash 上的照片

数据是新的燃料。然而,原始数据很便宜。我们需要好好处理它,从中获取最大价值。复杂的、结构良好的模型和我们提供给它们的数据一样好。因此,需要对数据进行彻底的清理和处理,以建立可靠和准确的模型。

我们在原始数据中可能遇到的一个问题是缺少值。考虑这样一种情况,我们在一些观察值(数据帧中的行)上有特征(数据帧中的列)。如果我们没有特定行列对中的值,那么我们就有一个缺失值。我们可能只有几个丢失的值,或者整个列的一半丢失。在某些情况下,我们可以忽略或删除缺少值的行或列。另一方面,在某些情况下,我们甚至不能丢失一个丢失的值。在任何情况下,处理缺失值的过程都是从在数据集中探索它们开始的。

Pandas 提供了检查数据集中缺失值数量的函数。 Missingno 库更进一步,通过信息可视化提供数据集中缺失值的分布。使用缺失号的图,我们能够看到缺失值在每一列中的位置,以及不同列的缺失值之间是否存在相关性。在处理缺失值之前,在数据集中探索它们是非常重要的。因此,我认为 missingno 是数据清理和预处理步骤中非常有价值的资产。

在本帖中,我们将通过一些例子来探索无遗漏绘图的功能。

让我们首先尝试探索一个关于流媒体平台上电影的数据集。数据集在 kaggle 上的处可用。

import numpy as np
import pandas as pddf = pd.read_csv("/content/MoviesOnStreamingPlatforms.csv")
print(df.shape)
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该数据集包含 16744 部电影和描述每部电影的 17 个特征。Pandas isna返回缺失值,我们应用sum函数来查看每一列中缺失值的数量。

df.isna().sum()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“年龄”和“烂番茄”列有许多缺失值。大约有 6 个其他列的缺失值数量超过 200。现在让我们使用 missingno 来看看我们是否能对丢失的值有一个更好的直觉。

import missingno as msno
%matplotlib inline

我们导入了缺少库。%matplotlib inline命令允许在 jupyter 笔记本中渲染可视化效果。我们使用的第一个工具是缺失值矩阵。

msno.matrix(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

白线表示缺少值。“年龄”和“烂番茄”列如我们所料被白线所支配。但是,在其他缺少值的列中有一个有趣的趋势。它们通常在公共行中缺少值。如果某行的“导演”列中缺少值,则很可能“流派”、“国家”、“语言”和“运行时间”列中也缺少值。在处理缺失值时,这是非常有价值的信息。

热图用于可视化显示不同列之间值的相关性的相关矩阵。Missingno 库还提供热图,显示不同列中的缺失值之间是否有任何关联。

msno.heatmap(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正相关与蓝色的黑暗程度成比例,如右边的条所示。“导演”、“流派”、“国家”、“语言”、“运行时间”栏目之间存在不同程度的正相关关系。“语言”和“国家”之间的相关性最高,为 0.8。这证实了我们对缺失值矩阵的直觉,因为这些列在相同的行中有缺失值。

missingno 的另一个工具是缺失值的条形图。

msno.bar(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它显示与非缺失值的数量成比例的条形,并提供非缺失值的实际数量。我们知道每一列丢失了多少。

正如我们前面提到的,为了很好地处理缺失值,我们需要理解数据集在缺失值方面的结构。仅仅知道缺失值的数量是不够的。缺少库的情节对理解缺少的值很有帮助。完成这一步后,我们可以开始考虑如何处理丢失的值。

下面的帖子提供了如何处理熊猫丢失值的详细指导。Missingno 和 pandas 可以一起使用,以便建立一个健壮而有效的策略来处理缺失值。

[## 用熊猫处理缺失值

关于如何检测和处理缺失值的完整教程

towardsdatascience.com](/handling-missing-values-with-pandas-b876bf6f008f)

感谢您的阅读。如果您有任何缺失值,请告诉我。

使用 MDS 可视化多维数据集

原文:https://towardsdatascience.com/visualize-multidimensional-datasets-with-mds-64d7b4c16eaa?source=collection_archive---------28-----------------------

多维标度可以帮助您可视化数据,甚至在二维以上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据可视化是数据科学中最令人着迷的领域之一。有时候,使用一个好的绘图或图形表示可以让我们更好地理解隐藏在数据内部的信息。我们如何在二维以上的情况下实现它?

只要我们使用二维数据集,一个简单的散点图对可视化模式和事件非常有用。如果我们使用三维数据,仍然有机会使用 3d 绘图来可视化一些东西。

但是如果我们想要可视化更高维的数据集会发生什么呢?事情会变得更加困难。想想聚类问题。如果我们可以在许多维度上可视化数据,以便检查是否存在一些模式,那将是非常美妙的。

当然,我们没有多维的视野,所以我们必须将多维数据转化为二维数据。有一种算法可以做到这一点,那就是 MDS。

什么是 MDS?

MDS(多维缩放)是一种算法,它将一个数据集转换为另一个数据集,通常具有更低的维度,并保持点之间的欧氏距离不变。

保持距离是 MDS 的一个非常有用的特性,因为它允许我们合理地保持模式和聚类,例如,如果我们想要执行 K-Means 或其他类型的聚类。

因此,举例来说,如果我们有一个 4 维数据集,并希望将其可视化,我们可以使用 MDS 在 2 维缩放它。点之间的距离保持在原始数据集中,因此,如果数据自组织成簇,即使在缩放过程之后,它们也是可见的。

当然,低维新点的坐标不再有商业价值,是无量纲的。值由散点图的形状和点之间的相对距离决定。

值得一提的是,在将数据集交给 MDS 之前,应该对其进行规范化或标准化。例如,这非常类似于我们对 K 均值聚类所做的工作。原因很简单:我们不希望仅仅因为某些特征的数量级比其他特征高,就赋予它们更多的权重。简单的 0-1 归一化将有效地解决这个问题。

在 Python 中,在包sklearn的模块manifold下有一个很好的 MDS 实现。让我们看一个使用著名的 Iris 数据集的例子。

Python 中的一个例子

我们将使用 MDS 对虹膜数据集的 4 个特征进行二维缩放,使其可视化。首先,我们将对特征进行 0-1 的缩放,然后我们将进行二维 MDS 并绘制新数据,根据虹膜数据集的目标变量为每个点赋予不同的颜色。

让我们开始导入一些库。

import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.manifold import MDS
from sklearn.preprocessing import MinMaxScaler

现在,让我们加载虹膜数据集。

data = load_iris()
X = data.data

我们现在可以用MinMaxScaler进行 0-1 的缩放

scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

然后,我们应用 MDS 程序得到一个二维数据集。设置 random_state 是为了使每个图都可以再现。

mds = MDS(2,random_state=0)
X_2d = mds.fit_transform(X_scaled)

最后,我们可以绘制新的数据集。

colors = ['red','green','blue']plt.rcParams['figure.figsize'] = [7, 7]
plt.rc('font', size=14)for i in np.unique(data.target):
  subset = X_2d[data.target == i]

  x = [row[0] for row in subset]
  y = [row[1] for row in subset] plt.scatter(x,y,c=colors[i],label=data.target_names[i])plt.legend()
plt.show()

这是结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,“setosa”点距离其他点非常远,它们自己创建了一个集群。如果不以这种方式绘制数据,就很难获得这种洞察力。

结论

使用 MDS 可视化多维数据在许多应用中非常有用。例如,它可用于检测某些多元分布中的异常值。考虑一下预测性维护,有些设备的行为会偏离其他设备。另一个有用的用例是集群。在使用 K-Means 或 DBSCAN 之前,查看数据是否自组织成簇是有用的。如果数据集不太大,MDS 计算会非常简单快捷。否则,云架构可以成为加速计算的有用工具。

参考

[1]多维标度。维基百科。https://en.wikipedia.org/wiki/Multidimensional_scaling

用 R #新冠肺炎想象疫情

原文:https://towardsdatascience.com/visualize-the-pandemic-with-r-covid-19-c3443de3b4e4?source=collection_archive---------13-----------------------

作为一名数据科学家,你可以用新冠肺炎数据做什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:JHU·CSSE

按照疾病预防控制中心的建议,我们可以做两件事:阅读关于新冠肺炎的新闻,以及被不断增加的病例数压垮。过去几周情况有多糟?我的手机不停地播放着来自世界各地的新闻:首先是我在中国的家乡,然后是亚洲其他地方、欧洲和美国。超过一半的纽约已经停止通勤。我们已经用拳头碰撞代替了握手,现在,新的标准是:社交距离。五天前的 3 月 12 日,世界卫生组织宣布新冠肺炎为疫情。到目前为止,全世界 142 个国家超过 16 万人被确诊患有这种疾病。我觉得有义务用 R 创建一个追踪器来解释这个疫情。

我用的是南方医科大学广创于博士研发的 R 包“ nCOV2019 ”。这个软件包允许我们访问所有国家案例的最新数据和历史数据,在地图上绘制数据,并创建各种图表。如果你像我一样是一个有抱负的数据科学家,请随意安装该软件包,并按照以下步骤创建可视化:

部署软件包

探索数据

创建视觉效果

  • 按国家的折线图
  • gif 中的全球新冠肺炎增长

影响分析

  • 接下来 10 天我们会有多少病例?
  • 冠状病毒正在影响好莱坞吗?
  • 我们还在外面吃饭吗?(带 OpenTable 数据)

部署包

提取该包中嵌入的数据的基本函数有:

  • get_nCov2019()查询网上最新信息
  • load_nCov2019()获取历史数据
  • summary[访问数据
  • plot在地图上显示数据

安装并部署软件包

remotes::install_github(“GuangchuangYu/nCov2019”)
**require**(nCov2019)
**require**(dplyr)

第一印象

x <- get_nCov2019()
y <- load_nCov2019()> xChina (total confirmed cases): 81134last update: 2020–03–17 21:19:04> ynCov2019 historical datalast update: 2020–03–16

跟上时代是非常重要的。简单地打印 x 和 y 将刷新数据。

> x['global',]name confirm suspect dead deadRate showRate  heal healRate showHeal1                          China   81134     128 3231     3.98    FALSE 68800    84.80     TRUE2                          Italy   27980       0 2158     7.71    FALSE  2749     9.82    FALSE3                           Iran   16169       0  988     6.11    FALSE  5389    33.33    FALSE4                          Spain   11178       0  491     4.39    FALSE   571     5.11    FALSE5                    South Korea    8320       0   83        1    FALSE  1401    16.84    FALSE6                        Germany    7272       0   17     0.23    FALSE   135     1.86    FALSE7                         France    6650       0  148     2.23    FALSE    28     0.42    FALSE8                  United States    4687       0   93     1.98    FALSE    74     1.58    FALSE9                    Switzerland    2269       0   19     0.84    FALSE     4     0.18    FALSE10                United Kingdom    1950       0   56     2.87    FALSE    52     2.67    FALSE

如何创建数据的概览?x[‘global’,]返回最新的全球数据,并按确诊病例数自动排序。

探索数据

首先,让我们探索当前数据的整体结构。DataExplorer 是一个 R 包,可以快速构建可视化。

#explore package
**library**(DataExplorer)
plot_str(x)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过get_nCov2019()函数获得的数据包括 3 个列表和 5 个数据帧。这些是中国和世界各地确诊患者、死亡和康复病例的最新数据。

plot_str(y)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了研究趋势,我重点研究了历史数据。通过函数load_nCov2019()获得的历史数据是一个列表,包括 3 个数据帧。名为“数据”的第一个数据框架是中国城市层面的历史数据,包括确诊病例、死亡、康复和疑似病例的数量。第二个名为“省”的是省级别的聚合数据。第三个数据框架“全球”包括世界各国的确诊病例、死亡和恢复情况。这些历史数据涵盖了从 2 月 15 日到最近更新的时间范围。

> summary(x['global',])
     name              confirm           suspect              dead           deadRate        
 Length:131         Min.   :    1.0   Min.   :  0.0000   Min.   :   0.00   Length:131        
 Class :character   1st Qu.:    4.5   1st Qu.:  0.0000   1st Qu.:   0.00   Class :character  
 Mode  :character   Median :   30.0   Median :  0.0000   Median :   0.00   Mode  :character  
                    Mean   : 1223.3   Mean   :  0.8626   Mean   :  45.44                     
                    3rd Qu.:  137.5   3rd Qu.:  0.0000   3rd Qu.:   1.00                     
                    Max.   :81062.0   Max.   :113.0000   Max.   :3204.00                     
   showRate              heal           healRate           showHeal        
 Length:131         Min.   :    0.0   Length:131         Length:131        
 Class :character   1st Qu.:    0.0   Class :character   Class :character  
 Mode  :character   Median :    0.0   Mode  :character   Mode  :character  
                    Mean   :  582.3                                        
                    3rd Qu.:    3.5                                        
                    Max.   :67023.0

我使用了 summary()函数来获得数据的统计概览。全球确诊病例的中位数是 30 例,而平均数是 1223.3 例。原因是异常值中国对平均确诊病例有很大影响。

创造视觉效果

可视化是探索性数据分析的另一个关键方法。通过图像,我们可以很容易地观察到国家和国际层面的疫情趋势。

  • 国别折线图

上面已经提到了如何使用 x[‘全球’,]获得确诊病例最多的前 10 个国家。我们还可以绘制折线图,查看每个国家的病例增长情况。

#obtain top 10 country
d <- y[‘global’] #extract global data
d <- d[d$country != ‘China’,] #exclude China
n <- d %>% filter(time == time(y)) %>%
 top_n(10, cum_confirm) %>%
 arrange(desc(cum_confirm))#plot top 10
**require**(ggplot2)
**require**(ggrepel)
ggplot(filter(d, country %**in**% n$country, d$time > ‘2020–02–15’),
 aes(time, cum_confirm, color=country)) +
 geom_line() +
 geom_text_repel(aes(label=country),
 **function**(d) d[d$time == time(y),]) +
 theme_minimal(base_size=14) +
 theme(legend.position = “none”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新冠肺炎确诊病例排名前 10 位的国家(不包括中国)

该图显示了中国以外确诊病例最多的前 10 个国家。意大利和伊朗是受感染最严重的国家,并且呈指数增长。与此同时,韩国通过有效的遏制战略,拉平了曲线,放缓了增长速度。其他一些欧洲国家和美国也出现了成千上万的新病例。

  • gif 中的全球新冠肺炎增长

全球的整体情况如何?用 plot()函数可以很容易地绘制出全球新冠肺炎确认数地图。

x <- get_nCov2019()
x
plot(x) #plot global map

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新冠肺炎全球 3 月 15 日确诊病例

随着时间的推移会有什么变化呢?如果我们能以 gif 的形式展示这些变化,那将是一个很好的主意。我绘制了从 02-12 到 03-15 每天的全球地图,并用 R 包 magick 创建了一个 gif。

#visualize global growth over time
**library**(magick)y <- load_nCov2019()d <- c(paste0(“2020–02-”, 12:29), paste0(“2020–03–0”, 1:9), paste0(“2020–03–1”, 0:5))
img <- image_graph(1200, 700, res = 96)
out <- lapply(d, **function**(date){
 p <- plot(y, date=date,
 label=FALSE, continuous_scale=TRUE)
 print(p)
})
dev.off()animation <- image_animate(img, fps = 2)
print(animation)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新冠肺炎全球 2 月 12 日至 3 月 15 日确诊病例

现在我们可以看到冠状病毒是如何从中国开始,在短短一个月内传播到世界上大多数国家的。

影响分析

  • 在接下来的 10 天内,我们会有多少个案例?

接下来,我们可以使用现有数据预测未来的病例增长。

以美国为例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新冠肺炎确诊病例在美国增长

通过查看图表,我们可以很容易地发现病例以指数速度增长。在这种情况下,我们可以应用对数线性回归来建模和预测增长。我只考虑确诊病例超过 100 例的时间段,原因如下:

  • 早期测试中
  • 早期病例大多与旅行有关,而不是社区传播
usdata <- d %>%filter(d$country == ‘United States’ & d$cum_confirm>100) %>%select(time,cum_confirm)library(forecast)case <- ts(usdata[,2], start=1,frequency = 1)fit <- tslm(log(case) ~ trend)fc <- forecast(fit, h=10)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

美国确诊病例对数的时间回归模型

我们的对数线性模型非常适合数据集。0.9974 的调整 R 平方表明 99%的方差可以用我们的模型来解释。

Residuals:Min        1Q    Median        3Q       Max-0.095126 -0.036574 -0.000754  0.036861  0.069923Coefficients:Estimate Std. Error t value Pr(>|t|)(Intercept) 4.311641   0.032840  131.29  < 2e-16 ***trend       0.288296   0.004462   64.61 1.92e-14 ***---Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 0.05336 on 10 degrees of freedomMultiple R-squared:  0.9976, Adjusted R-squared:  0.9974F-statistic:  4175 on 1 and 10 DF,  p-value: 1.92e-14

现在我们可以回答这个问题了,10 天内我们会有多少个案例?

我们可以用forecast()来做未来 5 天的预测(h 周期用来设置预测周期)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Forecasts:Point Forecast     Lo 80     Hi 80     Lo 95     Hi 9515       5382.300  4936.042  5868.904  4683.598  6185.23516       7148.845  6541.200  7812.938  6198.094  8245.43617       9495.195  8666.463 10403.174  8199.463 10995.68618      12611.649 11479.941 13854.922 10843.598 14667.98119      16750.966 15204.003 18455.327 14336.190 19572.48420      22248.863 20132.776 24587.365 18948.614 26123.91221      29551.247 26655.278 32761.849 25038.879 34876.81022      39250.374 35286.012 43660.130 33079.244 46572.76423      52132.888 46705.412 58191.072 43692.648 62203.55324      69243.620 61813.326 77567.075 57700.726 83095.642

预测结果显示,如果确诊病例继续以指数速度增长,该数字将在 3 天内翻一番,并在 10 天内达到近 70,000 人。

这就是采取预防措施如此重要的原因。在数周的逐渐增长后,受感染人数会突然增加,这在最初似乎是可以控制的。医疗能力将不堪重负,医护人员将处于危险之中。

重要的是,我们都开始社交距离,避免去公共场所,以减缓增长速度,否则就太晚了。

  • 冠状病毒在影响好莱坞吗?

几个主要城市已经关闭了电影院,以避免人群聚集。然而,大多数北美影院在过去的周末仍然开放。好莱坞受到疫情影响了吗?

我从 boxofficemojo.com 收集了 2019 年和 2020 年的每日票房数据,并将今年的票房表现与去年进行了比较。然后,我将结果绘制在一张线图上。

ggplot(boxoffice,
 aes(date, rate))+
 geom_line(color = ‘red’) +
 geom_hline(yintercept=0) +
 theme_minimal(base_size=14) +
 scale_y_continuous(“year-on-year box office”, labels=scales::percent, breaks = c(seq(-1,0.5,0.1)))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

逐年美国票房对比

结果是惊人的。3 月 5 日的票房与去年相比下降了 60%,3 月 17 日的票房几乎下降了 70%。

据综艺报道,北美影院的票房收入创下二十年来的新低。

随着越来越多的城市开始关闭电影院,我们可能会看到票房收入进一步下降。

  • 我们还在外面吃饭吗?(带 OpenTable 数据)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我在推特上看到很多抱怨,尽管疾控中心警告避免人群聚集,人们仍然去酒吧和餐馆。人们还像往常一样在外面吃饭是真的吗?

我看到了在线餐厅预订提供商 Opentable 发布的用餐人数数据。

数据显示了 OpenTable 网络上所有渠道的餐厅年复一年的用餐人数:在线预订、电话预订和上门预订。我绘制了美国和欧洲六个主要城市从 2 月 18 日到今天的食客变化:拉斯维加斯、洛杉矶、纽约、伦敦、多伦多和汉堡。

ggplot(opentable,
 aes(date, rate, color=City)) +
 geom_line() +
 geom_text_repel(data = opentable[opentable$date == “2020–03–16”,], aes(label=(City)) +
 theme_minimal(base_size=14) +
 geom_hline(yintercept=0) +
 scale_y_continuous(“year-on-year change”, labels=scales::percent, breaks = c(seq(-1,0.5,0.1))) +
 theme(legend.position = “none”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

逐年 Opentable 保留比较

图表显示,自三月份的第二周以来,所有六个主要城市的餐馆顾客数量都在快速下降。每个城市的用餐人数都下降了 50%以上。在洛杉矶,这个数字与去年相比下降了 80%以上。

数据证明,人们外出就餐的次数比平时少了,这对餐饮业尤其有害。由于大多数餐馆的利润率相对较低(3%-5%),固定成本比率较高,因此收入的小百分比下降就足以扼杀业务,并将员工送上街头。

尽管新冠肺炎没有完全阻止美食家去餐馆,但在未来几周,他们这样做的机会可能会减少。像麦当劳和塔可钟这样的几家食品连锁店正在关闭他们的餐饮服务。与此同时,纽约市和俄亥俄州关闭了该地区所有的酒吧和餐馆。

按照上面的步骤,你可以创造出和我一样的视觉效果,如果不是更好的话。当冠状病毒仍在全球传播时,作为一名数据爱好者,您也可以使用“ncov 2019”R 包探索新冠肺炎数据,并帮助向人们通报您的发现。

我要感谢 Alice Yang 提供的建设性意见。

— — — — — —

嗨!我叫钱。我是一名数据爱好者,擅长数据分析和数据可视化。我目前正在纽约市攻读营销情报硕士学位。自从今年一月中国武汉爆发冠状病毒以来,我一直在关注它。上个月,我在美国仪表盘中创建了一个新冠肺炎,让人们跟踪美国的最新情况。(查看这里)现在我正在寻找实习机会。我很想和你一起喝杯(虚拟)咖啡!

我的 LinkedIn

在 xinhan.qian@outlook.com 联系我

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

可视化稀疏矩阵

原文:https://towardsdatascience.com/visualizing-a-sparse-matrix-1c4c807ea6c9?source=collection_archive---------35-----------------------

怎么知道自己有没有稀疏矩阵?想象一下!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亨利&公司在 Unsplash 上拍摄的照片

机器学习的许多领域通常使用稀疏矩阵。如果你曾经使用 One-Hot-Encoding、CountVectorizing 或 TfidVectorizing 对 NLP 字典进行过矢量化处理,你应该知道我指的是什么。

简而言之,稀疏矩阵包含许多零,而密集矩阵则不包含。

import scipy.sparse as sparse
import matplotlib.pyplot as plt*%matplotlib inline*# adjust the density parameter
sparse = sparse.random(10,10, density=0.015)
sparse.toarray()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稀少的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稠密的

plt.figure(figsize=(15, 15))
plt.spy(sparse, markersize=1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稀少的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稠密的

我目前正在使用一个超过 15,000 个单词的 NLP 字典,我一直想看看这样大小的稀疏矩阵会是什么样子。尽情享受吧!

可视化人工智能

原文:https://towardsdatascience.com/visualizing-ai-86247fa2a182?source=collection_archive---------31-----------------------

解构和优化 SHAP 的概要情节(2/2)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然你已经理解了 SHAP 概要图的各个组成部分是如何一起工作的( part 1 ),我将提供一个使用它来解释黑盒机器学习模型的例子。此外,我将讨论示例中可视化的一些问题,然后提供一些改进的想法。这些文章的目标是帮助读者解释可视化,优化它,并对结果有更深的理解。

示例:了解工作绩效的影响

这个例子的代码可以在 GitHub 的这里找到。

数据:人力资源数据集

我使用的数据是 IBM 的人力资源数据,可以在 Kaggle 获得。这些数据的最初目的是为了了解人员流失,但在这里我用它来了解工作场所的绩效评定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IBM HR 数据集的一个片段

为了减少必要的数据准备量,我通过减少特征的数量来简化数据。此外,对数据的检查表明,绩效评级被限制在 3 或 4(满分为 1-4)。因此,为了使用数据来说明回归数据的汇总图的功能,我通过应用一组转换将评级重新调整为 0-9 之间的实数(参见 GitHub 上的数据文件)。

在下面对结果的讨论中,我将分析这些假定虚构的数据,并假设数据和最终模型背后可能的故事。

汇总图

在这个练习中,我使用了 scikit-learn 中的随机森林算法,并使用了 SHAP 树解释器进行解释。

model = RandomForestRegressor(max_depth=4, random_state=1,               n_estimators=10)model.fit(X_train, y_train)shap_values = shap.TreeExplainer(model).shap_values(X_train)

下图显示了在我们的示例中使用 SHAP 的过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面的条形图显示了要素名称及其对应的平均 SHAP 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种类型的条形图是特征属性算法结果的典型表示。在这里,它根据平均 SHAP 值按重要性降序列出了这些特征。

如上所示,具有最高平均 SHAP 值的要素是“PercentSalaryHike”。这个值是如此的重要,以至于很难说出其他顶尖影响者的相对差异。事实上,“PercentSalaryHike”占主导地位,这表明数据或我们对数据的解释可能有问题。

让我们进一步调查。摘要图如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的汇总图显示,“PercentSalaryHike”的高值(红点)与正 SHAP 值相关,而“PercentSalaryHike”的低值(蓝点)通常与负 SHAP 值相关。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于原始数据没有指定相对于绩效评定的加薪时间,因此对结果有两种解释:

  1. 绩效评分高是因为之前的薪资评估导致薪资大幅提升。
  2. 高工资是高绩效评定的结果。换句话说,员工因为出色的工作表现而获得丰厚的加薪。

在我看来,合乎逻辑的解释可能是#2。也就是说,员工因为表现良好而获得高百分比的加薪。当然,这是我的猜测,但它很好地提醒了我们,XAI 工具总体上反映了底层机器学习算法的本质。具体来说,它们在相关性领域中运行,并且它们的结果在因果方向方面是模糊的。因此,结果并没有告诉我们“PercentSalaryHike”是好的工作表现的原因,它只是告诉我们它是高度相关的。在这种情况下,比模型中的其他特征更明显。

在前五个特征中,“年龄”似乎也遵循一种模式,即高值与高 SHAP 值相关联,低值与低 SHAP 值相关联。这种模式似乎也适用于摘要图中的“StockOptionLevel ”,尽管对比度较小。

其余要素的 SHAP 值似乎聚集在零附近,但由于绘图中需要缩放,因此很难看到细节。也就是说,为了容纳来自第一特征的大值,必须压缩可视化。

优化 SHAP 汇总图

显然,尽管汇总图本身是有用的,但有许多问题妨碍我们更容易地理解结果。在这一节中,我将讨论其中一些问题,并提出在 SHAP 解决这些问题的建议。

改善对比度和颜色选择

首先也是最重要的是使用红色来表示高价值。红色是一种非常情绪化的颜色。它通常被用作危险的警告,在西方文化中通常有负面的含义。红色的使用和关闭本身并不是问题。然而,在我们的例子中,这是特别成问题的,因为我们处理的是金钱价值、经验和年龄,而高价值可能不是一件坏事。在这种情况下理解一个情节尤其困难,因为颜色和特征值之间的相互作用会产生认知干扰

第二个问题是,由于对颜色不敏感,从蓝色到红色的过渡可能会对一些用户造成差异问题。特别是,蓝色和紫色的使用要避免相互重叠。

摘要图设计者犯的错误类似于那些使用“彩虹色”方案进行数据可视化的错误(例如在“热图”中)。也就是说,彩虹色调色板看起来很吸引人,但在感知和语义上有问题

已经有讨论关于为“点”类型提供定制调色板(主要作为处理业务需求的一种方式),但是到目前为止它仍然是即将到来的。为了解决所讨论的问题,我调整了源代码并删除了红色的使用。我也选择了单一的颜色,但改变了亮度,使其更容易看到色差。

新的汇总图如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我认为由此产生的图更容易一眼解析,因为有更少的颜色需要破译。此外,切换到更亮的蓝色作为高数字的指示,使更高的值更加突出。但是,对于习惯于将蓝色视为低数字的用户来说,这可能是一个问题。如果是这种情况,我会推荐翻转两端颜色。

减少特征的数量

遵循一个众所周知的设计策略,我剔除了一些没用的信息。由于要素的大多数值彼此非常接近,并且大多数 SHAP 值都接近于零,因此我们有必要通过设置 max_display 参数来关注顶部的要素集:

shap.summary_plot(shap_values, X_train, max_display=5)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

移除不明确的特征

如上所述,不清楚“PercentSalaryHike”是绩效评级的事前衡量还是事后衡量。如果员工因良好的绩效评级而获得加薪,那么这就不那么令人感兴趣了,因为我们感兴趣的是有助于良好绩效的因素。虽然观察以前的加薪是否对绩效评级有任何影响也很有趣,但鉴于不清楚加薪的时间,谨慎的做法是完全消除这种影响。

上面关于“PercentSalaryHike”模糊性的评论也可以应用于与货币值相关联的其他特征。对于前 5 名,这包括“StockOptionLevel”。在我们的分析中,我们可以假设其他因素(如工作距离、年龄)保持相对相似,无论它们是工作绩效评定的后评估还是前评估。

更好的缩放

由于“PercentSalaryHike”占主导地位,x 轴的刻度必须扩展以适应值的大小。因此,很难看出 SHAP 值是如何分布的。

幸运的是,从前五个特性中删除“PercentSalaryHike”和“StockOptionLevel”可以自动解决这个问题。我们模型的新汇总图如下所示,放大倍数更合适。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由此产生的情节更简单,更容易理解。该图显示,较高的总工作年限和年龄值与较高的 SHAP 值相关(这反过来意味着较高的绩效评级)。此外,低值也与低 SHAP 值相关。这支持了成熟度和工作经验有助于良好工作表现的想法。

第三个特征更难解释。较高的“离家距离”(即住得离工作地点较远)似乎与较高的 SHAP 值相关。如果不了解在家工作的政策以及员工对在家工作的感受,就很难解释这个结果。此外,色标之间的对比度不是特别明显,因为该图显示一些高值也会对性能评级产生负面影响(左侧的浅蓝色点)。这一结果表明,这是一个值得研究的领域,并建议人力资源部门在通勤领域以及在家工作政策的总体影响方面开展进一步的研究。

当然,这是虚构的数据,因此这里的任何解释都纯粹是为了演示可以完成的潜在分析。除了 SHAP 值的大小和它们之间的微小差异之外,摘要图显示大多数值倾向于聚集在零附近的事实也提醒我们,最好谨慎地解释结果,并且需要收集额外的确证证据。

关于 XAI 改进的一些设想

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亚当·诺瓦克斯基在 Unsplash 上的照片

虽然设计更好的 XAI 系统,一般来说,超出了本文的范围,但我想简要地讨论一些当前工具可以立即做出的改进的设想;尤其是在用户体验和数据可视化设计领域。

  • 提供更好的对比度和颜色选择。不仅要避免可能引起混淆的颜色(例如,使用红色来表示好的结果),还要在调色板中提供易于识别的选择,并且对所有用户都是通用的。
  • 能够交互式地从可视化中移除特定特征。来自社会科学的研究表明“解释是被选择的”,从这个意义上说,我们从一组可能的原因中挑选一两个原因作为解释。对于最终用户使用的 XAI 工具,可视化需要变得更具交互性。它们需要允许用户轻松地选择一组特性并关注它们,而不需要以编程方式明确地这样做。
  • 支持迭代探索。最近的一项研究表明,寻找解释的过程是反复的。事实上,上述定位少数有影响特征的过程遵循了寻找解释的迭代分析模式。能够看到结果,探索不同的可能性,对比不同的特征,检查它们的相互作用,等等。反复地做这件事对于接受解释的用户来说是非常有价值的。
  • 支持从高级视图到功能级别的单个视图的转换。在前面的基础上,放大/缩小、从聚焦一个功能或对比一组功能的能力将允许用户跟踪他们的调查以及处理我们在示例中遇到的缩放问题。

无需等待 XAI 的重大研究突破,我认为可以立即做出一些具体的改进,以便它们可以用来更好地解释机器学习模型的结果。希望以后能多写点这个话题。

总结和结论

在本文中,我使用了 SHAP 摘要图来解释黑盒模型输出背后的影响。利用可视化,我假设了数据和最终模型背后的一个可能的故事。在讲述一个假设故事的过程中,我发现了一些数据中的模糊之处,以及 SHAP 概要情节设计中的问题。然后,我提出了一些改进可视化的想法,并确定了澄清数据所需的进一步工作。最后,我为 XAI 系统提供了一些尝试性的想法,这样它们就可以适应用户寻求解释时的行为方式。

SHAP 带来了许多丰富的可视化效果,值得比现在更多的关注。如果您是负责向最终用户交付系统或报告的数据科学家,那么希望本文能够帮助您做出必要的调整,以便更有效地使用可视化。如果您是最终用户决策者或最终用户消费者,您现在应该对 SHAP 汇总图有了更好的理解。反过来,这将有望使你能够要求以一种更容易理解的方式呈现结果。

可视化人工智能

原文:https://towardsdatascience.com/visualizing-ai-8fad4ea70b87?source=collection_archive---------24-----------------------

解构和优化 SHAP 的概要情节(1/2)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片负空格 / CC 由 2.0

人工智能中的可解释性目前是一个热门话题。随着人工智能系统在决策中发挥越来越大的作用,人们普遍认为这些系统需要提供支持其决策或建议的信息。

现在有一个新兴的行业和大量的研究兴趣来提供可解释的人工智能(XAI)工具和服务,旨在帮助人工智能系统向用户解释他们的决策和行动。与此同时,政府开始要求向可能受到自动决策影响的个人提供解释。事实上,欧洲的通用数据保护条例规定,当个人受制于“完全基于自动处理的决定”并产生“法律效力”或类似意义的结果时,个人有权获得“有关所涉逻辑的有意义的信息”。

值得注意的是,最后一句话提出了一个想法,不仅这些系统需要提供解释,而且个人应该能够清楚地理解所提供的信息。毫无疑问,监管的这一部分将在未来引起激烈的争论。然而,从眼前的实际角度来看,这(以及其他正在制定的立法)应被视为一种呼吁,不仅呼吁这些系统提供关于结果如何得出的信息,而且呼吁我们密切关注它们是如何呈现的,以便受影响的个人能够有效地理解它们。

理解可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

过去,XAI 工具的结果通常以初级形式呈现。例如,用数字表和/或某种条形图。

这些结果很容易解释,但它们的解释力有限。这部分解释了为什么这些工具经常被归类为“可解释的”人工智能,而不是“可解释的”人工智能,因为它们揭示了底层算法正在做什么,但没有以一种全面的方式传达正在发生的事情,以便用户可以带着对解释的“有意义的”理解离开。

最近,一些 XAI 工具已经开始解决这个问题。例如,通过提供丰富的可视化作为对结果的更全面解释的一部分。这些可视化功能非常强大,因为它们超越了传统的基本图形类型的汇总统计。然而,对于门外汉来说,他们更难解释和理解。

在本文的第 1 部分,我将描述 SHAP,一个流行的 XAI 工具,如何展示它的结果。具体来说,我将重点描述它附带的丰富的可视化之一:摘要情节。在第 2 部分中,在提供一些改进可视化的想法之前,我将给出一个使用它来解释黑盒机器学习模型的例子。目标是帮助读者解释可视化,优化它,并对结果有更深的理解。

本文面向对机器学习概念有基本了解,并且有兴趣更彻底地了解 XAI 工具的结果的任何人。就用户类型而言,这篇文章对于负责向最终用户提供报告的数据科学家,或者将要接收 XAI 工具结果的最终用户决策者或最终用户消费者最有用。

SHAP

SHAP 主张沙普利附加解释。它属于一类被称为特征属性或特征重要性的 XAI 工具。这些工具通过揭示不同的输入特征对输出的强烈影响来展示机器学习模型的工作方式。SHAP 使用的方法是合作博弈理论中的一个解决方案,称为沙普利值(以提出这一想法的美国数学家和诺贝尔奖获得者劳埃德·沙普利的名字命名)。

关于 SHAP 是什么,它做什么,如何使用它,以及 Shapley 值背后的数学基础,有很多很好的文章,所以我不会在这里试图详细重复它们。

SHAP 已经在许多平台上实现,但是使用 SHAP 的一般过程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 使用机器学习模型(例如随机森林、神经网络)对数据建模。
  2. 将生成的模型和你的数据输入 SHAP。
  3. SHAP 计算模型的影响(使用沙普利值)并输出一组 SHAP 值。
  4. 然后,您可以使用 SHAP 提供的可视化工具显示输出。

SHAP 并不是唯一实现沙普利价值观的工具集(例如 IML )。然而,在我看来,它与众不同的一点是它提供了一系列有趣的可视化效果。不幸的是,目前大多数谈论 SHAP 的文章对它们以及它们如何帮助用户理解结果说得很少。

汇总图

我不会详尽地浏览每一个 SHAP 的可视化,我会把重点放在一个叫做概要图。选择这个的原因是因为我觉得这是最有趣的可视化之一,也因为它因为难以理解而受到了一些批评。我将首先一步一步地彻底描述 SHAP 摘要情节,然后在一个例子中使用它来解释第二部分中的黑盒机器学习模型。

什么是 SHAP 摘要情节?

目前有四种类型的摘要图:点、条、小提琴和紧凑点。在本文中,我将关注“点”类型,这是单个输出模型的默认汇总图。

SHAP 汇总图提供了一个高层次的复合视图,显示了要素的重要性及其 SHAP 值在数据中的分布情况。汇总图是沼泽图小提琴图的结合,显示了所有实例,结果图形显示了数据的频率和分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要显示汇总图,只需使用要解释的数据及其相应的 SHAP 值调用汇总图函数:

shap.summary_plot(shap_values, X)

在这里,我使用的是 Python 版本的 SHAP 包。上面的图是使用一个 100 乘 5 的随机数矩阵生成的:

shap.summary_plot(np.random.randn(100, 5), np.random.randn(100, 5))

所以你看到的是一个有 100 个实例的模型,每个实例有 5 个特征。该模型有一个实数输出,正如您对回归模型的期望。

解构概要情节

我们如何开始理解这种视觉化?这个模型告诉了我们什么?让我们从斧头开始。在 y 轴上,功能按重要性降序排列。换句话说,影响最大的特性列在顶部,影响最小的列在底部。

在 x 轴上,有一个 SHAP 值的刻度,垂直线为零。正值在线的右边,负值在线的左边。点在图中的位置表示实例的特定特征的 SHAP 值。将模型预测值拉低的值在左边,将预测值拉高的值在右边。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的图显示了一个具有 5 个特性的数据实例。这表明特征 2 是最有影响力的特征。下一个最有影响力的是特性 4,以此类推。特征 2 的 SHAP 值为正值,约为 2.1。特征 4,尽管它是第二大影响力,却是一个负数,大约为-1.5。这是因为特征重要性是关于特征的绝对影响,而不是它们是否以某种方式影响模型的输出。所以在这个例子中,这两个特征将模型的输出拉向相反的方向。

如果另一个实例具有相同的 SHAP 值,那么它将垂直堆叠。然而,垂直堆叠仅在行的边界内进行一定的距离。之后,它开始重叠。通过这种方式,汇总图可以在一个小空间内有效地缩放到数十万个数据点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们来看看颜色和它们的含义。颜色区分实例之间特征值的相对大小。高值(相对于其他实例)显示为红色;低值显示为蓝色;根据图右侧的颜色图,中间值为紫色阴影。

随着更多数据点的添加,它们的位置显示了每个要素的 SHAP 值的范围和分布。例如,它是像正常曲线一样聚集在中间(但也是镜像的),还是向一端倾斜?

具有相似值的要素的聚类在图中创建了“颜色斑块”。面片的位置让用户了解值的大小如何影响模型的输出。例如,如果红色斑块(高值)位于零的左侧,则意味着高特征值共同将模型的输出拉向一个较低的数值。如果他们在右边,那就意味着他们正在把模型的输出推向一个更高的数字。类似地,根据其位置,蓝色补丁(低值)可能会影响模型的输出变低或变高。

这里有一个例子来说明色标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们看第一个特征,该图显示激素避孕药年数的低值(蓝色斑块)与较低的预测癌症风险相关,高值(红色点)与较高的风险相关。

就像 Seaborn Swarm 情节和 Violin 情节一样,SHAP 摘要情节可以被认为是情节中的情节。我们可以将数据作为一个整体进行检查,也可以查看每个类别(在本例中是要素)并检查其中的细节。例如,我们可以在上面的图中看到,第一个要素(激素避孕药年数)的值的分布向左倾斜,这表明总体而言,该要素正在影响模型的输出,使其数值变小。

SHAP 值聚集在零附近的要素通常意味着大多数值对模型的输出没有太大影响(此时忽略要素之间的交互)。上图中的下半部分特征就是这样,这也是为什么它们没有上半部分特征那么有影响力的原因。

摘要

总而言之,摘要图回答了以下问题:

  • 哪些特性对模型的输出影响最大?

特性在图的左侧按重要性降序排列。

  • 某个特性会影响输出值的大小吗?

如果点的聚类位于零线的右侧,则该特征会影响模型的输出,使其成为更大的数字。如果点簇位于左侧,则该特征会影响模型的输出,使其成为一个较小的数字。

  • 这些影响有多强?

点的聚类越靠右,对输出的影响就越大。点簇越靠左,对输出的影响就越大,输出的数值就越小。

  • SHAP 值的分布是什么?

点的形状表示每个要素的 SHAP 值的分布。也就是说,这些值是服从正态分布、偏态分布还是分散分布。

  • 特征值的相对大小如何影响模型?

蓝色色标(小特征值)或红色色标(大特征值)的位置显示了特征值的不同大小,以及它们是否影响模型的输出为较高的数值或较低的数值。

摘要图是在紧凑的空间内快速回答这些问题的有效可视化工具。

结论

我希望这篇文章对组成 SHAP 概要情节的各种组件以及它们如何协同工作提供了有益的讨论。因此,您能够通过这种可视化快速理解机器学习模型输出背后的影响。

当理解不同的输入特征如何影响模型的输出时,我发现摘要图是对其他可视化的非常有用的补充。然而,概要情节的设计并非没有挑战。在本文的第 2 部分中,我将通过一个例子来解释黑盒机器学习模型,然后提供一些解决一些挑战的想法。

[1] S.M. Lundberg,G. G. Erion 和 S. Lee,(2019),华盛顿大学。

[2] H. Michael,解释可解释的 AI (2019),XRDS: Crossroads,2019 年 4 月。

[3] S.M. Lundberg,S. Lee,解释模型预测的统一方法 (2017)。

在药物发现中可视化人工智能初创公司

原文:https://towardsdatascience.com/visualizing-ai-startups-in-drug-discovery-cb274eea2792?source=collection_archive---------52-----------------------

药物发现中人工智能初创公司的数据分析和交互式仪表板

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯汀·三都在 Unsplash 上的照片

作为一名生物学领域的机器学习研究人员,我一直在关注最近新兴的人工智能药物发现领域。我本人住在多伦多,这个领域的许多“明星”公司都是在那里成立的(Atomwise、BenchSci、Cyclica、Deep Genomics、protein qure……仅举几例!),我和这个领域的很多人聊过,也参加过一些关于这个话题的 meetup 活动。据我所知,这一领域正以如此快的速度发展,要跟踪这一领域的所有公司并对它们有一个全面的了解变得越来越困难。因此,我决定利用我的数据科学技能来跟踪和分析这个领域的公司,并建立一个交互式仪表板(【https://ai-drug-dash.herokuapp.com】)来可视化我的分析中的一些关键见解。

资料组

BenchSci(多伦多“明星”人工智能药物初创公司之一)的首席战略官西蒙·史密斯(Simon Smith)是人工智能药物发现领域的优秀观察者和沟通者。我一直在关注他关于行业趋势和新公司的播客和博客。他在 2017 年写了一篇博客,列出了人工智能药物发现领域的所有初创公司,并从那时起一直在更新这份名单。这个博客是我发现的该领域最全面的公司列表(截至 2020 年 4 月共有 230 家初创公司),因此我决定使用他的博客作为我的主要数据来源。

数据预处理

由于博客只是简单地将公司列为不同的段落,所以我首先使用美汤从博客中刮出公司信息。然后,我使用 Pandas 将收集到的数据转换成 DataFrame 格式。数据帧看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了在地图上显示这些公司的位置,我使用 Geopy 将该表中的地址信息转换为纬度和经度:

# match address to latitude and longitude.
from geopy.geocoders import Nominatim
locator = Nominatim(user_agent="ai_drug")
lat, lng = [], []

for i, row in df.iterrows():
    location = locator.geocode(row.headquarters) or locator.geocode(row.city+','+row.country)
    lat.append(location.latitude)
    lng.append(location.longitude)

df['latitude'] = lat
df['longitude'] = lng

博客中没有这些初创公司的融资信息,因此我在 crunchbasepitchbook 上搜索了所有 230 家公司,并将这些信息添加到我的数据集中。

探索性数据分析

我对清理后的数据集做了一些探索性的数据分析,并注意到一些有趣的事情。

1.自 2010 年以来,创业公司激增

我们可以看到这个地区直到 1999 年才真正开始存在。开发化学模拟软件的薛定谔公司成立于 1990 年,并在这里上市,但我不确定他们的药物发现平台是否已经在 1990 年开始使用人工智能……创业公司的爆炸开始于后 2010 年时代,大约与“人工智能炒作”开始的时间相同,并在 2017 年达到顶峰。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.大多数风险投资都处于早期阶段

我们可以看到大多数获得资金的公司仍处于风险投资的早期阶段(A 轮前种子),这可能是因为大多数人工智能药物初创公司仍处于探索商业模式和开发技术和产品的阶段,而不是扩大公司规模。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.美国正在统治世界其他地区

这可能并不令人惊讶,但美国在这一领域统治着世界。超过一半的公司总部设在美国;超过 80%的风投资金流向了美国初创公司!英国在公司数量和资金方面排名第二。加拿大在公司数量上排名第三,但不是在资金上——中国才是。在这个领域有不少有前途的中国创业公司。例如,苏州的抗体发现和开发公司 Adagene 刚刚在 2020 年 1 月筹集了 69,000,000 美元的 D 系列资金。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.新型候选药物的产生是人工智能应用的焦点领域

我们可以看到,吸引最多注意力和资金的 R&D 类别是产生新的候选药物。就我个人而言,我也认为这是人工智能可以发挥其最大威力的地方,即通过利用大量现有的测试数据,利用机器学习来预测目标药物的相互作用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交互式仪表板

我使用 Plotly Dash 构建了一个交互式仪表板,以可视化我的数据集并提供分析见解。Dash 是基于 Python 的框架,用于构建分析型 web 应用程序,而且是免费的!完成的仪表板可以在 https://ai-drug-dash.herokuapp.com/的查看,你也可以在我的 GitHub repo 中查看代码。

如何使用这个仪表板?

首先,从左上方的控制面板中选择一个可视化指标。您可以在所有可视化绘图中使用公司数量或投资金额。

接下来,选择一个地区或国家。这可以通过从控制面板中选择,或通过在地图绘图中单击/框选择来完成(要重置您的选择,请单击地图中的空白点)。

最后,选择一个 R&D 类别。这可以通过从控制面板中选择,或者通过单击左下方类别图中的一个栏来完成,这也将更新该类别的关键字图。中间的公司信息表也将根据这些选择进行更新,以便您可以缩小公司列表的范围进行研究。

玩得开心!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考文献 :

[1] Simon Smith,230 家在药物发现中使用人工智能的创业公司。【https://blog . bench sci . com/startups-using-artificial-intelligence-in-drug-discovery # understand _ mechanisms _ of _ disease
【2】https://www.crunchbase.com/
【3】https://pitchbook.com/
【4】大卫·康弗,如何使用 Dash 和 Plotly 构建报告仪表盘。https://towards data science . com/how-to-build-a-complex-reporting-dashboard-using-dash-and-plotl-4f 4257 c 18 a 7 f

可视化贝叶斯先验

原文:https://towardsdatascience.com/visualizing-bayesian-priors-cec2fea3e386?source=collection_archive---------34-----------------------

想过先验如何影响你的贝叶斯模型吗?弄清楚!

我一直在玩参数估计和贝叶斯统计,并认为我应该做一个快速的小可视化先验信念如何影响我们的后验分布。在本教程中,我们将思考硬币是否公平。当我们获得更多的数据并尊重我们先前的信念时,我们将想象我们对硬币公平性的估计是如何变化的。我们开始吧!

问题

你在维加斯看着人们对掷硬币的结果打赌。如果是正面,你赢得双倍赌注,如果是反面,赌场拿走你的钱。这听起来很划算,所以你马上就怀疑了。赌场不想给你好价钱。所以你决定计算你看到每个结果的次数,并确定硬币的价值。设 H 为使用赌场硬币获得正面的概率,设 D 为我们投掷的数据集。让我们假设我们看到了 100 次投掷硬币,在这 100 次投掷中,有 40 次是正面。硬币的重量是多少?自然你会说 H = 40/100 = .4 但是你是怎么得到那个数的呢?我们来走一遍推导!

最大似然估计

我们正在估计一次掷硬币,这意味着我们的数据将采用两个值中的一个,概率为 p 和 1 - p 。因此,我们将假设我们的数据是由伯努利分布生成的,或者换句话说,在给定特定正面概率的情况下,数据的可能性为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们想弄清楚什么值的 H 最大化这个似然函数。因为自然对数不会影响我们的最大值,所以我们可以求解对数的最大值。相信我,这会让数学变得简单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在回到你的微积分 I 课,求导并设为 0,以识别临界点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

硬币的最大似然估计

看来我们的直觉是正确的,对正面概率的最佳估计是投掷总数中投掷的正面数。

传道者

等等,我们不是在拉斯维加斯赌博吗?我们知道这些赌场是见不得人的。我们需要将这些信息整合到我们的模型中。在我们的模型中,我们假设参数可以以相等的概率取 0 到 1 之间的任何值。这种关于我们的参数取值的假设被称为先验,对于这种分析,我们假设一个统一的先验。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们不知道这有多公平

这个特别的先验说我们完全没有关于正面概率应该是什么样子的信息。如果我们对我们的参数一无所知,这是一个很好的假设,但在普通硬币的情况下,这可能是一个糟糕的假设,因为我们知道普通街道硬币非常接近公平。使用 Baye 规则将先验与似然相结合以生成后验分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当样本量很小时,这些先验对我们的模型有重要的影响,当样本变大时,它们的影响会减弱。让我们看看这种效果在几个不同的先验中的作用。

我们已经知道了均匀先验下的后验概率是什么样的,但是如果我们假设赌场遵守规则并且使用普通的街道硬币呢?那么我们可以假设一个均值为 0.5 的高斯先验和一个小的标准差。那么我们的后验分布就是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公平街硬币的高斯先验

对于这个实现,我选择了 0.5 的平均值,因为公平硬币应该接近偶数,标准偏差为 0.05,这样如果硬币碰巧不公平,它将位于 0.4 和 0.6 之间。

让我们来看看另一个可能的先验,我们认为硬币极有可能是极端偏向的。在这种情况下,我们可以使用贝塔分布,这将使我们的后验概率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一个硬币,我们怀疑有这样或那样的偏见。

α=0.1 和β=0.1 时,该函数的 pdf 为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

α=0.1 和β=0.1 时的β分布

注意大部分概率是如何集中在极端情况下的。这与硬币很可能全是正面或全是反面的观点相吻合。你也可以看到这个分布没有太大的偏差,事实上方差在 0.2 左右。远高于高斯分布的 0.05 或均匀分布的 0.08。

我们可以使用以下函数在 python 中生成这些后验概率:

上述后验的实现。

现在让我们看看先验知识是如何直观地影响我们的参数估计的。在这个实验中,我们用 Python 创建了一个有偏向的硬币,正面的概率等于 0.3。这枚硬币明显偏向,通常会抛尾。然后,我们以 0 到 512 次翻转之间的间隔对硬币的翻转进行采样。这些翻转模拟了对我们一直在讨论的赌博游戏的观察。你可以把这些情节中的一个想象成在翻转之后我们对硬币的公平性有多确定,以及我们之前的信念。

下面我用越来越多的证据(观察到更多的翻转)绘制了后验概率的演化图,让我们看一看,看看我们能学到什么。如果我们假设我们完全没有关于这枚硬币的信息,我们可以假设一个统一的先验。我们可以看到,我们对硬币重量的估计是一个没有翻转的均匀分布。这是有意义的,因为我们没有数据,只有我们对硬币的假设。大约四次翻转后,我们得到了一个看起来像高斯分布的东西,可能有点偏向 0.3,但很难分辨。在大约 64 次翻转后,我们非常确信硬币是有偏差的,在 128 次后,我们或多或少地收敛到硬币的真实偏差权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们通过使用高斯分布来检验如果我们假设硬币是公平的会发生什么。在零翻转时,我们只有先前的信念。在最初的几次翻转中,这种分布几乎没有变化。这是因为我们的硬币是公平的假设是一个相当强的假设,因此需要大量的数据来影响这一信念。在大约 32-64 次翻转后,我们可以看到分布逐渐向真正的权重左移。但是直到 256-512 次翻转,我们才真正达到真正的重量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,我们通过使用 beta 先验来检验硬币是有偏差的,我们在一个肮脏的赌场。我们看到,这与均匀分布非常相似,但它更早地向左摆动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有一些有趣的事情需要注意,随着样本量的增加,所有的后验概率都趋向于以 0.3 为中心的正态分布。你可以清楚地看到,当样本量很小时,先验有很大的影响。此外,随着样本量的增加,可能性开始占主导地位,先验变得不那么重要。注意先验如何影响后验的收敛速度。例如,对于 64 次翻转后的均匀先验和贝塔先验,硬币的真实偏差落在我们 95%的置信区间内,而对于高斯,我们的真实偏差直到大约 256 次翻转才出现在我们的区间内。

这里要传达的信息是,如果我们一开始不太了解我们的参数、均匀性或贝塔分布,就很容易让模型相信硬币是有偏差的。然而,如果我们的模型坚信硬币是公平的,即高斯先验,那么它将需要更多的数据来说服它硬币实际上是不公平的。如果你喜欢这种数学可视化,你可能也会喜欢我关于高斯消去法的帖子。

最初发表于T5【http://www.nbertagnolli.com】*。*

用 R 可视化大脑

原文:https://towardsdatascience.com/visualizing-brains-using-r-606fa0fb9fdf?source=collection_archive---------40-----------------------

如何使用 R 可视化和分析大脑的 MRI 扫描

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Robina Weermeijer 在 Unsplash 上的照片

介绍

最近,我在大学一年级上了一门心理学入门课,在这门课中,我们学习了心理学的其他基本原理,包括大脑,我们使用不同类型的扫描来可视化大脑的方法,以及医生如何使用这些扫描来检测和监控疾病。这让我想知道——有没有一种简单的方法可以让我可视化并分析大脑?

大量的研究促使我在 Coursera 上开设了“神经黑客入门”课程。这门课程帮助我收集了背景信息和可视化大脑所需的构建模块,只使用了两样东西:开源 MRI 扫描和 R。鉴于 Python 通常被认为是深度学习和图像分析的首选语言,我想挑战自己使用 R 并解决我的问题。

资料组

我在 Kaggle 上找到的一个名为“脑瘤进展”的数据集上测试了我的知识。它由 20 名胶质母细胞瘤患者的 MRI 扫描组成。每名患者相隔 90 天接受两次 MRI 检查,以监测肿瘤的进展。

我回答的问题

问题 1:如何将扫描结果转换成适合分析的格式?

大多数医院以二维 DICOM 格式存储 MRI 扫描数据,其中大脑的每个轴向切片都是一个 DICOM 文件。这样做是为了保护健康信息。为了使这些图像适合 R 进行分析,第一步是将 DICOM 转换为 NifTI 格式,它将所有 DICOM 文件合并到一个文件夹中,以获得大脑的 3D 图像(NifTI 格式!).假设我们想看一下 1 号病人大脑的第 11 个轴向切片,我们得到了这个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

患者 1 大脑第 11 层的轴向视图

问题 2:有没有办法用强度值来可视化大脑的某些组织/部位?

当我告诉 R 用 300 到 400 之间的亮度值(不包括边界值)高亮显示大脑第 11 个切片的区域时,它将所有这些区域都染成红色,就像这样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

红色区域表示强度值在 300 和 400 之间

第一幅图像是轴向视图,第二幅图像代表冠状、矢状和轴向视图。当将突出显示的区域与现有文献进行比较时,红色部分代表大脑的白质和颅骨的少数区域。由此,我们可以得出结论,大脑的所有白质和头骨的少数区域的强度在 301 和 399 之间。

我们可以使用这种技术来突出具有特定强度范围的大脑的不同部分/组织,将它们与文献进行比较,并获得对大脑整个结构的更好理解。

问题 3:有没有一种方法可以将同一患者相隔一段时间的两次扫描相减,以监测大脑的变化?

在数据集中,每名患者间隔 90 天进行两次 MRI 检查,以监测肿瘤的进展。除了手动比较每个患者的两次扫描,有没有一种方法可以“减去”扫描,以便我们准确地知道在过去 90 天里大脑发生了哪些变化?幸运的是,我们可以在 r 的帮助下实现这一点。这个函数的优点是,现在我们不再需要对变化进行近似。我们确切地知道每个病人的肿瘤是如何在大脑中发展的。

在这项研究中,我决定比较 2 号病人和 20 号病人的大脑变化。从后续扫描中“减去”初始扫描,我对每个患者的结果如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**左:**患者 2 的脑在 90 天内的变化,**右:**患者 20 的脑在 90 天内的变化

我们看到,虽然两个病人大脑的变化发生在不同的区域,但组织生长的数量相当相似。因此,我们可以得出结论,对于数据集中的所有患者,疾病的进展都是相似的。

问题 4:怎样才能让大脑的某些特征更加突出?

有两种方法可以让大脑的特定区域突出更多,看起来更亮或更暗(取决于我们想要什么)。

选项一:反向映射

每个 MRI 扫描都是灰度图像,图像的大部分是黑色背景(强度=0)。在反向映射技术中,我们告诉 R 只考虑大于或小于阈值的强度,以帮助我们更好地看到图像。例如,对于非常暗的图像,我们将告诉 R 绘制所有大于 50 的亮度。这将帮助我们摆脱不必要的黑暗区域,使整体图像更明亮。另一方面,包含强度为 1300 的点的图像将使得强度为 200 的点很难看到。在这种情况下,我们告诉 R 只考虑小于 900 的亮度,以使图像的基本特征更容易看到。

选项 2:变换和平滑

我们可以变换图像,使大脑的特征更加清晰可见。在这项研究中,我使用了一个线性传递函数和线性样条变换。这些是单调的传递函数,这意味着灰色阴影只是变成了其他灰色阴影,白色保持白色,黑色保持黑色,只是它们的相对强度发生了变化。下面的图片显示了原始图像和转换后的图像。很明显,转换后的图像在显示大脑特征方面做得更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**左:**原始图像,**右:**变换后的图像

如果图片有太多噪点,平滑可以帮助减少一些噪点,使图像看起来更清晰。在这种情况下,我使用了高斯平滑。结果如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**左:**原始图像,**右:**平滑图像

在比较原始图像和平滑图像时,似乎没有太大的差别。这大概是因为数据非常干净。在真实世界的数据中,扫描结果并不清晰,而且有很多噪音。在这种情况下,平滑会做得更好。需要注意的是,过于平滑会导致重要特征丢失,所以内核大小要合适。

未来的研究

这项研究帮助我利用 r 更好地理解了大脑的结构。那些想要复制这项研究结果的人可以在这里找到代码。

从这里我们可以有两种主要的方法。第一,通过分析有其他异常的大脑 MRI 扫描来进一步探索大脑。第二,根据开源数据的可用性,将这项研究扩展到其他器官。

参考

  1. Coursera 课程——约翰·霍普金斯大学《R 中的神经黑客入门》:https://www.coursera.org/learn/neurohacking
  2. “脑瘤进展”数据集来自 ka ggle:https://www.kaggle.com/andrewmvd/brain-tumor-progression

数据集的原始来源:施梅达 KM,Prah M (2018)。脑瘤发展的数据。癌症影像档案。http://doi.org/10.7937/K9/TCIA.2018.15quzvnb

使用 TensorFlow visualizer 可视化基于浏览器的模型训练过程

原文:https://towardsdatascience.com/visualizing-browser-based-model-training-process-using-tfjs-vis-810e8c91d4b7?source=collection_archive---------47-----------------------

观察神经网络训练过程同样重要,因为它有助于观察每个时期的损失和准确性等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化批处理值

在 python 中训练模型时,tensorboard 库使可视化成为可能。类似地,如果您正在使用 tensorflowjs 在浏览器上训练您的模型,您将需要一些东西来观看训练过程。可以使用 tensorflowjs 可视化工具。利用这一点,我们可以在训练时可视化每个时期或批次的训练损失/准确度。我们可以在评估时可视化每个职业的准确度和混淆矩阵等等。

我将使用 tfjs 为谷歌 chrome 浏览器上的 10 个标签使用时尚 MNIST 数据集训练一个分类器,并在训练时可视化模型。一旦模型被训练,我们就可以在画布上画出正确的类。

是的,你没听错,我们将在画布上绘制一个输出,并告诉我们的分类器识别图像类。我不会深入研究编码,因为我写这个故事的主要目的是在我们的 js 代码中实现 tfvis 库,并展示 visualizer 如何为基于浏览器的模型工作。我在这个故事的底部包含了我的 Github 代码的链接。

为了更好地理解这个故事,你可以参考我以前的博客
如何使用 tensorflow.js 在 Chrome 上训练神经网络

导入 tfjs-vis 库

超级简单,只需在你的 Html 文件的<head>中添加链接。此外,您可以在 nodejs 上从源代码构建。

<script src="[https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest](https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest)"></script><script src="[https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis](https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis)"></script>

就像 python 中的 train.py 一样,我们将使用单独的 java 脚本来编写构建和训练模型的代码,以及下载时尚 MNIST 数据集 sprite sheet

什么是雪碧片? Sprite sheet 包含成千上万的图片组合在一个文件中。游戏开发人员使用这种技术,通过从文件中分割部分图像而不是多次调用图像来简化数据获取过程。当我们在实时环境中需要大量图像处理时,这使得处理速度更快。

我们为什么要使用雪碧表? MNIST 有成千上万的图片,如果你要打开 http 连接成千上万次来下载这些图片,可能会有问题。所以不像 python 中的训练,你可以一个接一个地加载 10,000 张图片,你不能在网络浏览器中这样做。劳伦斯·莫罗尼,深度学习

定义回调指标

让我们创建用于观察损失验证损失准确性、验证准确性的指标,我们可以将这些指标传递给 tfvis 的 fitCallbacks 函数。

const metrics = ['loss', 'val_loss', 'acc', 'val_acc']

还有定义容器名称和大小的规定,这也是 fitCallbacks 函数的必需参数。

const container = { 
             name: 'Model Training', 
             styles: { 
                  height: '1000px' 
             }};

设置 tf-vis 显示

让我们用我们的度量和容器大小设置一个可视化工具。

const fitCallbacks = tfvis.show.fitCallbacks(container, metrics)

在训练函数(model.fit)中设置可视化工具

model.fit(trainXs, trainYs, {
        batchSize: BATCH_SIZE,
        validationData: [testXs, testYs],
        epochs: 10,
        shuffle: true,
        callbacks: fitCallbacks
});

一旦一切都设置好了,你就可以在训练时在网页上看到 visualizer。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练时浏览器上显示的可视化工具输出。

上面的值是我们在传递给 tfvis fitCallbacks 函数的度量中设置的损失和准确性。

除了训练,你还可以使用 tfvis 来评估模型。对于像这样的分类任务,我们可以使用“perClassAccuracy”和“混淆矩阵”函数。

查看我的模型输出

附注:忽略我的画😛

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想试试吗?

[## novas ush/visualizing-fashion-mnist-on-browser

使用 tensorflowjs 在浏览器上训练时尚 MNIST 数据集,使用 tfvisualizer js 可视化模型训练…

github.com](https://github.com/novasush/visualizing-fashion-mnist-on-browser)

从这里参考我的 GitHub 库。它包含用于在浏览器中对时尚 mnist 数据集训练分类器并显示可视化效果的代码。

参考

  1. Tensorflow tfjs-vis 库
  2. 用 tfjs-vis 进行可视化训练
  3. 查看数字识别器内部

利用卫星图像可视化建筑区

原文:https://towardsdatascience.com/visualizing-built-up-areas-using-satellite-images-18d43f34f0b3?source=collection_archive---------36-----------------------

地理可视化/菲律宾/遥感

使用谷歌地球引擎的卫星图像来观察一段时间内的建筑区域

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

美国宇航局在 Unsplash 拍摄的照片

大数据太不可思议了!大数据设法将科学和商业领域带到新水平的方式几乎有点神奇。它允许我们利用各种途径来获取我们通常不会获取的信息,以便获得新的见解。

卫星图像是一个惊人的非常规来源,可以挖掘这些新的见解。城市规划者、环保主义者和地理空间数据科学家通常会从卫星图像中寻找全局视角,并从这一实践中找到见解,从而将他们的预期解决方案提升到一个全新的水平。

卫星图像分析速成班又名遥感

如果你曾经在网上文章中遇到过“遥感”这个术语,很可能指的是利用卫星观测地球的过程。之所以这样称呼它们,是因为它们有远程测量的能力。

这些遥感仪器感知什么?简答就是辐射。更专业的说,这些仪器感应电磁辐射。

这些电磁辐射的波长和频率各不相同,在这个光谱中,我们肉眼能看到的一小部分被称为“可见光谱”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

电磁波谱。来自鲍勃-edu 天文学

这就是卫星发挥作用的地方。环绕地球运行的卫星的透镜不仅可以探测可见光,还可以探测红外波长(最接近可见光谱的波长)和微波。

当来自太阳的光到达地球表面时,每个物体都不同地反射、吸收或传输这种能量。例如,绿色植物吸收所有颜色,但反射绿色。这就是为什么当我们看植物时,绿色是可见的。在某些情况下,同一类型的植物可能没有同等的水分,虽然这种微小的差异不会被肉眼看到,但这两种植物反射光线的方式会有所不同。

如你所知,并不是所有反射的光都是可见的。

由于表面反射光线的方式不同,多年来,卫星一直被用于研究植被、洪水易发区,甚至分析一个地方的建筑面积。

虽然任何人都可以去查看和下载卫星图像,但它们可能不包含来自反射的数据,而反射会立即产生如此多的见解。

这是我们要找的数据。在我们稍后要做的可视化中,颜色的不同代表了被反射的辐射的不同。由于这是一个多时相可视化(多个时间段),颜色将代表一个地方不同时间序列的建筑区表面。

预赛

要继续学习本教程,请确保首先完成以下工作:

  1. 谷歌地球引擎创建一个账户。这是免费的,并将在您的 Jupyter 笔记本中进行验证。
  2. 安装谷歌地图(pip install geemap )和地球引擎(pip install ee )。
  3. 使用 ee 初始化地球引擎。初始化()

数据集

在这个练习中,我们将访问谷歌地球引擎数据库中的“GHSL:全球人类居住层”数据集。

全球人类住区 (GHS)框架生成全球关于人类在地球上长期存在的空间信息。这包括物理沉降,因此这反映了一段时间内的建筑面积。

我们来码!

#Preliminaries
import geemap
import ee#After importing, it is important to initialize this.
ee.Initialize()

初始化树叶地图:

Map = geemap.Map(center=[15.222871,120.574440], zoom=7)
Map

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

加载数据集并将其存储为对象。

#Note that ee.Image and ee.ImageCollection can both access datasets but you need to check which one is applicable for your intended datasetimage = ee.Image('JRC/GHSL/P2016/BUILT_LDSMT_GLOBE_V1')

选择“已建”波段作为我们想要的已建区域。

builtUp = image.select('built')

定义 Vis 参数。

visParams = {
  'min': 1.0,
  'max': 6.0,
  'palette': ['0c1d60', '000000', '448564', '70daa4', '83ffbf', 'ffffff'],
}

为了使这有意义,让我们参考这些最小值和最大值所指的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

取自地球发动机数据目录

最小值和最大值指的是上面构建的类表中的值列。为了获得最佳观看效果,您应该选择最小值=1,最大值=6。您不希望遗漏水域和陆地的价值,因为对于一些不擅长阅读地图的读者来说,您的可视化可能没有清晰的形式。

调色板只是给类值分配一种颜色。建议的颜色可以在构建的类别表中看到。您可以使用十六进制代码,但不要使用“#”。

#.addLayer method adds this on top of your initialized Map above
Map.addLayer(builtUp, visParams, 'Built-Up Multitemporal')

这是建议颜色的显示方式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

考察菲律宾的建筑用地面积

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

建议颜色的图例

或者,您可以直接为调色板使用颜色名称。确保对其进行排列,以便第一种颜色与构建的类表的值 1 相匹配。

visParams = {
  'min': 1.0,
  'max': 6.0,
  'palette': ['0c1d60', 'black', 'yellow', 'green', 'blue', 'white'],
}

请注意,您可以使用 inspector 函数来检查点的值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用调色板的颜色名称。使用检查器来显示点的值

因此,从本练习中,您可以看到大部分建筑区位于菲律宾首都及其附近区域,如区域 III 和区域 IV-A。同样,您可以追踪一个模式并回答“特定时期内开发发生在何处”这一问题。

我们还可以为此做其他修改,例如将可视化限制在一个城市或省份。

有了谷歌地球引擎,你也可以访问其他数据集。

请随意探索其他数据集。编码快乐!

点击此处查看 Github 上的 Jupyter 笔记本。

可视化神经网络的变化

原文:https://towardsdatascience.com/visualizing-change-in-neural-networks-eea86529a9f3?source=collection_archive---------36-----------------------

评估神经网络在针对新任务进行微调时的特征可视化变化的实验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深度神经网络以其强大的能力吸引了世界,但它们在很大程度上是作为黑盒模型运行的。为了帮助解决这个谜,特征可视化已经成为一种强大的工具,用于查看神经网络的“引擎盖”以可视化它们所学习的东西。

在本文中,我们将探索如何可视化神经网络学习检测的内容,以及当我们微调网络以执行新任务时,这些学习到的工件如何变化。此外,该项目基于 tensorflow lucid 库提供了特征可视化的 pytorch 实现。

在我们开始之前,你可以在 Github 上找到这个项目的代码。

什么是微调?

微调是使预先训练的神经网络适应新任务的过程。微调时,网络的参数用从原始任务中学习到的值进行初始化。假设任务相对相似,通过利用从原始任务中学到的知识,微调有助于网络在新任务上实现更高的准确性。当原始任务有更大更丰富的数据集时,这种技术特别有用。

这个项目使用的架构是 ResNet-50 [2],一个深度卷积网络,有五十层。对于最初的任务,这个网络已经被训练成在 ImageNet 上进行分类,ImageNet 是一个包含跨越一千个不同类别(包括动物、植物、车辆和物体)的数百万张图像的数据集。

在这个项目中,我们将探索当网络在斯坦福狗数据集【3】上进行微调时,预训练网络对输入图像的内部表示的变化。该数据集包含大约 20,000 张 120 个品种的狗的图片。通过标准的微调方法和均匀的训练测试分割,在这个新的数据集上获得了 80%的分类准确度分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图一。**来自斯坦福狗数据集的示例图像

什么是特征可视化?

神经网络中的每个组件学习检测输入图像中的各种特征。例如,狗分类器中的特定神经元在遇到吻状特征时可能会释放大量激活(输出值)。

特征可视化是一种优化输入图像的技术,以便在预训练神经网络的特定组件中产生大量激活。与常见的深度学习范例相反,该过程不更新网络的参数。相反,它冻结预训练的网络并更新图像中的像素,使得网络的组件被高度激活。

下面的图 2 给出了特征可视化的总图。特征可视化使用梯度上升来最大化网络中目标组件的激活值。输入图像从随机初始化所有像素开始。随着算法的迭代,图像开始更接近组件已经学会检测的特征。

另外,请注意目标组件如何来自网络中的任何地方。特别是在这个项目中,我们可视化了 ResNet-50 的最后四个瓶颈层中每个特征图的平均值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图二。**特征可视化算法概述

回到狗鼻子的例子,如果将特征可视化应用于特定神经元的输出,我们会期望得到的图像是模型可以预期的最“看起来像鼻子”的输入。这意味着(如果神经元只检测狗的鼻子),得到的图像将充满各种形状和大小的鼻子。

这种技术有助于了解网络的不同组件已经学会检测什么。下图 3 显示了 ImageNet 预训练 ResNet-50 模型中三个不同通道的功能可视化。请注意,对于模型中更深的层,特征会更加复杂。例如,在左图中,唯一可见的特征似乎是某种类似毛皮的纹理。然而,在右边,我们可以看到狗和蛇头纠缠在一起的图像。这表明网络中的这个特定通道已经学会了在输入图像中检测狗和蛇。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图三。**分别从层 1-瓶颈 1、层 2-瓶颈 3 和层 3-瓶颈 5 中的三个不同通道进行特征可视化。

要了解更多关于特性可视化及其在这个项目中的具体实现,请参见这篇优秀的文章。

比较特征可视化

既然我们已经讨论了潜在的想法,让我们看看如何在神经网络中可视化这种变化。回想一下,有两个网络需要考虑:

  • 在 ImageNet 上预先训练的基础网络
  • 狗网络是在狗数据集上微调的基础网络

在微调过程中,只允许训练体系结构中的四个组件(不包括全连接层):

  • 第 3 层,瓶颈 5
  • 第 4 层,瓶颈 0
  • 第 4 层,瓶颈 1
  • 第 4 层,瓶颈 2

因此,我们将只为这四个层中的通道创建特征可视化。目标是比较两个网络中匹配组件的特征可视化。例如,层 3-瓶颈 5 中的第一通道的特征可视化在基础网络和狗网络之间如何变化?直觉上,我们应该期待后一个网络的许多特征更像“狗”(例如,更像皮毛的纹理)。

这种分析的一个假设是,随着我们深入网络,特征可视化将变得越来越不同。这是基于这样的观察,即更深的层通常代表更复杂的特征(见图 3 )。另一种看待这一点的方式是,网络中的早期层代表更基本的特征,这些特征在计算机视觉任务中是通用的(因此在训练期间不太可能被改变)。

自动化图像比较

手动比较特征可视化是不方便的。目标层上有数千个通道。更不用说,这将在比较中引入人为偏见,因为一个人对哪些图像不同的看法是主观的。相反,我们必须定义两幅图像之间的相似性度量。

当我们通过神经网络输入图像时,图像在每一层中的隐藏状态都是丰富的潜在向量表示。如果我们使用图像的这种矢量表示,我们可以使用余弦相似度来判断两个矢量彼此有多相似。

对于每一对特征可视化,我们通过基本网络分别馈送它们,并在完全连接的层之前检索它们的隐藏矢量表示(嵌入)。然后,我们将两个可视化之间的相似性度量定义为它们各自嵌入的余弦相似性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图四。**余弦相似性度量的概述。层 4-瓶颈 2 之后的全局平均池产生 2048 维向量。

功能:ImageNet →狗

在我们进行比较之前,需要注意的是,一些通道未能优化其特征可视化,导致无特征的灰度图像。有趣的是,这种模式在基础网络中的任何特征可视化中都没有出现。不太清楚为什么这些通道未能优化。在任何情况下,由于那些有缺陷的可视化缺乏任何可比较的特征,它们被丢弃了(更多细节见附录)。

图 5 中,我们可以看到基础网络和狗网络之间的第 3 层瓶颈 5 中最不同和最相似的前 3 个通道。在大多数不同的通道中,在通道 667 和 675 中的狗网络的特征可视化中清楚地出现了毛皮状纹理。尽管 963 频道也有明显的变化,但那里的新功能在视觉上并不能解释为“像狗一样”。不足为奇的是,实际上在前 3 个最相似的通道中没有可检测到的变化,因为相同的模式在每个图像对中重复。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图五。**分别列出第 3 层-瓶颈 5 中最不同和最相似的 3 个特征可视化。

移动到图 6 的下一层,前 3 个最不同的特征可视化的变化有点难以解读。狗网络中的通道 503 的可视化似乎包含散布在图像上的几个类似狗的特征,包括眼睛、鼻子和嘴。频道 1904 很有趣,因为可视化看起来几乎像植物,这可能是数据集的副产品,因为许多狗的图像是在户外拍摄的。

同样值得注意的是,该层的前 3 个最相似通道中的可视化对彼此之间的差异比前一层中的可视化对更多。有趣的是,它们都在图像上共享类似特定符号/字符的覆盖纹理(这可能有助于放大以获得更好的视图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 5。**分别列出第 4 层-瓶颈 0 中最不同和最相似的 3 个特征可视化。

在**图 7 的下一层中,**前 3 个最不同的通道中的可视化开始代表更完整的狗的图片。例如,在频道 700 和 899 中,特征似乎分别类似于哈巴狗和伯恩山犬的头部。有趣的是,最相似的通道再次包含类似字符的纹理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 7。**第 4 层-瓶颈 1 中最不同和最相似的 3 个特征可视化。

下面的图 8 描绘了最终层中前 3 个最不同和最相似的通道。前 3 个最不同的频道中的频道 707 和 442 再次在可视化中展示更完整的狗特征,例如头。

在这一层中,甚至前 3 个最相似频道中的频道 1485 和 31 也在其狗网络的可视化中展示了类似狗的特征。这些通道还包含前两层示例中讨论的特定纹理。另一方面,通道 952 不包含该纹理,并且其图案在其对于基础和狗网络的可视化中保持一致。这可能会突出我们的余弦相似性度量中的缺陷,因为它忽略了关于通道 1485 和 31 的新狗特征的图像中的明显变化。出于某种原因,相似性度量更关注它们的纹理,而不是它们的新内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 8。**分别列出第 4 层-瓶颈 2 中最不同和最相似的 3 个特征可视化。

表征层之间的差异

已经可视化了目标层内特征的变化,现在让我们评估层之间的变化的程度。图 9 以箱线图的形式展示了四个目标层内余弦相似性的分布。除了最后一层(第 4 层-瓶颈 2),随着我们深入网络,余弦相似性分布有明显的下降趋势。这表明,平均而言,对于更深的层,基本网络和狗网络的特征可视化之间存在更多差异(这与我们之前的假设一致)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图九。**每个目标层的基本网络和 dog 网络特征可视化之间的平均余弦相似性分布的箱线图。

有趣的是,最后一层偏离了这种模式,并且与前一层具有几乎相同的中值余弦相似性。这种偏差更有可能是使用要素可视化作为比较手段的误导效果,而不是最终图层变化较小的迹象。

为了理解这一点,让我们再看几个第 4 层瓶颈 2 的特征可视化(仅使用前 3 个极端可能不是一个好的表示)。下图 10 显示了该层中三个不同通道的特征可视化的变化。这一层的可视化似乎更加复杂,许多表现出来的特征相互纠缠在一起。在所有三个例子中,我们可以看到新的类似狗的特征出现在狗网络的可视化中。然而,由于其他可视化特征的丰富性,这些新的类似狗的特征不像前面图层中的可视化特征那样突出。

假设这种模式在最终层的可视化中是常见的,这可以解释为什么层 4-瓶颈 2 的平均余弦相似性不低于层 4-瓶颈 1 的平均余弦相似性。与直觉相反,最终层中特征可视化的更高复杂性和丰富性可能会“淹没”新狗特征引入的变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 10。**基础网络和 dog 网络的第 4 层瓶颈 2 的三个示例特征可视化。

结论

在这个项目中,我们可视化了神经网络的检测特征如何随着网络向新任务的微调而变化。我们将 ImageNet 预训练的 ResNet-50 模型微调到一个更小的狗品种图像数据集。正如所料,新的类似狗的特征出现在微调网络的可视化中,尤其是在更深的层中。根据我们的相似性度量,网络中的最后一层打破了这种模式,突出了使用特征可视化来评估网络中的变化的潜在缺陷或困难。

考虑到这一点,让我们讨论一下这个项目的其他一些细微差别:

  • 特征可视化提供了对网络的有限一瞥:特征可视化创建了一个图像,它最大化地激活了网络中的一个组件。然而,生成的图像只捕捉到每个组件学习检测的少量特征。这就是为什么更深层的特征可视化看起来如此混乱和纠结的原因(很难将所有潜在的特征都压缩到一张图像中!)
  • 可能会有一个更好的特征可视化配置:这个项目中的结果是使用一个单一的配置生成的,它为每个层产生了良好的结果,但是可能有不同的设置会产生更好的可视化效果。
  • 这个项目中的相似性度量是一个黑盒:余弦相似性本身并不是一个黑盒。然而,由于其输入是深层网络中的隐藏表示,我们对图像中的相似性度量究竟比较什么的理解有限。这解释了为什么我们的度量突出显示为最相似的几个通道包含相同的特定纹理。

附录

斯坦福汽车数据集

在这个项目中还执行了第二个微调任务。和以前一样,基本网络是在 ImageNet 上预先训练的 ResNet-50。第二个数据集是斯坦福汽车数据集 [4],其中包含 196 种不同车型的约 16,000 张汽车图像。使用标准的微调方法,在这个新数据集上实现了 70%的分类准确率。

然而,由于生成的要素可视化中的变化缺乏可解释性,该数据集不包括在讨论中。尽管这些变化是显而易见的,相似性分布的箱线图也遵循了狗网络中的模式,但新特征并不十分“像汽车”。这可能是由于更困难的微调任务(如在结果的准确度分数中明显的)或者可能是由于识别狗特征比识别汽车特征更好的人类偏见。

移除故障特征可视化

由于特征可视化是一个优化问题,并且每一层仅使用一种配置,因此一些通道未能优化,这导致了灰色图像。图 11 显示了每一层的灰度图像数量(第三层-瓶颈 5 没有)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 11。**每层中错误可视化的数量

为了识别和去除这些灰度图像,必须定义一个评分函数。第一步是创建每个图像的灰度版本(这可以使用 Pillow python 库来完成)。然后,计算图像的原始 RGB 版本和灰度版本之间的平方误差。灰色特征可视化与其灰度版本非常相似,导致误差更小(图 12 )。事实上,绘制分类错误显示了错误的灰色特征可视化和正常特征可视化之间的大尖峰。剩下的就是移除落在该尖峰左侧的特征可视化(图 13 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 12。**灰度图像评分功能概述。在这个例子中,主要是灰色的有缺陷的可视化将具有比原始图像更低的平方误差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 13。**在误差值的巨大尖峰之前,故障通道可以被识别为簇。

克矩阵距离

在试验特征可视化之间的相似性度量时,基于 Gram 矩阵定义了一个度量。Gram 矩阵是在神经风格转移[1]中引入的,是一种捕捉图像中纹理信息的技术。然后,克矩阵距离被定义为比较中第一和第二图像的克矩阵之间的平方误差。

这种想法背后的直觉是,可视化中的特征通常会在整个图像中重复出现(有一些变化)。比较特征可视化之间的纹理信息是有意义的,因为它总结了图像中的局部结构,而不考虑它们的位置。

然而,基于视觉检查,该度量不如余弦相似性表现得好。一个原因是网络中不同层之间的 Gram 矩阵距离变化很大,很难将它们组合成一个度量。

参考

  1. Gatys,l .,Ecker,a .,& Bethge,M. (2016 年)。《艺术风格的神经算法》。视觉杂志,16(12),326。doi: 10.1167/16.12.326
  2. 何刚,张,任,孙,“深度残差学习在图像识别中的应用”。2016 年在 CVPR
  3. 科斯拉(a .),贾亚德瓦普拉卡什(n .),姚(b)和(l .),“用于细粒度图像分类的新型数据集”。2011 年 IEEE 计算机视觉和模式识别会议(CVPR),第一届细粒度视觉分类研讨会。
  4. j .克劳斯,m .斯塔克,邓杰,飞飞,l .〈精细分类的三维对象表示〉。第四届 IEEE 表示和识别研讨会,ICCV 2013 (3dRR-13)。澳大利亚悉尼。2013 年 12 月 8 日。
  5. Olah,c .,Mordvintsevm A .,和 Schubert,L. 2017。“特征可视化”。蒸馏。https://distill.pub/2017/feature-visualization
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值