在新冠肺炎时代,我们如何使用机器学习
我们有些人工作的大楼是空的。就每天的工作时间而言,技术招聘并没有放缓,而是增加了。人力资源部没有改变招聘流程。然而,我们改变了候选人的排名方法,并从根本上改变了我们进行面试的方式。
在这个艰难的市场中,哪一个是 ML 的候选人?资料来源:联合国人类住区规划署
我们如何改变技术招聘的背景
我们喜欢认为,作为一个组织,我们的核心专长是预测金融市场未来一个季度(短期赌注)到五年(长期赌注)到二十年(世代赌注)的走向。分裂出来的团体模拟不同大扰动的影响。我们的预测是乐观的,因为公司不采取包括假设扰动的立场。
扰动是混乱的。当不同的研究成员/小组达成共识时,意外的扰动被确定为已经开始。那么(se)扰动变成包括在财务决策制定策略中。
扰动的几个例子,从低到高的概率,是外星技术转让,1 千兆吨流星撞击,10 兆吨流星撞击,实用量子计算,泛流行病,以及全球平均温度上升 3 摄氏度。
还有许多其他的扰动情况。我列举了几个来展示产品系列。新冠肺炎大流行和全球平均气温上升 3 摄氏度是我们金融决策政策的一部分。
我想澄清我的角色:
- 我是 不是 理财政策的一部分。
- 我的内部职位是机器学习科学家。
- 我只是一个有权写下我们技术招聘流程变化的人。
意见如何捕捉、塑造我们在招聘方面的变化
我详述了我们是如何决定我们正在做的事情的。
意见库由我与您分享的意见组成。
这篇文章是基于我的观点,收集了我的组织的意见。我分享与这篇文章相关的观点。 ( 我认为所有收集到的意见目前都是公开的。 )
六周前,我们在意见 - 库中捕获了可信的意见和假设。(我们几个老前辈偶尔会说漏嘴,把这个叫做知识库。)有一个字段将每个条目标记为意见或假设。大约 30%的收集条目有一个任意(随机)的标签意见或假设*。*
我们很多人都有朋友、亲戚和熟人,他们是护士、医生、病毒学家、生物物理学家、生物工程师,甚至还有流行病学家。在 6 周的时间里,我们从这些人那里收集了个观点。
我们的机器学习( ML-dev )小组,我是其中的一员,被指派分析和报告来自意见库的数据。由于部署时间最短,仪表板报告使用我们专有的时序 ML 框架和 Streamlit 创建。
下面的文章详细介绍了我们最近使用 Streamlit 的一些经验。
Streamlit 2020 路线图
towardsdatascience.com](/streamlit-can-not-yet-replace-flask-the-streamlit-2020-roadmap-64840564acde)
在第一个测试版发布后,我们发现事实、假设和观点改变或撤回*。为了降低维护成本,事实被标记为观点,每天开始时有一个基于委员会的筛选。*没有给每个条目分配权重,而是留给各种下游应用程序。
从意见库中随机转储的意见
以下参考文献,在我看来,对普通大众来说是更好的来源。这些参考资料为我们的意见库生成了条目。
政治家和商业领袖:你应该做什么,什么时候做?
medium.com](https://medium.com/@tomaspueyo/coronavirus-act-today-or-people-will-die-f4d3d9cd99ca)
真正减少的唯一方法是保持社交距离:让人们尽可能地呆在家里,尽可能长的时间,直到这种情况消退。
我们越是推迟病例,医疗系统就能更好地运转,死亡率就越低,在感染前接种疫苗的人口比例就越高。
如果领导人给我们争取时间,未来 18 个月会是什么样子
中等。](https://medium.com/@tomaspueyo/coronavirus-the-hammer-and-the-dance-be9337092b56)
从意见库中选择相关条目:
- 有报告称,年轻人检测出受感染,并在大多数情况下表现出症状。注意:大多数美国人,25 岁以下,表现出症状,因为测试规则选择了症状。
- 佛罗里达海滩因 2020 年春假而关闭。
- 新冠肺炎检测必须大于 1000 人中的 5 人。
- 在美国,医院病床的容量在两到七周内就被超过了(95%的可能性)。随着一些州开放新的医院床位设施,参赛人数变化很大。
- 估计死亡率在 0.5%(有准备的)和 5%(无准备的)之间变化。进入是可变的,因为它取决于不确定和变化的起始条件和费率。
- 2(最小)米到 4.5(最大)米是社交距离指导。
- 在美国,权威人士称一个集群中有 2 到 25 个人。
- 封锁正在拉平中国的感染曲线。
- 检测和自愿的社会距离拉平了韩国的感染曲线。
- 欧盟和英国的自愿封锁;
- 检测是韩国 1000 人中的 4 人;
- 新冠肺炎是无法治愈的。
- 一个估计是用于新冠肺炎 T2 T3 的预防性疫苗将在 12 个月后问世。
- 新冠肺炎正在变异。
- 新冠肺炎变成了一个类似于流感季节的季节性事件。
[## 流行病计算器
编辑描述
gabgoh.github.io](http://gabgoh.github.io/COVID/index.html)
新冠肺炎时代的工作环境和技术招聘流程是怎样的
企业新冠肺炎政策执行社会距离。
我们有一个时间表,将应用开发部门( AppDevD )过渡到一个地理上和时间上分布的工作环境。效仿的榜样是成功的 阿帕奇软件基础 。
因为**新冠肺炎,**时间线已经被废弃。当我们远程工作时,我们正在执行、改进和适应。一个似乎不太需要改变的领域是我们的技术招聘流程。
对社交距离所做的更改以斜体突出显示。首先,我详述了 WA-dev (Web-App) groups 流程。
WA-dev 简历的排名得分取决于:
- 提到使用两个或更多的 HTML、CSS、Javascript、Flask、和有时Django;
- 使用短语全栈,后端,前端或各种其他关键字。
- 一个或多个开源网络应用/项目;
- 任何远程开发的经验。
注意:步骤 1、2 是自动解析的。随机抽取 10%进行评分。将人工评分与不同模式的自动评分进行比较。根据不同的群体,如果候选人篡改了他们的简历,这不一定是一件坏事。
这一过程的下一个重要步骤是:
- 对代码进行粗略的检查;
- WA-dev 运行他们的后期开发工具,并在其中最有趣的工具上运行任何包含的测试;
- 后续电话验证候选人编写了代码;
- WA-dev 向候选人发送一个过去的(或现在的)编码任务。候选人必须在最多三天内返回代码。候选人被告知 WA-dev 更关心方法而不是完整的代码解决方案。他们应该至少提供一个代码框架和足够的代码解决方案来展示候选人的编码原则。(我们被辅导说纪律不是风格 — 提示 — 提示。)**
- 前 3 个月是试用期,小组决定是否继续保留成员资格。
机器学习( ML-dev )组(只是一个组)遵循 WA-dev 招聘步骤。我们确实会根据候选人的资历来改变和增加这些步骤。ML-dev 为出版物、演讲、开源软件包或框架作者放置了不同的排名。我们从未在提交的简历中看到 Streamlit 。如果我们做到了,那当然很好,但现在让它成为行业流行语可能还为时过早。
结论
我们使用新冠肺炎观点库来帮助金融市场预测小组。执行管理层根据金融市场预测小组的意见制定政策。预测和短期和长期政策已经完成。意见库和所有报告已被删除,因为它们现在已经过时。
现在公众可以获得更多的资金和资源。以下是一些我们喜欢的:
随着冠状病毒疫情的出现,世界各地都有人死亡。但是病例和死亡的轨迹不同…
www.nytimes.com](https://www.nytimes.com/interactive/2020/03/21/upshot/coronavirus-deaths-by-country.html?te=1&nl=the-upshot&emc=edit_up_20200323&campaign_id=29&instance_id=16997&segment_id=22618&user_id=48dc240842d821249f8f2b3816220aca®i_id=7726097920200323)
约翰·霍普斯金冠状病毒新冠肺炎全球病例由系统科学与工程中心仪表板
[## ArcGIS 的操作仪表板
编辑描述
www.arcgis.com](https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6)
新型冠状病毒的基因组流行病学。
[## 吉兆
编辑描述
nextstrain.org](https://nextstrain.org/ncov?c=clade_membership&l=radial)
这篇文章记录了我们在组织中所做的改变,以及这些改变如何改变了我们的组织。我已经详细描述了我们技术招聘过程中的温和变化。 WWW 上有文章会救命。继续读下去,尽你所能保持安全,保护他人的安全。**
网络搜集如何帮助我从学习走向教学
还有一个快速教程
卡特曼戈斯塔-www.freepik.com 创建的业务向量
我在今年 2020 年初开始学习数据科学的 python。我基本上没有任何编程背景,除了很久以前在大学里用 C++ 类编程。虽然我可以在互联网上找到一些很棒的(有时是免费的)课程,但总有一些情况下,你需要向社区寻求一些帮助,有时是因为你不理解一些概念或技术,有时是因为你正在尝试一些更复杂的东西。我过去经常(现在仍然)这样做。
但是通过第五个月的学习,我开始发现这个问题的另一面:那些回答问题的人。我当时(现在仍然)使用一个名为 Dataquest 的在线平台。他们有一个很棒的社区,人们在那里分享项目,寻求帮助等等。在那里我发现,无论你是一个多么初级的人,总会有人比你更初级。
所以,我现在已经在他们社区活跃了一个月左右。在我被他们的新冠肺炎经济资助奖学金录取后,我开始更频繁地去那里。被接受参加这个项目让我对在每个人都经历的困难时期得到帮助感到非常感激,所以我觉得我应该付出更多的努力来帮助别人。然后,我开始每天访问社区,看看我是否能帮助一些人。
我的想法是,如果我可以帮助其他学生解决他们的问题,我不仅可以帮助我回答问题的学生,还可以帮助最初帮助我的平台。
虽然我已经学习了将近六个月,但我仍然不是 python 专家或有经验的数据科学家或类似的人。我只是一名数据科学学生,所以我不确定我是否有能力回答人们的问题。但事实证明,我是。当我继续回答问题时,我注意到我也在帮助自己,因为我必须重温我已经学过的东西,甚至学习新的东西来回答问题。
过了一段时间,我发现自己每天都要在浏览器中输入几次 community.dataquest.io ,并且乐在其中。所以我想了一个方法来优化我的时间和我提供的帮助:我写了一个 web scraper,每当有新的问题在社区中发布时,它都会通过电子邮件通知我。
这样做的好处是:
我练习刮痧;
·我不再需要一直手动查看网站;学生的问题可以更快得到回答(当然,如果我有能力回答的话)。
我知道,当你是一个初学者,陷入困境时,很容易失去动力,特别是如果你依赖社区来获得一些答案,并且需要等待几个小时甚至几天才能得到一个允许你继续前进的答案。
坏处是…嗯,我没看到。每个人都赢了。
在我让我的 scraper 工作之后,我觉得把这个想法和代码分享给社区中的每个人会很好。我分享的目的只是试图让更多的人帮助别人,展示刮擦(这很有趣)可以很简单,也许会让一些人对它感兴趣,当然,分享我所做的。这个想法很受其他用户和版主的欢迎,我被鼓励去发表这个想法,并接触更多的读者。所以,我现在在这里。
说够了,让我们编码吧!
在我让这个刮刀开始工作后,我每天回答的问题数量激增,现在你已经知道了这个刮刀背后的历史,让我向你展示我是如何让它发生的。
首先,代码是使用谷歌 Chrome 来废弃和 Gmail 来发送电子邮件。当然,你可以使用其他人,但这取决于你。
我们将从导入我们将使用的库开始。你可能已经熟悉了熊猫和时间的睡眠功能。除此之外,我们将使用 smtplib 发送电子邮件和 selenium 这是一个非常强大的工具来废弃网站。如果你喜欢网络抓取,selenium 是必须的。
此外,你需要下载Chrome web driver(如果你使用 Chrome 的话),并把它放在你的脚本所在的目录下。
现在,我们将编写 send_email 函数来发送电子邮件。这个函数非常简单,即使你从未使用过 smtplib。
我们将使用 try 和 except 子句,这样当脚本无法连接到 Gmail 服务器时就不会出现错误。
现在,我们去刮痧吧。我们将使用一个无限循环来保持代码一直运行,在代码结束时,我们将使用 sleep 来设置我们希望 scraper 在每次检查新帖子之间等待的时间。从现在开始,一切都在里面,而里面。
因此,首先我们设置 selenium 并实例化驱动程序对象。然后我们告诉驱动到获取网站。如果你将 option.headless 设置为 False 你就可以实际看到你的浏览器打开并进入网站废弃数据,这真的很有趣。
现在我们在社区中,这是我们感兴趣的网站部分。如果你懂 HTML,你就会知道这是一个表格。如果你没有,你不需要担心:
社区的问答部分
我们将使用 pd.read_htm l 来读取驱动的页面源。这将返回一个列表,以数据帧的形式显示网站上的所有表格。由于我们抓取的页面只有一个表(我们想要的表),我们将把列表的第一个(也是唯一的)元素赋给我们的 table 变量:
这是表*😗
虽然你在这里看不到它,但它有你在之前的图像中可以看到的所有列。另外,请注意,第一个主题似乎是我们不感兴趣的固定主题,因为我们正在寻找新的主题。然后,我们将使用切片来选择前十个主题,不选择固定的主题,只选择主题*、回复和活动列。*
我们还需要将 activity 列分成两列,第一列只包含数字,另一列包含表示时间单位(小时或分钟)的字母:
现在我们有了这个:
我将一个新主题定义为 scraper 运行前不到 10 分钟创建的没有回复的主题。因此,我们将创建new _ topics**data frame*,只选择满足这些要求的行。然后,我们将使用形状方法将新主题的数量分配给变量 num_new 😗
然后我们有:
工作基本上完成了。我们将使用一个 if 语句来检查新帖子的数量是否大于零,如果是,我们将设置主题、消息并调用 send_email 函数。如果它不大于零,它将只打印“没有找到新主题。”。
主题包含新帖子的数量,消息正文包含new _ topics*data frame 以便我们可以看到新主题的标题。该消息还包含 url,因此我们只需点击即可直接进入社区。
之后,我们将使用 sleep 让我们的代码在再次检查网站之前等待。我把它设置为十分钟,我认为这是一个公平的时间量。*
最后,要从您的 Gmail 帐户发送电子邮件,您必须允许在您的帐户中使用不太安全的应用程序。我没有为此提供链接,只是谷歌"不太安全的应用程序谷歌",你会看到如何做。
仅此而已。你可以随意使用这段代码,它是完全免费的。完整的代码可以在 GitHub 库中找到。
我希望你喜欢这一点,它可以在某种程度上有用。正如我所说的,我只是想帮助或者激励人们,并且认为我至少完成了其中的一项。
如果你有问题,有建议,或者只是想保持联系,请随时通过 Twitter 、 GitHub ,或者 Linkedin 联系。
人工智能将如何加速药物发现?
(并导致新的、更便宜的药物和患者健康的改善)
药物研发的成本
众所周知,药物开发过程非常困难;一种药物从识别出分子到临床应用平均需要 10-15 年的时间,只有大约 3%的初始药物能够顺利通过。一种药物从开发到最后一关失败的成本通常超过 10 亿美元。
对于那些不熟悉药物开发途径的人,这里有一个有用的概述:
如图所示,药物可能在许多阶段失效。早失败比晚失败好得多,所以任何预测哪些药物会失败的能力都是有利的(正如我们将看到的…).不过这样做可能相当困难。
更糟糕的是,开发药物的成本在增加,而开发的成功率在降低(见 Eroom 定律)。制药公司在公众中的名声也不好,各种各样的法规限制不正当的行为(比如人为抬高价格)。总而言之,这为制药公司的发展创造了一个相当棘手的局面…
机器学习:隧道尽头的光?
那么,机器学习(ML)如何提供一条出路呢?在我看来,它从根本上归结于其卓越的模式识别能力,这种能力可以应用于多种方式。让我们按照时间顺序,从这个角度来看它的具体用法。
1.候选人识别和选择
考虑到测试一个分子需要投入大量的时间和成本,花大力气鉴别和选择分子是有意义的。传统上,相当经验性的方法更受青睐,如一系列的溶解度、蛋白结合强度、细胞毒性、分子稳定性等测试。已经尝试采取更“第一原理”的方法,基于我们当前对疾病的理解来识别潜在的分子。虽然很吸引人,但这样做很困难,部分原因是生物系统的复杂性。refoxcib 就是这种的一个例子。
通过模式识别,ML 提供了识别候选人的新方法。逻辑是这样的:候选项越多,其中包含好候选项的概率就越大。一种新颖的方法是使用 GANs ,它训练一个网络来生成与现有分子相似的潜在分子。最近的一个成功案例是去年发表在《自然》杂志上的。
另一种方法是使用“知识图”,它将靶标、抑制剂和疾病之间的关系表示为相互连接的节点。基本原理是,通过研究已知的关系,我们可以识别新的关系。例如,如果已知分子 1 抑制信号蛋白 x、y 和 z,并且对疾病 A 有效,并且已知分子 2 也抑制 x、y 和 z(但是到目前为止仅用于治疗疾病 B),那么分子 2 可能也对疾病 A 有效。这是一个过于简单的例子,但是 ML 可以使这种逻辑在规模上得以遵循。Benevolent.ai 已经描述了他们如何使用这种方法来识别目标。
按照咒语 快速失败 的说法,尽早识别将失败的分子是值得的。ML 可以通过与已知的相互作用进行比较来预测不期望的相互作用。
2.优化临床试验
ML 还可以从几个方面提高临床试验的成功率。一种方法是通过识别(通过模式识别)更有可能对药物产生成功反应的亚群。这增加了试验的成功率,从而增加了药物进入市场的可能性。虽然许可证可能更具体,但可以通过后续试验进行扩展。
对于所有这些方法,值得注意的是,机器学习的结合并不能保证新分子的成功开发。药物和生物学是一个非常混乱的行业,我们离完全模拟这些系统还有很长的路要走。然而,这些技术确实提供了增加的可能性和缩短的时间尺度,当在大量试验中扩大规模时,可以产生非常大的影响。
药物发现的新时代?
鉴于采用这种方法的新潜力,现有的制药公司正在将 ML 纳入他们的管道,许多以基于 ML 的发现为中心的新公司已经涌现。这似乎是一个拥挤的空间,正如这些 43 家制药公司和 221 家 T2 初创企业的名单所显示的。然而,我认为这反映了问题的范围,以及从解决方案中获得的经济回报。
那么,到目前为止,我们看到了多少成功呢?我知道有四种新药已经通过了研发+/-临床前阶段,它们明确使用了 ML 技术。这些是;一种来自深度学习药物再利用的抗生素,一种强迫症药物和一种抗纤维化药物,这两种药物都是使用 GANs 鉴定的,还有一种来自多伦多初创企业 Deep Genomics 的威尔逊氏病的靶标。
据我所知,还没有一个完全通过管道,这可能反映了技术发展的新近性。
看看事情如何发展会很有趣。我认为将 ML 纳入药物发现标志着一个转折点。大玩家需要适应(我知道他们是这样),与更小、更敏捷的初创企业合作的空间很大。我们将会看到新公司从老巨头那里夺取了多少市场份额。
在过去,药物发现往往是为了找到下一个“重磅炸弹药物”,它提供了指数级的投资回报,从而弥补了所有的失败。我希望 ML 能够改变这种情况,并使药物开发更加平衡。
考虑到健康的根本重要性,以及大量未经治疗的疾病,应该有足够的馅饼可供分配。时间会告诉我们该地区 221 家(还在增加)初创企业的表现。我怀疑其中的失败是不可避免的,最终可能归结于投资者的支持或早期的胜利;后者是由运气和技巧共同决定的。
即使有加速的承诺,药物发现仍然是一个相对长期的游戏,药物有多年的开发和生命周期。所以我们可能要等一段时间,看看到底会发生什么。
无论哪家公司赢了还是输了,我相信患者都可能从更好的药物供应和更低的相关价格中受益。这让我很乐观:)
你怎么看?如果你对这个问题有什么想法,我很想听听。
**更新:**写完这篇文章后,我和一位在大型人工智能药物研发公司工作的朋友进行了一次讨论,他解释说,许多初创公司的商业模式是向更成熟的制药公司提供候选药物,这些公司将进一步发展。这样,事情就平衡了;较小的初创公司不承担进行昂贵试验的财务责任,较大的公司可以接收更多使用人工智能进行智能筛选的候选药物。
链接
在准备本文时,我遇到的最有用的资源是:
- 加州大学圣地亚哥分校的这两门课程分别是关于药物发现和药物开发的。它们有点过时,但为理解传统工艺提供了良好的基础。我发现仅仅以 2 倍的速度观看视频就能给出一个坚实的介绍,整个课程大约需要 1-2 个小时。
- “用人工智能寻找新药” —《自然》杂志的一篇社论,概述了截至 2019 年 12 月的发展状况
- 三篇报告使用人工智能发现药物的论文(据我所知已发表的仅有三篇): 【深度学习能够快速识别有效的 DDR1 激酶抑制剂】【ATP7B 变体 c . 1934t>G . p . met 645 arg 通过促进外显子 6 跳过【抗生素发现的深度学习方法】****
英超将如何收场?
用 XGBoost 预测并完成英超积分榜。
Ajay Meganathan 在 Unsplash 上拍摄的照片
英超联赛,连同几乎足球世界的其他部分,都暂停了。目前还不清楚联赛是否会继续。但如果继续下去,会如何收场?在这篇文章中,我将创建一个模型,预测英超联赛的结果,以完成联赛表。利物浦会赢得联赛冠军吗?曼联会晋级欧冠吗?还有哪些队伍会被拒绝?这些是将在本文结尾回答的一些问题。
资料组
为了创建一个有用的数据集,我们需要大量的匹配统计数据。对我们来说幸运的是,【http://www.football-data.co.uk/】是一个提供从 2005 年到今天每一场英超比赛统计数据的网站。在这里,我下载了每个季节的数据,并将其合并成一个数据集。
import pandas as pd# Dataset df = pd.read_csv('pl_data.csv')df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: **5592** entries, 0 to 5591
Columns: **144** entries, Div to SBA
dtypes: datetime64[ns](1), float64(131), int64(1), object(11)
memory usage: 6.1+ MB
该数据集包含 5592 个观察值和 144 个变量。但是,我们不会在最终模型中使用任何变量。相反,这些变量将用于创建新的变量,如“主队的平均进球”。事实上,该模型将主要依赖于平均变量。由于目标是预测剩下的比赛,变量如‘Form*’将依赖于早期的预测。为了更清楚地说明这一点,假设我们有变量’ Form ’ (衡量主队或客场队在最近五场比赛中的得分),我们希望预测本赛季的最后一场比赛。那么变量将只取决于早期预测的结果。这可能会扭曲预测,从而扭曲最终的排名。但是,在创建常规投注模型时,变量如“Form”*是至关重要的,应该添加。
完整的数据集最终有八个变量,分为主场或客场球队和赛季或总平均水平。这使得变量总数为 822 = **32。**这些是变量:
- 平均进球数。
- 平均射门次数。
- 平均出手次数。
- 平均角数。
- 平均犯规次数。
- 平均黄牌数。
- 红牌的平均数量。
- 半场平均进球数。
当然,再增加几个变量也无妨。但是现在这样就可以了。下面是为主队和客场队创建总平均变量的代码(在计算“赛季平均”变量时使用类似的方法)。
# Create the columns #
df['avg_g_hmt'] = df['gameId']
df['avg_g_awt'] = df['gameId']
df['avg_s_hmt'] = df['gameId']
df['avg_s_awt'] = df['gameId']
df['avg_sot_hmt'] = df['gameId']
df['avg_sot_awt'] = df['gameId']
df['avg_c_hmt'] = df['gameId']
df['avg_c_awt'] = df['gameId']
df['avg_f_hmt'] = df['gameId']
df['avg_f_awt'] = df['gameId']
df['avg_yc_hmt'] = df['gameId']
df['avg_yc_awt'] = df['gameId']
df['avg_rc_hmt'] = df['gameId']
df['avg_rc_awt'] = df['gameId']
df['avg_htg_hmt'] = df['gameId']
df['avg_htg_awt'] = df['gameId']gameid_col = df.columns.get_loc('gameId')
HomeTeam_col = df.columns.get_loc('HomeTeam')
FTHG_col = df.columns.get_loc('FTHG')
FTAG_col = df.columns.get_loc('FTAG')
HS_col = df.columns.get_loc('HS')
AS_col = df.columns.get_loc('AS')
HST_col = df.columns.get_loc('HST')
AST_col = df.columns.get_loc('AST')
HF_col = df.columns.get_loc('HF')
AF_col = df.columns.get_loc('AF')
HC_col = df.columns.get_loc('HC')
AC_col = df.columns.get_loc('AC')
HY_col = df.columns.get_loc('HY')
AY_col = df.columns.get_loc('AY')
HR_col = df.columns.get_loc('HR')
AR_col = df.columns.get_loc('AR')
HTHG_col = df.columns.get_loc('HTHG')
HTAG_col = df.columns.get_loc('HTAG')
# Iterate over all teams #
df = df.sort_values(by = ['Date'])
mylist = list(set(df['HomeTeam']))
count = 0
for i in mylist:
count = count + 1
print(count,": Creating variables for", i)
homegamesindex = df['HomeTeam'] == i
awaygamesindex = df['AwayTeam'] == i
df_1 = df[homegamesindex]
df_2 = df[awaygamesindex]
df_3 = pd.concat((df_1,df_2))
df_3 = df_3.sort_values(by = ['Date'])
for j in range(len(df_3)):
gameid = df_3.iloc[j,gameid_col]
if df_3.iloc[j,HomeTeam_col] == i:
H_or_A = "H"
else:
H_or_A = "A"
y = j - 1
# Create the count-variables #
avg_g = 0
avg_s = 0
avg_sot = 0
avg_c = 0
avg_f = 0
avg_yc = 0
avg_rc = 0
avg_htg = 0
while y > -1:
# Home or away in earlier games #
if df_3.iloc[y,HomeTeam_col] == i:
avg_g = avg_g + df_3.iloc[y,FTHG_col]
avg_s = avg_s + df_3.iloc[y,HS_col]
avg_sot = avg_sot + df_3.iloc[y,HST_col]
avg_c = avg_c + df_3.iloc[y,HC_col]
avg_f = avg_f + df_3.iloc[y,HF_col]
avg_yc = avg_yc + df_3.iloc[y,HY_col]
avg_rc = avg_rc + df_3.iloc[y,HR_col]
avg_htg = avg_htg + df_3.iloc[y,HTHG_col]
else:
avg_g = avg_g + df_3.iloc[y,FTAG_col]
avg_s = avg_s + df_3.iloc[y,AS_col]
avg_sot = avg_sot + df_3.iloc[y,AST_col]
avg_c = avg_c + df_3.iloc[y,AC_col]
avg_f = avg_f + df_3.iloc[y,AF_col]
avg_yc = avg_yc + df_3.iloc[y,AY_col]
avg_rc = avg_rc + df_3.iloc[y,AR_col]
avg_htg = avg_htg + df_3.iloc[y,HTAG_col]
y = y - 1
# If the team plays home or away #
if H_or_A == "H":
df['avg_g_hmt'].loc[df['gameId'] == gameid] = avg_g/(j+1)
df['avg_s_hmt'].loc[df['gameId'] == gameid] = avg_s/(j+1)
df['avg_sot_hmt'].loc[df['gameId']==gameid]=avg_sot/(j+1)
df['avg_c_hmt'].loc[df['gameId'] == gameid] = avg_c/(j+1)
df['avg_f_hmt'].loc[df['gameId'] == gameid] = avg_f/(j+1)
df['avg_yc_hmt'].loc[df['gameId'] ==gameid]= avg_yc/(j+1)
df['avg_rc_hmt'].loc[df['gameId'] ==gameid]= avg_rc/(j+1)
df['avg_htg_hmt'].loc[df['gameId']==gameid]=avg_htg/(j+1)
else:
df['avg_g_awt'].loc[df['gameId'] == gameid] =avg_g/(j+1)
df['avg_s_awt'].loc[df['gameId'] == gameid] =avg_s/(j+1)
df['avg_sot_awt'].loc[df['gameId']==gameid]=avg_sot/(j+1)
df['avg_c_awt'].loc[df['gameId'] == gameid] =avg_c/(j+1)
df['avg_f_awt'].loc[df['gameId'] == gameid] =avg_f/(j+1)
df['avg_yc_awt'].loc[df['gameId'] ==gameid]=avg_yc/(j+1)
df['avg_rc_awt'].loc[df['gameId'] ==gameid]=avg_rc/(j+1)
df['avg_htg_awt'].loc[df['gameId']==gameid]=avg_htg/(j+1)
既然数据集已经完成,让我们来探索它吧!首先,它不应该包含任何 NA:s
all(data.isna() == False)Out[36]: True
完美!现在数据集被分为训练数据集和测试数据集。但是首先,第一轮比赛的所有比赛都被删除了,因为所有的平均变量都为零。此后,为“主场目标”和“客场目标”分别创建一个 XGBoost 模型。这将使我们能够预测即将到来的比赛的结果。在 XGBoost 中,可以绘制变量的重要性,下面是“家庭目标”模型的图。
**from** xgboost **import** plot_importance**plot_importance(**home_mod**)**
正如预期的那样,有几个变量贡献很大,有几个贡献不太大。“客场球队的平均角球数”和“客场球队的平均黄牌数”似乎是最不重要的。而“主队的平均角球”和“主队的赛季平均进球”似乎是最重要的。这完全有意义,因为我们希望预测主队的进球。客队会有多少角球并不会显著改变得分的概率。然而,所有的变量仍将存在于最终的模型中,因为这不会有太大的计算量。
利物浦会赢得联赛冠军吗?
由于利物浦已经领先 25 分,而且只剩下 9 场比赛,他们只需要再赢两场比赛就可以举起奖杯。这是模型如何预测利物浦即将到来的比赛。
预测:利物浦最后一场比赛
轻松点。利物浦在最近的 9 场比赛中以 7 胜 1 平 1 负的成绩轻松夺冠。利物浦不仅是赢家,他们是风格上的赢家。他们以 104 分打破了目前 98 分的积分纪录(曼城,2018/19)。这将是他们 30 年来的第一个 PL 冠军(89/90 赛季)!
那么,其他队表现如何?预测完剩下的比赛,积分榜就这样结束了。
2019/2020 赛季英超联赛预测表
冠军联赛的门票将流向利物浦、曼城(但是他们被禁赛了,所以谁知道呢)、切尔西、曼联,也许还有莱斯特,因为曼城被禁赛了。“前六名”中的另外两支球队,阿森纳和托特纳姆,分别排在第六和第七位。不幸的是,预测下赛季参加锦标赛的球队是布莱顿、阿斯顿维拉和诺维奇。
这种模式似乎有利于大型团队。例如,莱斯特现在在积分榜上排名第三,曼联排名第六,但该模型预测曼联最终会超过莱斯特。类似的事情也发生在布莱顿,它排在第 15 位,但预计会降级。我的假设是,该模型有利于大球队,因为大多数变量取决于球队在许多赛季前的表现。当然,大球队将从中受益。毕竟,他们被认为是大牌,因为他们在过去几个赛季表现出色。如果有人试图自己做这件事,这是一个可以改进的领域。
你有它!利物浦赢了,切尔西下赛季打冠军联赛,诺维奇只拿到 21 分。也就是说,如果我的模型 100%正确。没有模特是这样的。
乔治·特罗瓦托在 Unsplash 上的照片
赢得我的第一次在线数据科学黑客马拉松如何改变了我的生活
我成为数据科学家的旅程
Arif Riyanto 在 Unsplash 上拍摄的照片
2018 年初,我只是一名追求计算机工程的学生,对以哪个领域为职业目标毫无概念。我有各种选择,但不知道应该关注哪一个,即区块链、Android 开发和数据科学。
你面临过类似的情况吗?这个博客是给你的。
什么对我最合适?只有我能回答这个问题。于是,我勇往直前,捡了几个技术,给了一个月,然后实现。
一旦我开始研究数据科学,直接研究基于数学的东西,摆弄数字并从中发现一些价值是很有趣的。随后的旅程改变了我的生活,并使我专注于这个领域。
我需要发生一些事情来证明“数据科学是我的选择。因此,为了便于理解,我会按照要点来描述一切
学习阶段
使用任何工具的第一步都是学习该技术的概念。
我在 2018 年初开始学习数据科学的概念。总结一下我学到的东西
- 在 Udemy,NPTEL 和 Coursera 上上过一些数据科学课程。
- 学习了各种预处理技术,使用哪个模型以及如何调优 hyperparameter。
- 在各种在线数据集上尝试了上述事情。
即使在这个领域已经工作了 6 个多月,我仍然对“这个领域适合我吗”心存疑虑。
在线黑客马拉松
学习之后,是时候让我将它付诸实践,看看我与其他数据科学家相比处于什么位置。我开始参加 Analytics Vidhya 上的在线数据科学黑客马拉松。在体验了竞争性黑客马拉松的工作方式后,我在 7 月份参加了数据至上黑客马拉松。
截图来自 datahack.analyticsvidhya.com(我的名字:jsiddhesh96)
经过 16 天不断努力提高分数,我获得了第一场胜利,在排行榜上排名第三。
*Yayyy!*努力有回报!
现在怎么办?它如何改变了我的生活?
除了奖金,我还收到了由 Analytics Vidhya 举办的首届亚洲最大的人工智能会议的邀请。
会议的日期和我期末考试的日期完全一样。显然,我不会错过期末考试。**真的吗?**当我看到演讲人的名字和他们对数据科学领域的贡献时,我花了几个小时改变了主意,我决定去参加会议。
作者照片
该会议旨在听取来自全球各地的人工智能和机器学习专家的意见,并在会谈后分享专家的知识和指导。
除了会谈,
- 我采访了 Ronald van Loon (他连续几年被 Onalytica 评为商业智能领域全球顶级行业专家第二名、大数据领域第三名、数据科学领域第七名、金融科技领域人工智能/数字化转型/保险科技领域第八名以及全球物联网领域第九名)
- 我采访了 塔利·辛格 (他是一家人工智能初创公司 deepkapha.ai 的首席执行官、创始人和人工智能神经科学研究员)。和他谈论现实生活中的项目是我在那里度过的最美好的时光。
数据科学领导者实际上是如何思考和决策的,这是我从他们两人身上学到的关键东西。
与超过 15 位我称之为各自领域专家的演讲者交谈是我职业生涯的转折点。我得到的指导和在这个领域的正确方向帮助我重新思考我的职业生涯。
当我去参加会议的时候,我只是一个对我的职业生涯几乎一无所知的学生,但是当我回到家的时候,我已经变了一个人,我绝对知道为了追求一个适合我的职业生涯该做什么。
我收到的邀请和我做出的参加会议的决定改变了我的生活。
黑客马拉松如何改变了你的生活?如果你有什么故事,请评论。
附:这是我的第一个博客
Wizzair 在新冠肺炎期间是如何给他们的客户发推特的——R 语言的文本分析
新冠肺炎时代 Wizzair 及其用户微博的词汇分布和情感变化的定量文本分析
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
在新型冠状病毒期间,几乎每架飞机都停飞,取消的航班数量空前。这是一篇关于 Wizzair 的分析,wizza IR 是欧洲最大的廉价航空公司之一,它在新冠肺炎时代是如何给乘客发推特的。他们的主要沟通来源之一是 Twitter,所以这是一个非常相关的信息来源。因此,我搜集了一堆包含所有必要信息的数据来进行定量文本分析。
我首先想到了两个假设:
- H1: Wizzair 一遍又一遍地重复同样的句子/表达,并没有独特地解决客户问题。
- H2:与 Wizzair 员工的友善相比,顾客推特的总体情绪更加负面。
时间分布
首先,让我们看看一段时间内每天的推文数量。这让你了解什么时候问题被提出或者(希望)被回答。黑色竖线表示匈牙利边境关闭。由于该公司最大的基地位于布达佩斯,这对他们来说至关重要。欧洲各地几乎同时出台了防止病毒传播的严格措施。因此,它是疫情在欧洲“起步”的一个很好的基准。
就在边境关闭和航班突然取消之后,双方的每日推文数量大幅增加。这是我期望看到的,因为人们要么被困,要么在寻找他们的钱回来。他们提出更多的问题是很自然的。
我认为观察顾客是否更罗嗦地详细解释他们所有的问题会很有趣。为了满足我的好奇心,我计算了每天发推的平均长度。
这两者之间没有太大的差异,但是,我可以在左侧检测到更大的条形。这显然不是我想法的有力证据。这可能是推特性质的结果。没有人想写很长的帖子,因为他们不会被阅读。
单词分布和常见 n 元语法
该是我分解到文字层次的时候了。我从我的语料库中排除了停用词。让我们来看看出现 600 次的最频繁的单词。很明显,讨论是关于退款的,不是吗?
然而,了解什么样的词汇会在两个群体之间产生差异是很有用的。有哪些词是顾客会用的,但 Wizz 和 vica 会用?在这一点上,不可避免地要强调,即使不同的人以 Wizz 的名义发推特,他们仍然是一个比所有客户更同质的群体。
为了识别有区别的单词,我使用单词出现次数作为输入变量,运行了一个简单的惩罚回归来对两组进行分类。在图中,显示了具有非零系数的每个单词。
现在更有意义了,不是吗?很可能被发在推特上的句子可以从单词中推断出来。如来自客户方的以下内容:
- 顾客的航班被取消了。
- 他们要求拿回他们的 T4 钱。
从 Wizzair 的角度来看:
- Wizzair 要求每个人都有耐心,并要求乘客检查他们的预订。
- 如果有任何变化,他们的系统将发送通知。
另一种为了区分各方推文重要词的方法是使用词频——逆文档频率(简称 tf-idf)。
tf-idf 是一个数字统计量,旨在反映一个词对集合或语料库中的文档有多重要。TF–IDF 值与单词在文档中出现的次数成比例增加,并由语料库中包含该单词的文档数抵消,这有助于调整某些单词通常更频繁出现的事实。
在词汇方面,与回归相比,似乎有很大的不同。然而,叙述和主题并没有发生巨大的变化。
Wizzair 强调他们:
- 经努尔苏丹飞往上海,向匈牙利运送医疗设备
- 英国的呼叫中心
- 对造成的任何不便表示歉意
另一方面,客户在谈论:
- 特内里费岛(他们一定是被困在那里了)
- 想要一些东西(可能是他们的钱)
- wizz 信用(我想他们不希望这样)
基于这些结果,客户群体更加多样化的想法得到了证实,因此,关于更广泛主题的推文得到了证实。为了理解他们的主题,我需要更多的假设。
为了获得单词旁边的一些上下文,我们将介绍 n 元语法的用法。二元模型意义不大,因为它们提供的上下文太少,无法扩大范围,因此,使用三元模型代替。
话题真的没有改变,顾客的航班被取消了,想要退款。另一方面,Wizz 正在通知他们可以给谁打电话,并要求耐心等待,因为给乘客退款需要比平时更多的时间。
从 Wizz 的角度来看,可以挑选几个部分,然后连接起来,最终形成一个句子。它暗示了这样一种现象,即确实可能有预先写好的句子要使用。这些例子是:
- 我们可以检查您的预订
- us a call +我们的本地费率+本地费率线路
为了进一步研究复现句的概念,我将评估 Zip 定律是否适用于这种情况。该方法通常用于识别非人类生成的文本数据。
Zipf 定律最初是根据定量语言学制定的,指出给定一些自然语言话语的语料库,任何词的频率都与其在频率表中的排名成反比。因此,最频繁出现的单词的出现频率大约是第二频繁出现的单词的两倍,第三频繁出现的单词的三倍,等等。:等级-频率分布是一种反比关系。
运行由 *log10(术语频率)~ log10(等级)*表示的回归后,系数估计值为-1,70(标准误差:0.005)。它明显不同于-1,意味着 Zip 定律不适用于此文本。虚线表示-1 的陡度。从图中推断,曲线似乎在等级#100 附近有一个 hars 突变,并且变得比以前更陡。
结果或多或少与 H1 一致。Wizz 有他们喜欢向乘客强调的表达和表达链甚至句子。这引发了一个问题,机器人是否会比人类劳动力更具成本效益,因为它们似乎没有给推文带来多少附加值。
情感分析
我将使用两个情感词汇,即 bing 和 nrc 。后者将每个词分为以下类别之一:信任、恐惧、消极、悲伤、安歌、惊讶、积极、厌恶、喜悦、期待,而前者只考虑两个类别:积极和消极。
必应词典
让我们首先考虑 bing 词典。我的第一个想法是比较每组中负面词汇的比例。至于客户端,比率约为 26%,这意味着根据 bind 字典,这个比例的单词是负面的,而不是正面的。Wizz 方面的相同指标是大约 17%,这要低得多。总体而言,客户的推文传达了一种更负面的含义,即支持 H2。
我想知道感情方面是否有任何趋势。具体来说,我的想法是,在取消之后,人们更加愤怒,因此更加消极。
根据上面的 100%堆叠条形图,取消的浪潮似乎没有什么影响。无论是对顾客还是对 Wizz 来说,负面词汇与正面词汇的比例都没有显著变化。不过日常有滴,不过很可能是随机噪音。
NRC 词典
对情绪的分解肯定有更详细的层次。下图表明,顾客表达了更多的愤怒、厌恶、惊讶和消极情绪。另一方面,威兹更积极,令人惊讶地表现出恐惧和悲伤的迹象(我的假设是他们试图表示同情)。
看了一下 NRC 的情绪是如何随着时间的推移而分布的,H2 就更加支持了。图表显示,愤怒、厌恶和惊讶(可能不是积极的情绪)等情绪主要是由客户发布的。
总的来说,我关于情绪的结果表明,客户表达了更多的负面情绪。另一方面,Wizz 打算用更积极的方式来安抚他们的乘客(嗯…就像它们在飞行中那样)。
然而,边境关闭和大量航班取消似乎对推文的情绪没有影响。客户倾向于在 Wizzair 上发推特,抱怨他们遇到的不愉快的问题。该病毒很可能增加了这些投诉的数量,但是,它没有增加他们的负面影响,因为它已经相当悲观和愤怒。
用于抓取和分析的代码可在此处找到。
如何在这个季节免费学习数据科学、AI 和 ML。
在这段艰难时期,学习一项新技能或提高现有技能是消磨时间的一种神奇方式。如果你能免费学到令人敬畏的新事物,那就更好了。
Avel Chuklanov 在 Unsplash 上拍摄的照片
“你读得越多,你知道的事情就越多。你学得越多,去的地方就越多。”
――苏斯博士
如果我们不学习,我们什么也不知道。选择成为一名数据科学家、人工智能或机器学习工程师实际上意味着你报名参加了一场终身学习之旅。许多人正在用数据科学、人工智能和人工智能做着非常惊人的事情,但他们都是从某个地方开始的。学习成为数据科学家、人工智能或人工智能工程师的开始阶段是最艰难的,因为正是在这个阶段,你会遇到你从来不知道的新事物。因此,你会遇到做事情的高级方法,如果你对基础有很好的理解,你会很容易在高级的事情上出类拔萃。尽管我们目前正处于非常艰难的时期,但我们可以高兴的是,我们可以免费获得大量的学习材料和资源。学习成为一名数据科学家、人工智能或人工智能工程师自然是非常昂贵的,因为我们现在有免费的,我们必须尽最大努力利用我们能得到的所有好东西,只要它持续下去。在这个故事中,如果你想成为一名数据科学家、人工智能或人工智能工程师,我将与你分享一些你可以免费获取的资源和材料。
GitHub 学生开发者包
作为一个学生开发者,拥有一个 GitHub 账号是非常必要的。即便如此,申请你的 GitHub 学生开发者包是你作为学生开发者职业生涯中最重要的事情。GitHub 学生开发者包提供了如此多的好东西,只要你是学生,你就可以免费获得。GitHub 学生开发包附带了如此多的软件,但作为寻求学习数据科学、AI/ML 的人,最重要的是 DataCamp 和 Educative 。这些平台让学生可以在几个月内免费访问 GitHub 学生开发包。
商务化人际关系网
LinkedIn Learning 从现在到 2021 年 3 月免费提供了一些付费课程。成为一名数据分析师的课程非常吸引人,保证在完成后让你从数据分析的初学者达到中级水平。完成课程后,您还会获得一个数字徽章作为课程完成的证明。
乌达城
AWS 机器学习奖学金在 Udacity 上是免费的,有 325 个座位可供感兴趣的申请人使用。报名截止到 2020 年 7 月 31 日。因此,所有感兴趣的人都应该在截止日期前提出申请。本课程将带您了解使用 AWS 云平台进行机器学习的基础知识和高级知识。学生还可以通过 Github 学生开发者包在 AWS 云平台上免费获得价值 100 美元的云空间和培训。
乌德米
Udemy 是一个学习各种事物的神奇平台。出于一些 Udemy 导师的好心,他们在困难时期向所有人免费提供了一些顶级课程。Udemy 的免费课程可以在这里找到。这些课程中的大部分都是终身免费的,你只需要简单的注册就可以进入。
伟大的学问
Great learning 为数据科学、人工智能或 ML 领域的任何经验水平的人提供了完整的资源库和教程。有迷你项目和高级项目的教程,你可以尝试建立一个良好的数据科学,人工智能或 ML 组合。它要求你做一个简单的注册,你可以访问所有这些课程在这里。从大学学的课程,终身免费。
upGrad
任何注册的人都可以在 upGrad 上终身免费学习 19 门顶尖的科技课程。这些课程来自广泛的技术,但包括数据科学、人工智能和机器学习的初级到高级课程。你唯一需要的是一个简单的注册和中提琴!
教育的
教育性的是目前为止我最喜欢的学习平台。凭借其引人入胜和流畅的用户界面,您一定会有一个惊人的学习体验。好消息是,Educative 有一个机器学习奖学金,对任何有兴趣集中学习 ML 的人免费提供,为期 3 个月。这门课程通常收费 199 美元,现在对每个感兴趣的人都是免费的。你唯一需要做的就是注册,然后你就可以开始了。
openHPI
这是一个为德国人或能说并理解德语的人提供的学习平台。openHPI 有一个关于数据科学和数据工程的免费课程。本课程以德语授课,完成后您将获得证书。你可以在这里报名。
斯堪的纳维亚航空公司
分析领域的领先品牌 SAS 正在提供为期一个月的数据科学、人工智能和机器学习、数据管理和高级分析课程。这些通常每年花费 1295 美元。你只需简单注册就能从 SAS 获得这些课程。
显然是艾
有了来自显然 AI 的免费账号,你将学习如何执行顶级的机器学习预测,并在无需编写任何代码的情况下处理数据。你还会收到来自显然是 AI 团队的每周电子邮件,告诉你如何使用该平台并以高精度进行 ML 预测。对于寻求学习如何使用数据科学、人工智能和 ML 的无代码方法来执行机器学习预测的个人来说,一个免费帐户很可能就足够了。但是,随着您需求的增加,您可以订阅任何可负担得起的付费计划来满足您的需求。
Notitia AI
对于有抱负的数据科学家和 AI/ML 工程师来说,Notitia AI 是当今世界上最好的虚拟导师和培训平台。Notitia AI 通过一套组织良好的导师课程来指导申请人,使他们为科技领域的一些顶级公司做好行业准备。Notitia AI 每年为他们的队列选择两次申请人,申请人必须通过面试才能被选中。目前,Notitia AI 没有空缺,因为本赛季的申请人刚刚被选中。然而,你可以留意他们的社交媒体平台,以了解下一批何时开始。
开源资源
开源最重要的一点是你可以免费获得一切。你可以在 GitHub 上查看这个资源库,获取资源和学习数据科学、人工智能和 ML 的明确学习路径。课程和资源都经过精心策划,以确保您在一生中拥有这些资源的同时,最大限度地利用学习。对于更具挑战性的学习路径,我建议你参加 #100DaysOfMLCode 挑战,在那里你可以学到从 python 基础到深度学习的几乎所有东西。
"尽可能以最散漫、最不敬和最原始的方式努力学习你最感兴趣的东西."理查德·费曼
我在本文中分享的一些资源只在一段时间内可用。我将每月对这篇文章进行编辑,删除过期的资源并添加新的资源。请尽可能经常查看这篇文章,以便在新的机会到来时发现它们。
感谢您抽出时间阅读这篇文章。我希望你学到了一些东西,这对你有所帮助。欢迎您在回复部分分享您的想法、观点和我在本文中可能跳过的资源链接,您可以直接在 Twitter 或 LinkedIn 上联系我。黑客快乐!
非常感谢 安娜·阿伊库 为我校对和纠正了许多错误。
你如何用自己的小方法防止系统性的种族歧视
这里有两种方法可以解决技术和数据科学中的偏见
马库斯·斯皮斯克在 Unsplash 上的照片
无论是在新闻、社交媒体还是在美国街头,系统性种族主义都是一个激烈辩论的话题。在这篇文章中,我不打算就历史上的种族紧张关系教育任何人。和其他人一样,我对什么可行什么不可行有自己的看法。我将试图传达的是,无论你的立场是什么,你都可以在没有意识到的情况下强化偏见行为,即使你像它们一样“清醒”。
特别是如果你为别人而不是自己工作,你必须把你的技术和数据科学项目当作偏见是真实存在的。如果你选择看向别处,你可能会向这个世界释放一种伤害他人的产品。你可能甚至没有意识到它正在发生,直到一些惊人的事情发生。到那时,已经太晚了。你损害了你的个人和职业声誉。你的医疗、金融或欺诈预测可能已经伤害了个人。在未来的几年里,你可能会感到后悔和自责。
学习如何避免最坏的情况需要了解一些背景知识。
我们的大脑有偏见是有原因的。
我有偏见,因为我是人。人类每天都在整理和处理大量的信息。我们的大脑迅速将输入导入桶中。如果我们试图深入思考每一条信息,我们就会瘫痪。我们的大脑善于走捷径。
这些传入的信息中的一些可能落在错误的桶中。它与我们的思想和行为混杂在一起,导致了隐含的偏见。我们可能没有意识到我们对人、事物或活动有偏好或反感。
因此,如果我们没有意识到我们的隐性偏见,我们如何防止它们泄露到我们的数据、代码和算法中呢?不幸的是,没有消除偏见的魔法棒。自我意识是良好的第一步。哈佛大学正在进行一项有趣的研究。Project Implicit 对这一领域进行了研究,有一些在线“测试”会报告你的回答中可能存在的偏见。
[## 项目隐含
登录或注册,找出你对种族、性别、性取向和其他话题的隐含联想!或者…
implicit.harvard.edu](https://implicit.harvard.edu/implicit/index.jsp)
有了新的经历和自我反省,你就可以把放错地方的信息移到你想要的桶里。想象下一次当你使用一个有问题的短语时,有人会叫你出来。在脱口而出道歉的时候,你的大脑疯狂地搜索这句话,并把它放进“坏”桶。
这需要努力,也需要时间。
假设存在数据偏差
如果我们不能用弹指一挥间消除大脑中的偏见,我们将不得不假设偏见确实存在并影响着我们。它影响着我们周围的每一个人。
我给你的第一个建议是假设历史数据有直接或间接的偏差。问问你自己,历史数据代表你的目标人群吗?
直接数据偏差的一个例子——过去没有女性获得超过 10 万美元的贷款。如果你根据这些历史数据训练一个模型,你可以很确定你的模型的结果会有偏差。
不太明显的是间接数据偏差。训练数据仅基于对 iPhone 11s 的调查,可能会扭曲你的富裕指标。另一个例子是,当西班牙语版本的调查不可用时,将这个模型推广到说西班牙语的人群。
审核您的预测结果
假设你的数据看起来不错,你相信你有一个代表性的样本。即使它不包含任何人口统计信息,机器学习模型的结果仍然可能有偏差。根据你的预测,如果一群人比另一群人受益更多,你需要考虑偏见。如果根据你的预测,一群人一直被排除在外,你需要考虑偏见。
检查这一点的唯一方法是在现实世界中审核您的部署后结果。所以我的第二个建议是,进行审计。你可以自己做这件事,尽管最好让外界的人来看看。接受学习,并根据需要进行调整。你每天都会让世界变得更美好。
推荐读物
当被问及道德和坏算法的危险时,我推荐的第一本书是凯茜·奥尼尔的数学毁灭武器。如果你认为你只有一本书的时间,这是一个选择。详细的例子是相关的,易于阅读。
下面这篇文章对我的思考产生了重大影响。我把这项研究作为演讲的例子。如何选择算法的优化目标可能会产生严重的意想不到的后果。我计划下个月就这个话题创建一个条目。
Obermeyer 等人的“剖析用于管理人口健康的算法中的种族偏见”科学【2019 年 10 月 25 日:447–453
如何通过可视化来讲述数据的故事。
一个公认的事实是,对于对数据没有兴趣或不了解数据的人来说,原始形式的数据看起来非常混乱。那么,我们如何才能让这类人看得见、看得懂数据呢?
艾萨克·史密斯在 Unsplash 上拍摄的照片
“可视化数据的能力是数据探索和使用难题的一个重要组成部分…数据提供商担心他们的数据被平凡化、误解或歪曲,这种担心也适用于进行可视化的过程,即使是简单的可视化…可视化数据改变了人们对数据的理解方式,并普遍提高了人们对数据的兴趣,这将鼓励开发更多更好的数据。”罗伯特·科萨拉
作为数据科学家或分析师、人工智能和机器学习工程师,可视化数据已经成为我们生活中必不可少的一部分。这是因为我们在工作中花了大部分时间向同事或主管解释事情,并介绍我们的工作和发现。对于不了解数据或对数据不感兴趣的人来说,原始形式的数据通常看起来就像一长串随机数、图像或音频文件。我们的工作是让这些人从我们拥有的数据中理解意义,并引导他们从我们拥有的数据中做出有用的推论。我们用我们拥有的数据讲述过去和未来的故事,但是如果我们没有可视化,那么是什么让我们不同于占卜者或疯狂的老先知呢?在本文中,我将带您了解可视化数据的重要性,分享一些可以让您的可视化专业的技巧,以及一些可以用来创建优雅的可视化的工具、库和软件。
什么是数据可视化,为什么可视化数据很重要?
“想象给了你一些你不知道的问题的答案.”—本·施奈德曼
数据可视化是以可视或图形格式表示数据的过程。这个过程很重要,因为它有助于您通过图像交流不同数据的相关性。人类的思维很容易从信息图中理解,当查看电子表格、CSV 文件或数据库中的数百行原始数据时,会生闷气。通过可视化数据,可以轻松发现趋势和模式,这一点非常重要,尤其是在数据科学的探索性数据分析阶段。数据可视化不仅仅对数据科学家、分析师和人工智能/人工智能工程师重要,它是技术领域内外从事数据工作的每个人都应该学习的技能。
数据可视化的使用
“一张照片的最大价值在于它能迫使我们注意到我们从未想过会看到的东西。”约翰·图基
数据可视化被用于几乎每个需要解释涉及数据使用的工作或发现的领域。每当一个人需要从他或她为自己或一群人所拥有的数据中做出见解或推断时,就需要使用他或她所拥有的数据的可视化表示。然而,可视化数据并不意味着美观,以图形形式表示数据是出于几个原因,我将在下面分享。
- 确定相关性:如果不将你所拥有的数据可视化,你很难确定两件或更多事情之间的相关性。识别关系或相关性是数据分析中非常关键的一个阶段,因此,如果您希望在此阶段从数据中获得最佳见解,可视化数据非常重要。
- **观察随时间的变化:**通过可视化数据,我们可以使用时间序列图观察给定时间内的趋势或模式变化。这有助于查看过去的数据,对未来可能发生的事件做出重要的预测或假设。这可以帮助组织或个人扩展他们的产品或服务,以在未来达到期望的极限。
- 识别频率:频率识别是视觉图形最基本的用途之一。它帮助我们确定我们做事情的频率,从而知道哪里需要更多的努力、时间和奉献,哪里需要放松。企业还可以使用频率图来检查特定时间的销售数量,获得一些见解,并调整其营销流程以满足消费者的需求。
**可视化图表的类型:**现在我们已经了解了什么是可视化,我们必须了解各种类型的可视化图表,这些图表可以让我们讲述我们所拥有的数据的故事。有数百个可视化图表,我们很可能永远不会遇到其中的一些。然而,我将分享几个我知道的流行的,没有特定的重要性或兴趣顺序。
- **折线图:**折线图或折线图或曲线图是一种图表类型,它将信息显示为由直线段连接的一系列数据点,称为“标记”。它是许多领域中常见的一种基本图表类型。它类似于散点图,只是测量点是有序的(通常按其 x 轴值)并用直线段连接。折线图通常用于显示一段时间内的数据趋势,即时间序列,因此线通常按时间顺序绘制。在这些情况下,它们被称为运行图。— 维基百科
- **条形图:**来自维基百科,条形图或条形图是一种用矩形条表示分类数据的图表或图形,矩形条的高度或长度与它们所代表的值成比例。条形图可以垂直或水平绘制。垂直条形图有时被称为柱形图。条形图显示离散类别之间的比较。图表的一个轴显示正在比较的特定类别,另一个轴代表测量值。一些条形图以多个一组的形式显示条形图,显示多个测量变量的值。
- 直方图:直方图很大程度上是数字数据分布的近似表示。它看起来很像条形图,但测量的是频率而不是一段时间内的趋势。你可以在维基百科页面上了解更多关于直方图的信息。
- 散点图:根据维基百科,散点图是一种使用笛卡尔坐标来显示一组数据中典型的两个变量的值的图或数学图表。如果点被编码(颜色/形状/大小),可以显示一个额外的变量。数据显示为点的集合,每个点的一个变量的值决定水平轴上的位置,另一个变量的值决定垂直轴上的位置。
- **饼图/甜甜圈图:**饼图是一种圆形的统计图形,它被分成若干片,以说明数字比例。在饼图中,每个切片的弧长(以及其中心角度和面积)与它所代表的数量成比例。虽然它的名字是因为它看起来像一个被切片的馅饼,但它的呈现方式也有所不同——维基百科。然而,圆环图只是一个中间中空的饼图,旨在清楚地显示切片或比例,并为传统风格的饼图添加美学效果。
- **热图:**热图是一种数据可视化技术,以二维颜色显示现象的大小。颜色的变化可能是色调或强度的变化,给读者提供了明显的视觉线索,表明现象是如何聚集或随空间变化的。— 维基百科
- **地图:**对于包含位置元素的数据,我们可以使用世界地图的优雅可视化。这些类型的地图用颜色编码,用较暗的阴影显示强度较大的区域,反之亦然。它是可视化病毒传播的完美工具,广泛用于可视化新冠肺炎传播的受影响区域。
可视化数据时需要注意的事项
“通过可视化信息,我们将它变成一幅你可以用眼睛探索的风景。一种信息地图。当你迷失在信息中时,信息地图就有点用了。”—大卫·麦坎德斯
有效的数据可视化是数据分析至关重要的最后一步。没有它,重要的见解和信息可能会丢失。然而,有相当多的事情是任何一个寻求像专业人士一样形象化的人必须知道的。
- **选择 bests 讲述您的故事的可视化方式:**在您可以用来可视化数据的多种图表类型中,选择一种 Bests 能够代表您的数据的图表。如果你想从数据中获得有用的见解,这是非常重要的。这伴随着说你必须有一个好的颜色选择。颜色编码的可视化非常有助于轻松识别强度、模式和聚类
- 包含比较:这可能是我们最简单的数据可视化方法,但它仍然很重要:当你展示你的信息和见解时,你应该包含尽可能多的实际比较。通过一起展示两个图表,每个图表都显示特定时间范围内相同信息的对比版本,例如 2016 年和 2017 年的月度销售记录,您将为您的数据的影响提供清晰的指导,突出每个人都可以思考和采取行动的优势、劣势、趋势、高峰和低谷。
- **了解你的受众:**在进行可视化时,确定需要从你的可视化中做出推论或获得洞察力的目标受众。谁会查看这些数据?他们面临什么样的挑战,什么样的障碍阻碍他们克服这些挑战?了解这一点,并努力构建足够吸引受众的可视化效果,让他们最大限度地洞察或理解您的数据。
可视化数据的最佳工具和软件
你的可视化效果取决于你用来创建它们的工具或软件。一个人必须使用好的可视化工具和软件来构建高质量和优雅的可视化。下面是我个人用过的几个最好的工具和软件,可以推荐一下。
- **开源库:**有许多开源库附带编程语言,我们可以免费使用它们来可视化我们的数据。它们通常很容易使用,并且实现起来很快。这是大多数程序员首选的可视化方法,他们更喜欢这种方法,因为它带来了灵活性。比较流行的有 Matplotlib 、 Seaborn 、 Bokeh 、 Plotly 和 GGPlot 。
- **电子表格应用程序:**许多人忽略了这一点,但是像 Microsoft Excel 和 Google Sheets 这样的电子表格应用程序有内置的可视化工具,这些工具非常适合以图形或视觉形式表示数据。对于那些没有编程技能或者没有编程技能,又负担不起可视化工具的人来说,这应该是你最好的选择。
- Tableau: 对于制作各种高级而优雅的可视化和分析仪表盘, Tableau 是我认为最值得推荐的软件。您可以在 Tableau 中轻松、快速地制作精美的气泡图、饼图、折线图、热图或地球投影图。Tableau 易于使用,并且有许多教程来指导你如何很好地使用它来最大化生产力。
- Power BI:Power BI是微软推出的商业分析服务。它旨在提供交互式可视化和商业智能功能,其界面足够简单,便于最终用户创建他们的报告和仪表板。
记住三个基本原则:约束、减少、强调,你就可以在设计有效的图表时做到简单—加尔·雷诺兹
我希望我已经能够启发您可视化数据的重要性,并能够分享有用的方法和资源,帮助您充分利用可视化数据来讲述一个关于它的好故事。
感谢您抽出时间阅读这个故事。我希望你学到了一些东西,这对你有所帮助。欢迎您在回复部分分享您的想法和观点,您可以直接在 Twitter 或 LinkedIn 上联系我。黑客快乐!
非常感谢 安娜·阿伊库 为我校对并纠正了我写这篇文章时犯的许多错误。
你应该如何看待转换率
转换率看起来很简单,但在引擎盖下,有容易落入陷阱。幸运的是,一个情节可以帮助。
转化率。我听到的比转化率更多的指标很少。这并不奇怪,因为这是一个如此简单的度量标准,几乎可以应用于任何情况,只要你试图将某物或某人从 A 点带到 b 点。
- 那些做了 A,然后继续做 B 的人有多少?
- 我们最喜欢的篮球运动员有多少个三分球进了?
- 我们网站的访问者中有多少人最终注册并创建了账户?
要回答这样的问题,转化率可以帮助我们。要计算这个神奇的度量,您只需要两个数字和一个除法符号。超级简单吧?
- 转化率= #谁做 B / #谁做 A
- 我们最喜爱的篮球运动员的 3 分转换=进入篮筐的 3 分资格投篮次数/获得的 3 分资格投篮次数
- 平均网站注册转换率=注册并创建帐户的人数/独立网站访问者人数
但是,在回答问题的时候,“A 和 B 之间的转化率是多少?”做上面的数学计算可能很简单,但是它隐藏了很多信息,很多人在处理转换率时会忽略这些信息。我说的不仅仅是我们的普通读者,我已经看到许多经常与数字和转换打交道的专业人士(营销经理、分析师,甚至数据科学家)也落入了隐藏在这个单一数字中的陷阱。
这两个陷阱就是成交量和时间。
如果这不能马上理解,请不要担心,我们将讨论这些陷阱是什么,以及要问什么问题来帮助您在数据中解释它们。到本文结束时,我们将有一个单一的情节来回答所有这些问题,通过使它们透明来帮助我们避免这些陷阱,并且很容易理解。这无疑是转换的最佳视角。
音量陷阱
当我们将这两个数字相除以获得转换率时,我们丢失了关于我们开始时的数字以及它们有多大的信息。这很重要,因为数字越小,我们的转换率就越有可能只是随机的结果。例如,如果你要测量我们最喜欢的篮球运动员的 3 分转换率,并且得到 100%,你会印象深刻。但是如果我告诉你这个测量只包括一次拍摄,你就不会这么惊讶了。得到一个 3 分球可能只是运气。相反,如果我告诉你,他们在 100 次投篮中有 87%的 3 分转换率。你会更加印象深刻,因为 100 分中的 87 分已经很不错了。
埃里克·麦克林在 Unsplash 上的照片
这里的诀窍是,当看到转换率时,要问“*创造这个转换率的数字有多大?”*同样,在显示转换率时,很容易添加原始数字,即 30% (30/100)。有了这些原始数据,大多数人可以凭直觉判断这是否足够。但是,如果我们想更深入地了解噪声,获得一段时间内的转换率并查看典型的分布,就足以进行更严格的统计分析。说到时间,虽然交易量的陷阱相当简单——大多数人都明白这个统计学原理——但在我们的下一个陷阱中,事情会变得复杂得多。
时间陷阱
时间要复杂得多,通常也更难理解。时间在这里扮演两个关键角色,从 A 点到 B 点所需的时间,以及转换率如何随时间变化。
照片由 Marek Szturc 在 Unsplash 拍摄
从 A 点到 B 点需要多长时间?
对于我们的 3 点转换示例,两个动作之间的时间可以忽略不计,因为投篮后的几秒钟(点 A)我们知道球是否进入了篮圈(点 B)。这种转换不仅快速而且一致;因为根据物理定律,所有的投篮从投篮手到篮筐需要的时间都是一样的——永远不会有一个三分球需要 10 分钟。然而,事实往往并非如此,我们应该问自己:“大多数人需要多长时间才能转变?”
对于我们的第二个转化率例子——登陆我们的网站和注册账户之间的比率——在时间上有很大的可变性。一些访问者立即出现,并在他们做的第一件事就是注册,其他人在一个小时后注册之前四处探索一下,而少数人会浏览一会儿,然后在一周后回来注册。因为没有物理定律限制时间,总会有一个访问者在几年后出现并注册。有了这样的多样性,我们不能仅仅用注册总人数除以独立访客总人数,因为一些访客比其他人有更多的时间来转化——我们在时间方面没有平等对待他们。
为了解决这个问题,我们需要在进行转换计算时控制时间。最简单的方法是对每个访问者进行时间盒转换。而不是问“A 和 B 之间的转换是什么?”、*、*我们应该反过来问,“*X 天内 A 和 B 之间的换算是多少?”*在计算我们的新指标时,我们需要注意在分子和分母中只计算在整个时间段内的访问者,并且在分子中只计算在该时间段内转化的访问者。
对于我们的例子,假设在查看了分布之后,我们决定从有人第一次访问该网站起 7 天内测量转化率。因此,对于每个访问者,我们将跟踪他们第一次出现的时间,然后等待 7 天,检查他们是否注册加入我们的计算。
转化率如何随时间变化?
现在我们可以回答(适当的时间限制)问题“在 X 天内 A 和 B 之间的转换率是多少?”,下一个合乎逻辑的问题是“随着时间的推移,这种转换发生了怎样的变化,我们是否在改进?”
要回答这个问题,我们需要首先建立我们的数据,以便我们可以比较不同时间的苹果到苹果的转化率。幸运的是,我们的 X 天内转换指标为我们完成了大部分繁重的工作,因为它并不关心我们的第一个操作是什么时候发生的,只是从那时起已经过了 X 天。根据我们的访问者第一次访问我们网站的月份对他们进行分组,然后计算他们每个人的 7 天转化率,这将会给我们答案。有了这些数字,理解能力的提高就相当直接了(最近一批人的转换数越高=越好)。在这里,您可以使用这些数据来设定转化目标,并监控我们实现该目标的进度。
此时,你或其他人最终会问,“我们如何走向下一个目标?我们走上正轨了吗?”为了回答这个问题,我们有几个选择。一种是进行更小的分组(每周一次而不是每月一次),并在 X 天内观察它们的转换。这确实有其局限性,如果你走得太小,你可能会遇到我们的第一个陷阱(体积)的问题,它仍然不能直接告诉你最近的完整队列的进展。另一个是缩短时间框架(即 3 天而不是 7 天),这里我们也会遇到问题。请记住,我们特别选择了大多数游客转变的 X 天,因此,有些时候一些游客的转变并不表明大多数游客的转变。
虽然没有一个选项是完美的,预测未来也不是完美的(这正是我们在这里努力做的)。通过查看这两个选项,它们将使我们更好地了解我们是如何实现目标的。
一个阴谋统治所有人
回顾过去,我们已经讨论了大量的问题。它们很好地总结了我们从哪里开始以及我们学到了什么:
- 有多少人做了 A,然后继续做 B?
- A 和 B 之间的转换率是多少?
- 创造这一比率的数字有多大?
- 大多数人转化需要多长时间?
- X 天内 A 和 B 的转化率是多少?
- 随着时间的推移,转化率发生了怎样的变化,我们是否在进步?
- 我们如何走向下一个目标?我们走上正轨了吗?
幸运的是,有一个简单的情节可以回答所有这些问题。只需绘制一段时间内的累积转化率。该图上的每条线将代表他们第一次做动作 A 时的不同群组(较暗的阴影表示最近的群组)。我意识到用文字描述一个情节并没有太大的帮助,所以看看下面的一个例子。
以图表上的单个点为例,二月组在 25 天时只有 25%的转化率。
对于我们的例子,A =访问我们的网站,B =注册并创建一个帐户
- most 转化需要多长时间? —简单,15 天左右开始“肘”
- 25 天 A 和 B 的转化率是多少? —对于二月至八月之间的人群,大约在 23%至 26%之间。然而,一月份却有了创纪录的转换率!
- 有多少人在同一天皈依?——大约 7%,也相当稳定。
- 我们在九月下旬更新了网站,从那以后转化率提高了吗? —不,最差的转化是在我们做出改变之后,而且随着时间的推移越来越差!
- 如果我们做额外的改变,我们的目标应该是什么? —我们应该从我们开始的地方开始瞄准(23%-26%),理想情况下,我们应该争取超过 26%的转化率(在 25 天内)。
为了解释体积陷阱,你可能已经注意到我在图例中包含了每个群组的大小。这不仅提供了对我们可能预期的噪声的洞察,还提供了度量 A 和 B 之间的相互作用,因为它们通常是联系在一起的。随着 A 中数字的上升,向 B 的转换经常发生变化。理解为什么是一种练习,以确定是什么使一个群体与另一个群体不同。
我希望这有助于展示这个图是如何告诉我们这么多关于转化的事情,以及为什么我们应该利用它。除了我们的实际转换率之外,它还提供了避免常见陷阱的必要背景。它允许额外了解转换需要多长时间,事情如何随时间变化,以及我们如何进行趋势分析,所有这些都是一个好的指标所需要的!
如果这还不够,这个情节是非常直观的。简短解释 A 点和 B 点是什么,并强调每条线都是由 A 点定义的自己的群组,在阅读轴标签后,大多数情况下会自行填充其余的点。从我的经验来看,即使那些不认为自己是“数据通”的人,也会很快理解这个情节。一旦利益相关者或团队成员理解了这些图中的一个,您就可以针对任何两个度量交换 A 和 B,每个人都将立即能够从新的图中获得所有重要的东西。在这种一致性和灵活性之间,这个情节
我唯一的困惑是,为什么像 Amplitude 这样的现成分析产品或 Tableau 这样的 BI 工具不允许您轻松创建这种情节。我只能假设这是为了我的工作保障🤷♂️.
感谢阅读。
您应该如何改变您的数据科学教育
专注于工程技能
有许多类型的数据科学家,他们有不同的技能和职责。在我看来,你可以将数据科学家分成的最重要的群体是那些编写生产中使用的代码的人,以及那些做报告的人。
分析员
由于缺乏更好的术语,我把第二组称为分析家。这并不意味着他们不是数据科学家,担任这些角色的人受益于了解机器学习、数据的来龙去脉以及一般的编程技能。然而,在这个职位上,沟通更为重要,你对仪表板、图表、演示和可解释的统计数据的了解更有可能成为成功的关键。
工程师
工程师编写在生产中使用的代码,这意味着它通过与组织的现有软件集成来影响业务流程。在这里,你的机器学习知识更重要,你更有可能在面向代码的团队中工作,而不是商业智能或商业分析团队。
数据科学教育的目标
(在大多数大学里)没有数据科学的大学专业,所以几乎每个人“*”*都进入了数据科学,但是学习计算机科学或者是软件工程师的人通常会获得数据科学工程师的职位,而具有其他背景的人通常会进入分析师的职位。目前的数据科学教育更关注分析师的职位,而不是工程师。在我看来,这是因为教授分析师所需的技能要容易得多,许多个人和组织都想利用突然出现的想转行的人来赚钱。
正如一些人所说,由于围绕“21 世纪最性感的工作”有太多的炒作,参与数据科学教育的各方过分强调了分析师的可用性和需求。因此,我认为数据科学教育的主要问题是,似乎没有太多关注工程技能。我认为工程技能更有用,需求量更大,拥有这种技能的人更少。当我与开始数据科学职业生涯的人交谈时,我通常会听到他们与分析相关的技能,但我几乎只在工作岗位上读到工程技能。
你应该改变什么
如果你发现自己在学习另一种算法、图表包、仪表板工具,或者你的项目似乎停留在 jupyter 笔记本上,那么是时候改变了。一旦你掌握了这些话题中的一些,我看不出继续增长更深层次的知识有多大意义。例如,如果你已经知道 Tableau 和 Cognos,那么了解 Power BI 是否有很大好处?我相信你是一个聪明的人,所以如果你需要在你已经知道的领域学习一个额外的工具,我认为你应该等到你有这个需要的时候。还有其他投资回报更高的技能,其中大部分是工程方面的。了解更多我们已经熟悉的东西会让人安心,但是我鼓励你走出你的舒适区。我认为你应该把重点放在工程技能上。进行这种转变的最好理由是,拥有所需技能的人可以获得的工作比例更高,这可能是你所关心的。
更具体地说
现在,如果你确信你应该关心成为一名工程师,接下来采取措施,进一步了解编程和 DevOps。我之前在《走向数据科学》中讨论过编程能力的差距,以及许多技术人员在基本编程上的挣扎这里,但是我有一些建议要学习:
- 选择另一种编程,像 JavaScript、Java 或 C++这样的通用编程。
- 我从来没有遇到过一个单独的数据科学教程谈论面向对象编程。我认为这对于成为一名优秀的程序员来说是必不可少的,理解面向对象的原理有助于你更好地理解你可能编写的任何代码。如果你是初学者,课程编程基础:面向对象编程是一个很好的地方。
- 学习命令行是如何工作的,如果你练习,命令行的知识可以让你非常有效率。如果你不在实践中,在某些时候你仍然需要它来完成许多实质性的项目。为了学习这个,我参加了凯文·斯克格隆的课程OS X Mac 用户 Unix】。
- 学会正确使用 git 和 GitHub。坦率地说,如果你正在编写代码,但它没有出现在 GitHub(或另一个版本控制网站)上,那么我会怀疑你的代码是否被使用。我再次推荐凯文·斯克格隆的课程,名为 Git 基础训练:基础知识。
一旦你完成了所有这些,我将继续学习 DevOps,因为它使你更高效,更容易合作,并且最好的工程团队非常重视 DevOps 实践。DevOps 将软件开发(Dev)和 IT 运营(Ops)结合到一个领域,能够在保持系统可靠性的同时快速生产新功能。了解 DevOps 有助于持续集成(测试代码和构建,当您推进到您的存储库时)、持续部署(更新模型并让它们立即投入生产)、打包(确保模型可以扩展到更多用户)和监控(跟踪用户的模型评分)。
理解 DevOps 的关键是理解云,在云上部署和调用服务,就像调用 API 一样。云是机器学习的伟大推动者,因为你的 ML 模型可以在云上非常容易地扩展,并且它们变得更容易测试、更新和替换。这就是为什么你可能经常看到工作描述需要有 AWS、GCP、Azure、IBM 公共云、Cloudflare 或其他提供商的经验。我认为,一旦你对在云上进行数据科学感到舒适,如果你作为数据科学家工作的候选人看起来不那么有吸引力,你至少会对数据科学工程师的工作如何到位有更好的理解。
根据吴恩达(斯坦福深度学习讲座),你应该如何阅读研究论文
报告的
关于如何通过机器学习和教育领域公认人物发表的研究论文获取知识的说明
安妮·斯普拉特在 Unsplash 上的照片
“智慧不是学校教育的产物,而是终生努力获取的产物.”
——阿尔伯特·爱因斯坦
介绍
理解人工智能和机器学习领域前沿研究人员产生的信息的能力是每个认真的机器学习从业者都应该掌握的技能。
为了保持相关性并增加你的知识,机器学习从业者需要有学术思维和习惯。人工智能、人工智能和人工智能正在快速发展,我们必须用知识来装备自己以跟上这个领域,这些知识只能通过研究论文才能获得。
这篇文章将为你提供如何有效地完成一篇研究论文的指导,同时还提供以下内容:
- 阅读一系列论文以获取某一领域知识的系统方法
- 如何正确阅读研究论文
- 可以帮助你搜索论文和关键信息的有用在线资源
对于那些想了解本文关键内容的人,向下滚动到标题为“阅读研究论文”的部分。
首先,谁是吴恩达?
我在这篇文章中提供的信息来自吴恩达教授的斯坦福讲座。我还用个人技巧和来自互联网资源的信息补充了本文中包含的信息。
但是首先,简单介绍一下吴恩达。
吴恩达可能是互联网上最知名的(和看了)机器学习老师。他还是 Deeplearning.ai 和 Coursera 的联合创始人。
除了他正在进行的在线教育方面的工作,他还是斯坦福大学的教授。
谷歌搜索就能获得更多关于吴恩达的信息。
对于一个人来说,学习周围环境中的个体所展示的技能和习惯是很自然的;这就是为什么大多数博士生会获得适当有效消化研究论文内容的技能。这在某种程度上是事实,安德鲁在前面提到的视频中很早就提到了这一点。
但我们不是博士生,有些人可能是,但我们正常人如何获得阅读研究论文并全心全意理解其内容所需的技能。
阅读研究论文
由 Christa Dodoo 在 Unsplash 上拍摄的照片
如果你有天赋,机器学习领域的专业化是有利的。例如,拥有计算机视觉领域的通才知识是值得称赞的,但拥有关键技术(如姿态估计)方面的专业知识和专长对寻找该领域从业者的公司和组织更有吸引力。
因此,让我们使用姿态估计作为我们如何阅读与主题相关的研究论文的指南:姿态估计。
1.收集集中于主题的资源。资源可以以研究论文、媒体文章、博客文章、视频、GitHub 知识库等形式出现。
在谷歌上快速搜索“姿势估计”会给你提供包含相关主题信息的顶级资源。在这第一步,目标是整理所有相关的资源,如 YouTube 视频、实施文档,当然还有研究论文。理想情况下,在这个阶段,你认为重要的资源数量没有限制,但一定要创建一个有用的论文、视频和文章的入围名单。
2.在下一步中,你将对你认为与主题相关的任何资源进行深入研究。有一种方法来跟踪对每个入围资源的理解是至关重要的。吴恩达建议根据你的理解水平绘制一个资源表,如下表所示。
Richmond Alake 的理解资源级别表
建议你确保浏览你添加到列表中的每篇论文至少 10-20%的内容;这将确保你已经接触到足够的介绍性内容,并能够准确地衡量其相关性。
对于确定的更相关的论文/资源,期望你进步到更高的理解水平。最终,你会发现一些合适的资源,它们的内容你完全理解。
你可能会问自己,“多少论文/资源是足够的”。
我没有答案,但是安德鲁有。
根据 Andrew 的说法,理解 5-20 篇论文将展示对主题的基本理解,也许足够理解到技术的实现。
50-100 篇论文将主要为你提供一个非常好的领域理解。
在浏览了资源并提取了重要信息之后,您的表可能类似于下面所示。
Richmond Alake 更新的资源理解水平表
3.第三步是我观察到的在试图理解研究论文时对我有用的快速提示。第三步是做结构化笔记,用你自己的话总结论文中的关键发现、发现和技巧。
下面的步骤将集中在如何阅读一篇研究论文上。
阅读一篇研究论文
以理解为目的的阅读不是通过一遍文章的内容来完成的。根据安德鲁的说法,一口气把一篇论文从第一个词读到最后一个词可能不是形成理解的最佳方式。
准备好至少通读一篇论文三次,以充分理解其内容
4.在第一遍中,从阅读论文中的以下部分开始:标题、摘要和图表。
5.第二遍需要你阅读以下部分:引言、结论、另一遍图表和浏览其余内容。
论文的引言和结论部分包含关于论文内容的简明信息和任何发现的摘要。本节提供的信息通常不包括任何补充信息,只包括关键信息。这对于读者来说是有益的,因为你可以获得继续阅读本文其他部分所需的重要信息。
6.论文的第三步包括阅读论文的所有部分,但是跳过任何你可能不熟悉的复杂的数学或技术公式。在此过程中,您还可以跳过任何您不理解或不熟悉的术语。
7.那些对一个领域进行深入研究的人可以多走几关。这些额外的考试将主要集中在对论文中出现的数学、技术和未知术语的理解上。
对于那些通常出于信息和工程目的阅读研究论文的人来说,深入研究可能非常耗时,尤其是如果你有 20 多篇论文要完成的话。
我用介绍 LeNet 卷积神经网络的原始论文浏览了本文中介绍的过程,并在笔记中总结了关键内容,随后我将其转换为一系列中型文章。
[## 理解和实现 LeNet-5 CNN 架构(深度学习)
在本文中,我们使用定制实现的 LeNet-5 神经网络对 MNIST 数据集进行图像分类
towardsdatascience.com](/understanding-and-implementing-lenet-5-cnn-architecture-deep-learning-a2d531ebc342) [## (你应该)理解深度学习中的子采样层
平均池、最大池、子采样、下采样,这些都是你在深度学习中会遇到的短语…
towardsdatascience.com](/you-should-understand-sub-sampling-layers-within-deep-learning-b51016acd551) [## 理解卷积神经网络中的参数共享(或权重复制)
在深度学习研究中,参数共享或权重复制是一个容易被忽略的话题领域…
towardsdatascience.com](/understanding-parameter-sharing-or-weights-replication-within-convolutional-neural-networks-cc26db7b645a) [## 理解卷积神经网络中的局部感受野
想过为什么卷积神经网络中的所有神经元都没有连接起来吗?
towardsdatascience.com](/understand-local-receptive-fields-in-convolutional-neural-networks-f26d700be16c)
要问自己的问题
安德鲁提供了一系列你在阅读论文时应该问自己的问题。这些问题通常表明你理解了论文中的关键信息。我用下面的问题作为信标,以确保我不会偏离理解重要信息的目标。
它们如下:
- 描述论文作者的目标是什么,或者可能已经实现了什么。
- 如果一篇论文中介绍了一种新的方法/技术/方法,那么新提出的方法的关键要素是什么?
- 论文中的哪些内容对你有用?
- 您还想关注哪些参考资料?
辅助研究的额外资源
一些在线资源使得相关信息的发现和检索变得相对容易。下面是一些资源示例,可以帮助您搜索相关信息。
结论
“为了长寿,要稳步学习,而不是短时间爆发.”
—吴恩达
对于机器学习和计算机视觉领域,我还是一个新手,有很多东西我不知道(这是一种保守的说法)。尽管如此,我相信如果一个人坚持不懈地寻求知识,不管是在哪个领域,他们都会得到超越常规的理解和专业知识。
根据吴恩达介绍的技术,我每个月至少会阅读四篇研究论文,阅读到理解的程度。老实说,LeNet 论文花了我一周半的时间才全部完成。但是你做的次数越多,阅读和理解研究论文的速度就越快。
Andrew 在他的视频中表示,他随身携带了一批研究论文,打算阅读它们。Andrew 是机器学习领域的杰出人物,我相信模仿他的习惯和学习技巧会对你的学习之旅有好处。
在我主持的这个现场培训环节,用 TensorFlow 和 Keras 学习 AI 和深度学习的基础知识。
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 成为推荐媒介会员,支持我的写作
- 订阅我的 邮件列表 获取每周简讯
- 通过 LinkedIn 联系我
如果你打算从事计算机视觉或机器学习方面的任何形式的高级研究,请阅读本文…你可能…
towardsdatascience.com](/what-i-learnt-from-taking-a-masters-in-computer-vision-and-machine-learning-69f0c6dfe9df) [## 人工智能中的算法偏差需要讨论(和解决)
你在这件事上有责任…
towardsdatascience.com](/algorithm-bias-in-artificial-intelligence-needs-to-be-discussed-and-addressed-8d369d675a70)
如何保护您的数据(通过抛硬币)
关于本地化差异隐私的介绍性文章。
假设你想调查 1000 个人,问他们是否跳过了交通信号灯。你在这里收集的数据是敏感的。假设您想要建立一个关于人类行为的数据集来执行某种分析。跳过的交通信号将是该数据集的一列。
现在,作为数据集的管理者,您希望公开这些数据,以便有人可以对其进行一些统计分析。然后,分析师可以查询数据集的“跳过的交通信号”列,以确定特定的人是否跳过了信号。但是数据集中的人希望他们的数据是安全的。他们不希望分析师能够询问他们的一些事情,并百分之百确定他们的活动。
现在的问题是,我们如何确保每个人的隐私,同时还提供不太嘈杂的分析师数据,以便他/她可以从中获取价值?
我们可以进行一个简单的实验来做到这一点:
响应是(1)=跳过交通信号
响应号(0)=没有这样做。
- 扔一次硬币。如果它落在头上,这个人必须说实话(不管他/她是否错过了交通信号)。
- 如果第一枚硬币正面朝上,再掷一次。如果是正面着地,这个人必须回答“是”,如果是反面着地,这个人必须回答“否”。我们并没有给人们真正的选择。这就是我们添加“随机性”的地方。
想想一个人回答是的概率,即使那个人实际上 没有 跳过交通信号。
要做到这一点,必须进行第二次抛硬币,而且必须正面朝上。那是因为如果第一次抛的是正面,这个人会告诉他们没有跳过信号。但是如果第一次抛硬币是反面和第二次抛硬币是正面,这个人会回答是,尽管真实的回答是否
一些基本概率:
P(是|否)=P(第一次掷硬币的反面)P(第二次掷硬币的正面)=0.50.5=0.25
当真实答案实际上是肯定的时候,一个人回答肯定的概率是多少?
这可能以两种方式发生。如果第一次掷硬币是正面,他们必须说真话,也就是“是”。或者第一次投掷可能以反面和第二次正面结束。
P(Yes|Yes)=P(第一次投掷正面)+ P(第一次投掷反面)P(第二次投掷正面)=0.5 + 0.50.5 =0.75。
这里 P(A|B)是一个条件概率,意思是在 B 已经发生的情况下,A 发生的概率。如果你想了解更多关于概率的知识,你可以查看一下可汗学院的课程。
现在想象一下,跳过交通信号灯的人的“真实比例”是“p”。而那些没有的自然是‘1-p’。抛硬币实验完成后,预计会有多少个“是”的答案?
再次回顾这两个概率,我们计算。“是”有两种可能。要么这个人跳过交通信号并回答“是”(P(是|是)),要么他没有跳过交通信号并回答“是”(P(是|否))。
A.比例 1-p 谁没有跳过交通信号有多少人是期望说“是”?。
B.在跳过交通信号灯的比例“p”之外,预计有多少人会说“是”?。
如果我们把这两个预期的“是”值相加,我们就得到整个人口中“是”的预期数量。
这是期望值的正式定义。如果我们把它翻译成我们的例子,它看起来会像这样:
e(是)=(1-p)P(是|否)+ pP(是|是)
如果您仔细观察各个组件,它们会分别回答问题 A 和 B。所以 E(是)=(1-p)0.25 + p0.75。
但是 E 的真实值(是)=p。
因此,我们将“噪声”添加到我们的数据集。正如 Cynthia Dwork 在他的书《差分隐私的算法基础》中解释的那样,抛硬币给了人们貌似合理的拒绝。这意味着即使抛硬币的结果是肯定的,即使真实的答案是否定的,他们也可以否认,并归咎于抛硬币(第二次抛硬币更具体,因为在这次抛硬币中,我们并没有给这个人说实话的机会。这是随机的。).
现在假设你是一名分析师,想要查看抛硬币的人的数据。假设您想从数据集中查询一个特定的人,以确定他/她是否错过了交通信号。想象一下,如果数据没有被抛硬币保密,这将会是什么样子。
数据保护方式的图示概述。
在上面的表示中,很明显分析师不能直接访问数据库。他/她只能向警卫查询数据库。这种防护从数据库中获取数据,添加适量的噪声,然后将有噪声的答案返回给用户。
让我们用代码把它具体化。
在这里,分析师只能使用 sum 这样的查询。因此,如果分析师想知道第 10 个人是否跳过了信号,他可以在整个数据库上运行一个 sum 查询,并在没有第 10 个索引的情况下运行另一个 sum 查询。如果这两个和相同,这意味着第 10 个索引的值为 0。否则值为 1。在这种情况下,隐私被侵犯了。但是如果我们在数据中加入了噪声,那么 sum 查询就不会侵犯隐私。分析师不能确定一个特定的值是 1 还是 0。
现在让我们向数据集添加噪声,这样分析师就无法找到特定用户的信息。
以下代码也在 Udacity 上的视频中进行了讨论,这是差分隐私课程的一部分。
在上面的代码中,增加的数据库是在两次抛硬币后获得的。有趣的是,我们将增加的平均值乘以 2,然后从中减去 0.5。这是为什么呢?
再回头看看我们推导出的公式,在每个人都抛了两次硬币后,预期的“是”的数量。那是:
e(是)=(1-p) 0.25+p * 0.75 = 1/4-p/4+3p/4 = 1/4-p/2。*
这个期望值并不能真实代表总体。即使我们给用户增加了隐私,我们也不能把这种意思报告给分析师。我们仍然希望分析师获得关于数据集的有价值的信息,同时保护所有用户的隐私。
所以本质上我们需要从 1/4 -p/2 得到 p。这是通过将整件事乘以 2 并从中减去 0.5 来完成的。
从上面的代码中,我们发现拥有更多的数据可以让我们更容易地报告人口的准确表示,同时还能保护用户的隐私。随着数据点的增加,真实平均值和噪声数据的平均值收敛。现在我们也可以试着偏向硬币来增加更多的噪音。
假设我们只偏向第一个硬币,让尾部概率=噪声,其中噪声的值介于 0 和 1 之间。
看看概率是如何变化的:
*P(是|否)=P(第一次掷硬币的反面)*P(第二次掷硬币的正面)=(噪音)0.5
P(是|是)=P(第一次投掷正面)+P(第一次投掷反面)P(第二次投掷正面)=(1-噪声)+噪声0.5
e(是)=(噪声) 0.5 (1-p)+(1-噪声+噪声0.5)p 这个和我们之前做的差不多。我刚刚用 t 代替了 P(第一次投掷时正面朝上)。
因此,简化方程后,我们得到:
e(是)(有噪)=噪声 0.5+(1-噪声)p .这是增广数据的期望值。
经过一些重新安排:
真 E(是)=(E(是)/噪声-0.5)(噪声/(1-噪声))=p*
让我们看看代码:
在第一次抛硬币时,我们将其建模为 torch.rand(size)>噪音。这意味着只有当它大于噪声时,我们才赋值 1。或者换句话说,我们分配 1(1-噪声)比例的时间,这只是正面的概率。看看最后一个例子,我们有 10,000 个数据点,并添加了 0.9 的噪声!这确保了用户的高度隐私。
但是等等,在有 10,000 个数据点的情况下,我们对真实均值的估计也非常接近实际均值“p”。这意味着,如果有大量数据点,我们可以添加大量噪声,但仍能保持报告数据的准确性。
因此,当有更多的数据时,本地差分隐私可以更好地工作。这听起来可能有点违反直觉,但它是有意义的,因为我们有更多的数据噪声往往会相互抵消,我们可以获得更好的人口代表。
我希望这是关于差分隐私的一个很好的介绍。很快就会见到你!
参考资料:
- 一种不加噪声的局部 DP 实现。
2.加入噪声后局部差分法的一种实现。
3.可汗学院的概率课程。
如果您看到此消息,这意味着我们在网站上加载外部资源时遇到了问题。如果你是…
www.khanacademy.org](https://www.khanacademy.org/math/statistics-probability/probability-library)
4.链接到辛西娅·德沃克和亚伦·罗斯的《差分隐私的算法基础》。这是深入挖掘差异隐私的书。
。https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf*
如何优化您的模型|了解您的优化
对“为什么我的模型永远在运行?”还是那句经典的:“我觉得它可能已经收敛了?”
普通数据科学家或 ML 工程师日常使用的许多模型背后的驱动因素依赖于数值优化方法。研究不同功能的优化和性能有助于更好地理解流程是如何工作的。
我们每天面临的挑战是,有人给了我们一个他们如何看待世界或他们的问题的模型。现在,你作为一名数据科学家必须找到问题的最优解。例如,你看着一个能量函数,想找到一个绝对的全局最小值,使你的工具工作或你的蛋白质稳定。也许你已经建立了用户数据模型,你想找到一个给定所有输入特征的理想客户——希望是连续的输入特征。这里全面总结了优化器是如何工作的。
基准函数——曲线函数、弯曲函数和非对称函数
在我们遇到我们的优化器之前,我们必须熟悉我们想要优化的函数。我个人最喜欢的三个是:
- 好好先生就是椭球函数。它总体上表现良好,是凸的,并且有一个全局最小值。
它的定义是:
- Rosenbrock 或香蕉功能。它不像我们的椭球那样好,因为它的死亡之谷对优化算法来说是一个挑战。它被定义为:
- 扭曲的是我们的吸引扇形函数。这是最不寻常的选择,因为它是非凸的,并且在最小值周围不对称。它被定义为
图 1a)R 中的椭球函数。较低的函数值用蓝色表示,全局最小值在(0,0)。
图 1b)R 中的 Rosenbrock 函数。较低的函数值用蓝色表示,全局最小值在(1,1)处,位于谷中。
图 1c)R 中的吸引扇区函数。较低的函数值用蓝色表示,全局最小值在(0,0)附近。
这是一个易于理解的函数选择,并且存在大量可用的基准函数来运行您的优化器。从 Styblinski-Tang 功能的深度到 Rastrigin 的美丽窥视。其中一些是现成的,如[1]中所示。
As you might have noticed the functions work on R^n and we provide an input vector **x** ∈ R^n. We will only be looking at two dimensions R^2 and three dimensions R^3 to make the display easier.
现在我们已经建立了一个平台,我们可以加载我们选择的工具,比如带有优化库的 scipy 。我们的目标是捕捉优化器如何在给定不同起点的基准函数上找到最小值。我们只是挑选任何优化程序,如简单的梯度下降“CG”或更复杂的 BFGS。事情是这样的:
from scipy.optimize import minimize# import benchmark function with its derivatives
from scipy.optimize import rosen
from scipy.optimize import rosen_der
from scipy.optimize import rosen_hessimport numpy as npdef banana(x, y):
“””
a nice 2D way to look at Rosenbrock
“””
return (1 — x)**2 + (100 * (y — (x**2))**2)# we select some interesting optimizers:
OPTIMIZERS = [‘CG’, ‘BFGS’, ‘Newton-CG’, ‘dogleg’]
FUNCTIONS = {‘rosen’: [rosen, rosen_der, rosen_hess, banana]
# feel free to add or implement ellipsoid or other benchmark functions here with their derivatives
}start_values = np.random.uniform(low=x_min, high=x_max, size=(10, 2))start_iter = 1
max_iter = 50
step = 1
x_min, x_max = -5, 5
y_min, y_max = -5, 5def optimize_funct(fname, funct, x0, derivative, hess, optimizer, iteration):
“””
Just a wrapper around the scipy minimize function
“””
fitted_min = minimize(funct, x0=x0, method=optimizer,
jac=derivative, hess=hess,
options={‘maxiter’:iteration})
return fitted_min# run actual optimization
fitted_optimizers = {}
for opt in OPTIMIZERS:
fitted_optimizers[opt] = {}
for name, functs in FUNCTIONS.items():
fitted_optimizers[opt][name] = []
f = functs[0]
fd = functs[1]
fdd = functs[2]
f_2d = functs[3]
for vals in start_values:
computed_values = []
x, y = vals
z = f_2d(x,y)
# include start values before optimization
computed_values.append(np.array([x,y,z]))
for i in range(start_iter, max_iter, step):
out = optimize_funct(fname=name, funct=f, x0=vals, derivative=fd, hess=fdd,
optimizer=opt, iteration=i)
# only save the output values (stored under x)
x, y = out.x
z = f_2d(x, y)
computed_values.append(np.array([x, y, z]))
fitted_optimizers[opt][name].append(np.array(computed_values))
并非每个优化器都是平等的。有些需要一阶导数,有些需要二阶导数作为我们的优化函数,也就是 Jakobian 函数和 Hessian 函数。要额外简要回顾这些是什么以及它们是如何工作的,你可以看这里的。需要记住的一件事是,我们从不同的起始位置开始,让优化器自由漫游——我们现在还没有进行约束优化。
图 2——使用标准梯度下降法从不同起点绘制的椭球函数等高线图。每一步都是“+”。优化器在几个步骤后找到全局最小值。
图 3——罗森布罗克-(香蕉-)函数的等值线图。梯度下降首先走进正确的方向(见黑色“+”),但它寻找全局最小值无济于事。它所穿越的山谷的功能价值已经很低,而且关于下一步该去哪里的信息也不多。
图 4。属性。函数的扇形等高线图。函数空间上的 BFGS 优化。给定三个起点(三种颜色),每一步用一个黑色十字表示。最小值很快被发现,我们可以看到线性方法(CG)与 BFGS(属于拟牛顿方法家族)相比表现如何不同。
就我个人而言,它对我很有帮助,让我看到优化过程是如何在不同的函数空间中移动的。在上图中,你可以看到 CG 和 BFGS 的表现。现在 CG 是 scipy 实现 渐变下降 的名字。这是简单明了的优化过程,也是经典的线搜索法。另一方面,BFGS 使用近似的高阶信息。因此,BFGS 把它归类为一种准牛顿法。
A quasi-Newton method approximates higher order information like the Hessian Matrix (second order derivatives) and makes improvements per each step taken. [2]
线搜索|回溯一切。
一种优化方法是简单地遵循给定基础函数的一条线(见图 2 和图 3)。我们通过回溯保留了一些信息,但仅此而已。为了优化,我们可以利用函数的一阶导数信息。具有回溯的线搜索优化的直观公式是:
- 计算你的点的梯度
- 根据你的梯度和步长计算步长
- 向优化方向迈出一步
- 通过预先定义的因子(如α)调整步长
- 重复,直到找到最小值,或者您的步骤之间的值差异非常(非常)小,例如 0.00000001
Gradients give us information on how the slope of a function behaves. We take the gradient as the first-order-derivative or partial derivative of a function. It is depicted as a vector and defined as:
信任区域优化器|循环思考
除了直视前方和后方,我们还可以 360 度全方位地环顾四周。我们查看我们的功能信息,如雅可比和海森,并朝着正确的方向迈出最佳的一步。为了实现这一点,我们考虑二次模型函数:
,其中 g 是 f 和 B 的梯度。
当我们进行优化时,我们针对 p 进行优化,并适当调整我们周围的半径。这看起来像:
图 attr 轮廓的信赖域优化。-部门职能。每一步都用“+”表示,每一步的周围是一个区域,从该区域中选择下一步作为一个圆。
程序的直观表述可以是这样的
(参见附录中的正式表述):
- 计算函数的 Hessian 和梯度
- 在您位置周围的半径范围内选择一个最佳点
- 根据计算出的信息采取措施
- 根据你进步的多少来调整半径的大小——越接近最小值越小,否则就越大
- 重复直到达到收敛或公差
当然,这些简短的步骤并不十分复杂,你需要更多的参数和更多的数学知识来找到你半径中的正确点,调整步长和半径。如果你感兴趣的话,你可以去看看 Alg。附录中的 1 和 2。我们可以在实践中观察算法,看看半径如何随时间变化:
图 6 —采取的步骤(x 轴)中函数值的幅度变化(y 轴)。半径δ随着函数值的提高而变化。
我们看到,如果函数值随着时间的推移而提高,那么我们的半径会变小(见图 5 和图 6),而如果一开始函数值不好,我们会增加半径。参见图 6 中对吸引扇区函数进行优化的第一步。
我们起始问题的答案
来回答这个问题:“我的模型收敛了吗?”。我建议如下
- 测试不同的优化算法,比较性能和确定的最小值——它们是全局的吗?
- 如果你的问题表面是平坦的,也就是说在优化过程中只有很小的变化:运行更多的迭代,增加容差(收敛-差异的值非常小),也许尝试跳到函数的不同区域
- 从多个不同的起点开始:选择均值或中值来衡量绩效。
结论|兔子洞
我们已经看到了两类优化方法是如何工作的:直线线性优化器和信赖域优化器。这只是兔子洞的入口。对于我们看到的每个函数和问题,我们都能发现新的东西。我们可以分析我们的 Jacobian 或 Hessian 矩阵如何运行,以使我们的优化器完成工作。我们必须看看函数的形状和性质。显然,存在着大量可用的证明和定理,它们是我们刚刚看到的内容的数学支柱。如果你想深入了解原始数学,我推荐你去读一读《T2 数值优化》这本书。)作者 j·诺切达尔和 s·j·莱特[3]。
承认
我在这里展示的大部分工作都是我在参加大学——DIKU的数值优化课程时完成的。没有课程官员的指导,这是不可能的。
参考
[1] MathWorks 全局优化算法的测试函数
【2】c . Geiger 和 C. Kanzow。拟牛顿-弗法伦 斯普林格1999
【3】j .诺切达尔和 S. J .莱特数值优化(第二版。斯普林格 2006 年
附录
信赖域算法
图 A1——图 5 中信赖域优化的算法
图 A2 — Alg。求解 p——求解λ是另一个子问题。
“你是如何开始机器学习和数据科学的?”[面试]
我在 2017 年在朋友的休息室地板上训练了我的第一个模型。
2020 年对最先进机器学习的要求:鲻鱼。就是这样。山姆·伯克的照片。
前几天,这位绝对和完整的活着的传奇人物,数据科学的负责人和令人难以置信的数据科学相关的 YouTube 视频、 Ken Jee 的创作者,找到我,问我是否想合作一个(或两个)视频。
我说当然。
我们决定问答,来回类型的视频将是最好的。
所以他发给我一些他可能会问我的问题,为了准备,我写下了每个问题的答案。
现在我把它们复制到这里。
首先,你是如何对数据科学/机器学习感兴趣的?
2017 年,我和我的朋友们正在构建一个 web 应用程序(非常原始),将我们所在地区的本地健身房链接在一起。我们的问题是不能在任何我们想训练的时候一起训练。所以我们有了做健身设施 Airbnb 的想法,你可以去某个地方和你想要的人预定时间/空间和锻炼。
过了一段时间,我们意识到许多健身房的商业模式依赖于人们不去健身。因此,我们试图通过我们花哨的小应用程序(称为 AnyGym)来增加更多的人并没有真正实现。
另外,火花过了一会儿就消失了,因为每个人都有自己的事情要做。这个项目从来没有真正给我们任何人留下超过边项目阶段。
与此同时,我辞去了在苹果零售店的工作(我是天才之一,那些帮你操作电脑的人),重新开始学习编程(我的第三次到第四次尝试)。
由于我缺乏技能和短暂的注意力跨度,web 开发对我来说有点太乏味了。当然,2017 年是机器学习炒作的高峰,所以在我的搜索中,我偶然发现了各种各样很酷的东西。尤其是 Udacity 全新的深度学习 Nanodegree 和一个叫 Siraj Raval 的开朗角色。漂亮的颜色,有魅力的个性,这一切都吸引了我。所以我从一开始就注册了 2-3 周,对 Python 一无所知。
我想,“哇,计算机为你学习?”…我可以绕过它。
我认为我已经超出了我的能力范围(在阅读了我没有的先决条件列表后),我发电子邮件给支持部门询问退款政策是什么。幸运的是,我没有坚持退款,并决定继续学习。
你在大学学的是什么?(我觉得你说的营养对吧?)
我从生物医学科学开始,但是我的前 2 年是在追女孩、闲坐、健身、去附近的瀑布而不是去上课。
最终,理学院院长给我发了一封邮件,让我过来看看。
他基本上是说,“我们为什么要把你留在这里?”(但措辞要好得多)。
我用了我爸爸生病的好借口(他确实生病了),但真正的原因是我很懒,试图研究一些并不能真正激发我好奇心的东西。
我会发现自己会熬夜看 YouTube 上健美运动员和世界级运动员为表演而吃东西的视频,而不是阅读讲稿。
院长听到了风声,说:“你为什么不改学营养学?”。
这让我震惊。
因为我想,“你可以选择学什么?”。
你看,这就是我有多天真。我选择了生物医学,因为我觉得说“我正在学习成为一名医生”听起来很酷。
所以大学两年后,我转到了营养和食品科学。我的一些生物医学科目也算,但不是全部。所以 3 年制本科变成了 5 年制。
但是我真的不在乎学位本身,知识对我来说更重要。
即使是现在,人们还会问,你拿着营养学位干什么?我傻笑着告诉他们,“我被撕碎了。”
我带着比学位更有价值的东西离开了大学。
我离开时的想法是,如果有什么东西激发了我的好奇心,我就可以去追寻它。
你是从什么概念开始学习机器学习的?(小项目或学习理论)
我从深度学习开始(深度学习纳米学位是我上的第一门课)。我记得在我朋友的地板上,在 CIFAR10 上训练我的第一个卷积神经网络,并向他展示输出。
我给他看了识别飞机照片的模型,他问你怎么做到的,我说我没有,电脑自己学会了。你应该看看他的脸。
Udacity 和 Coursera 的课程是理论和小项目的混合体。尽管这些项目都是手工完成的(一位教师会为你制定步骤),但我认为这对你的起步是很重要的。如果你尝试的事情太过遥不可及,你会失去动力并停下来。
在你不确定的事情上测试你的能力和走得不够远之间是一条细微的线。如果你不测试自己,你最终会回到你已经学过的内容。
然而,这并不总是一件坏事,因为学习不是线性的。当我复习第二遍的时候,我学到的东西是第二遍的两倍多,第三遍是第三遍的三倍多,以此类推。
你是如何将机器学习与你个人的兴趣结合起来的?
我还没有完全,因为,我开始有了将机器学习与健康和营养相结合的想法。
但现在我意识到,机器学习只是工程师工具箱中的另一个工具。一旦你获得了这个工具,你很容易认为这个工具可以用于任何事情。
我确实有一些关于它如何集成的想法,但我很惭愧地说,我没有像我希望的那样遵循它们,现在有一个正在工作中,但我会保密,直到原型准备好。
另外,我对生物学了解得越多,对数学了解得越多,对维数灾难了解得越多,像个性化医疗这样的事情可能在数学上是不可能的。
也就是说,我是团队的一员,更确切地说,我坐在一个团队的对面,这个团队正在进行一个名为 IOP(免疫治疗结果预测)的项目。他们试图获取不同的生物参数,如某人的基因组,并判断他们是否是免疫疗法的潜在候选人。比如,治疗对他们有效的可能性有多大(个性化,但非常小众)。考虑到治疗费用大约是每年 100,000 美元,这是很有价值的(对于可能不起作用的东西来说,这是一笔很大的费用)。
在将机器学习与我的兴趣结合起来的另一方面,我确实对创造艺术有浓厚的兴趣,我指的是写作、摄像、学习艺术本身。所以我有点变成了冷冻酸奶机器,写关于学习机器学习的东西,在上面制作视频。我的朋友都不知道我在做什么,所以我觉得我必须在这个世界上做点什么,才能找到对我感兴趣的人。
我觉得有很多关于如何处理机器学习和其他形式的代码的教程,但是没有一个人谈论如何处理它。比如,真正学到东西需要什么?
为什么有人选择做他们所做的事?
如果有 51443 人和我一起注册了在线课程,我想知道他们每天除了学习材料还做些什么。
他们也在卧室学习吗?
这就是我开始做的东西。
你是如何在网上学习的同时找到工作的?
当我在学习的时候,我在周末开车去优步支付课程、书籍、食物和租金(我是一个隐士,所以这些是我唯一的花费)。后来有一天晚上,我因为在错误的地点接人而被罚款。罚款 220 美元,比我一整晚挣的都多。我坐在送这些人下车的路上,好像是凌晨 2 点,在一个周日的早上,我对自己说,我在这里接醉汉并把他们带回家(安全地),我被一个站在路边用智能手机拍照的人扇了一巴掌。
回家的路上,到了这个阶段,已经接近凌晨 3 点了。我当场就决定了。我再也不开优步了。这是一件大事,因为通常周日下午我会得到一大笔车费,因为周五晚上,周六晚上和周日是唯一真正开车的好时间。所以那个星期天早上我醒来时很累,但我基本上已经忘记了罚款,因为我有了新的任务。
我在我的自创人工智能硕士学位进行了大约 8 或 9 个月,我想,去他妈的,我会弄明白的。
我最初的计划是买一张去美国的单程票,然后在那里的某个创业公司找份工作。
回想起来,我的技能可能有 70%准备好了在任何地方工作(这是一种奇特的说法,我没有自己想象的那么好),但在我的脑海中,我知道我能够想出一些办法。
四天后出现了突破。
正如我之前提到的,我已经变成了一台放东西的冷冻酸奶机器。和我一起工作的一个叫 Ashlee 的女孩注意到了我在 LinkedIn 上发布的内容。
Ashlee 和一个叫 Mike 的人一起工作,他认识一群科技界的人。她给我发了一条信息说,“嘿,丹,我看到了你发的帖子,你可能有兴趣见见迈克”。
所以我说当然,并会见了迈克。
原来,迈克是一个很酷的人,当我们交谈时,他说你应该见见卡姆,他是马克斯·凯尔森的健康负责人。我眼前一亮。
大约一周后的周一,我遇到了小卡。我们聊了聊,我告诉他我一直在做什么,在房间里研究人工智能,在网上做东西,开优步,还有我在美国的计划。
然后他问我,“为什么是美国?”。
这让我大吃一惊。因为我真的没有答案。除了我在网上看到的来自美国的东西。
他继续对我说,如果我愿意,我可以在这里(我住在澳大利亚的布里斯班)做我想做的事情。当然,这里指的是马克斯·凯尔森。
“你为什么不在星期四来?”他问。
于是我照做了。然后下一个星期四(在这段时间里,我主要从事探索性的数据分析工作,没有机器学习,只是用熊猫清理数据)。在那之后的周四,我和首席执行官尼克以及机器学习负责人 Athon 去了路边的咖啡馆,他们给了我一个角色。
大约 14 个月后,我和尼克去了同一家咖啡馆,递交了辞职信(这是一个非常艰难的决定,因为这是我做过的最好的工作),然后离开去开创自己的事业。
对于希望从头开始学习机器学习的人,你有什么建议?(或者说你是怎么做到的?)
如果我有时间,我最大的改变是学习更多的软件工程技能。我会扭曲我的人工智能硕士学位,以包括更多的东西,如 web 开发或全栈开发。
我会在短时间内学习,然后在短时间内完成项目。比如,1-3 个月的学习(从零开始),然后用这些知识做一个项目至少 1 个月。
你看,我一直在想获得证书和完成更多的课程会带来更多的技能。但事实并非如此。
当然,课程有助于建立基础知识,但通过试错来完成自己的项目才是真正的学习。
我知道这一点,因为这基本上是我在担任机器学习工程师时所做的全部工作,我会使用在课程中和通过各种其他资源学到的基本技能,为各种企业构建小型概念验证项目。但是我们一直面临的瓶颈是如何将我们的产品投入生产。
正是在这里,我了解到机器学习在很大程度上是一个基础设施问题。这就是为什么如果我有时间,我会在学习机器的同时学习软件工程。我不会让我的模特死在 Jupyter 笔记本里,而是让更多的模特死在别人手里。
如果你是一个完全的初学者,这一切可能听起来完全超出你的理解。但别担心,每个人都会经历那个阶段。事实上,我认为你学得越多,你就越意识到自己不知道。所以你的情况永远不会真正改善,你只是(希望)在决定下一步追求什么方面变得更好。
但是如果你在寻找具体的步骤,试试这个:
我会先学习 Python,熟悉这门语言,然后学习一些机器学习课程(所有课程都很好,只需选择一两门引起你兴趣的课程)。
除了学习 Python 和各种机器技能,我还会学习全栈 web 开发和各种软件工程技能。
更简洁地说:
学习机器学习概念
- 浏览人工智能的元素**(从总体上了解机器学习的全貌)。**
学习 Python
- 学习 Python 基础知识(如果你能用 Python 写一个函数,你就是在阅读开始学习机器学习)。
- 学习熊猫(用于数据操作)。
- 学习 NumPy(用于数值计算)。
- Learn Scikit-Learn(黄金标准的机器学习库)。
- 学习深度学习(fast.ai 或者 deeplearning.ai 都很棒)。
- Plug: 我的机器学习课程教授以上所有内容。
学习全栈 web 开发(与 Python 一起)
- freeCodeCamp 的课程足够扎实。
- 更多信息,请阅读 Jason Benn 的《我如何学习编码》一文。
学习软件工程技能(在你需要的时候,或者在 6-12 个月之后)
- 浏览 CS50(计算机科学 101 +计算机/互联网如何工作)。
- 仔细检查你的计算机科学学位缺失的部分(这里有很多工具,你最终会用它们来建造东西)。
- 浏览全栈深度学习课程(这将帮助你让你的机器学习模型走向世界)。
临时演员…
- 浏览可汗学院提供的任何你需要的主题。
- 如果你能找到一个小组一起研究不同的东西,这将是惊人的。
- 你可能想要熟悉至少一种云计算产品(AWS、GCP 或 Azure)。
当然,一路上分享你的工作,创建你自己的博客,向 GitHub 发布代码,分享你的机器学习项目(试着用 Streamlit 在用 ML 制作的上构建这些项目(不管它们是什么)。
要以视频格式查看这些问题的答案,请查看 Ken YouTube 上的视频:
我还在我的频道上采访了 Ken(问了一些问题,比如他在采访初级数据科学家时会寻找什么):
如果你有任何进一步的问题,或者只是想打声招呼,请留下回复或者给我发电子邮件。
人力资源分析和测试假设的艺术!
随着技术在人力资源部门扎根,科技巨头开始探索人工智能和人工智能可以给人力资源带来的无限可能性,测试假设的简单艺术仍然可以帮助人力资源做出有意义和有影响的推断。
假设检验和 p 值背后的思想是什么?
假设一家公司生产了一种新冠肺炎检测试剂盒,并声称该检测具有 99%的准确性,即如果检测试剂盒的整个群体用于检测个体,99%的检测结果将是正确的。然而,如果我们从检测试剂盒的人群中取样,并不是所有的样本都是 99%准确的。有些样本可能 100%准确,而有些样本可能只有 95%准确。假设某个拥有无限智慧的人给了我们,从声称 99%准确的总体测试中获得不同准确水平的样本的概率(如下所述)。下表显示了在给定总体准确度为 99%的情况下,获得准确度为 x%或更低的样本的概率(由某人提供给我们):
现在,如果我们想从人群中抽取 100 个测试包来测试公司关于测试包准确性的声明,我们可以通过假设检验来实现。让我们从陈述这个测试的“无效”和“替代”假设开始。
Ho(空):测试的准确率是 99%
Ha(备用):测试的准确率低于 99%
假设,我们选择的样本有 95%的准确率。现在,我们知道,如果我们的零假设为真,即如果测试试剂盒确实有 99%的准确性,那么选择准确性小于或等于 95%的试剂盒样本的概率将为 0.3%(或“p 值”将为 0.003)。这意味着在零假设下,获得 95%准确度的样本是非常不可能的。因此,我们拒绝零假设,接受替代假设。
有人可能想知道,我们是如何决定 p 值的临界值的,在这个临界值以下,我们可以拒绝零假设。答案在一个被称为“显著性水平”的阈值概率中。如果 p 值低于显著性水平,我们拒绝零假设。通常,采用 5%的显著性水平,但用户可以根据所需的确定性水平选择另一个值。
假设检验如何在分析人力资源数据中发挥重要作用?
一个组织想要确定与其他员工相比,提前辞职(入职六个月内)的员工是否接受了更短时间的面试。让我们假设组织有足够的理由(通过反馈和调查)怀疑较短的面试时间可能是影响提前辞职的因素之一。为了解决这个问题,人力资源部门收集了 2019 年 1 月至 12 月聘用的员工(具有相似的背景和经验,并被聘用担任相似的角色,以保持可能的复合因素不变)的面试数据,并将他们分为两组-在六个月内辞职和超过六个月继续工作。以下是两组的描述性统计数据:
描述性统计:
根据描述性统计,我们了解到两组的平均采访时间存在一些差异。假设分析是在 2020 年 5 月进行的,现在基于从上述样本中获得的差异,我们是否可以说它对 2020 年 1 月雇用的员工成立,或者对 2018 年 1 月雇用的员工成立?人力资源收集的数据仅代表该组织在其运营过程中雇用的人员样本。我们怎么能说从样本中获得的结果对总体是正确的呢?这就是假设检验可以帮助弥合差距的地方。假设检验通过检验两个或两个以上总体或数据组的样本,从统计学上确定它们是否有显著差异。为了检验上述数据,让我们从建立零假设和交替假设开始:
ho:6 个月后继续工作的员工和 6 个月后辞职的员工的面试时间是一样的
ha:6 个月后继续工作的员工的面试时间比 6 个月内辞职的员工的面试时间多
使用不等方差的 2 样本 t 检验(韦尔奇 t 检验)来检验这一假设,显著性水平(α)设为 0.05。
韦尔奇 t 检验:
自由度:
测试结果:
4.108*10^-7 的 p 值表示“如果零假设为真”,我们从两个总体中抽取多个随机样本,那么样本均值之间的差异(5.9–4.8 = 1.1 或更大)的概率为 0.000041%。这一概率小于 5%。因此,我们拒绝零假设,即总体均值之间的差异不为零,这表明在 6 个月内辞职的员工比留下的员工接受的面试时间短。
后续行动:
假设检验不是结果,而是进一步分析的开始。曾经,我们已经确立,早走的员工面试时间更短;我们应该进一步尝试确定缩短面试时间是如何导致提前辞职的。分析数据以发现问题,如“面试时间缩短是否会导致沟通障碍,从而导致员工加入时的期望不匹配?”或者“一个基于简短面试的快速决定导致了被雇佣员工的技能和角色的不匹配”可以帮助我们到达真正问题的深度。为了进一步解决这些问题,我们还应该尝试确定最佳的面试时间,以解决已发现的问题,并帮助我们提高员工忠诚度。
一旦确定了最佳面试时间,就应该根据分析数据得出的结果重新设计面试体验。新的面试流程/形式应在员工样本上进行测试。如果获得了满意的结果,面试体验的重新设计就可以在组织层面上实施了。
人力资源预测分析:评估经理绩效(第 1 部分)
预测分析和人力资源
通过预测模型和 R 的应用,探索是什么因素驱动着公司经理的绩效
本文是一项更具技术性的工作,展示了机器学习技术在人力资源数据集上的逐步实现,以了解经理的绩效。数据集取自基思·麦纽提的帖子,他在那里分享了这个用例以及数据集。这是关于评估组织中经理的绩效的 2 部分系列的第 1 部分。在本文中,我将介绍数据集的数据准备和探索性数据分析。
目标:
一家公司的首席执行官对其经理的表现感兴趣。使用 实验 数据集,本工作的主要目标是探索以下内容:
- 对数据集进行探索性数据分析,以确定数据集中可能对性能产生影响的变量
- 进行机器学习建模方法,以确定哪些变量对经理的绩效有较强或较弱的影响
- 提供分析工作的见解和局限性
第一步:数据准备
我首先加载数据集并快速浏览数据。数据集包含每个经理的绩效数据。我已经用 R 中的 dataexplorer 包进行了一系列的数据探索性分析。
perf.data <- read.csv("data.csv",header = TRUE)# Quickly visualize the data by using the plot_str functionperf.data %>%
plot_str(fontSize=80)# Return first 5 rows of the dataset
perf.data %>%
head(5)%>%
kable() %>%
kable_styling(bootstrap_options = c("hover","striped","condensed"),full_width = F)
数据集混合了字符和数字变量。 性能组 是我们要研究的与数据集中所有其他变量相关的列。以下是数据集中字段的简要描述:
- 每位经理的员工 id
- 绩效 _ 每位经理的分组:绩效最低、中等或最高
- yrs_employed:以年为单位的总工作时间
- manager_hire:个人是被直接聘用为经理(Y)还是晋升为经理(N)
- test_score:给所有经理的测试分数
- group_size:他们管理的组中的员工数量
- concern_flag:经理们是否收到了来自其团队成员的投诉
- mobile_flag:个人是移动工作(Y)还是在办公室工作(N)
- 客户:经理负责的客户账户数量
- high_hours_flag:经理是否在他们的时间表中输入了异常高的小时数
- 调动:当他们是经理时,来自经理小组的调动请求的数量
- reduced_schedule:经理是兼职工作(Y)还是全职工作(N)
- 城市:经理的当前办公室
第二步:探索性数据分析
探索性数据分析是了解数据的过程,以便我们可以生成和检验我们的假设。使用 R 中的 data-explorer 包,很容易可视化数据集的内容,尤其是在数据集中有缺失值的情况下。
- 简介
这里是数据集的介绍,我们探索数据集的结构,并确定任何丢失的值。
# Visualize the data
plot_intro(perf.data)
# Lets visualize if any missing data exists in the dataset
plot_missing(perf.data)
我们正在处理一个干净的数据集,它的任何一行都没有丢失数据。在现实世界中,我们经常会遇到杂乱的数据。
由于我们对驱动性能组的因素的理解感兴趣,下表显示了每个性能组的数据分布。
# Return %ages of workers in different classes of performance groupperf.data %>%
group_by(performance_group) %>%
summarise(n = n()) %>%
ungroup() %>%
mutate(pct = n / sum(n))%>%
kable() %>%
kable_styling(bootstrap_options = c("hover","striped","condensed"),full_width = F)
绩效 _ 组分布表
我们可以看到,65.8%的管理者属于中等绩效群体。这是一个重要的观察结果,我们将在第 2 部分提到。
第三步:分配
通过条形图、直方图、QQ 图,我们更仔细地检查数据,以获得一些高层次的见解。
# This plot visualisizes frequency distributions for all the discrete features
plot_bar(perf.data)
离散变量的频率分布图
仔细观察非数值离散变量的频率分布,我们可以发现:
- 大多数经理已被直接提升至经理职位(图 2)
- 大多数经理位于多伦多和纽约办事处(图 7)
现在让我们可视化所有数字/连续变量的分布。
plot_histogram(perf.data)
连续变量的 qq 图
我们可以看到,变量 customers、group_size 和 yrs_employed 的子图向左或向右倾斜。
我生成的下一个图是分位数-分位数图,它有助于可视化特定正态概率分布的偏差。
在进行任何建模工作之前,通过处理数据使分布正常化是一个很好的做法,这样分布更接近正常模式(图中的对角线)。我们通过将变量转换为它们的对数值来实现这一点。根据 qq 图,我们可以看到客户、group_size 和 yrs_employed 的数据似乎在两个尾部都是倾斜的。我对变量进行了简单的对数变换,并再次生成了 qq 图
# Lets run the qq plot after converting the variables into the log values.log_qq_data <- update_columns(qq_data, c("customers", "group_size", "yrs_employed"), function(x) log(x + 1))plot_qq(log_qq_data[, c("customers", "group_size", "yrs_employed")], sampled_rows = 1000L)
对数转换变量的 qq 图
现在分布看起来更好了。我们还可以通过另一个特性(如 performance_group)来可视化 qq 图,这是我们研究的目标。
# Now lets visualize the QQ plot by the feature Performance_groupqq_data <- perf.data[, c("customers", "group_size", "yrs_employed", "test_score","performance_group")]plot_qq(qq_data, by = "performance_group", sampled_rows = 1000L)
从上面的情节中,我们可以看出:
- 表现优异者拥有更大的客户群和更高的测试分数,这是意料之中的
- 优秀的员工也管理更大规模的团队
- 公司中更有经验的经理也更有可能属于绩效最差的那一组
第四步:相关性分析
相关性分析旨在揭示特征变量与目标变量之间的任何依赖性/相关性。换句话说,我们试图了解绩效是否受到雇佣年限、工作时间、团队规模、客户数量等因素的影响。
# Plot correlation plot to display relationshipsplot_correlation(na.omit(perf.data), maxcat = 5L)
相关图
有些相关性是众所周知的,例如 high_hours_flag_N 对客户有负相关性。这意味着没有标记高工作时间的经理可能会有较少的客户。
在本文的第 2 部分,我将分享一种基于机器学习的方法,来探索什么样的特征会影响管理者的表现,这种影响有多强,以及背后的原因是什么。
参考文献:
Github 帐户以及 R:https://github.com/Sambit78/ebp_exercise中重构的代码
链接到原始数据集和问题:https://github.com/keithmcnulty/ebp_exercise
人力资源预测分析:评估经理绩效(第二部分)
预测分析和人力资源
通过预测模型和 R 的应用探索驱动公司经理绩效的因素
这是我的评估组织中管理者表现系列的第二部分。在完成了第一部分中的数据探索过程后,我开始研究机器学习模型在用例中的应用。数据集取自基思·麦纽提的帖子,他在那里分享了这个用例以及数据集。
步骤 5:定义训练和测试数据集
我将在训练数据集上构建模型,并在测试数据集上验证计算出的模型。这意味着模型将在包括性能组在内的所有数据字段上进行训练。训练数据集将使模型能够决定哪些因素促成了性能组中的变化。对测试数据集的模型评估意味着我们将隐藏测试数据集的性能组列,并要求模型预测测试数据集中每一行数据的性能组级别。将数据划分为训练和测试数据集是随机的。随机样本是使用 sample()函数和 seed 函数()生成的。
#Dividing data into training and test set#Random sampling
samplesize = 0.80*nrow(perf.data)
set.seed(100)
index = sample(seq_len(nrow(perf.data)), size = samplesize)#Creating training and test set
datatrain = perf.data[index,]
datatest = perf.data[-index,]
第六步:建立有序逻辑回归模型
现在,我将使用训练数据集构建模型。众所周知,因变量(我们正在研究的变量)是绩效组变量。我已经创建了一个上层/基本模型,其中包括与单个因变量 performance_group 相关的所有输入变量。
# Define upper model;
upper.rm <- polr(performance_group ~ yrs_employed + manager_hire + test_score
+ group_size + concern_flag + mobile_flag + customers
+ high_hours_flag + transfers + city,data=datatrain)
summary(upper.rm)
该表显示了系数和截距的值,以及相应的标准误差和 t 值。对系数的解释如下。例如,在保持其他一切不变的情况下,一个单位使用的 yrs _ 值的增加会降低预期的绩效值(对数概率为-6.2)。同样,可以解释对等体和质量的系数。AIC 是对信息损失和模型拟合的一种度量。在下一步中,我将使用自动特征选择技术来确定产生最佳 AIC 分数的特征的最佳数量。
步骤 7:使用步骤 AIC 的自动特征选择
在第 6 步中,我已经使用所有输入变量创建了有序逻辑回归模型。这里的想法是通过只选择有助于预测性能的重要输入特征来简化模型。为了进行自动特征检测,我在 MASS 包中使用了 stepAIC 函数()。
# Step AIC model :stepwise.rm <- stepAIC(upper.rm)
因此,在转换之后,创建了一个修正的 StepAIC 模型,该模型仅使用 5 个输入变量:经理 _ 雇用、组 _ 规模、测试 _ 得分、高 _ 小时 _ 标记和年 _ 雇用。
第八步:特征重要性
这里我创建了一个表格,显示了按重要性排列的特性。
ctable <- coef(summary(stepwise.rm))
odds_ratio <- exp(coef(summary(stepwise.rm))[ , c("Value")])
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
coef_summary <- cbind(ctable, as.data.frame(odds_ratio, nrow = nrow(ctable), ncol = 1), "p value" = p)kable(coef_summary[1:(nrow(coef_summary) - 2), ]) %>%
kable_styling(bootstrap_options = c("hover","striped","condensed"),full_width = F)
有五个影响性能的重要变量:
- 每多雇用一年经理,就减少了更高绩效的可能性
- 直接聘用的经理表现出色的可能性要高出 30%
- 得分高的经理更有可能表现出色。这里的赔率很小
- 如果 a 经理管理的团队增加了,那么业绩的可能性就会显著增加
- 那些工作时间长的经理有大约 90%的机会表现出色
第九步:模型评估
在建立模型和解释模型结果之后,我使用混淆矩阵对模型进行了评估。对模型的评估是在测试数据集中完成的,其中 performance_group 值没有隐藏在测试数据集中。我们使用模型预测得分与实际得分进行比较,得出混淆矩阵结果。
predictperformance = predict(stepwise.rm,datatest[,-1])
table(datatest$performance_group, predictperformance)
mean(as.character(datatest$performance_group) != as.character(predictperformance))
混淆矩阵显示了有序逻辑回归模型的性能。例如,它表明,在测试数据集中,4 倍底部概率类别被正确识别。类似地,69 倍中等类别和 0 倍高类别被正确识别。我们观察到,该模型识别高概率类别很差。这是因为训练数据集中高概率类别的表示不充分。使用混淆矩阵,我们发现我们的模型的错误分类误差是 36%。这表明整体模型拟合不是很强,这可能有多种原因。主要原因之一是数据集的性质严重偏向于中等绩效组的经理。
步骤 10:使用绘图进行解释
用对数优势比来解释逻辑顺序回归并不十分直接。在这里,我试图用图来解释模型的结果。
#Plotting the effects
library("effects")
Effect(focal.predictors = "yrs_employed",stepwise.rm)
plot(Effect(focal.predictors = "manager_hire",stepwise.rm))
plot(Effect(focal.predictors = c("group_size", "manager_hire"),stepwise.rm))
第一幅图显示,直接聘用的经理增加了被归入垫底群体的可能性,并略微降低了被归入最高和中等绩效群体的可能性。
第二个图非常有趣,因为它显示了两个特征在性能上的相互作用。左上部分显示,随着团队规模的增加,与直接聘用的经理相比,内部晋升的经理进入最佳绩效组的可能性增加。随着团队规模的增加,直接招聘经理增加了绩效水平处于中等水平的可能性(见图的右半部分)
步骤 11:结论
这篇文章有两个要点。首先,在处理可以排序的因变量时,有序逻辑回归很方便。例如,在人力资源领域,我们可以应用这些原则来研究员工福利。解释特征的对数似然性可能是棘手和困难的。使用图解法,很容易理解独立变量对分类可能性的单独和联合影响。
参考文献:
您为一家北美销售公司工作,该公司在六个地方设有办事处。最近这家公司的首席执行官…
github.com](https://github.com/Sambit78/ebp_exercise)
HSIC 瓶颈:反向传播的替代方案
信息论如何带给我们深度学习模型训练的其他技术
由 Unsplash 上的 Clarisse Croset 拍摄的照片
D eep 学习模型使用基于梯度下降的方法进行学习。这要归功于一种特殊的算法,即反向传播算法,它允许我们通过计算参数更新的偏导数,在整个模型参数中反向传播训练误差。
这种算法非常昂贵,因为它需要在向前传递之后,通过整个模型的向后操作来计算偏导数。
但是如果我们能避免这种情况呢?如果我们不需要在模型的最末端计算整体损失,然后通过整个模型反向传播这个误差,会怎么样?如果我们可以在前向传递过程中直接估计我们的模型的每个隐藏层的“训练目标”,然后直接计算涉及的参数的梯度而不需要反向传播,会怎么样?
嗯,我偶然看到一篇非常有趣的论文[1]研究这个问题:HSIC 瓶颈:没有反向传播的深度学习作者万多·库尔特·马,J.P .刘易斯,w .巴斯蒂亚安·克莱恩。他们利用信息论来完成这样的任务。
反向传播
反向传播是一种基于链式法则的算法,它能够计算损失函数相对于前馈神经网络中所有参数的偏导数。在该算法中,偏导数是在从最后一层到第一层的反向传递中计算的,因此称为反向传播,没有并行化的可能性。
我将不再进一步扩展反向传播。对这个算法的深入分析感兴趣的话,可以看看迈克尔·尼尔森的这篇令人惊叹的博客 2 。
信息论
在攻击本文的核心之前,让我们首先介绍信息论中的一些快速概念。
信息论为我们提供了工具来测量我们所能掌握的关于给定随机变量分布的信息量。例如,根据信息论,我们可以计算随机变量 x 的熵或不确定性。
熵
离散随机变量的熵测度
连续可变熵
让我们考虑一组事件 A、B、C、D、E、F 以及这些事件的概率分布,考虑它们发生的可能性。设 A 为极有可能发生的事件(概率接近 1),B,C,D,E,F 为极不可能发生的事件。
从熵公式来看,这里的变量(可以取值 A、B、C、D、E 或 F)的熵显然接近于 0。
如果我们考虑具有相同变量和相同事件集的第二个场景,但这次是在我们的事件集上的均匀概率分布,我们最终得到的熵为 0.77 。
这令人惊讶吗?不完全是。在第一个场景中,我们非常确定哪一个事件可能会发生,从而导致较低的不确定性(熵)。另一方面,在第二种情况下,事件集的均匀分布增加了我们所掌握信息的不确定性,我们不再确定哪个事件将会发生。
互信息
信息论的另一个有趣的工具是互信息(MI)。MI 衡量两个随机变量之间的相关性。
MI 作为 X 和 Y 的实际联合概率与联合分布(如果它们是独立的)之间的 Kullback Leibler 散度度量。
离散案例
连续案例
正如我们所见,MI 测量两个随机变量的联合概率和两个变量的概率乘积之间的 Kullback Leibler 散度 [2],就好像它们是独立的一样。对于两个独立变量,我们有 p(X,Y) = p(X)。p(Y),导致零 KL 发散,然后是零 MI。当两个变量强烈相关时,观察到相反的情况:爆发 KL 散度。
嗯,那很有趣!但是和我们今天的话题有什么关系呢?坚持住,我们就要到了;) .
无反向传播的深度学习
让我们先花点时间想想我们的深度学习模型实际上是做什么的。粗略地说,在为给定的任务(如分类)建立和训练神经网络时,我们只是在学习一个模型,它可以接受复杂的输入,将其连续转换为更简单的内容(隐藏层或内部表示),仍然与目标变量高度“相关”。复杂的输入是文本、图像还是声音信号等等——虽然人类可读,但对我们的计算机来说很复杂。
这些内部表示仅捕获输入 x 的一部分信号,理解这一点的直观方法是考虑卷积神经网络。经过卷积和最大池层,我们得到了一个更小的数字,这可能是不可读的,但保持了微小的足够的信号,它需要从源图像仍然是“相关”的目标相应值。
考虑到这一点,我们知道我们的神经网络学习产生隐藏的表示(贯穿所有层),通过只保留相关信息来减少与输入的“相关性”,并尽可能多地与目标输出相关。我们希望训练我们的神经网络来学习这样做而不用反向传播,因此估计一个目标函数来优化每个隐藏层。
我绝对肯定,在这一点上,你有一点提示:)。我几乎能听到你在说:
“Stéphane,我们只需要量化和最小化神经网络产生的隐藏表示与相应输入之间的相关性,还需要量化和最大化相同隐藏表示与输出变量之间的相关性。我们可以用互信息度量来量化这些信息。”
无论如何,关于论文作者的提议,你是绝对正确的:)。太棒了。
这个方法一点都不新鲜。事实上它来自于信息论:信息瓶颈原理。
I 实际上是互信息,β是超参数。
作者为神经网络的每个隐藏层找到了他们需要的目标函数。
信息瓶颈
IB 是由 Naftali Tishby ,Fernando C. Pereira 和 William Bialek 介绍的一种方法。
优化 IB 相当于最小化 X 和新变量 T 之间的互信息(相关性),同时最大化 T 和目标变量 y 之间的 MI。
换句话说,IB 允许我们学习产生一个新的变量 T,它对源输入 X(压缩)的依赖性最小,而对目标 y 的依赖性尽可能大。
这里 T 可以是神经网络中 X 的任何隐藏表示。
实际上是什么?
作者介绍了一个目标函数,可用于每一个隐藏层。但是还有一个遗留的问题。
让我们假设你使用连续可微的激活函数,如 sigmoid 或 leaky-relu。此外,让我们假设您的输入 X 是一个连续变量(通常是这种情况-例如:您在模型入口处的 32x32 图像取位于[0,1] *中的连续值)。
第一个假设留给我们一个确定性的神经网络。因此,对于第二个假设,隐藏表示只是绝对依赖于 x 的连续变量。更准确地说, *Tᵢ=fᵢ(X),*其中 fᵢ是确定性函数,Tᵢ是 x 的第 I 个隐藏表示。然后,我们几乎总是得到 MI(X,Tᵢ) = ∞,而不管神经网络的初始权重如何。
我们如何优化一个几乎总是无穷大的函数?
这个问题是不适定的,糜并不是出于实际目的的一种方便的度量。
作者建议用另一个相关性度量工具来代替 MI:希尔伯特-施密特独立性准则的 HSIC。
HSIC 瓶颈
HSIC 只是两组变量之间的互协方差矩阵的范数。
在我们的例子中,让我们考虑一批输入数据 X = (X₁,X₂,…,Xₘ).每个 Xᵢ都是一个随机变量,因为它可以是数据集中的任何输入样本。还有,让我们考虑用我们的神经网络从 x 得到的 kᵗʰ隐藏层,Zᵏ = (Zᵏ₁,Zᵏ₂,…,Zᵏm).交叉协方差只是测量 x 的每个变量和 Zᵏ.的每个变量之间的协方差
HSIC 可以重写为一个矩阵的迹。
让我们来分解这个公式。K_x 或 K_z 是相似矩阵,其中每一行是从一个个体到相同变量的其他个体的距离向量。这些距离可以使用由长度标度σ参数化的高斯核来计算。
在计算 K_x.H 或 K_z.H 时,我们只需通过减去每个个体到其他个体的平均距离来确定每个变量中每个个体的距离向量的中心。例如,从平均值中减去 K_X₁(从个体 1 到所有其他个体的距离向量)。
我们最终得到一种代表两个变量中每个元素的编码向量。这个向量编码了同一个变量中每个个体与其他个体的关系。计算上述轨迹相当于对来自 X 的个体和来自 y 的相应个体的编码之间的内积求和。
当 X 的每个点 I 和 X 的所有其他点之间的关系类似于 Y 的相应点 I 和 Y 的所有其他点之间的关系时,这个内积将是大的,对所有 I 求和,并且其中通过高斯核来测量相似性。
有了 HSIC,我们可以凭经验估计两个变量之间的相关性。尽管有 MI,HSIC 不会爆发,也不太可能展现出无限的价值。因此,它可以作为我们的目标函数的替代。
HSIC 瓶颈
提议的算法
在这一节中,我将介绍整个方法,以及它们是如何组合在一起的。
最初的目标是找到反向传播的替代方法。为此,作者为神经网络的每个隐层提出了一种稳健的目标方法:HSIC 瓶颈。
隐藏表示 Z 由我们的神经网络权重来参数化。然后,当作者说我们正在寻找较少地依赖于 X 而尽可能地依赖于 Y 的隐藏表示(Z)时,他们的意思是寻找在给定输入 X 的情况下产生 Z 的参数权重。由于我们对每个隐藏层都有一个目标函数,所以我们可以直接计算每个层中涉及的权重的梯度,而不需要反向传播。
算法是这样的:
我们通过对 m 个输入示例及其目标进行采样来迭代训练数据集。请注意,Tᵢ-1 在这里代表了我们的模型的第 1-1 层的权重;在前面的段落中,我们将 T 称为隐藏变量,即隐藏层的输出;这里不一样。另外,上述算法中的(Xⱼ,Yⱼ)指的是第 j 批数据。
下面几行描述了我们模型中的正向传递:
- 我们通过将 Tᵢ₋₁应用于先前的批量隐藏表示来计算给定层的输出。
- 我们计算我们的目标函数和相对于当前层的权重的梯度。
- 我们用类似 SGD 的更新规则直接更新当前层的权重。
如我们所见,仅通过向前传递,我们已经能够计算目标函数来最小化并直接更新权重,而不需要向后传递。
在分类的情况下,最后一个隐藏的制图表达维度将等于类的数量。给定位置的最大值将用于预测相应的类别。这是未格式化的模型。
在格式化模型中,作者在神经网络的末端附加了一个全连接和一个 softmax 激活输出,并用 SGD 和无反向传播来训练这个单层。他们使用交叉熵损失来训练这一层。
格式化模型。来源
正如我们之前看到的,HSIC 瓶颈将取决于一个超参数σ。作者发现结果确实受到这个超参数的选择的影响。为了克服这一点,使用具有不同长度尺度σ的 HSIC 瓶颈来学习并发神经网络。然后将每个网络的最终隐藏表示汇总(平均或求和)。他们进一步使用 SGD 和交叉熵损失训练具有 softmax 输出的单个全连接层。
多尺度网络。信号源
就是这样!这是你的深度学习框架,没有用于训练的反向传播。
实验
作者进行了大量实验来支持他们介绍的框架。
首先,他们从经验上证明了神经网络实际上遵循了信息瓶颈原则:神经网络通过保留相关信息来学习产生较少依赖于输入 X 的隐藏表示,而非常依赖于目标 Y。就此而言,他们为大量神经网络计算了学习到的隐藏层与 X 之间的 HSIC,以及隐藏层与 Y 之间的 HSIC。这里有一个在 MNIST 数据集上训练的全连接神经网络的例子。
不同深度(层数)的深层网络的最后一个隐藏层、输入 X 和目标 Y 之间的 HSIC。来源
正如我们所看到的,我们对神经网络的训练越深入,它就越倾向于遵循信息瓶颈原则。
他们还试验了无格式的全连接模型,其中最后一层是用 HSIC 瓶颈训练的。他们在 CIFAR 数据集上实验了这样的模型。
他们最后用一个额外的全连接层测试了格式化的模型,该层使用 SGD 和交叉熵损失进行训练。他们发现这些模型比使用反向传播训练的模型收敛得更快。
HSIC 格式的模型与用反向传播训练的模型。来源
结论
有没有现在训练出来的深度学习模型,不需要反向传播?如果真的存在,那一定很少见。反向传播实际上是在深度神经网络中计算偏导数的不可避免的算法。然而,这种算法是昂贵的,经常遭受梯度消失,没有提供并行化的可能性。正是在这种背景下,我们研究的论文的作者提出了 HSIC 瓶颈,一种替代反向传播。该算法依赖于信息论中的信息瓶颈原理。使用这种方法,作者能够为我们的深层网络的每个隐藏层提出一个鲁棒的目标函数,从而能够在正向传递期间计算关于所有参数的梯度,而不需要在反向传递中传播误差,具有链式规则。
我发现解决方案绝对优雅,已经等不及这个方向的后续作品了。
参考
[1]万多·库尔特·马,J.P .刘易斯,w .巴斯蒂亚安·克莱恩,HSIC 瓶颈:没有反向传播的深度学习 (2019),arxiv 2019
[2]迈克尔·尼尔森,反向传播算法如何工作(2019 年 12 月)
[3]阿瑟·格雷顿,肯吉·福水,春辉·特奥,乐松,伯恩哈德·肖尔科普夫,亚历山大·j·斯莫拉,2008 年《独立性的核统计检验》,NeurIPS 2008
[4]亚历山大·a·阿莱米、伊恩·菲舍尔、约书亚·v·狄龙、凯文·墨菲深度变分信息瓶颈 2017、ICLR 2017
HTTP 3 已经问世了!
HTTP 从 HTTP 1 到 HTTP 3 的演变
什么是 HTTP?
HTTP 代表超文本传输协议。这是用于将网页从服务器传送到浏览器的一组规则。HTTPS 简单意味着在加密层使用相同的协议以获得更好的保密性。
HTTP 及其层(TCP/IP 堆栈)。来源: Mozilla Dev
对于那些熟悉互联网/通信的 OSI(开放系统互连)规范的人来说,HTTP 是一个应用层协议。这意味着它与底层硬件结构或介质无关。这使得随着带宽等的增加来改进和升级 HTTP 规范变得可行。您很快就会看到这是如何发生的!
获取网页。来源: Mozilla Dev
HTTP 是一种客户-服务器协议:请求由一个实体,即用户代理(或代表它的代理)发送。大多数情况下,用户代理是一个网络浏览器,但它可以是任何东西,例如一个在网络上爬行以填充和维护搜索引擎索引的机器人。
引自 Mozilla
这个定义中的客户端是用户代理。这可能是浏览器、程序或任何使用 HTTP 协议调用服务器的东西。网络服务器传送或提供所请求的内容。代理协调 web 服务器和用户代理之间的通信。
代理的功能如下:
- 贮藏
- 过滤(隐藏成人内容或基于区域阻止内容)
- 负载平衡(直接请求空闲的服务器)
- 身份验证(允许用户与不同的服务器通信)
- 日志记录(HTTP 日志记录通常用于异常检测等)
在 HTTP 1 或(1.1)中,上述任务只是平静地发生。然而在 2009 年,一个更新的协议 HTTP 2 开始兴起。
HTTP 2
HTTP 2 的提出是为了解决随着网络技术和带宽的发展,HTTP 1 遇到的一些限制。
- 需要执行多路复用:这允许通过相同的 TCP 连接进行并发请求。有助于同时加载资源。
- 允许浏览器优先获取哪些内容,以便更快地加载网页。或者提高页面加载的感知速度。
- 降低 HTTP 报头的权重。
- 服务器推送,使服务器能够在 web 浏览器请求资源之前推送资源。这使得解析 HTML 和重新获取 HTML 中的内容的往返时间大大缩短。
HTTP 2 提供了更快和更安全的(在 HTTP 2 中执行 HTTP 加密)web 体验。你可以看看 akamai 云提供商的这个演示。
HTTP 3 新成员
这是(某种程度上)即将到来的协议。然而,我注意到 YouTube 已经在 chrome 浏览器中使用了 HTTP 3(但不确定其他浏览器是否也使用了 HTTP 3!).我哪里知道?因为我用一个插件看 HTTP 协议(HTTP/2 和 SPDY 指示器)。
有什么新鲜事?
新规范还承诺提供更快、更好、更安全的网络体验。但是怎么做呢?
HTTP 3 旨在简化 TCP 握手(这是一个 3 次握手,嗨,嗨,好吧,你得到了我的嗨,一样。).最重要的是,使用 QUIC 协议可以更快地建立连接,这也是一个新特性。
增强的连接建立承诺在 wifi 连接和移动网络等之间发生更好的连接迁移。请注意,这不是您在同一网络中的路由器之间看到的连接迁移。非常复杂和精密。
最后,QUIC 还试图升级 TCP 慢启动,从而更快地实现高速。QUIC 试图为此增加拥塞窗口指数。这将是一个重要的游戏升级,在 UHD 和以上的体育场和视频流的情况下。在这里阅读更多。
这可能是因为 YouTube 速度非常快,从启动就开始播放高清视频,没有缓冲。但是不要引用我的话。完美的规范可能会在今年年底出台。
我希望您喜欢阅读我在 HTTP 3 上的文章。虽然我没有深入研究技术术语和本质细节,但现在你知道我们未来的互联网会是什么样子了。为了更深入的比较,请看下面的文章。
QUIC 协议的到来
medium.com](https://medium.com/@anuradhawick/the-quic-internet-its-the-future-d903440b26ea)
几篇你可能会喜欢的文章,
消息排队遥测传输及其在物联网中的应用
medium.com](https://medium.com/swlh/mqtt-how-iot-devices-talk-to-each-other-7b363da3ebf) [## 什么是边缘计算
边缘计算概念介绍
medium.com](https://medium.com/@anuradhawick/what-is-edge-computing-d27d15f843e) [## 互联网隐私:如何避免跟踪者
2020 年实现无障碍网络浏览,不被跟踪
medium.com](https://medium.com/@anuradhawick/internet-privacy-how-to-avoid-trackers-eb5c3f25419a) [## Pi-hole,屏蔽恼人的广告
创建您自己的 DNS sinkhole 来阻止您家中所有设备上的广告
anuradhawick.medium.com](https://anuradhawick.medium.com/pi-hole-to-block-away-annoying-ads-68f2b5a5d20)
干杯!
Python 中的 HTTP 请求
请求库简介
python 请求库简化了 HTTP 请求任务,例如从网站获取信息、发布信息、下载图像、跟踪重定向等等。在本帖中,我们将讨论 python 请求库的基础知识。
我们开始吧!
首先,让我们确保安装了请求库。在命令行中键入:
pip install requests
现在,在 python 脚本中导入请求库:
import requests
我们将从图片分享和托管网站 imgur.com获取内容:
为了指定我们的请求,我们将包含 url 的字符串传递给“get()”方法:
r = requests.get('https://imgur.com/')
为了检查请求的响应状态,我们可以打印响应对象:
print(r)
响应代码 200 对应于成功的请求。我们可以使用“dir()”看到 python 中对象可用的所有方法和属性。让我们将“dir()”应用于我们的响应对象:
print(dir(r))
我们看到我们有标题、json、链接、ok 状态、状态代码等等。要更详细地解释对象的属性和方法,我们可以将“help()”方法应用于我们的对象:
print(help(r))
让我们来看看“文本”属性的详细信息:
我们可以使用“text”属性打印响应对象的文本:
print(r.text)
我们会在浏览器中看到之前查看的页面的 html 内容。我们可以用“BeautifulSoup”这样的工具进一步解析这个 html 文本。关于 BeautifulSoup 的介绍,请查看beautiful soup的网页抓取介绍。
现在,让我们从“imgur”网站提取一张图片。让我们导航到该网站:
接下来,让我们单击左下角有电源插座的树的图像:
右键单击图像,然后单击“检查”:
最后,导航到突出显示的链接“https://i.imgur.com/1A7VXBR.jpg”。您应该会看到该链接将您导向一个只有图像的页面。我们可以使用请求和“contents”属性从“imgur”中提取该图像。让我们用一个到图像的链接重新定义我们的请求对象,并打印内容:
r = requests.get('[https://i.imgur.com/1A7VXBR.jpg](https://i.imgur.com/1A7VXBR.jpg)')
print(r.content)
如果我们回顾一下响应对象的帮助输出,我们会看到 contents 属性是以字节为单位的:
我们可以从图像中提取字节并保存到我们的机器上。我们将在“写入字节(wb)”模式下打开一个名为“tree.png”的文件,并将内容写入该文件:
with open('tree.png', 'wb') as f:
f.write(r.content)
如果我们打开包含 python 脚本的文件夹,我们应该会看到一个名为“tree.png”的文件,其中包含我们选择的图像。我就讲到这里,但是我鼓励你自己去研究代码。请随意使用本文中的代码尝试从其他站点获取文本和图像。
结论
总之,在这篇文章中,我们讨论了 python 请求库的基础。我们看一下响应对象可用的属性和方法。我们使用 text 属性来提取“imgur”主页的 html 文本。我们还展示了如何从“imgur”网站上提取一幅图像,并将其保存到我们机器上的一个文件中。我希望你觉得这篇文章有用/有趣。这篇文章中的代码可以在 GitHub 上找到。感谢您的阅读!