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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

六个星火练习来统治他们

原文:https://towardsdatascience.com/six-spark-exercises-to-rule-them-all-242445b24565?source=collection_archive---------0-----------------------

一些具有挑战性的 Spark SQL 问题,易于在许多现实世界的问题上提升和转移(带解决方案)

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

照片由 Xan GriffinUnsplash 上拍摄

Spark SQL 非常容易使用,句号。你可能已经知道这也是很难掌握的

要精通 Spark,必须具备三项基本技能:

  1. 操作和理解数据的能力
  2. 关于如何根据程序员的需求弯曲工具的知识
  3. 在影响 Spark 工作执行的因素中寻找平衡的艺术

我精心制作了以下六个练习,这些练习类似于 Spark 开发人员在构建他们的管道时每天面临的一些典型情况:这些将有助于评估上述技能。

你可以在文章末尾找到建议的解决方案!

数据集

让我们简单描述一下我们将要使用的数据集:i t 由来自商店数据库的三个表组成,分别是产品、销售和卖家。您可以通过下面的链接下载拼花文件中的数据。请注意,要 100%利用这些练习,你需要阅读提供的文件!(.zip、~6GB、 如果无法下载数据,可以点击这里 ) 找到生成器脚本

****[## datasettocomplettethesixsparkexercises . zip

包含做六个练习的三个表的数据集

drive.google.com](https://drive.google.com/file/d/1kCXnIeoPT6p9kS_ANJ0mmpxlfDwK1yio/view?usp=sharing)****

下图显示了如何连接这些表:

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

销售表

该表中的每一行都是一个订单,每个订单只能包含一种产品。每行存储以下字段:

  • order_id:订单编号
  • product_id:订单中销售的单个产品。所有订单只有一种产品
  • seller_id:销售产品的销售员工 ID
  • num_pieces_sold:订单中特定产品的销售数量
  • bill_raw_text:一个字符串,表示与订单关联的账单的原始文本
  • date : 订单的日期

下面是表格的一个示例:

产品表

每行代表一种独特的产品。这些字段是:

  • product_id:产品 ID
  • product_name:产品名称
  • price:产品价格

卖方表

该表包含所有卖家的列表:

  • seller_id:卖家 ID
  • seller_name:卖家名称
  • daily_target:卖家完成其配额所需的商品数量(与产品类型无关)。例如,如果每日目标是 100,000,员工需要销售 100,000 件产品,他可以通过销售 100,000 件 product_0 以及 30,000 件 product_1 和 70,000 件 product_2 来达到定额

练习

利用下面的练习的最好方法是下载数据并实现一个工作代码来解决提出的问题,最好是在分布式环境中!我建议在阅读本页末尾的解决方案之前先这样做!

提示:我构建数据集是为了允许在单台机器上工作:在编写代码时,想象一下数据集大 100 倍会发生什么。

即使你知道如何解决这些问题,我的建议是不要跳过热身问题!(如果你知道火花,他们需要几秒钟)。

如果要用 Python 做这个练习,需要以下包:

**# Pyspark
pip install pyspark# Pyspark stubs
pip install pyspark-stubs**

热身#1

**Find out how many orders, how many products and how many sellers are in the data.How many products have been sold at least once? Which is the product contained in more orders?===========**Create the Spark session using the following code**spark = SparkSession.builder \
    .master("local") \
    .config("spark.sql.autoBroadcastJoinThreshold", -1) \
    .config("spark.executor.memory", "500mb") \
    .appName("Exercise1") \
    .getOrCreate()**

热身#2

**How many distinct products have been sold in each day?===========**Create the Spark session using the following code**spark = SparkSession.builder \
    .master("local") \
    .config("spark.sql.autoBroadcastJoinThreshold", -1) \
    .config("spark.executor.memory", "500mb") \
    .appName("Exercise1") \
    .getOrCreate()**

练习#1

**What is the average revenue of the orders?===========**Create the Spark session using the following code**spark = SparkSession.builder \
    .master("local") \
    .config("spark.sql.autoBroadcastJoinThreshold", -1) \
    .config("spark.executor.memory", "500mb") \
    .appName("Exercise1") \
    .getOrCreate()**

练习#2

**For each seller, what is the average % contribution of an order to the seller's daily quota?**# Example** If Seller_0 with `quota=250` has 3 orders:Order 1: 10 products sold
Order 2: 8 products sold
Order 3: 7 products soldThe average % contribution of orders to the seller's quota would be:
Order 1: 10/105 = 0.04
Order 2: 8/105 = 0.032
Order 3: 7/105 = 0.028Average % Contribution = (0.04+0.032+0.028)/3 = 0.03333===========**Create the Spark session using the following code**spark = SparkSession.builder \
    .master("local") \
    .config("spark.sql.autoBroadcastJoinThreshold", -1) \
    .config("spark.executor.memory", "500mb") \
    .appName("Exercise1") \
    .getOrCreate()**

练习#3

**Who are the **second most selling and the least selling** persons (sellers) for each product?Who are those for product with `product_id = 0`===========**Create the Spark session using the following code**spark = SparkSession.builder \
    .master("local") \
    .config("spark.sql.autoBroadcastJoinThreshold", -1) \
    .config("spark.executor.memory", "3gb") \
    .appName("Exercise1") \
    .getOrCreate()**

练习#4

**Create a new column called "hashed_bill" defined as follows:- **if the order_id is even**: apply MD5 hashing iteratively to the bill_raw_text field, once for each 'A' (capital 'A') present in the text. E.g. if the bill text is 'nbAAnllA', you would apply hashing three times iteratively (***only if the order number is even***)- **if the order_id is odd**: apply SHA256 hashing to the bill textFinally, check if there are any duplicate on the new column===========**Create the Spark session using the following code**spark = SparkSession.builder \
    .master("local") \
    .config("spark.sql.autoBroadcastJoinThreshold", -1) \
    .config("spark.executor.memory", "3gb") \
    .appName("Exercise1") \
    .getOrCreate()**

解决方法

让我们深入研究解决方案。首先,你应该注意到热身问题对解决练习很方便:

热身#1

这个练习的答案很简单。首先,我们只需要count每个数据集中有多少行:

我们得到以下输出:

**Number of Orders: 20000040
Number of sellers: 10
Number of products: 75000000**

如您所见,我们的数据集中有 75,000,000 个产品和 2 0,000,040 个订单:由于每个订单只能有一个产品,其中一些从未售出。让我们找出有多少产品至少出现一次,哪个产品包含在更多订单中:

第一个查询计算 sales 表中有多少不同的产品,而第二个块提取 sales 表中计数最高的product_id

输出如下所示:

**Number of products sold at least once
+--------------------------+
|count(DISTINCT product_id)|
+--------------------------+
|                    993429|
+--------------------------+Product present in more orders
+----------+--------+
|product_id|     cnt|
+----------+--------+
|         0|19000000|
+----------+--------+**

让我们仔细看看第二个结果:20 M 中的 19,000,000 个订单正在销售带有product_id = 0 : 的产品这是一个我们以后应该使用的强大信息!

热身#2

对 Spark 有所了解,这应该很简单:我们只需要找出“在每一天卖出了多少不同的产品”:**

这里不多说了,输出如下:

**+----------+----------------------+
|      date|distinct_products_sold|
+----------+----------------------+
|2020-07-06|                100765|
|2020-07-09|                100501|
|2020-07-01|                100337|
|2020-07-03|                100017|
|2020-07-02|                 99807|
|2020-07-05|                 99796|
|2020-07-04|                 99791|
|2020-07-07|                 99756|
|2020-07-08|                 99662|
|2020-07-10|                 98973|
+----------+----------------------+**

练习#1

让我们解决难题吧!第一个练习是简单地询问"订单的平均收入是多少?

理论上,这很简单:我们首先需要计算每个订单的收入,然后得到平均值。记得那个revenue = price * quantity。零用易:product_priceproducts表中,金额在sales表中。

第一种方法是简单地连接两个表,创建一个新列,然后求平均值:

以上是正确的,并且它可能工作得相当好(特别是如果您正在本地环境中工作)。但是让我们看一下执行计划 DAG:在某个时候,我们将有一个重新分区(在product_id字段上)和一个连接:

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

让我们看看当 Spark 执行 join 时会发生什么(在 Spark UI 上的):****

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

哎呀!一项任务比其他任务花费更多的时间!

这是一个典型的倾斜连接的例子,其中一个任务需要很长时间来执行,因为连接只倾斜在很少的键上(在这个例子中是product_id = 0)。我在我的媒体文章《星火加盟的艺术》中提到过星火加盟,如果你想了解更多,可以去那里看看!

**** [## 火花中加入的艺术

Spark 中加速连接的实用技巧

towardsdatascience.com](/the-art-of-joining-in-spark-dcbd33d693c)

请注意,如果您在本地系统上运行 Spark,这不是一个大问题。在分布式环境中(有更多的数据),这个连接可能会花费难以置信的时间来完成(也许根本不会完成!).

让我们用一种叫做“密钥加盐”的技术来解决这个问题。我不会详细描述,因为我已经在上面链接的文章中涉及了这个主题。总结一下,我们要做的是:

  1. 为最常见的产品复制维度表中的条目,例如,将复制 product_0,创建 id:product_0–1product_0–2product_0–3等。
  2. 在销售表上,我们将把“ **product_0** ”替换为随机复制的(例如,其中一些将替换为product_0–1,其他替换为product_0–2,等等。)使用新的“salted”键将消除连接的倾斜:

这里要注意的重要一点是我们并没有对所有的产品加盐,只是对那些驱动偏斜度的产品加盐(在这个例子中,我们得到了 100 个最频繁出现的产品)。对整个数据集加盐会有问题,因为行数会根据“加盐因子”线性增长:

查看我们执行上述操作时的各个阶段:

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

查询的结果应该如下所示

+------------------------------+
|avg((price * num_pieces_sold))|
+------------------------------+
|            1246.1338560822878|
+------------------------------+

在本地环境中使用这种技术可能会导致执行时间的增加;然而,在现实世界中,这个技巧可以决定完成还是不完成连接。

练习#2

第二个问题是:“对于每个卖家,订单对卖家每日配额的平均贡献百分比是多少?".

这与第一个练习类似:我们可以将我们的表与 sellers 表连接起来,我们计算特定订单的配额命中率,然后计算平均值,按seller_id分组。

同样,这可能会产生一个偏斜的连接,因为即使是卖家也不是均匀分布的。不过,在这种情况下,解决方案要简单得多!因为卖家的表格很小,我们可以广播它,使得操作快得多

“广播”仅仅意味着将表的副本发送给每个执行者,允许“本地化”任务。我们需要小心地使用这个操作符:当我们广播一个表时,我们需要确保这个表不会变得太大而不能在将来广播,否则我们将会在以后出现内存不足的错误(随着广播数据集变得越来越大)。

练习#3

问题:“每种产品的 销量第二多和销量最少的 人员(卖家)是谁?那些带有 *product_id = 0* 的产品是谁。

这听起来像窗口函数!让我们来分析一下这个问题:对于每种产品,我们需要销量第二多和销量最少的员工(销售人员):我们可能需要两个排名,一个是销售图表中的第二名,另一个是最后一名。我们还需要处理一些边缘情况:

  • 如果一个产品只被一个卖家卖出,我们会把它放入一个特殊的类别(类别:Only seller or multiple sellers with the same quantity)。
  • 如果一个产品由多个卖家出售,但所有卖家都出售了相同的数量,我们将把他们放在同一个类别中,就好像他们只是该产品的一个卖家一样(类别:Only seller or multiple sellers with the same quantity)。
  • 如果“最少销售”也是“第二次销售”,我们将仅将其计为“第二次销售”

让我们起草一个策略:

  1. 我们得到每对产品和卖家的销售总额。
  2. 我们增加了两个新的排名列:一个按降序排列产品的销售额,另一个按升序排列。
  3. 我们将获得的数据集分成三份:我们要处理的每个案例一份(第二大销售、最少销售、单一销售)。
  4. 在计算“最少销售”时,我们排除了只有一个销售人员的产品,以及销售最少的员工也是第二多销售人员的产品
  5. 我们把碎片重新组合在一起。

问题第二部分的结果如下:

+----------+---------+--------------------+
|product_id|seller_id|                type|
+----------+---------+--------------------+
|         0|        0|Only seller or mu...|
+----------+---------+--------------------+

练习#4

对于这个最后的练习,我们只需要应用一个奇特的算法。我们可以通过UDF(用户定义函数)来实现。UDF 是一个自定义函数,可以在数据帧列上调用;作为一条经验法则,我们通常应该尽量避免 UDF,因为 Spark 并不能真正优化它们:UDF 代码通常比非 UDF 代码运行得慢。不幸的是,我们不能仅使用 Spark SQL 函数来应用所描述的算法。

解决方案如下所示:

首先,我们需要定义 UDF 函数 : def algo(order_id, bill_text)algo功能接收order_idbill_text作为输入。

UDF 函数实现算法:

  1. 检查order_id是偶数还是奇数。
  2. 如果order_id是偶数,计算钞票文本中大写字母“A”的数量,并迭代应用 MD5
  3. 如果order_id是奇数,应用 SHA256
  4. 返回哈希后的字符串

之后,这个函数需要通过algo_udf = spark.udf.register(“algo”, algo)行注册到 Spark 会话中。第一个参数是 Spark 上下文中的函数名,而第二个参数是将要执行的实际函数。

我们在下面一行应用 UDF:

sales_table.withColumn("hashed_bill", algo_udf(col("order_id"), col("bill_raw_text")))

如您所见,该函数将两列作为输入,并将对每一行执行(即每对order_idbill_raw_text)。

在最终的数据集中,所有的散列应该是不同的,所以查询应该返回一个空的数据集

拿走

如果你完成了所有的练习,恭喜你!这些内容涵盖了关于 Spark SQL 开发的一些非常重要的主题:

  1. 连接偏斜:这通常是 Spark 管道中的主要痛点;有时很难解决,因为在这些操作中涉及的所有因素之间找到平衡并不容易。
  2. 窗口函数:超级有用,唯一要记住的就是先定义开窗。
  3. 虽然 UDF 非常有用,但是我们在开始开发这样的函数之前应该三思,因为它们的执行可能会降低我们代码的速度。

当然,上面的练习可以用许多不同的方法来解决,我很乐意接受建议!我希望你喜欢!让我知道你的想法,如果你愿意,看看这些其他的文章!

[## 使用 Apache Spark 轻松调整超参数

如何在 Spark 上运行随机搜索而不用编写 Spark 代码?

towardsdatascience.com](/effortless-hyperparameters-tuning-with-apache-spark-20ff93019ef2) [## 聚类波洛克

杰森·布拉克绘画的聚类分析——如何利用 k-means 进行色彩分组

towardsdatascience.com](/clustering-pollock-1ec24c9cf447)****

成为有抱负的数据科学家的六种方法

原文:https://towardsdatascience.com/six-ways-to-get-more-exposure-as-an-aspiring-data-scientist-46a9e95c90ac?source=collection_archive---------42-----------------------

学习如何推销自己,从人群中脱颖而出

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

鲁珀特·布里顿在 Unsplash 上的照片

介绍

无论你作为一名数据科学家学到了多少,如果你不营销自己,你将面临有限的机会。

举个例子,从技术角度来看,索尼制造了最好的手机之一,拥有 4K 屏幕、可扩展存储、免工具 SD 卡托盘、耳机插孔等等。然而,它的市场份额基本上为零,这是怎么回事呢?

索尼的一个主要问题是他们有一个糟糕的营销策略,为一个新型号制造宣传,当宣传停止时,该型号才在几个月后发布。

我的观点是…

你应该花一部分时间在学习数据科学的同时推销自己,这样你就可以增加被那些有机会给你的人认识的机会。

我不是技术最强或知识最丰富的数据科学家,但因为我推销了自己,我从教授、初创公司甚至新加坡政府那里获得了几次机会!

也就是说,作为一名有抱负的数据科学家,这里有六种方法可以增加你的曝光率。

1.用 Kaggle!

如果你不知道什么是 Kaggle ,我强烈建议你花时间去探索它,看看它能提供什么。在我看来,Kaggle 对于数据科学家就像 Leetcode 对于软件工程师一样。

Kaggle 允许你展示你的数据科学项目,你的底层代码,以及你有多活跃!你可以通过以下几种方式来利用它:

参加比赛

在我看来,没有比通过竞赛展示您的代码更好的方式来表明您已经为数据科学工作做好了准备。Kaggle 举办了各种各样的比赛,其中包括建立一个模型来优化某个指标。

你现在可以尝试的两个比赛是:

  1. 泰坦尼克号:机器从灾难中学习
  2. 房价:高级回归技术

创建和共享数据集

为了成为一名优秀的数据科学家,你首先要有好的数据!通过 web 抓取或其他方式创建数据集,并与社区的其他成员共享这些数据集,这是实践提供干净和可用数据的一个很好的方式。

进行 EDA 并构建模型与他人分享

也许 Kaggle 最好的部分是有成千上万的数据集供你探索和建立模型。不久前,举个例子,我使用成对关联构建了一个极其简单的烹饪食谱推荐系统。我还利用其中一个冠状病毒数据集来看看自今年年初以来新冠肺炎的传播是如何演变的(点击这里查看)。)

2.创建 GitHub 帐户

我推荐的第二件事是创建一个 GitHub 存储库来存储所有的代码和数据科学项目。为什么?

  1. 使用版本控制系统,比如 GitHub,来组织你的代码和项目是一个很好的实践——每一个技术公司都希望你熟悉 GitHub。
  2. 在学习 GitHub 如何工作的同时,你还应该学习如何使用 Git(这可能是每个招聘经理都希望你知道的另一项技能!)

因此,用 GitHub 和 Git 建立良好的实践,并通过你有组织的 GitHub 库展示出来,意味着你已经在这些领域有经验了!

3.在媒体上开博客

是的,我有偏见,但是听我说完。你会惊讶有多少数据相关的专业人士在 Medium 上。他们喜欢看信息丰富、见解深刻、有趣的材料。利用 Medium 来记录您的学习成果,用简单的行话解释复杂的主题,或者浏览您的数据科学项目!

具体来说,我建议你为《走向数据科学》杂志撰稿,因为他们目前拥有近 50 万名粉丝。

如果你想要一些灵感,请查看我关于 葡萄酒质量预测 的项目演练。

4.创建个人网站

创建个人网站是展示您的数据科学项目和/或任何其他与数据科学相关的成就的另一个好方法。如果你对 HTML、CSS 和 JavaScript 有一些经验,我特别建议你创建一个个人网站,这样你就可以展示出你精通多种编码语言(JavaScript 对数据科学家来说肯定能派上用场!).

5.非营利机会

最近,我看到 Susan Currie Sivek 写的一篇 足智多谋的文章,文章提供了几个组织,在那里你可以有机会从事现实生活中的数据科学项目。

如果你想在简历中添加更多的经历,我强烈建议你看看这个。

6.完善你的 LinkedIn 个人资料和简历

说到简历,确保你的简历和你在 LinkedIn 上的简介更加清晰,这样可以突出你所有的工作、成就和贡献。

具体来说,我建议您考虑以下几点:

  • 在你的简历中添加一个名为“个人项目或“数据科学项目”的部分,在那里你可以清楚地定义你解决的问题,你是如何处理每个问题的,以及结果是什么。
  • 同样,确保你有一个部分强调你精通的技能和工具,比如 Python、SQL、Pandas 等…
  • 如果你在任何数据科学竞赛中获得了成功,请确保也包括这些。
  • 最后,确保包含我在本文前面提到的所有内容,比如你的 Kaggle 个人资料、GitHub 个人资料和/或个人网站的链接。

感谢阅读!

不确定接下来该读什么?我为你挑选了另一篇文章:

[## 在你第一份工作之前获得现实生活数据科学经验的 3 种方法

如何通过以下方式发展您的数据科学技能

towardsdatascience.com](/3-ways-to-get-real-life-data-science-experience-before-your-first-job-545db436ef12)

特伦斯·申

简化的偏度和峰度

原文:https://towardsdatascience.com/skewness-kurtosis-simplified-1338e094fc85?source=collection_archive---------0-----------------------

什么是偏斜度,我们如何检测它?

如果你问大自然母亲——她最喜欢的概率分布是什么?

答案将是——“正常”,其背后的原因是影响地球上每一个已知变量的机会/随机原因的存在。如果一个过程也受到可分配/重要原因的影响呢?这肯定会改变分布的形状(扭曲),这时我们需要像偏斜度这样的度量来捕捉它。下面是一个正态分布图,也称为钟形曲线。这是一个对称的图形,所有集中趋势的量度都在中间。

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

(图片由作者提供)

但是,如果我们遇到不对称分布,我们如何检测不对称的程度呢?让我们直观地看看当我们遇到这样的图形时,集中趋势的度量会发生什么。

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

(图片由作者提供)

请注意,当正态分布被扭曲时,这些集中趋势度量会如何传播。对于命名法,只需遵循尾部的方向即可——对于左图,因为尾部在左侧,所以它是左偏斜的(负偏斜),而右图的尾部在右侧,所以它是右偏斜的(正偏斜)。

如何推导出一个衡量标准来捕捉分布的众数和平均数之间的水平距离?很直观地认为,偏斜度越高,这些度量就会越分开。现在让我们跳到偏斜度的公式:

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

除以标准差可以在相同的标准标度上进行分布的相对比较。由于不建议将众数计算作为小数据集的集中趋势,因此为了得到更可靠的偏度公式,我们将使用从中值和平均值导出的计算结果来代替众数。

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

*近似为偏态分布

替换偏度公式中的众数值,我们得到:

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

(图片由作者提供)

什么是峰度,我们如何捕捉它?

想想从顶部打孔或者拉正态分布曲线,会对分布的形状产生什么影响?让我们想象一下:

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

(图片由作者提供)

因此,有两件事需要注意——曲线的峰值和尾部,峰度测量负责捕捉这一现象。峰度计算的公式很复杂(在基于矩的计算中是第 4 阶矩),所以我们将坚持这个概念及其直观的清晰性。正态分布的峰度为 3,称为中峰度。大于 3 的分布称为薄分布,小于 3 的分布称为宽分布。所以值越大,峰值越大。峰度范围从 1 到无穷大。由于正态分布的峰度度量值为 3,我们可以通过保持正态分布的参考值为零来计算超额峰度。现在过度峰度将从-2 变化到无穷大。

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

正态分布的过度峰度= 3–3 = 0

当峰度为 1 = 1–3 =-2 时,超额峰度值最低

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

(图片由作者提供)

峰度的话题已经争论了几十年,这些年来峰度的基础一直与峰值相关联,但最终的结论是离群值(较胖的尾部)比均值(峰值)附近的值更能控制峰度效应。

因此,我们可以从上面的讨论中得出结论,正态分布曲线的水平推或拉失真由偏斜度度量捕获,而垂直推或拉失真由峰度度量捕获。此外,主导峰度效应的是异常值的影响,其证据来源于基于四阶矩的公式。我希望这篇博客能帮助你以一种简单的方式阐明偏度和峰度的概念,并在未来关注更多类似的博客。

谢谢!!!

为招聘流程的 GitHub 活动图换肤

原文:https://towardsdatascience.com/skinning-the-github-activity-chart-for-the-recruiting-process-9b97728d528?source=collection_archive---------20-----------------------

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

作为一名软件工程师,对你来说,推销自己和你的工作的最好方式是你的 GitHub 账户。公式很简单——展示令人印象深刻的项目,定期的活动,并在你的知识库中有大量的星星和叉子。

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

招聘人员的圣杯— Gleb Bahmutov GitHub 活动图

就是这样。这应该足够让你参加很多面试了。

现在,成功通过这些面试的问题本身就是一个大话题,围绕它建立了一个完整的商业生态系统,所以让我们假设你已经把这部分收入囊中了。😃

然而,当招聘人员在 GitHub 上寻找工程师时,有一件重要的事情需要讨论——招聘人员通常是非技术人员。

为什么这很重要?三个原因:

首先,他们无法准确判断你所做的事情是否令人印象深刻。有时,向项目中添加 100 行代码可能意味着系统效率的彻底转变。发现这一点有时需要详细查看代码,并理解哪些内容发生了变化以及以何种方式发生了变化,以便保证所述改进。

其次,最好的程序员是这个星球上最懒的人。他们不在乎努力工作,他们在乎聪明地工作,对于程序员来说,自然的道路是尽可能多地自动化他们的生活。

最后,许多程序员非常清楚我写的第一点(上面的两段)——他们知道他们的工作没有被通常装备不足的招聘人员从外部角度公平地评判。

综合所有这些因素,我们可以得出这篇文章的中心观点:考虑到招聘过程的惊人复杂性,GitHub 为每个用户衡量和展示的生产力和技能的许多不同方面,以及招聘机构在严格的研究、方法和招聘指标上花费的时间,有没有一种方法可以自动最大化程序员对面试的适应性

Pfft 当然有。

永远记住:如果 it 可以自动化,it 就会自动化。

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

GitHub 活动图表的漫画

下面是一个 50 行的 Python 脚本,它更改了一个简单文本文件中的文本,并通过随机提交消息将其推送到一个选定的存储库中。通过这样做,它在常规的基础上做了微小的改变,并确保将你的贡献沐浴在一片葱郁、春意盎然的绿色中。

虽然有许多方法可以实现 GitHub 活动的自动化,但我选择了这一种,因为它简单且有良好的记录。这只会影响你整个 GitHub 活动的一部分,但往往是招聘人员和其他工程师在评估技能时在个人资料中寻找的关键指标。

我想在结束的时候讨论一下这个问题的含义,并给你一个免责声明。

首先,不要自己用这个脚本

我并不特别赞同自动化的使用,也不认为自动化 GitHub 活动的一部分(或全部)本质上是个坏主意。然而,我确实认为这是一个错误的价值展示,任何做最少量挖掘的人都会看到你的“活动”充满了简单的变化,而这些变化对项目没有任何贡献,这肯定会发出危险信号。

甚至可能有人为此编写了一个反脚本——检查用户的活动,并试图判断该活动是真实的还是自动化的产物。这可能会立即让你失去参加更严肃的面试的资格(例如,大型科技公司)。

这种推销自己的方法的广泛后果是,技能/经验不足的人得到的工作要求他们按照他们在 GitHub 账户上错误展示的速度工作,因此经常导致失败和错过投资(招聘人员的错误),或者精疲力尽、压力和疲劳(程序员的错误)。

总结一下——如果你在招聘,确保你不会上当,确保如果你的生产率指标是 GitHub 活动,你的员工不会这样做,除非你真的知道你在做什么,否则不要为你自己的个人资料这样做。

SKORCH:用 Scikit-Learn 包装器训练的 PyTorch 模型

原文:https://towardsdatascience.com/skorch-pytorch-models-trained-with-a-scikit-learn-wrapper-62b9a154623e?source=collection_archive---------18-----------------------

理解使用 SKORCH 训练 PyTorch 模型是多么容易和简单的指南

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

肯尼斯·贝里奥斯·阿尔瓦雷斯在 Unsplash 上拍摄的照片

你有没有想过有没有一种工具可以简单方便地训练和评估 PyTorch 车型?这个工具确实存在,它就是 SKORCH ,一个用于训练 PyTorch 模型的 scikit-learn 包装器。

在这篇博客中,我们将讨论什么是 SKORCH ,它的组成部分,以及包装一个 PyTorch 模型来训练和评估它是多么容易。博客将分为以下几个部分:

  • 什么是 SKORCH?
  • PyTorch 型号
  • 与斯科奇一起训练

我们开始吧!

什么是斯科奇?

SKORCHscikit-learnPyTorch 的并集,换句话说, SKORCH 是一个用于训练、调整和优化 PyTorch 模型的包装器。 SKORCH 是 2017 年推出的开源库【1】, SKORCH 的出现是为了将 PyTorchSciKit-learn 框架的伟大优点结合在一起并加以增强。

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

图一。PyTorch + SciKit-Learn = SKORCH |作者图片|取自原始来源的徽标

PyTorch 是开发神经网络模型最常用的框架之一,然而,有些阶段需要开发时间,有时它会成为有些不切实际的部分。斯科奇试图简化 PyTorch 车型培训阶段的各种流程。在一个或多个功能中开发 PyTorch 模型的训练模块是很常见的,然而,当需要评估模型或优化以找到最佳参数时,需要开发额外的功能。所有这些过程都被 SKORCH 简化了,因为它是基于 scikit-learn 的包装,因此扩展了已经执行这些过程的函数。

斯科奇宣称他的哲学是:“做一个科学的人——学习 API,学会黑客,不要隐藏 PyTorch,不要重新发明轮子”

在图 2 中,我们可以看到复合了斯科奇PyTorchscikit-learn 的能力。正如我们所见,从 PyTorch 方面来看,原型化模型和处理数据集的能力被使用了。另一方面,我们观察到 scikit-learn 已知的函数被扩展到能够训练、评估、调整和优化机器学习模型,这种组合使 SKORCH 成为一个强大的工具。

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

图二。PyTorch 和 scikit 的优势-了解 SKORCH |作者图片|来自原始来源的徽标

另一方面,我们可以将 SKORCH 视为 Keras API等价物,它从 Tensorflow 扩展而来,以加速、简化和加快神经网络模型的原型化。在这种情况下, SKORCH 将作为 PyTorch 模型的训练、调整和优化阶段的原型工具。

太好了,到目前为止我们已经知道了 SKORCH 是什么,它的组件是什么,使用它的优势是什么,是时候看看一个例子来更好地了解它的工作原理了,让我们开始吧!

PyTorch 模型

为了了解 SKORCH 在训练 PyTorch 模型时是如何工作的,我们将创建一个神经网络来预测众所周知的葡萄酒数据集。因此,首先我们将根据上述数据集创建一个简单的葡萄酒分类模型,然后我们有:

如果你想访问完整的实现,看看:https://github.com/FernandoLpz/SKORCH-PyTorch-Wrapper

代码片段 1。PyTorch 模型

正如我们所看到的,有些值是固定的。实际上,我只想强调第 9 行和第 12 行。在第 9 行中,我们定义了 13 个输入特征,这是因为葡萄酒数据集包含 13 个特征。另一方面,在第 12 行中,我们定义了大小为 3 的输出,这是因为我们要分类的类是 3(即 3 种类型的葡萄酒)。

完美, PyTorch 模型做好了,是时候看看我们如何用 SKORCH 训练这个模型了,让我们进入下一节!

与 SKORCH 一起训练

1.基础训练

通过 SKORCH 进行的培训可以根据我们的需要简单或复杂,对于实际例子,我们将逐步进行。因此,训练上一节中定义的模型的一个基本而简单的方法就像下面几行代码一样简单:

代码片段 2。简单训练

我们将逐行分析。在第 2 行中,我们导入了 PyTorch 模型(在前面的部分中已经定义)。在第 4 行中,我们导入了一个类,它将作为我们的 PyTorch 模型的包装器。该类接收一系列重要参数(第 7 行),它们是:PyTorch 模型,历元数,学习率,批量,优化器。显然,它们不是我们在这个类中可以定义的唯一参数,然而为了实用,我们将只显示在这个例子中已经提到的那些参数。最后,在第 9 行,我们执行“ fit ”方法,它将负责执行整个训练阶段。

您可能想知道,“那么分解成训练和验证呢?”,那么 NeuralNetClassifier 类也会处理这个问题。默认情况下,该类实现数据的 StratifiedKFold 分割,80%用于训练,20%用于验证。好了,一旦上面提到,这将是输出:

epoch    train_loss    valid_acc    valid_loss     dur
-------  ------------  -----------  ------------  ------
      1        9.6552       0.4167        9.2997  0.0124
      2        9.6552       0.4167        9.2997  0.0109
      3        9.6552       0.4167        9.2997  0.0107
      4        9.6552       0.4167        9.2997  0.0109
      5        9.6552       0.4167        9.2997  0.0116
      6        9.6552       0.4167        9.2997  0.0119
      7        9.6552       0.4167        9.2997  0.0114
      8        9.6552       0.4167        9.2997  0.0113
      9        9.6552       0.4167        9.2997  0.0115
     10        9.6552       0.4167        9.2997  0.0115

输出的结构如前面的代码片段所示。正如我们所看到的,默认情况下它显示了关于训练验证集合中损失的信息,以及验证精度和执行时间的信息。由于我们没有调整模型,结果非常差,但是,我们将在接下来的例子中解决这个问题。

2.管道:定标员+培训

在上一点中,我们看到了如何用 SKORCH 以一种基本的方式训练模型。然而,数据处理是一个非常重要的阶段,总是在训练阶段之前进行。在这种情况下,我们将执行一个非常简单的预处理,我们将只对数据进行缩放,然后我们将执行训练*,为此,我们将利用 scikit-learn Pipeline 模块,因此我们将拥有以下内容:*

代码片段 3。涉及扩展和培训的管道

在第 5 行和第 6 行,我们从 scikit-learn 导入了流水线和 StandardScaler 模块。在第 12 行中,我们可以看到,我们初始化包装器的方式与上一点完全相同(使用固定值),有趣的事情出现在第 14 行和第 15 行,在那里管道被初始化,它包含 StandarScaler() 模块以及 PyTorch 模型的包装。运行这个程序,我们得到:

epoch    train_loss    valid_acc    valid_loss     dur
-------  ------------  -----------  ------------  ------
      1        0.4663       0.8889        0.3528  0.0124
      2        0.0729       0.8889        0.6507  0.0111
      3        0.0420       0.9167        0.4564  0.0118
      4        0.0101       0.9167        0.3142  0.0116
      5        0.0041       0.9167        0.3321  0.0119
      6        0.0028       0.9167        0.3374  0.0129
      7        0.0022       0.9167        0.3376  0.0111
      8        0.0017       0.9167        0.3384  0.0122
      9        0.0014       0.9167        0.3373  0.0135
     10        0.0012       0.9167        0.3378  0.0118

需要强调的是,结果显著改善,这是由于在训练阶段之前对数据进行了缩放。

到目前为止,我们已经看到了如何在执行管道中将 PyTorch 模型(具有固定参数)训练为 scikit-learn 模块,然而,我们如何将其他评估指标(如准确性平衡准确性添加到 SKORCH 模块,这就是我们利用回调的地方。

3.管道:定标员+培训+回访

回调是 SKORCH 的扩展,它允许我们向 NeuralNetClassifier 包装器添加其他函数,例如,如果我们希望优化指标是 balanced_accuracyROC 或任何其他分类指标,这可以通过回调来完成。因此,引入一个回调来计算流水线内模型的精度平衡精度如下:

代码片段 4。涉及扩展、培训和回访的渠道

因此,正如我们在第 9 行看到的,我们导入了划时代 回调。为了使用回调,我们只需通过传递我们想要用作参数的度量的名称来初始化它,在这种情况下,我们为度量初始化“ balanced_accuracy 和“ accuracy ”。此外,我们必须将参数“ lower_is_better ”设置为“ False ”,因为我们的问题寻求度量的最大化,而不是最小化。

因此,执行前面的代码片段的结果将类似于:

epoch    accuracy    balanced_accuracy    train_loss    valid_acc    
-------  ----------  -------------------  ------------  -----------  
      1      0.9722               0.9762        0.4780       0.9722        
      2      1.0000               1.0000        0.0597       1.0000        
      3      1.0000               1.0000        0.0430       1.0000        
      4      1.0000               1.0000        0.0144       1.0000        
      5      1.0000               1.0000        0.0110       1.0000        
      6      1.0000               1.0000        0.0083       1.0000        
      7      1.0000               1.0000        0.0067       1.0000        
      8      1.0000               1.0000        0.0058       1.0000        
      9      1.0000               1.0000        0.0047       1.0000        
     10      1.0000               1.0000        0.0039       1.0000 

最后,我们将看到如何使用 scikit-learn 模块执行网格搜索,让我们开始吧!

4.GridSearch:管道+定标器+培训+回调

要执行网格搜索,我们只需导入 scikit-learn 模块。执行网格搜索与从 scikit-learn 中学习机器的经典模型完全相同,唯一的不同点在于网格参数的定义。

代码片段 5。网格搜索定义

正如我们所看到的,参数有一个特殊的方面。我们正在添加前缀“ nn__ ”和“ nn__module__ ”。这些前缀将帮助包装器知道参数是属于 PyTorch 模型的定义还是属于训练阶段。正如我们所看到的,当我们提到训练阶段的参数时,我们只使用前缀“ nn__ ”,当我们提到 PyTorch 模型的参数时,我们只使用前缀“nn __【模块 _ _】”。重要的是名称“ nn ”指的是包装器的实例化(第 19 行)。

因此,如果我们想知道最佳参数是什么,我们可以很容易地做到:

[1] print(gs.best_params_)
{'nn__lr': 0.1, 'nn__max_epochs': 10, 'nn__module__dropout': 0.1, 'nn__module__num_units': 10, 'nn__optimizer': <class 'torch.optim.adam.Adam'>}

如果你想访问完整的实现,看一看:https://github.com/FernandoLpz/SKORCH-PyTorch-Wrapper

结论

在这篇博客中,我们已经看到了什么是 SKORCH 及其组成部分。我们还看到了如何实现 NeuralNetClassifier 包装器,以非常简单的方式训练 PyTorch 模型。

在我看来,斯科奇会留下来。有时需要快速灵活地构建 PyTorch 模型的原型,SKORCH 在这方面做得非常好。

参考

[1]https://skorch.readthedocs.io/en/latest/index.html

https://www.youtube.com/watch?v=Qbu_DCBjVEk

Sktime:用于时间序列机器学习的统一 Python 库

原文:https://towardsdatascience.com/sktime-a-unified-python-library-for-time-series-machine-learning-3c103c139a55?source=collection_archive---------2-----------------------

用于时间序列预测、分类和回归的“sklearn”

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

图片由 geraltPixabay 拍摄

用 Python 解决时间序列数据的数据科学问题是一项挑战。

为什么?现有工具不太适合时间序列任务,并且不容易集成在一起。scikit-learn 包中的方法假设数据是以表格格式组织的,并且每一列都是独立的——这些假设不适用于时间序列数据。包含时间序列学习模块的包,比如 statsmodels ,不能很好地集成在一起。此外,许多基本的时间序列操作,如将数据分割成不同时间的训练集和测试集,在现有的 python 包中是不可用的。

为了应对这些挑战,sktime 应运而生。

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

sktime 库的 logo(Github:https://github.com/alan-turing-institute/sktime)

sktime 是一个开源的 Python 工具箱,用于时间序列的机器学习。这是一个由社区推动的项目,由英国经济和社会研究委员会、消费者数据研究中心和艾伦图灵研究所资助。

**sktime 将 scikit-learn API 扩展到时间序列任务。**它提供了有效解决时间序列回归、预测和分类任务所需的算法和转换工具。该库包括专用的时间序列学习算法和转换方法,在其他常见库中不容易获得。

**sktime 旨在与 scikit-learn 进行互操作,轻松调整相关时序任务的算法,并构建复合模型。**如何?许多时序任务是相关的。可以解决一个任务的算法通常可以被重用来帮助解决一个相关的任务。这个想法叫做还原。例如,时间序列回归模型(使用序列来预测输出值)可以重新用于时间序列预测任务(预测的输出值是未来值)。

使命陈述:“sk time 用时间序列实现可理解、可组合的机器学习。它提供了 scikit-learn 兼容的算法和模型合成工具,由学习任务的清晰分类提供支持,具有指导性的文档和友好的社区。”

在本文的其余部分,我将重点介绍 sktime 的一些独特特性。

时间序列的适当数据模型

Sktime 对熊猫数据框架中的时间序列使用嵌套数据结构。

典型数据框中的每一行都包含 i.i.d .观测值,每一列代表不同的变量。对于 sktime 方法,Pandas 数据框中的每个像元现在都可以包含一个完整的时间序列。这种格式对于多变量、面板和异质数据是灵活的,并且允许在 Pandas 和 scikit-learn 中重用方法。

在下表中,每一行都是一个观察值,X 列中包含一个时间序列数组,y 列中包含类值。sktime 估算器和转换器可以对此类序列进行操作。

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

原生时序数据结构,兼容 sktime。

在下一个表格中,按照 scikit-learn 中方法的要求,X 系列中的每个元素都被分成单独的一列。维度相当高— 251 列!此外,表格学习算法会忽略列的时间顺序(但时间序列分类和回归算法会使用)。

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

scikit-learn 所需的时序数据结构。

对于将多个同现序列建模在一起的问题,与原生序列数据结构兼容的 sktime 显然是最好的。根据 scikit-learn 所期望的表格格式的结构化数据训练的模型会在大量的特性中陷入困境。

sktime 能做什么?

根据 Github 页面,sktime 目前提供:

  • 用于时间序列分类、回归和预测的最新算法(移植自基于 Java 的 tsml 工具包),
  • 时间序列的转换器:单序列转换(例如,去趋势化或去季节化)、序列作为特征转换(例如,特征提取器)以及组成不同转换器的工具。
  • 变压器和模型的流水线作业,
  • 模型调整,
  • 模型集合——例如,用于时序分类和回归的完全可定制的随机森林;多元问题的集成。

sktime API

如前所述,sktime 遵循带有 fit、predict 和 transform 类方法的基本 scikit-learn API。

对于估计器(又名模型)类,sktime 提供了一个用于模型训练的拟合方法和一个用于生成新预测的预测方法。

sktime 中的估计器将 scikit-learn 的回归器和分类器扩展到它们的时间序列对应项。Sktime 还包括专门针对时间序列任务的新估算器。

对于 transformer 类,sktime 提供了 fittransform 方法来转换系列数据。有几种类型的转换可用:

  • 对 i.i.d .实例进行操作的表格数据转换器,如 PCA
  • 将每一行中的时间序列转换成基元数(例如特征事务)的序列到基元转换器;
  • 串-串变压器将级数转换成不同的级数(例如级数的傅立叶变换);
  • 去趋势转换器返回与输入序列相同域中的去趋势时间序列(例如,季节性去趋势)。

代码示例

时间数列预测法

以下示例改编自 Github 上的预测教程。本例中的系列(Box-Jenkins 航空公司数据集)显示了从 1949 年到 1960 年每月的国际航班乘客人数。

首先,加载数据,并将其分为训练集和测试集,然后进行绘图。sktime 提供了两个方便的函数来轻松做到这一点——temporal_train_test_split用于按时间分割数据集,而plot_ys用于绘制训练和测试序列值。

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

在您创建任何复杂的预测之前,将您的预测与一个天真的基线进行比较是有帮助的—一个好的模型必须超过这个值。sktime 提供了NaiveForecaster方法,采用不同的“策略”来生成基线预测。

下面的代码和图表展示了两个天真的预测。具有 strategy = "last "的预测器总是预测系列的最后观察值。具有 strategy = "seasonal_last "的预测器预测给定季节中观察到的序列的最后一个值。示例中的季节性被指定为“sp=12”,即 12 个月。

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

下一个预测片段展示了现有的 sklearn 回归器如何以最小的努力轻松、正确地适应预测任务。下面,sktime ReducedRegressionForecaster方法使用 sklearn RandomForestRegressor模型来预测序列。在内部,sktime 将训练数据分割成长度为 12 的窗口,以便回归变量进行训练。

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

sktime 也包含了原生的预测方法,比如AutoArima

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

要更全面地了解 sktime 的预测功能,请查看 sktime 预测教程。要了解预测的时态交叉验证,请查看以下文章。

[## 不要对时间序列预测使用 K-fold 验证

如何用 python 中的 sktime 执行时态交叉验证

towardsdatascience.com](/dont-use-k-fold-validation-for-time-series-forecasting-30b724aaea64)

时间序列分类

最后,sktime 可用于将时间序列分为不同的序列组。

在下面的代码示例中,单个时间序列的分类与 scikit-learn 中的分类一样简单。唯一的区别是上面讨论的嵌套时间序列数据结构。

从 https://pypi.org/project/sktime/借用的示例代码

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

传递到 TimeSeriesForestClassifier 的数据。

要更全面地了解时间序列分类,请查看下面链接的我关于时间序列分类的文章以及 sktime 单变量多变量分类教程。

[## 时间序列分类算法综述

专门为时间序列分类设计的专用算法

towardsdatascience.com](/a-brief-introduction-to-time-series-classification-algorithms-7b4284d31b97) [## 微型火箭:快速和准确的时间序列分类

使用 Python 实现系列分类的最快的先进算法

towardsdatascience.com](/minirocket-fast-er-and-accurate-time-series-classification-cdacca2dcbfa) [## ROCKET:快速准确的时间序列分类

“时间序列分类的任务可以被认为是学习或检测信号或模式…

link.medium.com](https://link.medium.com/qYcaC7lL69) [## 不要对时间序列预测使用 K-fold 验证

如何用 python 中的 sktime 执行时态交叉验证

towardsdatascience.com](/dont-use-k-fold-validation-for-time-series-forecasting-30b724aaea64)

附加 sktime 资源

要了解更多关于 sktime 的信息,请访问下面的链接,获取深入的文档和示例。

不是中等会员?今天就加入!

[## 阅读亚历山德拉·阿米登(以及媒体上成千上万的其他作家)的每一个故事

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

alexandra-amidon.medium.com](https://alexandra-amidon.medium.com/membership)

进一步阅读

[## PyOD:用于异常检测的统一 Python 库

towardsdatascience.com](/pyod-a-unified-python-library-for-anomaly-detection-3608ec1fe321) [## 如何对时间序列数据应用 K 均值聚类

使算法适应时间序列的理论和代码

towardsdatascience.com](/how-to-apply-k-means-clustering-to-time-series-data-28d04a8f7da3)

用熊猫切片和索引

原文:https://towardsdatascience.com/slicing-and-indexing-with-pandas-2bff05ec361e?source=collection_archive---------30-----------------------

PyTrix 系列

PyTrix #4:用熊猫访问数据

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

Marvin MeyerUnsplash 上拍摄的照片

PyTrix 是一个每周一期的系列文章,我在其中展示了可以用 Python 完成的对数据科学家有用的很酷的东西。在 PyTrix 系列的前几周,我们主要研究了 Numpy 数组,具体来说是索引和切片…

[## 使用 Numpy 数组:索引

访问 Numpy 数组中的元素

towardsdatascience.com](/working-with-numpy-arrays-indexing-e4c08595ed57) [## 使用 Numpy 数组:切片

PyTrix #3:访问 Numpy 数组中的序列

towardsdatascience.com](/working-with-numpy-arrays-slicing-4453ec757ff0)

Pandas 是一个快速、强大、灵活且易于使用的开源框架,它构建在 Python 之上,用于数据操作和分析,就像 Numpy 一样,是数据科学事实上的库之一。很大一部分人很可能是从学习熊猫开始他们的数据科学之旅的,如果你没有,那么我强烈建议你阅读文档——当然是在阅读了这个故事之后。

要访问 Github 中使用的代码,请单击下面的链接。

[## kurtispykes/演示

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/kurtispykes/demo/blob/master/pytrix/pytrix_pandas_indexing-and-slicing.ipynb)

索引的选择

对于许多学习熊猫来说,他们的多轴索引方法很少被实践者理解,这是公平的,因为有许多方法来进行对象选择:

  • .loc主要基于标签,这意味着它从索引中选择带有显式标签的行(或列)。因此,如果没有找到项目,将引发一个KeyError
  • .iloc主要基于整数位置(从 0 到轴的长度-1 ),这意味着行(或列)是根据其在索引中的位置来选择的——它只接受整数。如果索引器越界,则会引发IndexError
  • []主要用于筛选出低维切片。

**注意:**Python 和 NumPy 索引操作符[]和属性操作符.提供了跨越广泛用例的对 pandas 数据结构的快速和简单的访问。这使得交互式工作变得直观,因为如果您已经知道如何处理 Python 字典和 NumPy 数组,就没有什么新东西需要学习了。然而,由于要访问的数据类型事先不知道,直接使用标准操作符有一些优化限制。对于生产代码,我们建议您利用本章中介绍的优化的 pandas 数据访问方法。

-熊猫的摘录文档

使用[ ]的属性访问

对于那些一直关注 PyTrix 系列的读者,或者如果您对 Python 索引行为有所了解,那么您会知道用于索引低维切片的主要方法是[]

import pandas as pd
import numpy as np df= pd.DataFrame(np.random.randn(5, 5), 
             columns=["col_1", "col_2", "col_3", "col_4", "col_5"])df 

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

图 1

*# access all elements in "col_1"* 
df["col_1"]>>>> 0    0.32
1    0.74
2    0.14
3    0.79
4    0.58
Name: col_1, dtype: float64

从上面我们可以看到,使用[]来索引 Pandas DataFrame 类会返回一个对应于列名的series。如果数据是一个series,将返回一个标量,例如我将使用上面返回的序列来显示我们可以像这样返回一个标量:

a = df["col_1"]
a[1] >>>> 0.79390631428754759

这是最基本的索引形式。我们也可以将一个列列表传递给[]来按顺序选择列。

df[["col_2", "col_3", "col_4"]]

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

图二。

我不会深入研究这个功能,因为它非常类似于普通 Python 和 Numpy 中的索引和切片,除了开始和结束边界都被返回。

按标签选择

Pandas 使用一个严格的基于包含的原则,允许所有用于基于标签的索引的方法正确运行——未能提供一个不在索引中的标签将引发KeyError

对于这一部分,我将创建一个新的熊猫数据框架

new_df = pd.DataFrame(np.random.randn(10, 4), index=list("abcdefghij"), columns=list("ABCD"))new_df

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

图 3。

按标签选择时,.loc属性是主要的访问方法。.loc的有效输入如下:

  • 单个标签(注意,标签可以是整数,不涉及沿索引的整数位置)
# cross-section using a single label
new_df.loc["a"]>>>> A    0.952954
B   -1.310324
C   -1.376740
D    0.276258
Name: a, dtype: float64
  • 标签的列表或数组
# A list or array of labels
new_df.loc[["a", "d ", "i"]]

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

图 4。

  • 带标签的切片(注意,与 Python 切片相反,开始和结束边界都包含在切片中)
# slice with labels
new_df.loc["a":"d", "B":]

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

图 5。

  • 布尔数组
# a boolean array
new_df.loc["j"] > 0.5>>>> A    False
B    False
C     True
D     True
Name: j, dtype: bool # another way to use a boolean array 
new_df.loc[:, new_df.loc["j"] > 0.5]

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

图 6。

按位置选择

Pandas 使用符合 Python 和 Numpy 切片语义的0-based索引。有多种方法可用于通过使用纯基于整数的索引按位置访问元素。试图使用一个非整数,不管其有效性如何,都会引发一个IndexError

*# using same df but new index values* new_df.index = list(range(0, 10))
new_df

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

图 7。

按位置选择时,.iloc属性是主要的访问方法。.iloc的有效输入如下:

  • 整数
*# cross section using an integer position*
new_df.iloc[3]>>>> A   -0.650225
B    1.571667
C   -1.204090
D    0.637101
Name: 3, dtype: float64
  • 整数的列表或数组
*# list or array of integers*
new_df.iloc[[1, 5, 2, 3]]

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

图 8。

# another example 
new_df.iloc[[1, 2, 3, 4], [0, 1, 2]]

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

图 9。

  • 带有整数的切片对象
# integer slicing
new_df.iloc[:3] 

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

图 10。

# integer slicing by column
new_df.iloc[:, :3]

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

图 11。

  • 布尔数组。
new_df.iloc[1:] > 0.5

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

图 12。

当使用超出界限的切片时,这可能导致空轴。

new_df.iloc[10:13]

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

图 13。

然而,如果我们试图调用一个越界的索引器,这将引发IndexError。此外,如果我们试图调用任何元素越界的索引器列表,那么这也会引发一个IndexError

注意:是否为设置操作返回副本或引用,可能取决于上下文。这有时被称为 **chained assignment** ,应该避免。参见 返回视图与 复制。

可调用选择

以上所有属性都可以接受一个叫做callable的东西作为索引器。对callable的要求是,它必须是一个带有一个参数的函数,返回索引的有效输出。

# selection by a callable using []
new_df[lambda df: df.columns[3]]>>>> 0    0.276258
1   -0.617174
2    0.229638
3    0.637101
4    0.977468
5    0.401624
6   -0.659852
7    0.984220
8    0.947080
9    1.182526
Name: D, dtype: float64

这将返回索引 3 处的一系列列(在此场景中,索引 3 处的列是“D”)。

# selection by a callable using .loc 
new_df.loc[:, lambda df: ["A", "B"]] 

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

图 14。

在这个例子中,我们使用.loc属性返回所有的行和列 A 和 B。下面我们将使用.iloc做完全相同的事情。

# selection by a callable using .iloc 
new_df.iloc[:, lambda df: [0, 1]]

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

图 15。

包裹

Pandas 对于数据科学家来说是一个非常有用的工具。值得通读一下文档看看这个包里还有什么很酷的东西,因为有太多东西我在这篇文章里没有涉及到,例如如何在pd.Series上使用这些操作。

感谢您花时间阅读这个故事。如果你喜欢它,你可以在 PyTrix 系列中找到更多类似的文章。

[## Pytrix 系列-走向数据科学

阅读《走向数据科学》中关于 Pytrix 系列的文章。共享概念、想法和代码的媒体出版物。

towardsdatascience.com](https://towardsdatascience.com/tagged/pytrix-series)

如果您想亲自联系我,我是 LinkedIn 上最活跃的用户,我会非常乐意与您联系!

[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

Power BI 中的图像数据切片

原文:https://towardsdatascience.com/slicing-data-with-images-in-power-bi-32b210449ccc?source=collection_archive---------27-----------------------

您可以用许多不同的方式在 Power BI 中分割数据。但是,你知道你也可以使用图像切片和切块吗?比你想象的简单…

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

安德鲁·罗伯特·劳科在 Unsplash 上拍摄的照片

你知道我是一个强力 BI 的传播者。关于 Power BI,我最喜欢的一点是,它让您可以灵活地以多种不同的方式讲述数据故事。基本上,您不仅仅局限于现成的解决方案(尽管如此,这些解决方案通常非常复杂,足以满足您所有的报告需求)。

通过一些创意和一些小调整,你可以为你的用户创造一个难忘的体验。他们会因此而感激你!

简单的要求—简单的解决方案!

几周前,我正在为我们的销售部门做一份报告。销售人员对报告设计的要求不是很高——他们希望尽可能快地看到他们的数字,不要太关注视觉效果。

本质上,他们会很感激有这样的东西:

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

所以,两个简单的视觉效果,和一个切片器用来切片和切割数据。而且没毛病!但是,由于我有一些额外的时间投入到这份报告的开发中,我决定向他们提供一个更吸引眼球的解决方案…

像往常一样,我在所有示例中使用 Contoso 示例数据库。

利用 PowerPoint 的优势

当我想创建一个漂亮的报告背景时,我喜欢使用 PowerPoint。这给了我将所有想法、视觉占位符、文本框等分组的可能性。在一个地方。这样做还会减少我的 Power BI 报告画布上的视觉效果数量,从而减少报告渲染所需的时间。

使用 PowerPoint,你可以用一个画面代替多个画面!诀窍是——一旦你创建了你想要的背景,只需将其保存为. png 或。jpeg 文件:

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

顺便说一下,这是我的报告背景的样子:

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

让我简单解释一下新报告外观的想法。画布中间的两个大占位符将包含主要视觉效果。左手边就是神奇发生的地方!

我已经决定把图像和使用它们,而不是简单的切片器视觉。通过这种方式,我的用户将获得类似应用程序的体验,就像他们在浏览网站一样。

书签掌握着关键!

书签是 Power BI 中最酷的功能之一!基本上,【Bookmark 所做的是,它捕获报告的当前状态,因此您可以通过按钮、图像、形状将它用作您行动的参考…这将基本上为您的报告创建类似应用程序的体验,并使其看起来具有交互性。

确实有十几个可以应用书签的用例,这是其中之一。

第一步是把我们用 PowerPoint 创建的背景,作为 Power BI 中的背景图片:

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

现在,我将在左侧的占位符中插入图标。这些图标将用于在各种书签之间导航用户:

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

关于报告中使用的图像的简短说明:

  • 标有绿色箭头的图像将被用作“切片器”
  • 标有红色箭头的图像将用于指示当前应用的“切片器”
  • 标有黄色箭头的图像将帮助我们回到起点,查看所有产品类别的数据(未应用切片器)

我创建的第一个书签将捕获报告的默认外观,包括所有产品类别:

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

这里最重要的事情是 选中 ,因为这将捕获页面的当前状态,包括所有应用的过滤器(在我们的例子中,没有应用过滤器)!

现在让我们为音频产品类别创建一个视图。我将隐藏除音频以外的所有图像。这里的关键是 应用滤镜面板 中的滤镜,以便只显示音频产品类别的数据!

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

同样,在创建书签时,保持选中数据选项。对其他产品类别重复相同的步骤,这样书签窗格的最终外观将会提醒您:

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

现在,我们需要为我们的图像指定动作,这样它们就可以在不同的书签之间导航。让我向您展示音频产品类别是如何做到这一点的,然后您可以轻松地对其余类别采用相同的模式:

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

最后一步是对我们的用户隐藏过滤器窗格,因为他们不需要知道报告是如何工作的:

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

在我向 Power BI Service 发布我的报告后,下面是它的样子:

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

如果你问我,那看起来比我们的起点好多了:)

结论

正如我已经多次说过的,Power BI 在灵活性方面非常强大。您已经看到了一些基本的背景格式、书签和图像的巧妙使用如何将您的报表推向一个全新的水平。

不用我说,我的销售团队在得到这份报告后都肃然起敬。这是本文中最重要的一点:为了让你的用户能够享受使用报告的乐趣,一定要付出额外的努力!

感谢阅读!

订阅这里获取更多有见地的数据文章!

Slideio:一个用于阅读医学图像的新 python 库。

原文:https://towardsdatascience.com/slideio-a-new-python-library-for-reading-medical-images-11858a522059?source=collection_archive---------16-----------------------

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

这是一个新的 python 库的介绍,用于医学图像的阅读。更多详细信息可在项目网站上找到:www.slideio.com。源代码可以在 GitLab 的知识库中找到:【https://gitlab.com/bioslide/slideio

介绍

医学图像—由生物扫描仪、显微镜等产生的图像。与普通图像不同。其中一个重要的区别是它们的大小。这种图像可能非常大。目前,大小为几十亿字节的幻灯片并不罕见。另一个区别是维度的数量。许多生物图像格式支持 3 维和 4 维(体积和时间序列)。除了传统的尺寸之外,一些格式引入了扫描仪特定的尺寸,如焦距、旋转(对于从各种角度记录的数据)、相位指数等。

不可能用传统的压缩方法来编码数千兆像素的图像。jpeg 或 png 等图像编解码器需要将整个图像保存到计算机内存中,以便在屏幕上显示,甚至读取图像的一小部分。生物格式使用平铺方法和缩放金字塔来解决这些问题。它允许以最小的内存和计算资源读取任意比例的图像的任意区域。缩放金字塔是一组不同比例的图像副本。

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

Slideio library 旨在使用医学图像的内部结构来读取医学图像,以尽可能提高过程的性能。Slideio 并不是第一个提供这种功能的库。在我的图像分析实践中,我使用了许多不同的库。但到目前为止,我没有找到任何库可以满足我对图像分析的所有要求。所以我决定创建我自己的,它应该聚合我在这方面的经验。

该库有一个驱动程序架构。每个驱动程序支持一种或多种图像格式。slideio 的第一个版本提供了 4 个驱动程序:

  • CZI——读取蔡司 CZI 图像的司机。
  • SVS——读取 Aperio SVS 图像的驱动程序。
  • AFI——读取离子荧光图像的驱动程序。
  • GDAL——读取 jpeg、png、tiff 等通用格式的驱动程序。它使用了流行的 c++图像库 GDAL

Slideio 库有一个简单的对象结构:

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

图像驱动程序创建幻灯片对象。Slide 对象代表单个图像文件(或文件夹,取决于图像格式)。幻灯片对象包含至少一个连续光栅区域的场景对象(2D 图像、体积、时间序列等)。一些图像格式支持单个场景,如单个组织扫描。一些格式允许在一个文件中存储多个组织区域。2D 场景的所有图层都具有相同的像素大小和分辨率。如果场景是 3D 体积,则该体积的所有切片具有相同的大小和分辨率。时间序列也是如此。

以下代码片段显示了如何使用“SVS”图像驱动程序打开幻灯片:

图像元数据

Slideio 库提供不同级别的图像信息。幻灯片对象具有属性“raw_metadata ”,该属性公开了从图像中提取的未修改的文本信息。文本内容特定于文件格式。在 Aperio SVS 幻灯片的情况下,它是从“图像信息”tiff 标签中提取的字符串。对于蔡司 CZI 文件,它是一个带有完整文件元数据的 XML 文档。以下是从 Aperio SVS 文件中检索元数据的代码片段:

下面是代码示例产生的输出:

['Aperio Image Library vFS90 01\r\n20320x19545 [0,100 19919x19445] (240x240) JPEG/RGB Q=70',
 'AppMag = 20',
 'StripeWidth = 2032',
 'ScanScope ID = SS1598',
 'Filename = 24496',
 'Date = 11/09/11',
 'Time = 18:51:40',
 'Time Zone = GMT+09:00',
 'User = e8ddb309-efc1-4a6b-b9b0-7c555f9fa0ef',
 'MPP = 0.4962',
 'Left = 23.939867',
 'Top = 19.531540',
 'LineCameraSkew = 0.000320',
 'LineAreaXOffset = 0.060417',
 'LineAreaYOffset = 0.011084',
 'Focus Offset = -0.000500',
 'DSR ID = ap6101-dsr',
 'ImageID = 24496',
 'Exposure Time = 109',
 'Exposure Scale = 0.000001',
 'DisplayColor = 0',
 'OriginalWidth = 20320',
 'OriginalHeight = 19545',
 'ICC Profile = ScanScope v1']

光栅存取

场景是访问栅格数据的主要对象。它公开了以下信息:

  • 压缩:数据压缩的类型;
  • 放大:扫描仪放大;
  • 名称:场景名称;
  • num_t_frames :时间序列中的时间帧数;
  • num_z_slices :卷中的切片数;
  • rect :场景矩形的坐标和尺寸;
  • 分辨率:场景平面内的分辨率(一个元组);
  • t_resolutionz_resolution :场景在时间和 z 方向的分辨率;
  • 通道数:场景中的通道数;
  • *通道数据类型:*图像通道的数据类型(字节、16 位等。);
  • 通道名称:图像通道的名称。

以下代码片段检索场景名称、矩形和分辨率。

它产生以下输出:

('Image', (0, 0, 19919, 19445), 3, (4.961999999999999e-07, 4.961999999999999e-07))

该图像的宽度为 19919 像素,高度为 19445 像素。每个像素在 x 和 y 方向上都是 0.4962 mkm。该图像有 3 个通道。生物图像中通道的含义取决于图像格式。对于亮场图像,它只是红色、绿色和蓝色。这种图像有 3 个 8 位通道。通道属性可通过方法 get_chanel_data_typeget_channel_name 访问。

uint8
uint8
uint8

方法 read_block 检索连续区域的像素值。在没有参数的情况下执行该方法会以原始大小检索整个场景。通常情况下,由于尺寸较大,不可能以原始比例读取整个图像。在这种情况下,程序可以检索图像的一个区域,将其缩小到可接受的大小,或者检索一个缩小的区域。下面是一段代码。检索整个图像并将其缩放为 500 像素宽的图片。请注意,用零代替图片高度表示必须自动计算图片高度,以保持 x 和 y 方向的比例不变。

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

下面的代码片段从图像中读取一个矩形区域,并将其缩小为 500 像素宽的图片。

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

可以读取单个通道或通道子集:

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

附加的元组参数切片允许读取体积和时间序列;

(1000, 1000, 27)

装置

slideio 库可以与 pip 一起安装:

pip install slideio

目前,仅支持 Linux 和 Windows 版本。

结论

Slideio 是一个用于阅读医学图像的 python 模块。它允许阅读整张幻灯片以及幻灯片的任何区域。大幻灯片可以有效地缩小尺寸。该模块使用图像的内部缩放金字塔来使缩放过程尽可能快。Slideio 支持 2D 幻灯片以及 3D 数据集和时间序列。

该库以 numpy 数组的形式提供栅格,并与许多流行的图像分析库兼容,如 opencv

目前,它支持阅读 Aperio SVS 和 AFI 文件,蔡司 CZI 文件和通用格式。以下格式的即将推出的驱动程序:

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

  • 珀金埃尔默图像
  • 徕卡 SCN 图像
  • DICOM 数据集
  • 徕卡 lif 图像
  • 还有更多…

感谢您的阅读。如有任何意见或建议,我们将不胜感激。

COVID 疫情期间 Rt 估计的滑动 SIR 模型

原文:https://towardsdatascience.com/sliding-sir-model-for-rt-estimation-during-covid-pandemic-e7458226848f?source=collection_archive---------51-----------------------

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

图片来自 UnsplashPatrick Assalé 拍摄

流行病的一个主要特征是有效繁殖数( Rt ),它表示每个被感染个体在任何给定时间将进一步感染的人数。能够估计出 Rt 是一项重要的任务,因为这个数字定义了疫情是预计会增长(Rt1),还是会开始下降(Rt1)。在本帖中,我建议使用滑动 SIR 方法来估计 Rt ,该方法基于 SIR 流行病模型与不同国家的感染数据的拟合。

本文介绍了我们与莫斯科国立罗蒙诺索夫大学 塔吉扬娜·佩特洛娃 的联合研究。我们这里描述的代码在 GitHub 上有 ,你可以在Azure Codespaces Azure 笔记本 中轻松运行 来做自己的研究。对应的论文是 可在 preprints.org—如果使用代码的任何部分,请 引用它

流行病建模

让我们从任何流行病如何演变的基础开始。描述流行病的最简单模型被称为 SIR 模型 ,因为它包含三个变量:

  • S(t)易感 —有可能被感染的人数
  • I(t)感染 —感染人数
  • R(t)—不易感染的人数(也包括死亡人数)。

在此模型中,每个变量都是时间的函数,我们可以用公式表示以下描述模型行为的微分方程:

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

SIR 模型的微分方程

该模型取决于两个参数:

  • β接触率,我们假设在单位时间内每个感染者都会接触到 βN 人。从这些人中,易感人群的比例为 S/N ,因此新感染发生的速度定义为 -βSI/N
  • γ恢复率,数字 1/γ 定义一个人保持感染的天数。因此, γI 这个术语定义了被感染个体从被感染到康复的速度。

为了对流行病进行建模,我们需要用一些初始条件 S(0)I(0)R(0) 对这些微分方程进行数值求解。我们将使用下一本书的本章中的例子:克里斯蒂安·希尔。用 Python 学习科学编程。— 剑桥大学出版社,ISBN: 9781107428225。

首先,让我们定义微分方程的右边:

**def** **deriv**(y, t, N, beta, gamma):
    S, I, R **=** y
    dSdt **=** **-**beta ***** S ***** I **/** N
    dIdt **=** beta ***** S ***** I **/** N **-** gamma ***** I
    dRdt **=** gamma ***** I
    **return** dSdt, dIdt, dRdt

假设我们想做 120 天的模型。我们将定义点的网格:

days **=** 160
t **=** np.linspace(0, days, days)

让我们在一个拥有 1200 万人口的大城市建立疫情模型——类似于我居住的城市。让我们从第 0 天的 100 名感染者开始,假设接触率为 0.2,恢复期为 30 天。模型的初始参数将是:

N **=** 12000000
I0, R0 **=** 100, 0
S0 **=** N **-** I0 **-** R0
beta, gamma **=** 0.2, 1.**/**30

然后,我们将使用初始参数求解方程,以获得时间网格中每个点的 S、I 和 R 向量:

from scipy.integrate import odeint
y0 **=** S0, I0, R0
ret **=** odeint(deriv, y0, t, args**=**(N, beta, gamma))
S, I, R **=** ret.T
plt.plot(t,S)
...

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

在 SIR 建模中,常见的是估计流行病 R₀ = β/γ (详见本文)。在我们的例子中,我们有 R₀ =4,这与 COVID 感染的估计数字非常相似。这个模型告诉我们,在没有任何隔离措施的情况下,在像莫斯科这样的城市,我们将在大约 80 天内一下子有大约 500 万人被感染,最终每个人都将经历这种疾病。

下面,我们展示了几个不同 R₀ 值的图表:

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

它有效地说明了使曲线变平的想法,因为越低的是r₀——同时感染的人数越低,这有助于最小化医疗系统的过载。

确定模型的参数

在我们的例子中,我们在某种程度上随意地取了 βγ 的值。然而,如果我们有一些真实的流行病学数据,我们可以尝试通过拟合 SIR 模型来确定这些值,以最接近真实数据。在这种情况下,我们将解决优化问题,并优化参数以最小化度量。

为了获得数据,我们将使用约翰·霍普金斯大学系统科学与工程中心(CSSE)的新冠肺炎数据仓库,可从这里获得。从这个数据集中,我们将获得感染、康复和死亡的人数,以及每个国家人口的信息。我们需要做一些繁重的工作来连接这些表并调换日期,直到我们得到一个与每个国家类似的表:

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

然后,我们通过计算所有列的 3 天滚动平均值来平滑这些数字:

**for** x **in** ['Infected','Recovered','Deaths']:
    df[x**+**"_Av"] **=** df[x].rolling(window**=**smooth_window).mean()
df['Removed_Av'] **=** df['Recovered_Av']**+**df['Deaths_Av']

我们还计算了包含从易感人群中移除的人数的Removed列。

我们将调用结果表 country dataframe ,我们的代码包含函数make_frame,该函数检索给定名称的国家的数据帧和人口。

现在,为了估计 R₀,我们需要从所有国家的一个共同点开始,比如说,从感染人数超过 1000 的那一天开始。然后,我们将关注几天的时间段,用ndays表示。考虑一周似乎是个好主意。

start_index **=** df[df['Infected_Av']**>**1000].index[0]
ndays **=** 7
V **=** df['Infected_Av'][start_index:start_index**+**ndays].to_numpy()
R **=** df['Removed_Av'][start_index:start_index**+**ndays].to_numpy()

在数组VR中,我们保存了连续几天ndays被感染和被移除的人数。现在我们需要定义一个函数,用给定的参数 βγ 计算 SIR 模型,从start_index的感染/清除人数开始,返回预测数据和实际数据之间的误差:

**def** **model**(V,R,N,beta,gamma):
    t **=** np.linspace(0,len(V),len(V))
    y0 **=** N**-**V[0]**-**R[0],V[0],R[0]
    S,I,R **=** odeint(deriv, y0, t, args**=**(N, beta, gamma)).T
    dV **=** np.diff(V)
    dI **=** np.diff(I**+**R)
    **return** np.linalg.norm(dV**-**dI)

我们计算误差的方法如下。因为我们拥有的最准确的数字是特定日期的累计感染总人数(不考虑已移除的人数),所以最简单的方法是计算每天的新增病例数,dV。在 SIR 模型中,与感染总人数相对应的数字将由I+R表示,即我们加上当前感染人数(I)和已经患病人数(R)。因此,SIR 模型中的每日新病例数将由I+R的日间差异给出,用dI表示。返回的误差值将是dV-dI向量的范数。

为了找到参数,我们需要针对参数 βγ 优化model函数。在我们的实验中,我们发现 7 个有噪声的数据点不允许我们有效地优化两个参数,因此我们根据医学研究固定了 γ 参数(见本报道世卫组织),其表示平均恢复时间为 30 天。然后我们使用 SciKit Learn 中的minimize方法找到并返回 β 的最优值:

the_gamma **=** 1**/**30
**def** **fit**(V,R,N):
    res **=** minimize(**lambda** x:model(V,R,N,x,the_gamma),
                            x0**=**0.5,method**=**'powell')
    **return** res.x

下面你可以找到更正式的过程的数学描述。

假设 t₀ 是感染人数在 1000 以上的第一天:t₀= min {t|I(t)>1000 }。一次考虑一个国家,让我们用以下符号来表示我们拥有的数据:

  • V(t) —第 tt > t₀ 日累计感染病例数。
  • E(t) —第 t 天的恢复病例数
  • D(t) —第 t 天的死亡病例数

对于每个 β ,我们将通过 Sᵦ(t)Iᵦ(t)Rᵦ(t) 来表示具有以下初始值的方程(1)的解:

  • s(t₀)=n-v(t₀)-d(t₀)-e(t₀)
  • I(t₀)=V(t₀)
  • R(t₀)=D(t₀)+E(t₀)

这里的 N 是所考虑的一个国家/城市的人口。我们认为 γ =1/30 的值是固定的。

接下来,我们需要比较预测数字与观测值的对应程度。模型计算的累计总感染人数为 Iᵦ˟(t) = Iᵦ(t)+Rᵦ(t) ,每天新增总感染人数等于 Iᵦ’(t) = Iᵦ˟(t+1)-Iᵦ˟(t)

每日实际新增感染病例数 V’(t)=V(t+1)-V(t) 。我们需要找到值 β* ,该值对应于 7 天期间*v’(t)*和 Iᵦ’(t) 之间的最小差异(我们将用 n=7 来表示所考虑的天数):

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

寻找 argmin 的过程是复杂的优化过程,每一步我们都需要数值求解一个 ODE (1)。我们没有梯度的显式函数,因此我们需要使用一些不依赖于梯度的优化算法。在我们的例子中,Powell 优化在速度方面提供了一个很好的折衷。

一旦我们知道了 β* ,我们就可以计算出 R₀ = β/γ* 。

以下是我们在数据集中获得的几个国家的结果:

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

Rt 的滑动 SIR 估计

在实践中,有趣的是看到模型的参数如何随着时间的推移而变化,以应对不同国家实施的保护措施。类似于基本生殖数 R₀ 这是一种疾病的特征,我们可以考虑有效生殖数 Rt ,其含义相同——单个感染者进一步感染的人数——但在疫情期间,考虑到隔离措施和非易感人群的比例。

我们可以按照同样的方法估算 Rt :

  1. 从有 1000 个感染者开始(start_index)
  2. 移动一个宽度为 7 天的滑动窗口(由参数ndays表示)直到当天。
  3. 在每一点上,使用上述fit函数,通过最小化实际和预测新感染人数之间的平方差,使用连续 7 天来估计β(以及 Rt)。

为了计算 Rt ,我们通过在我们国家的数据框架上组织一个滑动窗口来找到每天的最佳参数 β :

**def** **compute_params**(df,population, start_index, ndays):
  **for** i **in** range(start_index,len(df)**-**ndays):
      V **=** df['Infected_Av'][i:i**+**ndays].to_numpy()
      R **=** df['Removed_Av'][i:i**+**ndays].to_numpy()
      beta **=** fit(V,R,population)
      df.loc[i,'Beta'] **=** beta
      df.loc[i,'Gamma'] **=** the_gamma

一旦我们有了beta的值,我们就可以计算国家数据框架中每天的 Rt :

df['Rt'] **=** df['beta'] **/** df['gamma']

一些正式的细节如下。

从数学的角度来看,为了获得当天 tRt ,我们需要找到从 t 开始的 β 的一个最优值,而不是从 t₀ 开始。所以我们的等式(2)变成了:

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

这里*【itᵦ’(i】也取决于 t ,因为我们需要考虑解stᵦitᵦrtᵦ*的方程(1)从点 t 开始,具有以下起始条件:

  • S(t)=N-V(t)-D(t)-E(t)
  • I(t)=V(t)
  • R(t)=D(t)+E(t)

功能 Itᵦ’Itᵦ˟ 的定义方式同上。

一旦我们将 Rt 的值放入国家数据框架,我们就可以用图形的形式来研究疫情的行为。这是疫情如何在我们的祖国俄罗斯展开的:

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

在该图中,我们指出了隔离措施实施的两个日期:

  • 4 月 2 日,T42 政府宣布了第二波隔离措施(比刚刚建议的自我隔离更加严格)
  • 4 月 15 日,莫斯科和其他几个大城市引入了强制通行证

从图中,我们可以清楚地看到这些措施对 Rt 曲线斜率的影响。

为了将这个图表放入更多的背景中,我们可以在同一个图中添加每日新感染病例的数量:

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

在这张图上,我们还可以清楚地看到,当计算出的 Rt 值低于 1 时,疫情如何同时开始减缓。

为了能够比较国家之间的疫情传播,我们在这个图中做了两件事:

  • 在 x 轴上,我们显示了自第一个 1000 例感染病例以来的天数,这使得比较流行病传播的速度成为可能,而不管实际的时间框架
  • 新病例的数量是以每百万人中的病例数来衡量的,也就是说,我们按照国家人口来标准化这个数字

比较不同国家的疫情

我们正在使用的数据源包含 188 个国家的数据,其中一些国家(如我们)进一步细分为地区。它为不同的研究和比较提供了很大的自由度,这不是本文的主题。

然而,以下是我们发现有趣的几个国家的图表:

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

你可以点击图片放大看细节。从这个图表中,你可以看到:

  • 不同国家的保护措施有多有效,
  • 疫情得到控制的速度(即当 Rt graph 低于 1 时),
  • 它对总体人口的影响有多严重(通过标准化的新病例数)

有几件事需要注意:

  • 新病例的标准化数量在每个图表中以不同的比例显示,因此您不能直接比较它们。这样做是有目的的,使图形的形状更明显,因为在我们的例子中,它似乎比数量级更重要。
  • 在所有图表中,我们显示了从 0 到 90 天的时间段,因此对于一些国家,图表结束得更早。
  • 一些图表包含每日新增病例的高峰——这对应于统计数据的修正。此外,在某些情况下,这些修正是负的,我们没有在图表上显示出来。理想情况下,我们需要找到一些方法来考虑这种校正,因为它们会在 Rt 图中产生尖峰,而这在现实生活中是不会发生的(例如,看看法国在第 30 天左右的图)。

为了更清楚地看到流行病是如何展开的,从“第 0 天”开始,在一个图上绘制所有的 Rt 图是有意义的:

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

从这个图表中,我们可以清楚地看到瑞典的公众意识从一开始就使得 Rt 与其他国家相比非常低,但是它仍然不如检疫措施有效。此外,我们可以看到许多国家的检疫对 Rt 有非常相似的影响,俄罗斯除外,在那里我们可以看到 4 月 24 日左右的水平平台期(4 月 15 日莫斯科地铁许可证检查的可能结果)。

这里还有一个国家比较多的剧情——看起来太美了,不能省略,但另一方面又几乎不可能搞清楚细节。

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

如何引用

你可以免费使用来自我们的 GitHub 库的分析代码,只要你链接到我们的帖子,最好是关于 preprints.org 的论文。以下是正确的参考:

彼得罗娃,t。索什尼科夫博士;全球新冠肺炎病毒爆发的时间相关再生数的估计。预印本 2020,202006 02 89(doi:10.20944/预印本 202006.0289.v1 )。

本文包含对该方法的更详细解释、相关论文的参考、与其他 Rt 估算方法的比较以及对结果的更详细讨论。

原载于 2020 年 6 月 24 日 https://soshnikov.com

缓慢而随意的风格转换

原文:https://towardsdatascience.com/slow-and-arbitrary-style-transfer-3860870c8f0e?source=collection_archive---------45-----------------------

神经类型转移,进化

使用卷积神经网络的图像风格转换

介绍

风格转移是组合两个图像的技术,一个 内容 图像和一个 风格 图像,使得 生成的 图像显示其两个成分的属性。 目标 是生成在风格(例如,颜色组合、笔触)上与风格图像相似并且在结构上与内容图像相似(例如,边缘、形状)的图像。

在这篇文章中,我们描述了一种基于 优化的 方法,该方法由 Gatys 等人在其开创性的工作“使用卷积神经网络 进行 图像风格转换”中提出。但是,让我们先来看看导致最终解决方案的一些构件。

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

图一。演示,图像取自“[R2]实时风格转换和超分辨率的感知损失”

CNN 在学什么?

一开始,你可以把 低级 特征想象成在一个 放大的 图像中可见的特征。相比之下, 高级 特征可以在图像 缩小 时最佳观看。现在,计算机如何知道如何区分图像的这些细节?CNN,来救援。

预训练卷积神经网络的学习滤波器是优秀的通用图像特征提取器。CNN 的不同层提取不同尺度的特征。 浅层 中的隐藏单元只看到输入图像相对较小的一部分,它提取 低级 特征,如边缘、颜色和简单纹理。更深的层次,然而,具有更广感受野的人倾向于提取等高级特征,如形状、图案、错综复杂的纹理,甚至是物体。

那么,我们如何利用这些特征提取器进行风格转换呢?

深层图像表示

在卷积神经网络中,具有 N 个不同滤波器(或, C 通道)的层具有 N (或, C ) 个大小为 H x W、的特征映射,其中 HW 分别是特征激活映射的高度和宽度。该层的特征激活是形状为NxHxW的体积(或者,CxHxW)让我们看看如何使用这些激活从单个图像中分离出 内容样式 信息。**

内容表示

传统上,两幅图像之间的 相似度 是使用像素空间中的 L1/L2 损失函数来测量的。虽然这些损失很好地衡量了的低级相似性,但它们没有捕捉到图像之间的差别。例如,彼此偏移一个像素的两个相同的图像,尽管在感觉上相似,但是将具有高的每像素损失。****

直观上,如果两幅图像的卷积特征激活是相似的,那么它们在感知上应该是相似的。因此,我们将网络的特征响应称为 内容表示 ,两幅图像的特征响应之差称为 感知损失。 为了找到原始 内容 图像的 内容重构 ,我们可以对触发相似特征响应的白噪声图像执行梯度下降。

通过仅匹配来自特定层的特征响应来生成内容重构,可以可视化由网络的不同层捕获的特征的规模(参见图 2)。较低层的重建几乎是完美的(a,b,c)。在网络的较高层中,详细的像素信息丢失,而高级内容被保留(d,e)。

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

图二。内容和风格表示,图像取自“[R1]使用卷积神经网络的图像风格转换”

风格表现

为了获得输入图像风格的表示,在网络的每一层中的滤波器响应之上建立特征空间。它由特征图的空间范围内不同滤波器响应之间的 相关性 组成。数学上,不同滤波器响应之间的相关性可以计算为两个激活图的 点积 。形式上,图像的 风格表示 可以由 Gram 矩阵 (参见图 3)捕获,该矩阵捕获所有特征激活对的相关性。对于一层中的 N 个滤镜,克矩阵是一个 N x N 维矩阵。

  1. 在 Gram 矩阵的位置 (i,i) 处的对角元素测量过滤器I如何活动。假设滤波器 i 正在检测图像中的垂直边缘,那么 (i, i) 处的高值意味着图像具有许多垂直边缘。**
  2. Gram 矩阵的位置 (i,j) 处的值测量两个不同滤波器 ij 的激活的 相似度 。换句话说,这意味着由两个过滤器 ij. 捕获的特征的 共存

通过捕捉不同类型的特征 (i,i) 的流行程度,以及有多少不同的特征一起出现 (i,j) ,Gram Matrix 测量图像的风格。本质上,通过丢弃存储在功能激活图中每个位置的空间信息,我们可以成功地提取样式信息。

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

图三。 Gram Matrix ,图片取自吴恩达的“卷积神经网络”课程

类似于内容重建,风格重建可以通过最小化随机白色图像和参考风格图像的 Gram 矩阵之间的差异来生成(参见图 2)。这创建了在增加的比例上匹配给定图像的风格的图像,同时丢弃了场景的全局排列的信息。

现在我们已经有了定义损失函数的所有关键要素,让我们直接进入它。

损失函数

C,s,G 为原始内容图像,原始风格图像和生成的图像, aᶜ,aᴳ 从一个预先训练好的 CNN 的层 l 中激活它们各自的特征。

内容损失

如图 4 所示,内容损失可以定义为 内容生成的 图像的特征表示之间的平方误差损失。沿着 CNN 的处理层级,输入图像被转换成对图像的实际 内容 越来越敏感但对其精确外观相对不变的表示。在实践中,我们可以通过选择网络中间某处的层 l 来最好地捕捉图像的内容。

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

图 4。内容丢失

风格丧失

如图 5 所示,风格损失可以定义为风格和 生成的 图像的 Gram 矩阵之间的平方误差损失。我们通常在预先训练的网络的多个层上采用风格损失的加权贡献。

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

图五。款式丢失

将这些点连接起来

**结合单独的内容和风格损失,最终损失公式在图 6 中定义。我们从随机图像 G、开始,迭代地 优化 该图像,以匹配图像的内容 C 和图像的风格 S、,同时保持预先训练的特征提取器网络的权重固定。

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

图六。款式转移损耗

总之,值得注意的是,尽管优化过程是 缓慢的, 这种方法允许在任意对内容和样式图像之间进行样式转换。

参考

  1. 利昂·A·加蒂斯、亚历山大·S·埃克和马蒂亚斯·贝奇。使用卷积神经网络的图像风格转移。在 CVPR ,2016。
  2. 贾斯廷·约翰逊,亚历山大·阿拉希和李菲菲。实时风格转换和超分辨率的感知损失。在 ECCV ,2016。
  3. https://www . coursera . org/learn/convolutionary-neural-networks/

小家庭:小数据集

原文:https://towardsdatascience.com/small-family-small-dataset-7f7db708f06d?source=collection_archive---------51-----------------------

2020 年 1 月,我们完成了骨髓的开发阶段,在这一系列的文章中,阿夫纳·佩莱德和我分享了我们在这个过程中所学到的东西。这是该系列的第一篇文章:一个小数据集的扩充。

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

从左到右:原始数据集,失败训练过程 1 号,失败训练过程 2 号,成功训练过程 3 号。

自 2017 年以来,我一直在从事一个名为骨髓的过度实践研究项目,该项目旨在推测机器学习中精神疾病的可能性。这个项目已经发展成为与 Avner Peled 合作的沉浸式影院体验。去年 3 月,我提出了骨髓家庭晚宴背后的第一个想法,这是体验的主要场景,在 2018 年 IDFA DocLAB上制作了原型。在中期帖子 Family2Family 中,我解释了我们为什么以及如何在“完美家庭晚餐”数据集上训练生成性对抗网络(GAN)机器学习模型。

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

谷歌搜索到“提督家宴”的截图

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

骨髓@ IDFA 2018 _ 安妮·范·多恩 2018 NFB。版权所有

当时,我们使用 GAN 的一个特定条件模型— Pix2Pix —该模型研究图像对,学习如何在提供源时生成目标图像。它可以处理小数据集,这在时间和预算的限制方面有很大的不同)。当时原型的目标主要集中在物理参与者的交互、设置和整个项目的陈述,而不是模型的训练过程。

2019 年 9 月,在加拿大国家电影局AtlasV 的合拍下,我们开始了开发阶段。这使我们能够重新审视一年前所做的一些决定,并质疑它们是否与项目的目标和行动要求一致。

《髓》强调了在机器学习模型中发现的故障,以反映人工智能中精神障碍的可能性,以及导致这些故障的社会结构,为社会思维提供了新的途径。

我们需要将选择的 GAN 模型改变为更健壮的模型,该模型试图从零开始生成完美的家族,而不是依赖源输入。这样,我们可以更深入地了解训练过程和数据集分析。我们想突出和可视化的故障和错误发生在培训和国家的艺术甘一代。因此,我们转向了 StyleGAN (当时是 V.01):这个生成器以其生成高分辨率图像的能力而闻名,特别是在人脸方面,并识别数据集中的高级特征,如微笑或年龄。

机器学习模型就像渴求数据的孩子,大多数时候数据集的质量和数量决定了模型的性能。有些模特比其他模特更饥渴,StyleGAN 绝对是饥渴的那一个。我们没有预料到 StyleGan 需要比我们之前使用的模型 Pix2Pix 更大的数据集。

“大数据”是人工智能领域的热门词汇之一。它指的是数以百万计的数据点,这些数据点可以为学习模型提供有价值的见解。然而,在现实世界中,只有少数人能够获得这些资源,这些资源正在成为我们这个时代最昂贵的资源;数字区域的石油被经济学家命名为。我们中的大多数人不是大公司的一部分,他们需要找到处理相对较小的数据的方法。这就是为什么小型独立项目倾向于使用那些公司预先训练好的模型的一个原因。根据少量观察值训练的模型往往会表现出过度拟合,并产生不准确的结果。在现实环境中,这可能会产生不平等和偏见的危险社会影响。

在我们的独特案例中,我们实际上并没有瞄准您通常从 StyleGAN 期望的完美高清结果,您可能会说我们希望训练失败,因此我们可以展示算法和有偏数据集的约束所固有的错误。我们的目的是教机器关于亲密的人类概念,如“家庭晚餐”,但当你浏览网页时,你会发现扭曲的图像与真正的家庭相去甚远。使用“家庭晚餐”的标语产生了大部分年轻、闪亮、快乐和富裕的白人家庭。一堆图像只能引导机器得出我们自己的虚假图像。在那种情况下,机器的输出将是我们自己感知的扭曲的镜子。

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

GAN 看 GAN 中鉴别器与生成器的“不收敛”——为什么生成性对抗网络这么难训练!

GAN 中的一个常见故障是振荡“不收敛”:一种无休止的状态,其中鉴别器和生成器轮流愚弄他们的对手,而实际上他们在愚弄自己。在人脑和其他生物的神经网络中,神经元总是处于振荡状态。随着环境的变化,神经元协调它们从一个波频率到另一个波频率的平衡。然而,在机器智能中,神经网络渴望专注并收敛于单个值——一个最优结果。具有讽刺意味的是,在人工神经网络的训练过程中的振荡状态通常表示出了问题,系统失去了平衡。当我们在推测机器学习中精神疾病的可能性时,GAN 的振荡案例是一个典型的案例,说明一种障碍如何在这样的模型中表现出来。

然而,我们不能有一个完全的失败,我们需要一个足够清晰的结果让用户理解这个模型,但也要足够扭曲以反映精神障碍。数据集必须足够大和多样化,以使训练取得一些进展,但不足以使训练收敛于高质量的图像。在我们的例子中,找不到足够大的数据集。我们旨在根据家庭晚餐的概念训练一个机器学习模型。不仅仅是这样——一顿完美的家庭晚餐。一个标签行是如此具体以至于它只能将数百张高质量的图像塑造成一个或多或少一致的数据集。

由于我们确实成功地用数百张图像训练了 Pix2Pix,我们首先与 StyleGAN 合作了类似数量的图像(约 700 张),这些图像是从“完美家庭晚餐”标语中刮出来的,然后使用“ DensePose ”神经网络从它们的背景中剥离出来,用于人类姿势检测。这是一个失败,在 72 小时的培训后,我们停止了这个过程,因为我们注意到输出变得越来越不稳定,并且由创造者定义的指标输出了非常糟糕的数字。我们目睹了极端的过度拟合,这是由模型对来自小数据集的非常特殊的图像样式的依赖引起的。此外,由于图像没有很好地对齐(即,具有不同的角度和视角),机器捕捉到了这些偏差,并将它们作为主要特征处理-我们的数据非常脏,我们需要清理它。

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

培训流程 1

尽管我们只有大约 700 张图片,但我们假设,如果我们能更仔细地管理它们,可能会改进我们的模型。我们决定采用一种更精确的方法——角度和视角对齐并居中,图片中的数字数量相似。这进一步减少了我们的数据集,但清理了我们的数据,并减少了模型中的噪声。

只有大约 200 张图像,我们可以看到比更大、更多样化的数据集略有改善。然而,一个小的数据集不仅使模式的检测变得更加困难,也阻碍了创造力和产生新图像的能力。因此,使用如此小的数据集几乎不可能呈现准确的结果。和前面的例子一样,这个训练过程在大约 90 小时后中断。

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

培训流程 2

我们开始感受到成本和时间的压力。骨髓是一个实验项目,资源有限。培训和数据收集是一个昂贵的过程;在金钱、人力、计算资源和时间方面。在不确定下一个实验是否正确的情况下,我们无法承担越来越多的实验。我们设法联系到了《StyleGAN》的创作者之一贾科莱提宁,并在执行最后一轮之前得到了他的建议。他告诉我们,毫无疑问,我们需要大约 5-10k 张图像才能获得令人满意的结果,即使这样也不能保证我们达到“解开纠缠”:GAN 可以辨别图像的质量不同和有意义的属性的理想状态(相比之下,StyleGAN 的高质量人脸数据集有 70k 张图像)。

我们知道我们需要一种混合的方法:首先,选择数量而不是质量,收集尽可能多的图像,然后,使用定制技术增加我们的数据,使我们的模型更容易处理图像。现在,我们正亲眼目睹偏见的产生:为了让我们的模型更好地把握现实,我们需要用一个被篡改的图像来呈现它。

在我们的例子中——在抓取了“晚餐”和“完美”同义词的图像,并添加了“完美家庭餐”、“快乐家庭餐”和“四人完美家庭餐”之后,我们通过处理管道运行它们:

1)通过“查找图像副本实用程序运行所有图像,删除所有副本。

2)利用前面提到的 DensePose 分析,明目张胆地从图片中切掉 4 个人(如果多,我们随机选择 4 个人)。

3)手动调整尺寸,将族紧挨着放置,并锚定在图像的中心。

4)通过将图形的顺序打乱四次,从一个图像中产生四个图像,来创造更多的家庭多样性。

这以大约 20,000 张图片结束。

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

混乱的家庭

然后,我们对图像应用了另一个过滤过程:对生成的图像再次运行 DensePose 分析,丢弃任何没有四个人的图像(主要是一些设法通过第一次运行的破碎的身体部分)。

我们只剩下大约 6.5k 的图像。

这减少了模型分类器中的过度拟合,并产生了更加一致的结果。尽管如此,质量在过程进行到一半时达到顶峰,之后工件开始出现。

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

培训流程 3

这种方法使我们获得了令人满意的结果;一个完美家庭的完美但扭曲的形象。

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

放大 3 号训练的“假家庭”输出

对于那些大公司之外的大多数人来说,收集和分配数据的斗争是一场真正的斗争。这对我们的生活有着真正的意义。骨髓是由我们的动机推动的,我们谈论通过交互式讲故事等替代媒体可获得的数据和信息,并设想信息技术的可能未来。这是艺术和独立的社会实验的时代,可以挑战和破坏常见的做法,并建立一个共享知识的新社区。

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

Marie-Pier Gauthier 设计的骨髓@NFB 互动 2020 NFB

在骨髓开发阶段,我们的目标是了解如何处理扭曲家庭的结果,增加与用户的实时交互,并使用 GAN 模型创建更多干预。我们寻找将 StyleGAN 与故事联系起来的方法,以及其他模型和视觉效果,希望引发一场关于失真输出的对话,以及当一个人的表达意识消失时,它们如何突出混乱。

在下一篇文章中,我们将描述如何开发一个工具来帮助我们探索 StyleGAN 的潜在状态,并在团队成员之间进行实时交流。

数据集准备和过滤开源代码:Github 上的骨髓

特别感谢 Osman Zeki 做了大量的搜集工作,并在培训的构思阶段提供了有益的反馈和建议。
这项体验是与声音艺术家 Philippe Lambert 合作开发的。

小 ML 是 RPA 的下一个大飞跃

原文:https://towardsdatascience.com/small-ml-is-the-next-big-leap-in-rpa-c33c3cc70eb9?source=collection_archive---------56-----------------------

每个人都同意机器学习将改变 RPA,但它不会以你可能认为的方式发生。

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

一群蚂蚁比一只孤独的大象更有生产力。Vlad Tchompalov 在 Unsplash 上拍摄的照片

过去几年机器人流程自动化(RPA)的蓬勃发展已经非常清楚地表明,几乎每个行业的业务流程都有无数的瓶颈有待解决,效率有待提高。在 RPA 全面激增的几年前,麦肯锡已经估计到 2025 年知识工作自动化的年度影响大约为6 万亿美元

随着 RPA 从 python 脚本到通用平台的发展,我见证了相当大的转变。RPA 中可用的工具和库随着时间的推移不断改进,每一次迭代都扩大了可自动化流程的种类,并进一步提高了整体自动化率。我相信在 RPA 开发人员的日常工具箱中添加机器学习(ML)是流程自动化范围和效率的下一个巨大飞跃。 I am 单独。但是有一个问题。它看起来会与所有的宣传让你相信的大相径庭。

为什么还要关心机器学习?

想象一下没有 if-else 逻辑或变量的 RPA。您只能自动化简单且完全静态的点击过程。随着我们逐渐添加一些变量和逻辑,我们可以开始自动化更复杂和更有影响力的流程。您想要自动化的过程越复杂,您需要添加的逻辑规则就越多,您需要考虑的边缘情况也就越多。RPA 开发人员规则系统的负担呈指数级增长。明白我的意思了吗?

收益递减定律表明,在某个时间点(很快)规则系统的开发变得如此昂贵,以至于自动化过程不再值得投资。这就是机器学习的用武之地。如果使用得当,它可以轻松地击败任何传统的规则系统,同时需要的资源也少得多。更好的是,它解开了如此复杂的自动化问题,以至于试图用规则系统来解决它们将是可笑的。最后,收益递减规律自然也适用于机器学习,但我很快就会明白为什么现在它实际上并不重要。

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

成本随着复杂性呈指数增长

但是等等,机器学习不是非常昂贵吗?

是也不是。通过选择正确的方法和工具,你可以在疯狂昂贵和疯狂有利可图之间做出选择。我喜欢将自动化分为两类:

1.高影响、低容量自动化

2.低影响、高容量自动化

第一类包含所有炒作的应用程序,如个人人工智能助理、大数据商业分析、自动化 R&D 和其他概念,这些概念有望对商业产生巨大影响。这些都是作为雄心勃勃的大型机器学习项目推出的,但往往只是公关噱头,无法带来多少实际价值。为什么?答案在图表中。影响大的应用需要巨大的投资,才能挤出最后 2%的精度增长,这使得投资回报率为负数。通常这些项目会消耗太多资源,以至于公司被迫削减成本并关闭它们。

第二类是关于效率的。它对媒体的吸引力要小得多,但不要被它低调的本质所迷惑。在这里你会发现可实现的利润和真正的组织变革。发票处理、客户投诉分类和销售线索确认等事情听起来并不像是改变世界的自动化。但是加在一起,它们会将你公司的效率提高一个数量级。想想互联网的影响。你没有一个大规模的互联网项目,但相反,互联网嵌入了你公司的每一个功能。机器学习也会发生同样的情况。你想在有利可图的高效率区。因此,不要做大型 ML 项目,而是将小型 ML 嵌入到您的日常 RPA 工作中,并感到惊讶。

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

高效区是应该去的地方

我该怎么做?我们的数据科学家超级忙。

简单地说,选择允许您的 RPA 团队使用机器学习的工具,而不是依赖数据科学团队来实现每一项自动化。有针对开发者的机器学习工具,跳过了模型训练、托管和维护的所有麻烦。

自然,您可以通过数据科学团队制作的定制模型获得更高的性能,但您需要评估和证明是否值得投资。当 RPA 团队可以自己使用机器学习时,将智能融入流程自动化的门槛就大大降低了。你会发现它无处不在。

大多数 ML 工具都是针对数据科学家来优化他们的工作,所以你需要做一些挖掘来找到以开发者为中心的解决方案。我会在文章的最后回到这个话题。

好的,我应该从哪里开始呢?

看看你现在的自动装置。它们中的一些需要规则系统的不断更新还是需要频繁的人工干预?如果是这样的话,这些瓶颈可以用一些智能来解决吗?

另一个很好的来源是您的 RPA 积压。有没有一些自动化已经以中高优先级搁置了一段时间,但从未向前移动过?通常情况下,那些有点复杂的项目会被卡在 backlog 中。

需要智能的自动装置通常位于以下盒子中:

  1. **的输入数据不可靠:**例如,用户没有在表格中填写所有必要的信息,或者他们打错了字。
  2. **需要一个复杂的规则系统:**例如,识别一个条目是否已经存在于数据库中,但格式不同 (Corp Inc. vs Corp)。
  3. **需要认知决策:**例如,投诉单需要根据其类别或紧急程度分配给正确的客户服务代理。
  4. **环境或数据经常变化:**例如,当新产品推出,旧产品停产时,零售的产品经常变化。

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

小 ML 从哪里入手

我可以在我的 RPA 平台上完成吗?

是的。重点是让机器学习成为你日常 RPA 工具箱中的正常工具,并消除其间的任何摩擦点。至少 aito.ai 已经与 Robot Framework、UiPath、BluePrism 和所有其他主要玩家兼容。使用这样的解决方案只需要发送 HTTP 请求,这是任何 RPA 平台中的标准功能。我们正在为每个平台开发指南和教程来帮助你入门,并且我们正在发布库和组件来使通过这些平台使用 ML 更加容易。

如果你想加入早期采用者的行列,请随时在 LinkedIn 上给我发信息,或者给我发电子邮件。ML 列车上见!

我正在aito . ai为不同的 RPA 平台开发机器学习集成,以永远改变 RPA 的完成方式。

使用 Pandas 和 pandasql 学习 SQL 的小动机和简单入门

原文:https://towardsdatascience.com/small-motivation-and-easy-start-to-learn-sql-using-pandas-and-pandasql-c0a67166749b?source=collection_archive---------23-----------------------

来自 giphy.com(上图)我脑中的数据科学家形象(下图)我努力成为一名数据科学家

不是因为你必须这么做,而是因为这让你的生活更轻松

当我开始独自学习数据科学时,有太多的东西需要我去学习。我从 Python 编码开始,我相信这是大多数人的起点,除非你已经知道如何使用 R 或 Python 编程。然后我们听到机器学习算法和大数据等等。在我加入数据科学沉浸式项目(也称为数据科学训练营)之前,我没有考虑过数据库管理系统(DBMS ),因为我只考虑过如何处理数据,而没有考虑过如何访问数据。数据库是组织存储不同类型数据的地方,根据数据的种类(关系或非关系)决定数据库的类型。关系数据库通过包含特定信息的行和列的表格来存储数据。例如,在企业中,数据库可能存储一个包含客户 ID、姓名、地址、电话号码的客户信息表,以及一个包含订单号、日期、产品名称、金额、客户 ID 的订单表。

然后这两个表通过客户 ID 连接起来。数据库中的每个表可能都有主键,例如客户 ID 和订单号,在本例中,这是表的唯一标识符。

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

SQL 代表结构化查询语言,是一种与关系数据库管理系统(RDBMS)一起工作的语言。尽管有不同的 RDBMSs,如 PostgreSQL、MySQL 和 SQLite,但 SQL 是所有人的通用语言。

当我学习任何一门新的编程语言时,我都试图找到最简单的方法来接触这门语言,并将其与我已经知道的语言进行比较。所以今天我想分享我是如何用熊猫数据框架来练习 SQL 的。这种方式降低了学习的障碍,让你的心从恐惧中平静下来。此外,您可以更经常地练习,因为您不需要寻找 SQL 示例数据库来练习。最后,编写查询通常更容易操作表。(相信我)

第一种方法是使用pandasql。您可能需要首先使用 bash 命令pip install pandasql安装它。

from pandasql import sqldf

然后我们编写一个 lambda 函数,它将使编写查询变得更快。

pysqldf = lambda q: sqldf(q, globals())

让我们以泰坦尼克号数据集为例。我使用了链接中的火车设置,并保存为titanic.csv

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

现在让我们尝试一些简单的东西。

让我们通过 50 到 100 之间的Fare范围来分割数据帧。

对于用我们通常的方式使用熊猫:

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

对于使用 SQL 查询:

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

我们可以通过使用.equals()来检查这两个结果是否相同。但是请注意,当我们使用 SQL 查询时,索引被重置。所以我们用PassengerId设置索引,然后使用.equal()

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

第二个例子是获取幸存男性乘客的前 30 个名字。

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

它表明,当应用的条件越多,SQL 查询就越容易使用!因此,不仅为了实践,也为了方便,我喜欢使用 SQL 查询来一次应用多个条件。

第二种方法是使用.query()

真的很简单!让我们直接看一个例子。

我们想要 15 岁以下的女性乘客。

使用熊猫:

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

使用查询:

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

请注意,没有使用.query()重置索引。

所以我们可以直接对比这两个。

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

我希望这些简单的例子能激发您查找更多的 SQL 推荐,并尝试自己使用它们。如果您有任何问题或意见,请告诉我!我会把 Jupyter 笔记本和我在这里使用的例子放在我的 GitHub 库中,我会用更多的例子更新它!

最小神经网络

原文:https://towardsdatascience.com/smallest-neural-network-for-complete-beginners-in-4-mins-5a398b574053?source=collection_archive---------12-----------------------

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

Unsplash 上由 Steijn 拍摄的照片

我不打算写关于神经网络背后的复杂数学和算法。相反,我将把你的直觉建立在神经网络如何工作的基础上。我将通过创建最小的神经网络来做到这一点,并训练它完成一项简单的任务。

直觉是不容忽视的,约翰。它们代表的数据处理速度太快,意识无法理解- 夏洛克·福尔摩斯

神经网络背后的想法

神经网络是权重的集合。我们可以在一组输入和输出(目标或标签)上训练神经网络。神经网络内部的权重与输入交互并产生输出。随着网络被训练,权重被更新,使得它试图将输出与目标值相匹配。简而言之,神经网络学习输入和输出之间的映射。现在让我们看看我说的这些是什么意思。

最小神经网络

下面是只有一个权重(w)的最小神经网络。我们给它一个输入(x ),乘以权重,结果就是网络的输出。

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

由于这个神经网络非常小,我们将在一个非常简单的任务上训练它。我们的任务是给它输入任何数字,网络应该改变这个数字的符号。比如我们给 3 作为输入,那么网络应该输出-3。

在 Keras 中创建神经网络

现在我要在 Keras 中构建并训练最小的神经网络,这是一个深度学习库。现在没有必要深入语法,这只是为了建立你的直觉。

创建一个神经网络

太好了!我们创造了只有一个权重的神经网络。现在让我们创建训练数据,我们将在此基础上训练我们的神经网络。

创建数据

创建培训数据

我们也创建了训练数据。数据包含 100K 个随机数,标签是该数的负数。让我们根据刚刚创建的数据来训练网络。

训练网络

开始时,神经网络的权值是随机初始化的。随着我们不断训练网络,权重也在更新。在我们开始训练之前,让我们检查一下重量。

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

训练前的体重

现在让我们来拟合网络中的数据。试衣不过是训练的别称。

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

训练网络

我们训练了网络。正如您在进度条中看到的,网络是在 100K 个样本上训练的。现在让我们给网络输入一个值,并检查响应。

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

检查响应

网络几乎完成了任务。输出非常接近输入数,符号相反。随着我们对更多数据进行训练,输出将越来越接近目标值。还有,现在让我们检查一下重量的值。

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

训练后的体重

当我们根据数据训练网络时,权重从 0.42 变化到-1 左右。这是显而易见的,因为一个数必须乘以-1 才能改变它的符号。

摘要

因此,基本上神经网络可以学习任何输入和输出之间的映射,并作为函数逼近器工作。一旦它学会了映射,它可以为你给它的任何输入产生一个近似的输出。

智能面部锁定系统

原文:https://towardsdatascience.com/smart-face-lock-system-6c5a77aa5d30?source=collection_archive---------26-----------------------

虚拟助理项目

建立高精度人脸识别模型

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

来源:照片由弗洛里安·奥利沃在 unsplash 上拍摄,并由作者编辑

安全是当今最令人担忧的问题之一。确保只有正确的人有权访问设备变得极其重要。这是我们的智能手机通常没有两步安全系统的主要原因之一。这是为了确保我们的隐私得到维护,只有真正的所有者才能访问他们的设备。基于人脸识别的智能人脸锁定技术就是这样一种安全措施,我们将研究如何构建我们自己的人脸识别系统,该系统使用深度学习和 VGG-16 的转移学习,从头开始以最高的准确度执行。

注: 这是虚拟助手系列的 part-1。同一主题将有更多即将到来的部分,我们将介绍如何使用深度学习技术和 python 构建自己的虚拟助手。

简介:

这一部分将涵盖所构建的模型将确切执行的内容。我们正在建立的人脸识别模型将能够检测到授权所有者的人脸,并将拒绝任何其他人脸。如果面部被准许进入或拒绝进入,该模型将提供声音响应。用户将有 3 次验证相同的尝试。第三次尝试失败时,整个系统将关闭,从而保持安全。如果识别出正确的面部,则准许访问,并且用户可以继续控制设备。完整的代码将在文章的最后提供,并带有一个到 GitHub 库的链接。

方法:

首先,我们将研究如何收集合法所有者的图像,人脸识别模型将授予许可。然后,如果我们想添加更多可以访问我们系统的人,我们将创建一个额外的文件夹。我们的下一步将是调整图像大小为(224,224,3)的形状,这样我们就可以通过 VGG-16 架构传递它。注意,VGG-16 架构是在具有上述形状的图像净重上预先训练的。然后,我们将通过对数据集执行图像数据扩充来创建图像的变体。在此之后,我们可以通过排除顶层来自由地在 VGG-16 架构之上创建我们的定制模型。接下来是编译、训练,并相应地用必要的回调来调整模型。最后,我们将得出一个最终模型,它可以加载模型的权重,并执行基于人脸识别的智能人脸锁定。

注: 在本文中,我只用一个火车目录就执行了整个任务。您可以自由地将程序分成训练和验证目录。我还对一个训练和验证目录执行了同样的操作,我将在最后包括一个图表。

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

来源:丹尼尔·科尔派在 unsplash 上拍摄的照片

图像集合:

在这一步中,我们将编写一个简单的 python 代码,通过单击空格键按钮来收集图像。我们可以单击“q”按钮退出图形窗口。图像收集是一个重要的步骤,我们将只为您希望授权访问您的选择性设备的人收集图像。让我们看看我们将用来执行以下操作的代码。

我们正在导入所需的库,并在上面的代码块中相应地初始化变量。

导入用于计算机视觉和捕获图像的 opencv 模块。

导入 os 模块访问本地系统。

我们将“打开”我们的默认网络摄像头,然后继续捕捉数据集所需的面部图像。这是通过 VideoCapture 命令完成的。然后,我们将创建一个特定目录的路径,并将 count 初始化为 0。这个计数变量将用于标记我们的图像,从 0 到我们点击的照片总数。

注意: 我已经创建了我的文件夹,如果你想通过程序直接创建你的目录你可以使用 os.mkdir 命令或者以通常的方式创建一个文件夹。创建另一个文件夹也很重要,该文件夹可以包含不被授予访问权限的其他图像。

最后,我们可以看看执行图像收集的整个过程所需的代码。

我们确保代码仅在摄像头被捕获并激活时运行。然后,我们将捕获视频并返回帧。然后,我们将分配变量“key”来执行按钮按下命令。这个按键给了我们两个选择。为此,我们将参考 ASCII 表—

点击此处查阅特定等待键的 ASCII 表。现在让我们来看看图像捕捉功能的两个选项。

  1. 当我们按下键盘上的空格键时,单击一张图片。
  2. 按下“q”时退出程序

在我们退出程序后,我们将从我们的网络摄像头释放视频捕捉,并破坏 cv2 图形窗口。

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

来源:多梅尼科·洛亚在 unsplash 上拍摄的照片

调整图像大小:

在下一个代码块中,我们将相应地调整图像的大小。我们希望将我们收集的图像重新调整为适合通过 VGG-16 架构的大小,该架构预先训练了 imagenet 权重。让我们看看执行这个任务的代码。

导入用于计算机视觉和捕获图像的 opencv 模块。

导入 os 模块访问本地系统。

我们正在将我们捕获的所有图像从默认帧大小重新缩放到(224,224)像素,因为如果我们想尝试像 VGG-16 这样的迁移学习模型,这是最好的。我们已经捕获了 RGB 格式的图像。因此,我们已经有 3 个通道,我们不需要指定。VGG-16 所需的信道数量是 3,并且该架构的理想形状是(224,224,3)。

调整大小步骤完成后,我们可以将所有者的目录转移到 images 文件夹中。

注意: 如果您试图创建单独的训练和验证数据集,那么以 80:20 的格式分割图像,并将其相应地放置在各自的目录中。

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

来源:赫克托·J·里瓦斯在 unsplash 上拍摄的照片

图像数据增强:

我们收集并重塑了我们的形象。下一步是对数据集执行图像数据扩充,以复制副本并增加数据集的大小。我们可以用下面的代码块做到这一点。

ImageDataGenerator 用于图像的数据扩充。
我们将复制和制作
原始图像转换的副本。Keras 数据生成器将使用副本和
而不是原件。这对每个时期的训练都很有用。

我们将重新缩放图像,并更新所有参数,以适应我们的模型。参数如下:
1。重新缩放 =按 1 重新缩放。/255 来归一化每个像素值
2。旋转 _ 范围 =指定旋转的随机范围
3。 shear_range =指定逆时针范围内每个角度的强度。
4。 zoom_range =指定缩放范围。
5。 width_shift_range =指定扩展的宽度。
6。高度 _ 移位 _ 范围 =指定延伸的高度。
7。水平 _ 翻转 =水平翻转图像。
8。 fill_mode =根据最近的边界填充。

train _ data gen . flow _ from _ directory 获取到一个目录的路径,并生成批量的扩充数据。可调用属性如下:
1。 train dir =指定我们存储图像数据的目录。
2。 color_mode =我们需要指定图像分类方式的重要功能,即灰度或 RGB 格式。默认值为 RGB。
3。 target_size =图像的尺寸。
4。 batch_size =流程操作的数据批次数。
5。 class_mode =确定返回的标签数组的类型。
“分类”将是 2D 一键式编码标签。
6。无序播放 =无序播放:是否无序播放数据(默认值:True)
如果设置为 False,则按字母数字顺序对数据进行排序。

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

来源:Alex Iby 在 unsplash 上的照片

构建模型:

在下一个代码块中,我们在变量 VGG16_MODEL 中导入 VGG-16 模型,并确保我们输入的模型没有顶层。
使用没有顶层的 VGG-16 架构,我们现在可以添加自定义层。为了避免训练 VGG-16 层,我们给出下面的命令:

我们还将打印出这些层,并确保它们的训练设置为假。

现在让我们继续在 VGG-16 架构之上构建我们的定制模型。这将类似于我的另一篇文章中的手指手势模型,你可以在这里查看。

我们正在构建的人脸识别模型,将使用
迁移学习进行训练。我们将使用没有顶层的 VGG-16 模型。
我们将在 VGG-16 模型
的顶层添加自定义层,然后我们将使用这个转移学习模型来预测它是否是授权所有者的脸。
定制层由输入层组成,基本上是 VGG-16 模型的
输出。我们添加一个具有 32 个滤波器的卷积层,
内核大小为(3,3),默认步长为(1,1),我们使用激活
作为 relu,he_normal 作为初始化器。
我们将使用池层从
卷积层向下采样。
在样品通过展平
层后,两个完全连接的层作为 relu 激活使用,即
密集结构。
输出层具有 num_classes 为 2 的 softmax 激活,其
预测 num_classes 的概率,即授权所有者或额外参与者或被拒绝的面部。
最终模型将输入作为 VGG-16 模型
的起点,输出作为最终输出层。

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

来源:照片由 Pavan Trikutam 在 unsplash 上拍摄

回访:

在下一个代码块中,我们将查看人脸识别任务所需的回调。

我们将导入培训我们的模型所需的 3 个回调。3 个重要的回调是 ModelCheckpoint、ReduceLROnPlateau 和 Tensorboard。让我们看看每个回调函数执行什么任务。

  1. ModelCheckpoint —这个回调用于存储我们的模型在训练后的权重。通过指定 save_best_only=True,我们只保存模型的最佳权重。我们将使用准确性指标来监控我们的培训。
  2. ReduceLROnPlateau —这个回调用于在指定的次数后降低优化器的学习率。这里,我们将耐心指定为 10。如果准确度在 10 个时期后没有提高,那么我们的学习率相应地降低 0.2 倍。这里用于监控的指标也是准确性。
  3. tensor board—tensor board 回调用于绘制图形的可视化,即绘制精度和损耗的图形。

编译并拟合模型:

我们正在最后一步编译和装配我们的模型。这里,我们正在训练模型并将最佳权重保存到 face_rec.h5,这样我们就不必重复地重新训练模型,并且可以在需要时使用我们保存的模型。这里我只根据训练数据进行了训练。但是,您可以选择同时使用训练数据和验证数据进行训练。我们使用的损失是 categorical _ crossentropy,它计算标签和预测之间的交叉熵损失。我们将使用的优化器是 Adam,学习率为 0.001,我们将根据指标准确性编译我们的模型。我们将在增强的训练图像上拟合数据。在拟合步骤之后,这些是我们能够实现的关于列车损失和准确性的结果。

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

图表:

列车数据图表—

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

训练和验证数据图表—

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

观察:

我们能够开发基于迁移学习的 VGG-16 人脸架构,这给了我们极高的准确性和非常低的损失。总的来说,我们开发的模型非常有效,效果非常好。在这些图的帮助下,我们可以观察到只有训练图,以及具有训练和验证图的图表现良好。

这就结束了我们的人脸识别模型。如果您想自己运行和测试模型,那么 GitHub 存储库中会提供代码。你可以在这里查看整个代码的链接以及加载重量和最终运行模型的代码。这将需要一个额外的 Haar cascode _ frontal face _ default . XML 文件,用于检测人脸。甚至这个也会在 GitHub 链接中提供。我希望你们都喜欢阅读这篇文章。这是虚拟助理项目的第一部分。请继续关注虚拟助手项目即将到来的部分,我祝大家有美好的一天!

使用 TPU 和塔罗斯对任何深度学习模型进行智能超参数优化

原文:https://towardsdatascience.com/smart-hyperparameter-optimization-of-any-deep-learning-model-using-tpu-and-talos-9eb48d09d637?source=collection_archive---------22-----------------------

Keras API + Colab 张量处理单元+ Talos

什么是 TPU?

张量处理单元(tensor processing unit,TPU)是谷歌专门为神经网络机器学习开发的 AI 加速器专用集成电路(application-specific integrated circuit,ASIC)。TPU 专门针对执行快速、庞大的矩阵乘法进行了优化。谷歌称,TPUs 比 GPU 和 CPU 快 15 到 30 倍- 来源

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

来源-OpenGenus

Colab 中 TPU 环境的准备:

Google Colab**,**中创建一个新的 Python 笔记本,确保将运行时更改为 TPU,您将分配到大约 12.72 GB RAM,然后您可以通过运行以下命令将内存分配增加到大约 35.35 GB RAM。

d=[]
while(1):
  d.append('1')

上面的命令试图扩展(由于‘append’命令)RAM,并在此过程中崩溃。在上次内存分配崩溃后,点击“获取更多内存”。想要更多这样的建议,请随意参考我之前的博客。

TPU +塔罗斯管道:

我正在考虑 Kaggle IEEE-CIS 欺诈检测竞赛,我现在将使用 TPU 在 colab 中一步一步地分解超参数优化深度学习管道的快速方法。

1–3.建模数据的准备:

我已经使用了我之前的博客中类似的前三个步骤,在 Google Colab 的帮助下自动化 Kaggle 竞赛,即:

  1. 从 API 调用下载数据集。
  2. 预处理和数据争论。
  3. 特征工程和特征选择。

4。数据缩放:

除此之外,我们还将对数据进行缩放,以将数据集中数值列的值更改为通用的比例。由于特征具有不同的范围,因此在输入到深度神经网络之前缩放数据是非常重要的。

5。TPU 初始化:

为了有效地使用 TPU,并使用由 TPU 实验室提供的所有工人和核心,我们需要通过使用以下代码来初始化 TPU 系统,以初始化 TPU 策略对象,该对象将在模型构建中进一步使用。

6。模型构建:

要做 Talos 超参数优化,首先需要初始化一个深度学习模型。我用过 Keras,因为它使用高级 API 和 tensorflow 作为后端。我将使用 Keras 序列模型的两个隐藏层和输出层与 sigmoid 作为激活函数。

7。参数网格:

选择的参数网格可以取决于各种因素,如数据、建模时间等。我为超参数优化考虑了以下网格。

8。距骨超参数扫描:

然后,我们根据在参数网格中初始化的度量和损耗,沿着参数网格扫描。我们使用以下代码扫描参数网格,其中:

我们使用 ieee_fraud_model 作为要扫描的模型,我们已经用 strategy.scope()初始化了该模型,其中它使用所有 TPU 工作器来构建该模型。这将模型的构建速度提高了 15-20 倍。

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

Talos 扫描实时绘图进度

如果你感兴趣的话,我还包括了没有 TPU 的 Talos 的代码,或者如果我的 colab 笔记本中没有 TPU 的话。

9。预测:

然后,从扫描的所有模型中,我们根据度量标准(在本例中为“binary_accuracy ”)选择最佳模型,使用下面的代码对提交文件进行预测。

10。保存并恢复提交文件的模型:

此外,您还可以根据指标将模型部署为 zip 文件,您可以在其中恢复预测模型,并通过使用这些预测来创建提交文件。

请从这个 colab 查看详细的 Kaggle 管道,我在提交文件上得到了大约 0.91 的分数。我们可以进一步使用其他 Keras 自动编码器,添加层和增加网格或任何其他 Keras DNN 定义的模型建设。

结论:

构建深度神经网络是一个耗时的过程。此外,对于这样的大数据集(约 600,000 个观察值和 394 个特征),定义的神经网络的超参数调整甚至可能需要几天时间。充分利用张量处理单元,我们可以极大地减少建立任何深度学习模型的时间,并获得更好的结果。

参考资料:

更安全城市的智能警务:数据驱动的方法

原文:https://towardsdatascience.com/smart-policing-for-safer-cities-a-data-driven-approach-ed84e801526f?source=collection_archive---------40-----------------------

我们利用现有犯罪数据得出的宝贵见解和解决方案

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

LinkedIn 上与我联系!

供稿人: 邓金养
李俊浩,卢卡斯
罗克勇林
冯传斌
波依梦寒伊恩
唐宗伟,狄龙

如果您希望查看本报告的简明幻灯片,请前往https://medium . com/@ phoechuanbin/smart-policing-for-safer-cities-a-data-driven-approach-slides-633244 f 052 e 6

1.行动纲要

贫困和犯罪真的密切相关吗?

作为美国最富裕的城市地区(Kopf & Varathan,2017),旧金山的人均国内生产总值为 89,978 美元,这一惊人的数字甚至会让发达国家相形见绌。

旧金山警察局(SFPD)的年度预算超过 123 亿美元,拥有 2108 名警力,负责管理 883,305 名居住在 121.4 公里土地上的居民。有了这样一个资金充足、人员配备良好的警察局,人们会认为旧金山是世界上最安全的城市之一。

但是,旧金山的总体犯罪率比全国平均水平高 141%,比美国 96%的城市都危险,这使它真正成为工作和生活最危险的地方之一。

近年来,招募更多警察的声音越来越大(Kreutz,2019)。这是一个令人困惑的现象,因为无论从哪方面来看,SFPD 的警力都是绰绰有余的,每 419 名居民就有一名警察,相比之下,新加坡是 614 名。

在我们的项目中,我们试图通过研究和引入由分析和预测技术驱动的最佳实践,找出潜在的问题,并将 SFPD 转变为一支聪明的现代警察队伍。

我们将从使用数据可视化软件 Tableau 开始,带来关于旧金山不同地点、不同时间发生的犯罪的整体模式和趋势的新见解。

接下来,我们将使用 RStudio 和数据科学技术中的各种可用模块来构建两个预测模型:

  1. 预测未来将在旧金山发生的犯罪类型,以便 SFPD 能够做出更明智和有效的警务决策。
  2. 预测特定刑事案件的破案率(%),以便 SFPD 将合适的案件分配给合适的官员,从而最大限度地提高破案率。

最后,我们通过 Tableau 可视化来放大针对青少年的犯罪和青少年犯罪的相关问题,同时还采用时间序列预测技术来预测未来的数字。最终目标:阻止未来的青少年犯罪。

通过这一全面的分析,我们旨在提供有价值的见解,帮助 SFPD 实现最大限度地减少犯罪并为旧金山居民维护安全环境的总体目标。

2.商业问题介绍

犯罪造成伤害:它们引发恐惧和仇恨,导致社区分裂,阻碍国内外投资,制造不确定性和低效率,以及一系列社会经济问题。

然而,犯罪是现代社会的一个重要问题,政府正积极努力保持低犯罪率,以促进国家和城市的安全。具体来说,犯罪一直是旧金山的一个问题,尤其是当旧金山以关押阿卡特兹臭名昭著的罪犯而闻名时。

与其他各种规模的社区(从最小的城镇到最大的城市)相比,旧金山的犯罪率为每 1000 名居民 64 人,是美国最高的犯罪率之一。在旧金山,一个人成为暴力或财产犯罪受害者的可能性是 1/16,仅在加利福尼亚州,超过 99%的社区犯罪率较低(NeighbourhoodScout,n.d .)。此外,随着 47 号提案(Sandberg,2019 年)的实施,犯罪浪潮变得更加严重,该提案在 2014 年将拥有非法麻醉品供个人使用以及盗窃价值低于 950 美元的任何物品从重罪降级为轻罪。

在 2011 年的盖洛普民意调查中,38%的美国人表示,他们会在住所一英里范围内“害怕晚上独自行走”;这一数字相当于超过 8600 万成年人。在同一调查中,47%的人说他们担心他们的家被盗,44%的人担心他们的汽车被盗。其他犯罪的相应数字是:经历身份盗窃,67%;被抢劫,34%;开车时被袭击,19%;被性侵,22% —包括 37%的女性;20%的人被谋杀(Saylor,2012)。根据 2018 年尊严健康 CityBeat 民意调查,这种情况在旧金山更加严重,街头行为被列为当地居民最关心的问题。

犯罪的受害者可能会经历不同类型的影响,包括受伤等身体影响,愤怒和创伤后应激障碍(PTSD)等心理影响,以及支付医疗费用和休假等经济影响。一项关于犯罪影响的研究得出结论认为,当我们比较不同类型犯罪(包括非暴力和暴力犯罪)的受害者时,受害的情感影响没有太大差异(Shapland & Hall,2007 年)。这一观察表明犯罪,无论轻微或严重,对个人都有负面影响

犯罪的影响超越了个人,影响到整个社区。在旧金山,财产和低级犯罪正在加剧对零售市场的破坏。随着盗窃行为猖獗和缺乏安全保障,地标使命区商店正在关闭(Brock,2019),而夫妻店发现在不断被盗的情况下很难生存。高犯罪率和缺乏安全也导致三藩市被贴上不可行市场的标签(Phillips,2019),由于恐惧而阻止新企业设立。其他可能的影响包括房屋保险费上涨和房地产价格受到影响(英国广播公司,未注明)。

面对高犯罪率,每个个人、家庭、社区和组织都是受害者。

3.期望的业务成果

基于上述犯罪带来的问题和影响,我们的团队决定关注利益相关方,如三藩市警察局(SFPD)和地方政府能够实现的 3 个最重要的结果,即根据从过去犯罪历史分析中得出的见解采取行动。

3.1 人力分配和调度

每年,SFPD 都将很大一部分预算用于巡逻活动。2017 年至 2018 年间,巡逻活动占 SFPD 预算的 58%,达 3.392 亿美元(Campbell,2018)。从 2012 年到 2016 年,SFPD 的警察服务需求增加了 49.3%,分别从 300,919 次增加到 449,181 次。然而,根据不同地区的时间点,日常汽车巡逻人员不足或过多,表明资源没有得到最佳利用。

在旧金山监事会委托进行的一项研究中,发现某些地区对服务呼叫的响应时间“特别长”。在 Mission 和 Southern 等地区,平均响应时间超过两个小时:在 Mission 地区,打电话者报告车辆中有可疑人员可能要等 179 分钟(Barba,2020 年),相比之下,如果打电话者在 Richmond 地区,平均等待时间为 30 分钟。

我们相信,通过了解事件在整个旧金山的分布,可以更有效地分配人力——无论是在警察局内部还是在警察局之间——以加强行动。为了实现这一点,我们决定重点关注地理 犯罪地点犯罪时间分布。

3.1.1 犯罪地点

SFPD 在三藩市内有 10 个区,每个区由外勤业务局分配的人力为餐饮区提供治安服务。根据旧金山预算和立法分析师编制的绩效审计报告(Campbell,2018 年),SFPD 目前分配警察的做法(附录 1)——如跟踪呼叫量——并不能完全反映实际工作量,因为它没有考虑各单位响应呼叫所花费的时间。

目前,这些地区面临着服务呼叫响应时间长的问题,这可能是由于不同地区的复杂犯罪发生率较高,或者需要行驶的距离较长。通过了解每个地区应对的犯罪的位置分布,确定新的见解可能会提高人力分配的效率。

3.1.2 不同犯罪的时间分布

SFPD 目前对分配到警区的巡逻警察实行 10 小时轮班和 49 天轮换制。然而,这种轮班时间表在一个警区内任何一天实际可轮班的警官总数上造成了很大的差异。某个班次的巡逻车人员可能会超编,但另一个班次的巡逻车人员可能会不足(附录 2)。不同地区的同一班次内的人员配备也可能有所不同(附录 3)。如果我们能够确定哪一个班次以及一周中的哪一天由于犯罪率较高而通常需要更多的人员,就可以实现更有效的人员配置。

各种类型的犯罪意味着犯罪人不同的心理状态,因此,他们在一天中的发生率也有不同的变化(匡,2011)。激情犯罪和机会犯罪通常有不同的发生时间框架——激情犯罪通常可以发生在一整天,而机会犯罪发生在被抓住的可能性较低的特定时间。了解不同犯罪的不同时间发生将允许 SFPD 知道哪个班次分配更多的警察以打击更严重的犯罪。

3.2 预防性巡逻和犯罪分配

预防性巡逻

警察巡逻包括主动/预防性巡逻和反应性巡逻,两者具有非常不同的特点。预防性巡逻旨在增加预期犯罪地区的警力,以起到威慑作用。如前所述,旧金山最受关注的是街头活动。这种活动通常在公共场所进行,如果警察在正确的时间出现在正确的地点,很容易被发现,从而很容易被阻止。

目前,预防性巡逻路线是先验确定的,基于理论街道网络使用率(中心性测量)和历史犯罪数据(Wu & Lum,2017)。然而,这种方法未能考虑以下因素:

  1. 旧金山的不同地区可能有不同的“高峰时间”,那里最有可能发生犯罪活动。因此,巡逻不同区域的最佳顺序是什么?
  2. 旧金山可能同时发生多起犯罪行为。由于人力有限,SFPD 不可能在任何时候出现在任何地方。在这种情况下,SFPD 应该关注哪些领域?
  3. 随着时间的推移,每个地区的历史犯罪数据在数量和种类上都只会增长。因此,巡逻人员在执行任务时应该注意什么?

我们希望通过分析,我们可以帮助 SFPD 回答这三个问题。这将允许他们计划更有效的预防性巡逻路线

犯罪分配

犯罪筛查通常由犯罪经理或同等的决策者处理(英国交通警察,2017)。他们根据由评分系统确定的优先级来分配案例。许多警察部门进行的研究表明,基于可解决性的评分系统成功地筛选出解决概率低的案件,并确定有希望的案件(Dempsey & Forst,2017)。

我们希望使用分析,我们可以提供额外的输入,以提高 SFPD 当前评分系统的可解决性。这使得他们能够最大限度地利用调查人员的时间和精力,从而提高破案率

3.3 青少年保护

作为社会最弱势的阶层之一,青少年的福利需要特别关注。人们常说,儿童是社会的基石,他们的成长将决定国家的未来。注意到这一点,我们已经确定了与针对青少年的犯罪和青少年实施的犯罪相关的一些重要成果。

3.3.1 青少年受害者

针对未成年人的犯罪通常会受到重罚,而且理由充分。除了造成明显的身体和心理伤害,这种犯罪往往导致受害者大脑和神经系统的发育受损,形成不健康、高风险行为的比率更高,以及未来成为罪犯的风险更高(世卫组织,2019)。

联合国进行的一项研究得出结论认为,对儿童的身体、心理和性暴力每年造成的经济影响(如医疗、咨询和丧失生产力)最低可达 1,240 亿美元,最高可达 5,850 亿美元(Pais,2015 年)。这是一笔不可低估的巨款,因此一个关键目标应该是尽可能降低此类犯罪的发生率,以便最大限度地减少对旧金山市造成的负面社会和经济成本。

3.3.2 少年犯罪人

让刑满释放人员重返社会一直是每个国家面临的一个紧迫问题。当他们被释放时,他们面临许多挑战,这些挑战严重阻碍他们成为社会中有生产力的成员,包括社会歧视、无法找到合适的工作、无法跟上技术的变化等等。没有能力回到正常的生活方式,他们因此被迫重新犯罪来养活自己。鉴于青少年罪犯很可能会错过学校和正常的童年,这个问题对他们来说更加严重。研究表明,儿童首次犯罪的年龄越小,累犯率越高(量刑咨询委员会,2016 年)。在这种情况下,威慑是减少青少年犯罪最有效的方法。

虽然青少年为犯罪付出了监禁的代价,但纳税人也承担了一些负担。关押一名少年的费用高达每人每天 407.58 美元,每年 148,767 美元(Sneed,2014 年)。这是一笔很大的支出,肯定可以通过降低犯罪率来减少,这样国家就可以将节省下来的成本投入到更有生产力的领域

4.资料组

主要数据集从旧金山市和县网站获得,包含警察局事件报告(旧金山市和县,2020 年),时间跨度为 2003 年 1 月至 2018 年 5 月。有 13 列,超过221 万条记录:

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

有了 15 年的犯罪分类数据,就可以进行全面分析,了解影响犯罪率的因素和变量。有了这些认识,我们将能够向相关利益攸关方建议适当的措施,以便他们能够遏制和阻止未来的犯罪。低犯罪率将确保居民的安全,这将有助于旧金山市的社会稳定。

5.分析解决方案

5.1 人力分配和调度

我们将利用可视化技术提供简单明了的工具,SFPD 可以轻松地在日常运营中采用这些工具,并且只需一个平缓的学习曲线。这些可视化仪表板可以反映实时数据,并根据 SFPD 的需求进行调整,以便更好地理解。

5.1.1 地理分布

为了了解不同地区的一般人力需求,绘制了旧金山的基本犯罪密度图(图 1 ),犯罪率最高的地区显而易见——即北部、南部和中部地区。这些可能表明对警察人力的更大需求。

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

为了更深入地了解人力使用情况,我们生成了每个地区所应对的犯罪地点的可视化图(图 2 )。从视觉上,我们可以清楚地区案件的区别;注意到多个例外情况,即各区应对本区以外的案件——这可能表明本区人力资源未得到最佳利用,或者相应区缺乏人力资源,需要其他区的援助。

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

例如,我们可以看到湾景区(图 2 )处理了来自旧金山几乎所有其他区的案件,尤其是在北区、南区和中区的犯罪高发区。由此看来,上述各区可能缺乏必要的人力来处理更高和更普遍的犯罪事件。这也可能导致湾景区人员过剩,将多余的人力重新分配给人员不足的人可能更有利于优化资源。

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

可视化技术将提供每个区的犯罪事件和类别的简单可视化(图 3),允许在每个区内方便地分配人力,以更好地利用其人力,并更有效地处理每类犯罪。

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

尽管如此,SFPD 应对的各类犯罪事件都可以根据处理这些事件的地区进行可视化处理(图 4),这为 SFPD 现场行动局提供了犯罪情况的概览,以便其更有效地在各地区分配相关人力。

例如,袭击、抢劫和强迫性犯罪等暴力犯罪可能是影响最大的犯罪,应努力遏制这些犯罪事件。这有助于密切监测这些"危险信号"犯罪事件,以及处理这些问题的必要应对措施和应对者,如辅导员。

时间分布

为了更好地帮助我们的分析,我们按照时间范围对时间进行了分类,而不是报告的犯罪的实际时间。这有助于我们限制分析的因素数量。此外,这也符合 SFPD 目前采用的五个巡逻人员配置表,即巡逻人员每 10 小时轮班一次。

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

首先,通过五个时间段内犯罪数量的基本可视化(图 5 ),我们可以看到全天犯罪数量的变化。凌晨 1 点的班次犯罪率最低,而下午 4 点的班次犯罪率最高。随着犯罪在上午 11 点开始达到高峰,SFPD 可以为上午 11 点分配更多的人员,以便犯罪率最高的两个时间段(上午 11 点至下午 4 点和下午 4 点至晚上 9 点)可以配备足够的人员。

随后,我们进一步分析并查看了更多有助于人员配置的因素:

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

查看不同警察局不同时间段的犯罪率,可以发现下午 4 点到晚上 9 点的时间段犯罪率最高,这与之前得出的结果一致。

在所有警察部门中,南部警察部门的犯罪率最高。因此,SFPD 必须确保南方警察局有足够的人员来打击犯罪。SFPD 可以考虑将犯罪率较低的地区(如帕克和里士满)的警官重新分配到犯罪率较高的地区,以便更好地利用资源。

接下来,我们观察了一周中不同日子的犯罪率分布情况(图 7)。我们可以观察到,在一周的不同日子里,报告的刑事案件没有显著差异。报告病例略高的两天是周三和周五。

由于各天之间不存在差异,SFPD 应确保任何一天都不会出现警员分配不足的情况。如果在这一周的其他几天出现人员过剩的情况,SFPD 可以考虑在这两天安排人员轮班,以便最大限度地利用人力。

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

最后,我们通过查看不同时间段内严重犯罪的分布情况来进一步分析数据(图 8)。自 1994 年以来,加利福尼亚州一直实行三振出局法判刑制度(加利福尼亚州法院,未注明日期)。“三振出局法”要求被判犯有任何新的重罪的被告,在之前被判犯有严重重罪的情况下,将被判处两倍于该罪行的刑期。为了有助于我们的分析,我们将构成(Sigal,2011 年)的犯罪归类为严重犯罪的三击判刑制度下的罢工。

根据调查结果,袭击、毒品和车辆盗窃是旧金山最普遍的严重犯罪。每一类事件的趋势也遵循早先观察到的一般趋势,即犯罪率从上午 11 点开始达到高峰,在凌晨 1 点以后逐渐下降。

SFPD 可以确保在上午 11 点、下午 4 点和晚上 9 点的班次中,有足够的称职人员来处理这些案件。研究表明,周围有更多的警察有助于降低犯罪率(Klick & Tabarrok,2005 年)。通过在更严重犯罪的轮班期间派驻更多的警察,潜在的罪犯会因为害怕被抓住而不敢犯罪。

5.2 预防性巡逻和犯罪分配

5.2.1 预测巡逻,更智能的巡逻

世界各地的警察部门越来越依赖 PredPol 这样的软件,它使用机器学习算法来预测“热点”犯罪街区——在犯罪发生之前(Huet,2015)。PredPol 为警察部门提供了快速、廉价地从大量数据中收集洞察力的能力。这些见解可用于优化警官巡逻路线。

当警察部队的人力有限时,像 PredPol 这样的工具可以快速做出关于何时何地分配人力的数据知情建议,从而带来警务效率的阶跃变化(Amina,2018)。

在我们项目的这一部分,我们已经开始预测在任何给定的时间,任何给定的一天,在旧金山不同的社区可能发生的蓝领犯罪的类型。这种见解将有助于 SFPD 优化他们的巡逻决策,并在此过程中,将他们从犯罪的“反应者”转变为犯罪的“预防者”。

我们之所以选择预测蓝领犯罪,是因为这些犯罪往往是可以直接观察到的,因此可以通过警察巡逻来最有效地阻止。相比之下,像挪用公款这样的白领犯罪更难通过巡逻发现,也更难阻止。

我们选择的预测技术是 XGBoost,这是一个梯度提升分类器,具有内置的早期停止功能。与随机森林相比,XGBoost 还构建了一个分类树集合,但是是以一种顺序的方式,其中新的树是使用以前的树表现不佳的数据来训练的。

通过内置的早期停止,我们使用 trainset 和 testset 实现了一个监视列表。随着培训的开始,评估指标 trainset mlogloss 将随着时间的推移而降低。但是,一旦这个指标开始向上攀升,这是一个过度拟合的指标,我们将结束训练,并采用具有最低训练集 mlogloss 的模型。

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

我们使用了 6 个预测变量:星期几、警区、月份、月份中的某一天、一天中的某一小时和地区 id。请注意,原始数据集中没有区域 id。当我们决定将旧金山绘制成一个由 100 个地区组成的 10 X 10 的网格时,就获得了这个地图。这一制图决定是因为研究表明,犯罪往往在地理上集中,但这些“热点”往往分散在整个城市中(Weisburd,2018)。由于旧金山是 121.4 平方公里,每个地区将是大约 1.21 平方公里,一个合理的巡逻区。

我们的预测变量是犯罪类别。这是一个因素变量,包括 13 种蓝领犯罪,如殴打、纵火和抢劫。

我们的最终模型是 1053 个分类树的集合(81 次迭代* 13 个类别),训练集 mlogloss 为 1.527106。为了衡量模型的有效性,我们让模型预测每行测试数据中最有可能发生的前 3 种犯罪,然后将输出与实际发生的犯罪类别进行比较。79.44%的时候,预测列表包含实际犯罪类别。

对于 SFPD 来说,这意味着能够预测旧金山不同地区可能发生的犯罪类型。有了这些信息,他们可以更好地决定在何时何地部署他们的人力,从而最有效地阻止蓝领犯罪。例如,如果明天下午 2 点区域 55 的前 3 个最可能的犯罪都是严重犯罪,那么 SFPD 可以预先安排在明天的那个时间在该区域巡逻。

对于警察来说,这意味着压力更小,工作效率更高。对警察来说,巡逻可能是一项体力和脑力都很紧张的活动,因为它需要长时间的注意力和警觉性。使用我们的模型,警察可以放心地进行巡逻,准确地知道要准备和防范的犯罪类型。

为了更好地理解预测变量如何影响我们的模型,我们利用 xgb.plot.importance 函数来绘制前 5 个最重要的变量(图 10):

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

我们注意到区域,一个更细化的地区,是如何被列为最重要的。

此外,通过进一步的研究,我们发现在我们的情节中第二个最重要的变量,区 Tenderloin,被 StreetAdvisor 称为“SF 中最危险的地方”,街道犯罪猖獗。在 SFPD 自己做的一项研究中,在三藩市暴力犯罪的十大统计区域中,有七个在田德隆区。

这些发现证实了我们之前关于犯罪如何在地理上集中的研究。此外,月、日和小时在这里被证明是重要的,这意味着不同类型的犯罪往往发生在不同的时间,这进一步证明了我们的模型的实用性和有效性。

5.2.2 预测犯罪分配的解决方案

根据一篇被广泛引用的论文(Gill et al .,1996),犯罪分配涉及犯罪投诉“职业生涯”中的两个主要决策点(图 11)。

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

使用我们的数据集,我们可以根据犯罪报告的不同细节预测其解决概率。这使我们能够采用统计观点来衡量其可解决性,并且可以成为“来自其他系统的输入”因素的一部分,这有助于影响对犯罪报告的评估,从而影响案件的分配。

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

快速浏览显示分辨率栏的许多级别及其计数(图 12 )。我们认为,对于犯罪评估,更重要的是知道它是否可解,而不是它的具体解决方案。因此,我们将该列预处理为二项式可解/不可解(图 12 )。

由于这是一个二项式分类问题,我们决定继续使用以下模型来获得这些准确度分数。

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

(附录 4)

我们对 CART 使用了自动 10 倍交叉验证,对其他模型使用了 75/25 的训练测试分割。我们通过输入所有预测变量来创建 CART 和 XGBoost 模型,因为它们具有内置的特征选择算法。不幸的是,对于逻辑回归,我们必须手动进行。我们的第一个逻辑回归模型,考虑了所有的预测变量,具有 47.3%的低测试集准确性。

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

为了提高准确性,我们研究了逻辑回归 1 中的显著变量和 CART 中的变量重要性特征。两个模型都表明描述、类别和地区是重要的变量。这是有意义的,因为不同类型的案件和警察局辖区可能有不同的解决率(附录 5)。

我们继续训练逻辑回归 2 模型,并获得了 84.5%的较高测试集精度。总的来说,我们的模型具有大约 85%的平均测试集预测精度,这表明这些模型是可行的。

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

使用这三个分类模型,我们能够获得一个案例可解的预测概率。由此,我们可以根据可解性对这些案例进行排序,这可以作为“来自其他系统的输入”。SFPD 可以利用这一点来简化他们对案件的评估和分配——破案率较高的案件可以分配给初级侦探,而破案率较低的案件则分配给更有经验的警官。这可以帮助在利用劳动力方面产生效力,从而提高案件解决率

我们列出了 SFPD 根据他们的目标可以考虑的三种可能性:

  1. 使用 3 个概率的平均值;为了得到一个相等加权的聚合概率
  2. 选择特定模型的概率;如果对某些型号有保留
  3. 获得模型叠加后的概率;为了得到更高精度的概率

我们模型的一个关键限制是假设所提供的数据是准确的。该研究论文称,犯罪报告“的价值可能会因其糟糕的写作质量而受损”,即使它们“是根据特定标准编写的”。

总之,我们希望通过预测犯罪的可解决性并获得相应的概率,我们将通过为这一过程提供新的输入来帮助更好地进行犯罪分配的决策过程。我们不打算改变 SFPD 的案件分配政策。

5.3 青少年保护

我们从数据集中子集化并提取了两个相关部分,一个包含青少年受害者的所有实例,另一个包含青少年犯罪者的所有实例。这是通过筛选出描述中包含“少年”和“儿童”的所有案例来完成的,然后将它们分配到正确的数据表中进行分析。

趋势的可视化

Tableau 上两个数据集的快速可视化显示了一些重要趋势:

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

自 2008 年以来,侵害青少年的案件呈惊人的上升趋势(图 14),这些案件大多被描述为"虐待儿童"。这告诉我们,此类案件中的大多数罪犯是未能适当照顾其子女的父母,必须做更多的工作来确保旧金山家庭的安全。

对青少年的性犯罪占青少年受害者案件的第二大百分比,并且在稳步上升。虽然绑架和可疑活动的发生率通常在年均 70 起和 45 起左右波动,但涉及“遗弃/遗弃儿童”和“未能抚养儿童”等描述的家庭犯罪已经稳步下降。

可以参考以前为减少家庭犯罪所做的努力,因为事实证明,无论是通过对父母的教育还是电视宣传,这些努力都成功地减少了此类案件的数量。这些措施可以单独实施,以应对不断增加的袭击案件,从而减少每年的发生率。

青少年犯罪者所犯罪行正以天文数字的速度增长(图 16)。由于数据集的限制,我们无法确定“二级代码”类别下的犯罪类型。有了更详细的数据,警察局应该能够确定这类犯罪迅速增加的根本原因。

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

更详细地研究少年犯罪者犯罪的情况(图 17),可以发现一种独特的模式:案件数量在年中和年底急剧下降。这可能要归功于美国学生的寒暑假,他们有 9-10 周的假期离开学校(Karnes,2019)。

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

如果旷课真的是犯罪数量减少的原因,那么在学校的教育能力范围内还需要做更多的工作,从而阻止青少年犯罪。

5.3.2 预测未来犯罪数量

进行了时间序列预测,以预测涉及少年受害者和少年犯罪者的犯罪案件数量。这种逐月预测将使利益相关者为季节性趋势导致的病例激增做好更充分的准备。进行了一次训练测试分离,以便 2003 年至 2016 年的所有数据组成训练集,并将用于预测 2017 年的犯罪数量。2017 年的案例被用作测试集,2018 年的数据因不完整而被遗漏。

forecastHybrid 包通过使用基于样本内误差的权重,将 auto.arima()、ets()、thetaf()、nnetar()、stlm()、tbats()和 snaive()组合在一起,用于创建最适合任何数据集的模型(Shaub & Ellis,2020)。

第一个模型(图 18)针对数据集中的所有案例,没有子集。

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

蓝色突出显示的部分是预测值,测试集 RMSE 为 479,仅占 2017 年平均案例数(12,898)的 3.7%。

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

第二个模型(图 19)是为青少年受害者设计的。测试集 RMSE 为 9.5,2017 年此类案件的平均数为 55.3。

第三个也是最后一个模型(图 20)是为青少年犯罪者设计的。测试集 RMSE 为 14.2,2017 年此类案件的平均数为 52.4。

有了这些每月滚动预测模型,通过可视化更好地了解青少年涉及的犯罪类型,三藩市警察局可以更好地为案件做准备。由于大多数青少年犯罪案件发生在学期中,学校可以更好地处理这些犯罪,同时也加强他们的犯罪预防教学大纲,以教育年轻人作为一种威慑。这些措施的有效性可以通过每年年底国家必须承担的总成本来评估,这表明了分析在帮助解决这些问题方面的有效性。

6.未来的改进和实现

6.1 不断变化的犯罪模式

我们知道,我们当前的数据集仅涵盖截至 2018 年 5 月的犯罪。由于犯罪模式会随着时间的推移而变化,因此需要对我们的模型进行再培训,以保持其相关性。一个可能的解决方案是实现一个递归神经网络来考虑时间变化。此外,通过将新的数据集重新上传到 Tableau,我们可以很容易地在仪表板上可视化这些犯罪。

6.2 在预测犯罪时考虑其他变量

除了数据集中可用的因素,可能还有其他变量可以帮助预测犯罪。在我们最初的探索中,我们对犯罪发生的地址进行文本挖掘,寻找“块”的存在。因此,犯罪是否发生在一个街区可能是我们可以输入到模型中的另一个变量。另一个因素可能是天气(Glorfeld,2018)。在芝加哥进行的一项研究表明,当天气比平均温度高时,恶性袭击和殴打案件会增加。根据我们对数据的初步探索(附录 6),Block 对犯罪类别的预测有重大影响。考虑更多的变量将使我们的模型更加全面。这将使 SFPD 获得信息,从而更有效地预防和解决犯罪。

6.3 可能的道德问题

所提出的解决方案可能导致基于预测模型的相应输出/结果,某些类别的优先级高于其他类别。这可能会对警察部门应如何处理其案件提出道德关切,因为没有一个基准可以确定一个事件优先于另一个事件,对于暴力犯罪尤其如此。鉴于警察是宣誓保护人民的公务员,他们的道德行为将极大地影响公众信任,这是一个最令人关切的问题(Fitch,2011)。一个可能的解决方案是建立一个协议,明确划分一个案件被认为比另一个案件更“重要”的场景,这样警察就有一套规则来遵守既定的优先事项——超出模型的预测。

7.结论

在我们的项目中,我们致力于优化人力调度、通过主动巡逻预防犯罪以及调查职责的分配。此外,我们还特别关注社会最弱势群体之一的青少年,确定了在预防青少年犯罪方面要取得的重要成果。

历史、财富和气派,旧金山是一个真正的世界级城市。我们相信,凭借我们的情景化洞察力和预测模型,我们可以将 SFPD 转变为世界领先的警队,并将三藩市变成一个安全、愉快的地方,供所有居民生活、工作和娱乐!

8.参考

科普夫博士和瓦拉坦博士(2017 年 9 月 15 日)。官方消息:旧金山是美国最富裕的城区。从 Quartz 检索:https://qz . com/1077050/San-Francisco-is-Americas-rich-major-metropolitan-area-rising-above-Washington-DC-in-the-latest-rankings/

AreaVibes。(未注明)。加州三藩市犯罪。从 AreaVibes 检索:https://www.areavibes.com/san+francisco-ca/crime/

Kreutz,L. (2019 年 7 月 12 日)。根据数字:旧金山有多少警察?检索自 ABC 7 news:https://ABC 7 news . com/San-Francisco-police-staffing-SF-officers-recruiting/5389997/

邻里童子军。(未注明)。加州旧金山犯罪率。从邻里侦察兵那里取回:https://www.neighborhoodscout.com/ca/san-francisco/crime

桑德伯格,E. (2019 年 5 月 19 日)。旧金山的生活质量指数。检索自城市日报:https://www.city-journal.org/san-francisco-crime

塞勒。(2012).社会问题:持续与变化。塞勒学院。检索自https://saylordotorg . github . io/text _ social-problems-continuity-and-change/S11-01-the-problem-of-crime . html

j .沙普兰和 m .霍尔(2007 年)。我们对犯罪对受害者的影响了解多少?国际受害者研究评论,175–217 页。

布洛克,S. (2019 年 1 月 2 日)。SF Mission 区的标志性商店因犯罪、安全和街道状况而永久关闭。从 NBC 湾区检索:https://www . NBC bayarea . com/news/local/iconic-stores-in-SFS-mission-closing-down-for-good-citing-crime-security-street-conditions/7090/

j .菲利普斯(2019 年 11 月 18 日)。‘没人想在旧金山开餐馆’因为入室盗窃,成本。检索自旧金山纪事报:https://www . SF Chronicle . com/restaurants/article/No-one-want-to-open-a-restaurant-in-San-14842211 . PHP

BBC。(未注明)。犯罪对更广泛社会的社会和经济影响。转自 BBC:https://www.bbc.co.uk/bitesize/guides/zbhpgwx/revision/2

坎贝尔,S. (2018)。旧金山警察局的绩效审计。旧金山。

Barba,M. (2020 年 3 月 10 日)。研究发现 SFPD 巡警人手“严重不足”。检索自旧金山考官:https://www . SF Examiner . com/news/study-finds-sfpd-patrol-staffing-severely-individual/

匡,2011 年 7 月 14 日。每日信息图:罪犯什么时候在街上游荡?从 Fast Company 检索:https://www . Fast Company . com/1664491/infograph-of-the-day-when-do-crimes-prowl-the-streets

吴,徐,林,陈(2017)。测量警察主动性的空间和时间模式。定量犯罪学杂志,915–934。

英国交通警察。(2017).*强制筛选和分配犯罪,政策和程序。*检索自https://www . BTP . police . uk/pdf/FOI % 20 response % 2012 84-18% 20 screened % 20 out % 20 and % 20 other % 20 crimes % 20 attachment . pdf

邓普西,j .,&福斯特,L. (2017)。警务工作简介。成规。

世卫组织。(2019 年 6 月 7 日)。对儿童的暴力。从世界卫生组织检索:https://www . who . int/news-room/fact-sheets/detail/violence-against-children

派斯,硕士(2015 年 7 月 13 日)。暴力侵害儿童的经济成本。检索自暴力侵害儿童,联合国:https://Violence Against Children . un . org/economic _ costs _ of _ vac _ view point

量刑咨询委员会。(2016 年 12 月 15 日)。过早进入青少年司法系统的儿童更有可能再次犯罪。检索自量刑咨询委员会:https://www . Sentencing Council . vic . gov . au/news-media/media-releases/children-who-enter-youth-justice-system-early-is-more-likely-to-re offend

斯尼德,T. (2014 年 12 月 9 日)。青年监禁花费了纳税人多少钱。检索自美国新闻:https://www . US News . com/News/blogs/data-mine/2014/12/09/what-youth-insulation-costs-纳税人

旧金山市和县。(2020 年 2 月 26 日)。*警察局事件报告:历史 2003 年至 2018 年 5 月。*从数据 SF 中检索:https://Data . SF gov . org/Public-Safety/Police-Department-Incident-Reports-Historical-2003/tmnf-yvry

加州法院。(未注明)。加州三振出局量刑法。从加州法院取回:https://www.courts.ca.gov/20142.htm

西加尔,V. (2011 年 9 月 2 日)。加州罢工犯罪清单。检索自 Sigal 法律小组:https://www . la-criminal-defense . com/blog/list-of-strike-defense-in-California/

Klick 和 a . Tabarrok(2005 年)。使用恐怖警戒级别来评估警察对犯罪的影响。乔治梅森大学。

休特,E. (2015 年 2 月 11 日)。服务和保护:预测警务公司 PredPol 承诺在犯罪发生前绘制地图。检索自福布斯:https://www . Forbes . com/sites/ellenhuet/2015/02/11/pred pol-predictive-policing/# 6a 3d 89084 f9b

阿米娜 E. (2018 年 11 月 13 日)。利用机器学习进行犯罪预测。检索自数字倡议:https://Digital . HBS . edu/platform-rctom/submission/using-machine-learning-for-crime-prediction

韦斯伯德博士(2018)。犯罪热点和基于场所的预防。犯罪学&公共政策,5–25。

吉尔,m .,哈特,j .,利文斯通,k .,,史蒂文斯,J. (1996)。犯罪分配系统:警方对入室盗窃和汽车犯罪的调查。伦敦:内政部警察研究小组。

卡恩斯,B. (2019 年 8 月 2 日)。旧金山校历 2019–2020。从补丁中检索:https://Patch . com/California/San-Francisco/San-Francisco-school-calendar-2019-2020

Shaub,d .,& Ellis,P. (2020 年 4 月 2 日)。集合时间序列预报的便捷功能。检索自 CRAN:https://CRAN . r-project . org/web/packages/forecast hybrid/forecast hybrid . pdf

格洛菲尔德,J. (2018,10 月 26 日)。杀人,受天气、时间影响的入室盗窃。检索自 Cosmos:https://Cosmos magazine . com/society/凶杀-入室盗窃-受天气影响-一天中的时间

惠誉国际评级(2011 年 10 月 1 日)。关注道德,反思执法道德。从 LEB 检索:https://leb . FBI . gov/articles/focus/focus-on-ethics-reflecting-ethics-in-law-enforcement

9.附录

附录 1

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

资料来源:旧金山警察局绩效审计,由旧金山预算和立法分析师为旧金山市和县监事会编制(2018 年 6 月 12 日)

附录 2

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

附录 3

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

附录 4

合并结果

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

前 3 个重要变量:描述、类别、PD 区。

推车

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

逻辑回归 1

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

逻辑回归 2

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

XGBoost

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

附录 5

大车变量重要性

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

逻辑回归 1 显著变量

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

附录 6

购物车变量重要性

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

区块与类别

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

温度与类别

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

天气综合与类别

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值