用 Qwiklabs 潜入 AI 兔子洞
Photo by Valentin Lacoste on Unsplash
我花了很多时间来跟上最新的人工智能发展,并认为我在该领域的知识高于平均水平。尽管如此,我还是觉得我需要把手弄脏。这个故事是关于我进入人工智能社区和在线人工智能培训世界的第一步。
免责声明:
我认为可以肯定地说,这篇文章的目标读者是 it 专业人士。重点是如何使用谷歌 Qwiklabs 开发新的人工智能技能。如果你不是 IT 专业人士,请等我的下一篇文章。我会考虑到普通大众来写它。
我第一次听说“人工神经网络”是在 90 年代中期。我和一位同事甚至成功地编写了一个神经网络程序,并用反向传播法训练它识别字母 A 到 D。我们花了一个晚上的时间,我猜大约 6 个小时,看看这是否可能——确实可能。
一切都是非凡的。值得注意的是,我们花了很少的努力就开发出了一个神经网络,它可以做一些我们用传统的基于规则的解决方案做不到的事情。值得注意的是,我们和世界上的其他人就这样离开了它,忘记了它。于是,在 AI 寒冬的时候,我冬眠了对 AI 的热情。
现在,随着 AI 的回归和热,我想加入,那么该怎么办?
寻找志同道合的人
我的第一步是开始寻找志同道合的人。一个人的军队不是一支军队,在开辟新天地的时候,人类交流的价值是显著的。通过 Meetup 应用程序,我开始搜索我所在地区的人工智能社区。我决定参加苏黎世的“苏黎世 AI 学校”小组。它是由 Siraj Raval 创立的全球AI(SOAI)学校的一部分。一个快速发展的非营利组织,有一个雄心勃勃的使命,为地球上的任何人免费提供世界级的人工智能教育。艾和西拉杰·拉瓦尔的故事自成一篇。我建议你看看主页和 YouTube——它很有趣,信息丰富,充满活力。
我的第一次谷歌云学习堵塞
加入 SOAI 聚会小组后的第一件事是“谷歌云学习堵塞”。一个实践研讨会,向我们介绍 Qwiklabs 平台和谷歌云平台 ML 服务。会场在苏黎世的谷歌旁边,我们被告知要带上笔记本电脑。 Nicolas Bortolotti 代表谷歌,SOAI 苏黎士学院院长 Mark Heinz 安排了这次活动。
研讨会的基础是 Qwiklabs 平台上的一个名为“云 ML 引擎:Qwik start”的实验室,而且很快。马克和尼古拉斯给我们做了一个简短的介绍,当参与者在练习中陷入困境时,他们也会提供帮助。收到证书和连接细节后,很快每个人都在安装 TensorFlow,复制样本数据,并训练神经网络。目标是基于从 UCI 机器学习库检索的数据预测美国公民的收入。
实验室涉及到大量的复制粘贴,我不是唯一一个感觉实验室的个人利益有限的人。你将会发现,我以后会完全改变这种看法。然而,首先,关于 Qwiklabs 平台的一些信息。
Qwiklabs 平台
Qwiklabs 成立于 2012 年,旨在为云提供商提供机会,让他们的客户建立动手实验室,快速体验云环境。2016 年 11 月,Qwiklabs 被谷歌收购,他们现在在其谷歌云培训目录中提供广泛的实验室、课程和认证。
在收购之前,亚马逊 AWS 是 Qwiklabs 最大的客户之一,现在仍然是。因此,可以在同一个平台上同时学习谷歌云和 AWS 课程。在我眼里,令人钦佩的支持多云教育。
谷歌云培训包括
- 动手实验
- 探索
- 课程
每个任务通常由 5 到 10 个实验室组成。完成所有实验后,您将获得一枚任务徽章,如果您愿意,可以将其添加到您的简历或 LinkedIn 个人资料中。
实验通常安排大约 1 小时。在按下“开始实验”按钮之前,您可以自由通读整个实验。一旦你按下开始按钮,就不能返回,因为你不能暂停它。显然,建议先学习实验室。我的经验是
+ ≈
如果你完全按照实验说明去做,你可以做得更快。如果你开始改变参数并研究正在发生的事情,你可以在实验室花更多的时间——这是我个人的建议。
我获得第一枚徽章的方法
我是一个狂热的人工智能爱好者,尼古拉斯和马克告诉我,实验室不仅仅是复制粘贴。于是我带着一个月的免费 Qwiklab 学分从云学 Jam 工坊回家,内心充满了做实验室的意向。
我决定报名参加任务“基线:数据,ML,AI”。因为这是入门水平,而我已经在车间里做了第一个实验室。
在前两个实验中,我的感觉和在研讨会上一样——只是复制粘贴。然后在第三个实验室,发生了一些事情。我知道我在做什么!我已经熟悉了谷歌云平台(GCP)、谷歌云外壳和云存储桶。
你不会因为做了一个实验就成为谷歌云数据准备的专家。你可以看到一个小例子,看看它能做什么,仅此而已——是吗?不会,因为所有实验都包含基本功能,如创建存储桶、创建数据集、操作数据集、创建表格、将数据导入表格等。
经过一些实验,你的生物神经网络已经适应了所有这些功能,它们不再对你构成问题。换句话说,你开始了解谷歌云平台以及如何使用它。
我在两周内完成了第一个任务,只是每隔一天做一次实验。
我的第二个徽章:机器学习 API
自信满满,在一次探索中获得成功并获得我的第一枚徽章后,我选择接受另一个挑战,这一次是在高级水平上,这一次更关注人工智能:“机器学习 API”。
实验涵盖了以下 API:
- 云视觉 API
- 翻译 API
- 自然语言 API
- 云自动编程接口
- Dialogflow API
这些实验室令人兴奋。我仍然没有创造出自己的解决方案,也没有解决我自己定义的问题。然而,我学会了如何创建一个 API 键,使用该键发出请求,从图片中提取文本,并使用自然语言服务来分析文本。
我用谷歌云存储中带标签的数据集的输入,用 Auto ML 训练了一个模型。之后,我从我的 iPhone 上传了云的照片,并让模型预测图像上的云的类型(积云、积雨云等)。).
我还用 Dialogflow 创建了一个聊天机器人,同样非常有趣,它让我很好地了解了 Dialogflow 能做什么和不能做什么。
九次实验两周后,我获得了第二枚徽章。
我的放弃
在谷歌云培训平台 Qwiklabs 上:
- 为预习和实验预留时间
如果你愿意,可以一天做预习,第二天做实验。换句话说:在你服用之前了解实验室*。* - 记学习笔记
我制作了一个 word 文档,主要用于在学习阶段以及做实验时记笔记。 - 不要在自动驾驶仪上做实验说明,这有时是可能的。还是那句话:拿之前了解实验室。
- 安排一个小时的实验,总共花两个小时(学习+实验)是可以的。下一个实验可能比预期的要快。重要的是你掌握了实验室的重点。
- 当进行一项任务时,我建议在开始第一个实验之前,先浏览一下所有的实验。这样做可以帮助你对整个材料有一个总体的了解。
关于潜入人工智能社区:
- 找志同道合的
派的艾是个好建议;也许你能找到别的东西。如果你有,请让我知道。我想听听其他人的经历。 - 应用程序 Meetup 非常适合寻找其他人工智能爱好者。
- 出于以下几个原因,志同道合的社区至关重要:
- 你可以和分享你兴趣的人互动
- 人工智能社区通常与一个或多个兴趣相同的公司有某种联系。这种合作可能会导致社区成员在产品和教育方面的折扣,等等。
结论
Qwiklabs 在 Google 和 AWS 平台上提供了广泛的任务和实验。他们的“ Advantage Subscription ”仅花费 55 美元,一个月的无限制信用,这将使你能够尽可能多地进行实验/任务。
正如你现在所知道的,我在 4 周内完成了两个任务(15 个实验)(不包括我的假期:-)。我发现这是一个有利的成本效益,正如已经提到的;也许你很幸运,通过你的人工智能社区获得一些免费积分。
Qwiklabs 并不是在线课程和动手实验的唯一提供商。Coursera 也在提供关于人工智能主题的各种课程,这些课程来自斯坦福大学和约翰霍普金斯大学。
我要说的是。你不必等待你的公司给你下一个 3000 到 20000 美元的人工智能教育。你现在就可以开始,每月不到 100 美元,就可以获得高质量和有用的培训。如果你对人工智能感兴趣,现在就开始动手吧。甚至可能会很有趣。
兔子洞的另一边见。
Photo by Micaela Parente on Unsplash
从头开始在 Excel 中进行简单的指数平滑
下面这篇文章摘自我的《供应链预测的数据科学》一书,这里有。你可以在这里* 找到我的其他出版物 。我也活跃在LinkedIn*。
这篇文章是另一篇关于简单指数平滑理论介绍的文章的后续。你可以在这里找到**。你可以在这里 找到关于如何用 python 制作相同模型的类似文章。**
自己动手——用 Excel 进行简单的指数平滑
在本文中,您将在 excel 中实现一个简单的指数平滑预测模型。
1.我们从创建三列开始数据表:
- 栏 A 上的日期
- 对栏 B** 的需求**
- 对栏 C** 的预测**
2.接下来,让我们添加一个带有 alpha 的单元格(在我们的例子中是 F1 )。别忘了明确指出这个单元格是 alpha。
3.完成后,您可以将第一个预测(单元格 C2 )初始化为第一个需求(单元格 B2 )。我们在这里使用了虚拟值。
4.我们现在可以填充我们的预测;截至单元格 C3 ,我们可以使用这个公式:
5.要继续我们的预测,直到历史时期结束,我们可以简单地拖动这个公式,直到表的末尾。
6.所有未来预测(即,历史期间之外的预测)将简单地等同于基于历史需求的最后一次预测(如下所示)。
已经这样了。你可以在我的博客这里或者我的书这里找到更高级的型号。
也可以在 python 中实现简单的指数平滑( 此处 )。
关于作者
** [## Nicolas vande put——顾问,创始人——供应链| LinkedIn
查看 Nicolas Vandeput 在世界上最大的职业社区 LinkedIn 上的个人资料。尼古拉斯有 7 份工作列在…
www.linkedin.com](https://www.linkedin.com/in/vandeputnicolas/)
icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了自己的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两个科目。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟 。
**
Python 中的简单指数平滑从头开始
下面这篇文章摘自我的《供应链预测的数据科学》一书,这里有。你可以在这里* 找到我的其他出版物 。我也活跃在LinkedIn*。
这篇文章是另一篇关于简单指数平滑理论介绍的文章的后续。你可以在这里找到**。你可以在这里 找到关于如何用 Python 制作相同模型的类似文章。**
自己动手——用 Python 实现简单的指数平滑
简单平滑函数
我们将定义一个函数 simple_exp_smooth ,它将一个时间序列 d 作为输入,并返回一个 pandas DataFrame df ,其中包含历史需求、预测和误差。该函数还将 extra_periods 作为输入,即需要预测未来的周期数。最后一个输入是 alpha 参数。
**def simple_exp_smooth(d,extra_periods=1,alpha=0.4):
d = np.array(d) # Transform the input into a numpy array cols = len(d) # Historical period length d = np.append(d,[np.nan]*extra_periods) # Append np.nan into the demand array to cover future periods f = np.full(cols+extra_periods,np.nan) # Forecast array f[1] = d[0] # initialization of first forecast # Create all the t+1 forecasts until end of historical period for t in range(2,cols+1): f[t] = alpha*d[t-1]+(1-alpha)*f[t-1]
f[cols+1:] = f[t] # Forecast for all extra periods
df = pd.DataFrame.from_dict({"Demand":d,"Forecast":f,"Error":d-f})**
玩弄我们的功能
然后,我们可以简单地调用我们的函数(这里有一个虚拟需求时间序列):
**import numpy as np
import pandas as pdd=[28,19,18,13,19,16,19,18,13,16,16,11,18,15,13,15,13,11,13,10,12]df = simple_exp_smooth(d,extra_periods=4)**
您还可以使用简单的命令快速获得预测准确性,如下所示。看我之前的文章关于 KPI 看看哪个最适合你的情况。
**MAE = df["Error"].abs().mean() print("MAE:",round(MAE,2)) RMSE = np.sqrt((df["Error"]**2).mean())print("RMSE:",round(RMSE,2))**
您应该会得到以下结果:
**MAE: 2.74RMSE: 3.89**
另一个令人兴奋的步骤是绘制结果来分析模型的行为。
**df.index.name = "Periods"df[["Demand","Forecast"]].plot(figsize=(8,3),title="Simple Smoothing",ylim=(0,30),style=["-","--"])**
你应该得到一个类似下图的数字。
关于作者
** [## Nicolas vande put——顾问,创始人——供应链| LinkedIn
查看 Nicolas Vandeput 在世界上最大的职业社区 LinkedIn 上的个人资料。尼古拉斯有 7 份工作列在…
www.linkedin.com](https://www.linkedin.com/in/vandeputnicolas/)
icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了自己的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两个科目。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟 。
**
姜戈还是弗拉斯克?根据我的经验推荐。
以我的经验来看,用 Python 驱动数据应用的一个常见问题是不知道用什么工具做什么工作。我认为不用说,在工作中使用正确的工具是我们所做工作的很大一部分。当你可以从任何地方开始时,很难知道从哪里开始。但是,我一遍又一遍的看到这个问题:“我应该学烧瓶还是 Django?“简短的回答是
两者
但为什么我会建议两者都了解呢?Flask 和 Django 只是 Python 的 web APIs,对吧?Flask 有什么优势,用 Django 代替有什么优势?事实是,在很多方面,它们经常被用于非常不同的目的。虽然他们肯定会时不时地越线。
姜戈
我们都听说过地球上一些最大的网站使用 Django 的疯狂故事。这是有充分理由的,因为 Django 不仅受人尊敬,而且使用起来也非常方便。Django 的优势在于它要实现的目标。Django 非常适合用 Python 构建完整的 web 应用程序。虽然你当然可以用 Django 做一些底层的事情,但我认为对很多人来说,Django 的闪光点在于快速开发和 Django 的授权/许可系统,它被嵌入到包中。
Django 不仅使项目管理变得容易,还意味着启动变得更加容易。您的应用程序将需要的许多东西都被嵌入到您的 Django start-project 命令中。
瓶
Flask 绝对是数据迷和数据科学家的热门选择。烧瓶是两者中较轻的一个。Flask 经常对网站的大部分内容采取“从头构建”的方式。虽然这使得全面的网络应用程序开发起来有点困难,但它也带来了 Flask 的强大功能,以及两者之间的一个非常大的区别。
烧瓶很轻。这使得 Flask 成为端点定位、查询和流水线的最佳选择。许多数据科学专注于构建复杂的算法和 ROC/AUC,但数据科学最受欢迎和最被忽视的一面是 数据流 。
对于数据科学家来说,能够读取、操作和查询数据是非常有价值的。Flask 使 http 请求的转储变得非常容易,有效地构建了供您整个时间使用的端点。
在我看来,虽然 Flask 肯定可以做 Django 能做的几乎所有事情,但 Flask 在这个特定的用途上仍然更好,Django 比另一个更好。
那么…为什么两者都有?
在我们的数据科学之旅中,终端和数据基础设施可能比您想象的更有价值。尽管 ML 中确实有令人兴奋的新进展,但首先需要基础设施来获得这样的模型。
就我个人而言,我喜欢在需要的时候使用所有我能使用的工具。我喜欢在 Flask 开发,就像我喜欢在 Django 开发一样。如果我需要响应一个 http 查询,我会直接进入基于 Flask 的应用程序。如果我要建立下一个脸书,或者一个论坛网站,我肯定会使用 Django。
如果你必须选择一个:
如果你完全不反对使用两者,或者如果你想知道从哪里开始,答案肯定是 Flask。虽然 Django 是构建一些非常酷的应用程序的一个很棒的包,但我发现我经常使用 Flask。
对于典型的 DS 相关工作,我认为 Flask 做得非常出色。Flask 很有用,因为它更容易启动和运行,没有 Django 会向您左右扔来的所有令人困惑的“扩展”。并不是说这些都是负面的,但是编辑 Django 保存的文件路径来稍微改变你的项目对于初学者来说肯定是令人畏惧的。Flask 使你的函数路由和创建结果变得容易,没有麻烦。
尽管你肯定可以选择 Flask 或 Django 中的任何一个,并在创造中获得成功——嗯,很多事情,但他们肯定都有自己的优点和缺点。两者都是绝对强大的,让它们互相对抗是没有意义的。Flask 和 Django 拥有无与伦比的力量,可以将我们的数学和算法带到任何地方。
DMAIC 数据科学奖
如何构建您的数据科学项目来创造商业价值
View from Quandary Peak Summit
数据科学家的工作是分析数据以提取可操作的见解。
分析数据可能很容易,但是可操作的见解呢?虽然我们可以制作漂亮的图表和图形,这真的很酷,但我们如何才能真正证明它们提供了商业价值呢?
为了取得成功,我们必须学会将数据科学任务构建为一个业务问题,并定义我们如何增加价值。
当我被邀请为一个潜在的数据项目提供咨询时,我真的开始思考这个问题。我对他们正在做的事情感到兴奋,但我不确定如何将真正酷的想法变成可操作的产品,交付给最终用户。
在研究如何创建有价值的数据产品时,我发现了 DMAIC。
DMAIC
我们可以使用数据驱动的问题解决方法 DMAIC 来思考我们如何使用数据来创造价值和改进流程。
DMAIC 是定义、测量、分析、改进和控制的首字母缩写。这是交付可持续和可量化成果的指导方针。
它是一个精确的数据科学发展过程吗?大概不会。但是我发现思考一下你什么时候想展示你的分析为什么有价值是很有帮助的。
规定
定义问题。
可以说,这是最重要的一步。如果我们能够在深入任何探索性分析、特性工程或建模之前预先定义问题,它将帮助我们看到真正的机会,并以有意义的方式将其框定。为了真正提供价值,从提高客户满意度的角度来考虑会有所帮助。
我们需要问自己一些重要的问题来为我们的项目建立最终目标和商业案例。这些问题对于确立焦点也很重要:我们需要能够创建一个可操作的产品并按时交付结果。
问题应包括:
- 有什么问题?
- 潜在的好处在哪里?
- 我们想要影响哪些指标?
- 我们计划如何影响这些指标?
- 是我们不关心的指标。
- 对一些指标产生负面影响可以吗?如果是,增加多少?
措施
测量当前基线。
这一步涉及到数据收集:从哪里获得数据以及我们需要多少数据是这里要考虑的要点。数据质量也很重要。
你将如何比较项目结束时和开始时的数据?
两个重点:缩短交付时间和提高质量。这里可能要问的问题包括:
- 我们当前的流程表现如何?
- 我们需要什么信息?
- 我们将如何收集数据?
- 哪些因素会影响我们的指标?
分析
分析数据。
最后是数据科学部分!在这一步中,我们可以调整正常的数据科学工作流程。
询问当前绩效与目标之间的差距。
- 我们如何改进目前的产品?
- 我们如何将数据可视化?
改善
改进项目并实施解决方案。
这是迭代步骤。我们如何改进当前流程来提高您的目标?我们如何更好地分析最后一步,以改进我们之前定义的指标?
在这一步中,我们还确定、测试和实施问题的解决方案。如果有明显的解决方法,就专注于它。不要过度复杂化!
控制
控制改进:让改变持续下去。
这是我们实施和监控产品的最后阶段。
记录您的流程。实施监控计划。
- 我们如何监控成功?
- 如果性能下降,我们该怎么办?
假设的例子
让我们通过一个假设的情况来看看我们如何使用 DMAIC 来确定我们作为数据科学家如何增加价值。
我们将基于过去的比赛场景: Kaggle 的 Quora 不真诚问题分类并假设我们在 Quora 作为数据科学团队工作。
作为一个快速后台,Quora 是一个问答网站。有时人们会不怀好意地提问:试图激怒或冒犯其他用户。这显然是不好的,所以我们需要过滤掉那些不真诚的问题,不要让它们被张贴出来。
让我们想象一个假设和基本的当前流程:有一个分析师团队,他们手动审查每个问题。如果他们决定一个问题是真诚的,它将被发布到网上,否则它将被标记为不真诚,并被排除在网站之外。
这个过程听起来非常耗费人力、时间和效率。作为数据科学团队,我们建议创建一个机器学习模型来改善当前的流程。
在思考我们假设的问题时:
从高层次来说,Quora 问题的问题在于,有些人会问一些被认为有毒的问题。有毒的问题令人心烦意乱,令人不快。它们可能会导致服务使用率下降和客户满意度降低。因此,我们需要一个系统来标记和消除这些问题。
当前手动标记的解决方案可以工作,但是效率不高。由于我们是数据科学家,我们想利用机器学习创建一个新系统。
因此,我们定义了我们的主要目标:使用机器学习来识别和标记不真诚的问题。
我们假设当前基线涉及问题的手动标记。虽然这非常耗时且低效,但却有效且准确。
我们建议的解决方案需要更快,但也要保持当前手动方法的准确性。我们需要一种方法来测量的准确度。比赛使用了 F1 的分数,所以我们也可以用它作为我们的主要指标。我们还可以测量分析师的工作时间,以监控效率的提高。
接下来的步骤是分析和改进。在这里,我们将通过正常的数据科学流程来创建和改进一个模型,以过滤掉有害的问题。
最后,我们对我们的结果感到满意,因此我们实施了更改并进入了控制阶段。我们监控我们的解决方案并跟踪改进情况。
如果性能下降,我们可以计划回去重新分析新数据。所提问题的类型或措辞方式有变化吗?如果是这样,我们可能需要更新我们的模型。
结论
DMAIC 是增加我们数据科学工具箱的一个有用工具。
这对于从业务领导者和利益相关者关心的角度来构建数据科学问题,以及确保我们保持正轨并努力创建有用的数据产品非常有用。
DNA 搜索-与 argparse 的命令行接口
寻找小 DNA 片段
National Cancer Institute via Unsplash
命令行与 argparse 接口
在生物信息学中,经常需要在命令行上运行我们的程序。幸运的是,Python 的 argparse 模块——标准库的一部分——使这变得很容易。
Python 有一系列有用的库,使得构建用户界面变得容易。通常,当我们想到用户界面时,脑海中浮现的是图形点击界面。然而,用户界面是允许用户与程序交互的任何东西,包括命令行界面——这是本文的重点。
为了介绍 argparse,我将构建一个小程序来搜索用户输入的特定小段 DNA。程序将搜索的这些小段 DNA 被称为限制酶位点,即长度在 4-6 个字符之间的小 Python 字符串。这个程序将搜索细菌的基因组,看看它们出现的频率!
入门
该计划有两个明确的目的:
- 向用户提供信息,例如当程序崩溃时提供有用的信息。
- 要灵活。该程序应该能够通过改变命令行参数来搜索用户选择的任何 DNA。
首先,导入 argparse 模块并创建 ArgumentParser 对象:
这不是必须的,但是我发现使用描述关键字参数提供一个描述性的字符串很有帮助。当程序稍后在命令行中调用帮助时,将提供 python 程序的描述性概述。如果有多个用户,并且程序运行之间有时间间隔,这可能是有用的。
接下来,我们通过调用 add_argument()方法来告诉参数解析器对象预期的参数。一旦添加了所有的参数,我们可以告诉它通过调用 parse_args()方法来解析命令行参数。
add_argument()方法添加了三个参数。此外,还增加了其他各种可选参数,如 help=,type=,choice=,default= ect 。
这就是 argparse 模块真正发挥作用的地方。
短参数和长参数分别用单连字符(-)或双连字符(—)指定。这意味着,在终端的命令行上,当程序运行时,参数可以用简写方式表示,输入文件名用-i 表示,或者用简写方式表示,输入文件名用 input _ filename 表示。长短参数的另一个好处是它们可以在命令行中以任何顺序表达!
混合匹配排列中的短参数和长参数如下所示。
我们可以通过使用 help 关键字参数调用 add_argument()来使帮助文本变得更好。当程序在没有命令行参数的情况下运行时,会出现三个参数的有用帮助文本(以黄色突出显示):
自定义验证
parser.add_argument 方法中的 type=参数接受 Python 函数的名称
类型参数引用一个函数,例如—输入文件名由名为 file_check 的函数检查。下面显示的这个函数检查文件是否确实存在。
最后,choice 和 nargs 参数意味着用户可以选择选择列表中的任何元素。因为用户可以选择多个参数,所以 nargs 参数是必需的,并且指定了一个星号。
最后,现在已经添加了所有参数和用于输入验证的函数,可以编写一个小脚本了。我先写一个小字典,里面的限制酶名称是键,限制酶识别的对应序列是它们的值。
为了完整起见,我在 restriciton _ enzyme _ dict 字典中包含了这个程序所需的模块。
用户指定的参数以 args 为前缀,后跟其输入名称。
首先打开 DNA 文件,并使用。read()方法。接下来,迭代用户指定的模式。模式代表一个限制酶,是上面字典中显示的关键字,例如 EcoRI 是字典中的关键字;restriction_enzyme_dict,它的值是‘GAATTC’,即它在任何 DNA 样本中识别的序列。
对于每种限制性内切酶,我用。get()方法。它的价值在于它在基因组中识别的序列。正则表达式 re.findall 查找 DNA 中所有出现的序列,并将这些序列附加到结果列表中。
使用集合将结果列表转换为特殊的字典。Counter 方法(),用于计算找到一个唯一序列的次数。
最后,这本由 collections 创建的新词典。可以迭代名为 restriction_sites_dict 的计数器,如果序列超过用户指定的计数,则打印一条消息,告诉用户它被找到了多少次及其序列。
要查看程序的运行情况,让我们运行几个测试示例!
输出示例如下所示:
在这里,我使用 p 标志(p 标志对应于用户指定的模式)搜索了三种限制性内切酶,-p HindIII、EcoRI 和 KpnI。在第一次运行时,我没有指定计数。之前,在 count_no 的 add_argument 中,我将一个有用的默认值设置为 0。
当我再次运行程序时,计数阈值为 500,程序通知我 HindIII 站点低于我指定的 500 阈值。
这个程序运行良好。结果很快返回,并且已经搜索了大肠杆菌的整个基因组内的限制酶位点!非常酷(这个 Fasta 文件是从 NCBI 获得的),但是在我们的命令行中,我们可以通过指定它们各自的文件名,轻松地选择搜索其他细菌基因组。
最后,阐述一下先前的意图将是有益的。具体来说,该计划被设计得非常灵活。如果用户添加了不正确的限制性内切酶,比如 FakeEnzyme,会发生什么?
让我们运行程序来找出答案。
我突出显示了有用的错误消息,如果用户输入了错误的选项,它会提示用户从提供的选择列表中进行选择。
摘要
这个简短的教程展示了如何将命令行界面添加到程序中。幸运的是,Python 提供了构建接口的有用库,argparse 就是其中之一。
使用 R 的 DnD 探索性分析
使用 ggplot、tidyr、scatterplot3d 和 rgl 和 DnD,使用 R 进行数据探索和可视化的综合代码指南。
fig1: dnd classes gif using scatterplot3d
在今天的文章中,我们将一步步地了解使用 r 进行探索性数据分析的指南。我们将涵盖从 2D 到 3D 可视化,我们将通过使用来自 github 库的 DnD 数据来完成。为了便于数据可视化和操作,我对最初的数据集进行了一些数据缩减,从 768 个类和 182 个种族缩减为 13 个主要类和 16 个主要种族。
在进入分析的细节之前,这里有一个快速的介绍。
D&D 是一种掷骰子游戏,通常基于一套 7 个骰子(d4、d6、d8、d10、d12、d20 和另一个 d10)。骰子在游戏中起着重要的作用,它们都有不同的用途。例如,d20 通常用于攻击,而 d4,d6,d8,d10 或 d12 用于武器伤害,这取决于武器,性格和一些其他变量。但是当设置角色的分数时,也使用骰子。
根据定义,这使得我们将要分析的数据是随机和离散的,因为它是通过基于掷骰子的计算获得的,因此即使在这个数据样本中可能显示一些模式,这也不意味着这些模式会在其他样本中重复(部分原因是前面提到的随机性概念)。这是 DnD 最好和最有趣的特征之一。
每个 DnD 角色都有自己独特的方式,有不同的职业和种族供你选择,基本上玩家就是能最大限度或最少利用角色技能的人。玩家可以决定在预定义的角色之间进行选择,或者创建自己的角色。当创建一个新的角色时,选择职业和种族,掷骰子来定义不同的能力,并在需要时增加奖励或减少惩罚(视情况而定)。类似地,其他特征,如生命值(HP)、护甲等级(AC)和其他都是通过掷骰子和玩家手册中提到的奖励来定义的。
这里有一个文章不同部分的超链接,你可以直接跳到你感兴趣的部分。
目录
1.分布数字变量
1.1 数值变量直方图
使用 dplyr 、 tidyr 和 ggplot2 ,我为数据集的所有数值变量创建了一个直方图。
这是一个非常好的组合,因为虽然 ggplot2 提供了一种强大的图形语言,但是 tidyverse 允许我们处理数据,而 dplyr 允许我们使用管道操作符% > %从左到右连接数据操作,而不是创建中间对象。
dnd %>%
gather(attributes, value,2:9) %>%
ggplot(aes(x = value)) +
geom_histogram(aes(fill=attributes)) +
facet_wrap(~attributes, scales = 'free_x') +
labs(x="Values", y="Frequency", title="Distribution numeric variables")
fig2: histogram using using dplyr, tidyr and ggplot2
1.2 相关矩阵
在 wise 之后,我做了一个相关矩阵来衡量变量之间是否有任何程度的相关。这表明所有变量之间存在正相关关系,但这种关系的强度为 0.4,不能归类为显著。低于 0.6 意味着这种关系甚至不是中度积极的。
这是有意义的,因为 DnD 分数是通过掷骰子获得的,而掷骰子是独立的事件。如果两个随机变量 X 和 Y 是独立的,那么它们也是不相关的。然而,对于其他情况,重要的是要考虑到,如果 X 和 Y 是不相关的,它们仍然是相关的。
corrplot(abs(cor(dnd[,2:9])), method="color", col=colorRampPalette(c("red","white","blue")) (200),
type="upper", order="hclust",
addCoef.col = "black",
tl.col="black", tl.srt=45, sig.level = 0.01, insig = "blank", diag=FALSE
)
fig3: correlogram using corrplot
1.3 安装
即使在这种情况下,我们只是处理离散变量,对我来说,展示如何以一种快速而简单的方式识别数据集的分布似乎是一个好主意。
为此,选择了fitdistplus软件包。这个软件包中的 fitdistr 函数允许我们通过最大化似然函数来估计分布参数。
由于我们的统计数据是从掷骰子中获得的,因此它们符合中心极限定理,趋向于正态分布是有道理的。
fp <- fitdist(dnd$AC, "pois",discrete=TRUE)
fnb <- fitdist(dnd$AC, "nbinom",discrete=TRUE)
fg <- fitdist(dnd$AC, "geom",discrete=TRUE)
fn <- fitdist(dnd$AC, "norm",discrete=TRUE)
denscomp(list(fp,fnb,fg,fn),legendtext = c("Poisson", "negative binomial","geometric","normal"), fitlty = 1)
cdfcomp(list(fp,fnb,fg,fn),legendtext = c("Poisson", "negative binomial","geometric","normal"), fitlty = 1)
fig4: distributions fitting using fitdistrplus
2.阶级和种族
2.1 圆形地块类别与竞赛
对于这一次,我们将像以前一样继续使用 ggplot2 以及 tidyverse 和 dplyr,但我们将包括这个时间极坐标,以便我们可以将它制作成一个圆形条形图。对我来说,这是显示职业和种族之间信息的好方法。
dnd_bar <- dnd %>%
select(name,predrace,predclass) %>%
add_count(name) %>%
group_by(predrace,predclass) %>%
summarise(total = sum(n)) ggplot(dnd_bar, aes(x=predrace, y=total,fill=predclass)) +
geom_bar(stat="identity",position="dodge") +
ggtitle("Database class and race distribution*")+
labs(caption="Note:Predominant class and race")+
ylim(-100,150) +
theme_minimal() +
theme(
axis.text=element_text(size=8),
legend.text=element_text(size=8),
plot.caption = element_text(hjust = 0)
) +
coord_polar(start = 0)
fig5: circular plot using using dplyr, tidyr and ggplot2
2.2 箱线图类别
箱线图很好地描述了分布的中心和扩散(可变性。)
通过使用相同的库,我们可以按单个变量绘制箱线图。
dnd %>%
gather(attributes, value,2:9) %>%
ggplot(aes(x=attributes, y=value)) +
geom_boxplot(aes(fill=attributes))+ facet_wrap( ~ attributes, scales="free")
fig5: Boxplot by variabledplyr, tidyr and ggplot2
然后,我们可以按组或主要类别复制主要变量的练习:AC、HP 和 Con。
ggplot(dnd, aes(y =HP, x = predclass, color = predclass)) + xlab("Predominant class") + ylab("HP") + ggtitle("Comparison HP Among Classes*") + geom_boxplot() + labs(caption="Note:Predominant class") + theme(axis.text.x = element_text(angle = 90),plot.caption = element_text(hjust = 0))ggplot(dnd, aes(y =AC, x = predclass, color = predclass)) + xlab("Predominant class") + ylab("AC") + ggtitle("Comparison AC Among Classes*") + geom_boxplot() + labs(caption="Note:Predominant class") + theme(axis.text.x = element_text(angle = 90),plot.caption = element_text(hjust = 0))ggplot(dnd, aes(y =Con, x = predclass, color = predclass)) + xlab("Predominant class") + ylab("Con") + ggtitle("Comparison Co
fig6: Boxplot by classes(groups) dplyr, tidyr and ggplot2
最后,我认为引出 ggplot 的 facet wrap 功能是很好的,当您想通过一个或多个变量(在我们的例子中是组或类)分割您的数据并一起绘制数据子集时,该功能非常有用。
ggplot(dnd, aes(y = AC, x = HP,color=predclass)) + xlab("HP") + ylab("AC") + ggtitle(paste0("Comparison Among Classes*")) + geom_boxplot() + labs(caption="Note:Predominant class") + theme(axis.text.x = element_text(angle = 90),plot.caption = element_text(hjust = 0))+ facet_wrap(~predclass)
fig 7: Boxplot using facet_wrap with dplyr, tidyr and ggplot2
3.三维散点图
最后,即使当我们有实际的 3D 对象或数据映射到其上时,3D 绘图也是可取的。我认为对于这个特殊的例子,我们有多个离散变量,在 2D 有重叠的点,用 3D 绘图来增加透视是有意义的。
为了说明这一点,我将使用 ggplot 绘制 Con 与 AC 的 2D 散点图,然后使用 scatterplot3d 绘制 AC、Con 和 HP 的 3d 散点图,这样我们就可以绘制三维(3D)点云。
twod<-ggplot(dnd, aes(x = AC, y = Con, color = predclass)) + geom_point(alpha = 0.2) + labs( title = "Plot Armour Class vs Hit Points by Predominat Class", caption="Note: Predominant class was obtained from the class variable")+ theme(plot.caption = element_text(hjust = 0))
twodlibrary(scatterplot3d)
threed<-scatterplot3d(x =dnd$AC, y = dnd$Con, z = dnd$HP, color = as.numeric(dnd$predclass),pch=16,angle=30)
threed
legend(threed$xyz.convert(41, 3, 310),legend = levels(dnd$predclass), col = as.numeric(dnd$predclass), pch = 16)
fig 8: 2D plot with ggplot2 and 3D plot with scatterplot3d
为了创建 3d 散点图动画,我们将使用 rgl 和 magick 包。
rgl 通过调用不同的函数来工作。下面是他们每个人做的事情。Movie3d 以重复的方式调用函数,将每一帧记录到电影中,而 Play3d 仅用于将可视化显示到 R 中。在这种情况下,要传递给 R 的函数是 spin3d。
关于图例,当你有几个类时,rgl 就有点麻烦了,它是 2D,默认情况下在图的后面,所以根据你的类的数量,它可能很难适应。
require(rgl)
with(dnd,plot3d(AC,Con,HP,col=as.integer(predclass),xlab="AC",ylab="Con",zlab="HP",box=TRUE,type="p"))movie3d(spin3d(axis = c(0, 0, 1),rpm=5), duration = 10,type="gif",dir=".",movie="Scatterplot3d")if (!rgl.useNULL())
play3d(spin3d(axis = c(0, 0, 1), rpm = 5), duration = 10)
fig 9: 3D plot gif using rgl
作为 magick 的最后一步,我使用散点图 3d 函数在一个循环中创建了一个 png,并通过 points3d 函数添加了一些叠加点,然后我使用 magick 的 image_join 函数将它们连接成一个 gif。这就把我们带到了最初的 gif 和文章的结尾。
library(magick)
labels<-as.character(unique(dnd$predclass))
frames <- length(labels)
for (i in 1:frames) {
name<- paste('00',i,'plot.png', sep='')
png(name)
plot.new()
sp3d<-scatterplot3d(x =dnd$AC, y = dnd$Con, z = dnd$HP, color="darkgrey", type="h",pch=16,angle=30)
sp3d
sp3d$points3d(dnd[dnd$predclass==labels[i],c("AC")],dnd[dnd$predclass==labels[i],c("Con")],dnd[dnd$predclass==labels[i],c("HP")],col="red", type="h", pch=16)
legend(sp3d$xyz.convert(41, 3, 310),legend =c(labels[i],paste0("Non-",labels[i])), col =c("darkgrey","red"), pch = 16)
dev.off()
}
list.files(path=".", pattern = '*.png', full.names = TRUE) %>%
image_read() %>%
image_join() %>%
image_animate(fps=4) %>%
image_write("dnd_classes.gif")
fig10: dnd classes png used to build the scatterplot3d gif
这都是一个桌游爱好者说的。我希望这个分析读起来很有趣,写起来也很有趣。做关于非传统话题的数据分析,比如桌面游戏,总是很有趣。
评论越多的书评分越好吗?
评分数和评论数等因素如何影响图书评分。
读书是许多人喜欢的活动。这是一种将一个人的思想置于不同的环境中,同时提供一种感同身受的感觉。我自己喜欢看书。我最喜欢的类型是混合了惊悚片的神秘片。我记得读过丹·布朗的《达芬奇密码》。
这是一本很棒的书,它让我对神秘类型的书产生了兴趣。这本书的一切从情节曲折到故事讲述都是史诗般的。读这本书时,我对谁是真正的对手感到困惑。此外,我惊讶于这本书对大教堂等建筑的描述是如此详细,以及罗伯特·兰登在解决谋杀案时的矫揉造作。
在我读完这本书后,我去网上寻找更多关于这本书的信息。我发现这幅美丽的作品得到了书籍收藏网站 Goodreads 3.8/5 的评分。
这个发现让我震惊,我决定去看看 Goodreads 上评价最高的书。随着我在列表中的位置越来越高,我注意到一个趋势,高评级的书籍通常会得到更多的评论。
因此,证实我的这个假设就成了我的一项任务:评论越多的书收视率越好吗?
获取数据
通过这个链接,从 Kaggle 获得了包含书籍及其在 Goodreads 上的评级的所有信息的数据集。
该数据集具有多种特征,如图书 id、标题、isbn、页数、评级计数、作者、平均评级、语言和文本评论计数。数据集被缩减到包括重要的特征,如标题、评分数和文本评论数。
它被进一步删减,只包括那些超过 1000 人评价和超过 100 人评论的书籍。用于执行此任务的代码如下所示:
## The dataset was truncated to include relevant information
df_books = df_books[df_books['ratings_count'] > 1000]
df_books = df_books[df_books['text_reviews_count'] > 100]
新形成的数据集被进一步分析然后聚类。
A table of the first five rows of the new dataset.
分析数据集
对数据集进行分析,以降序排列书籍的评级,检查排名前十的书籍。然后,进行了一项推断,看看书籍的评级是否随着文本评论数和评级数的增加而增加。
The top ten books based on average ratings.
事实证明,书籍的评级并不一定意味着比低于或高于它们的书籍的评级数或文本评论数更高。但是,数据集有 4815 行。因此,基于十行进行教育猜测是不够的。如果我们通过对行进行分组来检查整个数据集,效果会更好。
数据集聚类
该数据集被聚类,以找出获得大量评级和评论的群体与没有获得大量评级和评论的群体之间是否存在显著差异。使用一种称为 k-means 聚类的方法对数据集进行聚类。
K-means 聚类是一种无监督的机器学习算法,其中数据集学习根据数据点与其他数据点的相似性将数据点分类成组。
数据集可以被聚类到定义数量的组中。图书数据集被分为三组。将数据集分组后,每一行都被赋予一个数字 0、1 或 2。
The first 25 rows of the dataset after it was grouped into three groups.
一个新的列被添加到名为 group 的表中,以表示每本书属于哪个组。
结果呢
在进一步检查后,创建了一个 3d 图像来完美地显示书籍的平均评级、文本评论数和评级数之间的关系。以下是聚类数据集的图示:
A 3-d representation of the dataset.
这三组的数据点被染成紫色、黄色和绿色。标记为 0 的组为紫色,而标记为 1 和 2 的组分别为绿色和黄色。
紫色组的大多数数据点分布在平均评分轴上,但评分数和文字评论数最少。一般来说,就评分而言,黄色组的范围比紫色组小,但它的评分数和文字评论数比紫色组高。
绿色组的评分范围与黄色组相似,但总体而言,绿色组的评分数和文字评论数高于黄色组。
创建了一个表格来显示每个组的平均差异。
A table showing the average of each group’s average rating, ratings count, text reviews count and graphical color.
根据表格,结果是紫色组在各方面都远远落后于黄色和绿色组。紫色组的平均评分为 3.94,评分数为 25,900,文本评论数为 968。黄色组的平均评分为 4.03,评分数为 570,000,文本评论数为 13,923。绿色组的平均评分为 4.12,评分数为 2,157,575,文本评论数为 38639。
下面是显示各组之间关系的散点图:
A scatter plot of the average rating versus ratings count for the groups.
A scatter plot of the average ratings vs text reviews count for the groups.
基于这两个散点图,我的假设已经被完全证实了。一般来说,一本书得到的评论越多,它的评级就越高。
书是由粉丝和评论家来评分的。评论家比书迷更有可能以非常仔细的方式评论书籍。但是,相比粉丝,评论书籍的评论家少之又少。因此,一本书越受欢迎,越多的书迷可能会认为它是完美的,这意味着受欢迎程度可能是一个混杂变量。
Conv 网会梦到迷幻的绵羊吗?
在连续的抽象层次上深度做梦。从上到下:输入图像,con v2–3x 3 _ reduce,inception_4c-1×1。使用 制作的 deepdreamgenerator 和公共领域图片来自 黄石国家公园 NPS
深度学习的普遍存在
深度学习的现代成功部分归功于乔治·西本科、库尔特·霍尼克和其他人开发的通用逼近定理。该定理本质上陈述了具有至少一个隐藏层和非线性激活函数的神经网络通常可以逼近任意连续函数。在过去的十年里,为训练深度网络而重新使用强大的 GPU释放了通用逼近定理的潜力,催生了许多新的商业和研究领域。在深度学习模型中,许多隐藏的层可以像通天塔一样一层一层堆叠起来,内部表示可以用来表示复杂的抽象和功能层次。这些表征可以是模型的一部分,从看似无关紧要的事物中预测任何事物,如无意义的天体物理学首字母缩写词、流式视频偏好和约会匹配;潜在的严重后果:信用风险评级、医疗诊断和约会匹配。
鉴于它们的普遍性,理解深度神经网络模型如何形成输入数据的内部表示并做出决策比以往任何时候都更重要。在实践中,通过随机梯度下降的变体的反向传播确实可以很好地适应训练数据,但是不能保证全局收敛,并且输入数据和学习过程经常以令人惊讶的方式相互作用。
https://www.youtube.com/watch?v=tlOIHko8ySg
深层网络的不稳定性
深度网络令人惊讶的学习方式导致许多人将训练和使用神经网络的整个过程称为“黑箱”,特别是在流行媒体中。当模特表现不好时,这些描述会导致糟糕的表现和公众的挫折感。
如果你从事深度学习,尝试理解你的模型在想什么是值得的。理解模型并清楚地预测它们的行为不仅有助于提高模型的性能,而且社会对隐私的关注以及欧洲 GDPR 等法规也恰当地鼓励了面向公众的机器学习中增强的解释能力。
简单的模型,简单的可视化
曾几何时,神经网络的参数从数百到数千,直接检查神经元激活是可行的,并可能富有成效。神经网络活动的一个经典的直接可视化是辛顿图(还有谁?),它通过正方形网格的大小和阴影直接显示积极和消极激活。
在某些情况下,可视化单个神经元的活动(使用一些其他技巧)仍然是有见地的,例如 OpenAI 的无监督情绪神经元工作或 Andrej Karpathy 等人的可视化递归神经网络(与相关的博客文章,大约占页面的 3/4)。然而,即使在这种情况下,找到一个有意义的可解释的神经元也是一次钓鱼探险,大多数神经元仍然是相当难以理解的。
在大型模型中构思见解
你可能已经看到了谷歌的迷幻概念/深梦技术的一些迭代。深度做梦是减少神经网络黑盒神秘性的早期尝试。通过使用网络来不断增强与给定神经元的激活相关的特征,可以生成图像来获得关于在神经网络结构中如何形成表示和决策的一些想法。这可以被拟人化为网络看着一张图片,问“图片内容让我想起了什么,我怎样才能让它看起来更像这样?”运用深度梦境技术是这篇文章的标题图像的来源。在不同的层应用这种技术会产生不同层次的抽象。在标题图像中,一只大角羊在 con v2–3x 3 _ reduce 层中做梦,这在网络中很早就出现了,产生了像笔触一样的纹理。这些是你在不同方向的边缘、点和曲线检测器,倾向于被深度 conv 网络的前几层中的卷积核学习。在 inception_4c-1×1 层中稍微深入一点,我们看到与用于训练 inception 模型的类的类型相关联的特征集合怪异地覆盖在图像上。
深度做梦当然获得了足够的关注,并被用作制作美丽图像的创造性工具,但深度做梦本身并没有提供多少可操作的见解。这可能是从手臂必须从哑铃中长出来的启示中得来的。
谷歌的 4.0 版让 CC 长出了粗壮的手臂。
神经网络计算机视觉中应用的其他可视化技术包括 Jason Yosinski 等人的特征可视化工具箱(演示视频),如果你准备用 Caffe 建立一个 Python 环境,你可以亲自尝试一下。作者展示了几个主要属于“有趣”类别的观察结果,如对面孔、文本和褶皱织物做出反应的神经元。从“有趣的”实现到可操作的见解的点连接是可解释性开始回报时间和工具投资的地方。事实上,它本身已经成为机器学习的一个子领域,满足了对拥有可解释机器学习技能的研究人员和工程师的需求。这对你的个人或组织工具箱是一个有价值的补充。
从可视化到可操作的效用
也许对深度学习可解释性最有凝聚力的研究来自克里斯·奥拉、谷歌大脑和 OpenAI 的汇合。追溯到几年前,主要发表在蒸馏上,这项工作建立在深度梦和特征可视化的概念上,以开发基于优化的可视化,进一步开发以理解具有空间激活的属性,并且随着激活图集的最近出版,作者展示了对对抗示例和奇怪特征相关性的漏洞的见解。
激活图谱是一系列研究中的最新进展,从简单的:单个神经元激活的特征可视化,到复杂的:从代表网络可能遇到的所有可能图像的流形中进行子采样的激活图谱。图片修改下一张 CC 由 4.0 授权来自 山卡特、克里斯奥拉等人 2019
激活地图集与相关的空间激活部分相似,但有一个关键区别。虽然空间激活表示单个图像的模型特征提取,但是激活图谱形成所有可能图像的特征提取图。例如,不是在小狗的图像上排列松软的耳朵、可爱的噪音和毛绒绒的爪子的特征可视化,而是激活地图集将各种各样的动物鼻子排列在一起,这些鼻子最终将融入其他相关特征,如皮毛、耳朵和尾巴。
这种神经网络特征可视化的整体视图允许以有趣的方式调查和预测模型行为。通过观察区分“水肺潜水员”和“浮潜”的特征与看起来像属于机车引擎的特征的接近程度,作者猜测他们可以从火车图像中引入一个补丁,以欺骗网络将浮潜者识别为水肺潜水员。该团队调查的其他对抗性例子包括通过添加面条将煎锅伪装成炒锅,以及通过添加棒球将灰鲸伪装成鲨鱼。
做煎锅和炒锅只需要几根面条。图片使用下一张 CC 通过 4.0 许可来自 山卡特、克里斯奥拉等人 2019
向前发展的可解释价值
总之,自《深度梦》以来,可解释性领域已经发展了很多,并开始提供可操作的见解。用激活地图集生成的对抗性例子的类型依赖于全网络特征可视化和人类直觉的巧妙结合。随着深度学习网络继续部署到新的领域,并在现有领域中获得更大的采用,它们将被认为更负责任,更可预测地可靠。在这种情况下,对可解释性工具和从业者产生的需求和价值只会增加。
原载于 2019 年 5 月 14 日https://blog.exxactcorp.com。
选举会影响股市吗?
印度大选今天开始——4 月 11 日,我想以请求所有在印度并且达到投票年龄的人开始这篇文章——**请投票!**投票做出你想看到的改变。
特别是所有国家的大选,使得各行业通常对新政府可能带来的新政策或政策变化处于投机模式,这些政策可能会对公司的运作产生不利或有利的影响。这反过来影响他们在股票市场上的价格,并使投资者对市场持不同看法。关于在选举期间应该如何投资,一直存在争议。我将通过我的分析来回答这些疑问,重点将是回答以下问题:
- 我应该在选举之前还是之后投资?
- 我应该等到选举的影响消退吗?
- 在这一时期有什么特别的行业在增长吗?
- 有我应该远离的部门吗?
数据收集
为了分析,我们需要选举日期前后的指数历史数据,我们从— BSE 官方网站 获取。我们将下载 BSE Sensex 指数、BSE 100 指数、BSE 200 指数& BSE 500 指数以及各种行业指数数据。让我们从 维基百科 获取选举日期。我们将回顾过去 4 年的选举— 2014 年,2009 年,2004 年,1999 年。让我们来看 6 个数据点 (Return %) 进行分析——选举前 6 个月——这将是与选举前 3 个月的数据进行比较的基础。其他数据点是选举前 1 个月、选举月、选举后 1 个月、选举后 3 个月和选举后 6 个月。
2014 年选举
让我们先来看看最新的数据——2014 年大选,我们看到 3 个月前市场下跌约 1.5 % ,之后在大选月市场处于牛市,BSE 指数上涨10。现在让我们来看看行业指数****
扇区数据与 BSE sensex 数据密切相关。疯牛病汽车、疯牛病医疗和疯牛病银行指数上升,并且在整个选举过程中保持一致。而 BSE 金属是最不稳定的。
2009 年选举
从技术角度来看,2009 年选举的模式与 2014 年相似,但是我们看到在选举后市场增长(大约。~9%) 不像之前和期间(大约。30%) 选举月。
大多数行业在选举前后都上涨了。 BSE Auto,BSE IT 分别上升和一致。 BSE Metal 在选举月期间经历了持续的高增长期(接近 60%)—这可能是由于帮助金属公司的政策变化。 BSE FMCG 在选举期间没有任何重大动作。
2004 年选举
2004 年选举见证了非常低迷的市场,直到选举结束。市场受选举结果的影响,在选举月下跌了大约 20%,一个月后才回升。然而,我们可以看到选举后的持续增长,并达到接近。6 个月后约为 20%。
这些板块紧随 BSE Sensex 指数。**在选举月期间,所有行业都下跌了近 20%**而在选举后都上涨了, BSE 金属、BSE IT 和 BSE 银行的涨幅最大。
1999 年选举
选举前市场繁荣达到接近 40%的。然而,在选举期间和之后,市场经历了短暂的增长,然后在 6 个月的时间里,T42 下跌了近 20%。
扇区再次非常紧密地跟随和 BSE Sensex。市场对新政府的预期上升,BSE 金属上涨近 60% 但是所有行业在大选后下跌近 40%。政府是否没有信守承诺?(可能吧!)
推理
正如我们通过这些年的各种图表所看到的,我们看到,通常选举后市场会上涨,让我们看看交叉对比数据并进一步分析。
BSE Sensex cross comparison data over last 4 election years.
我们看到 BSE Sensex 意味着数据表明市场通常在选举前上涨,在选举月期间和之后增长非常缓慢,然后回升。理想的策略是在选举前 3 个月开始建立你的投资组合,并在选举后 3 或 6 个月继续保持。让我们看看我们可以投资或远离的行业。
BSE Auto Index cross comparison data over last 4 election years.
汽车似乎是所有指标中最一致的指标。增长没有其他指数那么快,下跌也没有那么快。的策略将是尽早投资优质汽车股,并在选举后大约 3 到 6 个月卖出。
BSE Metals Index cross comparison data over last 4 election years.
**金属指数似乎是所有指数中波动最大的,**它们有大起大落。策略是关注有利于金属公司的政策,如果不远离金属行业,就投资。
BSE Healthcare Index cross comparison data over last 4 election years.
像汽车这样的医疗保健指数似乎与其增长非常一致。回报与 sensex 或 Auto 回报不匹配,但是,如果我们可以投资顶级医疗保健股票,在选举临近时投资并在选举后大约一个月或三个月出售它们将是理想的。
伙计们,这就是我现在要说的!对于对代码感兴趣的人——可以参考我的 Github 链接。我希望你喜欢读这篇文章,如果我错过了什么或者有什么反馈,请在评论中分享。
女员工赚钱少吗?
在 Python 中浏览测量数据
使用 pandas、Seaborn、Matplotlib 和 Scipy 进行调查数据分析。
这是我在 Medium 上的第一篇文章,正因为如此,我决定用调查数据来练习一些统计学。为了做到这一点,我将使用布伦特·奥扎薪酬调查,据我所知,该调查自 2017 年以来每年发布一次。这里的主要思想是回答以下问题:女性雇员比男性雇员挣得少吗?。许多人会说“是的!他们肯定有!”,其他人可能会说“当然,女性挣钱少!”。在我看来,当我们做出这种声明时,我们必须关注一种叫做确认偏差的东西。换句话说,如果你认为女性的工资比男性低,那么你就有可能在没有深入分析你正在处理的数据质量的情况下就做出这种判断。
我们将使用 pandas、Matplotlib、seaborn 和 Scipy 来理解我们的数据。此外,我们还将使用 2019 年数据专业人员薪酬调查结果,你可以在 [Bent Ozar 的网页](http://Possessive last names)上找到它。
把这篇文章作为一种方法,可以帮助你分析一些调查和任何其他数据,你想统计检查。
数据探索
让我们首先导入一些我们将需要的库,然后浏览数据。
#**Import libraries**
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style(‘ticks’)
#**Ignore woarnings**
import warnings
warnings.filterwarnings(‘ignore’)# **Import data**
raw_data = pd.read_excel(‘2019_Data_Professional_Salary_Survey_Responses.xlsx’,header = 2)
raw_data.head()
让我们看一下数据类型,并检查数据集中是否有 nan 变量。
raw_data.info()
首先引起我注意的是 SalaryUSD 专栏。这个特性必须是数字的,为了用这个数据做一些数学运算,我们必须把它们转换成浮点数。另外,经过一些观察,我注意到在薪水栏中有一些字符应该被删除。此外,由于一些行被标识为 integer,另一些被标识为 float,我创建了一个函数来处理所有这些数据,将它们转换为 string,然后将整个列转换为 float。最后,DataFrame 的列标签上的所有空格(“”)都已替换为下划线(“_”)。
#**Convert all of the salary rows into string**
def str_salary(salary):
sep = '.'
if type(salary) == int:
salary = str(salary)
elif type(salary) == str:
# Replace characteres and take the cents out of our data
salary = salary.replace(" ","").replace("$","").replace(",","").split(sep)[0]
elif type(salary) == float:
salary = str(salary)
return salary# **Replace spaces(“ “) in columns name with underscore (“_”)**
raw_data.columns = raw_data.columns.str.replace(“ “,”_”)# **Apply str_salary function**
raw_data['SalaryUSD'] = raw_data.SalaryUSD.apply(str_salary)
raw_data['SalaryUSD'].head()
为了只分析 2019 年的数据,我们将按年份和与我们的分析相关的列过滤数据框架。
df = raw_data.loc[raw_data.Survey_Year == 2019, ['Survey_Year','Country','SalaryUSD','JobTitle','YearsWithThisTypeOfJob','Education','Certifications','PopulationOfLargestCityWithin20Miles', 'Gender' ]]
df.head()
既然我们已经定义了我们的数据框架,我们现在能够获得一些信息。首先,让我们统计各个国家的雇员人数,并研究我们拥有更多数据的国家。其次,我们将按职位统计员工人数,最后统计男女员工总数。
# **Answers by Country**
df.Country.value_counts()
正如我们所看到的,在本次调查中,我们有更多来自美国的员工,因此,我们将过滤我们的数据框架,以便只处理美国的数据。
#**Filter dataframe by country**
US_2019 = df.loc[df.Country == ‘United States’,:]
US_2019.head(3)
所以,让我们来看看按性别划分的员工数量,看看我们能否从中获取一些信息。女性和男性雇员的数量是否相等,或者至少接近相等?我们来看看这个!
US_2019.Gender.value_counts()
似乎我们在这里有一个问题。不幸的是,男性的总数远远大于女性。此外,由于 2019 年只有一名非二元人回答了调查,我们无法从非二元性别中获得任何统计信息。所以,让我们去掉这一行,只关注两种性别。
# **Delet the row - Non-binary/third gender**
US_2019 = US_2019[US_2019.Gender != 'Non-binary/third gender']
US_2019.Gender.value_counts()
好的,我们已经知道(不幸的是)女性的数量远低于男性。现在让我们来回答以下问题:就职称而言,性别是如何分布的?我们先统计一下每个岗位的员工人数。#职位名称
US_2019。JobTitle.value_counts()
# **Job Titles**
US_2019.JobTitle.value_counts()
让我惊讶的是,我们只有 4 个数据科学家,21 个工程师……好吧,这个就不考虑了!所以,现在我们有了这个调查中的职位概述。职位性别分布如何?我们来看看这个!
# **number of each gender by job title**
Gender_df = US_2019.loc[ : , [‘JobTitle’, ‘Gender’, ‘SalaryUSD’ ]]
Count_gender = Gender_df.pivot_table(Gender_df, index = [‘JobTitle’, ‘Gender’], aggfunc= ‘count’)
Count_gender
我不知道你们是怎么想的,但是我是视觉型的学习者,这就是为什么我真的喜欢制作图表的原因。我们可以使用 seaborn 库用我们刚刚检查过的信息构建一个条形图。
import seaborn as sns
# **use Seaborn styles**
sns.set()
pd.pivot_table(Gender_df, index= 'JobTitle', columns= 'Gender', aggfunc= 'count').plot(kind= 'barh', figsize= (9,9))
plt.xlabel("Salary USD")
上图清楚地显示了性别之间的差距,不仅是总体上回答调查的员工,还包括职位。你在你的公司注意到这一点了吗?
太好了。现在我们知道在我们的调查中有 541 名男性和 60 名女性,我们还知道在所有的职位中男性员工的数量要多得多。需要注意的是,我们不能保证这些事实是绝对真实的,因为我们不知道调查是如何进行的。此外,我们必须意识到我们的在线样本的代表性,这样我们才能相信从我们的互联网调查数据得出的结论的有效性。换句话说,数据可能有偏差。
例如,在进行调查时,我们倾向于对某些类型的人(在本例中是员工)进行过度采样,而对其他人进行欠采样。并不是所有人都知道 Brent Ozar 的网站——负责这项调查的网站,如果其他人对这种主题不感兴趣,他们就更不可能参与这项调查。
我们可以尝试使用加权等统计技术来处理这个问题,以补偿这种类型的“采样偏差”。这不是我们分析的情况,我们将只是从我们的数据中得出一些直观的见解,并实践一些基本的统计数据,因为我们并不真正担心这个话题。
工资
是时候看看工资数据了,这样我们可以检查一下里面是否有缺口。重要的是要记住,我们不会考虑一些特征,如工作经验、教育程度和公司规模,因为我们只想回答一个简单的问题:女性和男性的工资有差距吗?例如,我会用这些特征来回答为什么男女之间存在或不存在差距。也就是说,让我们从薪水栏开始分析。
直方图通过将数据分组到箱中来显示指标变量值的间隔频率。让我们来看看工资的分布情况。你觉得会怎么样?嗯,我认为它看起来像一个正偏的高斯分布,很少有员工的收入超过特定的阈值(可能是 15 万美元)。
#**Import sub-package stats from scipy library**
from scipy import stats
sns.distplot(US_2019.SalaryUSD, fit = stats.norm)
猜得好!上面的直方图与我预期的相似(不完全相同)。数据看起来接近正态分布,或者至少看起来是钟形的。正常吗?让我们检查一下。
常态测试
我们将通过一个定性分析(Q-Q 图)和两个定量检验(夏皮罗-维尔克和达戈西诺的 k2 检验)来检验数据的正态性。
定性正态性检验
Q-Q 图是检查数据分布的常用图。分位数-分位数图或 Q-Q 图生成我们与之比较的分布样本(在这种情况下为正态分布)。生成的样本被分成多个分位数,样本中的每个数据点都与分布中的一个相似成员相结合,我们将在相同的累积分布中与该成员进行比较。因此,我们有一个散点图,x 轴是理论值,y 轴是数据样本分位数。
#Import qqplot
from statsmodels.graphics.gofplots import qqplot
qqplot(US_2019.SalaryUSD, line = ‘s’)
那么,我们该如何解读这个情节呢?嗯,蓝点与红线的偏差显示了与我们正在比较的分布(高斯)的偏差。基于此,我们可以说,我们的特征似乎不是正态分布的良好匹配。如果数据呈正态分布,大部分蓝点会在红线上,事实并非如此。即使线上有很多蓝点,但不在线的还有很多。这表明数据将呈现不同的分布,正如我们在直方图中观察到的那样。
定量常态检验
除了前面的分析,我们将使用两个定量测试来检查我们的数据的正态性。让我们从夏皮罗-维尔克检验开始,它评估一个特定的样本,并量化数据遵循正态分布的可能性。据我所知,夏皮罗-维尔克检验不仅是一个可靠的检验,而且是一个广泛使用的检验,我们可以使用 SciPy 库中的 Shapiro()函数来应用它。此函数返回由测试计算的 W 统计数据和 p 值。
我们要用的第二个测试是达戈西诺的 k 测试。该正态性检验计算数据的峰度和偏斜度,以确定它们是否遵循高斯分布。基本上,该测试所做的是将样本的偏斜度和峰度结合起来,以产生正态性的综合测试。对于那些不熟悉这些术语的人来说,峰度是分布有多少在尾部的量化,而偏斜是分布有多少被向右或向左推动的量化(它衡量分布的不对称性)。为了计算 de 统计和 p 值,我们将使用 SciPy 库中的 normaltest()函数。
夏皮罗-维尔克试验
from scipy.stats import shapiro
statistic,p = shapiro(US_2019.SalaryUSD)
print(f'P-value: {p :<.3f}')#**For a threshold of 5% (alpha)**
if p > 0.05:
print(f'Sample looks Gaussian (fail to regect H0)')
else:
print(f'Sample does not look gaussian ( regect H0)')
**达戈西诺的 k2 测试 **
from scipy.stats import normaltest
statistic,p = normaltest(US_2019.SalaryUSD)print(f'P-value:{p:<.3f}')#**For a threshould of 5% (alpha)**
if p > 0.05:
print(f'Sample looks Gaussian (fail to regect H0)')
else:
print(f'Sample does not look gaussian (regect H0)')
因为我们已经定性和定量地分析了我们的测试,我们可以对数据做一个假设。到目前为止,我们使用的所有测试和可视化技术都不表示正态分布。
离群值
为了确保我们的数据能够恰当地代表我们的问题,我们必须意识到数据集中存在异常值的可能性。异常值是超出预期范围的条目,与其他观察值不同。它们会影响我们数据分布的偏斜度,从而影响一些统计术语,如标准差和均值。特别是,由于计算的方式,这些度量对异常值非常敏感。
让我们按性别划分我们的数据,并绘制一个箱线图,这样我们就能够通过它们的四分位数来说明我们的数据。这也可以帮助我们识别一些潜在的异常值,例如位于图中触须之外的那些数据。
fig = plt.figure(figsize = (10,8))
sns.boxplot(x = ‘Gender’, y = ‘SalaryUSD’, data = US_2019)
统计数字
让我们计算一些项,以便对数据有所了解。
def statistics(salary):
#**Import variation**
from scipy.stats import variation
#Calculate terms
mean = salary.mean()
median = salary.median()
mode = salary.mode()
kurtosis = salary.kurtosis()
skew = salary.skew()
CV = variation(salary)
#**dict**
stats = [(‘Country’, [‘United States’]),
(‘Mean’,[round(mean,2)]),
(‘Median’,[round(median,2)]),
(‘Mode’, [int(mode)]),
(‘Kurtosis’,[round(kurtosis,2)]),
(‘Skew’,[round(skew,2)]),
(‘Coefficient of variation’,[round(CV,2)])
]
#**dataframe**
stats_df = pd.DataFrame.from_items(stats)
return stats_df
应用统计功能
Salary_statistics = statistics(US_2019['SalaryUSD'])
Salary_statistics
因此,一旦我们计算了这些统计数据,我们就能够识别数据的一些特征。第一,中位数和均值大于众数。这意味着分布的右尾更长,或者换句话说,数据是正偏的。第二,我们的数据的偏斜度大于 1,证实了它的高偏斜度。第三,我们的数据集中的高峰值表明它的分布有重尾或异常值——我们必须调查它。最后,变异系数(CV)是数据集中数据点围绕其平均值的离差的统计度量,表明我们的样本相对于其平均值有 43%的显著变异。
到目前为止,我们所做的所有分析都为我们提供了证据,证明我们的* *数据不符合正态分布。此外,高峰值可能是离群值的指标。我们来调查一下。
四分位间距
我们需要一个合理的标准偏差来进行分析。我这么说是什么意思?嗯,标准差代表了数据相对于平均值的分散程度,正如我之前说过的,这种方法受异常值的影响很大。此外,我们将在后面看到,标准误差对总体的标准偏差是敏感的,正因为如此,我们希望过滤掉异常值。
没错。我们知道我们必须过滤掉离群值。但是我们怎么做呢?答案很简单:我们将使用四分位数范围。
四分位数间距基本上是第三个四分位数和第一个四分位数之间的距离。在我们的例子中,下表显示 Q3 = 123.600,00 美元,Q1 = 83.000,00。让我们计算它们之间的差异,并确定我们的四分位间距(IQR)。
#**Statistics**
round(US_2019.SalaryUSD.describe().to_frame(),3)
#**Calculate the percentiles — 25 and 75 %**
q75, q25 = np.percentile(US_2019.SalaryUSD , [75 ,25])
print(f’Q3:{q75}’)
print(f’Q1:{q25}’)
# **Calculate the percentile Range**
iqr = q75 — q25
print(f’Interquartile Range: {iqr}’)
既然我们有了 IQR,我们就能够过滤掉数据集中的异常值。我们这样做是考虑到任何超出中位数正(+)和负(-) 1.5 * IQR 的数据都是异常值。
# **IQR +/- 40600**
min_salary = US_2019.SalaryUSD.median()- 1.5*iqr
max_salary = US_2019.SalaryUSD.median() + 1.5*iqr
print(f'Minimun salary (threshould) : {min_salary}')
print(f'Maximun salary (threshould) : {max_salary}')
#**data set within the range**
US_2019_No_Outliers = US_2019[(US_2019.SalaryUSD>=min_salary) & (US_2019.SalaryUSD <= max_salary)]
US_2019_No_Outliers.head()
在剔除异常值后,我们可以看到我们的数据集是如何变化的。首先,箱线图显示两性都没有异常值。第二,数据分布大致代表一个高斯。此外,平均值现在更接近中位数,变异系数仅为 25%,这意味着我们的数据在我们定义的范围内均匀分布。
# **Boxplot with data within the range**
fig = plt.figure(figsize = (10,8))
sns.boxplot(x = ‘Gender’, y = ‘SalaryUSD’, data = US_2019_No_Outliers)
sns.distplot(US_2019_No_Outliers.SalaryUSD, fit = stats.norm)
# **statistical terms for data within the range**
Salary_statistics_No_Outliers = statistics(US_2019_No_Outliers[‘SalaryUSD’])
Salary_statistics_No_Outliers
统计摘要
#**Statistical terms before and after the removal of outliers**
Salary_statistics.append(Salary_statistics_No_Outliers)
请注意,我们已经删除了 34 个高于最大阈值的条目和 8 个低于最小阈值的条目。这表明 7%的观察值导致了我们数据集的显著变化。
below_threshould = US_2019[US_2019.SalaryUSD <= min_salary]
above_threshould = US_2019[US_2019.SalaryUSD >= max_salary]
print(f'Total of salaries above the max threshould: {above_threshould.SalaryUSD.count()}')
print(f'Total of salaries below the min threshould:{below_threshould.SalaryUSD.count()}')
print(f'Entries outside the range: { round((below_threshould.SalaryUSD.count() + above_threshould.SalaryUSD.count()) / US_2019.SalaryUSD.count()*100)} %' )
离群值的另一个重要方面是,其中 33 个是男性,只有一个是女性。这表明 97%挣更多钱的员工是男性。这不是很有趣吗?!
above_threshould.Gender.value_counts()
标准误差分析
现在我们有了一个相当平衡的数据集,我们可以进行标准的误差分析了。我为什么要这么做?标准误差向我们展示了我们的数据有多好。换句话说,它衡量的是我们的样本代表总体的准确性。下面的公式显示了这个统计术语是如何计算的。
需要注意两件重要的事情。首先,样本越大,样本均值就越接近总体均值。此外,我们可以通过公式看出,如果我们有更多的样本,标准误差将会减少。第二,总体的标准差越小,标准差越小。正如我们所知,标准差是一种传播的度量,它受异常值的影响很大。这意味着在我们的数据集中存在异常值的情况下,样本的标准偏差会大得多。
def mean_std_count(salary, data):
mean = salary.mean()
std = salary.std()
count = salary.count()
std_error = [(‘Gender’,[data]),
(‘Salary Mean’,[round(mean,2)]),
(‘Salary std’,[round(std,2)]),
(‘Sample’,[count]) ]
std_erro_df = pd.DataFrame.from_items(std_error)
return std_erro_dfFemale_stats = mean_std_count(US_2019_No_Outliers[US_2019_No_Outliers.Gender == ‘Female’].SalaryUSD, ‘Female’)
Male_stats = mean_std_count(US_2019_No_Outliers[US_2019_No_Outliers.Gender == ‘Male’].SalaryUSD, ‘Male’)
Salary_stats = mean_std_count(US_2019_No_Outliers.SalaryUSD, ‘Total’)
Female_stats.append(Male_stats).append(Salary_stats)
上表显示,我们的平均工资差距约为 3700 美元。你不认为这很重要吗?在我看来,这似乎是相当值得注意的。
尽管我们的数据不符合正态分布,但在剔除异常值后,我们在均值和标准差方面得到了一些更简洁的东西。此外,我们的数据集是否遵循特定的分布对我们的分析来说不应该有太大的影响,因为我们不需要标准误差的高斯分布。
也就是说,如果我们考虑样本的正态分布,我们可以说 95%的工资应该在 51.000 美元到 152.350 美元之间,我不认为这有任何问题。实际上,我觉得这很对。
def standard_error(salary, data):
#**calculate terms**
mean = salary.mean()
std = salary.std()
count = salary.count()
std_error = std/((count)**(1/2))
min68 = mean- std_error
max68 = mean+ std_error
min95 = mean- 2*std_error
max95 = mean+ 2*std_error
#**create df**
std_error = [('Gender',[data]),
('Standard Error',[round(std_error,2)]),
('Min [68% range] ',[round(min68,2)]),
('Max [ 68% range] ',[round(max68,2)]),
('Min [95% range]',[round(min95,2)]),
('Max [95% range]',[round(max95,2)]),
]
std_error_df = pd.DataFrame.from_items(std_error)
return std_error_df
女性和男性工资数据框架——没有异常值。
Female_std_error = standard_error(US_2019_No_Outliers[US_2019_No_Outliers.Gender == ‘Female’].SalaryUSD, ‘Female’)
Male_std_error = standard_error(US_2019_No_Outliers[US_2019_No_Outliers.Gender == ‘Male’].SalaryUSD, ‘Male’)
#**Append male and female df**
a = Female_std_error.append(Male_std_error)
a
为了解释数据并试图得出结论,我们必须分析标准误差,查看条形的重叠性质。在我们的例子中,误差线重叠,重叠区域不包含较低样本的平均值。由于这一事实,我们可以假设,没有强有力的证据表明,人口是相似的或不同的。68%和 95%范围内的不确定性都太高。我们可以在下面的条形图中清楚地看到这一点。
def mean_error_plot(salary1, salary2, gender1, gender2):
#**Calculate terms**
mean1 = salary1.mean()
mean2 = salary2.mean()
std1 = salary1.std()
std2 = salary2.std()
count1 = salary1.count()
count2 = salary2.count()
std_error1 = std1/((count1)**(1/2))
std_error2 = std2/((count2)**(1/2))
#**Create lists for plot**
Genders = [gender1,gender2,gender1,gender2]
x_pos = np.arange(len(Genders))
Gd = [mean1,mean2,mean1,mean2]
error = [std_error1,std_error2,2*std_error1,2*std_error2]
#**Create the plot**
fig, ax = plt.subplots(figsize = (10,10))
ax.bar(x_pos, Gd, yerr=error, align='center', alpha=0.5, ecolor='black', capsize=10,color=['red', 'red', 'black', 'black'])
ax.set_ylabel('Salary [$]')
ax.set_xticks(x_pos)
ax.set_xticklabels(Genders)
ax.set_title('Genders - Range')
ax.yaxis.grid(True)
#**Create horizontal lines**
ax.axhline(y = 100936.60, color = 'r', linewidth = 1,xmin=0.143, xmax=0.38 , linestyle='dashed', alpha=0.5 )
ax.axhline(y = 101766.23, color = 'r', linewidth = 1,xmin=0.143, xmax=0.38, linestyle='dashed', alpha=0.5 )
ax.axhline(y = 99809.28, color = 'r', linewidth = 1,xmin=0.62, xmax=0.85 , linestyle='dashed', alpha=0.5 )
ax.axhline(y = 104318.53, color = 'r', linewidth = 1,xmin=0.62, xmax=0.85, linestyle='dashed', alpha=0.5 )
#**Create legend**
import matplotlib.patches as mpatches
red_patch = mpatches.Patch(color='red', label='68% range')
black_patch = mpatches.Patch(color='black', label='95% range')
plt.legend(handles=[black_patch,red_patch], loc = 'upper left')
女性和男性数据框架——无异常值
Female_no_out = US_2019_No_Outliers[US_2019_No_Outliers.Gender == ‘Female’].SalaryUSD
Male_no_out = US_2019_No_Outliers[US_2019_No_Outliers.Gender == ‘Male’].SalaryUSD
#apply mean_error_plo function
mean_error_plot(Female_no_out,Male_no_out,’Female’,’Male’)
那么,我们现在能做什么?用另一种方法来分析它怎么样?这正是我们要做的!让我们通过假设检验来比较这两种方法。
t-学生测验
我们使用假设检验的原因是,在给定样本数据的情况下,确定零假设是否可能为真。如果几乎没有反对的证据,我们接受零假设,如果零假设不太可能,我们可能会拒绝零假设而支持另一个假设。
也就是说,一旦我们确定了无效假设和替代假设,我们就能够选择显著性水平。这个统计项是决定我们何时拒绝零假设的概率阈值。此外,在执行测试后,p 值有助于我们解释结果。该值是代表给定事件发生概率的测试中的边际显著性水平。
回到我们的案例研究,让我们从设定第一个假设开始,假设两种工资手段(男性和女性)相等。因此,我们将假设另一个假设是两个均值不相等。为了做到这一点,我们将使用 stats.ttest_ind()函数执行双样本 T 检验。
假设:我们假设两个样本都是正态分布,并且方差相同。
让我们对有异常值和无异常值的数据进行双样本 t 检验,这样我们就可以有所了解,从而得出结论。
# **Import t-test function**
from scipy.stats import ttest_ind# **T-test - data without outliers**
ttest_no_outliers = stats.ttest_ind(a = Female_no_out, b = Male_no_out, equal_var= False)
ttest_no_outliers
pvalue_no_outliers = round(ttest_no_outliers[1],2)
print(f’P-value of data without outliers: {pvalue_no_outliers}’)
测试给出的 p 值为 0.31,大于显著性值(0.05)。在这种情况下,我们不能拒绝零假设。因此,我们期望在 31%的样本中找到相同性别的样本均值。
现在让我们对包含异常值的工资数据进行测试。
# **Filter salary by gender considering outliers**
Female_salary_with_outliers = US_2019[US_2019.Gender == 'Female'].SalaryUSD
Male_salary_with_outilers = US_2019[US_2019.Gender == 'Male'].SalaryUSD#**T-test on data with outliers**
ttest_outliers = stats.ttest_ind(a = Female_salary_with_outliers, b = Male_salary_with_outilers, equal_var= False)
ttest_outliers
pvalue_outliers = round(ttest_outliers[1],2)
print(f’P-value of data without outliers: {pvalue_outliers}’)
如上所述,如果我们保留异常值,我们可以说,由于 p 值为 0.02,低于显著性水平(0.05),男女薪酬不平等。因此,这表明,当我们将异常值纳入数据集中时,男女工资确实存在差异。
结论
在我们做了分析和假设之后,我想说的是,在正常的工作中,两性似乎得到了同等的报酬。然而,当我们在测试中包括收入高得多的人数时,我们可以看到离群值的差距——其中 97%是男性
我知道这是一个宽泛的分析。如果我们深入研究所有的特征,我们可能会找到得出这个结论的原因。万一你想更好的分析,可以随便找 Brent 原来博客上的数据,应用你所有的知识。请让我知道你的结论!
注意 : 我还使用不同的标准进行了分析,以确定异常值。在我的 GitHub 页面上查看一下。
来源:
- https://data.library.virginia.edu/understanding-q-q-plots/
- http://www . stats models . org/dev/generated/stats models . graphics . gofplots . QQ plot . html
- https://web . archive . org/web/20120325140006/http://www . CEE . MTU . edu/~
- https://machine learning mastery . com/a-gentle-introduction-to-normality-tests-in-python/
- http://www . SQL gene . com/2017/12/29/practicing-statistics-female-DBAs-and-salary/
FIFA 19 评分与 PES 2019 评分有显著差异吗?
足球运动员的 FIFA 19 评级与他们的 PES 2019 评级有多相似。
“GOOOOOAAAAAL。路易斯·苏亚雷斯多么疯狂的进球。”
在国际足联 19 日巴塞罗那足球俱乐部和拜仁慕尼黑之间的激烈比赛的最后一分钟,我打进了一个 30 码的尖叫。比分现在是 3 比 2,我赢了。我欣喜若狂。另一方面,我的对手很失望。
我简直不敢相信苏亚雷斯站在边线附近被三名防守队员挡住时是如何打进那个漂亮的进球的。一个仍然让我困惑的想法是,苏亚雷斯得分是纯粹出于运气,还是因为他有着令人难以置信的高收视率。
而且我在 YouTube 上看了很多 FIFA 19 上打进的世界级进球,去发现什么样的球员打进了最不可思议的进球。当我观看这些进球时,我注意到大多数进球都是由高水平的球员打进的。
然后,YouTube 的推荐算法让我也看了 PES 2019 上类似的进球。我注意到大致相同的一群高知名度的球员也打进了这些精彩的进球。
因此,很容易得出结论,知名度高的球员更有可能在两个最大的足球游戏平台上创造最佳进球。由于这两款游戏的玩家表现有很强的相似性,我很想知道【FIFA 19 和 PES 2019 上玩家的评分是如何密切相关的。
因此,我决定进行一项研究,以找出 FIFA 19 评级和 PES 2019 评级之间是否存在显著差异。
获取数据集
我必须获得包含执行项目所需功能的最佳数据集,所以我使用 Kaggle 通过这个链接获得 FIFA 19 数据集,并在这里获得 PES 2019 数据集。
使用 IBM Watson Studio 上的 Jupyter 笔记本,数据集被加载并清理,以确保它们包含所有需要的列。
A snapshot of the first five rows of the PES 2019 transformed dataset.
A snapshot of the first five rows of the FIFA 19 transformed dataset.
两个数据集都被重新设计后。运行了多个代码来合并两个数据集,删除重复的行,以降序排列玩家的评级,并重命名列。
以下是用于执行上述过程的一些代码:
要合并两个数据集:
df_combo = pd.merge(df_pes2, df_fifa2)
df_combo1 = df_combo
要删除重复的行:
df_combo2 = df_combo1.drop_duplicates(['Player Name'],keep='first')
要按降序排列合并的数据集并重命名列,请执行以下操作:
df_combo3 = df_combo2.sort_values(by = "FIFA Overall Rating", ascending = **False**)
df_combo3.reset_index(inplace = **True**)
df_combo3.drop("index", axis = 1, inplace = **True**)
df_combo3 = df_combo3.rename(columns = {"Overall Rating" : "PES Overall Rating"})
显示特定列时合并两个数据集的结果如下所示:
The first 20 rows of the merged dataset showing Player’s name, FIFA 19 ratings, PES 2019 ratings and age.
根据合并数据集的前 20 行,与 PES 2019 球员相比,FIFA 19 球员预计将获得更高的评级。
探索性分析
对于新形成的数据集,下一步是查看数据集中的重要列如何相互作用。因此,创建了两个正态分布图,显示 PES 2019 评级和 FIFA 19 评级的正态分布情况。然后,构建第三个正态分布图来结合前两个。
A normal distribution graph of PES 2019 players’ overall ratings.
A normal distribution graph of FIFA 19 players’ overall ratings.
A normal distribution graph comparing how both graphs are normally distributed.
根据图表,FIFA 19 的平均评分为 68.19,低于 PES 2019 的平均评分 70.32。然而,FIFA 19 的标准差为 6.84,高于 PES 2019 的标准差 6.13。
标准差的值表明,FIFA 19 球员的评级比 PES 2019 球员的评级更分散。这个结果可以在第三张图中观察到。
结果呢
为了找出 PES 2019 评级和 FIFA 19 评级之间是否存在显著差异,进行了一系列任务。首先,创建一个散点图来显示两组之间的相互关系。
A scatter plot of PES 2019 ratings vs FIFA 19 ratings.
根据散点图,PES 2019 评级和 FIFA 19 评级之间似乎存在非常积极的关系。然后,计算相关系数和 p 值。下面是用于获得结果的代码和结果本身的快照。
The results of the correlation coefficient and p-value of the FIFA 19 and PES 2019 ratings.
皮尔逊相关系数是 0.8744,因为 0.8744 的值意味着正的强相关,所以是可疑的。p 值约为 0.0。p 值小于 0.05,因此 FIFA 19 评级和 PES 2019 评级之间存在显著差异,即使它们相关性极强。
甘人会梦到假图像吗?
深入研究图像取证:区分真实图像和伪造图像的努力
Barack Obama is one of the most popular characters for puppeteering
众所周知,现在很难区分真实媒体和虚假媒体。可能是文本、音频、视频或图像。
每种媒体都有自己的伪造方法。虽然伪造文本(仍然)主要是以传统方式进行的,但伪造图像和视频已经向前迈出了一大步。我们有些人甚至觉得再也分不清什么是真的什么是假的了。如果说两年前, photoshop 之战 sub-reddit 是伪造图像的艺术状态,photoshop 专家是这一领域的奇才,那么新技术已经改变了很多事情。
你可能听说过一些尖端的伪造方法,它们严重威胁着我们对什么是真什么是假的感知: 深度伪造 技术允许在每个视频中种植每张脸,不同的re——制定 技术允许随心所欲地移动每张脸:做出表情、说话等。而这仅仅是开始。
Deep fake — planting Hillary Clinton on her impersonator
Re-enactment — making a face talk
最近,我非常投入这个领域:我已经开始与一家名为 Cyabra 的伟大初创公司合作。Cyabra 是一家反假新闻和反机器人的初创公司,因此,它的任务之一是将假图像与真图像进行分类,专业术语是图像取证。
如你所料,这是一项具有挑战性的任务。正如许多网络安全/欺诈检测任务一样,保护者似乎总是比伪造者落后一步。在图像伪造中,情况甚至更复杂,因为新的伪造技术每天都在出现。
那么解决 hits 任务的正确方法是什么呢?在每一项安全任务中,保护者都必须考虑所有可能的已知的 T21 威胁,此外还有攻击者意想不到的未知威胁。
让我们考虑一下防止窃贼入室:你知道窃贼可以破门而入,打破窗户、后门等。所以你把所有的入口都锁上了。但是你也应该放一个运动探测器,以防窃贼从一个未知的缺口进入,你仍然可以发现他。
在网络安全领域,特别是在数字图像取证领域,这意味着你必须以最高的准确性解决所有已知的伪造方法,以及一些通用的异常检测方法。由于如上所述,图像伪造技术正在经历一种繁荣,后一种方法变得更加重要。
有哪些图像篡改技术?
首先,让我们讨论一下我们在处理什么。
摄影锻造几乎和摄影本身一样古老。在下面的图片中,你可以看到一张被篡改的 19 世纪的照片:
更多的例子可以在哈尼·法里德的数字取证圣经——书中找到。
“手动”伪造—Photoshop
随着数码摄影的出现,图像篡改变得越来越容易和常见:最常见的一种被称为“拼接”和“复制-移动”,或大多数人所说的“Photoshop”。
这些方法包括将一幅图像的一部分移植到另一幅图像中。为了让它看起来更真实,伪造者还会做一些数字修饰。这些技术的结果可能很难用肉眼区分。
修图本身也是一种篡改方式,尤其是在时尚照中。
如前所述,photoshopping 并不总是容易辨别,但使用一些方法,将在稍后讨论,研究人员在事情的顶部。然而,技术让事情变得更难(或者更容易,取决于你站在哪一边)。具有讽刺意味的是,深度学习成为图像分类的主要方法,也允许一种新的、开创性的伪造物——生成模型。
基于生成模型的方法
自 2014 年出现一般敌对网络以来,很明显,图像伪造将永远不会相同。一个算法从字面上从零开始创造一个图像(例如一张脸)的能力既令人惊讶又令人恐惧。
GANs results throughout the years (none of the above is a real person)
在他 2014 年的开创性工作中,Ian Goodfellow 从概念上展示了在小规模(28 X 28)下创建逼真的人脸是可能的。这一概念很快成为现实,2018 年底,Nvidia 研究人员推出了能够以高分辨率创建超现实人脸的。但这远不是对 GAN 的唯一研究:令人印象深刻的是,研究人员做了不同的调整,创造了新的假图像。我们只能想象这种技术的未来,但同时,让我们看看其他变体的一个不完全详尽的列表:
CycleGan
2017 年,2 部令人惊艳的作品出自阿列克谢·埃夫罗斯实验室— pix2pix 和 CycleGan 。你可以在我之前的帖子中读到它们。
这两个作品都允许将图像从一个领域“复制”到另一个领域:将马转换成斑马,将狗转换成猫等等。
********
假视频——重现
Nicholas Cage as Marlon Brando as The Godfather
除了创建假图像,深度学习技术更进一步,允许创建假视频。
这个领域的真正转折点(和许多其他场合一样)不是技术,而是文化。2018 年 1 月左右,Reddit 上开始出现高质量的假视频。他们中的许多人将尼古拉斯·凯奇的脸植入不同的场景,但并不是所有人都是 SFW。这立即引发了媒体对这一领域的关注(以及世界末日的预言)。
**但深度伪装并不孤单:最近这种技术激增,它们在真实性和易于训练方面变得越来越先进。从玩具“换脸”app 开始,通过 face2face 、深度造假、综合奥巴马、**、到最近三星的少数镜头说话头像。
目前在这个领域最令人印象深刻的工作(目前,事情进展很快)是深度视频肖像— 在这个工作中,研究人员使用了一种多步骤的方法,来“操纵”一张全脸。他们首先从源视频和目标视频中提取面部特征,如姿势、表情、眼睛坐标等,然后使用编码器-解码器生成一个假视频,不仅可以控制嘴部运动和面部表情,还可以控制头部运动。
Deep video portrait
数字取证
因为这个帖子不是关于图像生成,而是关于我们如何检测它们,在看到一些伪造技术后,我们想检查一下防守团队提供了什么。如前所述,数字取证方法可以分为三种。良好的检测操作应结合使用以下各项:
- 基于特征的 —在某一类(或多类)伪造品中存在一种伪造品的情况下——大多适用于经典方法。
- 监督学习 —使用深度学习分类器(主要是 CNN)来学习某些类型的伪图像—适用于经典方法以及生成模型,例如 GANs。
- 无监督/通用——试图捕捉真实图像的一些本质,以检测新类型的伪造(模型以前没有见过)。这可以看作是一种异常检测。
所有上述方法都有其优点和缺点,但由于生成方法变得更加现实,2 和 3 变得更加突出。
我们在上一部分中目睹的篡改技术全部(或大部分)都是由深度学习社区提供的公开可用的。然而,它不必永远保持这种状态:在随后的几年里,不同的公司和政权将有自己的秘密技术,这是非常合理的。
基于特征的
2004 年,哈尼·法里德和阿林 波佩斯库发表了第一篇关于使用数字文物识别假图像的作品。数码相机具有不同的伪像,这些伪像源自摄影硬件、软件或特定于图像的压缩技术。因此,发现这些假照片的数字方法的出现只是时间问题。法里德和波佩斯库使用了一种特殊的相机过滤器(CFA)来识别图像的虚假部分。
从那以后,出现了更多的手工制作技术:
使用 JPEG“签名”
JPEG 是数字媒体中最常见的图像压缩协议。你可以在这里阅读它的细节。简而言之,每个图像都有自己的编码方式来优化文件大小。可以利用不同图像的编码差异来检测伪造图像(拼接)。这里有一个这样工作的例子。
Splicing artifacts caused by JPEG compression
相机伪影
如前所述,数码相机在硬件或软件中也有其制品、结构。每个相机制造商、型号或软件版本都可能有自己的签名。比较图像不同部分的这些特征或相机噪声可能会产生一个好的分类器。
摄影艺术品
与上面的逻辑相同,篡改图像可能会扭曲照片的自然条件。使用这种特征的数字测量(例如照明、“像差”)在伪造检测中也是有用的。
生成模型工件
当前的生成模型也遭受已知的伪像,有些甚至是可见的,如不同的不对称,奇怪的嘴的形状,不对称的眼睛等等。这些人工制品在这个作品中被利用,使用经典的计算机视觉将假图像与真图像分开。然而,考虑到生成模型的进步,这些人工制品不一定存在于明天的赝品中。
Asymmetric eyes in GAN face
所有上述方法都是伟大和聪明的,但是一旦暴露,他们就可以被伪造者所穿透。这就是机器学习的用武之地:它有点像一个黑匣子,可以在伪造者不知道其细节的情况下学习假图像。
监督深度学习
随着深度学习的兴起,研究人员开始使用深度网络来检测虚假图像是很自然的。
直观上,很容易从不同类型的伪造类中获取图像,并开始训练分类器和检测器。让我们来看看一些备受瞩目的作品。
使用新 conv 层的通用图像处理检测
在这项工作中,研究人员设计了一个特殊的卷积层,它通过对过滤器施加约束,旨在捕捉操作,而不是图像语义内容。经过对中值滤波、高斯模糊等不同修图方法的测试,该方法达到了> 95%的准确率。这项工作的目的是通用的,然而,据称它的设计仅限于 photoshopping 和篡改,而不是 GANs 之类的。****
Mesonet
Mesonet 是一部专注于也许是最痛苦的问题的作品:篡改视频中的人脸。具体来说就是 face2face 和 deep fakes(见上图)。由于视频(特别是数字化的)本质上是一系列图像,研究人员使用深度网络解决这项任务,并使用非常标准的网络获得了良好的结果。总之,这项工作除了是最早解决这项任务的工作之一之外,并没有什么特别之处。
甘实验
正如我们前面所看到的,甘人只是不断出现。训练一个模型来区分真实图像和特定的 GAN 并不困难。但是为每根训练一个模型也是不切实际的。**
一些研究人员非常乐观,试图将一个分类模型推广到不同的 GANs,这些 GANs 与他们所接受的训练不同。换句话说,他们在一种 GAN(PG-GAN—style GAN 的前身)上训练了一个深度网络,并试图在另一种 GAN(DC-GAN,WGAN)上进行推断。
正如预期的那样,结果表明,即使研究人员进行了预处理,也没有任何普遍性。
还有很多类似的方法,但概括起来——意思是,识别从未见过的伪造品,学习研究需要开始变得更有创造性。
通用方法
我们知道,深度学习不仅仅局限于朴素的分类器。有许多种 un/self/semi-supervised 模型可以处理少量数据、n 次拍摄和其他任务。
让我们来看看用什么样的思路来解决“万能假像”的问题。
自洽性
这种方法的一个很好的例子可以在作品 打击假新闻:通过学习自洽的图像拼接检测 中找到。这篇文章来自阿列克谢·埃夫罗斯的工作坊,大部分人都知道他在自我监督技术方面的工作。这部作品与他早期的作品有一些相同之处。研究人员整合了一个 4 步工作流程,其中他们:
- 学习预测图像的 EXIF元数据。*
- 将图像分割成许多小块,比较每一对的预测 EXIF 值。
- 看起来具有不匹配的 EXIF 值的切片将被分类为取自不同的图像,因此该图像将是假的。
- 分类将用于提供移植区域的热图。
A detection of “spliced” Keanu Reeves
****但是什么是 EXIF 呢?在数字媒体中,图像(和一些声音文件也是如此),EXIF,可交换图像文件格式,是一种元数据签名的文件。图像的 EXIF 应该包括相机(或扫描仪)型号、原始图像大小、照片属性(闪光灯、快门打开时间)等等。
显然,并不是所有的网上照片都有完整的 EXIF,尤其是那些造假的照片。这正是研究人员参与预测每个图像/补丁的 EXIF 的原因。现在你可以看到,这项任务在某种程度上是无人监管的,因为有大量的在线图像和现成的 EXIF 可供学习。更准确地说,使用了 40 万张图像来训练这个模型。
该模型在 photoshopped 图像上取得了良好的结果,但令人惊讶的是,它在 GaN 生成的图像上也取得了一些成功。
法医转移
Luisa Verdoliva 是一名意大利研究人员,她和她的团队拍摄了一些有趣的照片来推广图像取证。在这个作品中,他们训练了一个有点不同的模型,这将有望更具普遍性。他们所做的是使用自动编码器,这是一种旨在将图像“收缩”成向量,然后重建它的网络。这个向量被训练成分类器来确定图像是真是假:
A scheme of the forensic transfer autoEncoder
他们还尝试迁移学习:在数据集 A 上训练他们的网络,用数据集 B 的一个小子集重新训练它,并尝试在数据集 B 上进行推断。
他们在几个数据集上来来回回地做这项工作,并得到合理的结果(75-85%的准确率)。这些结果优于其他网络(其中一些在上面的监督学习部分讨论过)
ForensicTransfer — an example transfer learning results
噪声印迹
来自上述团队的另一种无人监督的方法,类似于自洽,试图预测图像碎片之间的 PRNU 噪声(一种特定类型的相机噪声)。它报告了多个数据集的最新结果(平均马修斯相关度为 0.4,而自洽度为 0.33)。
A set of predictions: noise print on the right. EXIF-SC is self-consistency.
深度假动作旋转
考虑到以上所有情况,似乎通用方法必须更积极地解决生成性伪问题。他们确实做到了:一些研究人员抓住机会,试图创造出某种甘将军猎人。这意味着能够识别 GAN 生成的图像,而无需对其种类进行专门培训。让我们来看看其中的几个:
学习在野外检测假的人脸图像
在一篇有点仓促的文章(只有 4 页)中,研究人员使用非耦合的图像对来训练一个深度网络,以对相同/不同的图像进行分类(真实和真实,假的和假的,真实和假的),这种有点天真的结果在不同的 GANs 上得到了合理的结果,尽管对所有的 GANs 都进行了训练。
GANs 会留下人工指纹吗?
在本文中,Luisa verdolva使用她最喜欢的噪声图(PRNU),用不同的训练数据集来尝试和表征几种不同的 GAN 模型(PG-GAN,cycle-GAN)。他们的成功表明,实际上每个 GAN(达到训练集水平)都有自己的噪声指纹,类似于相机的噪声指纹。不幸的是,这种方法对检测假图像的帮助主要是理论上的,至少目前是这样。
作品分类
最终,我们可以交叉生产锻造和检测方法,并将大多数方法放入一个(或多个)盒子中:****
在我们在 Cyabra 的工作中,我们面临许多上述挑战,因此我们采用类似的策略:使用监督方法来检测已知的伪造品,同时进行调整和测试,希望能推广到其他伪造品。
不知何故,也许令人惊讶的是,我们已经发现一些通用或半通用的方法可能出乎意料地有效。例如,发现自洽工作,(通过一些调整)可能是有效的分类 GAN 创建的图像。
摘要
这就是了,如果你已经到达这里,你就成功地穿越了图像和视频取证的泡沫领域。
正如我们在上面看到的,大部分工作都集中在对特定篡改进行分类的方法上。然而,一般的方法是新的,仍然是稀疏的。
很明显,这个领域很快将不再是研究人员和爱好者的狭窄领域,而是开始涉及普通人——他们希望重新获得辨别真假的能力。
军备竞赛不会很快停止,但我们应该期待看到法医们齐心协力,想出一些更好的方法来反击伪造者。
我希望你喜欢阅读这篇评论!欢迎随时 关注 我,并查看我的网站—www.shibumi-ai.com
热门歌曲有什么共同点吗?
使用 Python 分析 Spotify 的数据
Source: unsplash
当你登录 Spotify.me 时,你会得到一个个性化的摘要,说明 Spotify 是如何通过你在 Spotify 上听的音乐来理解你的。这是非常酷的!
作为一个经常听音乐、喜欢摆弄数据的人,这启发了我,让我看看是否可以分析自己的音乐。
我也很好奇,想知道化妆是否有某些成分会影响歌曲。是什么让他们变得酷?为什么我们会喜欢热门歌曲,热门歌曲是否有一定的「DNA」?
目标
这让我试图用这篇文章中 Spotify 的数据来回答两个问题:
- 我的音乐播放列表是什么样的?
- 热门歌曲中有什么共同的音频属性吗?
工具
幸运的是,有非常简单的工具可以帮助我们连接到 Spotify,检索数据,然后将其可视化。
我们将使用 Python 3 作为编程语言, Spotipy ,Python 库允许你连接到 Spotify Web API ,我们将使用 plot.ly 和 Seaborn 进行数据可视化。
资料组
每年年底,Spotify 都会编辑一个当年最常播放的歌曲列表,这个列表有 100 首歌曲。我使用的数据集已经在 Kaggle 上可用:2018 年 Spotify 热门曲目。Spotify 的前 100 首歌曲似乎是一个合理的数据集,可以考虑作为我们的热门歌曲,你不觉得吗?
我们开始吧!
首先,你需要在developer.spotify.com创建一个账户。之后,您可以直接访问 Spotify Web API 控制台,开始探索不同的 API 端点。
注意:我在整个项目中使用的代码的链接在博文的末尾。
在连接到 Spotify Web API 之后,我们将使用 Spotipy Python 库创建一个 Spotify 对象,然后我们将使用它来查询我们的 Spotify 端点(我知道有点满嘴😃).
*import spotipy
from spotipy.oauth2 import SpotifyClientCredentials**from spotipy import util**cid =”Your-client-ID”
secret = “Your-Secret”**client_credentials_manager = SpotifyClientCredentials(client_id=cid, client_secret=secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)*
我的播放列表的探索性数据分析
这是数据科学中最重要的步骤之一。我们的目标是了解我的播放列表中的音乐类型,检索任何有趣的观察结果,并将其与 2018 年 100 首最佳歌曲的音频特征进行比较。
绘图艺术家频率
Artists in my playlist by frequency
通过观察这个直方图,我们可以看到艺术家在我选择的播放列表中出现的频率。
音频功能
现在我们来看看这个播放列表中歌曲的音频特征。Spotify 已经整理了 Spotify 上每首歌曲的 音频功能 列表!下面是我们将使用的功能的摘要:
乐器性:预测一个音轨是否不包含人声。“Ooh”和“aah”在这种情况下被视为乐器。Rap 或口语词轨道明显是“有声的”。乐器度值越接近 1.0,轨道不包含人声内容的可能性就越大。
能量:这是一个从 0.0 到 1.0 的度量,代表强度和活动的感知度量。通常,高能轨道感觉起来很快,很响,很嘈杂。例如,死亡金属具有高能量,而巴赫前奏曲在音阶上得分较低
acoustic ness:0.0 到 1.0 之间的音轨是否声学的置信度度量。1.0 表示音轨是声学的高置信度。
活跃度:检测录像中是否有观众。较高的活跃度值表示音轨被现场执行的概率增加。高于 0.8 的值表示该轨迹很有可能是实时的。
语速:“语速检测音轨中是否存在口语单词”。如果一首歌曲的语音度高于 0.66,它可能是由口语词组成的,0.33 到 0.66 之间的分数是一首可能同时包含音乐和词的歌曲,而低于 0.33 的分数意味着这首歌曲没有任何语音。
可跳舞性:“可跳舞性描述了一首曲目在音乐元素组合的基础上适合跳舞的程度,包括速度、节奏稳定性、节拍强度和整体规律性。值 0.0 最不适合跳舞,1.0 最适合跳舞”。
效价:从 0.0 到 1.0 的一个量度,描述一首曲目所传达的音乐积极性。具有高价的音轨听起来更积极(例如,快乐、愉快、欣快),而具有低价的音轨听起来更消极(例如,悲伤、沮丧、愤怒)
Distribution of music styles in my playlist
从观察结果来看:
- 我的播放列表中的大多数歌曲都有广泛的可跳性分布,并没有太多的“快乐”歌曲,正如 0.5 以下的歌曲在价中的高频率所示。所以你可以说我喜欢适合跳舞的歌(这是真的!)
- 对于演讲、工具性和一点点 T2 的活力来说,这是一个向下的陡坡。这向我们表明,我的播放列表中的音乐通常不那么有声有色,没有乐器,也很少有现场观众的歌曲。
- 声音度在 0 和 1 之间近似均匀分布,这表明在我的音乐选择中没有对该属性的偏好。(我通常喜欢原声歌曲,但我不会出去寻找一首歌的每一个原声封面)。
- 最后,能量呈现正态分布,两端的尾部表示被添加到我的播放列表的可能性较小。所以基本上我喜欢能量一般的歌。
- 我的歌一般没那么受欢迎-__-
2018 年前 100 首歌曲的探索性数据分析
将数据集从 Kaggle 下载并导入到我们的应用程序后,我开始根据数据集中最受欢迎的艺术家出现在列表中的次数来分析他们。
Artist in Top 100 Songs of 2018 by frequency
2018 年 100 首歌曲中出镜率最高的艺人
Code snippet
Post Malone (src:latimes.com) and XXXTENTACION (src:thesource.com)
现在让我们探索一下我们数据集中前 100 首歌曲的音频特征,看看它们是什么样子的!我们将绘制与播放列表相同的直方图,以便稍后进行比较。
Distribution of music styles in the top 100 songs of 2018
通过观察直方图,我们可以看到前 100 个图表中的曲目是:
- 在可舞性和能量方面非常高,但在活跃度、语速和声音方面很低(我们已经可以看到一些迹象,表明我的播放列表不如前 100 名那么酷😞).
例如,来自我们数据集的德雷克的“在我的感觉中”,是高度可跳舞的,并且也具有相对高的能量值。
最后,我决定绘制一个前 100 首歌曲的雷达图,并叠加我的播放列表的音频特征,以便于比较。
Spotify 的前 100 首歌曲是蓝色的,而我的热门歌曲是橙色的。
结论
所以我想我在这篇文章的开头已经找到了我的两个问题的答案。我想看看我的音乐是什么样的,似乎有流行歌曲的基因。我的播放列表中的音频功能有点类似于前 100 首歌曲,但我有更多的原声歌曲和一些现场歌曲。
想做一首热门歌曲?确保它适合跳舞,有很多能量和一点价值(积极和感觉良好的氛围)。
我对结果很满意,但我想在另一篇文章中继续这个话题。
以下是我推荐的下一步:
- 了解如何使用您的播放列表来确定您的个性,并推荐您可能喜欢的广告。
- 使用机器学习聚类算法,K-Means,看看哪些歌曲与你的相似,你可以使用它来最终发现你可能喜欢的新歌。
- 使用机器学习根据歌曲的音频特征预测歌曲的“流行度”
你可以成为中等会员享受更多这样的故事。
你可以在 GitHub 上获得整个项目的代码。
感谢 艾尔文·钟**阿什里斯 和John Koh就此主题发表的有益文章。Spotify和 Spotipy,感谢给力的 API 和库!**
我有足够的钱退休吗?
蒙特卡罗模拟如何用于模拟退休不确定性的定量探索
如果你想自己运行代码,你可以在我的 Github 这里找到它。
这个例子只是为了说明的目的。 它不应以任何方式、形态或形式被视为财务建议 。
“我以 20%的信心估计,有 75%的可能性你的钱足够支付你的退休金。”
等等,什么?太令人困惑了。
没有财务顾问会对你这么说——但我希望他们会这么说。客户需要他们雇佣的人的信心和确定性,金融专业人士从第一天起就接受培训,自信地传递他们的信息(毕竟,他们试图出售一项服务)。
但事实是,定量模拟某人的退休极其困难,充满了不确定性和未知性。
这种差异的主要驱动因素是以下方面的不确定性:
- 投资回报
- 通胀
- 退休后你每年会花多少钱
- 你会活多久(以及你会有多健康)
- 黑天鹅——难以预测的事件,如金融危机、战争、白鬼等。
- 模型误差(错误估计和假设产生的误差)
- 社会保障、所得税税率、资本收益税率等的变化。
下面我们就用 蒙特卡洛模拟 来详细定量探究一下 1 号到 4 号的车手。其他的也很重要,但是我不认为你想读一篇 45 分钟的博文;)所以我们将把它们留到下一次。
在这篇文章的结尾,我们将会更好地理解为什么尽管分析和计算能力有了显著的进步,却回答了“我到底需要多少钱”这个古老的问题依然充满挑战。
我们示例的假设
Our client, Randy
假设我们为一家名为 Lazy Advisors,LLC 的金融公司工作。我们的一个相对更懂财务的客户,兰迪,来做他的退休评估。以下是他的统计数据:
性别和年龄:男,55 岁
婚姻状况:单身(准备交往)
目标退休年龄:60 岁
投资组合价值:500,000 美元(他将不再存钱)
我们为 Randy 管理的投资组合相当保守——60%投资于股票(美国大盘股和新兴市场),40%投资于美国国债。
由于我们公司很懒(因此得名),我们只投资 5 种资产:国库券(基本上是现金)、国债、标准普尔 500、大宗商品和新兴市场股票(中国、巴西、俄国等)。).
我们使用均值方差投资组合优化来估计最优投资组合的投资权重(最高性价比),有以下约束条件:
- 权重总和必须为 1
- 权重必须介于 0 和 1 之间(无卖空)
- 对标准普尔 500、大宗商品和新兴市场股票的配置总和必须为 0.6
我们的优化器生成一个投资组合,其配置如下: 40% 美国国债, 35% 标准普尔 500 指数, 25% 新兴市场股票。预期年名义收益率为 5.1% ,预期年标准差为 10% 。
我今天不会详细讨论这个问题,但请记住,最佳投资组合权重对我们对每种资产类别的预期回报、波动性以及与其他资产的相关性的估计极其敏感。
出于好奇,这里是我们对预期收益和波动性(标准差)的估计。这些估计来自 BNY 梅隆大学的这份报告。
Return and Risk Assumptions
最后,以下是我们对资产类别相关性的估计:
Correlation Matrix Assumptions
投资回报的不确定性
兰迪坐下后问我们的第一件事是,“我不打算在退休前存更多的钱。以我现在所拥有的,你认为我五年后退休时会有多少钱?”
由于我们知道 Randy 的投资组合的预期回报率为 5.1%,而我们又比较懒,我们就给他看下图,告诉他退休时(五年后)他的投资组合的中值将是 63 万美元。
Looks pretty good!
但是兰迪需要更多的信息。他知道中位数只是许多潜在结果中的一个,并想知道他可以预期多少变化。渴望去打高尔夫球,我们叫来了我们的实习生,让他处理数据。在一些巧妙的 Python 编码之后,他向我们展示了这个情节:
Wow, that is a wide range of outcomes!
什么!?我们的实习生会让我们错过开球时间的!我们问我们的实习生他是如何生成这个图表的,他告诉我们:
他使用 蒙特卡洛模拟 对兰迪的投资组合进行了 5000 次模拟,然后绘制了一段时间内的财富中值(蓝线)以及一段时间内的第 5 和第 95 百分位财富(蓝色阴影区域的底部是第 5 百分位财富,顶部是第 95 百分位财富)。
他还提到,他假设兰迪投资组合中的投资回报遵循正态分布(这是一个潜在的危险假设,我们将在未来的帖子中探讨),并根据我们之前分享的关联热图相互关联(Smartypants intern 先生使用 Cholesky 分解使他的随机正态冲击相互关联,详情见代码)。
关于蒙特卡洛模拟的简要说明
在蒙特卡罗模拟中,我们一遍又一遍地运行实验,每次都收集结果(在这种情况下,Randy 60 岁时的投资组合价值)。关键是我们通过一些输入注入了随机性。这里,我们使用相关随机正态冲击来模拟投资回报的波动性。
你可以把蒙特卡洛模拟想象成掷骰子,每个输入的值我们不确定,用一个骰子来表示。我称它们为魔术骰子,因为根据你的需要,它们可能呈现不均匀的分布,或者一些骰子滚动可能是相关的(神奇地!)与其他骰子的滚动。因此,每个单独的模拟只是我们所有神奇骰子滚动的结果。蒙特卡洛模拟只是将我们神奇的骰子滚动许多次的过程(一旦我们完成,我们可以使用蒙特卡洛模拟结果来近似我们试图建模的事物的概率分布,例如 Randy 的投资组合)。
回到兰迪
以前,我们的实习生完全被他的解释搞糊涂了,所以我们瞪着他,要求,“请用简单的英语解释!”
我们勤奋(脾气好)的实习生回答道:
“在我进行的 90%的模拟中,兰迪的投资组合最终价值在 435,000 美元到 884,000 美元之间。”
现在兰迪很担心,“如果其中一个糟糕的场景实现了,那么由此产生的财富够我生活下去吗?”
正当我们要告诉他不要杞人忧天时,我们的实习生大声说道,“兰迪先生,你还需要记住考虑通货膨胀。你现在花的钱可能并不代表你将来需要花多少。”
多。我们的实习生是如此的好…
通货膨胀的不确定性
快速回顾一下— 通货膨胀是指物品(从拿铁咖啡的价格到你付给房东的租金)价格随着时间推移而上涨的趋势。
在退休模拟中,通货膨胀通常被建模为对投资组合回报的拖累。例如,如果兰迪的投资组合名义收益率为 6%(名义=通胀前),而当年通胀率为 3%,那么他的通胀调整回报率将为 6%-3%=3% 。通胀只是偷走了一半的回报!
暂时离开我们和 Randy 的谈话,让我们了解一下通货膨胀是如何驱动退休不确定性的。下面的图表显示,仅仅改变我们的通货膨胀假设(而完全不改变投资回报),我们得到的结果就会有显著的变化。虽然 2%似乎是对未来通胀的合理估计,但其他值也在可能范围内(例如,日本经历了几十年的通缩,美国在整个 20 世纪 70 年代经历了两位数的通胀,大萧条期间经历了严重的通缩)。
Inflation can cause significant variation in wealth outcomes
跑题了,让我们回到我们的客户,兰迪。不幸的是,他现在希望我们模拟他的通胀调整后的退休后财富变化。这样的监工…他也给我们一些更多的信息。Randy 希望每年从社会保障中获得一些钱,所以他估计他每年只需要从他的投资组合中支出 28,000 美元来维持他目前的生活方式。这 28,000 美元是通货膨胀调整后的价值——这意味着如果今年的通货膨胀率为 1%,那么明年 Randy 在名义上需要 28,280 美元。
年度投资组合提款(经通货膨胀调整):28 000 美元
预期死亡年龄:85 岁
所以我们跳上笔记本电脑,开始编码。我们决定将通货膨胀建模为一个正态分布的变量,期望值为 2%,标准差为 1%。此外,为了简化分析,我们忽略了通货膨胀和投资回报之间的相关性。经过一些数字运算,我们得出了下面的图表:
Inflation is quite the drag
我们的实习生向兰迪解释道,“兰迪先生,我们对你 85 岁时财富的中值估计是 81,000 美元……当我们预计你嗯……去世时。所以在我们的中间方案中,你确实有足够的钱。我们还包括了无通胀案例(红线),向你展示我们对通胀的估计是如何对你的财富产生负面影响的。”
“然而,在我们运行的 40%的模拟中(我们运行了 5,000 btw ),您用完了钱!如果你的投资组合枯竭了,你将只有社会保障来度过余生……”
他继续说道:“我还为你做了这个柱状图,以便更好地展示你的财富成果。”(我们的实习生就是这么爱显摆)
That’s a lot of observations to the left of the red line (which denotes $0)
生活费和死亡年龄的不确定性
现在兰迪想知道,如果他想在退休后一直保持盈利,有哪些事情是他绝对必须避免的。
我们的实习生再次大声说道(叹气…),并说:“没有人能保证你在整个退休期间能够保持 28,000 美元的通胀调整支出水平。你可能会遭遇不可预见的医疗费用、更高的税收等。因此,如果你最终增加支出,我们应该看看我们的预测会有什么变化。”
“兰迪先生,我们模拟了如果你退休时花了 38000 美元(而不是 28000 美元)会发生什么。就像之前我们做了 5000 次模拟一样。现在,在我们进行的 76%的模拟中,你最终没钱了(除了社保)!以前你只用了 40%。
If Randy overspends, he is in big trouble
“如果你最终比预期多活了 5 年(而是在 90 岁去世),在我们为你进行的 56%的模拟中,你最终会耗尽金钱****,大大高于之前的 40%(当时我们假设你会在 85 岁去世)。
Living 5 years longer than expected depletes poor Randy’s portfolio
结论
最后兰迪满意了。很担心但是很满足。
他看着我们说。
“我今天学到了一些东西。你可以为我运行数千次模拟(由于投资回报和通货膨胀,这些模拟已经有了自己的方差),但稍微调整一下假设,一切都会再次改变!这就像方差叠加在更多的方差之上!如此多的不确定性…
我们不知道他在说什么,但是我们的实习生给 Randy 看了下面的图表。
High level breakdown of the sources of variance (a.k.a. uncertainty)
“兰迪先生,我们可以把方差分成两部分:已知和未知。我们之前详细探讨过的已知变异来源,来自投资回报、通货膨胀、死亡年龄、支出等的波动。这些变异来源中的每一个都相互叠加,相互复合。但也有‘未知的未知’——造成隐藏变化的东西,我们无法建模,因为我们只是不知道它,或者我们知道它是错的。”
Randy 说他需要几天时间来消化所有的发现,但是他会在一周内和我们的实习生安排一次会面来讨论下一步的工作。似乎我们的实习生偷走了我们的客户。我们决心在未来雇佣更多实习生之前更加努力地思考(我们最初雇佣他只是因为他的拿铁艺术令人难以置信)。
来源:10 年资本市场回报假设,BNY 梅隆
为“gram: Instagram 风格的字幕生成器”而做
使用 Keras CNN-RNN 框架为 Instagram 照片生成标题
卡米尔·鲍曼、塞加尔·杜瓦和埃里卡·中川
1。简介
图像字幕是指使用自然语言处理(NLP)和计算机视觉(CV)生成图像的文本描述的深度学习应用。这项任务需要一种算法,不仅要理解图像的内容,还要生成与其解释相关的语言。我们希望通过专门为 Instagram 图片生成标题来进一步挑战这一挑战。
你会如何描述下面的图片?
一个简单的字幕生成器可以将图像描述为类似于“四个朋友在一个粉红色的房间里”的东西。微软的字幕机器人回答说“我认为这是一群人对着相机摆姿势”。你不也是这么描述的吗?但是如果你想在 Instagram 上发布这张图片,那会是它的标题吗?
Instagram 标题往往比简单的描述符更高级,由双关语、内部笑话、歌词、参考文献、情感和讽刺组成。在某些情况下,字幕可能与呈现的图像完全不相关。在这种情况下,用户@sejaldua99 发布了上面的图片,标题为“奥胡斯走的路 2 crazzyyy”。
我们的工作旨在用特定的词汇和表达方式生成符合特定风格的字幕。为了实现这一点,我们的模型由卷积神经网络(CNN)和长短期记忆(LSTM)递归神经网络(RNN)组成。
2。先决条件
这篇博客文章假设熟悉基本的深度学习概念,如卷积神经网络(CNN)、递归神经网络(RNNs)、梯度下降、反向传播、过拟合、概率、Python 语法和数据结构、Keras 库、TensorFlow 等。
3。数据收集
我们使用从 GitHub 用户@timgrossmann 那里获得的 Selenium 驱动的档案爬虫抓取 Instagram。scraper 为每个 Instagram 用户构建了 JSON 对象,包括帖子信息、位置信息、每个帖子的评论、每个用户交互的时间戳和数字赞等。我们编写了一个简单的脚本来解析我们收集的个人资料目录中的每个 JSON,并从那里提取 Instagram 照片和标题。
我们的数据集由关注我们账户的 Instagram 用户的帖子组成:@camillebowman、@sejaldua99 和@erikaaanakagawa。由于 scraper 需要通过 Headless Chrome 登录 Instagram,我们只能从我们关注的用户和公共档案中获取信息。
network visualization of the data source: 3 core nodes and one degree of follower connections
the code to produce the network visualization above
上面的网络是由 networkx 和 netwulf 库组成的,描绘了我们数据的范围。值得注意的是,因为我们从三个主要的独特人群中收集数据,所以我们引入了一些轻微的偏差。例如,如果我们的神经网络生成了与“约翰·霍普金斯”、“米德尔伯里”或“塔夫茨”相关的标题,这不会太令人惊讶,因为我们每个人都关注了许多来自自己大学社区的用户,而这些用户碰巧发布了关于他们各自校园发生的事件。
我们在两周的时间里收集了数据,整日整夜地搜集用户资料(我的电脑感觉睡眠严重不足)。我们设法从不到 3000 个用户那里获得了 100 个帖子,但是并不是所有来自这些用户的数据都进入了我们的 CSV 文件。事实证明,由于 Chrome 驱动程序的变化、滚动速率错误以及自脚本编写以来的 Instagram 更新,我们的 scraper 相当吃力——准确地说,23%的时间都是如此。
考虑到所有因素,我们使用的 profile crawler 在帮助我们获得一个巨大的数据集来训练我们的神经网络方面仍然非常有用。
4.数据清理
CLEANING
与任何数据科学项目一样,80%的工作是获取数据、存储数据、解析数据和清理数据。JSON 的清理包括文件系统遍历和一些非常复杂的条件逻辑。
summary report: composition of the dataset
我们做了一些深思熟虑的选择来构建一个数据集,我们认为这将最小化偏差,并尽可能提供最多样化的图像-标题对集合。设计选择如下:
- **没有图片,没有说明,收藏:**我们删除了所有没有说明的帖子,丢弃了收藏和视频。不幸的是,这消除了大约 30%的未清理数据集,但相对于我们的大量帖子——总共约 130,000 篇——这并不太昂贵。
- 帖子太少:我们排除了发帖量少于 10 篇的用户,因为一个发帖量少于 3 篇的用户与一个发帖量少于 100 篇的用户相比,其影响力似乎相差了一个数量级,我们希望纠正任何可能引入的偏差。在剔除帖子太少的用户后,每个用户的帖子数量中位数从 21 个飙升到 46 个,这非常接近理论中位数。
- 低粉丝数(low num followers):insta gram 是一个平台,人们喜欢在这个平台上讲述有趣的故事,分享有价值的生活更新。年轻一代的 Instagram 用户通常有两个 Instagram 账户,一个用于以更公开的方式分享照片,另一个用于向更亲密的朋友分享照片和故事。我们想排除这些更小、更私人的帐户,因为这些类型的帐户的标题内容几乎从不与相应的图像匹配。出于这个原因,我们丢弃了所有关注者少于 200 人的用户的帖子数据。
- 非英语:虽然神经网络有令人难以置信的智能潜力,但我们想避免的一件事是用不同语言的字幕混淆我们的模型。想象一下,一个人要花多少时间和精力才能流利地掌握 5 种以上的语言。我们发现不同语言的字幕会成倍增加我们的训练时间,所以我们安装了一个名为 pyenchant 的库,它主要检查一个给定的单词是否在英语词典中。我们规定,如果标题的文本部分(不包括标签和提及)超过 5 个单词,并且超过 80%的单词不在英文目录中,我们会将标题指定为“非英文”并丢弃图像-标题对。只有 300 多个帖子属于这种情况,我们认为我们能够保留类似“更新:我要搬到法国去了。这就是生活。”点击链接查看所有被丢弃的非英语字幕。
pie chart representation of the dataset (blue represents viable data, red represents discarded data)
在丢弃了大约 38%的数据集之后,我们决定简要地研究一下我们的可行数据的组成。我们觉得 Instagram 的标题是独一无二的,因为它们的结构高度流动。也就是说,标题可以由字母文本、特殊字符、标签、提及、表情符号或以上所有内容的组合组成。我们希望量化我们正在处理的内容,因此我们解析了每个标题中的字符,如“#”和“@”,并使用 Python 表情库来筛选表示表情的正确 unicode 符号。按照流行程度从高到低的顺序,标题包含表情符号,然后是标签,然后是提及,然后是引用。不到一半的可用 Instagram 标题不包含任何有意义的特殊字符。
5。网络架构
我们的网络受到了 Jason Brownlee 的 如何从零开始开发深度学习照片字幕生成器 文章的启发。
我们将用于图像分类的卷积神经网络与用于序列建模的递归神经网络相结合,创建了一个为图像生成 Instagram 标题的单一神经网络。
换句话说,我们使用了一个在 ImageNet 数据集上预先训练的 16 层牛津视觉几何小组(VGG)模型来解释照片的内容。我们移除了 CNN 的最后一层,以收集从模型中预测的提取特征,用作生成字幕的 RNN 解码器的输入。
我们还使用了一个标记器来创建一个包含标题中所有字符的“字母表”。与 Jason Brownlee 的文章不同,我们决定在字符级别而不是单词级别进行标记,并包括标点和大写。我们认为这将更好地反映我们试图生成的标题,因为它允许我们保留标题的关键方面(如表情符号和标签),并让我们的网络更好地生成表情符号。然后,我们将每个标题转换成一个数字数组进行编码,每个索引代表一个字符。最后,为了便于训练,我们在每个编码后的字幕前加入了开始序列和结束序列。
preprocessing images and obtaining features vectors from CNN
tokenizing captions on a character level
我们为每个标题创建了输入-输出向量,其中输入是图像的特征向量和标题的前 n 个字符,输出是标题中的 n+1 个字符。我们为字幕向量中的每个字符做了一个输入输出配对。第一个配对是图像和开始序列作为输入,标题中的第一个字符作为输出,最后一个配对是图像和整个标题作为输入,结束序列作为输出。由于我们只能使用 10,000 幅图像进行训练,为了防止我们的输入输出配对数量激增,并限制任何单个字幕的偏差,我们只使用字幕不超过 60 个字符的字幕-图像配对。
然后,我们训练一个长短期记忆(LSTM)解码器作为语言模型,它以特征向量和编码字符数组作为输入,并产生一个编码字符作为输出。
building the layers of the neural network
summary report: structure of our model
6。结果&结论
我们用不同的参数进行了多次迭代。在每一次迭代中,我们的网络最终陷入局部极小值,无论输入什么图像,都会生成相同的标题。以下是我们的一些训练迭代生成的单个字幕的一些示例:
- 我和小夏迫不及待地要当二年级(小夏??我太爱你了,你现在是
- 夏天就是夏天:/D
- 世界最佳周末#thetan。
- 祝我最喜欢的地方州生日快乐!💜😘
尽管预测的结果缺乏多样性,但它们表明我们的网络能够学习和掌握 Instagram 粉丝的语言。它使用了标签、表情符号、标点符号和表情符号。这些标题大多由合法的英语单词组成。我们相信我们在模型质量方面的最大限制是训练的时间。有 1000 个任意长度的标题,这个模型花了两天时间来训练。将标题长度限制在 60 个字符或更少允许我们使用 10,000 张图像,并将训练时间减少到 10 小时。但是需要让模型通宵或全天训练限制了我们测试多次迭代和解决我们遇到的错误的能力。它还阻止了我们用更多的历元和更大的数据子集进行训练,这是我们在课堂上用来提高性能的两种策略。理想情况下,我们将能够使用数据集中 80,000 个图像-标题对中的很大一部分,并且拥有一台超级计算机也很好!
当然,总有办法修改我们的模型来提高精确度:
- 使用更大的数据集
- 改变模型架构
- 超参数调整(学习率、批量大小、层数等。)
然而,如上所述,由于我们的时间和计算能力有限,许多修改都是力所不及的。
尽管我们还有改进的空间,但我们为我们的神经网络感到自豪。它确实了解了一些关于 Instagram 标题的事情,甚至试图创建一个表情符号!显然,它还有一段路要走,但我们希望能激励一些人在未来继续并改进我们的工作。感谢阅读:)
我们所有的代码都可以在下面链接的 GitHub repo 中找到!
训练一个神经网络,使用一组较大的收集的 Instagram 数据为照片生成 Instagram 标题…
github.com](https://github.com/sejaldua/caption-gener8r)
承认
我们要感谢 Ulf Aslak Jensen 博士在他的丹麦留学学院(DIS)课程“人工神经网络和深度学习”中向我们讲授了各种神经网络模型的基础知识,并为我们提供了一些有价值的工具来应对这一挑战。祝贺你最近的博士学位和婚礼!我们还要感谢我们在创建这个项目时参考的许多 GitHub 资源库和在线文章。向开源社区大喊。一如既往,最感谢 StackOverflow 帮助我们这样的白痴每天解决我们的问题。
参考文献
布朗利,杰森。(2019).如何从零开始开发深度学习照片字幕生成器。
格罗斯曼蒂姆。(2019).insta gram-profile crawl GitHub 知识库。
朴,塞斯克&金,秉昌&金,君熙。(2017).关注你:使用上下文序列记忆网络的个性化图像字幕。
用数据做更多事情!
以下是您如何利用数据锁定、赢得和留住客户的方法
企业现在意识到,他们为了实现增长而做出的每一步和每一个决定都是从他们的客户开始的。一家公司留住的客户越多,就越有机会最大化投资回报率。
今天,营销人员主要关注客户的需求,并试图找到满足他们需求的最佳方式,不仅通过他们提供的产品或服务,还通过提供更好的客户体验。然而,要全面了解客户的需求,首先必须努力理解客户的行为。必须考虑客户与品牌的每次互动,以了解客户过去购买特定产品或偏好特定服务的原因。
有几种方法可以研究客户的这些行为模式,例如通过市场调查、在线和离线调查、公司过去的销售和最近的需求趋势。它们有助于积累大量的数据,由于其复杂性,无法通过传统的分析方法进行解释。这些数据可以称为“大数据”
B ig 数据由于其巨大的数量和复杂性,通常很难解释。然而,如果分析得当,它可以为企业提供有价值的见解,反过来,可以帮助营销人员做出周密的决策,制定更明智的战略,通过这些战略,公司可以在正确的时间与正确的客户接触。
充分利用数据还可以帮助企业应对市场不确定性,应对动荡的市场环境。所有这些都可以通过将客户作为企业的焦点来实现。人们可能想知道客户数据如何能帮助一家公司取得如此大的成就。这就是大数据如何帮助公司感知客户及其行为。
1.锁定客户
通过使用数据分析,大数据可以提供与客户的社会经济地位相关的重要信息。通过研究购买者的购买模式,公司可以了解消费者喜欢什么样的产品,或者他/她购买某一特定产品的频率?据福布斯报道,
“监督预测性营销工作至少两年的绝大多数高管(86%)表示,他们的预测性营销提高了投资回报率(ROI)。”
借助大数据,营销人员还可以根据人口统计和心理特征,利用一些不可识别的个人信息,如个人目标、兴趣、抱负、生活方式、习惯和日常活动,对目标受众进行细分。因此,细分是在短期内获得合适客户的第一步。细分后,企业可以将目标定位于允许其运营可行性的群体。锁定目标可以帮助公司提高工作效率,使他们只关注那些对他们的产品真正感兴趣的顾客。
2.筛选出忠诚的顾客
并非每个顾客都对一个品牌忠诚,因此必须为潜在顾客、对该品牌漠不关心的顾客、可能转向其他品牌的顾客以及已经与该品牌建立了持久关系并成为企业品牌传播者的顾客制定不同的商业策略。
营销人员普遍认为最有价值的顾客是那些在你的产品上花了很多钱的人;但是,这是不正确的,因为客户并不总是保持忠诚,如果他们有机会,可能会转向其他品牌,在价格,质量,甚至经验方面。
大数据有助于企业决定他们的忠诚客户,并通过计算买家的几个属性来识别 MVC。以下是可以用来从客户数据库中发现忠诚客户的许多指标中的几个。
1。顾客终身价值: CLV 表明了公司与顾客之间的关系。它告诉企业顾客在你的产品上花了多少钱。
2。Purchase Order: 计算客户在一次典型购买中花费的平均金额。此外,它还可以帮助营销人员对需求高或受众更喜欢的产品做出投资决策。
3。顾客满意度:顾客满意度告诉营销人员顾客对产品或服务的满意程度。它有助于发现不满意的客户群体,并提醒营销人员要减少产品或流程中的缺陷,以提供出色的客户体验,减少不满意的客户数量。
这些指标可以帮助企业将精力集中在可以改进的关键点上,从而赢得忠诚的客户群。
3.品牌的定位
大数据使业务与一致,其中和如何在市场中定位其品牌。它可以告诉营销人员何时何地做广告。研究发现,当消费者看到 TVC 或脸书或其他媒体上的在线广告时,他们不会对该品牌产生兴趣。
*0.05%的点击率意味着每 100 人中只有 5 人从事在线展示广告。数据可以回答诸如“哪个地区的客户对我的产品感兴趣?”。通过了解顾客的心理特征,如果顾客对价格敏感,商家可以决定是否应该打折;或者应该通过改进产品来专注于价值游戏。这些信息可以帮助企业决定【如何】 和【何处】*来定位他们的品牌,通过利用他们从数据中收集的洞察力来提供最佳的客户体验。
判决
有了大数据,对于今天和明天的企业来说,可能性的视野似乎是无限的;然而,只有正确的分析才能引导企业从过去的趋势中推断信息,并用它来预测市场的未来模式和趋势。像 Google Analytics 这样的工具,主要被许多营销人员用来衡量他们公司的在线存在,并了解他们的数字立场。数据已被证明对企业特别有用,这意味着越来越多的企业正在这场数据战争中赢得竞争。
对于今天的企业来说,数据提供了巨大的资本化空间。只有时间才能告诉我们,哪些公司将最大限度地利用数据,并且比竞争对手更了解客户,因此与竞争对手相比,他们可以为客户提供相对高端的客户体验。
不要急于编码。企业人工智能项目的 4 个原则。
Think together before doing alone, an ant principle.
不,人工智能自己不能理解。不,数据科学不是自动的。敏捷方法并不意味着混乱。一句话,不,这不是魔法。在匆忙编码之前需要做什么?在这里,我与你分享我从职业和个人项目中学到的 4 条原则。
尽可能清晰地制定业务目标
做数据科学是一个绝对的趋势,虽然是一个强大的工具,但有时会被过度使用和不适应。这就是为什么在开始任何一行代码之前,我们必须确定我们在寻找什么来证明/改进,以及我们有什么样的数据来实现这个目标。在编码之前定义一个清晰的业务目标,是企业中一个重要的关键特性,然后这个定义将被用来定义我们的解决方案的评估指标。
必须准备好数据
大多数数据科学项目都是为了确保我们拥有数据。然后,我们必须确保数据准备好用于我们的模型。缺失值和异常值是我们必须处理的事情,以便我们的模型具有良好的数据质量。数据准备所需时间常常被低估。这不是机器学习中最性感的部分,但通过 EDA 过程准备和了解你的数据,可以让我们挑战我们试图帮助的工作专家,然后对主要问题有更好的理解(有时会发现之前需要解决的其他问题)。
精确定义交付
任何数据科学家的主要目标都是让一个模型在评估指标上表现良好。但是,我们必须确定我们正在寻找的最终交付是什么,以及在开发开始时,这种交付将如何在技术上集成到全球解决方案中。我们是在寻找一个 MVP 吗?这是一个 shell 脚本执行吗?Web 执行?我们想要什么样的动态?我们想要什么样的硬编码?这只是演示还是一个生产项目?所有这些问题都必须在编码前回答。
没有黑盒效应
机器学习将被应用到越来越多的行业的各个层面。从这个假设出发,我们必须确保所有人都能够很好地理解机器预测什么以及为什么,机器学习的可解释性是关键。伦理问题在我们的社区中越来越受到重视,我坚信“无黑箱效应”将允许我们通过预测人工智能在未来可能面临的伦理问题来提供解决方案。我强烈建议任何数据科学家在其基础数据科学管道中添加一个 ML 可解释性部分,就像我们对功能工程或度量评估所做的那样。
有什么建议吗?
请在评论区分享你自己的建议。😃
有大公园的西雅图邮政编码比没有大公园的有更高的狗密度吗?
用 Python 的 SciPy 进行假设检验。统计包加上哪里可以找到微型山羊
前几天,当我在寻找宠物密度最高的西雅图邮政编码时,我发现自己在想,“在有大型公园的邮政编码中,狗的密度会更高吗?”和“这些山羊在哪里?”
深入到第一个问题,假设检验将帮助我们确定两组在统计上是否有显著差异。
对于假设检验,我们使用以下步骤:
- 定义无效假设和替代假设
- 识别测试统计和概率分布
- 指定重要性级别
- 计划、收集数据和计算
- 拒绝或未能拒绝零假设
定义无效假设和替代假设
无效假设——作为一名持怀疑态度的科学家,我们希望我们两个群体之间没有差异。这是无效假设。
H0:与没有大型公园的西雅图相比,在有大型公园的西雅图邮政编码区,狗的密度没有增加。
替代假设——我们两个群体之间存在差异。我们无效假设的替代方案。
H1:与没有大型公园的西雅图相比,在有大型公园的西雅图邮政编码区,狗的密度增加了。
识别测试统计和概率分布
测试统计有几个选项,包括:
- Z 检验 —正态分布。适用于:具有大样本量或已知总体方差的正态分布数据
- T 检验 —尾部比正态分布重的学生 T 分布。适用于:未知方差,少于 30 个样本
- 卡方检验 —决定分类变量是否独立
- F 检验 —使用 ANOVA,检验基于方差的分组是否有意义
更多详情此处。
由于我们在每个人口中只有 14 或 15 个邮政编码,T 检验更适合于这种分析,因为它最适用于样本量小于 30 的情况。
除了检验统计量,如果您使用 z 检验或 t 检验,您需要确定您是在做单尾检验还是双尾检验。双尾检验是检验人群中的差异——或者大于或者小于(例如,男孩的身高与女孩的身高是否不同?).单尾测试用于确定一个单一方向的差异(例如,男孩比女孩高吗?).
在我们的例子中,我们的零假设表明有大公园的邮政编码并不比没有公园的邮政编码有更高的狗密度。因此,我们将使用单尾 t 检验,因为我们的假设只是询问在比较不同大小公园的社区时是否存在单向变化。
注意:与双尾 t 检验具有相同显著性水平的单尾 t 检验将拒绝比单尾 t 检验更少的零假设,因为它“分割”了“高于”和“低于”可能性之间的不确定性,您可以在下面的图表中看到这一点。请注意,单尾 t 检验的临界 t 值小于双尾检验的上限临界 t 值。
指定重要性级别
显著性水平是基于所提供样本的群体之间没有差异的概率。5%或 1%的显著性水平(alpha)对应于备选假设的 95%或 99%的置信区间。请记住,在显著性水平为 5%的情况下,预计 20 个重复实验中有 1 个会得到错误的结果。
在这种情况下,我决定 5%的显著性水平/95%的置信区间适合我的目的。特定的显著性水平通常是你的行业、公司等的标准,所以一定要使用它,不要随便选一个。注意:调整您的显著性水平和置信区间以适应您的结果不是一个好的做法(例如,我们发现这种差异在 87%的置信区间下是显著的)。
计划、收集数据和计算
一旦有了假设、测试统计数据和显著性水平,就可以准备制定数据收集计划了。基于您期望的两个总体之间的差异大小和您的显著性水平,您可以确定您需要多大的样本来拒绝零假设,如果它是假的。更多信息见这里。
首先,按照计划,收集所有的数据。同样,在收集数据的同时不断计算测试统计量,等待达到显著性阈值,然后取消其余的数据收集,这不是一个好的做法。我们不只是试图拒绝零假设,而是实际上试图获得真相。遵循你的计划,收集所需数量的数据,然后然后计算,从而避免诱惑。
为了我的调查,这是西雅图狗密度的柱状图,按邮政编码排列:
看到没有大公园的邮政编码的平均狗密度大于有大公园的邮政编码的平均狗密度,我可以/应该停止我的调查。从统计上来说,或者从任何角度来说,在有大公园的邮政编码区,狗的密度并不高。我真的想知道这是否会随着人均价值而改变…下一个调查!出于入门/提醒的目的,我们将继续这个过程:
接下来,计算你的 p 值。查看“统计测试”的scipy.stats
文档,找到适合您情况的文档。在本例中,我正在对两个独立的人群进行 T 检验,所以我将使用ttest_ind
。查看文档,请注意,它期望两个群体之间的样本大小相等,因此我将随机对较大的群体进行采样,以便将其调整为较小群体的大小。由于我们不知道方差是否相等,我们将把equal_var
参数设置为False
,以执行韦尔奇 T 检验,该检验不要求方差相等,而学生的 T 检验则假定两个总体之间的方差相等。
from scipy.stats import ttest_ind, t
import numpy as nprand_no_parks_zips = np.random.choice(no_parks_zips, size=14)
result = ttest_ind(rand_no_parks_zips, parks_zips, equal_var=False)
print(result)
退货:
**Ttest_indResult(statistic=-0.9046044635337662, pvalue=0.3745636286751721)**
这提供了双边检验的 p 值。为了获得单侧 p 值,我需要使用 t 统计量,并将其与我的 0.05 显著性水平 t 统计临界值进行比较。
要在 python 中获得 t 统计临界值,请使用scipy
的百分点函数(百分点)
p = .95 # 1-alpha
df = 13 # degrees of freedom (n-1)
critical_t_value = t.ppf(p, df)
print(critical_t_value)
我们得到了:
**1.7709333959867988**
视觉上,我们有:
要查看 p 值,您可以使用累积分布函数来查找曲线下达到 t 统计量的面积,并将其从 1 中减去,以获得零假设为真的概率,并且具有大公园的邮政编码并不比没有大公园的邮政编码的狗密度高。注意:如果你在另一边做单尾测试(比如狗的密度较小),你不需要从一个中减去。
p_value = 1 - t.cdf(result[0], df)
print(p_value)
我们得到了:
**0.808933235528686**
这里我们看到 t 统计量远低于临界值(当我们寻找大于替代假设时),p 值远高于我们的显著性水平。因此,我们不能拒绝零假设,即有大公园的西雅图邮政编码没有比没有大公园的更大的狗密度。在 0.05 的显著性水平上,这两个群体之间没有统计学上的显著差异。
如果 t 统计量超出了临界 t 值(或双尾检验的-值),并且 p 值小于我们选择的显著性水平,我们将拒绝零假设,而支持替代假设。请注意,p 值和 t 统计检验将始终表明相同的结论。您不需要两者都检查。
Beckham enjoying Green Lake. Photo Credit: Kevin Honold
我由此得出的结论是,西雅图人喜欢他们的宠物,不管它们离一个大公园有多近。虽然我的小狗贝克汉姆肯定很喜欢它靠近绿湖的位置,但是不管你离一个大公园有多近,有很多方法可以让你的宠物保持活跃和健康。
调查愉快!
正在寻找 38 只注册的小型山羊…
我不会猜到拉韦纳/韦奇伍德/枫叶/等等。成为迷你山羊的热土,但是很迷人!
一如既往,你可以查看我的 GitHub 回购了解更多细节/代码。