TowardsDataScience-博客中文翻译-2020-六十八-

龙哥盟 / 2024-10-15 / 原文

TowardsDataScience 博客中文翻译 2020(六十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

赢得我的第一次在线数据科学黑客马拉松如何改变了我的生活

原文:https://towardsdatascience.com/how-winning-my-first-online-data-science-hackathon-changed-my-life-adcb06f02d0f?source=collection_archive---------46-----------------------

我成为数据科学家的旅程

Arif Riyanto 在 Unsplash 上拍摄的照片

2018 年初,我只是一名追求计算机工程的学生,对以哪个领域为职业目标毫无概念。我有各种选择,但不知道应该关注哪一个,即区块链、Android 开发和数据科学。

你面临过类似的情况吗?这个博客是给你的。

什么对我最合适?只有我能回答这个问题。于是,我勇往直前,捡了几个技术,给了一个月,然后实现。

一旦我开始研究数据科学,直接研究基于数学的东西,摆弄数字并从中发现一些价值是很有趣的。随后的旅程改变了我的生活,并使我专注于这个领域。

我需要发生一些事情来证明“数据科学是我的选择。因此,为了便于理解,我会按照要点来描述一切

学习阶段

使用任何工具的第一步都是学习该技术的概念。
我在 2018 年初开始学习数据科学的概念。总结一下我学到的东西

  1. 在 Udemy,NPTEL 和 Coursera 上上过一些数据科学课程。
  2. 学习了各种预处理技术,使用哪个模型以及如何调优 hyperparameter。
  3. 在各种在线数据集上尝试了上述事情。

即使在这个领域已经工作了 6 个多月,我仍然对“这个领域适合我吗”心存疑虑。

在线黑客马拉松

学习之后,是时候让我将它付诸实践,看看我与其他数据科学家相比处于什么位置。我开始参加 Analytics Vidhya 上的在线数据科学黑客马拉松。在体验了竞争性黑客马拉松的工作方式后,我在 7 月份参加了数据至上黑客马拉松。

截图来自 datahack.analyticsvidhya.com(我的名字:jsiddhesh96)

经过 16 天不断努力提高分数,我获得了第一场胜利,在排行榜上排名第三。

Yayyy!努力有回报!

现在怎么办?它如何改变了我的生活?

除了奖金,我还收到了由 Analytics Vidhya 举办的首届亚洲最大的人工智能会议的邀请。

会议的日期和我期末考试的日期完全一样。显然,我不会错过期末考试。真的吗?当我看到演讲人的名字和他们对数据科学领域的贡献时,我花了几个小时改变了主意,我决定去参加会议。

作者照片

该会议旨在听取来自全球各地的人工智能和机器学习专家的意见,并在会谈后分享专家的知识和指导。

除了会谈,

  1. 我采访了 Ronald van Loon (他连续几年被 Onalytica 评为商业智能领域全球顶级行业专家第二名、大数据领域第三名、数据科学领域第七名、金融科技领域人工智能/数字化转型/保险科技领域第八名以及全球物联网领域第九名)
  2. 我采访了 塔利·辛格 (他是一家人工智能初创公司 deepkapha.ai 的首席执行官、创始人和人工智能神经科学研究员)。和他谈论现实生活中的项目是我在那里度过的最美好的时光。

数据科学领导者实际上是如何思考和决策的,这是我从他们两人身上学到的关键东西。

与超过 15 位我称之为各自领域专家的演讲者交谈是我职业生涯的转折点。我得到的指导和在这个领域的正确方向帮助我重新思考我的职业生涯。

当我去参加会议的时候,我只是一个对我的职业生涯几乎一无所知的学生,但是当我回到家的时候,我已经变了一个人,我绝对知道为了追求一个适合我的职业生涯该做什么。

我收到的邀请和我做出的参加会议的决定改变了我的生活。

黑客马拉松如何改变了你的生活?如果你有什么故事,请评论。

附:这是我的第一个博客

Wizzair 在新冠肺炎期间是如何给他们的客户发推特的——R 语言的文本分析

原文:https://towardsdatascience.com/how-wizzair-tweeted-their-customers-during-covid-19-text-analysis-in-r-8ed79dbd3b34?source=collection_archive---------69-----------------------

新冠肺炎时代 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。

原文:https://towardsdatascience.com/how-you-can-learn-data-science-ai-and-ml-for-free-during-this-season-820d9b0caf2d?source=collection_archive---------38-----------------------

在这段艰难时期,学习一项新技能或提高现有技能是消磨时间的一种神奇方式。如果你能免费学到令人敬畏的新事物,那就更好了。

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 基础到深度学习的几乎所有东西。

"尽可能以最散漫、最不敬和最原始的方式努力学习你最感兴趣的东西."理查德·费曼

安德鲁·尼尔在 Unsplash 上的照片

我在本文中分享的一些资源只在一段时间内可用。我将每月对这篇文章进行编辑,删除过期的资源并添加新的资源。请尽可能经常查看这篇文章,以便在新的机会到来时发现它们。

感谢您抽出时间阅读这篇文章。我希望你学到了一些东西,这对你有所帮助。欢迎您在回复部分分享您的想法、观点和我在本文中可能跳过的资源链接,您可以直接在 Twitter 或 LinkedIn 上联系我。黑客快乐!

非常感谢 安娜·阿伊库 为我校对和纠正了许多错误。

你如何用自己的小方法防止系统性的种族歧视

原文:https://towardsdatascience.com/how-you-can-prevent-systemic-racism-in-your-own-small-way-fc33cb57fdde?source=collection_archive---------67-----------------------

这里有两种方法可以解决技术和数据科学中的偏见

马库斯·斯皮斯克在 Unsplash 上的照片

无论是在新闻、社交媒体还是在美国街头,系统性种族主义都是一个激烈辩论的话题。在这篇文章中,我不打算就历史上的种族紧张关系教育任何人。和其他人一样,我对什么可行什么不可行有自己的看法。我将试图传达的是,无论你的立场是什么,你都可以在没有意识到的情况下强化偏见行为,即使你像它们一样“清醒”。

特别是如果你为别人而不是自己工作,你必须把你的技术和数据科学项目当作偏见是真实存在的。如果你选择看向别处,你可能会向这个世界释放一种伤害他人的产品。你可能甚至没有意识到它正在发生,直到一些惊人的事情发生。到那时,已经太晚了。你损害了你的个人和职业声誉。你的医疗、金融或欺诈预测可能已经伤害了个人。在未来的几年里,你可能会感到后悔和自责。

学习如何避免最坏的情况需要了解一些背景知识。

我们的大脑有偏见是有原因的。

我有偏见,因为我是人。人类每天都在整理和处理大量的信息。我们的大脑迅速将输入导入桶中。如果我们试图深入思考每一条信息,我们就会瘫痪。我们的大脑善于走捷径。

这些传入的信息中的一些可能落在错误的桶中。它与我们的思想和行为混杂在一起,导致了隐含的偏见。我们可能没有意识到我们对人、事物或活动有偏好或反感。

因此,如果我们没有意识到我们的隐性偏见,我们如何防止它们泄露到我们的数据、代码和算法中呢?不幸的是,没有消除偏见的魔法棒。自我意识是良好的第一步。哈佛大学正在进行一项有趣的研究。Project Implicit 对这一领域进行了研究,有一些在线“测试”会报告你的回答中可能存在的偏见。

[## 项目隐含

登录或注册,找出你对种族、性别、性取向和其他话题的隐含联想!或者…

implicit.harvard.edu](https://implicit.harvard.edu/implicit/index.jsp)

有了新的经历和自我反省,你就可以把放错地方的信息移到你想要的桶里。想象下一次当你使用一个有问题的短语时,有人会叫你出来。在脱口而出道歉的时候,你的大脑疯狂地搜索这句话,并把它放进“坏”桶。

这需要努力,也需要时间。

假设存在数据偏差

如果我们不能用弹指一挥间消除大脑中的偏见,我们将不得不假设偏见确实存在并影响着我们。它影响着我们周围的每一个人。

我给你的第一个建议是假设历史数据有直接或间接的偏差。问问你自己,历史数据代表你的目标人群吗?

直接数据偏差的一个例子——过去没有女性获得超过 10 万美元的贷款。如果你根据这些历史数据训练一个模型,你可以很确定你的模型的结果会有偏差。

不太明显的是间接数据偏差。训练数据仅基于对 iPhone 11s 的调查,可能会扭曲你的富裕指标。另一个例子是,当西班牙语版本的调查不可用时,将这个模型推广到说西班牙语的人群。

审核您的预测结果

假设你的数据看起来不错,你相信你有一个代表性的样本。即使它不包含任何人口统计信息,机器学习模型的结果仍然可能有偏差。根据你的预测,如果一群人比另一群人受益更多,你需要考虑偏见。如果根据你的预测,一群人一直被排除在外,你需要考虑偏见。

检查这一点的唯一方法是在现实世界中审核您的部署后结果。所以我的第二个建议是,进行审计。你可以自己做这件事,尽管最好让外界的人来看看。接受学习,并根据需要进行调整。你每天都会让世界变得更美好。

推荐读物

当被问及道德和坏算法的危险时,我推荐的第一本书是凯茜·奥尼尔的数学毁灭武器。如果你认为你只有一本书的时间,这是一个选择。详细的例子是相关的,易于阅读。

下面这篇文章对我的思考产生了重大影响。我把这项研究作为演讲的例子。如何选择算法的优化目标可能会产生严重的意想不到的后果。我计划下个月就这个话题创建一个条目。

Obermeyer 等人的“剖析用于管理人口健康的算法中的种族偏见”科学【2019 年 10 月 25 日:447–453

如何通过可视化来讲述数据的故事。

原文:https://towardsdatascience.com/how-you-can-tell-stories-about-your-data-through-visualization-29fde3f2d08e?source=collection_archive---------63-----------------------

一个公认的事实是,对于对数据没有兴趣或不了解数据的人来说,原始形式的数据看起来非常混乱。那么,我们如何才能让这类人看得见、看得懂数据呢?

艾萨克·史密斯在 Unsplash 上拍摄的照片

“可视化数据的能力是数据探索和使用难题的一个重要组成部分…数据提供商担心他们的数据被平凡化、误解或歪曲,这种担心也适用于进行可视化的过程,即使是简单的可视化…可视化数据改变了人们对数据的理解方式,并普遍提高了人们对数据的兴趣,这将鼓励开发更多更好的数据。”罗伯特·科萨拉

作为数据科学家或分析师、人工智能和机器学习工程师,可视化数据已经成为我们生活中必不可少的一部分。这是因为我们在工作中花了大部分时间向同事或主管解释事情,并介绍我们的工作和发现。对于不了解数据或对数据不感兴趣的人来说,原始形式的数据通常看起来就像一长串随机数、图像或音频文件。我们的工作是让这些人从我们拥有的数据中理解意义,并引导他们从我们拥有的数据中做出有用的推论。我们用我们拥有的数据讲述过去和未来的故事,但是如果我们没有可视化,那么是什么让我们不同于占卜者或疯狂的老先知呢?在本文中,我将带您了解可视化数据的重要性,分享一些可以让您的可视化专业的技巧,以及一些可以用来创建优雅的可视化的工具、库和软件。

什么是数据可视化,为什么可视化数据很重要?

"想象给了你一些你不知道的问题的答案."—本·施奈德曼

数据可视化是以可视或图形格式表示数据的过程。这个过程很重要,因为它有助于您通过图像交流不同数据的相关性。人类的思维很容易从信息图中理解,当查看电子表格、CSV 文件或数据库中的数百行原始数据时,会生闷气。通过可视化数据,可以轻松发现趋势和模式,这一点非常重要,尤其是在数据科学的探索性数据分析阶段。数据可视化不仅仅对数据科学家、分析师和人工智能/人工智能工程师重要,它是技术领域内外从事数据工作的每个人都应该学习的技能。

数据可视化的使用

“一张照片的最大价值在于它能迫使我们注意到我们从未想过会看到的东西。”约翰·图基

数据可视化被用于几乎每个需要解释涉及数据使用的工作或发现的领域。每当一个人需要从他或她为自己或一群人所拥有的数据中做出见解或推断时,就需要使用他或她所拥有的数据的可视化表示。然而,可视化数据并不意味着美观,以图形形式表示数据是出于几个原因,我将在下面分享。

  • 确定相关性:如果不将你所拥有的数据可视化,你很难确定两件或更多事情之间的相关性。识别关系或相关性是数据分析中非常关键的一个阶段,因此,如果您希望在此阶段从数据中获得最佳见解,可视化数据非常重要。
  • 观察随时间的变化:通过可视化数据,我们可以使用时间序列图观察给定时间内的趋势或模式变化。这有助于查看过去的数据,对未来可能发生的事件做出重要的预测或假设。这可以帮助组织或个人扩展他们的产品或服务,以在未来达到期望的极限。
  • 识别频率:频率识别是视觉图形最基本的用途之一。它帮助我们确定我们做事情的频率,从而知道哪里需要更多的努力、时间和奉献,哪里需要放松。企业还可以使用频率图来检查特定时间的销售数量,获得一些见解,并调整其营销流程以满足消费者的需求。

可视化图表的类型:现在我们已经了解了什么是可视化,我们必须了解各种类型的可视化图表,这些图表可以让我们讲述我们所拥有的数据的故事。有数百个可视化图表,我们很可能永远不会遇到其中的一些。然而,我将分享几个我知道的流行的,没有特定的重要性或兴趣顺序。

  • 折线图:折线图或折线图或曲线图是一种图表类型,它将信息显示为由直线段连接的一系列数据点,称为“标记”。它是许多领域中常见的一种基本图表类型。它类似于散点图,只是测量点是有序的(通常按其 x 轴值)并用直线段连接。折线图通常用于显示一段时间内的数据趋势,即时间序列,因此线通常按时间顺序绘制。在这些情况下,它们被称为运行图。— 维基百科
  • 条形图:来自维基百科,条形图或条形图是一种用矩形条表示分类数据的图表或图形,矩形条的高度或长度与它们所代表的值成比例。条形图可以垂直或水平绘制。垂直条形图有时被称为柱形图。条形图显示离散类别之间的比较。图表的一个轴显示正在比较的特定类别,另一个轴代表测量值。一些条形图以多个一组的形式显示条形图,显示多个测量变量的值。
  • 直方图:直方图很大程度上是数字数据分布的近似表示。它看起来很像条形图,但测量的是频率而不是一段时间内的趋势。你可以在维基百科页面上了解更多关于直方图的信息。
  • 散点图:根据维基百科,散点图是一种使用笛卡尔坐标来显示一组数据中典型的两个变量的值的图或数学图表。如果点被编码(颜色/形状/大小),可以显示一个额外的变量。数据显示为点的集合,每个点的一个变量的值决定水平轴上的位置,另一个变量的值决定垂直轴上的位置。
  • 饼图/甜甜圈图:饼图是一种圆形的统计图形,它被分成若干片,以说明数字比例。在饼图中,每个切片的弧长(以及其中心角度和面积)与它所代表的数量成比例。虽然它的名字是因为它看起来像一个被切片的馅饼,但它的呈现方式也有所不同——维基百科。然而,圆环图只是一个中间中空的饼图,旨在清楚地显示切片或比例,并为传统风格的饼图添加美学效果。
  • 热图:热图是一种数据可视化技术,以二维颜色显示现象的大小。颜色的变化可能是色调或强度的变化,给读者提供了明显的视觉线索,表明现象是如何聚集或随空间变化的。— 维基百科
  • 地图:对于包含位置元素的数据,我们可以使用世界地图的优雅可视化。这些类型的地图用颜色编码,用较暗的阴影显示强度较大的区域,反之亦然。它是可视化病毒传播的完美工具,广泛用于可视化新冠肺炎传播的受影响区域。

可视化数据时需要注意的事项

“通过可视化信息,我们将它变成一幅你可以用眼睛探索的风景。一种信息地图。当你迷失在信息中时,信息地图就有点用了。”—大卫·麦坎德斯

有效的数据可视化是数据分析至关重要的最后一步。没有它,重要的见解和信息可能会丢失。然而,有相当多的事情是任何一个寻求像专业人士一样形象化的人必须知道的。

  • 选择 bests 讲述您的故事的可视化方式:在您可以用来可视化数据的多种图表类型中,选择一种 Bests 能够代表您的数据的图表。如果你想从数据中获得有用的见解,这是非常重要的。这伴随着说你必须有一个好的颜色选择。颜色编码的可视化非常有助于轻松识别强度、模式和聚类
  • 包含比较:这可能是我们最简单的数据可视化方法,但它仍然很重要:当你展示你的信息和见解时,你应该包含尽可能多的实际比较。通过一起展示两个图表,每个图表都显示特定时间范围内相同信息的对比版本,例如 2016 年和 2017 年的月度销售记录,您将为您的数据的影响提供清晰的指导,突出每个人都可以思考和采取行动的优势、劣势、趋势、高峰和低谷。
  • 了解你的受众:在进行可视化时,确定需要从你的可视化中做出推论或获得洞察力的目标受众。谁会查看这些数据?他们面临什么样的挑战,什么样的障碍阻碍他们克服这些挑战?了解这一点,并努力构建足够吸引受众的可视化效果,让他们最大限度地洞察或理解您的数据。

可视化数据的最佳工具和软件

你的可视化效果取决于你用来创建它们的工具或软件。一个人必须使用好的可视化工具和软件来构建高质量和优雅的可视化。下面是我个人用过的几个最好的工具和软件,可以推荐一下。

  • 开源库:有许多开源库附带编程语言,我们可以免费使用它们来可视化我们的数据。它们通常很容易使用,并且实现起来很快。这是大多数程序员首选的可视化方法,他们更喜欢这种方法,因为它带来了灵活性。比较流行的有 Matplotlib 、 Seaborn 、 Bokeh 、 Plotly 和 GGPlot 。
  • 电子表格应用程序:许多人忽略了这一点,但是像 Microsoft Excel 和 Google Sheets 这样的电子表格应用程序有内置的可视化工具,这些工具非常适合以图形或视觉形式表示数据。对于那些没有编程技能或者没有编程技能,又负担不起可视化工具的人来说,这应该是你最好的选择。
  • Tableau: 对于制作各种高级而优雅的可视化和分析仪表盘, Tableau 是我认为最值得推荐的软件。您可以在 Tableau 中轻松、快速地制作精美的气泡图、饼图、折线图、热图或地球投影图。Tableau 易于使用,并且有许多教程来指导你如何很好地使用它来最大化生产力。
  • Power BI:Power BI是微软推出的商业分析服务。它旨在提供交互式可视化和商业智能功能,其界面足够简单,便于最终用户创建他们的报告和仪表板。

记住三个基本原则:约束、减少、强调,你就可以在设计有效的图表时做到简单—加尔·雷诺兹

照片由威廉·艾文在 Unsplash 上拍摄

我希望我已经能够启发您可视化数据的重要性,并能够分享有用的方法和资源,帮助您充分利用可视化数据来讲述一个关于它的好故事。

感谢您抽出时间阅读这个故事。我希望你学到了一些东西,这对你有所帮助。欢迎您在回复部分分享您的想法和观点,您可以直接在 Twitter 或 LinkedIn 上联系我。黑客快乐!

非常感谢 安娜·阿伊库 为我校对并纠正了我写这篇文章时犯的许多错误。

你应该如何看待转换率

原文:https://towardsdatascience.com/how-you-should-be-looking-at-conversion-rates-325849604b9e?source=collection_archive---------18-----------------------

转换率看起来很简单,但在引擎盖下,有容易落入陷阱。幸运的是,一个情节可以帮助。

转化率。我听到的比转化率更多的指标很少。这并不奇怪,因为这是一个如此简单的度量标准,几乎可以应用于任何情况,只要你试图将某物或某人从 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 工具不允许您轻松创建这种情节。我只能假设这是为了我的工作保障🤷‍♂️.

感谢阅读。

您应该如何改变您的数据科学教育

原文:https://towardsdatascience.com/how-you-should-change-your-data-science-education-710d01f36ebd?source=collection_archive---------40-----------------------

专注于工程技能

有许多类型的数据科学家,他们有不同的技能和职责。在我看来,你可以将数据科学家分成的最重要的群体是那些编写生产中使用的代码的人,以及那些做报告的人。

分析员

由于缺乏更好的术语,我把第二组称为分析家。这并不意味着他们不是数据科学家,担任这些角色的人受益于了解机器学习、数据的来龙去脉以及一般的编程技能。然而,在这个职位上,沟通更为重要,你对仪表板、图表、演示和可解释的统计数据的了解更有可能成为成功的关键。

工程师

工程师编写在生产中使用的代码,这意味着它通过与组织的现有软件集成来影响业务流程。在这里,你的机器学习知识更重要,你更有可能在面向代码的团队中工作,而不是商业智能或商业分析团队。

活动发起人在 Unsplash 上的照片

数据科学教育的目标

(在大多数大学里)没有数据科学的大学专业,所以几乎每个人“都进入了数据科学,但是学习计算机科学或者是软件工程师的人通常会获得数据科学工程师的职位,而具有其他背景的人通常会进入分析师的职位。目前的数据科学教育更关注分析师的职位,而不是工程师。在我看来,这是因为教授分析师所需的技能要容易得多,许多个人和组织都想利用突然出现的想转行的人来赚钱。

正如一些人所说,由于围绕“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 或其他提供商的经验。我认为,一旦你对在云上进行数据科学感到舒适,如果你作为数据科学家工作的候选人看起来不那么有吸引力,你至少会对数据科学工程师的工作如何到位有更好的理解。

根据吴恩达(斯坦福深度学习讲座),你应该如何阅读研究论文

原文:https://towardsdatascience.com/how-you-should-read-research-papers-according-to-andrew-ng-stanford-deep-learning-lectures-98ecbd3ccfb3?source=collection_archive---------0-----------------------

报告的

关于如何通过机器学习和教育领域公认人物发表的研究论文获取知识的说明

安妮·斯普拉特在 Unsplash 上的照片

在我主持的这个现场培训环节,用 TensorFlow 和 Keras 学习 AI 和深度学习的基础知识。

"智慧不是学校教育的产物,而是终生努力获取的产物."

——阿尔伯特·爱因斯坦

介绍

理解人工智能和机器学习领域前沿研究人员产生的信息的能力是每个认真的机器学习从业者都应该掌握的技能。

为了保持相关性并增加你的知识,机器学习从业者需要有学术思维和习惯。人工智能、人工智能和人工智能正在快速发展,我们必须用知识来装备自己以跟上这个领域,这些知识只能通过研究论文才能获得。

这篇文章将为你提供如何有效地完成一篇研究论文的指导,同时还提供以下内容:

  • 阅读一系列论文以获取某一领域知识的系统方法
  • 如何正确阅读研究论文
  • 可以帮助你搜索论文和关键信息的有用在线资源

对于那些想了解本文关键内容的人,向下滚动到标题为“阅读研究论文”的部分。

首先,谁是吴恩达?

我在这篇文章中提供的信息来自吴恩达教授的斯坦福讲座。我还用个人技巧和来自互联网资源的信息补充了本文中包含的信息。

但是首先,简单介绍一下吴恩达。

吴恩达可能是互联网上最知名的(和看了)机器学习老师。他还是 Deeplearning.ai 和 Coursera 的联合创始人。

除了他正在进行的在线教育方面的工作,他还是斯坦福大学的教授。

谷歌搜索就能获得更多关于吴恩达的信息。

对于一个人来说,学习周围环境中的个体所展示的技能和习惯是很自然的;这就是为什么大多数博士生会获得适当有效消化研究论文内容的技能。这在某种程度上是事实,安德鲁在前面提到的视频中很早就提到了这一点。

但我们不是博士生,有些人可能是,但我们正常人如何获得阅读研究论文并全心全意理解其内容所需的技能。

阅读研究论文

由 Christa Dodoo 在 Unsplash 上拍摄的照片

如果你有天赋,机器学习领域的专业化是有利的。例如,拥有计算机视觉领域的通才知识是值得称赞的,但拥有关键技术(如姿态估计)方面的专业知识和专长对寻找该领域从业者的公司和组织更有吸引力。

因此,让我们使用姿态估计作为我们如何阅读与主题相关的研究论文的指南:姿态估计。

1.收集集中于主题的资源。资源可以以研究论文、媒体文章、博客文章、视频、GitHub 知识库等形式出现。

在谷歌上快速搜索“姿势估计”会给你提供包含相关主题信息的顶级资源。在这第一步,目标是整理所有相关的资源,如 YouTube 视频、实施文档,当然还有研究论文。理想情况下,在这个阶段,你认为重要的资源数量没有限制,但一定要创建一个有用的论文、视频和文章的入围名单。

2.在下一步中,你将对你认为与主题相关的任何资源进行深入研究。有一种方法来跟踪对每个入围资源的理解是至关重要的。吴恩达建议根据你的理解水平绘制一个资源表,如下表所示。

Richmond Alake 的理解资源级别表

建议你确保浏览你添加到列表中的每篇论文至少 10-20%的内容;这将确保你已经接触到足够的介绍性内容,并能够准确地衡量其相关性。

对于确定的更相关的论文/资源,期望你进步到更高的理解水平。最终,你会发现一些合适的资源,它们的内容你完全理解。

你可能会问自己,“多少论文/资源是足够的”。

我没有答案,但是安德鲁有。

根据 Andrew 的说法,理解 5-20 篇论文将展示对主题的基本理解,也许足够理解到技术的实现。

50-100 篇论文将主要为你提供一个非常好的领域理解。

在浏览了资源并提取了重要信息之后,您的表可能类似于下面所示。

Richmond Alake 更新的资源理解水平表

3.第三步是我观察到的在试图理解研究论文时对我有用的快速提示。第三步是做结构化笔记,用你自己的话总结论文中的关键发现、发现和技巧。

下面的步骤将集中在如何阅读一篇研究论文上。

阅读一篇研究论文

照片由阿尔方斯·莫拉莱斯在 Unsplash 拍摄

以理解为目的的阅读不是通过一遍文章的内容来完成的。根据安德鲁的说法,一口气把一篇论文从第一个词读到最后一个词可能不是形成理解的最佳方式。

准备好至少通读一篇论文三次,以充分理解其内容

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)

要问自己的问题

安德鲁提供了一系列你在阅读论文时应该问自己的问题。这些问题通常表明你理解了论文中的关键信息。我用下面的问题作为信标,以确保我不会偏离理解重要信息的目标。

它们如下:

  1. 描述论文作者的目标是什么,或者可能已经实现了什么。
  2. 如果一篇论文中介绍了一种新的方法/技术/方法,那么新提出的方法的关键要素是什么?
  3. 论文中的哪些内容对你有用?
  4. 您还想关注哪些参考资料?

辅助研究的额外资源

一些在线资源使得相关信息的发现和检索变得相对容易。下面是一些资源示例,可以帮助您搜索相关信息。

  • 机器学习子编辑
  • 深度学习子编辑
  • 纸张代码
  • 顶级会议如 NIPS , ICML , ICLR
  • 研究门

结论

"为了长寿,要稳步学习,而不是短时间爆发."

—吴恩达

对于机器学习和计算机视觉领域,我还是一个新手,有很多东西我不知道(这是一种保守的说法)。尽管如此,我相信如果一个人坚持不懈地寻求知识,不管是在哪个领域,他们都会得到超越常规的理解和专业知识。

根据吴恩达介绍的技术,我每个月至少会阅读四篇研究论文,阅读到理解的程度。老实说,LeNet 论文花了我一周半的时间才全部完成。但是你做的次数越多,阅读和理解研究论文的速度就越快。

Andrew 在他的视频中表示,他随身携带了一批研究论文,打算阅读它们。Andrew 是机器学习领域的杰出人物,我相信模仿他的习惯和学习技巧会对你的学习之旅有好处。

在我主持的这个现场培训环节,用 TensorFlow 和 Keras 学习 AI 和深度学习的基础知识。

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 成为推荐媒介会员,支持我的写作
  2. 订阅我的 邮件列表 获取每周简讯
  3. 通过 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)

如何保护您的数据(通过抛硬币)

原文:https://towardsdatascience.com/how-your-data-is-secured-by-a-coin-toss-c933f9e13d4a?source=collection_archive---------42-----------------------

关于本地化差异隐私的介绍性文章。

照片由戴恩·托普金在 Unsplash 拍摄

假设你想调查 1000 个人,问他们是否跳过了交通信号灯。你在这里收集的数据是敏感的。假设您想要建立一个关于人类行为的数据集来执行某种分析。跳过的交通信号将是该数据集的一列。

现在,作为数据集的管理者,您希望公开这些数据,以便有人可以对其进行一些统计分析。然后,分析师可以查询数据集的“跳过的交通信号”列,以确定特定的人是否跳过了信号。但是数据集中的人希望他们的数据是安全的。他们不希望分析师能够询问他们的一些事情,并百分之百确定他们的活动。

现在的问题是,我们如何确保每个人的隐私,同时还提供不太嘈杂的分析师数据,以便他/她可以从中获取价值?

我们可以进行一个简单的实验来做到这一点:

响应是(1)=跳过交通信号

响应号(0)=没有这样做。

  1. 扔一次硬币。如果它落在头上,这个人必须说实话(不管他/她是否错过了交通信号)。
  2. 如果第一枚硬币正面朝上,再掷一次。如果是正面着地,这个人必须回答“是”,如果是反面着地,这个人必须回答“否”。我们并没有给人们真正的选择。这就是我们添加“随机性”的地方。

想想一个人回答是的概率,即使那个人实际上 没有 跳过交通信号。

要做到这一点,必须进行第二次抛硬币,而且必须正面朝上。那是因为如果第一次抛的是正面,这个人会告诉他们没有跳过信号。但是如果第一次抛硬币是反面第二次抛硬币是正面,这个人会回答,尽管真实的回答是

一些基本概率:

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”。这意味着,如果有大量数据点,我们可以添加大量噪声,但仍能保持报告数据的准确性。

因此,当有更多的数据时,本地差分隐私可以更好地工作。这听起来可能有点违反直觉,但它是有意义的,因为我们有更多的数据噪声往往会相互抵消,我们可以获得更好的人口代表。

我希望这是关于差分隐私的一个很好的介绍。很快就会见到你!

参考资料:

  1. 一种不加噪声的局部 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*

如何优化您的模型|了解您的优化

原文:https://towardsdatascience.com/how-your-model-is-optimized-know-your-optimization-d2809c7a912c?source=collection_archive---------69-----------------------

对“为什么我的模型永远在运行?”还是那句经典的:“我觉得它可能已经收敛了?”

普通数据科学家或 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)。我们通过回溯保留了一些信息,但仅此而已。为了优化,我们可以利用函数的一阶导数信息。具有回溯的线搜索优化的直观公式是:

  1. 计算你的点的梯度
  2. 根据你的梯度和步长计算步长
  3. 向优化方向迈出一步
  4. 通过预先定义的因子(如α)调整步长
  5. 重复,直到找到最小值,或者您的步骤之间的值差异非常(非常)小,例如 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 轮廓的信赖域优化。-部门职能。每一步都用“+”表示,每一步的周围是一个区域,从该区域中选择下一步作为一个圆。

程序的直观表述可以是这样的
(参见附录中的正式表述):

  1. 计算函数的 Hessian 和梯度
  2. 在您位置周围的半径范围内选择一个最佳点
  3. 根据计算出的信息采取措施
  4. 根据你进步的多少来调整半径的大小——越接近最小值越小,否则就越大
  5. 重复直到达到收敛或公差

当然,这些简短的步骤并不十分复杂,你需要更多的参数和更多的数学知识来找到你半径中的正确点,调整步长和半径。如果你感兴趣的话,你可以去看看 Alg。附录中的 1 和 2。我们可以在实践中观察算法,看看半径如何随时间变化:

图 6 —采取的步骤(x 轴)中函数值的幅度变化(y 轴)。半径δ随着函数值的提高而变化。

我们看到,如果函数值随着时间的推移而提高,那么我们的半径会变小(见图 5 和图 6),而如果一开始函数值不好,我们会增加半径。参见图 6 中对吸引扇区函数进行优化的第一步。

我们起始问题的答案

来回答这个问题:“我的模型收敛了吗?”。我建议如下

  1. 测试不同的优化算法,比较性能和确定的最小值——它们是全局的吗?
  2. 如果你的问题表面是平坦的,也就是说在优化过程中只有很小的变化:运行更多的迭代,增加容差(收敛-差异的值非常小),也许尝试跳到函数的不同区域
  3. 从多个不同的起点开始:选择均值或中值来衡量绩效。

结论|兔子洞

我们已经看到了两类优化方法是如何工作的:直线线性优化器和信赖域优化器。这只是兔子洞的入口。对于我们看到的每个函数和问题,我们都能发现新的东西。我们可以分析我们的 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——求解λ是另一个子问题。

"你是如何开始机器学习和数据科学的?"[面试]

原文:https://towardsdatascience.com/howd-you-get-started-with-machine-learning-and-data-science-interview-693c33094c2?source=collection_archive---------10-----------------------

我在 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(问了一些问题,比如他在采访初级数据科学家时会寻找什么):

如果你有任何进一步的问题,或者只是想打声招呼,请留下回复或者给我发电子邮件。

人力资源分析和测试假设的艺术!

原文:https://towardsdatascience.com/hr-analytics-and-the-art-of-testing-hypotheses-5dd66d3153b1?source=collection_archive---------30-----------------------

随着技术在人力资源部门扎根,科技巨头开始探索人工智能和人工智能可以给人力资源带来的无限可能性,测试假设的简单艺术仍然可以帮助人力资源做出有意义和有影响的推断。

假设检验和 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 部分)

原文:https://towardsdatascience.com/hr-predictive-analytics-assessing-manager-performance-part-1-841fc56eff12?source=collection_archive---------33-----------------------

预测分析和人力资源

通过预测模型和 R 的应用,探索是什么因素驱动着公司经理的绩效

在 Unsplash 上由米米·蒂安拍摄的照片

本文是一项更具技术性的工作,展示了机器学习技术在人力资源数据集上的逐步实现,以了解经理的绩效。数据集取自基思·麦纽提的帖子,他在那里分享了这个用例以及数据集。这是关于评估组织中经理的绩效的 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 部分,我将分享一种基于机器学习的方法,来探索什么样的特征会影响管理者的表现,这种影响有多强,以及背后的原因是什么。

参考文献:

R : 中的数据浏览器包 https://cran . R-project . org/web/packages/data Explorer/vignettes/data Explorer-intro . html

Github 帐户以及 R:https://github.com/Sambit78/ebp_exercise中重构的代码

链接到原始数据集和问题:https://github.com/keithmcnulty/ebp_exercise

人力资源预测分析:评估经理绩效(第二部分)

原文:https://towardsdatascience.com/hr-predictive-analytics-assessing-manager-performance-part-2-2d3bd4edf153?source=collection_archive---------21-----------------------

预测分析和人力资源

通过预测模型和 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:结论

这篇文章有两个要点。首先,在处理可以排序的因变量时,有序逻辑回归很方便。例如,在人力资源领域,我们可以应用这些原则来研究员工福利。解释特征的对数似然性可能是棘手和困难的。使用图解法,很容易理解独立变量对分类可能性的单独和联合影响。

参考文献:

[## sambit 78/ebp _ 练习

您为一家北美销售公司工作,该公司在六个地方设有办事处。最近这家公司的首席执行官…

github.com](https://github.com/Sambit78/ebp_exercise)

HSIC 瓶颈:反向传播的替代方案

原文:https://towardsdatascience.com/hsic-bottleneck-an-alternative-to-back-propagation-36e951d4582c?source=collection_archive---------27-----------------------

信息论如何带给我们深度学习模型训练的其他技术

由 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 已经问世了!

原文:https://towardsdatascience.com/http-3-is-out-and-about-7c903f9aab9e?source=collection_archive---------0-----------------------

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 互联网。是未来!

QUIC 协议的到来

medium.com](https://medium.com/@anuradhawick/the-quic-internet-its-the-future-d903440b26ea)

几篇你可能会喜欢的文章,

[## MQTT:物联网设备如何相互对话

消息排队遥测传输及其在物联网中的应用

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 请求

原文:https://towardsdatascience.com/http-requests-in-python-f19c08250079?source=collection_archive---------40-----------------------

请求库简介

来源

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 上找到。感谢您的阅读!

疫情(新冠肺炎)期间的巨大潜在投资机会

原文:https://towardsdatascience.com/huge-potential-investment-opportunities-during-a-pandemic-covid-19-14013803eba4?source=collection_archive---------13-----------------------

识别大幅折价的股票,在管理风险的同时重新思考投资策略

在这样一个前所未有的时代,这篇文章旨在揭示当前市场的一些趋势/机会,让任何潜在投资者具备他们的 数据驱动决策 。每个投资者的风险偏好都是独特的,本文的目的是 告知 (而非建议)你的投资策略。

来源 : AZ 报价,彼得·林奇

“25000 年了,人性没怎么变。有些东西会从左场出来,市场会下跌,或者上涨。波动将会发生,市场将继续出现这些起伏——我认为这是一个很好的机会,如果人们能够明白他们拥有什么的话”。

《我爱波动》

—彼得·林奇对塔可钟的投资在 6 年内获得 600%的回报。

科技泡沫正在破裂,市场已经开始走下坡路,我可以自信地说,这不是任何人认为他们会走的路。在担心天文数字的初创企业估值会拖垮初创企业经济后,一个全球化的疫情正威胁要这样做。裁员在加速,股价在暴跌,普通民众中存在不确定性。对经济来说,这是绝望的时刻,然而,正是在这样的时刻,机会就在那里。问题是,你打算怎么办?

价值投资背后的动机

我的背景是工程学,尽管我可能擅长数字,但我上了一堂金融分析课,才意识到金融知识是多么基本和重要。当我想到投资市场时,主要是投资 ETF(因为本质上我想模仿市场,并与市场一起增加投资),关于新冠肺炎的新闻爆发了。所有人突然开始呆在家里,寻找温度计、口罩和卫生纸。

在做研究、与其他投资者交谈和狂看 YouTube 视频时,我意识到这可能是一个不常出现的机会。虽然新闻充斥着对哪些股票需要关注的预测,而且推理可能是有效的,但作为一个新手投资者,不可能试图预测短期内会发生什么。 因此,我决定专注于长期价值投资。从逻辑上来说,我把注意力集中在世纪之交的公司上。(这个股市指数衡量在美国证券交易所上市的 500 家大公司的股票表现。)投资这类公司的理由是 ,因为它们不太可能去任何地方 。它们对经济至关重要,如果情况出现,政府最好会出手救助它们。

收集数据和了解 S&P

为了我的分析,我使用了下面的维基百科页面 *来收集所有的股票名称及其符号。

**注:从维基百科页面*收集了 502 个公司名称

从维基百科抓取信息的 Python 代码

我分析的第一件事是 S&P 投资组合指数由多少个行业组成,以及它们各自的代表性。

按部门表示指数。按作者分类的图表

使用雅虎金融的 API,使用相应的股票代号来摄取从 2019 年 12 月 1 日到当前日期的每日股票价格。选择特定的日期没有任何特定的原因,这个想法是为了获取足够的历史数据来了解崩溃前发生了什么。2020 年 1 月和 2 月初是股市最好的阶段之一。在分析回报时,我想确保尽最大努力捕捉市场波动。

来源:雅虎财经,符号——AAPL

收集每日股票价格的 Python 代码

计算回报

每只股票的调整后收盘价用于计算该股票的每日回报。这个价格准确地反映了股息后的股票价值,被认为是股票的真实价格。财务回报,简单地说,就是在一段特定的时间内投资所赚或赔的钱。

计算回报的公式

关于退货需要注意的关键事项:

  1. 在这个分析中,回报是以股票价格的百分比变化来计算的
  2. 正回报代表盈利,负回报代表亏损

在计算了每天的回报后,我决定检查股票回报最低的那几天的频率。

2020 年 3 月滴滴最多也就不足为奇了。一半的公司在 2020 年 3 月 16 日(T1)经历了最低的回报率。出于好奇,我决定找出当天的新闻头条。

  1. 布伦特原油自 2016 年以来首次跌破每桶 30 美元
  2. 世界各地的公司都缩减了活动
  3. 美联储将利率下调至零
  4. 亚洲和欧洲的国债收益率下降,股市暴跌

这个练习是检查计算和分析输出的好方法。这些数据有助于证实,新冠肺炎确实影响了 S&P 指数中几乎所有的基础资产。

Python 代码计算回报并确定最低回报

识别机会——股票价格折扣

这一分析的主要驱动力是识别熊市中的潜在机会。作为一名投资者,我希望这些信息能指引我走向正确的方向。这些数据应该能够回答一些问题,

  1. 我现在应该买什么股票?
  2. 有没有另一只股票的估值更低?
  3. 相比之下,它的竞争对手表现如何?

照片由杰米街在 Unsplash 拍摄

对每只股票的调整后每日收盘价进行了分析。我没有查看从最高价到最低价的变化,而是决定查看股票的第三个四分位数值与其最低值的差值。通过这种方式计算,估算的折扣更为保守。

计算股票价格折扣的公式

谷歌调整后收盘价的方框图。按作者分类的图表

在相应的调整后收盘价方框图中,谷歌股价的第三个四分位值为1447.07 美元,跌至最低1056.52 美元

通过应用上面提到的公式,谷歌目前的交易折价为 26.9%

对其余的股票进行了类似的操作,并计算了它们的折扣价。

Python 代码来计算股票的折价

按部门的折扣

按部门比较折扣。按作者分类的图表

从上图可以看出,能源类股的平均折让率最高,约为 66% ,相比之下,消费类股仅下跌了 28%这一信息符合当前市场的行为。

  1. 医疗保健和消费品等行业目前面临巨大压力,这些领域的专业人士在这段时间不知疲倦地工作。但这反过来意味着这些业务正在产生稳定的现金流。
  2. 谷歌和苹果等公司分别隶属于通信服务信息技术。利用当前的技术,这些巨头会发现远程工作的创新方式,并相应地改变他们的商业模式。相比之下,对他们业务的负面影响不会那么严重。
  3. 另一方面,能源行业和非必需品行业的公司受到了严重影响。随着社交距离措施和消费者限制支出,这将直接影响这些企业的日常运营。

下面给出的是每个行业的前 3 只折价股票。他们强调了在各自的行业中哪些公司目前正以巨大的折扣进行交易。

每个板块 3 只折价最多的股票。按作者分类的图表

量化风险

每一个机会都有一定程度的风险。金融领域最大的挑战之一是能够准确量化这种风险。对于本文, 波动率 内的每只股票的收益被用来作为风险的度量。

  1. 波动性代表一种资产的价格在均值附近波动的幅度——这是对其回报率离差的一种统计度量
  2. 在这个分析中,我用回报率的标准差来衡量波动性
  3. 波动性越高,资产风险越大

Python 代码计算收益的标准偏差

一段时间内亚马逊的回报率。按作者分类的图表

亚马逊(股票代码:AMZN)回报的标准偏差是 0.0252,这意味着亚马逊股票价格的每日变化幅度为 2.5%

波音航空公司在这段时间内的收益。按作者分类的图表

波音航空公司(股票代码:BA)收益的标准差是 0.0696,这意味着其股票价格的每日变化大约为 7 %

从上面的图表可以看出,亚马逊的可变性低于波音,这意味着亚马逊是一个 风险较低的投资选择。

按部门划分的风险

按部门比较风险。按作者分类的图表

与折扣趋势类似,可以看出,能源和非必需消费品等风险行业的波动性较高,而消费品和医疗保健的波动性较低。能源行业的平均波动幅度为 6.38% ,而另一方面,消费品行业的平均波动幅度为 3.36%

有趣的是,折扣和风险之间有很高的相关性。大幅折价的行业(如能源)也面临更高的风险。这种分析的目的是 观察这些高折价股票,挑选风险较低的股票。

每个板块 3 只风险最小的股票。按作者分类的图表

从上图可以看出,亚马逊、威瑞森和 Charter Communications 等巨头构成了最稳定的股票。这进一步加强了市场的理解,即这类企业拥有坚实的商业模式和强大的传统,能够在这一动荡时期继续前行。

结论

折扣与风险。按作者分类的图表

当我接近这篇文章的结尾时,下面给出了我在研究过程中获得的一些重要知识,我想总结一下,以供大家参考。

  1. 从上面的数据可以看出,贴现和风险之间有一个趋势。就投资策略而言,同样的风险,选择折价较高的股票更有效率。
  2. 一家公司的股票价格反映了该公司未来的预期价值。有些公司的股价高于竞争对手是有原因的,作为投资者,理解这一点很重要。
  3. 个人对风险的偏好是不同的,这些指标只能指导你的研究。如何投资由你自己决定。
  4. 所有伟大的投资者(如沃伦·巴菲特、比尔·盖茨等)都有一个共同的投资秘诀——购买股票意味着你也在购买该业务的一部分。你必须了解这个行业,并且熟悉它的商业模式。
  5. 能够编码并不意味着能够进行这种分析或处理数字。一个数学模型的好坏取决于你的专业水平。编程的真正力量在于分析的可重复性和可伸缩性。对我来说,手动收集和分析这些数据非常耗时。我现在可以在未来的任何时候重用这些代码,节省我的时间、精力和精力。

注: 公司的完整列表及其折扣、风险和当前价格以 excel 表格形式提供,供您自己参考 此处

个人投资策略

我的专业领域和背景是信息技术和通信服务行业。所以我决定把我的注意力集中在这些领域。从上面的分析中,我直观地知道这两个行业都没有被严重低估,因此波动性相对较小。

所需行业的报告指标

从上表可以看出,与信息技术相比,通信服务的平均折扣更高,波动性更小。我决定在试图识别当前提供重大投资机会的股票时,给予 同等权重的折扣和风险 。使用期望的权重,我得出一个分数来排列这些股票,下面给出的是这个自定义评分的输出。

指标排名的表格结果

我会投资的潜在股票组合。按作者分类的图表

该图显示了这两个行业中每只潜在股票的机会与风险。泡沫的大小是股票的相对股价。根据评分标准,这些股票是每个领域的前 5 名。我个人已经跟踪了一些公司,但现在我会在下一次投资决策时考虑其他公司。

GitHub 链接,谢谢

谢谢你一直读到最后。我希望这篇文章能在这样的时候给你一些鼓励,并为你在下一步投资旅程中提供思考的食粮。我祝你一切顺利,对此的任何反馈都将不胜感激。

所有的图表和代码都可以在我的 GitHub 资源库中找到,请随意下载并分析您的用例信息。

[## 有线服务/数据科学

存放我所有杂物的地方。通过在…上创建帐户,为 wiredtoserve/datascience 的发展做出贡献

github.com](https://github.com/wiredtoserve/datascience/tree/master/PortfolioTheory)

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家,这篇文章的观点不应被解释为专业建议。

皮特·佩德罗萨在 Unsplash 上的照片

基于感性工学和人工智能的人性化产品设计

原文:https://towardsdatascience.com/human-centric-product-design-with-kansei-engineering-and-artificial-intelligence-f38cb3c0f26d?source=collection_archive---------17-----------------------

感性工程过程介绍,随后是通过人工智能和大数据捕捉消费者情感和情绪的进步。

作者根据 Ackerman 和 Wavebreakmedia 提供的图片

“设计师不是从一些先入为主的想法开始的。相反,这个想法是仔细研究和观察的结果,而设计是这个想法的产物。”-作者保罗·兰德

大多数产品/解决方案的最终目标是为最终用户/客户提供最佳利用率和满意度。顾客的满意度和喜好很可能是由人类的情感和情感决定的。感性工学(由长町光雄于 1974 年创立)的概念旨在捕捉顾客的心理感受,并将其带入产品或社交系统的设计中。这个意义上的心理感受包括想要、需要、美感(美丽、优雅等)等概念。),品味好等。感性工学从观察顾客的行为开始,使用心理学量表掌握他们的情绪和情感,并使用几个统计分析来分析情绪,以引导产品或系统的设计规范。

首先,我们试着对感性的概念有一个直觉。下图是两件艺术品,一件叫卢蒙巴,一件叫塔科特。光看图像,你能说出他们是 Lumumba 还是 Takete 吗?

两件名为 Lumumba 和 Takete 的艺术品(图片由作者提供)

你们中的大多数人会把左边的锯齿状艺术(A)命名为 Takete,把右边的弯曲艺术(B)命名为 Lumumba。同样,Ramachandran 等人[1]对大学生和本科生进行了一项实验,结果是 98%的人选择左为武田,右为卢蒙巴。这表明人类大脑能够从形状和声音中提取抽象属性,它们最有可能与心理感受相关联。

以上是一个了解人类心理感受的简单实验,但在现实世界中,关注的主题(领域)可以是新的手机、体育项目、网站甚至人工智能产品,而不是艺术。因此,感性工学是一种捕捉人们(特别是目标消费者)的情绪和情感并转化为产品设计和解决方案的方法(或艺术)。

传统感性工学流程

感性工学过程从一开始就被用于许多产品领域的开发,如家居用品、园艺工具、汽车、服装。下图描绘了感性过程的传统观点。

感性工程流程架构(图片由作者提供)

原则上,我们对每个感官都有一个情感(情绪)反应和一个理性(认知)反应。也就是说,当接收到感官输入时,人类将构建某种类型的意识,从而产生情感和情绪。有时,很难解释为什么会产生这种情绪,因为与武田和卢蒙巴的例子相似,它是非常主观和隐含的。但大多数时候,消费者会根据第一印象来决定产品,因此,了解消费者的思维过程非常重要。另一方面,人类也会对感官知觉建立理性的理解。这是一个寻求人类对他/她对产品的看法做出理性反应的过程。没有必要两种反应都一样,但在产品设计中,感性工学过程会将两种反应都考虑在内,以推动最终的产品设计。

因此,感性工学的流程可以根据下面的流程图来理解。在开始时,定义了,这是描述产品背后的整体思想的上下文。这包括理解和定义预期的目标群体和用户类型,市场定位,和产品组的问题。

感性工学工艺流程(图片由作者提供)

然后从两个不同的方面描述该域。一个是语义空间,一个是产品的属性/规格。语义空间可以用语义表达式(词)定义的某个向量空间来描述。这可以通过收集大量从语义角度描述领域的词汇来实现。这些词被称为感性词。例如,要描述一部手机,可以选择酷炫、优雅、美观、方便等词语。

应用程序的空间可以通过理解对用户真正重要的属性来定义。这可能是关键特征,并选择产品属性进行进一步评估。这些特性可以从不同的来源识别,如现有产品、客户建议、可能的技术解决方案和设计概念。

下一步是感性工学特有的,是两个空间的合成。在最近的文献中,诸如类别分类法、心理量表法、多变量统计分析和感性粗糙集模型等技术被用来进行这一步骤。以手机设计为例,这一步将分析什么样的应用规范可以驱动语义空间指标,如酷、方便、美观,反之亦然。下面简要介绍几种广泛使用的合成应用和情感空间的技术。进一步的细节可以在这篇研究文章中找到,作者是感性工学过程的创始人长町光夫教授【2】。

(1)品类分类方法:首先确定新产品领域:(如网上商城、无线加速度计)。想象产品并写下顾客的情感,例如,想象顾客需要什么样的财产,然后写在一张纸上。然后,使用卡片创建一个树状结构,如第一类、第二类等等。在这个阶段可以使用“鱼生图”。

(2)心理量表法:收集感性(情绪)词后,你用那些感性词创建一个 Likart 型量表(或 SD 量表)。在这种情况下,5 或 7 级非常受欢迎。在这种方法中,我们通常会查看产品的真实样品,并在秤上检查感觉。接下来,使用多变量统计方法分析这些记录。

(3)使用多变量统计方法的分析:计算因子分析得到相似意义组作为因子结构,从研究中删除无意义的感性词。主成分分析、数据挖掘方法等都是有用的。JMP (SAS)分析对从顾客情感中寻找设计项目是最有用的。

(4)感性粗糙集模型:粗糙集模型是波兰 Zdzislaw Pawlak 教授开发的一种独特的数学模型,能够明确隐藏的情感与设计项目之间的关系。

在综合步骤之后,进行验证建模步骤,以检查预测模型是否可靠、真实和合适。在预测模型失败的情况下,有必要更新属性空间和语义空间,从而改进模型。

基于感性工学开发的产品

许多大公司都采用了这种感性工学工艺,特别是在日本和瑞典。丰田、本田、马自达、松下、三洋、三星、索尼、小松、雅马哈等公司是少数使用感性工艺的世界知名公司。这些产品包括夏普的新冰箱设计(1979 年)、马自达的 MX5 乘用车(1987 年)、现代的索纳塔 2(1995 年)、波音 787 的内部设计(2008 年)和 Vf Lee 的 Urban Rider 牛仔裤(2014 年)。

马自达 MX5 (1987 年)是一个有趣的案例——马自达首席执行官构思的一款概念车,将成为年轻一代的运动型轿车。

图片来自 Pixabay

正如 Nagamachi 等人的原始文章[2]中所详述的,一组年轻驾驶员被选为用户群。取了两组驱动程序。第一次发生在年轻司机旁边的座位上。司机开车时拍摄了一段视频。第二个是研究人员站在十字路口,启动摄像机,如果任何司机看起来像年轻司机。调查结束后,所有 R&D 成员聚集到一个研究室,写下司机的情绪或行为,每个人在一张小卡片上看视频节目。这就是所谓的类别分类法。然后,他们收集一组卡片,如果它们被认为是同一类的话。之后,R&D 成员用这些卡片制作一个树状结构,就像鱼出生的图表一样。看树形结构,设计师分组联动卡意为设计元素。

用人工智能和机器学习增强感性工学过程

传统的感性工学过程是使用个性化体验样本进行的,其中包括 10-100 名消费者。然而,随着大数据的激增,如今大量数据可以免费公开获取。例如,Twitter、脸书、Instagram 等社交媒体平台包含数以百万计的情绪,这些情绪可以从公众中提取出来。此外,产品评论网站(如在线产品评论)和在线论坛(如惠而浦在线论坛)也包含大量的人们的意见、表达和评论。此外,在超市安装的大量监控摄像头可以捕捉不同产品购买者的面部表情和情绪。利用这些海量的大数据,肯定会使感性工学过程更上一层楼。因此,我们通过使用人工智能和大数据作为以下模型架构,扩展了传统的感性工程流程架构。

通过人工智能和大数据增强的感性工程流程(图片由作者提供)

考虑开发一种新的可穿戴智能手表,它可以捕捉人的惯性测量。我们可以简单地设计一个虚拟现实(VR)应用程序,让用户在通过摄像机捕捉用户行为(捕捉表情)的同时,对产品进行实验,而不是设计原型。此外,语义空间可以通过在线社交媒体、产品评论和类似产品的论坛来捕捉,以确定公众的看法。应用空间同样可以被这样的在线媒体捕获。之后,通过关西工程流程,可以改进和实现产品设计。

具体化从在线社交媒体数据中提取的情感可以用于多个领域,因为它提供了以更好的方式理解客户/利益相关者的机会。最近,数据分析和认知中心团队开发了患者报告信息多维探索(PRIME)框架,旨在识别数字患者护理中的情感计算方面【3】。除了社交媒体数据之外,许多来自图像和视频数据的人类活动识别和情感检测方法也是可用的,它们可用于导出关于用户的情感信息[4]。

下面的视频显示了情绪研究实验室的面部识别软件在测试酸奶时实时捕捉消费者的情绪。

情绪面部识别产品测试

最后的想法

尽管有许多产品设计和开发方法,但我对感性工学过程很着迷,它能带给顾客想要、需要、美感(美丽、优雅等)等心理感受。),好品味,融入到产品的设计中。感性工学过程从一开始就被用于许多产品领域的开发,如家居用品、园艺工具、车辆、服装等,并被许多世界领先的行业如丰田、马自达、索尼、三星、松下等所采用。简而言之,感性工学过程在产品设计中考虑了消费者情感(语义空间)和对应用规范的认知理解(应用空间)。

感性工学过程的传统实现考虑使用有限数量的消费者进行体验测试(由于可行性原因),然而,随着大数据的出现和激增,如今可免费公开获得的大量数据可被利用来生成语义空间和应用空间的更好、可靠和复杂的视图。如今,有几种工具和技术可以最大限度地利用这种大数据平台。因此,将这些工具和技术与感性工学过程相结合,有可能设计出面向大众市场的消费者友好型产品、系统和解决方案。

参考

[1] Ramachandran,Vilayanur S .,和 Edward M. Hubbard。“听颜色,尝形状。”《科学美国人》288.5(2003):52–59。

[2]永町,光雄。"感性工学的历史和人工智能的应用."国际应用人因与工效学会议。施普林格,查姆,2017。

[3] Adikari,Achini 等,“在线支持团体能解决癌症患者的心理病态问题吗?基于人工智能的前列腺癌轨迹调查。”《公共科学图书馆·综合杂志》 15.3 (2020): e0229361。

[4] Nawaratne,Rashmika,等人,“用于人类活动识别的具有短暂性的分层双流增长自组织映射” IEEE 工业信息学汇刊 (2019)。

使用深度学习的人类情感和手势检测器:第 1 部分

原文:https://towardsdatascience.com/human-emotion-and-gesture-detector-using-deep-learning-part-1-d0023008d0eb?source=collection_archive---------16-----------------------

情感手势检测

了解如何从零开始构建具有深度学习的人类情感和手势检测器。

有没有人曾经疑惑地看着某人,试图分析他们有什么样的情绪或他们试图做出什么样的手势,但你最终被弄糊涂了。也许有一次你试图接近一个长得像这样的婴儿:

资料来源:科林·梅纳德-恩斯普拉什

你以为它喜欢你,只是想要一个拥抱,结果你抱着它,然后就发生了这种事!

来源:Brytny.com-Unsplash

哎呀!这并没有按计划进行。但现实生活中的使用可能不像上述情况那样简单,可能需要更精确的人类情感分析以及手势分析。这一应用领域在任何部门都特别有用,在这些部门中,客户满意度或仅仅知道客户想要什么是极其重要的。

今天,我们将揭示几个深度学习模型,正是这样做的。我们今天将开发的模型可以识别一些人类情感以及一些手势。我们将尝试识别 6 种情绪,即愤怒、快乐、中性、恐惧、悲伤和惊讶。我们还将识别 4 种手势,即失败、胜利、超级和出拳。我们将进行实时表演,我们将得到模特的实时声音反应。

情绪模型将使用卷积神经网络从头开始构建,对于手指手势,我将使用 VGG-16 架构的迁移学习,并添加自定义层来提高模型的性能,以获得更好、更高的准确性。情绪分析和手指手势将为每个动作提供适当的声音和文本响应。我们将使用的衡量标准是准确性,我们将努力实现情感模型 1 的验证准确性至少为 50%,情感模型 2 的验证准确性超过 65%,手势模型的验证准确性超过 90%。

数据集:

现在,让我们来看看可供我们选择的数据集。

1。 Kaggle 的 fer2013 数据集 该数据集是一个开源数据集,包含 35887 张各种情绪的灰度图像,这些图像都被标记,大小为 48x48。面部表情识别数据集在机器学习国际会议(ICML)期间发布。这个 Kaggle 数据集将是本案例研究中用于情绪分析的更主要和更重要的数据集。

数据集在中的 excel 表格中给出。csv 格式并提取像素,在提取像素并预处理数据后,数据集看起来像下面发布的图像:

来源:作者图片

(如果第一个链接不工作,请参考该链接)。

2。 野外挑战中的第一个影响 这可以是本案例研究考虑的第二个数据集。第一个在野外影响的挑战是设计先进的深度神经架构,包括 AffWildNet,它允许我们利用 AffWild 数据库来学习特征,这可以用作实现维度和分类情感识别的最佳性能的先验。在下载链接中,我们会找到一个 tar.gz 文件,它包含 4 个文件夹:视频、注释、盒子和地标。然而,对于我们的情感识别模型,我们将严格地只考虑 fer2013 数据集。

3。 美国手语字母数据集 这将是手指手势检测的主要数据集。“美国手语”字母表数据集由来自美国手语的字母表的图像集合组成,被分成 29 个文件夹,这些文件夹代表各种类别。训练数据集包含 87,000 幅 200x200 像素的图像。

共有 29 类,其中 26 类用于字母 A-Z,3 类用于空格、无。这 3 个类对实时应用和分类非常有帮助。然而,对于我们的手势识别,我们将使用来自该数据的从 A 到 Z 的 4 个类,用于手指的一些适当的所需动作。该模型将被训练识别这些特定手势中的 4 个,即 A(出拳)、F(超级)、L(失败)和 V(胜利)。然后,我们将训练我们的模型来识别这些手势,并相应地对以下每一项做出适当的声音响应。

4。自定义数据集— 对于情感分析和手指手势检测,我们还可以使用自己、朋友甚至家人的自定义数据集来识别各种情感和手势。拍摄的图像将被灰度化,然后根据我们的要求调整大小。

预处理:

对于我们的情绪模型,我们将使用 Kaggle 的 fer2013 数据集,并将使用 ASL 数据集进行手势识别。我们可以开始执行模型所需的预处理。对于情感数据集,我们将查看预处理所需的库。

Pandas 是一个快速、灵活的开源数据分析库,我们将使用它来访问。csv 文件。

Numpy 用于多维数组上的处理。对于我们的数据预处理,我们将使用 numpy 来制作像素特征的数组。

OS 模块为我们提供了一种与操作系统交互的方式。

cv2 模块是计算机视觉/open-cv 模块,我们将使用它将像素的 numpy 数组转换成视觉图像。

tqdm 是一个可选的库,我们可以用它来可视化处理速度和每秒位数。

现在让我们使用 pandas 来读取 fer2013.csv 文件。

我们使用 pandas 读取 fer2013.csv 文件。fer2013 是面部表情识别。Kaggle 的 csv 文件。在。csv 文件我们有 3 个主要栏目-情感,像素和使用。情感栏由标签 0-6 组成。像素行包含数组格式的像素图像。使用列包含培训、公共测试和私有测试。让我们仔细看看这个。

标签在 0-6 的范围内,其中:

0 =生气,1 =厌恶,2 =恐惧,3 =开心,

4 =悲伤,5 =惊喜,6 =中性。

像素由像素值组成,我们可以将其转换为数组形式,然后使用 open cv 模块 cv2 将像素数组转换为我们可以可视化的实际图像。Usage 列由 Training、PublicTest 和 PrivateTest 组成。我们将使用训练来存储训练数据集的位置,剩余的 PublicTest 和 PrivateTest 将用于存储验证文件夹中的图像。

现在让我们相应地提取这些图像。在下面的代码块中,我将展示一个类的训练和验证。在这个代码块中,我们将从 pixel 的列中提取图像,然后我们将创建一个可以从 Usage 列中跟踪的 train 和 validation 文件夹。对于每个训练和验证目录,我们将创建所有 7 个文件夹,其中包含愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中立。

我们遍历数据集,将像素从字符串转换为浮点,然后将所有浮点值存储在 numpy 数组中。我们正在转换尺寸为 48x48 的图像,这是我们想要的图像尺寸。(这一步是可选的,因为给定的像素已经是期望的大小。)

如果用法是作为训练给出的,那么我们为每种情绪制作一个训练目录和单独的目录。我们将图像存储在正确的情感目录中,可以通过情感栏的标签找到该目录。

对于我们认为使用值为 PublicTest 和 PrivateTest 的验证目录,类似地重复这些步骤。情绪由情绪栏中的标签分类,类似于火车目录的工作方式。

在这个步骤之后,现在完成了用于训练情绪的所有数据预处理,并且我们已经成功地提取了情绪识别模型所需的所有图像,现在我们可以继续进行进一步的步骤。幸运的是,我们不必为手势数据做大量的预处理。下载 ASL 数据集,然后创建 train1 和 validation1 文件夹,如下所示:

train1 和 validation1 目录有 4 个子目录,如图所示。我们将用字母“L”代表失败者,“A”代表重击,“F”代表超级,“V”代表胜利。总结下面的字母和手势:

L =失败者| A =出拳| F =超级| V =胜利

ASL 数据集包含每个字母的 3000 幅图像。因此,我们将使用前 2400 幅图像进行训练,其余 600 幅图像用于验证。这样,我们将数据分成 80:20,训练:验证比率。将每个字母“L”、“A”、“F”和“V”的前 2400 个图像粘贴到 train1 文件夹中它们各自的子目录中,并将剩余的 600 个图像粘贴到 validation1 文件夹中它们各自的子目录中。

探索性数据分析(EDA):

在开始训练我们的情绪和手势模型之前,让我们看看预处理步骤后我们手中的图像和整体数据。首先,我们将研究情绪数据的 EDA,然后我们将研究手势数据。从情绪数据开始,我们将绘制一个条形图和散点图来查看数据集是平衡的、相当平衡的还是完全不平衡的。我们将查阅列车目录。

条形图:

散点图:

我们可以注意到,这是一个相当平衡的模型,除了“厌恶”的图像相对较少。对于我们的第一个情绪模型,我们将完全放弃这种情绪,我们将只考虑剩下的 6 种情绪。现在让我们看看情感数据集的训练和验证目录是什么样子的。

火车:

列车数据的条形图和散点图如下所示:

每个数据集的训练图像如下所示:

验证:

列车数据的条形图和散点图如下所示:

每个数据集的验证图像如下所示:

分析完我们的情绪数据集后,我们可以继续分析手势数据集,执行与上面类似的分析,并理解手势数据集。由于用于训练和验证的手势数据的数据集是完全平衡的,因此分析它们更容易。手势数据集的训练和验证数据将在下一部分进行分析,类似的图像也将显示出来。

这就完成了我们对情绪模型的探索性数据分析。我们现在可以开始建立我们的情感识别模型。首先,我们将使用图像数据增强来建立情绪模型,然后我们将建立手势模型。稍后,我们将直接从。csv 文件,并尝试获得更高的准确性。最后,我们将创建一个最终模型来运行整个脚本。

情绪模型-1:

在模型 1 中,我们将使用数据增强技术。数据扩充的正式定义如下-

数据扩充是一种策略,使从业者能够显著增加可用于训练模型的数据的多样性,而无需实际收集新的数据数据扩充裁剪、填充和水平翻转等技术通常用于训练大型神经网络。

参考:bair.berkeley.edu

我们现在将继续导入所需的库,并指定训练模型所需的一些参数。

导入所有重要的所需深度学习库来训练情绪模型。
Keras 是一个应用编程接口(API),可以运行在 Tensorflow 之上。
Tensorflow 将是我们用来构建深度学习模型的主要深度学习模块。
imagedata generator 用于数据扩充,模型可以看到模型的更多副本。数据扩充用于创建原始图像的副本,并在每个时期使用这些变换。
将使用的训练层如下:
1。输入 =我们传递输入形状的输入层。
2。 Conv2D =卷积层与输入结合,提供张量
3 的输出。 Maxpool2D =对卷积层的数据进行下采样。
4。批量标准化 =这是一种用于训练深度神经网络的技术,它将每个小批量的输入标准化到一个层。这具有稳定学习过程和显著减少训练深度网络所需的训练时期的效果。
5。 Dropout = Dropout 是一种在训练过程中忽略随机选择的神经元的技术。它们是随机“退出”的,这防止了过度拟合。
6。密集 =完全连接的层。7。展平 =将整个结构展平为一维数组。
模型可以建立在类似模型的结构中,也可以按顺序建立。
使用 l2 正则化进行微调。
所使用的优化器将是 Adam,因为它比该模型上的其他优化器执行得更好。
Numpy 用于数值数组类运算。
pydot_ng 和 Graphviz 用于制作剧情。我们也在导入操作系统模块,使其与 Windows 环境兼容。

num_classes 定义了我们必须预测的类别的数量,即愤怒、恐惧、快乐、中性、惊讶和中性。
从探索性的数据分析中我们知道图像的维数是:
图像高度= 48 像素
图像宽度= 48 像素
类别数= 1 因为图像是灰度图像。
对于图像增强的训练,我们将考虑 32 的批量大小。

为存储的图像指定序列和验证目录。
train_dir 是包含用于训练的图像集的目录。
验证目录是包含验证图像集的目录。

数据扩充:

我们现在来看看数据扩充代码:

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

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

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

情绪模型-1:

现在,我们将着手构建模型。

我们将为我们的模型使用一个顺序类型的架构。我们的顺序模型总共有 5 个块,即三个卷积块、一个全连接层和一个输出层。我们将有 3 个卷积块,其滤波器的大小分别为 32、64 和 128。内核大小将是(3,3)并且内核初始化器将是 he_normal。我们也可以使用 l2 规范化的核正则化。我们首选的激活是 elu,因为它通常在图像上表现得更好。输入形状将与我们的每个训练和验证图像的大小相同。
批处理规范化层-批处理规范化是一种提高人工神经网络的速度、性能和稳定性的技术。最大池用于缩减数据采样。脱落层用于防止过度配合。
全连通块由 64 个滤波器的密集层和一个批处理归一化组成,后面是一个丢弃层。在通过密集层之前,数据被展平以匹配维度。
最后,输出层由带有 softmax 激活的密集层组成,根据 num_classes 给出概率,num _ classes 代表要进行的预测的数量。

模型图:

这是我们建立的整体模型的样子:

回访:

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

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

编译并拟合模型:

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

图表:

观察:

该模型能够很好地执行。我们可以注意到,训练和验证损失不断减少,训练和验证精度不断提高。在深度学习模型中没有过度拟合,并且我们能够实现大约 51%的准确度和大约 53%的验证准确度。

这是第一部分,伙计们!我希望你们都像我写这篇文章一样喜欢阅读这篇文章。在下一部分中,我们将介绍手势训练模型,然后研究第二个情绪训练模型,我们可以使用它来实现更高的准确性。最后,我们将创建一个最终管道来实时访问模型,并从模型中获得关于特定情绪或手势的声音响应。我还将发布完整代码、脚本和构建模块的 GitHub 库。敬请期待下一部分,祝你有美好的一天!

使用深度学习的人类情感和手势检测器:第 2 部分

原文:https://towardsdatascience.com/human-emotion-and-gesture-detector-using-deep-learning-part-2-471724f7a023?source=collection_archive---------42-----------------------

情感手势检测

深入探究人类情感和手势识别

大家好!欢迎回到使用深度学习的人类情感和手势检测器的第 2 部分。如果你还没有看过,在这里 看看第一部分。在本文中,我们将介绍手势模型的训练,并探讨如何提高情绪模型的准确性。最后,我们将使用计算机视觉创建一个最终管道,通过它我们可以访问我们的网络摄像头,并从我们训练的模型中获得声音响应。事不宜迟,让我们开始编码并理解这些概念。

资料来源:法国-v-unsplash

为了训练手势模型,我们将使用迁移学习模型。我们将使用 VGG-16 架构来训练模型,并排除 VGG-16 的顶层。然后,我们将继续添加我们自己的自定义层,以提高精度和减少损失。我们将尝试在我们的手势模型上实现大约 95%的整体高准确性,因为我们有一个相当平衡的数据集,并使用图像数据增强和 VGG-16 迁移学习模型的技术。与我们的情绪模型相比,这项任务可以很容易地实现,并且在更少的时期内实现。在以后的文章中,我们将介绍 VGG-16 架构是如何工作的,但现在让我们继续分析手头的数据,并对手势数据集进行探索性数据分析,类似于我们在提取图像后对情感数据集进行的分析。

探索性数据分析(EDA):

在下一个代码块中,我们将查看 train 文件夹中的内容,并尝试计算出 train 文件夹中每个手势类别的总类别数。

火车:

我们可以查看 train1 文件夹中的四个子文件夹。让我们直观地看看这些目录中的图像数量。

条形图:

我们可以从条形图中注意到,每个目录都包含 2400 个图像,这是一个完全平衡的数据集。现在,让我们开始可视化火车目录中的图像。我们将查看每个子目录中的第一个图像,然后查看这些文件夹中每个图像的尺寸和通道数。

图像的尺寸如下:

图像的高度= 200 像素
图像的宽度= 200 像素
通道数= 3

类似地,我们可以对 validation1 目录执行分析,并检查我们的验证数据集和验证图像看起来如何。

验证:

条形图:

我们可以从条形图中注意到,每个目录包含 600 个图像,这是一个完全平衡的数据集。现在,让我们开始可视化验证目录中的图像。我们将查看每个子目录中的第一个图像。这些文件夹中每个图像的通道尺寸和数量与列车目录相同。

至此,我们完成了手势数据集的探索性数据分析(EDA)。我们可以继续构建姿势训练模型以进行适当的姿势预测。

手势训练模型:

让我们看看下面的代码块,以了解我们正在导入的库,并设置类的数量及其维度和各自的目录。

导入所有重要的所需深度学习库来训练手势模型。
Keras 是一个应用编程接口(API),可以运行在 tensorflow 之上。
Tensorflow 将是我们用来构建深度学习模型的主要深度学习模块。
从 tensorflow,我们将提到一个名为 VGG-16 的预训练模型。我们将使用带有定制卷积神经网络(CNN)的 VGG-16,即我们将使用我们的迁移学习模型 VGG-16 以及我们自己的定制模型来训练一个整体准确的模型。keras 的 VGG-16 模型使用 imagenet 权重进行预训练。

ImageDataGenerator 用于数据扩充,其中模型可以看到模型的更多副本。数据扩充用于创建原始图像的副本,并在每个时期使用这些变换。
将使用的训练层如下:
1。输入 =我们传递输入形状的输入层。
2。 Conv2D =卷积层与输入结合,提供张量输出。
3。 Maxpool2D =对卷积层的数据进行下采样。
4。批量标准化 =这是一种用于训练深度神经网络的技术,它将每个小批量的输入标准化到一个层。这具有稳定学习过程和显著减少训练深度网络所需的训练时期的效果。
5。 Dropout = Dropout 是一种在训练过程中忽略随机选择的神经元的技术。它们是随机“退出”的,这防止了过度拟合。
6。密集 =全连接层。
7。展平 =将整个结构展平成一个一维数组。

模型可以构建在如该特定模型所示的模型状结构中,或者可以以顺序方式构建。在这里,我们将使用一个类似功能 API 模型的结构,它不同于我们的情绪模型,情绪模型是一个顺序模型。我们可以使用 l2 正则化进行微调。
所使用的优化器将是 Adam,因为它比该模型上的其他优化器性能更好。我们也正在导入操作系统模块,使其与 Windows 环境兼容。

我们有 4 类手势,即出拳、胜利、超级
和失败者。
每个图像具有 200 的高度和宽度,并且是
RGB 图像,即三维图像。
我们将使用 128 的 batch_size 进行图像数据扩充。

我们还将为存储的图像指定序列和验证目录。
train_dir 是包含用于训练的图像集的目录。
验证目录是包含验证图像集的目录。

数据扩充:

我们将查看手势数据集的图像数据增强,它类似于情绪数据。

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

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

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

在下一个代码块中,我们在变量 VGG16_MODEL 中导入 VGG-16 模型,并确保我们输入的模型没有顶层。
使用没有顶层的 VGG16 架构,我们现在可以添加自定义层。为了避免训练 VGG16 层,我们给出下面的命令:
Layers . trainiable = False。我们还将打印出这些层,并确保它们的训练设置为假。

手指手势模型:

下面是我们正在构建的手指手势模型自定义层的完整代码

我们正在建立的手指手势模型将通过使用
迁移学习来训练。我们将使用没有顶层的 VGG-16 模型。
我们将在 VGG-16 模型
的顶层添加自定义层,然后我们将使用这个迁移学习模型来预测
手指手势。
定制层由输入层组成,基本上是 VGG-16 模型的
输出。我们添加一个卷积层,它有 32 个滤波器,
kernel_size 为(3,3),默认步长为(1,1),我们使用激活
作为 relu,he_normal 作为初始化器。
我们将使用池层对来自
卷积层的层进行下采样。
在样品通过展平
层后,两个完全连接的层作为 relu 激活使用,即
密集结构。
输出层有一个 softmax 激活,num_classes 为 4,
预测 num_classes 的概率,即 Punch、Super、
Victory 和 Loser。
最终模型将输入作为 VGG-16 模型
的起点,输出作为最终输出层。

回调类似于前面的情感模型,所以让我们直接进入手势模型的编译和训练。

编译并拟合模型:

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

图表:

观察:

该模型能够非常好地执行。我们可以注意到,训练和验证损失不断减少,训练和验证精度不断提高。深度学习模型中没有过度拟合,我们能够实现超过 95%的验证准确率。

奖金:

情绪模型-2:

这是我们将要研究的另一个模型。通过这种方法,我们可以用完全相同的模型获得更高的精度。经过一些研究和实验,我发现我们可以通过使用 numpy 阵列中的像素并训练它们来实现更高的精度。有一篇精彩的文章作者使用了类似的方法。我强烈建议用户也去看看那篇文章。这里,我们将把这种方法用于定制的顺序模型,看看我们能够达到什么样的精度。导入与前面的情感模型相似的库。更多信息请参考本文末尾的 GitHub 资源库。下面是为模型准备完整数据的代码块。

num_classes =定义了我们必须预测的类别的数量,即愤怒、恐惧、快乐、中性、惊讶、中性和厌恶。
通过探索性的数据分析我们知道图像的尺寸为:
图像高度= 48 像素
图像宽度= 48 像素
通道数= 1 因为是灰度图像。我们将考虑该型号的批量为 64。

我们将用这种方法将像素转换成一个列表。我们把数据按空格分开,然后把它们作为数组,再把它们整形成 48,48 的形状。我们可以继续扩展维度,然后将标签转换为分类矩阵。

最后,我们将数据分为训练、测试和验证。这种方法与我们以前的模型方法略有不同,在以前的模型方法中,我们只利用训练和验证,因为我们以 80:20 的比例划分数据。这里,我们以 80:10:10 的格式划分数据。我们将使用与我在上一部分中使用的相同的序列模型。让我们再次看看这个模型,看看它在训练后的表现如何。

我们能够对所有 7 种情绪实现的最终准确度、验证准确度、损失和验证损失如下:

图表:

观察:

该模型能够很好地执行。我们可以注意到,训练和验证损失不断减少,而训练和验证准确性不断提高。深度学习模型中没有过度拟合,我们能够实现超过 65%的验证准确性和几乎 70%的准确性,并减少整体损失。

录像:

在本节中,我们将制作模特声音反应所需的录音。我们可以为每一个模型和每一种情绪或手势创建定制的录音。在下面的代码块中,我将展示一个分别记录一种情绪和一种手势的例子。

了解导入的库:

  1. Google Text-to-Speech 是一个 python 库,我们可以用它将文本转换成语音翻译响应。
  2. playsound =这个模块对于直接从指定路径播放. mp3 格式的声音很有用。
  3. 这个模块提供了几个对文件和文件集合的高级操作。具体而言,提供了支持文件复制、移动和移除的功能。

在这个 python 文件中,我们将为情绪和所有手势创建所有需要的语音记录,并将它们存储在 reactions 目录中。我展示了一个例子,展示了如何在代码块中为每种情绪或手势创建定制的语音记录。录音的全部代码将在本文末尾的 GitHub 资源库中发布。

最终管道:

我们最终的管道将包括加载我们保存的模型,然后使用它们来预测情绪和手势。我将在 GitHub 库中包含 2 个 python 文件。final_run.py 接受用户的选择,运行情感或手势模型。final_run1.py 同时运行情绪和手势模型。随便用哪个对你们来说更方便。我将使用从第一情绪训练模型和训练手势模型保存的模型。我们将使用一个名为Haar cascode _ frontal face _ default . XML的附加 XML 文件来检测人脸。让我们试着从下面的代码块中理解最终管道的代码。

在这个特定的代码块中,我们导入了所有需要的库,我们将使用这些库来获得模型对预测标签的声音响应。 cv2 是计算机视觉(open-cv)模块,我们将使用它来实时访问和使用我们的网络摄像头。我们正在导入时间模块,以确保我们仅在 10 秒钟的分析后得到预测。我们加载保存的情绪和手势模型的预训练权重。然后,我们指定用于检测人脸的分类器。然后,我们分配所有可以通过我们的模型预测的情绪和手势标签。

在下一个代码块中,我们将查看情绪模型的代码片段。有关完整的代码,请参考本文末尾的 GitHub 资源库。

在这个选择中,我们将运行情绪模型。当检测到网络摄像头时,我们将读取帧,然后当 haar cascade 分类器检测到人脸时,我们将继续绘制一个矩形框(类似于边界框)。为了更好的预测,我们将面部图像转换成与训练图像相似的 48、48 维的灰度。仅当 np.sum 检测到至少一个面部时,才进行预测。keras 命令 img_to_array 将图像转换为数组维数,如果检测到更多图像,我们将扩展维数。预测是根据标签做出的,录音会相应播放。

让我们看看运行手势模型的代码片段。

在这个选择中,我们将运行手势模型。当检测到网络摄像头时,我们将读取帧,然后在屏幕中间绘制一个矩形框,这与情绪模型不同。用户必须将手指放入所需的框中,以进行以下工作。仅当 np.sum 检测到至少一个手指模型时,才进行预测。keras 命令 img_to_array 将图像转换为数组维数,如果检测到更多图像,我们将扩展维数。预测是根据标签做出的,录音会相应播放。至此,我们的最终流水线完成,我们已经分析了构建人类情感和手势检测器模型所需的所有代码。我们现在可以开始释放视频捕获并销毁所有窗口,这意味着我们可以停止运行计算机视觉模块正在运行的帧。

结论:

我们终于完成了对整个人类情感和手势检测器的检查。完整代码的 GitHub 库可以在这里找到。我强烈建议尝试各种参数以及我们已经建立的所有 3 个模型中的层,并尝试实现更好的结果。各种记录也可以根据用户的需要进行修改。也有可能尝试各种迁移学习模型或构建您的定制架构,并实现整体更好的性能。尽情体验和尝试不同的独特的模型吧!

最终想法:

我非常喜欢写这个 2 部分的系列,它绝对是一个爆炸。我希望你们都像我写这篇文章一样喜欢阅读这篇文章。我期待着在未来发布更多的文章,因为我发现它非常令人愉快。因此,任何关于未来文章的想法或任何你们想让我涵盖的话题都将受到高度赞赏。感谢每一个坚持到最后的人,祝你们度过美好的一天!

人类智能、计算和通用机器

原文:https://towardsdatascience.com/human-intelligence-computation-and-the-universal-machine-f8e78c93355f?source=collection_archive---------21-----------------------

数学和计算的流动性

大多数人对人类认知只不过是计算的概念感到不舒服。毕竟人类目前在大多数任务上远远优于机器。用某种干巴巴地将输入转化为输出的符号搅动机器来框定人类思维的能力,似乎太局限了。

但是关于为什么会这样的争论似乎总是不了了之。人类的思维有什么不同?如果人类的智力不仅仅是计算,那么这更多的 T1 来自哪里?

我认为人们对机器类比的厌恶源于他们对计算本身的误解。当计算被视为某种僵硬的、机械的构造时,人和机器之间的对比是明显的。但是计算绝不是固定和僵化的。它比大多数人意识到的更有表现力,甚至创造力。

要理解计算不仅仅是程序输出,我们需要了解机器是如何做出决策的,以及普适性的概念。更重要的是对哥德尔和图灵发现的东西的欣赏和理解。

只有理解数学和计算的流动性和创造性,人们才能充分理解计算类比,并从这个基础上正确地开始他们的论点。在选择辩论的任何一方之前,我们必须认识到计算的核心是什么。

本文旨在帮助提供这一基础。

我将在整篇文章中使用术语计算“类比”(带引号),但而不是作为人类认知不同于计算的声明(即只是的一个类比)。一个人不能把结论放进他们的前提,否则他们的写作就是循环。因此,我使用计算“类比”只是为了比较人类和机器的思维。

框定问题

最近,⁴写了两篇文章,认为基于计算的普遍性,人们不可能比其他人更聪明,并邀请我对这一观点发表意见。事实证明,比较智能方法是一种将人类和机器并列的好方法。因此,我不会对特里尚克的文章中提出的观点进行评论,而是利用这个机会来阐述我们将人类认知与计算进行比较的问题。

概观

  • 敏捷
  • 机器思维
  • 从符号洗牌到普遍性
  • 数学和计算的创造力
  • 论计算类比的有效性
  • 速度即熟悉度
  • 天才神话

我们开始吧。

敏捷

对许多人来说,有些人比其他人“聪明”的想法似乎是显而易见的。有些人似乎能够更快地得出答案和/或给出更好的答案。

但是一个人比另一个人“更聪明”的想法是值得怀疑的,原因有很多。首先,智力可以被描述为与逻辑、理解、意识、推理、计划等有关。说我们可以观察到一个人在所有认知范畴中超越他人是一种戏剧性的过度简单化。

我们还知道,像智商这样的智力单一定义在统计学上和科学上都不成立,尽管心理学家(和在线测试者)一直在推动它。我还没有看到反对参考文章的论点不是逻辑谬误或者缺乏对统计、概率和科学的正确理解。

但是,在试图通过智力来比较人们时,人们可能会采取另一个角度。也许比较智力可以通过在人类认知和计算之间画出平行线来挽救?

从计算的角度思考是有吸引力的。可以说,掌握计算“类比”(记住,故意引用)比试图挖掘统计/概率错误或理解复杂和简单现象之间的根本差异更容易。机器和人类认知之间似乎有一种直观的联系,即使对于那些将这种相似性视为被迫的人来说也是如此。

当人们用计算类比来论证“智能”时,他们在某种意义上是在谈论 处理 能力。计算机将输入转化为输出的能力有多强,有些人能比其他人更好地完成这种转化吗?人们可能会寻找有形计算组件的心理类似物,如 RAM、硬盘驱动器和 CPU。当然,已知会影响计算的概念有物理版本,如接口内存吞吐量并行性和缺陷

但是当你在更基础的层面上理解计算时,就没有必要诉诸个体之间的物理差异。计算最终是不可知的,其原因在本文中将变得显而易见。计算是关于数学、符号和信息,以及当复杂性达到一定程度时,这些结构所提供的矛盾的自由。

如果我们要在人们的认知能力之间进行比较,使用计算作为类比,那么我们需要理解“思维”在计算中是如何建模的。

机器思维

首先,我们将看看机器如何解决问题,为此,我们必须了解问题解决本身的性质。这就把我们带到了计算中问题是如何建模的。

决策问题

在计算中,决策建模的方式是通过使用所谓的决策问题。决策问题是带有是/否答案的问题,并且构成了计算复杂性理论的主要部分。

当人类在决策中引入更多的 主观性 时,我们需要围绕一些精确的东西开始我们的比较。我们将在后面看到,机器也通过利用过去的“经验”和使用近似值来得出它们的解决方案,从而引入了“主观性”。

决策问题根据其复杂程度进行分类。两个最著名的复杂性类是 PNP 。p 代表多项式时间, NP 代表非确定性多项式时间。把这些想成是迅速解决了分别迅速验证了P 既可以快速求解又可以快速验证,而 NP 只能(?)被迅速验证(不太对,但留在我身边)。

图 2 决策问题的两种最常见的复杂性类别

注意 NP 复杂性类的“慢慢解决”旁边的问号。我们并不确切知道 NP 问题是否只能慢慢解决,但是从来没有人找到一个 NP 问题的快速而精确的解决方案(对于一个合理输入大小的问题)。这就是计算机科学中著名的 P vs NP 问题,该问题问是否存在比验证更难计算的问题(或者说,快速验证其解的问题是否也能快速解决?)?

复杂性理论家们目前的共识是 P ≠ NP,因为还没有人在合理规模的输入上找到一个实例来暗示 otherwise⁸.

这篇文章为什么要关心 P vs NP?a 类决策问题的复杂性告诉我们一个算法能够多有效地得到它的解决方案。既然我们使用计算来比较人们的智力,我们就需要欣赏人们在应对挑战时所解决的那种问题。

复杂性类别在技术上并不通过难度来划分问题,因为复杂性类别的下限是未知的。现在,我们只能说复杂性类向我们展示了一些问题可以快速解决(因此可以预见),而其他问题没有明显的快速解决方案。 3 显示了 PNP 复杂度类之间的定性比较。

图 3P 和 n P 在求解和验证速度上的差异。对于 P ,计算答案的时间随着输入大小的多项式增加。对于 NP ,计算答案的时间随着输入的大小呈指数增长(在确定性图灵机上)。

绘制的线让我们感觉到 P 和 NP 是多么的不同。为了完整地完成这个对话,我们需要包括另外两个复杂性类别NP-HardNP-Complete图 4 显示了我们的 4 个复杂度等级,按照复杂度递增排列。

图 4 四大复杂度类之间的关系(假设 P ≠ NP 下)。

当计算机试图解决一个问题时,它们试图解决的是这些复杂性类别中的一个挑战。挑战落在哪里显然取决于复杂性,但更具体地说,问题被认为有多困难。同样,我们只能对 P 问题的难度进行明确的分类,因为它们有明显的快速解决方案。所有其他问题都被认为更加困难,因为还没有找到快速(准确)的解决方案。

重要的是要明白,我们不能用问题的绝对难度来标记它,而只能用它的相对难度来标记。这是因为下界极难证明。

下面是复杂性类别定义:

  • P :能在多项式时间内求解(“快速求解”);
  • NP :可以在多项式时间内验证(“快查”);
  • NP-hard :如果 NP 中的任何问题都可以在多项式时间内归结为 it (但本身不包含在 NP 内);
  • NP-complete : 如果 NP 中的任何问题都可以归结为在多项式时间内并且它在 NP 中。

我们可以使用图 4 中的图表来推理一个程序所处理的挑战的相对难度。解决一个 P 问题和解决一个 NP 问题是非常不同的。

事实上,一个人试图解决的问题的类型也改变了“解决”的含义说计算机“解决”了一个问题并不能告诉我们太多,除非我们同意“解决”这个词的意思。事实证明,这取决于你问谁。

数学家和工程师

问数学家“求解”这个词是什么意思,他们会告诉你一些非常精确的东西。数学 是对未知变量的表达式赋值,使得等式为真。这种精度符合数学想要实现的目标。

但是如果你问一个工程师“解决”是什么意思,他们会告诉你完全不同的东西。这是因为工程解决方案是起作用,提供效用的东西。这是一个足够好的解决方案,可以在给定的问题空间中取得进展。

这两种类型的求解都是由计算机实现的,使用哪一种取决于问题的复杂程度。P 问题使用产生精确答案的例程来解决,而 NP 问题使用近似法,称为试探法,以达到足够好的解决方案。

图 5 计算机解决问题的两种方式。属于 P 复杂性类别的问题通过例程解决。使用试探法解决属于 NP 复杂性类别的问题。

复杂类问题是通过“算法”来解决的这意味着有一个由明确定义的步骤组成的例程。这是可能的,因为 P 问题的计算有一个已知的下限。我们可以预测解决这些问题需要多长时间。但是 NP 复杂度类包含了没有人精确解决的问题,使用一个显式的逐步例程,对于合理的输入大小。NP 问题要求我们大幅放宽对“解决”的定义

这是我们第一次看到在处理真正困难的问题时,计算是多么“软”。人们根据严格的规则来设计计算,但这只适用于相对简单的问题,并有快速的解决方案。每当有人反对人类与计算机相似时,他们几乎总是错误地假设计算机以精确、严格的方式运行。

从技术上讲,我们可以想出一个循序渐进的例程来解决一个 NP 问题,但它需要在搜索空间中尝试所有可能的组合,才能得出答案。任何合理规模问题的搜索空间都是天文数字。这一计算将需要数百年,如果不是数千年的话。在搜索空间尝试所有可能的解决方案被称为蛮力。蛮力算法花费的时间太长,在 NP 复杂性类中不实用。

这就是为什么数学优化被用来得出NP 问题的解决方案,使用试探法。优化不会产生最佳解决方案(除非运气好),只会在给定可用资源的情况下产生足够好的结果。这是我们必须采取的方法,在合理的时间内“解决”不平凡(复杂)的问题。图 6 显示了使用优化解决问题的概念。

图 6 优化是在实际时间内解决重要问题的唯一方法。

在优化中,问题由目标定义,而不是由例程定义。通过设定一些目标来探索可能性空间。更好的解决方案是根据它们与实现目标的接近程度来评估的。更好的解决方案在图 6 中描述为一个球坐在某个误差面的较低位置。球越低,我们的目标和我们计算的结果之间的差距就越小。

这种方法是今天人工智能的核心。人工智能研究人员开始使用启发式方法来解决复杂的挑战,这并非巧合。传统的、基于规则的编程(例程)不能解决重要的问题。像识别人脸或自动驾驶汽车这样的任务的搜索空间太大,例程无法实际解决。

从这一点开始,我将把这两种方法称为常规解决启发式解决以区别它们。如果计算机要解决跨越不同复杂程度的问题,它们必须同时采用这两种方法。

在计算中也有我们使用元启发式的情况。这是当我们有不完整或不完美的信息(和/或有限的计算资源)时。转向元仍然属于优化方法,我们期待“学会如何学习”

下面是一些 P 和 NP 问题的例子:

例题套路题(P) :

  • 增加
  • 整理
  • 串匹配

例题搜索问题(NP) :

  • 因子分解
  • 行程安排
  • 地图着色
  • 蛋白质折叠
  • 定理证明
  • 包装
  • 九宫格游戏
  • 旅行推销员

我们可以看到,机器可以处理跨越复杂范围的问题,处理的问题类型决定了计算机将采取的方法。机器如何处理各种复杂问题的重要性对我们使用计算类比来比较人有着重要的意义。如上所述,人们通常反对“机器思维”,因为他们认为计算机只能做出严格、僵化的决策。但这不是计算解决重要问题的方式。

人们通常反对“机器思维”,因为他们认为计算机只能做出严格、僵化的决策。但这不是计算解决重要问题的方式。

但不止于此。为了充分理解计算的力量,以及它与人类认知的相关性,我们需要看看普遍性。事实证明,当我们仔细观察 NP-HardNP-Complete 复杂性类时,这种现象的第一个迹象就变得明显了。

普遍性的暗示

对主要复杂性类别的回顾不仅仅允许我们通过解决问题所需的方法对问题进行分类。一些更基本的东西来自我们对决策问题复杂性的理解。P≦NP问题的核心是认识到较低复杂度的类与较高复杂度的问题有某种内在联系。

NP 完全问题代表 NP 中最难的问题。让它们“完整”的是如果* 其中任何一个可以在多项式时间内解决那么NP 中所有的 问题都可以在多项式时间内解决。换句话说,如果有人找到了一个 NP 完全问题的快速解决方案,那么所有的 NP 问题都可以快速解决(NP 中的每个问题都可以 化为 为 NP 完全问题)。*

问题之间的相似性告诉我们问题的相对难度。如果我们可以(有效地)将问题 A 简化为问题 B,那么 A 应该不会比 B 更难解决。这意味着一个 NP 完全问题在所有 NP 问题中是通用的

图 7 显示了所有 NP 问题折叠成 NP-Complete 的概念。这里我想强调的是这种崩溃对普遍性的意义,而不是讨论 P 对 NP 的通常含义(例如 RSA 加密)。这意味着所有非平凡的决策问题与“更简单”的问题有一些基本的共同点。

图 7NP 中的所有问题,如果有人找到了 NP 完全问题的快速解决方案,都将崩溃为 NP 完全问题类。这意味着所有的问题都有共同点。

问题之间的这种共同性是我们第一次暗示,计算有一个普遍的属性。虽然我们对日常问题的随意感知将它们划分为不同的类型和复杂程度,但它们的核心是所有问题之间不可否认的同一性。

记住,P 类问题是 NP 的子集。因此,NP 和 NP-Complete 之间的共性默认延伸到所有 P 问题。更有趣的是,NP 完全问题是 NP 类中最难的问题,这意味着 NP 中最难的问题通常与挑战性较低的问题相同。更进一步, NP-Hard 问题,至少和最难的 NP 问题一样难,所有 NP 问题都可以简化为 it

注意,不同复杂程度的问题之间的共有属性不依赖于 P=NP。可归约性已经证明了跨越所有复杂性类别的问题之间的联系。

问题难度更多地与我们对问题的感知有关,而不是问题本身的内在属性。

需要注意的两件重要事情:

  • 大多数人有兴趣解决的自然问题属于 NP;
  • 我们可以证明所有的 NP 问题都可以化简为 NP 完全问题,而不需要知道所有其他 NP 问题,只需要知道它们在 NP 中。

这两点意义重大。无论你的兴趣领域是什么,你都会面临 NP 类型的问题。但是,在这些挑战中,问题难度的感知差异有些虚幻。尽管这些问题看起来一点也不像,但从某种意义上说,它们都是同一个问题。

说到机器思维,我们知道计算能够解决不同复杂程度的问题。我们知道,解决不同问题的方法随着复杂性的变化而变化。我们也知道问题本身并没有我们想象的那么不同。

我们已经有足够多的东西开始在人类认知和计算之间进行强有力的比较,特别是在个体之间的比较智力方面。但有些人可能仍然觉得这种联系更多的是隐喻而非字面意义。回想一下我在引言中提到短语计算“类比”时引用的话如果你真的想用计算来推理人类的认知,不管你是否同意这种比较,你都必须欣赏真正普遍性的全部力量。

从符号洗牌到普遍性

计算的真正普遍性远远超过仅仅将问题简化成其他问题。真正的普适性意味着计算机拥有计算任何事物的表象能力。具体来说,这意味着通用机器可以计算或模拟任何类型的模式。**

机械是如何捕捉到我们周围的丰富和变化的呢?当我把手伸过水或品尝成熟的草莓时,我看不到任何潜在的算法搅动我所经历的流动现实的迹象。

但是在高层次上,现实确实是某种计算。输入不断地转换成我们观察到的输出;资源从一种形式转换成另一种形式时的持续搅动。来自我之前关于智力的文章:

但是为了理解我们所经历的丰富性是如何来自于像原始计算这样看似平凡的事情,我们需要放弃数学和计算是僵化和机械的观念。我们需要了解符号是如何变得比它们本身更有意义的。

一切都从哥德尔开始

当我们听到库尔特·哥德尔时,我们显然会想到他的两个不完全性定理。这是数理逻辑的两个定理,展示了每一个能够模拟基本算术的形式公理系统的固有局限性。它说所有数学的一套完整一致的公理是不可能的。

形式系统是一个配有推理规则的公理系统,它允许人们产生新的定理。公理集要求是有限的或至少是可判定的,也就是说,必须有一种算法(一种有效的方法)使人们能够机械地判定一个给定的陈述是否是公理。

哥德尔的 不完全性定理:

  1. 没有一个一致的公理系统能够证明自然数算术的所有真理,该公理系统的定理可以通过有效的程序(即算法)列出。对于任何这样的系统,总会有关于自然数的陈述是正确的,但在系统内是不可证明的。
  2. (…第一个的延伸)表明系统不能证明它自己的一致性

一些具体的定义:如果没有一个陈述,使得陈述本身和它的否定在系统中都是可导的,那么某事是一致的。一个形式系统是完备的如果对于该系统的每一个陈述,该陈述或者它的否定可以在该系统中被导出(即被证明)。

哥德尔的两个不完全性定理是现代逻辑中最重要的结果之一,具有多方面的深刻含义。也许最重要的是它所说的数学和计算的普遍性。哥德尔的工作巩固了形式系统所具有的极大灵活性,并最终巩固了计算中丰富的普遍性。为了理解这个重要的结果,我们需要更深入地探究哥德尔完成了什么。

哥德尔编号法

映射的概念是哥德尔著名论文的关键。这是数学意义上的“映射”,在这种情况下,两个事物之间存在某种联系。需要映射的原因是因为 Godel 不得不在不使用正式系统的情况下谈论正式系统。这很直观。如果我想评论一个系统的实用性或真实性,我不能用系统本身来做。

哥德尔所批评的系统是由伯特兰·罗素和阿尔弗雷德·诺斯·怀特海设计的,叫做数学原理。Bertrand 和 Alfred 试图实现希尔伯特让数学完整的梦想,使用没有意义的抽象符号(通过剥离意义,他们确保只展示数学的原始规则)。*

哥德尔的映射被称为“哥德尔编号”哥德尔编号可以为形式主义的每个符号公式证明分配一个唯一的编号(形式主义中的每个符号都有一个相应的哥德尔编号)。通过使用他的映射方案,哥德尔有效地将项目管理的形式主义算术化。

图 8 显示了哥德尔方法的简化概念。哥德尔用他的元数学来和谈论PM 的形式主义,但是以这样的方式,他的元数学与 PM 内部的符号紧密地**联系在一起。正是通过这一方案,哥德尔可以让首相“谈论自己”,从而立即创造出矛盾的可能性。****

任何时候我们进入元,我们就进入了悖论的领域,因为如果你能谈论一个系统,那么这个系统就会显得自相矛盾。康托尔在他的……和波普尔在他的……批判中使用了走向元

例如,通过在中文普通话上使用 meta,我可以说“中文普通话中没有普通话这个词。”虽然这毫无意义,但没有什么能阻止我这么说,因为我站在语言本身之外。

哥德尔能够做出元陈述,比如“公式 G 不能用 PM 的规则来证明。”这本身并不有趣,但是请记住,由于哥德尔编号,做这个元语句和 PM 做这个语句本身是一样的。这是因为哥德尔证明了元数学陈述和 PM 的形式主义之间有直接的对应关系。

图 8 哥德尔使用元数学是为了走出他所批判的形式主义。但是他的元数学与 PM 内部的符号有着密切的联系。这样,哥德尔可以让首相谈论自己。因此,如果他能证明他的元数学导致了矛盾,这意味着 PM 本身也有矛盾的能力。

哥德尔证明了所有关于形式主义内部表达式的结构性质的元数学陈述都可以 在“形式主义”本身内部被镜像。哥德尔用他的元陈述证明了 PM(以及任何形式主义)既是真实的又是形式上不可判定的,因此是不完整的。**

这个结果是巨大的。它对整个数学和认识论都有重大影响。但是哥德尔所展示的局限性与形式主义证明绝对真理的能力有关。我们在证明世界中失去的东西,我们在计算世界中获得了巨大的收益

事实证明,哥德尔的工作是形式主义通向极端灵活性的大门。要理解这一点,我们必须理解我称之为限制悖论的东西。

数学和计算的创造力

我特意为这篇文章设计了封面。虽然我们倾向于认为数学和计算是严格和机械的,但这种观点太局限了。虽然符号限制了机械操作的形式,但是这些操作并没有限制符号所代表的内容。数学和计算是流动的和高度表达的,但是为了理解这是如何可能的,我们必须理解递归和限制的悖论之间的关系。

递归和限制悖论

如果我告诉你,充分表达自己的唯一方式是给自己设限,会怎么样?这种自相矛盾的说法听起来并不疯狂。如果我限制自己只吃适当的食物和锻炼,我将自由地享受广泛的活动。如果我限制自己每天练习钢琴(而不是和朋友出去玩),我会让自己去演奏各种音乐。接受限制打开了大门。**

这个悖论比我们日常的偶然经历更为根本。数学和计算有限制打开它们,在计算中这是通过表象力量来实现的。

代表力是允许正式系统模拟/计算模式的东西。图 9 显示了不完整(受限)和完整形式主义之间的概念差异。

图 9 不完全形式主义比完全形式主义有更多的自由。不完整意味着形式主义有“活动”的“空间”。一个假设的完全形式主义在计算模式的能力上会受到严重的限制。

对你来说什么看起来更灵活?显然是有更多回旋余地的那个。不完整的形式主义获得了他们的代表力量因为他们在是完整的。如果一种形式主义的符号是完全一致和完整的,它们将无法制造普遍性所需的非理性矛盾。**

如果一种形式主义的符号是完全一致和完整的,它们将无法制造普遍性所需的非理性矛盾。

这意味着形式主义不需要为了模拟环境而象征性地表达环境。虽然人们根据哥德尔定理的限制来引用它,但是他们经常把它扩展到更大、更现实的计算世界。这是不正确的。

变得更加

只有一种方法可以让本来就有限的东西创造出比它本身更多的东西,那就是递归。一种形式主义必须能够“吃掉自己”,才能创造出超越自身符号的东西。这个事实在某种意义上是显而易见的。看下图:

图 10 受限系统通过递归可以创造出比自身更多的。**

我们的最终结果是我们从未开始过的。当然,这对于任何求和都是正确的,但是仅仅是求和,我们就会用尽符号来使用。世界的模式太丰富了,以至于无法用非引用的静态符号来捕捉。不能递归的不完整的形式主义在试图模拟丰富的模式时会很快遇到一个固有的限制。但是递归消除了这个限制。

回忆一下我们对复杂问题的讨论。复杂性意味着大量的组合是可能的。对于一个与这种复杂性相称的程序来说,它必须能够处理类似的复杂问题。通过反复折叠符号,混合和匹配无数组合来近似模式,这是可能的。正是这种循环导致了任何形式主义丰富到足以吞噬自身的巨大代表力量。

这就是为什么数学和计算是创造性的。它们不是僵硬和机械的,而是极其流畅和富于表现力的。

“所以数学是创造性的,不是机械性的,数学是生物性的,不是机器!”——格雷戈里·柴丁

回想一下哥德尔关于使用元数学来获得一种谈论自身的形式主义的工作。这就是图 10** 中的递归。一个拥有丰富符号库的形式系统在严格证明时会不完整,但在计算时会非常灵活。**

一个拥有丰富符号库的形式系统在严格证明时会不完整,但在计算时会非常灵活。

哥德尔-图灵阈值

我们已经看到了符号洗牌和递归是如何让一种形式主义呈现出巨大的创造力的。有了足够丰富的自我参照符号,我们就接近了真正普遍性的门槛。道格拉斯·霍夫施塔特将这一点称为哥德尔-图灵阈值。正是在这一点上,基本算术从一些无生命的符号系统发展到图灵所说的“通用机器”

图灵意识到存在一个计算普适性发挥作用的临界阈值。在这一点上,机器变得足够灵活,能够描述自己的结构。图灵的工作很大程度上是基于哥德尔的,他们之间的联系现在应该是显而易见的。

“没有比万能机器更灵活的了。普遍性就是你能走多远就走多远。” —道格拉斯·霍夫施塔特

因此,从哥德尔我们知道了整数运算的丰富性,从图灵的抽象计算理论——该理论随后被像约翰·冯·诺依曼这样的人与工程现实相碰撞——我们认识到机器事实上能够成为通用的**

图 11 与计算普适性相关的最重要发现背后的 3 个主要名字。

“哥德尔发现不完全性,图灵发现不可计算性。但在这个过程中,图灵也发现了完整/通用的编程语言、硬件、软件和通用机器。”——格雷戈里·柴丁

无处不在的普遍性

许多人不知道我们每天都在身边看到普遍性。我们现在处理个人和职业生活的方式很大程度上发生在电脑上。这些机器将输入转换成输出,在这样做的过程中,显示、重定向、连接和捕捉大量的丰富内容。

我们很难区分通过机器体验到的东西和被认为是现实的东西。我们认为母亲在电话中的声音是他们真实的声音,或者他们在视频聊天中的面孔是他们真实的面孔。我们观看的电视节目是真实人物的重建模式,CGI 创造了我们熟悉的事物的高度逼真的印象,科学家模拟了各种真实世界的场景。

这一切的背后是基本的算术符号洗牌。机器处理数字,使用递归来模拟我们日常经验中几乎无法分辨的模式。我们的现实很大程度上是通过硬件上整数的加法和乘法的感知而发生的。

“…在所有彩色图片、诱人的游戏和闪电般的网络搜索之下,除了整数运算,什么也没有发生。”道格拉斯·霍夫施塔特

********

https://www.youtube.com/watch?v=4Z4KwuUfh0A

塞尔怎么样?

有一个著名的中文教室论点最初是由约翰·塞尔提出的,他说一台执行程序的数字计算机不能被证明有“头脑”、“理解”或“意识”,不管这个程序能让计算机表现得多么智能或像人**

塞尔思想实验的细节我就不赘述了,读者在网上很容易读到。但他的基本前提是,如果数字计算机只能操纵符号,那么它们所能做的就是说服它理解的人。塞尔认为,无论一台机器有多么令人信服,它都不会真正理解。

当然,这仅仅是一个开始的论点。塞尔说得好像我们都知道什么是“理解”。但是塞尔论点的真正致命之处在于他对复杂性的完全误解。一个、【心灵】、【理解】或【意识】不会从赤裸裸的符号操作中产生,而是通过一些丰富的表达成为可能,自我参照提供了这样的符号。换句话说,我们在复杂现象中观察到的来自于一个巨大的互动网络。****

作为紧急事件的程序

我以…计算中的符号洗牌是通过程序来结束这一节。就像符号不需要显式地捕捉所有模式一样,程序也不需要编码程序能做的所有事情。一个程序的规则和它的行为几乎没有直接关系。**

我们可以把简单的程序看作是涌现的最小例子。程序不仅仅是各个部分的总和。

论计算类比的有效性

现在,我将把话题拉回到特里尚克的最新观点上,即使用计算类比来比较人的“聪明度”。我已经讨论了许多我认为对于理解计算类比的有效性所必需的背景知识。

我们对计算的了解:

  • 信息从输入转换为输出;
  • 例程用于解决明确定义的问题;
  • 启发式用于解决复杂问题;
  • 所有的决策问题在某种意义上都是同一个问题;
  • 基本符号具有巨大的代表力;
  • 计算机能够被整形,有创造力
  • 程序可以变得比它们各部分的总和还要多。

这都是计算

将人类认知视为计算之外的东西,总是会吸引一些近乎“神秘”的东西。虽然人们可以在个人层面上证明他们对超自然的信仰,但没有理由认为认知不是某种计算。人类一直在将输入转化为输出。有信息被过滤、使用和表达。当我们理解了计算的表现能力后,这种认为人类不是“计算机”的需要就失去了很多理由。

人们使用套路

人们使用常规型思维进行肤浅的、可预测的推理。每当我们关注具体的细节时,在可能存在“精确”解决方案的地方,我们都在使用常规。如果你发现自己在使用一个食谱,或者相信有一种“方法”来做某事,这就是常规思维。

人们使用启发式

任何非平凡(复杂)的问题都涉及到启发式的使用。当提到人时,这些被称为心理捷径。我们每天处理的绝大多数有趣的问题都太复杂了,无法用食谱来解决(问题的搜索空间对于一个简单程序的应用来说太大了)。当人们利用“直觉”或一般的经验法则时,他们会缩小搜索空间中寻找解决方案的范围。当领域专家把困难的事情变得简单时,他们应用了许多启发法,这些启发法是多年来通过暴露于问题空间而学到的。

思维类型

在回顾主要复杂性类别的决策问题时,我们同时考察了常规方法和启发式方法。所应用的机器“思考”的类型取决于所解决问题的复杂性。如上所述,人们也使用这两种类型的思维。

从计算的角度来看显而易见的东西经常被其他人重新标记。例如,丹尼尔·卡内曼的思考快与慢反映了他关于两种思维模式二分法的论文。系统 1 是本能/情感型,而系统 2 是较慢/深思熟虑/逻辑型的思维。这些只是我们在计算机中看到的例程试探法之间的区别。**

作为通用机器的人类

人脑表现出表象的普遍性。通过创造抽象概念,我们可以将各种各样的外部现象内在化,只保留复制我们头脑中的模式所必需的信息。机器也是如此。只要我们放弃计算机只能处理一组固定指令的观念,计算类比就成立。

“……人类的思维尽管灵活而易错,但原则上可以用‘一套固定的指令’来模拟,前提是人们要摆脱先入为主的观念,即建立在算术运算基础上的计算机除了盲目地产生真理、全部真理,除了真理什么也不能做。”道格拉斯·霍夫施塔特

这是关于目标的

我们看到了启发式是如何在计算中用来解决复杂问题的。程序使用目标来帮助评估他们在可能性空间的搜索情况。目标在计算中的使用与人们在现实世界中应用启发式方法的方式重叠。虽然我们缺乏解决重要问题的具体方法,但我们脑海中经常会有一个目标,并反复应用思维捷径,直到我们足够接近我们的目标。**

这也与史蒂夫·沃尔夫勒姆的计算等价原则重叠。该原理认为,在自然界中发现的系统可以执行最大(“通用”)计算能力水平的计算(几乎所有不明显简单的过程都可以被视为相当复杂的⁹).计算)

这表明,当谈到所谓的智力时,任何事物(不仅仅是人类)之间的唯一区别是所涉及的目标。人类有不同于其他动物的目标,显然也有不同于非生命系统的目标。

我喜欢引用格言“天气有它自己的想法”。“这听起来太泛灵论和前科学了。但计算等效性原理说的是,实际上,根据最现代的科学,这是真的:天气的流体动力学在计算复杂性上与我们大脑中进行的电过程是一样的。”—史蒂夫·沃尔夫勒姆

智力之间的界限可能更多地与所涉及的目标有关。在一个给定的系统中,无论实现什么样的输入到输出计算,都与系统的复杂程度无关,而是与系统的“目标”有关。

速度即熟悉度

这就把我们带到了我的 前提。有了我所列举的背景,就有可能回到开头提出的问题上来。

通过在人类认知和计算之间进行类比,可以挽救某些人比其他人更聪明的观点吗?

我认为认知速度(以及解决方案的质量)并不是某种在机械/推理意义上更快处理的能力,而是归结于对先前模式的暴露。归结起来就是熟悉度。我之前在一条推特上提到过这个:

熟悉包含了速度和正确性的概念。之前接触到问题的潜在模式意味着某些人会更快地找到解决方案。重要的是,普遍性意味着所有人都有能力创造相同的类比。这些类比依赖于个人过去的经历;他们自己丰富的历史导致他们收集现有的内部模式。

当类比与启发相结合时,所有人都有同等的执行能力,真正复杂问题的巨大搜索空间被缩小并分解成一个可行的解决方案。一个自然的结论是,通过“聪明”来区分人们的是他们过去的经历与缩小一组给定问题的搜索空间的相关程度。不是用套路更好。它没有更好地使用启发式。这些在个体之间是计算通用的。它将类比引入到解决问题的常规和启发式的普遍使用中。

通过“聪明”来区分人们的是他们过去的经历与缩小一组给定问题的搜索空间的相关程度。

认知的结构

在引言中,我用引号将与计算相关的“类比”一词括起来。我们经常使用类比这个词,好像它是我们想要描述的现象的二流版本。但是类比不仅仅是一种教学手段。类比是人们如何在看似不同的领域之间建立联系的核心。

当人们在解决问题时,他们是在调用他们已经知道的东西。鉴于我们都有丰富的历史,任何问题对来说都是熟悉的。**

图 12 人类通过类比将不同领域的想法联系起来。当解决问题时,我们调用我们过去的经验来处理类似的事情。

每个想法在某种程度上都是一种类比。我们不断地识别模式,即使这些模式不是我们之前看到的模式的精确复制品。它们总是模式之间某种程度的同构。一个同构是一个形式化的/严格的类比。计算中的普遍性意味着由数字组成的模式可以与其他任何东西同构。

“我们应该非常尊重那些看起来最平凡的类比,因为当它们被检验时,它们通常可以被看作是从人类认知的最深层根源中产生并揭示出来的。”道格拉斯·霍夫施塔特

道格拉斯·霍夫施塔特将类比称为“认知结构

“无论哪里有一个模式,它都可以被视为代表它自己,或者代表它所同构的任何东西。重要的是,不管最初模式的初衷是什么,没有一种解释比另一种更真实。如果这是对正在发生的事情的正确描述,那么他们都没有特权。”道格拉斯·霍夫施塔特

理解的关键是我们无法知道某人的同构/类比将来自于。换句话说,没有办法说什么样的生活经历/接触会导致有效解决问题所需的类比的存在。人们会指出“最聪明”的人,但他们只是在评论这样一个事实,即那个人的解决方案更快/更好。很少或根本没有透明度,以个人的一套经验,碰巧重叠的问题正在解决。请注意,学校教育是一个测试一个人聪明程度的非常有限的领域****

图 13 对一个人来说“更聪明”意味着什么?我认为这可以归结为将过去接触到的模式和新的模式联系起来。

正如我们对导致群体“成功”的历史视而不见(想想幸存者偏差),我们也对个人的模式历史视而不见。虽然琐碎的问题(可以用例程解决)受益于已知的模式(解决一个数学问题将有所帮助,如果你以前见过类似的问题),但不平凡/复杂的问题可以以未知的方式受益于以前的模式。复杂性的不透明性是根本。

天才神话

这让我们想到了“天才”这个概念这个术语假设个人对他们的发现负主要责任。但是每一个发现都依赖于大量以前的发现和概念。我们对需要多少先前的发现/概念,以及它们之间的关系一无所知。

即使在较小的规模上,我们也能在任何组织中看到这种情况。

虽然我们喜欢谈论人类的进步,好像我们受益于一些个人的重大发现,但这是一种错误的叙述。这些人仅仅是我们发现的名字。历史上有一个巨大的贡献和先前发现的网络。随机的发现,在更多的发现之上,无穷无尽。这个网络很复杂,因此不透明。没有办法以某种线性方式拼凑出发现是如何产生的真实故事。

没有我们喜欢认为的“天才”。在一长串相互关联的想法中,只有名字附在最后。

摘要

我要感谢 Trishank 和 Ashlesh 邀请我从智能的计算角度发表意见。我希望我的文章能给读者提供正确使用计算类比所必需的背景知识,不管读者的观点如何。

参考

  1. 智商在很大程度上是一个伪科学骗局
  2. 智力、复杂性和失败的智商“科学”
  3. 为什么普遍性胜过智商
  4. 为什么没有人比其他人聪明几倍
  5. 关于“为什么没有人能比别人聪明几倍”
  6. 高级物理模拟
  7. 指数时间假设
  8. 当前关于 P vs NP 的共识
  9. 一种新的科学
  10. 哥德尔的证明(道格拉斯·霍夫施塔特)
  11. 证明达尔文:让生物学数学化
  12. 超越计算:P 对 NP 问题——迈克尔·西普瑟

脚注()*

  1. 哥德尔实际上表明,意义并没有完全从 PM 形式主义中去除。
  2. 卡尼曼在心理学家中很常见,他从病理学的角度描述了偏见。干扰了更集中的思考。这是对人们如何思考的一种有限的看法,没有考虑到适应如何导致有益的能力。系统 1 是进化的副产品,让我们有能力解决真正复杂的问题,而系统 2 只能应对简单的挑战。
  3. 一次尝试很多事情怎么样?本文重点解决问题依次。无论机器使用常规还是启发式解决方法,它都是依次采取行动的。事实上,这就是为什么我们必须对非平凡模式使用近似方法。我们将不得不等待太长时间,让程序尝试足够多的组合来找到答案。但是有一种叫做非确定性图灵机 (NTM)的计算模型,它观察如果可以同时采取行动会发生什么。这是 Trishank 的第二篇文章的题目,对一些人提出的论点提出质疑;或许有些人可以把自己的思维当做非确定性的图灵机。正如我在引言中提到的,我对人类获得某种非确定性的问题不太感兴趣。还有许多其他的计算模型,我认为没有理由相信人类正在使用它们。但更重要的是,这并不需要。为了理解为什么我们需要看普遍性。****

人类学习 vs 机器学习

原文:https://towardsdatascience.com/human-learning-vs-machine-learning-dfa8fe421560?source=collection_archive---------37-----------------------

开始学习基础知识。

照片由安迪·凯利在 Unsplash 上拍摄

变化是所有真正学习的结果~利奥·巴斯卡利亚

什么是?当我们说我们学到了一些东西,这意味着什么?什么是信息或知识或智慧?

当你观察一种现象并识别一种模式时,学习就发生了。你试着通过找出现象中涉及的实体之间是否有任何关系来理解这种模式。

让我们试着分解它。以我们每天观察到的一个简单现象为例——昼夜交替。

内森·安德森和艾玛·范·桑特在 Unsplash 上拍摄的照片

有规律吗?是的,有一种模式。在一段固定的时间里,我们暴露在太阳的光和热下,我们称之为白天。然后在另一段固定的时间里,我们被剥夺了来自太阳的光和热。我们称之为夜晚。这种模式一遍又一遍地重复。我们有一个关于现象的观察,我们有一个模式。我们能解释这种模式是如何发生的吗?这次观测涉及到两个实体——太阳和地球。来自太阳的光量(和热量)和地球表面接收到的光量(和热量)之间有关系吗?这种模式表明地球表面交替接收光线——白天接收,晚上不接收。这怎么可能呢?有很多可能性,比如:

  1. 不知何故,太阳以交替的时间周期打开和关闭。
  2. 太阳不断改变它的位置,围绕地球旋转,在不同的时间段照亮地球的不同表面
  3. 地球不断地绕着它的轴旋转,因此在给定的时间,生活在面向太阳的表面上的人经历白天,而生活在不面向太阳的表面上的人经历夜晚。

以上 3 个结论被称为""模型,即 解释 观察到的现象。我们可以将这些模型表述如下:

模型 1:日/夜是太阳神奇开关的 功能

模型 2:日/夜是太阳绕地球公转的一个 函数

模型 3:日/夜是地球绕轴自转的 函数

现在的问题是,哪个模型(或函数)更准确?根据历代不同哲学家/科学家的观察/发现,模型 3 是解释昼夜现象最准确的模型。我们可以说,这个模型"最适合对这种现象的观察。其他两个模型可以根据许多其他观察结果安全地反驳,这些观察结果不能用它们来解释。

一旦一个模型建立起来,它就可以用来预测那种现象的未来结果。例如,在我们的例子中,我们的模型可以安全地预测白天/黑夜将继续发生,直到出于某种原因,地球停止旋转或太阳耗尽其能量(地球会停止旋转吗?太阳什么时候会耗尽它所有的能量?—这些问题可以通过使用另一个模型来回答)

人类就是这样学习的。

所有人类学习都是——观察某样东西,识别一种模式,建立一种理论(模型)来解释这种模式,并测试这种理论,以检查它是否符合大多数或所有观察结果。

每一个学习,从根本上来说,都是一个在一组观察中表达模式的模型。如果没有可以想象的模式,就不会有学习。

想想任何数学公式或物理方程式或生物学理论或任何经济学定理或化学方程式。所有这些都解释了物理或自然世界的模式。以牛顿运动定律为例。

牛顿研究物理物体的运动,并用作用在物体上的力来解释这种运动。他发现了作用在物体上的力和作为对这些力的反应的运动之间的“模式”或“关系”,并以他的定律(“模型”)的形式表达出来。牛顿第二运动定律在数学上表达如下:

力=质量加速度*

这个模型准确吗?它符合所有的观察吗?这种模式几乎在所有情况下都有效,但也有一些例外。它开始预测高速运动物体的不准确结果。爱因斯坦提出了另一个模型来解释这种物体的运动。

https://proofwiki.org/wiki/Einstein%27s_Law_of_Motion

这场讨论的中心思想是—

没有模型或学问反映“真实”或“绝对”的现实每一个模型或学习都是对观察到的现实的近似。

如果我们遇到关于我们正在研究的现象的新观察,我们必须更新我们的模型或学习。

机器是如何学习的?

阿瑟尼·托古列夫在 Unsplash 上的照片

机器有可能模仿人类学习的过程吗?这是机器学习和人工智能领域正在尝试做的事情。基本思想保持不变。与人类一样,机器也接受观察(数据)。学习算法在幕后试图在数据中找出最符合观察结果的模式。我们举一个很简单的例子。

下面是一个虚假的房价数据集,由两个属性组成:房屋面积和价格。

价格和面积之间有没有模式或者关系?只要目测这些数据并在头脑中进行简单的计算,人们就可以推断出:

价格= 20 倍面积

它不是 10 倍或 12 倍或 15 倍…正好是 20 倍,数据集中的所有房价都符合这个模型。

计算机算法能找出这个关系吗(价格是 20 倍面积)?。可以做到。一种算法可以以如下的粗略方式实现它:

  1. 假设价格是 w 乘以面积。从随机取 w 的任意值开始
  2. 对于面积和 w 的每个值,计算价格。将其与数据中给出的原始价格进行比较。原始价格-计算价格是错误的。取所有计算价格和原始价格的误差平均值。这是由模型引起的平均误差
  3. 改变 w 的值,继续重复步骤 2,直到平均误差为 0 或非常接近 0,并且没有改善

这就是机器学习数据模式的方式。现在,这里介绍的方法过于简单。幕后有大量的复杂性(参考线性回归算法和梯度下降方法)

但我试图传达的基本思想是:无论是人类学习还是机器学习,都涉及对一个事物或过程或现象的“观察”。然后,识别这些观察的模式。这个模式的表达就是已经学习过的模型。最常见的是,这个表达式是一个数学公式(函数),它定义了相关变量之间的关系。

乔治·帕甘三世在 Unsplash 上的照片

人类是本能的模式发现者。寻找模式的基本需求是我们这个物种的基本生存策略。我们总是害怕未知的事物。不确定性很麻烦。模式识别帮助我们减轻这种恐惧,给人安慰。当我们知道一个事件是如何发生的,以及它再次发生的可能性有多大时,我们就可以做好准备。如果我们认识到事件 1 是由“事件 2”引起的,我们可以利用这一知识为我们造福。这就是我们总是在事物、事件和情况之间寻找模式和因果关系的原因。

没有模式,就不会有学习——无论是人类还是机器!只是一片混乱。

基于堆叠沙漏网络和张量流的人体姿态估计

原文:https://towardsdatascience.com/human-pose-estimation-with-stacked-hourglass-network-and-tensorflow-c4e9f84fd3ce?source=collection_archive---------6-----------------------

了解经典的姿态估计网络的核心设计,并学习用 TF 2 编码

来自 Deskcity 的蓝色沙漏照片

原载于 2020 年 3 月 14 日https://www . yanjia . Li

完整源代码请前往https://github . com/ethanyangali/deep-vision/tree/master/Hourglass/tensor flow。我真的很感谢你⭐STAR⭐对我努力的支持。

人类擅长做出不同的姿势。人类也擅长理解这些姿势。这使得肢体语言成为我们日常交流、工作和娱乐的重要组成部分。不幸的是,姿势有太多的变化,所以计算机从图片中识别姿势不是一件容易的事情…直到我们有了深度学习!

通过深度神经网络,计算机可以学习人类姿势的通用模式,并相应地预测关节位置。堆叠沙漏网络就是这样一种网络,我将向您展示如何使用它来进行简单的人体姿态估计。虽然在 2016 年首次推出,但它仍然是姿态估计领域最重要的网络之一,并广泛应用于许多应用程序。无论你是想开发一个软件来跟踪篮球运动员的动作,还是想根据一个人的姿势制作一个肢体语言分类器,这都将是一个方便的实用教程。

网络体系结构

概观

简单来说,堆叠沙漏网络(HG)就是沙漏模块的堆叠。它之所以有这个名字,是因为每个沙漏模块的形状都非常像沙漏,正如我们从下图中看到的:

图来自“用于人体姿态估计的堆叠沙漏网络

堆叠多个 HG(沙漏)模块而不是形成一个巨大的编码器和解码器网络背后的想法是,每个 HG 模块将为联合预测产生完整的热图。因此,后一个 HG 模块可以从前一个 HG 模块的联合预测中学习。

为什么热图有助于人类姿势估计?这是当今相当普遍的技术。与面部关键点不同,人类姿态数据有许多差异,如果我们只是简单地回归关节坐标,这使得很难收敛。聪明的研究人员想出了一个主意,用热图来表示图像中的关节位置。这保存了位置信息,然后我们只需要找到热图的峰值,并将其用作关节位置(加上一些小的调整,因为热图很粗糙)。对于 256x256 的输入图像,我们的热图将是 64x64。

图片来自“用于人体姿态估计的堆叠沙漏网络

此外,我们还将计算每个中间预测的损失,这有助于我们不仅有效地监督最终输出,而且有效地监督所有 HG 模块。这在当时是一个很棒的设计,因为姿势估计依赖于人体各个区域之间的关系。例如,在没有看到身体位置的情况下,很难判断一只手臂是左臂还是右臂。通过使用完全预测作为下一个模块的输入,我们迫使网络在预测新的连接位置时注意其他的连接。

沙漏模块

那么这个 HG(沙漏)模块本身是什么样子的呢?让我们来看看原始论文中的另一张图:

图来自“用于人体姿态估计的堆叠沙漏网络

在图中,每个框都是一个剩余块加上一些额外的操作,如池化。如果您不熟悉剩余块和瓶颈结构,我建议您先阅读一些 ResNet 文章。一般来说,HG 模块是一个编码器和解码器架构,其中我们首先对特征进行下采样,然后对特征进行上采样以恢复信息并形成热图。每个编码器层都有一个与其对应的解码器层的连接,我们可以堆叠任意多的层。在实现中,我们通常做一些递归,让这个 HG 模块重复自己。

我知道这里看起来仍然太“复杂”,所以阅读代码可能更容易。下面是从我在 Github deep-vision repo 上的堆叠沙漏实现中复制的一段代码:

这个模块看起来像一个洋葱,让我们先从最外层开始。up1 经过两个瓶颈块,和 up2 加在一起。这代表左边和顶部的两个大方框,以及最右边的加号。整个流程都在空中,所以我们称之为上行通道。在第 17 行,也有一个低通道。这个 low1 通过一些池和瓶颈块,然后进入另一个更小的沙漏模块!在图上,它是大洋葱的第二层。这也是我们在这里使用递归的原因。我们一直重复这个 HG 模块,直到第 4 层,这里你只有一个瓶颈,而不是 HG 模块。最后一层在图表中间的三个小盒子里。

如果你熟悉一些图像分类网络,很明显作者非常大量地借用了跳过连接的思想。这种重复模式将编码器和解码器中的相应层连接在一起,而不是只有一个特征流。这不仅有助于梯度通过,而且让网络在解码时考虑不同尺度的特征。

中间监督

现在我们有了一个沙漏模块,我们知道整个网络由多个这样的模块组成,但是我们如何精确地将它们堆叠在一起呢?网络的最后一环来了:中间监管。

图来自“用于人体姿态估计的堆叠沙漏网络

从上图中可以看出,当我们从 HG 模块中产生一些东西时,我们将输出分成两条路径。顶部的路径包括更多的卷积来进一步处理特性,然后转到下一个 HG 模块。有趣的事情发生在底部路径。这里,我们使用卷积层的输出作为中间热图结果(蓝框),然后计算中间热图和地面实况热图之间的损耗。换句话说,如果我们有 4 个 HG 模块,我们总共需要计算 4 个损失:3 个用于中间结果,1 个用于最终结果。

准备数据

MPII 数据集

一旦我们完成了堆叠沙漏网络的代码,我们就该考虑用什么样的数据来训练这个网络了。如果你有自己的数据集,那太好了。但在这里,我想提一个开放的数据集,供那些想先有所训练的初学者使用。它叫做 MPII 数据集(马普信息研究所)。你可以在这里找到下载链接。

尽管该数据集主要用于单人姿势估计,但它确实为同一图像中的多人提供了关节注释。对于每个人,它给出了 16 个关节的坐标,如左脚踝或右肩。

来自 MPII 数据集的例子。两幅图像都已被裁剪。

但是原来的数据集标注是 Matlab 格式的,现在真的很难用。我也试着自己解析那个 mat 文件,结果发现有很多错误或警告是 MPII 官方网站没有提到的。另一种方法是使用微软提供的预处理过的 JSON 格式注释。谷歌驱动链接在这里是。下载这个 JSON 注释后,您会看到一个包含如下元素的列表:

“关节可见”表示关节的可见性。在最近的数据集中,我们通常需要区分遮挡关节和可见关节。但是在 MPII,我们只关心关节是否在图像的视图中:1 ->在视图中,0->在视图外。“关节”是关节坐标列表,它们遵循 0-r 脚踝、1-r 膝盖、2-r 臀部、3-l 臀部、4-l 膝盖、5-l 脚踝、6-骨盆、7-胸部、8-上颈部、9-头顶、10-r 手腕、11-r 肘部、12-r 肩部、13-l 肩部、14-l 肘部、15-l 手腕的顺序。

这个 JSON 注释的缺点是它没有原始文件中的头部矩形和单人标志,这可能会在评估过程中造成问题。如果你需要我用这些信息解析的版本,请在我的 deep-vision Github 库中给我留言。

种植

不太清晰的部分是“尺度”和“中心”。有时我们可能在图像中有不止一个人,所以我们需要裁剪出我们感兴趣的一个。与 MSCOCO 数据集不同,MPII 没有给我们这个人的边界框。相反,它给了我们一个中心坐标和这个人的大概尺寸。这两个值都不准确,但仍然代表了一个人在图像中的大致位置。请注意,您需要将“比例”乘以 200 像素,以获得一个人的真实高度。但是宽度呢?不幸的是,数据集并没有真正指定它。身体可能有点水平,这使得宽度远大于高度。我之前看到的一个例子是冰壶运动员在地上爬行,如果你只使用高度来修剪,你可能最终会离开他的手臂。

天真的方式:经过一些实验,下面是我对裁剪图像的建议:

简而言之,我们首先过滤掉不可见的关节,并从 16 个关节中计算最左侧、最顶部、最底部和最右侧关节的坐标。这四个坐标给了我们一个区域,在这里我们至少可以包含所有可用的关节注释。然后我根据这个人的身高比例填充了这个区域,这个比例也是从“比例”字段计算出来的。最后,我们需要确保这种作物不会流出边境。

更健壮的方式:如果你需要提高你的模型的 PCKh 度量,上面的转换可能不是最理想的。为什么?因为单人姿势估计的不为人知的技巧是它极度依赖于中心来确定关节的相对位置。因此,你需要以某种方式将输入图像中的所有身体“标准化”到相同的中心和相同的比例,以充分利用模型。我的解决方案是使用仿射变换。通过这样做,你可以精确地知道中心在哪里来定义平移、旋转和缩放。由于这是一个更高级的主题,请访问我的 deep-vision Github 知识库,在那里进行更多的讨论。

高斯的

关于地面实况数据,需要了解的另一件重要事情是高斯分布。当我们策划地面实况热图时,我们不只是为关节坐标分配 1,而为所有其他像素分配 0。这将使基本事实变得过于稀少而难以了解。如果模型预测只差几个像素,我们应该鼓励这种行为。

我们如何在损失函数中模拟这种鼓励?如果你以前上过概率课,你可能记得高斯分布:

https://www . project Rhea . org/Rhea/index . PHP/Edge _ Detection _ with _ Gaussian _ Blur

中心具有最高值,中心周围区域的值逐渐减小。这正是我们所需要的。我们将在全零地面真实画布上绘制这样一个高斯模式,如下图所示。当你把所有 16 个关节放在一个热图中,它看起来就像下面的右图。

自己画的叠加图。右图来自 MPII 数据集。

从下面的代码可以看出,我们首先计算面片的大小,当 sigma 为 1 时,大小将为 7,中心将为(3,3)。然后,我们生成一个网格来表示该面片中每个单元的坐标。最后,将它们代入高斯公式。

请注意,生成高斯的最终代码比这更复杂,因为它需要处理一些边界情况。完整代码请看我这里的 repo:https://github . com/Ethan yanjiali/deep-vision/blob/master/Hourglass/tensor flow/preprocess . py # L91

损失函数

到目前为止,我们讨论了网络架构以及要使用的数据。有了这些,我们可以向前传递一些训练数据,以获得关于输出的感觉。但是现代深度学习是关于反向传播和梯度下降的,这需要我们计算地面真实和预测之间的损失。所以让我们开始吧。

幸运的是,堆叠沙漏的损失函数非常简单。你只需要两个向量之间的均方误差,这可以在一行代码中完成(普通版本)。然而,在现实中,我发现这个模型仍然很难收敛,它学会了通过预测全零来达到局部最优来作弊。我的解决方案(改进版)是给前景像素(我们画的高斯像素)分配一个更大的权重,让网络很难忽略这些非零值。我在这里选择 82,因为在 64x64 热图中,一个 7x7 的补丁的背景像素是前景像素的 82 倍。

预言

到目前为止,我们已经讨论了网络、数据和优化目标(损失)。这应该足够你开始自己的训练了。一旦我们完成了培训,得到了一个模型,它仍然没有完成。与直接回归相比,使用热图的一个缺点是粒度。例如,对于 256x256 的输入,我们得到 64x64 的热图来表示关键点的位置。四倍降尺度看起来还不算太差。然而,我们通常首先将一个更大的图像,比如 720x480,调整为 256x256 的输入。在这种情况下,64x64 的热图会过于粗糙。当需要高精度时,研究人员想出了一种缓解这一问题的方法。我们不仅使用具有最大值的像素,还考虑具有最大值的相邻像素。由于相邻像素也具有高值,因此推断实际的关键点位置可能有点朝向相邻像素的方向。听起来很熟悉,对吧?这很像我们的梯度下降,也指向最优解。然而,根据我的经验,对于大多数应用程序来说,占据热图峰值的位置应该足够了。因此,如果您需要实现这个额外的修正,这是您的电话。

我自己画的要点和框架。图像中的人是来自高尔夫月刊的李·维斯特伍德

以上是我们网络的预测实例。在左侧,是所有的关节位置。在右边,是骨骼,通过连接这些关节画出来的。虽然结果看起来相当不错,但我不得不承认这是一个简单的例子。在现实中,有很多扭曲的姿势或遮挡的关节,这给我们的网络带来了巨大的挑战。例如,当图像中只有一只脚时,网络可能会通过将左脚和右脚分配到同一位置来混淆自己。我们如何解决这个问题?因为这是一个关于改进的话题,所以我将让您先思考一下,然后再写一篇文章来讨论。

结论

祝贺你,你已经到达本教程的结尾。如果你理解了我们上面讨论的所有内容,你应该对现在的理论和主要挑战有一个坚实的理解。要开始在 TensorFlow 中编码,我建议你克隆/分叉我的 repo:https://github . com/ethanyangali/deep-vision/tree/master/Hourglass/tensor flow,按照说明准备数据集,试一试。要做出预测,你可以参考回购协议中一个名为demo_hourglass_network的笔记本。如果您遇到任何问题,请留下 Github 问题,以便我可以查看。同样,如果你喜欢我的文章或我的回购,请⭐star⭐我的回购,这将是对我最大的支持。

参考

  • Alejandro Newell,杨,邓佳,用于人体姿态估计的堆叠沙漏网络,欧洲计算机视觉会议(ECCV),2016
  • Sudharshan Chandra Babu,2019 年深度学习人类姿态估计指南,纳米网

人力资源数据化(上)

原文:https://towardsdatascience.com/human-resources-datafication-d44c8f7cb365?source=collection_archive---------34-----------------------

数据化意味着使用运营数据来制定业务战略和未来计划。— Viser 公司。

米歇尔维纳布尔斯 ,数据科学家兼机器学习工程师

图片来源:Word Cloud by Insyscraft

最符合商业活动和人力资本的战略是什么?人力资源(HR)战略是为所有 HR 关键领域设定方向的理念。它是我们使用分析来了解更多有关人员、HR 流程和人口统计数据的能力的提高。这包括招聘、绩效评估、发展和薪酬方面的活动

通过数据分析实现人力资源战略的第一步

作为人力资源领域的数据分析师/科学家,我们将制定一项战略来实现整个组织的人力资源目标和洞察力。我们希望从组织内现有的数据开始,从当前的员工开始。这可能涉及整个组织的优势和工作描述。一个好的解决方案是使用交互式组织结构图。

从收集每个人的最新简历、继续教育历史、绩效评估和完成的项目开始。这使您能够识别当前员工的知识、技能和优势。除了基本的工作描述和技能之外,交互式组织结构图也是一种工具。

评估绩效考核使管理层能够确定员工何时愿意并能够承担额外的责任。当员工的排名一直很高时,是时候接受一些更具挑战性的工作了。这个博客旨在描述一些分析公司内部人力资源战略和活动的技巧。

关键绩效指标(KPI)

在人力资源分析领域,有几个 KPI 值得一提。对以下 8 个指标进行了定量评估。

  1. 人才保留——组织保留员工的能力。这通常是一种统计方法,有时被认为是员工对公司的忠诚度。
  2. 招聘效率——组织有几种方法来衡量他们的招聘效率。常见的统计度量可以是 招聘时间、招聘质量、招聘来源等。
  3. 员工绩效——工作评定量表是评估员工绩效的常用方法,行为要素如理解工作任务参与决策
  4. 员工流动——员工从一个组织转移到另一个组织,也称为流动率。类似于评估留存率。
  5. 全面薪酬——这是经理或雇主为了吸引、激励和留住员工而追踪的一种工具。
  6. 学习和发展——培训计划让员工在组织中成长和成功。它允许员工在组织内达到更高的知识技能水平。这些可以通过绩效评估或评级来评估和监控(如前所述)。
  7. 多元化和包容性——衡量和提高想法和创造力。吸引和获得人才,以形成强大的团队。
  8. 人力资源与员工比率—服务交付

我们希望收集和评估这些数据,以确定我们作为一个组织在人力资源方面所处的位置。员工的文化和行为构成了一个组织的团队氛围,而人力资源的工作是建立一个成功的战略。我收集了 Kaggle.com 提供的人力资源数据,以显示对一个组织的评估。点击此处链接

清理和评估我们的数据

数据科学项目的第一步是确保我们清理和评估我们的数据。清理包括处理空值、评估哪些数据当前对我们可用,以及使用不同的清理技术来组织我们的数据结构。庞大、肮脏、混乱和不兼容的数据源会导致无效的分析模型。我们希望了解我们的数据,以下是几个方法:

hr_data.shape

我们的输出是 300 行 21 列。

hr_data.isna().sum()

检查 NA 结果并学习如何处理它们。一种方法可能是用 0:

hr_data = hr_data.fillna(0)

经过一些基本的清洁技术,我们可以开始分析和评估。我个人喜欢使用 SeabornMatplotlib 来可视化我的数据。在查看了我们的数据栏后,我认为评估 pay_rate 可能是有益的。我们甚至可能希望根据绩效分数、职位和其他特征来预测新员工的 pay_rate!在尝试解决新员工的问题之前,让我们先看看现有的数据。

chart = sns.barplot(x='performance_score', y= 'pay_rate', data=hr_data, palette='Set1', ci=**None**) chart.set_xticklabels(chart.get_xticklabels(),rotation=90)

作者图片:米歇尔维纳布尔斯

在运行您的代码行之前,确保将 seaborn 作为 sns 导入。我们可以通过什么来分析员工的工资率?

我可能会问一些关于“需要改进”绩效分数的问题…为什么这些员工的工资比“超过”员工绩效分数的员工的工资高。“例外”似乎很准确。

chart = sns.barplot(x = 'position', y = 'pay_rate', data=hr_data, palette='Set1', ci = **None**) chart.set_xticklabels(chart.get_xticklabels(),rotation=90)

作者图片:米歇尔维纳布尔斯

我们的第二张图表显示了基于公司职位的工资水平。显然,总裁和首席执行官的工资比其他雇员高。只要职位/薪酬符合你公司的人力资源战略,它们看起来就是准确的。

我们的下一个图将有助于分析组织内部的一些多样性。在评估我们的人力资源战略时,多元化是一个关键绩效指标。

工作场所中的组织多样性指的是员工队伍的总体构成和多样性的数量。多样性指的是各种定义个人特征的差异,如年龄、性别、种族、婚姻状况和许多其他次要品质。

看看下面的一些多样性评估柱状图:

作者图片:米歇尔维纳布尔斯

差别不大,但平均来说,男性的工资比女性高。

作者图片:米歇尔维纳布尔斯

为了评估基于年龄的多样化,我们根据十年来划分我们的年龄。我们可以看到我们的年龄范围相当多样化。

作者图片:米歇尔维纳布尔斯

图片作者:米歇尔维纳布尔斯

在清理了我们的数据,评估了基于绩效分数、职位和多样性指标的薪酬后,你应该对我们的数据有一个很好的了解。在我们开始建模之前,你总是想清理和评估我们的数据。请继续关注我的下一篇关于预测人力资源分析的博客,并点击下面的 github 链接查看我的代码!

  • 人力资源数据化(下)
  • HR_Project — Github 链接
  • 媒体链接

参考资料:

[1] Bizfluent。"什么是工作场所的组织多样性?"https://biz fluent . com/info-12076820-organization-diversity-workplace . html

人权第一:数据科学方法

原文:https://towardsdatascience.com/human-rights-first-a-data-science-approach-57724b249f32?source=collection_archive---------49-----------------------

使用自然语言处理寻找美国警察暴行的实例

旅程

人权第一是一个独立的组织,通过政治集思广益、创造性的政策制定、各种运动、数据收集和研究以及大众教育,在美国推动全面人权和平等。在不平等和不公正现象继续猖獗的当今世界,这些人权问题尤其重要。您可以在人权第一组织的网站人权第一上找到更多信息和帮助该组织的方法。

在一个由一名团队项目负责人、五名网站开发人员和三名数据科学家组成的团队中,我们致力于人权第一组织的一个非常具体的子域,警察暴行。我们的团队项目领导每周与组织的利益相关者会面,以深入了解项目的期望。提出了一些问题,如“当加载登录页面时,用户希望看到什么”,“希望用户获得什么样的交互性”,“希望获得什么样的数据,是精度更重要还是实例数量更重要?”问题摆在我们面前:创建一个网站,用户可以访问并看到一个交互式的美国 choropleth 地图,允许直观地了解哪些州和城市包含警察暴力事件,以及通过链接的文章、视频等提供文本信息。非常注重数据的精确性。

每个团队都继承了一个 GitHub 存储库,这个存储库是由从事同一项目的前一个团队为他们各自的领域创建的。数据科学团队收到了一份报告,其中包括 ipython 笔记本电脑、应用程序目录和文件、预处理基准预测模型以及。包含预先收集的数据的 csv 文件。我们的方法从确定这个知识库内容的有用性和计划我们自己的贡献开始。

每一段旅程都始于路径的终点

我们的团队立即开始了规划过程,作为一个完整的团队,每天至少召开一次会议,并在我们特定的现场团队内部每天召开几次会议。在我们的头脑风暴会议中,我们提出了一个被认为对最终产品很重要的任务列表。接下来是创建用户故事,让我们从用户的角度深入了解可视化最终产品的工作原理。使用一个 Trello 板和一个创造性的逻辑思维的集合,我们决定了一个用户故事的最终列表和每个用户故事的子列表。我们解决了一些问题,例如,“作为用户,我可以立即在登录页面上看到一张美国地图,上面有关于不同州发生多少警察暴力事件的信息数据”和“作为用户,我可以放大地图,足以查看单个事件数据”,任务按需要贡献的团队进行标记和排序。

概述最广泛的用户故事及其相关任务的 trello 卡。

在团队的规划阶段,我们通过一系列的头脑风暴会议,为每项任务列出子列表,概述完成这些任务的技术可能性。这包括模型、库、方法和我们觉得可能需要作为工具的潜在编程画布。我们将这些列表实现到一个完整的产品流程图中,通过预期的连接将每个领域(DS、后端、前端)结合起来。

产品工程架构规划出所有预期的连接

人权第一项目的数据科学技术决策大纲

当第一次接近这个项目的开发阶段时,我预料到了两个主要的挑战。第一个是使用自然语言处理作为我们建模过程的一部分,因为我们中没有人使用 NLP 库几个月了。通过探索、研究和继承之前团队使用的相同方法,这种风险得到了相应的处理。这允许我们探索我们所拥有的,并根据需要修改以适应我们自己的模型需求。

下面是用来标记我们的数据的一段代码。

*# Create tokenizer functions*

nlp = spacy.load("en")

**def** tokenize(text):
    text = nlp(text)
    tokens = [token.lemma_ **for** token **in** text **if** (token.is_stop != **True**) **and** (token.is_punct != **True**) **and** (token.text != " ")]
    **return** tokens

**def** retoken(text):   
    tokens = re.sub(r'[^a-zA-Z ^0-9]', '', text)
    tokens = tokens.lower().split()
    tokens = str(tokens)

    **return** tokens

第二个挑战涉及整个数据科学团队。我们需要确保我们经常有效地合作,以确保我们在建模研究和开发过程、数据收集过程的时间管理以及正确有效地清理数据方面都在同一页上;这一点的重要性在于,这些任务中的每一项都强烈依赖于前一项任务的成功。为此,我们每周工作五天,每天工作八小时以上,以确保准确的沟通。每当进行编码时,我们会以团队和结对程序的形式会面,交换谁在驾驶,谁在循环方式导航。通过这种方式,我们能够避免任何可能因缺乏团队合作和沟通而出现的陷阱。

这个旅程既是过程,也是奋斗,更是最终的结果

该项目的数据科学方面包括许多耗时的功能。我们从探索我们从前一个团队继承的笔记本开始,并重新创建和修改他们的工作以获得彻底的理解。我们问了一些问题,比如“他们是如何清理数据的?”、“他们认为哪些功能是重要的?”,“为什么有这些功能?”,“他们用什么参数来创建他们的模型?”,“他们的模型有多准确?”。使用这些问题作为我们探索的布局,我们创建了新的 google colab 笔记本,并逐个重新创建了继承的笔记本,将测试放在一起,并根据需要进行修改,以确保我们彻底理解。这个过程包括使用 reddit API 包装器 PRAW 从“新闻”子编辑中提取新闻文章和 Reddit 帖子,以及从 Reddit、twitter、互联网资源和各种新闻网站预先收集的数据,并根据需要清理数据和执行一些功能工程。

下面是我们用来访问 reddit API 并从“新闻”子编辑中提取前 1000 个热门文章的代码;然后,这些数据被添加到一个名为“数据”的列表中,用于创建一个新的数据帧:

*# Grabbing 1000 hottest posts on Reddit* 

data = []

*# Grab the data from the "news" subreddit*
**for** submission **in** reddit.subreddit("news").hot(limit=1000):
  data.append([submission.id, submission.title, submission.score,  
  submission.subreddit, submission.url, submission.num_comments, 
  submission.selftext, submission.created])

*# Create and assign column names*
col_names = ['id', 'title', 'score', 'subreddit', 'url', 
             'num_comments', 'text', 'created']
df_reddit = pd.DataFrame(data, columns=col_names)

接下来,我们决定回收前一个团队的数据收集、清理和特征工程,但修改他们的自然语言处理模型,以包括前一个团队遗漏的一些标签。随后,我们使用 TfidVectorizer 和 RandomForestClassifier 以及 RandomizedSearchCV 整合了基线预测模型,用于早期参数调整。使用这些方法,我们能够创建一个 csv 文件,我们可以放心地发送给 web 团队,用于他们的基线 choropleth 图。用于构建我们的模型的代码可以在下面的嵌入中找到。

*# Build model pipeline using RFC*

pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('classifier', RandomForestClassifier(random_state=42, n_jobs=-1, max_depth=5, n_estimators=45,)),
])
pipeline.fit(X_train,y_train)
predictions = pipeline.predict(X_test)param_distributions = {
   'classifier__max_depth': [1, 2, 3, 4, 5]}

search = RandomizedSearchCV(
   pipeline, 
   param_distributions=param_distributions, 
   n_iter=10, 
   cv=3, 
   scoring='accuracy', 
   verbose=10, 
   return_train_score=**True**, 
   n_jobs=-1
)

search.fit(X_train, y_train);>> Best hyperparameters {'classifier__max_depth': 5}
>> Best Score 0.9075471698113208

除了我在探索、清理和建模阶段的贡献之外,我还带头使用了数据科学 API。我们的项目使用 FastAPI 创建并运行数据科学应用程序,并使用 Docker 保存我们应用程序的映像,以便部署到 AWS Elastic Beanstalk。在我的本地环境中,我包含了前面提到的 csv 文件,以及一个包含数据清理和功能工程方法的文件,这些方法是由我、我的一个团队成员和以前的数据科学团队整理的。使用它,我能够创建两个新的 csv 文件,一个包含原始的最终数据,另一个包含为 jsonification 清理和预处理的最终数据。这些数据在被添加到 get 端点以供 web 团队的后端访问之前被转换为 json 对象。为完成此任务而设置的路由器可以在以下嵌入中找到:

*from fastapi import APIRouter, HTTPException
import pandas as pd
import numpy as np* # from .update import backlog_path  # Use this when able to get the # backlog.csv filled correctly
from ast import literal_eval
import os
import json
# Create router access
router = APIRouter()@router.get('/getdata')
async def getdata():
    """
    Get jsonified dataset from all_sources_geoed.csv
    """
    # Path to dataset used in our endpoint locs_path = os.path.join(os.path.dirname(__file__), '..', '..', 
                'all_sources_geoed.csv') df = pd.read_csv(locs_path) # Fix issue where "Unnamed: 0" created when reading in the           
    # dataframe df = df.drop(columns="Unnamed: 0") # Removes the string type output from columns src and tags, 
    # leaving them as arrays for easier use by backend for i in range(len(df)):
        df['src'][i] = ast.literal_eval(df['src'][i])
        df['tags'][i] = ast.literal_eval(df['tags'][i]) """
    Convert data to useable json format
    ### Response
    dateframe: JSON object
    """
    # Initial conversion to json - use records to jsonify by 
    # instances (rows) result = df.to_json(orient="records") # Parse the jsonified data removing instances of '\"' making it 
    # difficult for backend to collect the data parsed = json.loads(result.replace('\"', '"')) return parsed

我们面临的主要挑战之一是在项目的部署阶段。我能够将数据设置并部署到 AWS Elastic Beanstalk 上,但是有几次数据的 jsonification 出现问题,使得它对 web 团队不可用。首先,返回的数据带有几个不合适的正斜杠“\”和反斜杠“/”。其次,一些数据特征,特别是“src”和“tags”被作为字符串而不是数组返回。DS 团队坐在一起聊天,研究和集思广益如何解决这个问题。在我们的部署中经过多次试验和错误之后,我们找到了确保发送的数据格式正确所需的预处理步骤。可以在下面找到该流程的嵌入式代码:

import os
import pandas as pd
import re# set up various things to be loaded outside of the function
# geolocation data
locs_path = os.path.join(os.path.dirname(__file__), 
            'latest_incidents.csv')# Read in the csv file into a dataframe
sources_df = pd.read_csv(locs_path)# Remove instances occurring in which backslashes and newlines are 
# being created together in the data.
sources_df["desc"] = sources_df["desc"].replace("\\n", "  ")# Remove the "Unnamed: 0" column creating when reading in the csv
sources_df = sources_df.drop(columns=["Unnamed: 0"])# Fix instances occurring in which new lines are being created in 
# the data
for i in range(len(sources_df)):
    sources_df["desc"][i] = str(sources_df["desc"][i]).replace("\n",  
    " ")# Create csv file from dataframe
sources_df.to_csv("all_sources_geoed.csv")

结束不是结束,而是一个新的开始

到目前为止,我们对该产品的贡献已经达到了极限。数据科学团队能够收集、清理、设计和向 web 团队发送可用的数据集,包括过去七个月美国各地的 1177 起警察暴力事件。发送到后端的每个实例都包括以下功能:“src”——一组链接到源视频、文章和/或帖子的 URL,使用 newspaper3k 对其进行了清理,以提取正确的文本——“state”——事件发生的州,这是使用 spaCy 从文本中提取州名的工程——“city”——事件发生的城市, 这是使用 spaCy 从文本中提取城市名称设计的——“desc”——事件的文本描述——“标签”——用于识别故事是否是警察暴力案件的标签。 这是使用自然语言处理设计的——“标题”——事件的描述性标题——“日期”——事件发生的日期——“id”——每个实例的唯一字符串标识符——“lat”——映射事件位置的纬度代码,这是使用州和城市名称以及列出城市、州, 以及地理位置代码(纬度和经度)-和“经度”-映射事件位置的经度代码,这是使用州和城市名称以及列出城市、州和地理位置代码(纬度和经度)的单独 csv 文件设计的。 我们的团队还能够发布一个可用的 API,允许连接到后端,并通过它们连接到前端可视化。下面是发送给后端团队的数据样本:

[{"src":["https://www.youtube.com/watch?v=s7MM1VauRHo"],"state":"Washington","city":"Olympia","desc":"Footage shows a few individuals break off from a protest to smash City Hall windows. Protesters shout at vandals to stop.  Police then arrive. They arrest multiple individuals near the City Hall windows, including one individual who appeared to approach the vandals in an effort to defuse the situation.  Police fire tear gas and riot rounds at protesters during the arrests. Protesters become agitated.  After police walk arrestee away, protesters continue to shout at police. Police respond with a second bout of tear gas and riot rounds.  A racial slur can be heard shouted, although it is unsure who is shouting.","tags":["arrest","less-lethal","projectile","protester","shoot","tear-gas"],"geolocation":"{'lat': '47.0378741', 'long': '-122.9006951'}","title":"Police respond to broken windows with excessive force","date":"2020-05-31","date_text":"May 31st","id":"wa-olympia-1","lat":47.0378741,"long":-122.9006951},{"src":["https://mobile.twitter.com/chadloder/status/1267011092045115392"],"state":"Washington","city":"Seattle","desc":"Officer pins protester with his knee on his neck. His partner intervenes and moves his knee onto the individual's back.  Possibly related to OPD Case 2020OPA-0324 - \"Placing the knee on the neck area of two people who had been arrested\"","tags":["arrest","knee-on-neck","protester"],"geolocation":"{'lat': '47.6062095', 'long': '-122.3320708'}","title":"Officer pins protester by pushing his knee into his neck","date":"2020-05-30","date_text":"May 30th","id":"wa-seattle-1","lat":47.6062095,"long":-122.3320708},{"src":["https://twitter.com/gunduzbaba1905/status/1266937500607614982"],"state":"Washington","city":"Seattle","desc":"A couple of police officers are seen beating and manhandling an unarmed man. The officers are throwing punches while he was on the ground and pinned.  Related to Seattle OPA Case 2020OPA-0330.","tags":["beat","protester","punch"],"geolocation":"{'lat': '47.6062095', 'long': '-122.3320708'}","title":"Police beat unarmed man on the ground","date":"2020-05-31","date_text":"May 31st","id":"wa-seattle-2","lat":47.6062095,"long":-122.3320708}, . . . ]

网络团队能够利用这些数据,在登陆页面上整合出一个功能性的交互式美国 choropleth 地图。该地图向用户显示多个可点击的图钉,在与图钉交互时,向用户显示一个信息框,该信息框包括事件的标题、事件的城市和州位置、事件的文本描述以及链接到数据收集位置、事件报告位置的 http 源,以及该事件的任何附带视频和新闻源。

[## 考虑到的人权

使用 create-react-app 创建的网站

main.d17v0exvwwwzgz.amplifyapp.com](https://main.d17v0exvwwwzgz.amplifyapp.com)

附带交互式图钉的 choropleth 地图

点击大头针后显示的犹他州盐湖城事件的信息框示例

产品完成后,未来可能会有许多修改和功能添加。数据科学团队的基线模型在工作和部署时,有输出太多误报的倾向,使其在自动数据收集架构师中的使用不够可靠。未来的团队可以努力显著改进该模型,并使用和修改每 24 小时收集新数据的更新框架,并使用该模型预测警察暴行的实例。对于 web 端,一些可能的未来添加可能包括更新和更具视觉吸引力的地图,访问更多的可视化和数据-这也将涉及额外的数据,可能还包括未来数据科学团队提供的 seaborn 或 plotly 可视化-以及用户按日期、位置等对数据进行排序的能力。

旅途终点的奖赏

在整个旅程中,我接触到了大量新的有益的经历。我学到了尽早安排计划的重要性,以及如何作为一个团队和个人高效地完成这个过程。我学到了结对编程的原则和好处;这个项目让我们每周结对编程五天,持续四周,这个时间跨度足以获得大量的见解和挫折。这让我直接进入了下一个也可以说是最重要的学习机会:团队发展和沟通;当从事一个多学科项目时,需要许多不同的人完成许多任务,其中大多数都严重依赖于许多不同任务的完成,作为一个团队紧密合作以建立信任、理解和强大的沟通系统是至关重要的。除此之外,我还学习了许多技术库和方法的细节,包括 FastAPI、AWS Elastic Beanstalk 和 newspaper3k,并获得了更多关于库和方法的经验,如 NLP、spaCy、tokenization、RandomForestClassification、RandomSearchCV、API 如 PRAW 和 TWEEPY 等。

这种产品和经验是我将来能够随身携带的东西,目的是依靠它来收集对 NLP 或数据工程问题的未来方法的洞察力、宝贵的团队合作经验、我的简历、申请和工作面试的参考资料,以及超出我当前有意识思维范围的更多内容。

我叫丹尼尔·本森。我是一名数据科学家和有抱负的机器学习工程师,通过 Lambda School 的数据科学项目接受培训。我目前拥有韦伯州立大学的副学士学位,正在努力完成生物学和神经科学的学士学位。如果你希望阅读更多我的作品,我会努力在 Medium 上每周至少完成一篇博文,概述我曾经或正在进行的项目。如果你想联系我,可以在 LinkedIn 或 T2 Twitter 上找到我,为了更好地了解我的项目方法,你还可以访问我的 T4 GitHub,我在那里储存了我所有的技术项目。最后,如果你想跟踪这个警察暴行产品的开发,你可以咨询资源库、部署的登陆页面,或者人权第一网站本身。勇敢的读者,谢谢你跟随我踏上这段旅程,请关注下一篇文章。重复一遍,祝编码愉快。

人类与人工智能:梦之队

原文:https://towardsdatascience.com/humans-and-ai-the-dream-team-2b05e1c79704?source=collection_archive---------72-----------------------

为什么人工智能像人类需要人工智能一样需要人类,尤其是在像全球疫情这样的新奇事件中

Bret Kavanaugh 在 Unsplash 上拍摄的照片

在某种程度上,每个人都看过某种 clickbait 文章,谈论一些新的人工智能技术或新的机器人将如何最终取代我们人类。或者至少他们会让我们的大部分劳动力过时。当然,正如 clickbait 文章的倾向一样,它们极大地夸大了当前的技术以及某些技术离取代人类劳动有多近。例如,你看了像这部有线纪录片这样的视频,你会认为自动驾驶汽车随时都可能接管道路。事实上,我认为如果你找一个不参与人工智能/机器学习/数据科学社区的人,问他们当你提到人工智能时,他们想到的是什么样的技术,他们首先想到的可能是自动驾驶汽车。然而,这篇 Vox 文章引用了加州大学戴维斯分校交通研究所创始主任丹尼尔·斯珀林的话:

…完全无人驾驶的汽车——完全不需要任何人在车里,可以去任何地方——在很多很多年内都不会发生,也许永远不会发生

正如自动驾驶汽车不会取代人类司机一样,在许多领域,人类也不会像这些文章让你相信的那样被取代。换句话说,人工智能并不像它被认为的那样不会犯错,这一点随着当前的疫情变得更加明显。

现在的新冠肺炎·疫情是现代的一种新奇体验。我们上一次经历如此规模和社会影响的疫情是在 1918 年的流感大流行,正如你想象的那样,来自疫情的数据远没有我们现在拥有的那么详细或完整。此外,由于许多原因,1918 年的世界与我们今天生活的世界大不相同。

所有的预测模型都在一个基本假设下工作,即未来会以与过去相同的方式运行。数据将总是以相同的方式运行,改变的只是不同变量之间的交互方式。模型只知道数据告诉他们的东西,其他一无所知。它没有一般的世界知识,甚至只是一个更大的上下文知识(当然,除非它反映在模型给出的数据中的某个地方)。

正如本文所强调的,所有这些都意味着许多预测模型将会遥遥无期。模型无法解释这种程度的灾难性事件。此外,即使模型中增加了可以解决疫情特有问题的功能,事实是我们真的不知道未来会是什么样子。我们真的不知道我们什么时候会停止社交距离,除了我们可能不会永远这样做的事实,我们也不知道人们什么时候会觉得做他们曾经做过的事情是安全的。此外,正如许多人所说,我们可能永远不会回到过去的样子。如果是这样的话,预测模型,尤其是对数据要求更高的模型,将会在相当长的一段时间内明显失效。

这就是人类的用武之地。我们能够用很少的数据来获取新的事件并做出有根据的预测,因为我们有更广泛的同理心内部数据库和对我们人类行为的理解。一种算法可能无法预测一个人现在会去哪里购物,但人类可以。我们可能会预测有人会去较小的商店,因为那里不太拥挤,或者离家更近。我们可以看到数据的变化,并说,“哦,这对于[在此插入原因]是有意义的。”对于一个无法准确理解疫情以及与之相关的威胁和焦虑如何影响人类行为的算法来说,同样的变化根本没有意义。

所有这些并不是说我们没有桨,所有的算法现在都是无用的。算法仍然可以包含有价值的洞察力,我们可以将这些洞察力与我们自己的知识结合起来。我们可以查看算法的输出,并将其呈现为,“这是根据我们的模型通常会发生的事情,这是目前正在发生的事情,所以如果这些事件在未来发生,这就是我们如何可以预期我们的模型是错误的,以及我们如何可以预期它是正确的。”事实是,人类和人工智能一直相互需要。即使人类创造了人工智能,人工智能仍然需要来自我们的数据,人类可以提供算法无法提供的领域和一般知识。在当今数据驱动的世界中,数据科学已被证明是一种无价的工具。模型可以筛选人类无法筛选的海量数据,但人类更善于适应新的情况。这就是为什么永远不应该是一个取代另一个,而是要利用彼此的优势,齐心协力。

人类正在成为生命工程师

原文:https://towardsdatascience.com/humans-are-becoming-life-engineers-c449f65f5dfc?source=collection_archive---------41-----------------------

人类正在变得像电影《普罗米修斯》中的“工程师”一样吗?

顶行:计算机生成的设计。底行:实际细胞结构。图片来自https://cdorgs.github.io/

介绍

这是激动人心的时刻。

来自佛蒙特大学的计算机科学家、教授和研究人员建造了被媒体称为“第一台生命机器”

这些活体机器实际上是计算机设计的有机体,被称为异种机器人

异种机器人是如何被制造出来的一点也不像电影《普罗米修斯》中的“工程师”实际上控制着人类那样酷。但还是很有意思。

电影《普罗米修斯》中的场景

这篇文章旨在用通俗的语言解释这些计算机设计的有机体实际上是什么;它们是如何发展的,以及它们如何有益于人类和我们的环境。

动机

图片来自 thoughtco.com

参与这些生物机器(异种机器人)开发研究的团队从以下事实中获得了动力:当前人类技术的组成部分是基于对环境和人类本身都有害的降解材料。

异种机器人将自己呈现为材料的完美构建模块。它们的可再生性和生物相容性特征提供了解决我们目前因金属和塑料基构件而面临的各种问题的步骤。

生物机器的设计也激发了对基于细胞的生物和技术在医学、机器人学和其他研究领域的潜在用途的进一步探索和发现。

据佛蒙特大学的博士生、研究小组成员萨姆·克里格曼(Sam Kriegman)说,大自然对可以由生物细胞形成的有机体的可能组合的探索并不广泛,我们需要探索大自然没有探索的领域。

起源

让我们后退一步,了解异种机器人的底层构成。

异种机器人由来自青蛙(非洲爪蟾)的干细胞组成,用作异种机器人的构建模块。皮肤细胞和心肌细胞从青蛙胚胎中积累起来,形成异种机器人的基础。

非洲爪蛙

因此,异种机器人最好被描述为用底层组织细胞建造的活机器人。

研究人员没有利用传统的机器人建筑材料,而是从大自然中寻找建筑材料。

告诉我更多

高中生物学告诉我们,两栖动物生命周期的各个阶段包括幼体阶段的蝌蚪。

虽然蝌蚪会发展成有着跳跃的腿的青蛙,但它们最初会游泳。

现在,异种机器人可以进行被称为“行走”的运动。

异种机器人的组成部分处于两栖动物生命周期的胚胎阶段,在幼虫和变态阶段之前。

那么他们怎么能这么早就走路呢?

纤毛在运动

嗯,研究小组从异种机器人构建细胞中移除了一种叫做纤毛的东西。

纤毛可以被描述为有节奏的运动毛发,可以归因于游泳运动。

异种机器人的运动能力实际上来自心脏细胞发展收缩肌肉,基本上是心跳运动。

算法

组装这些积木的指挥者是一个嵌入了进化算法的计算机建模系统。

进化算法随机选择构建异种机器人的不同配置,并基于完成给定目标的成功选择最佳异种机器人结构设计。

但是什么是进化算法呢?

进化算法(EAs)是通过类似或模仿自然选择的方法来优化问题解决方案的过程。

自然选择图片来自现场科学

这一过程涉及一个孤立的环境,环境中的居住者是随机产生的,有一个要实现的内在目标。

经过一段时间后,选择过程开始。这个选择过程从随机产生的群体中挑选合适的候选人,为该过程的下一次迭代产生后代。

该过程重复指定数量的重复或世代,并且一旦满足特定标准就终止。

关于进化算法的更多信息可以在这里找到:

[## 进化算法

进化算法(EAs)是基于群体的元启发式算法,最初受自然进化方面的启发…

arxiv.org](https://arxiv.org/abs/1805.11014)

现在,回到异种机器人。

设计生物有机体结构的算法在模拟中运行几种结构组合,直到设计出最合适的组合,然后转移到实际有机体的模型中。

利益

我们现在对异种机器人有了一些了解。

探索它们能给人类和我们的环境带来什么样的好处,将会让我们看到这些生物的高级版本的未来会是什么样子。

左图:细胞显微图像。中间:自然。右:研究

  • 医学中,这种生物可以在患者体内的细胞水平上提供治疗。
  • 对于环境应用,他们可以支持塑料清洁倡议。
  • 为了研究的目的,它们可以作为人体细胞药物测试的材料。

一般来说,异种机器人和研究小组的工作仍处于早期阶段,以实现长期利益和利用。

尽管如此,一个由我们想象力的无限边界所引导的愿景将引领我们走向一个积极的可预见的未来。

推测

生物和人工智能领域的任何新发展都会带来一些担忧和猜测。

异种机器人的发展涉及到明显的伦理问题。

但更广泛的是人工智能或人工智能控制的生物的发展消灭了人类。

异种机器人可以被编程用于邪恶目的吗?

在目前的状态下,答案是否定的。

目前的异种机器人寿命为七天,在合适的条件下,它们可以多活几周或几个月。人类在寿命和长寿的游戏中获胜。

进化怎么样?

人类从进化中受益匪浅。异种机器人在目前的状态下不会进化。人类在这方面还是有优势的。

武器化。

这些外星机器人有可能被武器化。Sam Kriegman 表示,通过人工智能创造危险的生物体,并不比一个怀有恶意的生物学家做同样的事情更容易。他还继续支持引入关于异种机器人应用或任何未来版本的法规。

结论

简而言之,就是这样,异种机器人。

他们很小,很酷,不是来毁灭人类的。

对于我们人类来说,引入计算机设计的生物体为细胞生物学和人工智能算法领域更稳定的进步和创新铺平了道路。

新十年的开始是多事之秋,但仍将以同样的速度继续下去。新的发展和发现就在眼前,它们将导致技术在我们日常生活中更加创新和直观的应用。

这的确是一个激动人心的时刻。

有关“计算机设计的生物体”的更多信息,请访问以下链接:

[## 计算机设计的有机体

大多数技术是由钢、混凝土、化学品和塑料制成的,它们会随着时间的推移而降解,并会产生…

cdorgs.github.io](https://cdorgs.github.io/) [## 利用青蛙细胞和人工智能创造出世界上第一台“活机器”

(图片:道格拉斯·布莱克斯顿,塔夫茨大学)当你从青蛙胚胎中取出细胞并将其培养成…

www.livescience.com](https://www.livescience.com/frogbots-living-robots.html?mod=djemAIPro) [## 用于设计可重构生物体的可扩展流水线

大多数技术是由钢、混凝土、化学品和塑料制成的,它们会随着时间的推移而降解,并会产生…

www.pnas.org](https://www.pnas.org/content/early/2020/01/07/1910837117)

如果你喜欢这篇文章,并想阅读类似的内容,请在 Medium 上关注我。在 LinkedIn 上也可以找到我。

循环中的人类

原文:https://towardsdatascience.com/humans-in-the-loop-ac3699040380?source=collection_archive---------44-----------------------

苹果 | 谷歌 | SPOTIFY | 其他

迪伦·哈德菲尔德-梅内尔在 TDS 播客

要选择章节,请访问我们的 Youtube 视频此处。

编者按 :这一集是我们关于 数据科学和机器学习中出现的问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:

收听苹果、谷歌、 Spotify

在越来越多的高风险任务中,人类正在与人工智能合作。我这里说的不仅仅是机器人辅助手术或无人驾驶汽车——每天,社交媒体应用程序都向我们推荐内容,这些内容确实塑造了我们的世界观和文化。我们中很少有人知道这些非常重要的建议是如何产生的。

随着时间的推移,我们可能会越来越依赖我们的机器,将越来越多的思考外包给它们。如果我们不考虑我们做这件事的方式,我们可能会创造一个不反映我们当前价值观或目标的世界。这就是为什么人类/人工智能协作和互动的领域如此重要——这也是我想在本期“走向数据科学”播客中与伯克利人工智能研究员迪伦·哈德菲尔德-梅内尔交谈的原因。迪伦的工作专注于设计可以让人类和机器人更具建设性地合作的算法,他是专注于人工智能伦理和人工智能对齐领域的一个小型但不断增长的人工智能研究人员群体之一。

以下是我们谈话中我最喜欢的一些带回家的东西:

  • 当我们处理某些人工智能问题时,我们做出的一个基本选择是决定将世界的哪一部分视为“问题解决代理”,以及将世界的哪一部分视为“环境”。当我们考虑人类/人工智能交互时,这变得更加重要:我们应该将人工智能视为代理,将人类+世界其他部分视为其环境,还是想象人类+人工智能实际上是一个集成的代理,它们一起面对周围的世界?迪伦的研究采用了第二种方法,试图更好地理解人类和机器如何合作解决实际问题。
  • 如果你说“我认为学生的考试成绩是衡量教师表现的一个很好的指标”,你可以预期教师将开始改变他们的教学风格以提高学生的考试成绩,即使这意味着牺牲实际的学生学习(例如,通过强调教师认为可能在考试中出现的主题或问题,而不是对学生更有普遍价值的主题)。类似地,当政客们开始将股市视为整体经济表现的代表时,他们就有动机采取牺牲公民金融福祉的举措来推动股指上涨。这个问题被称为古德哈特定律:一旦你指定了一个你想要优化的指标(如股票指数,或学生考试成绩),人们就会开始攻击这个指标,随着时间的推移,它将失去作为你真正关心的事情(经济的健康状况,或教育质量)的代表的价值。
  • 古德哈特定律也适用于人工智能系统,因为人工智能通常被训练来优化目标函数——一种旨在反映我们所重视的结果的目标指标。不幸的是,选择真正捕捉我们想要的目标函数非常困难;更常见的情况是,它们与我们认为自己想要的东西相差甚远,这可能会产生危险的影响。例如,我们可能认为自动驾驶汽车的一个好的目标函数是最小化到达某个指定目的地的总驾驶时间,但当然,最小化驾驶时间的路径几乎肯定既不安全,也不合法。因为机器从字面上理解它们的目标函数,所以它们经常提出原创但高度病态的解决方案,这些解决方案往往随着它们变得越来越聪明而变得越来越原创、越来越病态。
  • 在将人工智能与人类价值观对齐时,一个重要的考虑因素是分布外采样的风险,在这种情况下,人工智能遇到的样本与其在训练中遇到的样本表现不一样。迪伦最近的一些工作专注于培训代理,当他们所处的环境与他们的培训环境不匹配时,他们可以注意到他们在培训期间学到的经验教训。随着人工智能比人类更有能力评估其训练的上下文相关性,这种鲁棒性将变得越来越重要。

你可以在推特上关注迪伦,你也可以在推特上关注我。

章节:

  • 0:00 介绍
  • 1:57 迪伦的背景
  • 4:58 价值取向问题
  • 8:15 简化流程的最佳实践
  • 12:39 确定损失函数的长期目标
  • 14:07 人工智能变得“更加复杂”
  • 18:15 人类幸福的例子
  • 21:51 迪伦的研究
  • 27:51 艾的结论
  • 32:59 其他选项
  • 38:30 进化优化过程
  • 42:55 抽象级别
  • 47:49 系统安全
  • 51:50 艾绝对主义
  • 54:34 机器人与人类的互动
  • 1:02:25 生产力和社交媒体
  • 1:03:40 总结

下面是第二季第四集的脚本:

杰里米(00:00:00):
大家好,我是杰里米,播客的主持人,也是最敏锐思维数据科学导师项目团队的一员。我今天带来了一个非常激动人心的插曲,事实上,我们正在和迪伦谈话,他是加州大学伯克利分校的一名研究员。他实际上在那里完成了他的博士学位,在那里他一直在研究不同类型的人机交互,人类与人工智能的交互,他的目标是弄清楚人类和人工智能如何以一种更积极的方式相互作用。

Jeremie (00:00:30):
每当人类需要向人工智能传达他们的偏好时,人们经常会担心他们的偏好可能会被误解。人工智能系统越强大,误解造成的伤害就越大。迪伦专注于让人类与人工智能系统高效沟通的方案,并探索不同的方式来设置系统,使它们最大限度地保持稳健。这里的希望是人工智能将在某种程度上学会适度的谦逊和不确定性,特别是当他们要去执行真正重要的行动,真正重要的行动时。

Jeremie (00:01:05):
Dylan 正在研究这个问题,他也对所谓的人工智能对齐问题更感兴趣,即我们如何让人工智能按照我们希望的方式行事。我真的很兴奋能和他说话。他有各种各样的深刻见解,包括对人工智能调整真正意味着什么以及如何建立与我们的价值观正确一致的系统的新观点。我真的很期待能深入其中。我希望你喜欢这次谈话,我们在另一方面再见。

杰瑞米(00:01:30):
你好,迪伦,非常感谢你参加我的播客。

迪伦(00:01:34):
很高兴来到这里。谢谢你邀请我。

杰瑞米(00:01:35):
你能来这里我真的很兴奋。你是专注于人工智能安全问题的研究人员中的一员,这个研究队伍正在不断壮大,但仍然相当小。当然,你有一个专业,一个你关注的子领域,我很想听听你的看法,首先是你是如何做到这一点的,你是如何开始关注人工智能安全的,然后是你目前的研究是什么样的。

Dylan (00:01:57):
我的研究起源故事,如果你愿意,开始于机器人的集成任务和运动规划。我感兴趣的是如何让机器人帮你洗衣服。这涉及到长期的规划和许多实际系统建设的细节。在建立这个系统的过程中,你要做的一件关键事情就是解决一个叫做运动规划的问题。有很多不同的方法可以解决这个问题。我们使用的一种方法是轨迹优化。但是运动规划的概念是,你已经让你的机器人处于一个特定的配置,你已经有了一个你想让它朝着的目标配置,你需要找出一系列的关节控制,实际上把你从初始位置带到目标位置,而不会碰到任何东西。

迪伦(00:02:49):
事实证明,这是一件非常困难的事情,也是我们在日常生活中认为理所当然的人类智慧的例子之一。长话短说,在应用轨迹优化时,你要做的是指定一个成本函数,对不同的轨迹,从 A 点到 b 点的不同方式进行排序。它会说,发生碰撞非常糟糕。但是更快到达那里也是好的。

Dylan (00:03:20):
你最终必须指定这些权衡,这些权重。在我的一些演讲中,我举了一个界面的例子,展示了你所经历的这种设计过程,比如说,你在避免碰撞的效果和你想要的速度之间进行权衡。

迪伦(00:03:40):
最终,我意识到这些重量代表了你想要什么样的轨迹。在指定这些目标时,这实际上是一种编程过程,其中我们指定我们想要什么类型的行为。你可以在一大堆不同的人工智能环境中看到这种类型的范式,其中我们将指定我们想要什么的问题简化为某种奖励函数或得分函数。在强化学习的情况下,这是一种类似于度量或奖励函数的东西。在监督学习的情况下,这是数据集上的经验损失函数。你可以想出很多其他的例子,我们真的把我们的偏好编码到这些排名函数中,这些类型的效用函数,然后用通用的方法来优化它们。

Dylan (00:04:39):
大约两年后,在解决这些问题并熟悉这种模式后,我开始将我的研究转向研究这个问题的实际情况,以及做好它意味着什么,以及我们可以尝试避免哪些陷阱?这就是我认为的人工智能中的价值定位问题。

Jeremie (00:04:58):
好的,这就是我们所理解的……你对价值调整问题的描述包括提出我们想要优化的参数。这样说公平吗?它包括损失函数。

迪伦(00:05:12):
对。在某种程度上,你可以把损失函数看作一种编程语言,我们可以把优化看作一种编译器,你可以从一种表示,比如说,一种分类行为,从像素到二进制 01 的映射,相机狗。最终,会有一些行为集合,一些权重集合来代表对事物进行适当的分类。我们不知道如何手工编程,那太疯狂了。但同时,我们也不知道如何直接用机器代码编程。

耶雷米(00:05:48):
对。

Dylan (00:05:50):
我认为你可以在这种快速可执行的行为表现形式(类似于神经网络的权重)和我们为获得这些行为而优化的目标(即捕捉我们对猫的图片的概念的数据集)之间进行很好的类比。

Jeremie (00:06:11):
有意思。我想这种类比的一个有趣的结果是,它很好地映射了某人第一次尝试编程的主观体验,以及某人尝试做一种幼稚的机器学习。当我第一次编程时,我会对机器感到非常沮丧,因为我会告诉它做一些事情,而我的代码会中断,机器会明确无误地告诉我,“嘿,你犯了一个错误。”我不能接受。我一直在想,嗯,不,我没有犯错。很明显,你没有正确理解我让你做的事情。

耶雷米(00:06:44):
当然,我现在认识到这是一个愚蠢的错误。但是看起来我们正在犯类似的错误,或者至少我们有可能在机器学习上犯类似的错误,在机器学习中,我们只是字面上的而不是认真的,比如说机器。就对齐问题的来源而言,这是两者之间的公平映射吗?

迪伦(00:07:06):
是的,我想是的。我认为这就像在你有真正好的编译器之前,你工作在基准代码上,或者你不知道人们对写什么程序感兴趣,你写的编译器工作在你最好的表示上。有一些特定的程序是用来复制你可能需要编译的某些类型的负载的,比如内存管理中的快速数据访问或者类似的东西。但归根结底,它们是综合问题。如果你看看人工智能,那么,我认为科学界对什么是智能以及这类问题有着普遍的兴趣。但是,实际上,如果你想想我们实际上使用这些系统是为了什么,我们有数据集来表示我们希望能够做的事情,这很好,非常非常有用。但这并不能帮助我们练习这个过程,这是我们如何对我们想要的东西有一个非常松散的想法,然后同意如何以某种方式来表示它,我们实际上可以训练一个系统来做我们想要的事情。

Jeremie (00:08:15):
现在出现了什么样的最佳实践,或者你正在制定什么样的策略来简化这一过程?我们如何帮助人类更好地指定他们想要什么,以便机器人不会离开并做错事情?

Dylan (00:08:30):
老实说,我认为它的很大一部分是重新定义从事机器学习或作为机器学习工程师的人的规则。如果你想一想你在 ML 入门课程中学到了什么。你走进去,就像第一天,标准的,有指导的学习。我记得很清楚,对我来说,第一天,就像,嗯,一个监督学习问题由一个数据集,一组标签,一个损失函数,一个假设类组成,对吗?这就是问题的定义。

Dylan (00:09:11):
这真的很好,但这就像说,嗯,程序是由来自一些语法的一组术语定义的,而您的工作是将它们忠实地转换成机器代码。它是准确的,但它没有关注实际使这些系统工作的方面,这些系统通常与您实际获取数据的方式有关,确保数据标记过程实际上与您关心的世界中的因果机制相关联。监控数据流并确保数据不会随时间推移而移动。

迪伦(00:09:47):
我认为最终的问题是,如何建立一个包含人类和机器人的系统,最终确保系统表现出的行为代表我们可以与人的目标联系起来的东西。这听起来不像是一个超级具体的建议。但我认为,其中一部分只是认识到,通过更仔细地了解从哪里获得数据、如何标记数据以及如何实际解决问题,可以解决多少问题。

Dylan (00:10:22):
我这里的一个经典例子与招聘场景有关,在这里你可以看这个问题,你可以说,我认为,好的招聘意味着什么?嗯,我想我需要在绩效评估中表现出色的人。我想学会预测谁会得到好的绩效评估。我觉得这听起来很有道理。如果你没有非常仔细地思考这代表了什么,以及这与你的公司或国家的历史或不同的背景有什么关系,这是一个非常好的方法。我认为,如果你想得更多一点,你会开始意识到,实际上编码为,我们如何才能雇用我们过去想雇用的人?

迪伦(00:11:13):
这是一个非常有趣的问题,但可能不是为了雇佣你现在想雇佣的人而应该优化的问题,也不是你应该认真考虑的问题。假设在过去和现在之间发生转移,事情会出现在招聘偏见方面,有些公司已经有了评估候选人的偏见系统。然后,这些公司投入了大量的时间,他们雇佣了谁,他们如何进行培训,以及他们如何进行招聘过程,以消除这方面的偏见。

迪伦(00:11:51):
然后,与此同时,你引入训练有素的系统来复制这种偏见,并以一种新的方式引入这种偏见。我认为这是一个失败,没有真正思考我正在解决的问题的重要部分,而不是关注我可以从我的模型中获得什么样的 AUC?这是您最终要达到的目标,坦白地说,也是一个更容易衡量的目标。如果你是一家公司的工程师,你正在努力争取升职,那将会…拥有这样的机会肯定是你想要达到的目标,而且更难描述和量化的工作是确保我们确实在解决我们最初真正想要解决的问题。

Jeremie (00:12:39):
嗯,这似乎引发了人们对古德哈特定律的一些思考,也就是说,当你定义了一个你想要优化的指标时,如果它值得优化,它就不再是一个指标,因为人们会在它周围找到巧妙的方法。我想,对于古德哈特定律的应用,我的一个担心是,这是否意味着,这是一个棘手的问题,甚至是试图确定一个损失函数,这是我们应该长期努力的目标?

迪伦(00:13:12):
我认为这是一个非常好的问题。我认为…在高层次上…我们应该讨论古德哈特定律是什么吗-

Jeremie (00:13:25):
实际上是的。

迪伦(00:13:25):
……再深入一点?

Jeremie (00:13:27):
根据我的理解,古德哈特定律是这样一种想法,例如,当你选择一个你想要优化的指标时,比如 Twitter 上的粉丝,你可能会在第一天认为这将导致你做出你会与你钦佩的人联系在一起的行为。如果我在 Twitter 上有很多关注者,我会成为一个我崇拜的人。但是你意识到你想的越多,你花在优化这个指标上的时间和精力就越多,你开始意识到它们是你可以应用的小技巧。你可以玩一个跟随,跟随回来的游戏,或者你可以在 Twitter 上说一些让你获得更多追随者的离谱的事情,即使它并不能帮助你在你最初想做的事情上取得进展。

Jeremie (00:14:07):
我想这里的想法是人工智能系统,随着它们变得越来越复杂,特别是当它们在解决几乎任意任务时开始完全超过人类的表现,我们将能够投入计算周期,使人类对特定指标的适应能力相形见绌。最终,不管你指定什么样的损失函数,你都会得到离谱的解。无论你花多少时间去思考一个你想要优化的目标函数,机器都会找到一种方法做得很好,以至于超越了程序的最初目的。

迪伦(00:14:41):
对。我认为这是一个很好的总结,我认为涵盖了相当广泛的范围。让我们先把古德哈特定律和人工智能之间的关系放在一边,只关注古德哈特定律的种类,以及它是如何出现在人们身上的,因为它最终是从那里产生的。之所以这样表述,是因为古德哈特实际上是在说,没有能力实施有效的货币政策,这有点奇怪。但它基本上是说,在某些方面,人们有自己的目标和目的。如果你改变一个标准,你不太可能真正有意义地改变他们的行为,他们只会适应。因此,您将看到使您的指标上升的最小可能变化,这实际上不会改变他们正在做的事情。

Dylan (00:15:43):
我认为,正如人工智能,特别是安全,人工智能系统和社会科学中的人们更广泛地解释的那样,一般来说,有一种观察认为这是一种特殊的说法,即当处于优化压力下时,观察到的统计相关性,或者我可能弄错了它的细节,将不会停止存在。

迪伦(00:16:11):
我认为,如果你以更一般的形式来看待这个问题,你会发现写下一个奖励函数或指定你的目标是不可靠的。我认为,从很多方面来说,这是我们在生活中一直在处理的事情,在某种程度上,我们都有不同的激励计划,我们要么受制于,要么取决于你可能强加给别人的情况,如果你教学生,你会想很多你实施的激励计划,以及那些计划的含义。

Dylan (00:16:52):
我还认为,如果你有员工,你会想到如何衡量他们的表现,这也会带来类似的问题。你可以思考不同测量方法的含义,以及人们围绕它们工作的方式。对他们想要的东西有一些默认的偏见,他们会稍微改变他们的行为。但在很多情况下,如果有人信任你,你可以让他们的行为朝着你想要的方向转变,而不必使用激励手段。激励机制非常脆弱,这是我的总结。有一种方法,你可以…你指定的目标中的一点点误差似乎会被放大。

耶雷米(00:17:41):
这很有意思。当你接近参数空间中的峰值时,你会说误差的放大,或者说误差越来越明显?我想,我试图想象这一点的方式,如果我在这里完全显而易见,请纠正我,但我在想象一个人工智能系统,它试图…基本上,它是一个优化器,它试图在参数空间中攀登一个高峰。我们希望这一高峰的顶点将与我们真正深切渴望的结果相吻合。

Jeremie (00:18:15):
我告诉我的 AI,我想让你让股票市场上涨。可能是我分配给它的最后一个功能。但我真正想要的是我希望它能让所有人都非常非常开心。

迪伦(00:18:27):
当然。

耶雷米(00:18:27):
最初在黑暗时代,当一切都是绝对的垃圾时,股票市场的顶峰似乎与让人们快乐不谋而合,因为从远处看,让股票市场真正高涨和让所有人真正快乐之间的差异相对来说似乎很小,但是只有当我们开始攀升时,我们才注意到,哇,这两个目标之间开始出现巨大的差异。这是一个准确的框架吗?

Dylan (00:18:54):
我认为这在某种程度上是存在的,尽管我不确定这是否有助于建立直觉。作为一个目标,让所有人快乐的一件大事是,有很多人甚至不同意你可以达成一致的方式来表达这意味着什么。比方说,我认为这带来了一层我们现在可能想要回避的复杂性。但我认为,如果你想象为了考试而教学,这是一种本质,在某种程度上,为 sat 而学习确实有助于你变得更聪明,或者在某些类型的数学方面变得更好。总的来说,有些事情你必须做得更好。但是一旦你达到了某一点,我认为大多数试图申请大学的人都会以某种方式达到这一点,除了擅长考试之外,为此而学习不会让你在任何事情上变得更好。

耶雷米(00:20:04):
是的。

迪伦(00:20:06):
我认为是那种感觉真正推动了这些事情。如果我们想思考人工智能系统,有一些非常明显的例子,我们实际上已经作为一个领域处理过了。对我来说,我觉得最大的一个就是过拟合。如果我们考虑什么是过度拟合,这是观察,嗯,你想优化真正的风险。虽然你没有真正的风险,但你有经验风险。在一段时间内,优化经验风险是有帮助的,过一段时间后,就没有帮助了,过一段时间后,它就变得与真实风险完全无关了。

Dylan (00:20:55):
仔细想想,我们在预测方面所做的大量工作都是为了应对和克服经验风险和真实风险之间的不一致。我们有关于收敛的定理,它告诉我们,这里有一类回报函数,我们假设可以通过从固定分布中抽取新样本来进行迭代采样,我们知道这类是朝着我们关心的目标的极限趋势。从这个意义上说,它是一组目标,最终以一种严格的数学方式趋向于你所关心的目标。

Jeremie (00:21:40):
这将在大量数据的限制范围内

迪伦(00:21:44):
完全正确。大量带标签的数据,这是一个非常重要的区别。

Jeremie (00:21:51):
是的,这似乎真的以一种有趣的方式把我们带到了你的一些研究中,我们受到带宽的限制,我认为公平地说,在我们与机器的互动方面,如果人类可以提供关于机器如何以超快的方式执行我们要求他们做的任务的反馈,那将是非常棒的,这样我们就可以确保他们做的每项任务都得到完美的监督,我们不能。我想很多研究都涉及到回答这个问题,我们如何能更有效地做到这一点?我们如何以更有建设性的方式让人类参与进来?你能稍微解释一下吗?

迪伦(00:22:30):
当然。我的研究是关于观察一个人和一个机器人在一个团队中工作。我认为,当我们做这项工作时,当我们看假设的代理人时,你必须做这件事,那就是围绕什么算代理人,什么算环境?我们对人工智能系统的许多建模和我们对它的许多思考方式,代理是某种机器人,它是某种预测系统。我的研究提出了这样一个问题,如果我们在人和机器人周围画一个盒子,会是什么样子?这是对一个特定类型的人类机器人系统进行建模,在这个系统中,你对真正的目标是什么,如何实际完成这个目标有部分信息,你必须通过某种嘈杂的渠道进行交流。

Dylan (00:23:23):
一个人可能采取的一般行动。这可能是你通过行为的示范来传达它,这必须在新的环境中被模仿。你也可以想象这是自然语言,或者是某种有标签的数据集。

迪伦(00:23:40):
我的研究着眼于如何将这些系统结合起来,从而有效地实现这些目标?现在,这实际上会是什么样子呢?我关注的一个特别的想法是一个叫做反向奖励设计的想法,我认为,它采用了我们使用的这种互动的最简单的版本,并试图在人类机器人如何互动中寻找一个额外的复杂层。

迪伦(00:24:09):
这里的想法是你观察一个奖励函数。你知道两件事,一是这个奖励函数实际上不是真正的目标。在某种程度上,它是错误的,也是一致的。第二,这是一个很好的信息来源,告诉你在任何时候应该做什么。

耶雷米(00:24:34):
好,但不完美。

迪伦(00:24:36):
正是如此。你实际上如何识别可能出现的错误类型?在这个问题上,你要做的第一件事就是认识到,就其本身而言,你无法回答这个问题。如果我只告诉你这里有一个奖励函数,它可能是错的,你不知道其他的,你对此无能为力。我在这项工作中所做的是,我们引入了度量环境的概念。您有一组现有的选项可供选择,并且您有一个度量标准可供选择。基本上,你对这个系统的承诺是什么,这个指标在这些环境或背景下导致良好的行为。

Jeremie (00:25:15):
好的。

迪伦(00:25:16):
现在,这给了你一些更有条理的信息。你能做的实际上是说,这个指标是一种指定不同行为排名的方式,我可以把它视为观察到的行为排名。由此,推断不同环境下新行为的可能性,或者更有用的是,计算出这些行为如何外推到新环境的分布,如果它非常非常紧密,你有很高的信心,哦,这是一个类似于系统设计者心目中的环境,所以我可以适当地表现。或者如果范围很广,你可以说,啊,这不好,我可能不应该过去。选择去获取更多信息,或者选择一个替代的,也许更安全的行动方案。

Dylan (00:26:12):
我们举了一个例子,我们称之为……在这种情况下,你有一个机器人试图在一些 2D 环境中行驶,你有一些不同类型的现象需要它去观察。想象一下,在你想要寻找的环境中,有一些东西就像一罐罐的金子。对于你心目中的环境,实际上有两种类型的地形,草地和泥土。有泥路,然后有草坪和其他东西,你希望它大部分时间呆在泥土上,找到这些物体,穿过草坪,在它必须去的地方。

迪伦(00:26:45):
现在,你可以通过收集这些地形类型的例子,你想去寻找的金罐的例子,训练分类器,然后指定一个使用这些分类器的奖励函数。

迪伦(00:26:59):
问题是,如果你忘记了你的机器人将被部署在夏威夷,那么实际上也有熔岩,一切都会变得混乱。你不会有一个一致的预测,它应该对熔岩做什么,因为根据你看到的数据,没有明确的暗示,或者可能没有。这完全取决于你所使用的学习算法的特征空间和偏差。但关键是,它在那种情况下做什么是任意的。

迪伦(00:27:33):
你会得到一堆指标,它们在没有熔岩的世界里会说同样的话,在有熔岩的世界里会说完全不同的话。这给了你一个想法,也许我的度量不太适合这个环境。

Jeremie (00:27:51):
这似乎给这个系统带来了一点谦卑和自省,让你先看看你的环境,然后说:“好吧,那么,我能在多大程度上将我的夏威夷经历映射到我的旧金山经历?”我猜,机器人或人工智能会基于此得出什么结论?它会不会倾向于说,好吧,我只是不打算采取任何行动,因为我不确定我是否处于一个新的环境中,这个环境与我以前看到的环境不太相符?还是留给开发人员做练习?

迪伦(00:28:27):
我认为以一种非常谦逊的方式,这是留给开发人员的一个练习。从这个意义上说,这不是我该说的。我认为,实际上,从这项工作中得出的一个重要结论是,作为开发者,你应该注意哪些事情?我认为,在这种情况下,数学上实际上漏掉的一件事,以一种非常好的方式,是指定当你太不确定时的回退行为。我不知道你的听众想要什么样的数学细节。

Jeremie (00:29:06):
是的,我想我们可能会保持合理的高水平,只是为了……但是如果你有-

迪伦(00:29:11):
我认为它的高级版本是……你认为人们会熟悉概率模型中可识别性的概念吗?或许吧?

耶雷米(00:29:29):
我还没有完全。也许我们可以从那里开始。

Dylan (00:29:31):
可识别性是指你能从数据中找出什么样的潜在变量?这方面的经典例子是,如果你有一个混合的高斯分布,这些高斯分布来自于……你有一些潜在的变量,它们是这些高斯分布的均值和方差。当你做聚类时,你观察这些数据,然后你拟合这些潜在变量。在无限数据的极限下,你可以证明你会平均识别出正确的均值和协方差。有了无限量的数据,你最终会到达那里。然而-

Jeremie (00:30:11):
这是……我能根据输出重建神经网络的参数吗,我的预测-

迪伦(00:30:17):
算是吧。问题是均值的值是可识别的,但它们在潜在变量向量中的排序是不可识别的。

耶雷米(00:30:29):
哦,对了。是啊。

迪伦(00:30:30):
在你的最终推断中,有一堆平行的假设会得到同等的权重。

Jeremie (00:30:36):
如果我错了,请纠正我,这在直觉上是有意义的,因为我可以想象,事实上,可能有无限数量的神经网络会产生相同的输入输出特性。

迪伦(00:30:48):
对。

Jeremie (00:30:49):
或一般功能。抱歉,我说的是神经网络,而是功能。

迪伦(00:30:54):
你可以使用这里的任何东西。但关键是,如果你有两个不同的潜在变量设置,它们在数据上产生相同的分布,你永远无法从观察中找出哪一个是实际情况。这是一个非常普遍的概念,被称为可识别性。这是一项研究,根据你的数据中假设的因果结构,你能发现什么?

耶雷米(00:31:22):
有意思,这似乎……这似乎指出了一个问题,我可以想象,比方说,两个不同的神经网络,其中一个给出了我想要的结果。最大化人类价值,或者不管我指的是什么,然后另一个是,真的很可怕,但我无法用我喂它的特定样本来检测。有可能存在一个任意大的算法集,其中大多数都是病态的,但是我只能在有限数量的样本上检查它们的行为,对吗?这是否说明了几乎是对齐的可验证性?

Dylan (00:32:05):
我认为这涉及到了一些问题,比如带有预测的“没有免费的午餐”定理,对吗?如果你问的是关于发行外性能的问题,在没有额外假设的情况下,我们没有给出保证的好方法。你知道这些假设在某些情况下会有帮助,但它们肯定比其他情况更有害。我觉得这只是同类的东西。

迪伦(00:32:28):
现在,我认为我的总体看法是理性,行为应该朝着一个目标优化的想法实际上是一种选择,它是一种工具,用于我们设计编译器,接受这些目标的表示,这些期望行为的表示,并进行交流。但我认为它不需要成为我们唯一的财产。

Jeremie (00:32:59):
还有哪些其他选择?

Dylan (00:33:01):
嗯,我认为首先要说的是,如果你考虑理性,它是某人写下的和客观的高级启发。事实证明,你能做的大多数行为都是愚蠢的。大多数神经网络不会做任何有用的事情。引入这种为完成某项任务而优化的思想,这种范式基本上建立在至少做点什么的启发中。这减少了程序的空间,你必须用它来表示你想要的东西。因为你不需要区分事情是如何解决的所有细节,你可以说,我们以合理的方式做这件事,或者试图优化一些目标。

迪伦(00:33:50):
我想你也可以说,我们并不真的想要一天结束时的纯粹理性行为,我们希望有更多规范的行为。我认为这是规范中应该包含的内容。你想想,我们默认不写直接优化经验风险的监督学习系统。在一些设置中,如果你有足够的数据,它是有效的,你仍然可以依靠其他物理属性来规范最终的行为。

Dylan (00:34:22):
在许多方面,我们确实依赖系统的计算约束来规范它们的行为。理论上,对于每一个 RL 环境,都有一个非常非常好的策略,就是以某种方式进行缓冲区溢出攻击,并在奖励计算来自的内存中写入非常大的数字,对吗?一方面,我们的系统不这样做的原因很明显,但很难解释。还不清楚在一组特定的权重中是否有简单的策略可以做到这一点。我认为我们有信心,实际上我们使用的优化技术的类型的属性意味着那不会是我们最终的结果。

耶雷米(00:35:23):
真的吗?好吧。因为我想为什么我们不用-

迪伦(00:35:26):
我不认为我们知道如何描述他们。我不认为任何人真的担心你正在运行的优化会以某种方式偏离轨道。

耶雷米(00:35:41):
是的。我看到人们探索缩放语言模型的可能性,例如,作为潜在的风险因素,就像 GPT 10 或其他什么,你不断地让神经网络变得更大更深,它从学习低级别的抽象开始,学习基本的如何把字母放在一起等等,最终学习语法等等,然后最终开发出某种世界模型。这个模型可能最终会包括对模型在世界中的位置的认识,可能会说,哦,看那个,因为它对预测句子中的下一个单词是有用的,我会意识到,嘿,我实际上是嵌入在这个世界中的,因此随之而来的,开始变得贪婪…有各种各样的[听不清 00:36:31]

迪伦(00:36:31):
对,这就像改变世界,以便更容易预测下一个单词。

耶雷米(00:36:38):
对。我想这和你一直在谈论的是代理人和环境之间的区别。这将是算法意识到的时刻,嘿,我嵌入在这里的环境中,是时候开始模糊这些线了。

迪伦(00:36:56):
我认为这些观点都值得认真对待,但也很难反驳。我认为这是值得认真对待的事情,你应该给他们带来适当程度的怀疑,我认为是这样的。例如,有一个假设,基本上,如果唯一的字符是一个…好吧,让我这么说吧,我们有很多经济学的例子,理性行为是怪异和违反直觉的,从根本上说,不是人类,我认为在很多方面,对吗?经济人是一种不同类型的存在。

Dylan (00:38:00):
我认为,如果你对人工智能系统的唯一假设是,它们是具有任意效用函数的经济人的实例化,那就不好了。你最终会有不好的结果,因为你在假设一个场景…我认为,基本上,根据假设,你不会做得很好。

耶雷米(00:38:30):
真遗憾。嗯,我想从定义上来说,几乎不可能找出确切的位置……如果我们能找出那个假设失败的地方,我们就会知道更多的事情。但在我看来,“经济人”不起作用的原因是,进化给我们设定了需求和欲望……嗯,我们不是随机的,而是与经济激励非常不一致。我们想要做一些事情…有时,我们会嫉妒别人。在人类存在的病理模式中,如果我们变得报复或其他什么,我们有时会把别人的痛苦看得比自己的幸福更重要,这就打乱了整个模式。

Jeremie (00:39:16):
我想,在机器学习模型的情况下,或者说,深度神经网络,本质上不受那些进化条件的限制,我想你可能会说,它正在经历一个进化优化的过程。也许那-

迪伦(00:39:37):
我认为没有人能告诉我,我们无法找出如何编写符合这种行为特征的程序,或者由最佳或理性代理或类似的东西很好地建模的程序。我当然不是说我认为那是不可能的。我并不是说我认为如果我们真的建造了它,我不认为它在很多方面是好的。我认为有些人可以通过存在风险来讨论这个问题。我认为你甚至不需要真的去谈论那种事情会导致的非常糟糕的结果。

Jeremie (00:40:30):
我完全同意。这是……说得清楚一点,当我们开始谈论爆发风险之类的事情时,我实际上把这框定为一个极端或者认为这是一个极端危险的结果类别。是啊。

Dylan (00:40:42):
但我认为……我认为人工智能系统或人工智能研究的结果应该是这样的。像这样的争论需要迈出一步,也就是说,这是未来人工智能系统的模型。我想,如果你还同意我的观点,关于这个编译器的类比,在这个过程中的某个时刻,在构建这些系统的过程中有一个创新,那就是引入这些最佳行为的模型,并且说,我们应该让我们的编译器更有可能输出一些至少是有用的东西。这对人工智能研究和人工智能系统的进步非常有用。但这并不意味着我们必须推动这条研究路线直到最终完成,也不意味着人工智能系统必须朝着个体理性经济主体的方向努力。

迪伦(00:41:44):
坦白地说,我认为有很多人想要建立这样的系统,我认为这并不好。我认为这源于某种类型的思维定势。但是我觉得不是必然的。我认为这是一个选择,实际上,我认为审视这些关于风险的争论的结果是,什么是正确的方向,什么是有用的选择?

迪伦(00:42:10):
这是我真正感到有希望的地方,因为我们现在试图在世界上部署人工智能系统时遇到的问题,在某种程度上,就是这些类型的问题。它们不一定是预测误差的问题,尽管我认为你可以说它们是这样的。但是它们的问题是,不能恰当地表示许多重要设置的目标的最小可行产品,并且不能产生训练有素的从业者来做深入思考这些目标是什么的艰苦工作,作为在机器学习系统内表示它们的过程。

Jeremie (00:42:55):
我完全同意,如果我们能够避免人们盲目地转向这种超级刺激的模式,那就太好了。我想我的担心是,从经济上来说,似乎在那个方向上有一个强大的强制功能,如果我们举个例子…好吧,这个超级放大的深度神经网络的玩具例子比我们曾经建造的任何东西都更庞大,那些试图制造的人,我不会把它叫做 GPTN,因为这听起来好像我在挑选开放人工智能。我认为他们考虑到了很多风险。但是,有人试图让那个巨大的模型看起来像什么,实际上可能…他们可能不会试图过度拟合。他们可能试图尽最大努力,想出一个合理的损失函数,产生一个真正强大的模型,但不知道,在什么样的训练水平上,模型决定在什么样的抽象水平上爆发?

Jeremie (00:43:57):
他们甚至可能带着一种安全意识的心态来对待它,但是因为我们没有办法真正预测抽象飞跃将在什么点上发生,所以朝着那个方向推进本质上是危险的事情。

迪伦(00:44:13):
对。明确地说,我并不同意物质层面上的这种担忧。我认为我们可以担心这是一个问题,我还没有看到任何真正的论据使我相信这不太可能发生。我认为有直觉的争论,有人们对可能发生的事情的感知,无论是建立系统的经验还是其他方式的直觉。但我不认为有任何实际的,坚实的论据可以让我相信这不是一个问题。

迪伦(00:44:59):
坦白地说,如果它存在,并且有人知道它,我很乐意看到它。我认为我的观点是,同时,我认为我们可以认识到这一点,认识到这是一个挑战,然后也想知道什么是更严肃的证明形式,这是当前系统需要关注的问题?我看到的所有暗示风险的论点,都是四种不同的方式,比如……我们会谈到突破之类的想法。这并不是我试图思考这些事情的方式,因为我不知道如何使这个想法精确,我不知道如何定义这个想法,我不知道如何用这个表达做任何有用的事情。

迪伦(00:45:48):
同样,如果有人能够找到一种好的形式主义,一种好的方式来表现它,为它建模,我认为这很好。但我不确定它是从哪里来的。它的论点依赖于理性行为作为你的人工智能系统如何运作的公理。声称它会爆发,因为那对目标更好,因为你在系统中有它的表示。一方面,我认为这是真的,如果你接受这样的假设,即把它建模为经济人是好的。但是,我也想知道,好吧,有没有其他的假设真的会导致这样的结果?从数学上来说,有没有方法来构建实际上并不纯粹优化其目标的系统?

迪伦(00:46:42):
我认为在实践中,这肯定是正确的。我们有正规化。我们可以训练最大限度地利用经验数据集的东西,来预测导致这种情况的数据的真实分布,我们可以根据数据集的大小来调整它。这是你必须做的事情。没有人能告诉你将正则化参数设置在什么数字或特定的细节,但我们认识到这是一个问题,我们知道克服它是构建人工智能系统的核心部分。

Dylan (00:47:16):
我认为有一种完全相同的东西可能会出现在更高的抽象层,这与好吧,在监督学习的情况下,你想尝试模仿的实际人类认知过程是什么?在这里,作为从业者和领域,我们非常,非常偏向于什么是可用的,而不是我们需要什么?

Jeremie (00:47:44):
对,我想这是所有这些系统的普遍问题

迪伦(00:47:48):
我想是的。

Jeremie (00:47:49):
是的,有趣的是,系统的安全性与其整体能力之间存在很大的相互作用,因为能够充分利用神经网络的所有能力来实现某个目标是一件很棒的事情。但最终,无论何时我们谈论安全,那都意味着强加某种约束。当你开始放开束缚的时候,你冒险进入-

迪伦(00:48:16):
我几乎会质疑这个假设。从这个意义上来说,好吧,如果我们可以假设一个完美的世界,你会想从系统中挤出最后一点性能。但是有一句关于优秀员工的沃伦·巴菲特名言。这是,你想要的人有一些…我肯定我理解错了,但这就像你想要的人有智慧,勇气和值得信赖。如果他们没有最后一个,要注意前两个。

耶雷米(00:48:49):
是啊。

Dylan (00:48:49):
我认为这在实际意义上确实适用,不是对遥远的系统,而是对当前的系统。你可以接受,除了…例如,如果你现在去 YouTube,你告诉他们,“我有一个方法让你…你在预测某人点击这个视频的可能性方面会做得更差,但我可以向你保证,它不会对青少年的福祉产生负面影响,正如研究所 A、B 和 c 所测量的那样。”

迪伦(00:49:33):
如果你去找他们,并且能够具体说明,我认为这是一件非常有价值的事情。这是你无法通过简单地重新标记你所拥有的数据来解决的。你也许可以通过从根本上重新设计人们与你的视频推荐系统之间的互动类型来达到这个目的。但是,有一个问题,他们想解决,但他们无法解决,他们无法指定,我认为,有效利用这项技术的障碍并没有真正提高预测性能,但实际上提高了轻松指定目标的能力。

Jeremie (00:50:23):
对,我想是这样的。这就像因为您还没有指定您想要的精确优化目标,所以您被迫采取措施来限制系统整体的行为,使用更粗粒度的工具。基本上就是找个锤子稍微敲打一下你的神经网络。

迪伦(00:50:47):
我认为这是对的。比方说,你有一大堆行为,包括神经网络的不同参数化,你试图找出如何选择正确的行为,这是一个人无法独自完成的事情。我们发现,指定某种度量标准,然后优化这些预测损失是一种很好的方式,可以真正剔除一大堆糟糕的权重配置。

耶雷米(00:51:22):
是啊。但仍然不是全部。

迪伦(00:51:27):
但不全是错误的,事实证明,如果你过于专注,那么你很有可能以不同的方式出错。在这个范围的一端,你有无用的随机行为,在这个范围的另一端,你有…在概率为 1 的情况下,你可能实际上没有你想要的行为。

Jeremie (00:51:50):
这是…事实上可能不存在客观损失函数或客观函数,而是人类可能希望优化的概念…我不知道,对于相信人工智能绝对主义或人工智能最终将做好一切的人来说,这有点令人担忧。

耶雷米(00:52:14):
例如,山姆·哈里斯有本书,名为《道德景观》,他在书中谈到,从本质上讲,他认为自然界中存在一种客观的功能。但是每当有人以这种方式谈论道德时,对我来说似乎总是不够明确。你认为它们实际上可能是我们可以优化的东西吗,我甚至不知道我要在这里说什么,让人们快乐,最大限度地促进人类繁荣?

迪伦(00:52:42):
我不一定认同那套关于事情最终会如何发展的信念。我感兴趣的是,我们可以建立什么样的系统来重建人类社会中的一些激励平衡,并将其整合到一般的人工智能系统中?我认为,在某种程度上,这是一个问题,作为人,我们可以用什么样的过程来讨论这些事情?在某种程度上,我不知道,试图复制我们作为一个物种建立和设计的过程,以规范群体行为和协调我们自己的规模?

迪伦(00:53:37):
我认为有这样一个方面,我们发现了如何平衡我们个人以及社会和结构中的许多不同激励因素。有很多方法可以得到一个可信任的第三方或者有一个代理的想法。代理人已经是一份工作,有人可以做你的代理人,你可以雇佣房地产市场的人做你的代理人,代表你的利益。这不是凭空出现的,有人发明了这种方法来管理世界的复杂性。

迪伦(00:54:16):
我们也可以用人工智能系统来做这件事。我们需要弄清楚那看起来像什么。在脸书上设置你想看什么类型的内容,什么时候你想看不同种类的东西时,你的代理是什么,可以被信任来代表你?

Jeremie (00:54:34):
在一个机器人和机器正在做如此复杂的事情,以至于人类甚至无法理解这些决定的含义的世界里,你认为这种机器人与人类互动的画面能够保持下去吗?

迪伦(00:54:54):
我认为这是一个非常棘手的问题。我认为更通俗的说法是,你如何在适当的背景下向人们展示信息,给他们最好的方式去做他们能做的决定?这包括,你如何提供一个适当的背景来说明这个决定的后果是什么?

耶雷米(00:55:21):
对。

迪伦(00:55:23):
那是我们不知道如何去做的事情。我一直在思考价值定位与推荐系统的关系,尤其是像 YouTube 和脸书这样的内容推荐系统。这就是为什么我似乎总是回到那些例子。这是原因之一。但是我们不太擅长弄清楚如何让人们进入一种状态,在这种状态下,他们可以反思他们想在互联网上从事什么类型的事情。我对这个问题的看法是,我们确实可以想象遥远未来的可能系统,并谈论它。但实际上,这就像是,好吧,对于一个新存在的事物,这是一种通过算法过滤和选择的奇怪类型的内容提要,什么是…大多数人甚至不知道这是什么的适当术语,什么是推荐,当我出去,偶尔跑步时,这对我来说真的很有趣…这种情况不再经常发生了。但是你偶尔会碰到人。我会经常询问他们的建议。

迪伦(00:56:38):
每个人都有不同的理论来将他们获得的推荐或排名拟人化,以及他们了解了什么以及如何运作。他们总是深信不疑,他们通常在某些方面是错的,这没什么,因为没有人-

Jeremie (00:56:55):
我肯定我的会是,是的。

迪伦(00:56:56):
幕后实际发生的事情非常复杂。作为一个不在这两家公司工作的人,我真的不知道幕后发生了什么。事实上,有些东西就像你的信息过滤器,或者这个排名算法,它选择你看到的东西,这对你将成为的人,你将拥有的新闻消费类型,你应该关心什么样的事情有影响?你应该关心平衡,公平吗?这里有一大堆不同的价值观,你可能会关心它们在那里的表现。

迪伦(00:57:32):
真正的问题是,你如何开始这样的对话?你如何…这是公共教育的结合,帮助人们知道实际上存在一个问题,并围绕提供背景设计系统,帮助人们认识到他们应该解决的问题,帮助他们认识到你实际上要求他们做的认知工作的价值。

迪伦(00:57:54):
我认为一个很大的讽刺是,你实际上拥有大量的工具和控件。看到人们在 Twitter 上说他们希望 Twitter 有一种方法可以更少地看到事情,这非常有趣。我在 Twitter 超级用户、有复选标记的人和许多关注者等身上多次看到这种情况。事实是 Twitter 有这个功能。它在那里。我不知道它在那里多久了,但它在那里。问题是,没有人知道它实际上会做什么,或者如何相信它将来会真正帮助他们。

Jeremie (00:58:33):
我想,这也是一个有趣的问题,即使你完全知道这个推荐系统是如何工作的,你完全知道所有的东西都是开源的,你仍然会有一个非常复杂的道德问题,那就是你想成为什么样的人。我可以看到 YouTube 上的一个视频,它有可能让我变成一个聪明的…我不知道,就像一个海洋生物学家,我可以跟着那个兔子洞,继续跟着视频。

Jeremie (00:59:05):
公平地说,我可以看一系列的视频来证明这一点。但是,如果我面临这个选择,或者另一个把我带到机器学习工程师那里作为最终状态的选择,或者一个把我变成纳粹、共产主义者或者其他什么的选择,我能知道我想要成为哪个版本的我吗?我不知道未来版本的我会希望我成为谁,如果他们知道所有不同的未来版本的我想要什么。我都不知道这是怎么回事。

迪伦(00:59:37):
这是你进入一些非常复杂的哲学的地方,你可以谈论思考它的方法。除了我自己,我当然不是回答这些问题的合适人选。但我认为,我认为大多数人都会同意的观察结果是,回答这些问题是很费力的。回答我想成为什么样的人这一问题,需要一项基本的认知工作。

Dylan (01:00:14):
在某些方面,你必须弄清楚如何设计系统来克服,而不仅仅是你不知道那个人想成为谁的信息问题,或者更具体地说,他们想看到什么内容,这与他们想成为谁有关。事实上,你可以影响这一点,如果你只是不能影响某人…说,我不会影响某人明天是谁,基于我给他们看的东西。同样,这可能是你真正想要的东西。但是作为一个推荐系统的设计者,你不知道那是什么。但除此之外,这个人通常不知道这个问题的答案,也许甚至不知道如何真正进行这种类型的对话,或者不喜欢这种类型的思考,即我想成为什么样的人,这是一种特殊的思维方式,但不是每个人都喜欢参与。或者对我来说,我认为这是有代价的,对不同的人来说有不同的代价。

迪伦(01:01:18):
当人们只想在一些猫视频中消失一会儿时,你如何说服他们去经历这个代价高昂的过程?

Jeremie (01:01:25):
是的,绝对是。

迪伦(01:01:27):
与此同时,很明显会有巨大的正外部性。如果我现在可以为社会挥舞一根魔杖,那可能是让每个人每周安排 15 分钟来反思他们如何消费信息,以及他们想要消费的信息类型。然后花五分钟做一些让他们成功的事情,以此为基础。我认为,如果每个人都这样做,这对社会来说将是一个巨大的正外部性,因为你的个人信息消费将会发生个人变化。

Dylan (01:02:09):
但这实际上改变了整体,实际上引导并包括了某些类型的认知过程,从而引导了人们的信息饮食。

Jeremie (01:02:25):
我无法释怀…例如,我最有效率的日子总是那些我不在 Twitter 上度过的日子。毫无疑问……现在的感觉是,我们不得不离开去处理信息的时间,相对于我们花费在消费信息上的时间,这种平衡在过去的 10 年里完全颠倒了。过去,你会在一天中看到一个大新闻,你可能会花一整天的时间来咀嚼它,也许会和几个人谈论同一个焦点故事,在这种情况下,故事的可靠性更重要。而现在只是不停地输入,输入,输入,几乎没有时间进行认知处理。事情发生方式的有趣转变。

迪伦(01:03:12):
如果你的世界信息更加稀缺,或者更难获取,这要求你实际上…这听起来有点傻,但如果你不得不选择去拿一份报纸,这种行动和选择会让你有点投入,它会让你进入一种略有不同的状态。然而,如果你只是想抽离……如果相反你要从那里获取信息,我不知道还能做什么,有一卷东西可以分散注意力。那是完全不同的事情。

杰雷米(01:03:40):
说到这里,我想假惺惺地问一下,你是否有一个 Twitter 链接可以分享,是否有人想关注你,看看你的更多作品?

迪伦(01:03:49):
是的,当然。我是 dhadfieldmenell。名字的首字母,姓氏,没有标点符号或任何类似的东西。我不能保证经常发微博。实际上我现在正在休息。但我肯定会发布论文更新,我倾向于偶尔发关于人工智能伦理和一般价值一致性主题的推特。

耶雷米(01:04:13):
真棒。非常感谢您抽出时间,今天的讨论非常精彩,几乎囊括了所有内容。所以,我真的很感激。如果可以的话,我们会在播客附带的博客中发布一个链接,链接到你的 Twitter 和你的学术网站。

迪伦(01:04:26):
是的,那太好了。非常感谢。这是一个真正的机会,我很高兴有机会和你们交谈。

人类——你的人工智能战略中的薄弱环节?

原文:https://towardsdatascience.com/humans-the-weak-link-in-your-ml-ai-strategy-657fc2a5d94e?source=collection_archive---------85-----------------------

在许多情况下,需要部署机器学习来增强人类的决策,而不是使其自动化。您如何解释这种对数据产品成功的依赖?

AI 承诺了很多事情。

其中之一是有可能降低人类从事某些类型工作(如分析)所需的 LOE。事实上,它不仅减少了它,而且它还可以远远超过这一点,实现人类无法做到的分析类型。

如果您的团队能够找到这些统计模式,您就可以优化支出、节省运营成本、检测异常、注入智能、知道向谁推销最新的小部件,等等。统计数据。数据。分析。工装。要做到这一点,需要大量预算、大量数据争论和基础设施。

打鼹鼠。

问题是,你可以把所有的技术都做对(假设你不只是用 ML 代码把你的数据或组织中现有的偏见和问题编成代码),但是如果技术要求人类正确地用它做决策,并把它集成到业务中,你仍然会失败。

许多地方还没有准备好完全自动化,将人类从所有的决策中移除。甚至中央情报局现在也专注于用机器学习来增加决策,而不是用 ML 来自动化一切。

所以我们又回到了人类是技术成功的一个变量——一个很大的变量。AI 或者其他。

仅仅因为你可以建模并不意味着你应该这样做,或者如果你这样做,它将保证组织将释放承诺的价值——因为仍然有人类参与的部分。

这一部分可能不在您的技术清单中,但如果您将人的因素视为 it 投资的一部分,它可能应该在。

设计让我们问,人类会使用它吗?信任它?看重吗?明白吗?他们有动力吗?如果这是错误的,他们个人(或他们关心的外部社区)会付出什么代价?

最后一英里——人类参与的地方——可能是你的人工智能下沉或游动的地方。

那么,在你的人工智能战略中,500 万美元、5000 万美元或 5 亿美元中,有多少将用于确保系统中人的部分不会崩溃,即使技术部分没有问题?

Git 上没有神奇的数据或包可以帮你做到这一点,但是好的设计可能会有所帮助。


如果你是一名数据科学、分析或技术产品负责人,正在寻找如何用你的数据创建有用、可用的决策支持应用程序的一步一步的过程,我的研讨会——设计以人为中心的数据产品——将教你可以立即应用到工作中的技能,以便你的数据 输出 开始产生业务 成果

照片由托马斯·斯蒂芬在 Unsplash 上拍摄

数百家公司正在用我的 Cookie 数据开派对,而我没有被邀请

原文:https://towardsdatascience.com/hundreds-of-companies-are-having-a-party-with-my-cookie-data-and-i-wasnt-invited-e7f70837b27?source=collection_archive---------58-----------------------

图片由 Master1305

随着新法规的出台,产生了一种新的数据类别,赋予个人对其数据的权利,例如,从存在数据的平台请求其数据的权利。

此类个人数据权利在逻辑上包括您使用的平台。此外,这些个人数据权利也延伸到拥有您数据的服务提供商和平台,即使您与他们没有(已知的)关系。

让我们从 cookie 的角度来讨论这些问题,尤其是第三方对 cookie 的数据使用和数据处理。为了检验这一点,我们使用了从 Quantcast 获得的数据,根据维基百科“专门从事人工智能驱动的实时广告、观众洞察和测量。该公司声称,它拥有超过 1 亿个网络目的地的受众测量数据。

第三方饼干派对— 完整视频点击此处

需要注意的是,cookies 以及与 cookies 相关联的数据往往来源于浏览行为而非个人数据。我没有发现任何个人身份数据(姓名、地址、SSN 等)。)在其中描述的数据集中。

您可以要求 QuantCast 在 CCPA(如果您在加州)或 GDPR(如果您在欧洲)提供您的个人资料的副本在此。提交您的请求后,Quantcast 将在 AWS 上为您提供一个 S3 桶,以便在他们处理您的请求后检索您的数据。在我的案例中,他们花了 30 天才完成。

在这篇文章中,我将分析 QuantCast in 收集的关于我的数据内容。我不会讨论其中包含的用例,而是将重点放在使用内容作为整个行业的风向标。

Quantcast 的数据申请表。

作为补充说明,在请求访问您的数据时,QuantCast 不会要求您告诉您是谁,也不会向您提供任何个人详细信息来识别您的身份。鉴于他们正在追踪你浏览器中的“MC”cookie,他们已经知道你是谁了。这无疑定下了基调。在这篇文章中,我将在一个浏览器中检查我收到的与一个 cookie 相关的数据。

查看您在哪里被跟踪,您的数据在哪里,想知道它为什么在那里,我们是否应该有一些跨部门强制实施的开放默认设置

30 天后,AWS S3 链接提供了一个档案下载,其中有一个简单的文本记录结构和一个概述 Quantcast 提供的数据的 PDF,并附有一些简单的图例和解释。这些解释对理解内容很有帮助,而且写得很好,否则内容可能看起来像任意的字符串。

归档包含以下文件:

  • Audience-grid —关于您如何被第三方划分到一个组中的数据,以及与该划分相关的第三方数据处理;
  • 观众链接——同上;
  • 数据描述 —这是解释该档案内容的 PDF 文件;
  • 人口统计数据——这解释了 Quantcast 对你个人的粗略描述,它包括四个维度:家庭中的孩子、收入、性别、位置和教育;
  • 历史存储 —包含您的个人数据,以及这些数据在个性化广告、个性化内容交付和预测分析中的处理方式,包括历史记录、时间戳、可用的使用位置;
  • Keebler —已经创建的第一方(本例中为 QuantCast)片段,其中您的浏览器是组合在一起的一组其他浏览器的一部分。

我的直接观察是,在提供的 30 天时间内,我的浏览器中有 15,836 条跟踪此“MC”cookie 的记录(这可能是他们的 cookie 到期时间,整个行业的中值生命周期约为 30 天)。我想知道这是不是很多:30 天内 15,836 条记录?这大约是每天 530 例。我想知道在这个浏览器上我是否访问了更多的页面,是否仅仅是因为我在所有页面上都被跟踪了?这似乎是合理的。

有一些特定产品、服务提供商及其数据段的有趣案例(Datalogix:购物兴趣:心理学和生活方式:夏季季节性购物者:NASCAR Superfans)。在对我进行了那种类型的描述后,我不确定我是否会信任 Datalogix,但这可能解释了为什么我会看到一些向我宣传的内容。

外卖食品

这种类型的数据至少可以带来三点有趣的启示:

  1. 在您身上生成的数据配置文件的类型。如果准确,它们可能是有帮助的,如果不准确,它们可能是令人不安的,甚至是自我延续的(看到一辆赛车,点击一辆赛车,获得更多的赛车内容,即使对你没有帮助);
  2. 这种剖析在互联网上发生,并且这种剖析可能是未知的、无保证的或不需要的;
  3. 什么类型的广告链接到什么数据档案或产品,以及它们在哪里显示。这实际上可以让你追溯到你看到的内容位置上的一些大问号,并推导出它为什么会出现。

数据本身还特别提到了 GDPR 的同意以及 GDPR 是否适用(例如,由于访问的位置)。没有提到其他类似的政策,如 CCPA。

关于第三方数据共享和处理的说明

在本例中,用户(我)与 QuantCast 没有已知的关系。然而,我可能在某个时候接受了“MC”cookie 的使用。除此之外,我可以在“观众链接”文件的日志中看到,我的数据已经由 Experian 提供给了 Quantcast,我想这是为了丰富信息。当然,不仅仅是 Experian,还有 AnalyticsIQ、Ixi (Equifax)、Oracle、Datalogix 等公司,以及其他许多公司。

阅读他们对我的分类和简介也很有趣。鉴于我对“斯沃森”的代号一无所知,我不会在这里列出太多的这些部分,除了说我被描述为“复活节糖果买家”、“Bravo 网络爱好者”、“瓶装水”爱好者和“奢侈护发”。作为一个为了更有效率而开始剃光头的人,这些都不太可信。

我的结论

似乎这些公司对我的数据比我更感兴趣。我很高兴至少我能看到正在发生的事情,但作为一名数据极客,我想参与其中。

有些公司以跟踪和分析用户的在线行为为生。作为一种媒介,它们有助于了解您的哪些个人数据被跟踪,以及这些数据被用于何处。我们认为有机会为开放协作和公共领域的不同用例设置数据共享的默认值,通过查看数据使用情况,我们可以看到并提出数据共享的开放标准,以便一起讨论和完善。

cookie 是一个重要的数据源和网络,但随着第三方 cookie 在 2022 年的减少,我们看到了市场的空白,这可能是零方数据或用户控制的 cookie的机会。

许多个人数据被锁在筒仓中,因此我们在 Prifina 进行研究,探索和创建自动检索这些数据的方法,使其对个人和开发者有用。你可以在Prifina——你的数据页面上看到更多这样的数据平台,上面有关于如何检索和探索你自己的个人数据的说明。

这个数据集暴露了十几个不同类型的服务提供商,以继续解开第三方数据共享和数据处理。处理一个数据请求的成本大约为 1,400 美元,我正在考虑很多$$$的理由来简化和构建请求处理过程,以便我可以通过 API 或类似的方法 ping 它。去吧,我等着。

具体谈一下这篇文章中描述的 cookie 数据以及与之相关的第三方网络,它如何对创造新产品有用?对你刚刚看到的广告进行逆向工程?你能想到什么类型的用例?关于这个看似不可见(对用户而言)的 cookie 数据网络,您有兴趣了解什么?

你的数字双胞胎一直在世界各地忙碌。让他们为你工作。

基于混合规则的机器学习

原文:https://towardsdatascience.com/hybrid-rule-based-machine-learning-b15abc7d7bbe?source=collection_archive---------52-----------------------

图片由 You X Ventures 在 Unsplash 上提供

混合基于规则的机器学习和 scikit-learn

由卢卡斯·哈斯 — 10 分钟读完

TL;scikit-learn 博士不允许您将硬编码的规则添加到您的机器学习模型中,但对于许多用例来说,您应该这样做!本文探讨了如何利用领域知识和面向对象编程(OOP)在 scikit-learn 之上构建基于混合规则的机器学习模型。

照片来自 Pexels 的 fauxels

揭开魔法:解读机器学习黑盒模型

到 Fabricio Pretto — 15 分钟读取

在使用黑盒模型时,预测能力和可解释性之间的权衡是一个常见的问题,尤其是在必须向非技术受众解释结果的业务环境中。可解释性对于质疑、理解和信任人工智能和人工智能系统至关重要。它还为数据科学家和工程师提供了更好的方法来调试模型,并确保它们按预期工作。

照片由 Kyle Glenn 在 Unsplash 上拍摄

生产中的深度强化学习第 2 部分:个性化用户通知

由迈赫迪·本·阿耶德和帕特里克·哈琳娜

在这篇文章中,我们将讨论如何使用 RL 来个性化通知,并提高 Words with Friends Instant 的点击率。它作为一个例子来说明构建 RL 应用程序需要什么,以及为什么 RL 如此强大。

图片来自 NeONBRAND 的 Unsplash

理解转置卷积

由宽尾 — 11 分钟读完

生成对抗网络(GAN)是用于新数据生成的最先进的人工神经网络之一。它广泛应用于照片生成、照片编辑、人脸老化等领域。GAN 的核心是发生器和鉴别器。

基于混合规则的机器学习与 scikit-learn

原文:https://towardsdatascience.com/hybrid-rule-based-machine-learning-with-scikit-learn-9cb9841bebf2?source=collection_archive---------9-----------------------

使用领域知识,通过硬编码的规则来扩充您的 scikit-learn 模型

图片由 You X Ventures 在 Unsplash

TL;DRscikit-learn不允许你将硬编码的规则添加到你的机器学习模型中,但是对于很多用例来说,你应该!本文探讨了如何利用领域知识和面向对象编程(OOP)在 scikit-learn 之上构建基于混合规则的机器学习模型。

介绍

有监督的机器学习模型非常适合在不确定的情况下进行预测;他们从过去的数据中提取模式,并将其准确地推断到未来。机器学习已经推动了一些领域的发展,在这些领域中,确定最可能的结果(无论是类还是特定值)一直具有挑战性,容易出错,或者在规模上过于耗时或昂贵。

然而,在许多领域中,所有可能的结果都不是模糊的,而是根据定义确定的。您可能会遇到嵌入在特定于业务的流程或法规中的规则。在这样的环境中,让 ML 模型使用隐式学习来渐进地猜测预先制定的规则似乎是低效的。相反,我们希望模型关注所有不存在预定义规则的情况。

在本文中,您将了解到将预定义的领域规则合并到机器学习模型中有许多好处。为了获得更多的实际操作,我们将为 scikit-learn 估算器构建一个简单的包装器类,它考虑了显式规则,并让模型来解决困难的情况。

如果您不能等待,请跳到 Python 中的完整文档实现。

领域知识的重要性

任何好的机器学习项目都是从领域知识的聚合开始的——收集关于业务问题的相关信息和专业知识的过程。通常,我们与行业从业者交谈,在线研究,并进行数据探索,以揭示有助于机器学习模型构建的特定趋势、模式或提示。

领域知识非常有用,原因有很多:它帮助我们平衡涉众的需求,理解我们的目标受众,但最重要的是,它给了我们关于特性工程的重要线索。虽然在试图识别照片中的猫时,这些线索是不言自明的,但在许多行业领域,如法律、保险或医疗诊断,特征工程远非直观。

为了说明这一点,假设您的目标是为一家电信公司建立一个 ML 模型来预测客户流失(计划取消率)。在设计和迭代可能的功能之前,收集该领域专家关于影响流失因素的意见当然会有所帮助——保留部门是一个合理的起点。保留部门甚至可以用数据来支持他们的观点,使用客户调查来揭示具体的痛点。在任何情况下,数据和行业从业者都可以为您指出正确的方向,节省时间,并可能揭示以前未考虑的数据源和功能组合。

如何从领域知识中获取规则

在许多工业领域中,您可以从已经存在的过程中推导出简单的确定性规则。例如,在特定的法律诉讼中,名誉损害索赔可能永远不会被批准,因为法律只是这样规定。同样,保险公司可能不会支付低于 1,000 美元的损失索赔,因为根据与被保险人的合同,他们没有责任这样做。如果我们想预测诉讼结果或保险损失,这种简单的规则可以直接构建到机器学习模型中,以提高性能。

由于机器学习在解决模糊和具有挑战性的情况方面非常出色,因此只有在确定性规则适用于每种情况并且不太多也不太复杂的情况下,将确定性规则纳入模型才有意义。然而,还存在其他用例,所以我整理了一个完整的列表,列出了您何时可能想要考虑部署混合的、基于规则的模型:

  • 预测过程的确定性规则已经存在 如前所述,根据您试图预测的内容,评估过程的确定性规则可能已经存在。如果规则很简单,适用于所有情况,并且总体上没有太多规则,将它硬编码到机器学习模型中可以保证你已经可以非常准确地预测一部分情况。
  • 缺少特定类型预测案例的数据 在某些类型预测案例的数据稀疏的情况下,您的模型可能很难开发出正确的隐式规则来正确分类或估计数据点。如果模型不能仅从其他特征准确推断目标变量,通常会出现这种情况。在上面的法律示例中,可能有不常见的索赔类别,如费用报销,对于这些类别,只存在少数数据点。由于索赔类别对于确定诉讼结果至关重要,因此在没有进一步了解报销索赔的情况下,该模型不可能正确预测诉讼结果。在这种情况下,通过简单地预测该类别所有实例的平均目标变量,例如所有费用报销的平均成功率,可以提高性能。
  • 高特征基数
    高特征基数(一个特征可能值的数量)是几乎所有机器学习模型的问题。特别是对于需要编码的分类数据,大量的唯一可能值会影响模型性能。因此,如果存在适当的经验法则或统计参数,逼近目标变量可能会产生有吸引力的折衷,因为它会使剩余数据具有较低的基数以帮助模型训练。
  • 积极对抗数据中的偏差 机器学习预测天生就有偏差,因为我们的训练数据中反映了真实世界的模式。在某些情况下,我们可以通过自己处理问题和硬编码覆盖模型行为的规则来防止有偏见的预测。

如何将确定性规则硬编码为逻辑公式

如前所述,机器学习模型隐式地学习规则。这种学习的集大成者是基于决策树的算法,如 scikit-learn决策树分类器GradientBoostingRegressor,后者是决策树的集合。

基于决策树的算法试图通过学习从提供的数据推断出的决策规则来预测目标变量。决策规则本身非常简单;它们是只使用基本逻辑操作符=、、≤、≥对数据进行的一系列分割。然而,所有的分割只是近似任何明确的规则,因此可能不准确。

我们可以使用相同的方法来构建简单的确定性规则作为逻辑公式,这样我们就可以将其翻译成代码。例如,让我们再次假设我们想要设计一个预测模型来估计一家保险公司的总损失,并且我们知道该公司拒绝小于或等于 1.000 美元的索赔。对该规则进行硬编码的一种方式是:

if claim_amount <= 1000:
   # reject claimelse:
   # use machine learning model

让我们开始编码吧

有许多方法可以将确定性规则集成到我们的机器学习管道中。作为数据预处理步骤逐步添加规则可能看起来很直观,但这不符合我们的目标。优选地,我们的目标是通过采用面向对象编程(OOP)来利用抽象的概念,以生成一个新颖的 ML 模型类。这个混合模型将包含所有确定性规则,使我们能够像其他任何机器学习模型一样训练它。

方便的是, scikit-learn 提供了一个base estimator类,我们可以继承它来自己构建 scikit-learn 模型,而不需要太多的努力。构建新估计器的优势在于,我们可以将规则直接与模型逻辑相结合,同时利用底层机器学习模型来处理规则不适用的所有数据。

让我们从构建新的混合模型类开始,并向它添加一个 init 方法。作为底层模型,我们将使用 scikit-learn 实现一个GradientBoostingClassifier我们称之为基础模型

*import pandas as pd
from typing import Dict, Tuple
from sklearn.base import BaseEstimatorclass RuleAugmentedGBC(BaseEstimator):

  **def __init__(self, base_model: BaseEstimator, rules: Dict, **base_params):**

    self.rules = rules
    self.base_model = base_model
    self.base_model.set_params(**base_params)*

我们创建了继承自 BaseEstimatorRuleAugmentedGBC 类。我们的类还没有完成,仍然缺少一些基本的方法,但是从技术上来说,它现在是一个 scikit-learn 估计器。 init 方法利用一个 base_model 和一个规则字典初始化我们的估计器。我们可以在 init 方法中设置额外的参数,然后直接传递给底层的 base_model 。在我们的例子中,我们将使用一个GradientBoostingClassifier作为 base_model

规则的通用格式

在本文的实现中,我们将以以下格式为模型提供规则:

*{"House Price": [
    ("<", 1000.0, 0.0),
    (">=", 500000.0, 1.0)
],
 "...": [
    ...
    ...
]}*

如上所示,我们将规则格式化为一个 Python 字典。字典键代表我们想要应用规则的特性列名。字典的值是元组列表,每个元组代表一个唯一的规则。元组的第一个元素是规则的逻辑操作符,第二个是拆分标准,最后一个对象是模型在规则适用时应该返回的值。

例如,上面示例中的第一条规则表明,如果房价特征列中的任何值小于 1000.0,模型应该返回值 0.0。

该拟合方法

我们继续编写一个 fit 方法(在我们的 RuleAugmentedGBC 类中),以允许我们的模型对数据进行训练。这里需要注意的是,我们希望尽可能使用确定性规则,并且只在不受规则影响的数据上训练 base_model 。我们将通过制定一个名为 _get_base_model_data 的私有助手方法来分解这个步骤,以过滤出训练我们的 base_model 所必需的数据。

***def fit(self, X: pd.DataFrame, y: pd.Series, **kwargs):** train_x, train_y = self._get_base_model_data(X, y)
  self.base_model.fit(train_x, train_y, **kwargs)*

fit 方法非常简单:它首先应用要编码的 _get_base_model_data 方法来提取我们底层 base_model 的训练特征和标签,然后将模型拟合到数据。与之前类似,我们可以设置附加参数,随后将这些参数传递给 base_model 的 fit 方法。现在让我们实现 _get_base_model_data 方法:

***def _get_base_model_data(self, X: pd.DataFrame, y: pd.Series) -> Tuple[pd.DataFrame, pd.Series]:** train_x = X

  for category, rules in self.rules.items(): if category not in train_x.columns.values: continue
    for rule in rules: if rule[0] == "=":
        train_x = train_x.loc[train_x[category] != rule[1]] elif rule[0] == "<":
        train_x = train_x.loc[train_x[category] >= rule[1]] elif rule[0] == ">":
        train_x = train_x.loc[train_x[category] <= rule[1]] elif rule[0] == "<=":
        train_x = train_x.loc[train_x[category] > rule[1]] elif rule[0] == ">=":
        train_x = train_x.loc[train_x[category] < rule[1]] else:
        print("Invalid rule detected: {}".format(rule)) indices = train_x.index.values
  train_y = y.iloc[indices]
  train_x = train_x.reset_index(drop=True)
  train_y = train_y.reset_index(drop=True) return train_x, train_y*

我们的私有 _get_base_model_data 方法遍历规则字典键,最后遍历每个唯一的规则。在每个规则中,根据逻辑操作符,它缩小了 train_x pandas 数据帧的范围,只包括不受规则影响的数据点。一旦我们应用了所有规则,我们通过索引匹配相应的标签,并返回 base_model 的剩余数据。

该预测方法

**预测方法的工作方式类似于拟合方法。只要有可能,就应该适用规则;如果没有适用的规则,基本模型应该产生一个预测。

***def predict(self, X: pd.DataFrame) -> np.array:**

  p_X = X.copy()
  p_X['prediction'] = np.nan for category, rules in self.rules.items(): if category not in p_X.columns.values: continue
    for rule in rules: if rule[0] == "=":
        p_X.loc[p_X[category] == rule[1], 'prediction'] = rule[2] elif rule[0] == "<":
        p_X.loc[p_X[category] < rule[1], 'prediction'] = rule[2] elif rule[0] == ">":
        p_X.loc[p_X[category] > rule[1], 'prediction'] = rule[2] elif rule[0] == "<=":
        p_X.loc[p_X[category] <= rule[1], 'prediction'] = rule[2] elif rule[0] == ">=":
        p_X.loc[p_X[category] >= rule[1], 'prediction'] = rule[2] else:
        print("Invalid rule detected: {}".format(rule)) if len(p_X.loc[p_X['prediction'].isna()].index != 0): base_X = p_X.loc[p_X['prediction'].isna()].copy()
    base_X.drop('prediction', axis=1, inplace=True)
    p_X.loc[p_X['prediction'].isna(), 'prediction'] = self.base_model.predict(base_X) return p_X['prediction'].values*

predict 方法复制我们的输入 pandas 数据帧,以便不改变输入数据。然后我们添加一个预测列,在其中我们收集了所有混合模型的预测。就像在 _get_base_model_data 方法中一样,我们遍历所有规则,并在适用的情况下,在预测列中记录相应的返回值。一旦我们应用了所有的规则,我们检查是否有任何预测仍然丢失。如果是这种情况,我们返回到我们的基础模型来生成剩余的预测。

其他要求的方法

为了获得从 BaseEstimator 类继承的工作模型,我们需要实现两个更简单的方法——get _ paramsset_params 。这些允许我们设置和读取新模型的参数。由于这两种方法不是本文主题的组成部分,如果您想了解更多,请查看下面完整记录的实现。**

完整记录的实施

下面,您将找到我们在本文中构建的 scikit-learn 包装器类的完整代码,以及完整的文档。您可能会发现它对您的一个用例很有用。

基于混合规则的模型使用示例

这里有一小段代码来说明如何利用 RuleAugmentedEstimator 包装类向GradientBoostingClassifier添加规则。本例假设您已经初始化了变量规则train_Xtrain_ytest_X 。请参考 一节规则的通用格式 来检查应该如何使用任何规则。

*gbc = GradientBoostingClassifier(n_estimators=50)
**hybrid_model = RuleAugmentedEstimator(gbc, rules)****hybrid_model.fit(train_X, train_y)** predictions = **hybrid_model.predict(test_X)***

结论

恭喜你走到这一步!我希望这篇文章能够帮助您利用领域知识和面向对象编程(OOP)来构建基于混合规则的机器学习模型。正如您所看到的,抽象的概念对于直接将规则合并到 ML 模型中,同时保持您的数据管道的整洁非常有帮助。

写这篇文章有助于我深入探索这个主题及其应用。当我试图检查我的工作中的错误时,如果你发现任何错误,请让我知道。

我总是很高兴得到反馈,并对数据科学、机器学习和一般技术领域的话题讨论持开放态度。我很想收到你的来信,所以请随时通过LinkedIn与我联系。**

Tableau 中的混合可视化

原文:https://towardsdatascience.com/hybrid-visualizations-in-tableau-cd031c76a107?source=collection_archive---------46-----------------------

结合可视化技术从数据中提取更深层的含义——用三个循序渐进的例子!

简短的画面概述

Tableau 对于数据科学家和数据分析师来说是一个非常强大的工具,可以让他们理解数据并产生可视化效果,简称为 "viz"

简单回顾一下——在 Tableau 中,我们使用显示为蓝色的分类数据(维度),以及显示为绿色的可以聚合的数值数据(度量)。通过尺寸和测量的独特组合,以及“标记”卡(颜色、尺寸、标签和细节)上的选项,我们可以生成非常健壮的图!

混合可视化

使用数据的全部意义(除了它很棒这一事实之外)是为了回答问题以得出一些结论。这些结论可以通过分析 KPI、识别趋势和提取其他有意义的见解来找到。根据这些结论,我们经常采取行动来影响未来的结果。

有时候,见解很容易从数据中提取出来。我们可以简单地用传统的方法来表示这些发现,如柱状图、线图或散点图。但其他时候,我们想要从数据中提取的见解更加细致入微,这些标准情节本身不足以有效而简洁地讲述故事。

当这种情况出现时,我会使用一种混合的可视化方式。我所说的“混合”是指两种或两种以上技术的结合,在多个层次上处理数据,所有这些都在一个层次上进行,即。

例如,我们将使用 Tableau 的“全球超市”数据集来处理三种不同的场景。该数据集的 Excel 文件可以在这里找到

混合 Viz 1:树形图+条形图

创建一个显示每年每季度总销售额和利润的 viz。我们希望将其分为 3 个层次:首先是地区,然后是产品类别,最后是产品子类别。

哇哦。那是一口。显然,这不能通过简单的条形图来解释。我们必须创造一个比标准更高的 viz。所以让我们一口一口地解决这个问题。

首先,让我们确定需要处理的数据类别。“品类”、“子品类”、“区域”、“下单日期”是我们的维度,而“销售额”、“利润”是我们的衡量标准。

Tableau 允许我们创建一个名为 tree-map 的 viz,这本质上是一种使用矩形显示嵌套数据的方式,其中树的每个“分支”都有一个大矩形,这个大矩形被分成更小的矩形,这些矩形就是“叶子”。在我们的例子中,我们最大的分支是“区域”,较小的分支是“类别”,我们的“叶子”是“子类别”。每个枝叶的大小是由“销量”决定的。

为了将“利润”形象化,我们可以分配一个发散的调色板来轻松识别高利润产品和低利润产品。所以,这个树形图照顾到了一切,除了时间方面。“订单日期”呢?

这就是我们混合树形图和柱状图的地方。在构建了树形图之后,如果我们将“订单日期”分配给“行”,那么 Tableau 将为数据集中的每一年创建一个树形图。每个树形图变成一个条形图,其总大小代表该特定年份所有产品类别和所有地区的总销售额。我们还可以按季度进一步细分。

现在,让我们来看看如何在 Tableau 中创建它。

第一步:

首先选择销售、利润和地区,然后使用 Tableau 右上角的“演示”工具,我们制作了一个树形图,其中每个矩形代表一个不同的地区。每个矩形的大小代表每个地区的销售额。每个矩形的颜色代表每个地区的利润。深橙色利润较低,深蓝色利润较高。

第二步:

接下来,我们将“类别”维度添加到标记卡上的“标签”中。现在,我们的树形图显示了每个地区,按产品类别细分。

第三步:

现在,我们将“子类别”维度添加到标记卡的“标签”中。结果显示每个地区的销售额,首先按产品类别细分,然后再按产品子类别细分。

第四步:

现在我们介绍时间方面。通过将“订单日期”维度拖动到 Tableau 中的“行”中,我们现在可以看到每个地区的销售额,按产品类别细分,再按产品子类别细分,并拆分为每年一个树形图。我们可以看到,每年我们的整体销售额都在增长!

现在我们介绍时间方面。通过将“订单日期”维度拖动到 Tableau 中的“行”中,我们现在可以看到每个地区的销售额,按产品类别细分,再按产品子类别细分,并拆分为每年一个树形图。我们可以看到,每年我们的整体销售额都在增长!

第五步:

最后,我们可以扩展“订单日期”层次结构,以显示每年每个季度的树形图。我们的树形图已经变成了柱状图——最长的柱状图显示的是销售额最高的季度,最短的柱状图显示的是销售额最低的季度。使用发散调色板,利润最高的产品子类别显示为深蓝色,而利润最低的子类别显示为深橙色。似乎有一个明显的趋势,即 Q1 的销售额最低,每个季度都在增长,其中第四季度的销售额最高。

混合 Viz 2:双轴条形图+线图

创建一个显示每年每月全球总销售额的 viz,并叠加显示每年每月的总利润。提供一年的销售和利润预测。

好吧,让我们概括一下这个任务。还是那句话,我们感兴趣的是“销量”和“利润”。但是这一次,我们没有用几个分类维度来分解它。我们不需要超精细的可视化。我们只想了解我们的全球超市销售额和利润是如何随时间变化的。

直观传达每月销售额的一种简单方法是使用条形图,x 轴表示“月/年”,y 轴表示“销售额”。但是利润呢?为了从图形上区分“利润”和“销售额”,我们可以在条形图的顶部叠加一个显示一段时间内的利润数据的线图。

除了天气预报,其他的都考虑到了。我们可以提供一年的额外棒线来预测“销售”,并提供一条额外的线来预测“利润”,置信区间为 95%。

让我们开始在 Tableau 中构建第二个混合模型。

第一步:

首先,我们为销售数据创建一个简单的条形图。我们在“行”中指定了“销售额”,在“列”中指定了“订单日期”。我们对每年每月的销售额和利润感兴趣,所以我们将“订单日期”从离散改为连续,其颜色从蓝色改为绿色。我给我们的条形图分配了深灰色,以保持 viz 中性,因为我们将在这些条形图的顶部覆盖利润数据。

第二步:

接下来,我们需要合并我们的利润数据。这将表示为销售条形图顶部的线形图。要做到这一点,我们将按 SUM 聚合的“利润”拖到“行”中,然后单击“利润”药丸上的下拉菜单,并选择“双轴”。这在 viz 的右侧创建了一个新的轴,标记为“利润”。为了使我们的“利润”比例与“销售”比例保持一致,我们右键单击新轴,并选择“同步轴”。现在,这些值在我们的 y 轴上对齐,这使得阅读更加直观。我选择了一条浅蓝色的利润线,与深灰色的销售柱状图形成对比。(注意:我们不想用绿色或红色作为盈利线,因为这些颜色与财务收益和损失相关联。)

第三步:

最后,我们建立预测。在左上角的“分析”选项卡中,我们将“预测”拖放到视图中。在顶部的功能区中,在“分析”—“预测”—“预测选项”下,我们可以定义我们希望准确预测 1 年,并使用触须显示 95%的置信区间。我们将预测的条形图和线条用不同的颜色表示,以表明这些是预测,而不是实际数据。Tableau 默认情况下会自动为您选择一个指数平滑预测模型。简而言之,“指数平滑”是指时间序列数据:数据越老,数据的权重越小,而较新的数据被认为更重要,被赋予更大的权重。

混合 Viz 3:抖动图+盒须图

创建一个显示每份订单利润的 viz,它还显示按地区细分的每份订单的利润分布。过滤以排除异常数据(仅当每份订单的利润介于 0 美元到 1,000 美元之间时)。

现在我们只关心一个衡量标准:“利润”。我们只关心一个维度:“区域”。没什么可分解的。这里的挑战是以图形方式显示成千上万的订单,过滤数据,并用分布信息覆盖这些数据。这可以通过使用带有盒须图叠加的抖动图来实现。

抖动图随机排列 x 轴上的值,以分散数据,从而更清楚地了解分布情况。在这种情况下,这对我们特别有帮助,因为我们有数千个数据点显示每个地区每个订单的利润。

盒须图叠加为我们提供了关于每份订单利润分布的更具体的分析。它显示了数据的核心所在。“方框”显示了中间的百分之五十的值,即第一个到第三个四分位数,中间有一条线。这被称为“四分位距”或“ IQR ”。“胡须”要么延伸到最小值/最大值,要么延伸到 1.5 倍 IQR,这是确定数据中异常值的常用规则。

让我们设计这最后一个场景吧!

第一步:

首先,我们需要生成盒须图。我们选择“订单 ID”、“区域”和“利润”,并在“演示”下拉列表中选择盒须图。这显示了在每个地区下单的每个订单的数据点。在标记卡的“颜色”选项卡中,我们可以降低数据点的不透明度,以获得更好的订单密度图形感。我们可以看到我们的盒须图非常紧凑,因为我们有广泛的利润值。显然,我们订单利润值的很大一部分在一个非常窄的范围内。

第二步:

接下来,我们要过滤数据。我们被告知排除 0 到 1000 美元之间的利润数据。因此,我们将汇总的“利润”拖到过滤器卡上,并相应地调整范围。我们的盒须图会自动更新为过滤值。

第三步:

为了使区域更容易相互区分,我们可以将“色调圆”调色板分配给“区域”。区域是绝对的。当我们处理类别时,我们希望为每个类别使用不同的颜色。我们不想在这里使用单一的颜色或分散的调色板。

第四步:

最后,我们可以沿着每个地区的 x 轴“抖动”我们的数据点,以图形方式查看我们每份订单的利润密度。我们可以通过右键单击“数据”选项卡,然后单击“创建计算字段”来完成此操作。我们将这个新字段命名为“Jitter”,并通过键入“INDEX()%20”来创建这个字段的计算。

这里的 INDEX()函数本质上是在每个区域内创建“抖动列”,我们的数据点被随机分配到这些区域中,以便将它们水平分布,而不是都在一行中。“%20”指定我们想要制作的抖动列的数量。最后,在将新的“Jitter”字段拖到列中后,我们单击“Jitter”字段的下拉菜单,并选择“Compute Using”—即“Order ID”。结果就是你下面看到的!

结论

我希望这篇教程能激发出更健壮、更有效的方法来可视化数据!如果有一点创造力,了解什么是可能的,并花一些时间练习和使用它,数据是一种强大的资源!本博客中的所有这些可视化内容都可以在 Tableau Public 这里 看到并与之互动。

数据很美!

超参数调谐—教程

原文:https://towardsdatascience.com/hyper-parameter-tuning-a-tutorial-70dc6c552c54?source=collection_archive---------25-----------------------

不使用代码或数学的超级参数调整方法的简单高级概述

在本教程中,我们将介绍 5 种超参数优化方法:

  1. 网格搜索
  2. 随机搜索
  3. 贝叶斯优化
  4. 连续减半
  5. 超波段

网格搜索

从这篇遗传算法论文

网格搜索背后的思想非常直观。递增移动一个超参数,同时保持其他参数不变,并记录结果。基本上对所有你怀疑可以优化的超参数都这样做。这是一种非常昂贵和麻烦的优化和调整超参数的方法,今天被认为是进行超参数搜索的效率较低的方法之一。让我们看看如何做得更好。

随机搜索

来自的随机搜索论文

虽然你可能一开始没有想到,但随机选择所有超参数的值实际上是一种更有效的超参数调整方法。在这种情况下,我们不是保持所有超参数不变并以迭代方式调整其中一个,而是在每次试验中随机初始化所有超参数值。这更好,因为事实证明,一些超参数对优化来说比其他的更重要,如果我们不能区分重要的超参数和不重要的超参数,我们能做的下一个最好的事情是在每次试验中随机选择所有的超参数值。这将为重要的超参数提供更高的采样率,因此我们的优化将更加高效。随机搜索与网格搜索的优势在这篇文章中有所探讨。

贝叶斯优化

来自贝叶斯优化回购

实际上,高层次的概念非常简单,我们试图用贝叶斯优化做同样的事情,我们总是试图在 ML 中做,那是估计函数,函数太复杂而无法公式化。但是现在我们试图逼近的函数是我们的 ML 算法。在这种情况下,我们可能会使用深度学习或其他形式的 ML,我们只能运行有限数量的试验来测试超参数的不同组合。如果我们能够在选择下一个超参数配置之前智能地近似我们的 ML 算法的结果,我们可能会节省大量的时间和金钱。

来自 TPE 论文

有几个贝叶斯优化函数,但其关键思想是使用贝叶斯方法来估计一个更好的超参数配置给定以前的一组配置及其结果。在上图中,我们使用了一种叫做 TPE 的算法,其基本概念是将我们的试验根据其表现分成两组,即得到较好结果的组和得到较差结果的组。然后,我们基于其属于好分布而不是坏分布的概率来挑选下一组超参数。

连续减半

在连续减半中,我们开始训练少量时期的大量试验,超参数配置是随机的。然后,我们丢弃表现最差的试验,并且仅继续训练表现最好的试验,我们这样做,直到保留单个超参数配置。

超波段

超带是逐次减半算法的扩展。连续减半的问题是,我们通常无法知道试验次数与时期数之间的正确权衡。在某些情况下,一些超参数配置可能需要更长时间才能收敛,因此开始时进行大量试验,但少量的历元并不理想,在其他情况下,收敛速度很快,试验次数是瓶颈。

摘自超频论文

这就是超级波段的用武之地。Hyperband 本质上只是对最优分配策略的网格搜索。所以在每个单独的试验中,超参数组是随机选择的。

在图像中,您可以看到 hyperband 算法将在 5 次资源分配中连续减半。s=4 以 81 个试验开始其第一轮,为每个试验提供单个历元,然后迭代地丢弃 2/3 的试验,直到剩下一个试验,并训练 81 个历元。在 s=0 时,Hyperband 算法基本上运行一个随机搜索,进行 5 次试验,每次试验都根据最大历元数进行训练。

扎祖姆尔

ZazuML 开源项目

ZazuML 是我和一些朋友一直在做的一个开源 AutoML 项目。它混合了几种搜索算法,包括前面提到的超波段和随机搜索。

请查看我们的 Github !

超参数优化

原文:https://towardsdatascience.com/hyper-parameters-optimization-c2f888515d8f?source=collection_archive---------28-----------------------

了解如何让您的深度学习模型更上一层楼!

https://unsplash.com/photos/Kl1gC0ve620

介绍

本文的目的是学习如何通过选择最佳超参数来优化神经网络。具体来说,我们将探索:

  • 网格搜索
  • 远视
  • 遗传算法

网格搜索

网格搜索是在一组参数中寻找最佳参数的最简单方法。本质上是蛮力。让我们看一个简单的例子:

假设我们有一个网格,我们想看看哪些参数是最好的。我们有:

  • 下降:可以从 0 到 0.5 变化,间隔为 0.1
  • 学习率:可以在 0.1 到 0.001 之间变化,间隔为 x10
  • 过滤器数量:从 64 到 256 不等,间隔为 64
  • 过滤器尺寸:从 3 到 7 英寸不等(总是方形过滤器)

嗯,网格搜索会做的如下:

**# grid definition**
dropouts = [0, 0.1, 0.2, 0.3, 0.4, 0.5]
learning_rates = [0.1, 0.01, 0.001, 0.0001]
n_filters = [64, 128, 192, 256]
filter_sizes = [3, 5, 7]**# variable creation to store the values**
log_accuracies = []from random import uniform
def dummy_net(d, lr, nf, fs):
  print('Executing network with d={}, lr={}, nf={}, fs={}'.format(d, lr, nf, fs))
  return uniform(0,1)**# counter**
i = 1**# grid search**
for d in dropouts:
  for lr in learning_rates:
    for nf in n_filters:
      for fs in filter_sizes:
        result_net = dummy_net(d, lr, nf, fs)
        print('[{}] Resultado: {}'.format(i, result_net))
        log_accuracies.append(result_net)
        i += 1

最好的结果是:

import numpy as np
idx_max = np.nonzero(log_accuracies==np.max(log_accuracies))
print(idx_max)print('Best execution: {}. Accuracy: {}'.format(idx_max[0][0], log_accuracies[idx_max[0][0]]))

这就是我们如何评估网络配置的最佳结果。

这种方法的问题是我们在网络中有 6×4×4×3 次执行,总共有 288 次执行。如果每次执行最少需要 10 分钟,那么总时间加起来就是 48 小时。

让我们用一个非常简单的网来做一个测试:

**# We import the necessary libraries**
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras.utils import to_categorical
from keras.optimizers import Adam**# To load the data and convert from vectors to images**
img_rows, img_cols = 28, 28
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)**# to normalize the data**
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255**# convert class vectors to binary class matrices**
num_classes = 10
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)def net(do, lr, nf, fs):model = Sequential()
  model.add(Conv2D(nf, kernel_size=fs, activation='relu', input_shape=input_shape))
  model.add(Conv2D(nf, fs, activation='relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(do))
  model.add(Flatten())
  model.add(Dense(128, activation='relu'))
  model.add(Dropout(do))
  model.add(Dense(10, activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=lr), metrics=['accuracy'])model.fit(x_train, y_train,
            batch_size=1024,
            epochs=1,
            verbose=0,
            validation_data=(x_test, y_test))score = model.evaluate(x_test, y_test, verbose=0)

  print('Red con d={}, lr={}, nf={}, fs={}. Loss: {}. Acc: {}.'.format(d, lr, nf, fs, score[0], score[1]))      
  return score[1] # accuracy

**# grid definition**
dropouts = [0, 0.3]
learning_rates = [0.1, 0.01]
n_filters = [32, 64]
filter_sizes = [3, 5]**# variable creation to store the values**
log_accuracies = []**# counter**
i = 1**# grid search**
for d in dropouts:
  for lr in learning_rates:
    for nf in n_filters:
      for fs in filter_sizes:
        result_net = net(d, lr, nf, fs)
        print('[{}] Resultado: {}'.format(i, result_net))
        log_accuracies.append(result_net)
        i += 1

**# the best result will be:**
import numpy as np
idx_max = np.nonzero(log_accuracies==np.max(log_accuracies))
print(idx_max)print('Best execution: {}. Accuracy: {}'.format(idx_max[0][0], log_accuracies[idx_max[0][0]]))

**# grid definition with the best values**
dropouts = [0, 0.3]
learning_rates = [0.01]
n_filters = [32, 64, 128]
filter_sizes = [5, 7]**# variable creation to store the values**
log_accuracies = []**# counter**
i = 1**# grid search**
for d in dropouts:
  for lr in learning_rates:
    for nf in n_filters:
      for fs in filter_sizes:
        result_net = net(d, lr, nf, fs)
        print('[{}] Resultado: {}'.format(i, result_net))
        log_accuracies.append(result_net)
        i += 1

**# the best result will be:**
import numpy as np
idx_max = np.nonzero(log_accuracies==np.max(log_accuracies))
print(idx_max)
print('Best execution: {}. Accuracy: {}'.format(idx_max[0][0], log_accuracies[idx_max[0][0]]))

这是一个相当好的结果。虽然用更快的方法或者一些启发式的方法会很棒,而不是蛮力。你很幸运,因为有各种各样的方法:

  • 留兰香(蟒蛇皮)
  • BayesOpt(带有 Python 和 Matlab/Octave 接口的 C++)
  • 远视(蟒蛇皮)
  • SMAC(爪哇)
  • 伦博(Matlab)
  • MOE (C++/Python)

接下来我们将探索超级选项!

超级选项

Hyperopt 是一个用 Python 编写的库,它允许您通过更多地关注最有可能提供良好解决方案的值来快速优化函数。

你可以在这里找到完整的方法:分布式异步超参数优化,【https://github.com/hyperopt/hyperopt】T2。

它目前实现了两种算法来做到这一点:

  • 随机搜索
  • Parzen 估计树(TPE)

此外,利用 MongoDB,它们可以串行或并行运行。

让我们看一个如何使用它的例子。

让我们找出 x 的最小值:

from hyperopt import fmin, tpe, hp**# with 10 iterations**
best = fmin(fn=lambda x: x ** 2,
            space=hp.uniform('x', -10, 10),
            algo=tpe.suggest,
            max_evals=10)print(best)

from hyperopt import fmin, tpe, hp**# with 100 iterations**
best = fmin(fn=lambda x: x ** 2,
            space=hp.uniform('x', -10, 10),
            algo=tpe.suggest,
            max_evals=100)print(best)

from hyperopt import fmin, tpe, hp**# with 1000 iterations**
best = fmin(fn=lambda x: x ** 2,
            space=hp.uniform('x', -10, 10),
            algo=tpe.suggest,
            max_evals=1000)print(best)

现在让我们尝试一个更复杂的神经网络:

**# we install the necessary packages**
!pip install networkx==1.11 # para instala hyperopt correctamente, si no, da errores
!pip install hyperopt**# necessary imports**
import sys
import time
import numpy as np
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.constraints import max_norm
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from keras.callbacks import EarlyStopping
from keras.datasets import cifar10SEED = 42(X_train, y_train), (X_test, y_test) = cifar10.load_data()
validation_split = 0.1
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=validation_split, random_state=SEED)**# Let's convert the data to float and then divide it by 255 to normalize it
# Due to image characteristics they can only get values from 0 to 255**
X_train = X_train.astype('float32') / 255.
X_val = X_val.astype('float32') / 255.
X_test = X_test.astype('float32') / 255.**# let's convert the labels with one-hot encoding**
n_classes = 10
y_train = to_categorical(y_train, n_classes)
y_val = to_categorical(y_val, n_classes)
y_test = to_categorical(y_test, n_classes)**# we define the search space
# we'll vary:
# - the number of filters in our conv layers
# - the dropout percentage
# - the number of neurons in the dense layer**
space = {
    'n_filters_conv': hp.choice('n_filters_conv', [32, 64, 128]),
    'dropout': hp.uniform('dropout', 0.0, 0.5),
    'neurons_dense': hp.choice('neurons_dense', [256, 512, 1024]), 
}def get_callbacks(pars):
  callbacks = [EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=2, verbose=0, mode='auto')]
  return callbacksdef mi_cnn(pars):
  print ('Parameters: ', pars)
  model = Sequential()

 **# First convolutional block**
  model.add(Conv2D(pars['n_filters_conv'], kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(pars['dropout']))**# second convolutional block**
  model.add(Conv2D(pars['n_filters_conv'], kernel_size=(3, 3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(pars['dropout']))**# third convolutional block**
  model.add(Conv2D(pars['n_filters_conv'], kernel_size=(3, 3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(pars['dropout']))**# Classifier block**
  model.add(Flatten())
  model.add(Dense(pars['neurons_dense'], activation='relu', kernel_constraint=max_norm(3.)))
  model.add(Dropout(pars['dropout']))
  model.add(Dense(10, activation='softmax'))**# We compile the model**
  model.compile(loss='categorical_crossentropy',
                optimizer=Adam(lr=0.0001, decay=1e-6),
                metrics=['accuracy'])**# We train the model**
  history = model.fit(X_train, 
                      y_train,
                      batch_size=128,
                      shuffle=True,
                      epochs=5,
                      validation_data=(X_val, y_val),
                      verbose = 0,
                      callbacks = get_callbacks(pars))best_epoch_loss = np.argmin(history.history['val_loss'])
  best_val_loss = np.min(history.history['val_loss'])
  best_val_acc = np.max(history.history['val_acc'])

  print('Epoch {} - val acc: {} - val loss: {}'.format(best_epoch_loss, best_val_acc, best_val_loss))
  sys.stdout.flush()

  return {'loss': best_val_loss, 'best_epoch': best_epoch_loss, 'eval_time': time.time(), 'status': STATUS_OK, 'model': model, 'history': history}trials = Trials()
best = fmin(mi_cnn, space, algo=tpe.suggest, max_evals=10, trials=trials)
print(best)

trials.results

trials.losses()

这样,您可以离开您的配置,去做一些比改变参数更有用的事情,直到您找到正确的配置。

但是我们不一定要呆在这里,如果我们想要剩余连接,我们也可以改变层数或设置。是的,这意味着我们也可以改变架构!

这里有一个非常完整的例子:【https://github.com/Vooban/Hyperopt-Keras-CNN-CIFAR-100】T4

还有一个你可能会感兴趣的。

遗传算法

本质上,遗传算法是一种受自然进化启发的元启发式研究方法。它们属于进化算法,特别是导向随机搜索算法(进化算法)。

这听起来可能很复杂,但实际上非常简单。让我们用一个例子来理解它们:

想象一下,我们有一个拼图,我们只剩下一块拼图可以拼了。问题是这个谜题非常特别,因为它让我们能够完成我们的作品。为此,我们有几种机制:

  • 组合部分片段(交叉或重组)
  • 修改那些部分的某些部分(突变)
  • 选择我们所做的最好的作品,从新的和更好的作品中建立(选择)

然后,假设我们决定切割 10 块纸板,这是我们最初的 10 块纸板,我们将用它们来测试是否有任何一个完全符合。我们都试过了,在这 10 个中,有 5 个或多或少合适。因此,我们选择了这 5 个,并使用上面解释的机制从中制作了新的:

  • 从选择的五个中,我们通过随机选择的方式将最初的五个中的两个部分组合起来,再取五个。
  • 在最初的 5 个和我们创造的新的 5 个中,我们通过稍微修改作品的一个尖端,再去掉 5 个

现在我们有 15 个棋子,我们总是想要 10 个,因为如果不是在第 5 次我们这样做了,我们会有很多棋子,所以:

  • 我们试了 15 件,找到最合适的,然后随机选择 9 件。

让我们看看如何在实践中应用这个例子:

按作者分列的数字

如你所见:

  • 我们这组片段(群体)中的每一个片段都是一条染色体
  • 我们的每一部分都是一个基因,所以我们的染色体有 4 个基因
  • 每个基因可能具有的值或设置被称为等位基因。

这和生物学中的一样,因为这些算法是受自然进化的启发?

好的,让我们把这些单词和我们的例子联系起来:

  • 我们需要为我们的拼图洞找到合适的一块
  • 我们有一组初始的片段(群体),我们不知道它们是否合适
  • 我们检查这些部分配合得有多好(使用适应度函数)
  • 如果没有一个片段符合我们的要求,我们就修改这些片段(使用操作符:交叉和变异)
  • 我们检查新创建的片段在一起的吻合程度(适应度函数)
  • 我们选择我们想要为下一次迭代(选择)保留的片段
  • 我们重新开始。直到我们找到一个符合我们要求精度的零件

我们来看看伪算法:

开始

  • 生成初始群体
  • 计算适合度

重复

  • 选择
  • 交叉
  • 变化
  • 计算适合度

直到种群已经收敛

停止

但是它们是如何工作的呢?

我们必须理解几个概念:

  • 我们的人口如何初始化
  • 交叉是如何工作的
  • 变异是如何发生的
  • 选择是如何工作的
  • 我们如何定义我们的适应度函数

首先要明白的是,当我们在现实世界中遇到问题,想要在计算机上解决时,我们需要对它进行编码,以便计算机能够理解它。

比如说:

在现实世界中,染色体是拼图的一部分。在计算机中,染色体是一个有 4 个值的向量(一个表示每个尖端的大小,其中正表示尖端,负表示片上的洞)
这就是所谓的编码。

一旦我们知道了这一点,我们将看到操作符是如何工作的。首先,你应该知道有许多类型的交叉、变异和选择,但是这里我们将只从时间的角度来看最简单的那些。

如果你有兴趣了解更多,网上有很多资料。可以从这里开始:https://www.tutorialspoint.com/genetic_algorithms/index.htm

按作者分列的数字

单点交叉

我们的染色体是拼图,它有你在图片中看到的 4 个基因。因此,简单的交叉只是从 4 个基因中随机选择一个点,并将这些部分组合成新的染色体,如图所示。

理解这一点很重要,因为我们有原始的和重组的染色体。

均匀突变

统一的突变是,对于每个染色体,我们抛硬币。如果很贵,我们就修改随机选择的基因。我们赋予它什么价值?在基因允许的范围内随机选择一个。

选择

对于选择,通常使用染色体适应度(也称为可能的解决方案)。在这种情况下,我们将研究随机通用采样,它包括构建一个饼形图,其中每个染色体占据一个与其适应度相对应的空间。然后,我们在“蛋糕”周围建立 N 个固定点,其中 N 是我们要选择的染色体数目。然后,我们“旋转蛋糕”,仿佛是运气轮盘,定点指向的染色体就是被选中的,继续下一次迭代。

你看看,染色体不是从适应度最高到最低排序的。

这一点很重要,因为否则,选择一个高适应性染色体和另一个低适应性染色体的机会将高于选择两个高适应性染色体的机会。毕竟,由于选择点在彼此的前面,选择两条适应度相似的染色体会非常复杂。

这个运算符有几种工作方式。继续我们的 10 染色体群体的例子:

  • 我们选择 N=10 条染色体,也就是说,我们用一个完全新的群体替换先前的群体
  • 我们选择 N=n 条染色体,其中 N<10. In other words, we replace only a part of the old chromosomes.

Okay, so if we select all 10 it’s clear, but if we select n, how do we choose which ones to remove?

Well, the two most common ways are:

  • We remove the oldest chromosomes
  • We remove the chromosomes with the worst fitness

Finally, there are times when we select the best chromosome (or the k best) to pass if or when the next iteration, that is, there is elitism. We have to be careful with this, because although a priori it seems that elitism is the best and that we should only stay with the best if we did we would be killing one of the greatest virtues of genetics: that they can escape to local minimums!

Look, here you can see a geneticist in action trying to decide which is the best configuration for a two-wheeled vehicle: http://rednuht.org/genetic_cars_2/

让我们自己实现几个例子?

**# example of a GA where we have to find N numbers that add up to X
#** [**https://lethain.com/genetic-algorithms-cool-name-damn-simple**](https://lethain.com/genetic-algorithms-cool-name-damn-simple)from random import randint, random
from operator import add
from functools import reduce
import numpy as npdef individual(length, min, max):
 **# we create an individual**
    return [ randint(min,max) for x in range(length) ]def population(count, length, min, max):   
    **# we create our population**
 **# count: number of individuals of each population
    # length: number of values per individual
    # min: minimum allowed for each individual's value
    # max: maximum allowed for each individual's value**return [ individual(length, min, max) for x in range(count) ]def fitness(individual, target):
    **# we compute the fitness of each individual, the smaller the better**

    sum = reduce(add, individual, 0)
    return abs(target-sum)def grade(pop, target):
    **# we compute the average of the entire population**
    summed = reduce(add, (fitness(x, target) for x in pop))
    return summed / (len(pop) * 1.0)

def find_best_solution(pop, target):
 **# we find the best solution in the current population and prints it**
    res = [fitness(x, target) for x in pop]
    res_min = np.min(res)
    res_min_idx = np.where(res == res_min)[0]
    for n in res_min_idx:
        print('Individual: ', n, 'Valores: ', *pop[n], ' Result: ', np.sum(pop[n]), 'Target; ', target)
    return res_mindef evolve(pop, target, retain=0.2, random_select=0.05, mutate=0.01):
    graded = [ (fitness(x, target), x) for x in pop]
    graded = [ x[1] for x in sorted(graded)]
    retain_length = int(len(graded)*retain)
    parents = graded[:retain_length]

 **# we add individuals randomnly to promote genetic diversity**
    for individual in graded[retain_length:]:
        if random_select > random():
            parents.append(individual)

 **# we mute some**
    for individual in parents:
        if mutate > random():
            pos_to_mutate = randint(0, len(individual)-1)
            individual[pos_to_mutate] = randint(i_min, i_max)

 **# we reproduce (crossover) our chromossomes (individuals, solutions)**
    parents_length = len(parents)
    desired_length = len(pop) - parents_length
    children = []
    while len(children) < desired_length:
        male = randint(0, parents_length-1)
        female = randint(0, parents_length-1)
        if male != female:
            male = parents[male]
            female = parents[female]
            half = round(len(male) / 2)
            child = male[:half] + female[half:]
            children.append(child)        
    parents.extend(children)
    return parents**# exectute the GA**
generations = 20
target = 108
p_count = 20
i_length = 5
i_min = 0
i_max = 100
error_accepted = 1
print('We intiate the population with 20 individuals.')
p = population(p_count, i_length, i_min, i_max)
print('We compute the fitness of those 20 individuals.')
fitness_history = [grade(p, target),]
print('The best individual of the initial population is:')
find_best_solution(p, target)for i in range(generations):
    p = evolve(p, target, retain=0.2, random_select=0.2, mutate=0.4)
    res = grade(p, target)
    fitness_history.append(res)

    res_min = find_best_solution(p, target)
    print('Generation: ', i, ' Average fitness of the population's individuals:', res)

    if res_min < error_accepted:
      break

现在让我们通过使用 Github 上可用的实现将它应用于神经网络:【https://github.com/jliphard/DeepEvolve

让我们克隆一个 git 存储库,它已经实现了 GA 来进化神经网络的超参数和架构:

!rm -rf DeepEvolve
!git clone [https://github.com/jliphard/DeepEvolve.git](https://github.com/jliphard/DeepEvolve.git)

!ls

!pip install tqdm

看一看正在进行搜索以找到最佳组合的参数:

if dataset == 'mnist_cnn':
        generations = 8 # Number of times to evolve the population.
        all_possible_genes = {
            'nb_neurons': [16, 32, 64, 128],
            'nb_layers':  [1, 2, 3, 4 ,5],
            'activation': ['relu', 'elu', 'tanh', 'sigmoid', 'hard_sigmoid','softplus','linear'],
            'optimizer':  ['rmsprop', 'adam', 'sgd', 'adagrad','adadelta', 'adamax', 'nadam']
        }

现在我们将执行 GA:

!python DeepEvolve/main.py

最后的话

一如既往,我希望你喜欢这个帖子,并且你获得了关于如何优化你的神经网络参数的直觉!

如果你喜欢这篇文章,那么你可以看看我关于数据科学和机器学习的其他文章 这里

如果你想了解更多关于机器学习、数据科学和人工智能的知识 请关注我的 Medium ,敬请关注我的下一篇帖子!

人工智能设计的“超级食物”可能有助于预防癌症

原文:https://towardsdatascience.com/hyperfoods-9582e5d9a8e4?source=collection_archive---------17-----------------------

让食物成为你的良药

我们吃的食物含有成千上万的生物活性分子,其中一些类似于抗癌药物。现代机器学习技术可以发现这种成分,并帮助设计营养,让我们活得更长更健康。

插图:比安卡·达盖蒂。

本文与Kirill Veselkov和 Gabriella Sbordone 合著,基于《自然》杂志科学报告上发表的TEDx Lugano 2019 talk 论文

我们现在比以往任何时候都活得长。然而,我们并不一定生活得更健康:随着人口的快速老龄化,人们正在经历癌症、代谢、神经和心脏疾病等慢性疾病的持续增长。这使得医疗费用飞涨,给公共卫生系统带来了巨大压力[1]。

很大一部分问题在于糟糕的饮食选择。不健康的饮食杀死的不仅仅是香烟,而且是全球五分之一死亡的原因——2018 年,这相当于近 1100 万条生命。除了明显的罪魁祸首——不健康的高度加工食品——一个不太明显的杀手是健康食品的低摄入量,如全谷物、蔬菜、水果、坚果、种子和豆类[2]。

以癌症为例:正当地考虑现代社会的困境,它将在他们一生中的某一点上影响这篇文章的每一个读者。尽管前景似乎很悲观,但好消息是,仅通过饮食和生活方式的改变,就可以预防近 40%的肿瘤疾病[3]——这一发现鼓励我们更仔细地审视我们所吃的东西,因为饮食可能是癌症最重要的可变风险因素。

暗物质

在过去的几十年里,营养科学在分析影响人类健康和疾病的六大营养类别方面取得了卓越的进展:蛋白质、碳水化合物、脂肪、矿物质、维生素和水。国家营养数据库跟踪这些类别中的大约 150 种成分,它们出现在每个食品包装上。

然而,越来越多的证据表明,来自各种化学类别的数千种其他分子——如多酚、类黄酮、萜类化合物和吲哚——可能有助于预防和对抗疾病,这些分子在植物中大量存在,通常是它们的颜色、味道和气味的天然原因[4]。这些化合物中的大多数仍然基本上没有被专家探索,没有被监管机构跟踪,也不为公众所知,因此名副其实地被称为“营养的暗物质”[5]。

每吃一口食物,我们都会把数百种这样的生物活性化合物放进嘴里。这些分子在我们吞下它们的那一刻就相互作用,随着食物被消化和代谢,还会与我们体内的其他生物分子和我们肠道中的数万亿细菌发生反应。

植物性食物中发现的许多化合物与药物属于同一类化学物质。因此,几乎一半被批准用于抗癌治疗的小分子来自天然产物就不足为奇了。这些药物通常耐受性更好,对健康细胞的毒性更小[6]。

药物和食物

传统药物分子旨在结合与特定疾病过程相关的生物分子靶标,其中最重要的涉及蛋白质[7]。经典药物治疗遵循“一种疾病-一种药物-一个靶点”的范式,试图确定一种与疾病相关的“可用药”蛋白质,该蛋白质可以被药物靶向。事实上,药物很少如此具有选择性[8],蛋白质之间复杂的相互作用网络(或“图形”)产生了一种“网络效应”,可以干扰多种生物过程——就像一张倒下的多米诺骨牌撞掉一整排。

蛋白质-蛋白质相互作用(PPIs) [9]被认为是下一代治疗靶点,大多数制药行业现在已经将其药物发现计划扩展到 PPIs [10]。为了利用现代高通量技术产生的大量分子相互作用数据,机器学习(ML)变得越来越重要。然而,与图像和音频信号不同的是,ML 在过去十年中取得了突破性的成果,网络结构化数据需要一种不同类型的方法,称为“图形 ML”。

Graph ML,也称为“图形表示学习”或“几何深度学习”,是机器学习领域最近的一个热门话题,我在我的走向数据科学博客中对此进行了广泛的介绍。典型的图形 ML 架构,称为图形神经网络在图形上实现某种形式的消息传递,允许不同的节点交换信息。在最简单的公式中,消息传递采取线性扩散或图中“随机漫步”的形式[11]。

在去年发表在《自然科学报告》杂志上的一篇论文中,我们应用 graph ML 利用蛋白质-蛋白质和药物-蛋白质相互作用图来寻找食物中的抗癌分子【12】。药物与蛋白质的相互作用被表示为 PPI 图上的信号,一个可学习的扩散过程被用于模拟药物的网络效应。

一种药物通常会影响多个蛋白质靶点(显示为红色)。作为蛋白质相互作用的结果,药物效应波及到生物网络的其他部分(显示在橙色阴影中)。

我们使用了一个由近 2000 种临床批准的药物组成的训练集,其中约有 10%被标记为抗癌药物,以便训练一个分类器,通过新分子与 PPI 图的相互作用来预测新分子的抗癌药物相似性。然后,我们将大约 8000 种已知蛋白质相互作用的基于食物的分子输入训练好的分类器。我们的模型确定了一百多种抗癌药物样候选物,我们称之为“抗癌分子”。使用 ML 方法的主要优势在于,可以利用大量公开可用的数据集自动发现这些分子。

然后,我们再次求助于机器学习,使用自然语言处理(NLP)技术从医学文献中挖掘已识别分子抗癌效果的实验证据[13]。我们还必须排除毒性过大的化合物。这是依赖于已报道的体外体内实验的第一个验证步骤。

好东西

关于食物基化合物的现有文献的一个关键限制是它集中于特定的化合物,例如抗氧化剂孤立的。你肯定见过被誉为富含抗氧化剂的食物,并且经常以“超级食物”的标签销售。然而,尽管经常食用这类食物可以降低癌症形成的风险(“致癌”),但其中所含的抗增殖剂在单独作用时似乎并不能始终如一地提供相同水平的益处[14]。

这种现象类似于在医疗实践中同时使用多种药物(技术上称为“多种药物”),这通常会导致不良副作用以及比每种药物单独使用更强的协同作用[15]。因此,某些食物的抗癌效果是生物活性物质组合的结果,并由它们的拮抗和协同作用以及它们同时作用于不同致癌生物机制的方式决定。

茶和柑橘类水果是满足这两个条件的食物的例子:首先,它们含有多种由我们的 ML 模型确定并从医学文献中证实的抗癌药物样化合物,其次,这些化合物发挥互补的抗癌作用[16]。

食物地图:每个节点是一种食物,它的大小代表抗癌分子的数量。两个节点之间的联系反映了这些食物分子特征的相似性,使我们能够根据它们的分子组成对食物进行分类。图来自[12]。

有了这种认识,我们构建了超过 250 种不同食物成分的抗癌分子图谱,突出了我们称为“超食物”的突出冠军。除了前面提到的茶和柑橘,卷心菜、芹菜和鼠尾草都是相当常见、便宜和容易买到的超级食物。从某种意义上来说,这并不奇怪,因为营养专家提倡这些食物是健康的选择,而且有大量证据表明它们对健康有益。

姜黄香料热巧克力由厨师约瑟夫·优素福根据他的新 超食物食谱 设计。图片来源:厨房理论。

然而,读完这篇文章后,不要急着做卷心菜奶昔,因为你可能会失望——大多数情况下,它会很难吃。我们仍然缺少最后一步,将超食物成分整合到味道和外观都很棒的食谱中。这就是我们利用 Jozef Youssef 的帮助的地方,他是厨房理论【17】的创始人和主厨赞助人,他用我们的 hyperfood 原料创造了简单、实惠、美味的食谱。事实上,超级食物不仅仅是米其林餐厅的常客和高级美食的粉丝的专利:许多简单、传统的日常食谱已经包含了抗癌成分。

核桃酱黑麦面包含有许多超食物成分。这道菜是我们在卢加诺 TEDx talk 上展示的意大利-瑞士 hyperfood 菜单的一部分。菜肴和图片来源:加布里埃拉·斯博多内。

后续步骤

我们还需要记住,食物烹饪涉及物理和化学过程,可能会改变其分子内容。例如,如果我们在高温下油炸我们的原料,许多抗癌分子可能会消失。我们可以将食物制备表示为一个计算图,烹饪转换建模为边,并通过选择以最佳方式保留抗癌分子成分的操作来优化它。

第二,除了抗癌分子,食物还含有赋予食物味道、气味和独特风味的分子[18]。许多食物都有多种这样的成分:例如,你会惊讶地发现大蒜和茶有一百多种共同的味道分子。食物搭配的秘诀是将具有相似或互补风味分子特征的成分组合在一起[19]。被认为是顶级厨师的某种“黑魔法”现在可以自动化了——我们可以潜在地使用 graph ML 来生成食谱,在健康、味道甚至美学之间取得最佳平衡。有一天,我们电脑生成的食谱甚至会挑战米其林星级厨师,这并非不可能。

最后但并非最不重要的一点是,当谈到品味时,唯一共同的真理是,正如拉丁谚语所说的那样。食谱设计必须高度个性化,考虑到个人的口味偏好,以及许多其他参数,如饮食限制、遗传、病史和肠道微生物群。我们设想未来每个人都将拥有一个存储个人营养数据的数字“食物护照”,这样当你在网上订餐或外出就餐时,你的膳食将根据你的健康和食物状况进行优化。

最后的想法

Hyperfoods 首次尝试应用基于图形的 ML 方法,通过模拟食品中生物活性分子与我们体内生物分子相互作用的“网络效应”来预测其对健康的影响。graph ML 方法的使用使我们能够确定哪些食物中含有的成分可能与医学药物的作用方式相似,并有可能预防或战胜疾病。虽然癌症是一类重要的疾病,但同样的方法可以用于发现有助于预防神经退行性疾病、心血管疾病或病毒性疾病的食物[21]。

从更长远的角度来看,我们的目标是在如何“规定”、设计和准备我们的食物方面提供一个巨大的飞跃——让我们所有人过上更健康、更幸福、更美好的生活。

[1] M. J. Prince 等人,《老年人的疾病负担及其对健康政策和实践的影响》( 2015 年),《柳叶刀》385:549–562。

[2] GBD 2017 饮食合作者,195 个国家饮食风险的健康影响 (2019),Lancet 393:1958–1972 发现,1100 万例死亡可归因于饮食风险因素,其中 300 万例是由于全谷物摄入量低,200 万例是由于水果摄入量低。相比之下,T2 世卫组织估计烟草每年杀死 800 万人。

[3] M. S. Donaldson,营养与癌症:抗癌饮食证据综述 (2004),营养杂志 3,估计 30%-40%的癌症可以仅通过生活方式和饮食措施来预防,并建议坚持建议的饮食指南(包括十字花科蔬菜、亚麻籽和水果的推荐摄入量)可能导致乳腺癌、结肠直肠癌和前列腺癌减少 60%-70%,肺癌减少 40%-50%,以及类似的减少

[4]实验研究表明,这些分子参与多种机制,有助于预防或治疗各种癌症,包括调节炎症介质和生长因子的活性,抑制癌细胞存活、增殖和侵袭,以及血管生成和转移。例如,参见 A. K. Singh 等人,膳食植物化学物质在对抗癌症中的新兴重要性:在靶向癌症干细胞中的作用(2017),食品科学和营养学评论 57:3449-3463 或 R. Baena Ruiz 和 P. Salinas Hernandez,膳食植物化学物质的癌症化学预防:流行病学证据(2016),Maturitas 94:13-19。

[5]这种与物理学中的“暗物质的类比出现在 R. R. da Silva 等人的《代谢组学中的暗物质》(2015),PNAS 112(41):12549–12550 以及 A.-L. Barabási 等人的《我们饮食中未映射的化学复杂性》(2019),《自然食品》1:33–37 中。

[6]许多药物来源于植物,这常常反映在它们的名称中:例如,麻黄素得名于植物属麻黄,阿托品取自颠茄属植物颠茄,乙酰水杨酸,俗称阿司匹林,取自柳树皮白柳,其药性自古就为人所知。在肿瘤医学中,突出的例子是天然化合物喜树碱的类似物,它是从喜树中提取的,在传统医学中也是众所周知的。四种这样的分子——拓扑替康、伊立替康、贝洛替康和曲妥珠单抗 deruxtecan——被广泛用于癌症化疗。D. J. Newman 和 G. M. Cragg,1981 年至 2014 年(2016 年)天然产物作为新药的来源,《天然产物杂志》79(3):629–661 报道,几乎一半的抗癌疗法源自天然产物。

[7]蛋白质是活细胞的动力源泉,从字面上看是“生命分子”,因为我们目前还不知道任何不是以蛋白质为基础的生命形式。在我们的身体中,蛋白质负责催化化学反应(酶),为组织提供结构(胶原蛋白),运输氧气(血红蛋白),保护我们免受病原体(抗体)的侵害,等等。蛋白质是在细胞中通过一种特殊的化学机制合成的,这种机制读出遗传密码并将其翻译成氨基酸序列:称为“密码子的 DNA 核苷酸短序列编码 20 种蛋白质氨基酸。我们的基因组中编码了大约 20,000 种蛋白质,这些蛋白质相互作用,并与其他分子相互作用。由于蛋白质在生物化学过程中的关键作用,它们被用作药物靶标:典型的药物是小分子,其设计方式使得它们可以化学附着(“结合”)到特定的蛋白质上。

[8]据估计,一个药物分子可以结合近 50 种蛋白质,参见 B. Srinivasan 等人对八种蛋白质的 FINDSITE(comb)虚拟配体筛选结果的实验验证产生了新的纳摩尔和微摩尔结合物 (2014),Cheminformatics 6:16,因此一种药物-一个靶标的假设与现实相差甚远。

[9]蛋白质-蛋白质相互作用是“网络医学”中利用的图表的一个例子,该术语由 A.-L. Barabási 在《网络医学——从肥胖到“疾病体”(2007),新英格兰医学杂志 357:404–407 中创造并普及。

[10] A. Mullard,蛋白质-蛋白质相互作用抑制剂进入凹槽(2012)。自然评论药物发现 11(3):173–175 称 PPI 目标为“未开采的黄金储备”。大环是药物样小分子的一个例子,它破坏蛋白质-蛋白质相互作用并加速癌细胞死亡。尽管它们的治疗相关性和未开发的丰富性,但它们的采用受到技术障碍的阻碍,参见 T. L. Nero 等人,致癌蛋白质界面:小分子,大挑战(2014),自然评论癌症 14(4):248-262 和 D. E. Scott 等人,小分子,大目标:药物发现面临蛋白质-蛋白质相互作用的挑战(2016),自然评论药物发现 15:533-550。

[11]参见 M. M. Bronstein 等人的几何深度学习:超越欧几里德数据 (2017),IEEE Signal Processing Magazine 34(4):18–42 和我的关于这个主题的博文。

[12] K. Veselkov 等人, HyperFoods:食品中抗癌分子的机器智能图谱 (2019),科学报告 9。

[13]关于癌症的科学文献数量巨大,平均每 3 到 4 分钟就有一篇论文发表,即使是最勤奋的人类科学家也无法消化。我们使用了 D. Galea 等人早期开发的用于命名实体识别的 NLP 系统,开发和评估用于监督生物医学命名实体识别的多源数据 (2018),生物信息学 34(14):2474–2482。我们论文的补充材料提供了在食物中发现的化合物的详细列表以及它们抗癌作用的实验证据。

[14]苹果是一个很好的例子,说明为什么人们必须考虑多种化合物的拮抗或协同作用:苹果提取物含有生物活性化合物,已被证明在体外抑制肿瘤细胞生长。然而,这种效果因苹果皮是否保存而有很大差异:带皮的苹果抑制结肠癌细胞增殖达 43%,而不带皮的苹果仅抑制 29%,参见 M. V. Eberhardt 等人的《新鲜苹果的抗氧化活性》( 2000 年), Nature 405:903–904。

[15] M. Zitnik 等人,用图卷积网络对多药副作用建模 (2018),生物信息学 34(13):457–466,将图 ML 应用于蛋白质-蛋白质和蛋白质-药物相互作用图,以预测多药的副作用。

[16]茶是儿茶素(表没食子儿茶素没食子酸酯)、萜类化合物(羽扇豆醇)和单宁(原花青素)的丰富来源,它们分别通过保护活性氧化物质诱导的 DNA 损伤、抑制炎症、诱导凋亡和癌细胞周期停滞而发挥强大的互补抗癌作用。最近的几项荟萃分析表明,饮用绿茶可延迟癌症发作,降低治疗后癌症复发率,并增加长期癌症缓解率,参见 V. Gianfredi 等人绿茶饮用与乳腺癌和复发风险-观察性研究的系统综述和荟萃分析 (2018),营养素 10,以及 Y. Guo 等人:绿茶与前列腺癌风险: (2017),医学 96(13)。第二个例子是甜橙,这是一种柑橘类水果,含有化合物 dydimin(柑橘类黄酮)、obacunone(柠檬苦素样葡萄糖)和β-榄香烯,以其强抗氧化、促凋亡和化学敏化作用而闻名。S. Cirmi 等人的《柑橘类果汁及其提取物的抗癌潜力:临床前和临床研究的系统综述》 (2017),药理学前沿 8。

[17]我第一次见到基里尔是在 2015 年的世界经济论坛会议上。我们很快成为朋友,部分是因为我们共同的俄罗斯背景,然后在我 2018 年加入帝国理工学院时成为同事。基里尔是在 2018 年计算与食品未来的会议上认识乔泽夫的。Jozef 是厨房理论(Kitchen theory)的主厨赞助人,这是一家看起来像化学实验室的高端餐厅,客人们被邀请参加心理物理实验,比如一边听着嘎吱嘎吱的声音一边吃水母(这改变了对食物味道的感知)。

[18] FlavorDB 是一个在线资源,允许我们探索近 1000 种食物中超过 25000 种风味分子的含量。

[19] Y.-Y. Ahn 等,风味网络与食物搭配原则 (2011)。科学报告 1 通过分析共享风味分子图显示,西方烹饪倾向于使用具有共同风味化合物的配料对,而东亚烹饪倾向于避免共享化合物的配料。

[20]我们并不是第一个致力于自动菜谱生成的人:已经做了多次尝试,最著名的是 IBM 认知烹饪项目。然而,据我所知,我们是第一个超越味道并试图解释生物活性分子的人。

[21]graph ML 的使用在针对新疾病重新调整现有药物的用途方面似乎非常有前途(药物重新定位),这可以显著降低开发新疗法的成本和时间。作为药物和冠状病毒项目的一部分,我们目前正在使用沃达丰分布式计算平台寻找食品和现有药物组合中的抗病毒化合物,这些化合物可能对癌症和新冠肺炎有治疗作用。我还担任医药创业公司 Relation Therapeutic 的科学顾问,该公司与 Mila 和盖茨基金会合作,将 graph ML 与主动学习技术相结合,寻找针对新冠肺炎的组合疗法。

非常感谢费比诺·弗拉斯卡、卢卡·斯博多内和大卫·西尔弗对这篇文章的校对。Hyperfoods 是帝国理工学院的一个项目,由 Kirill Veselkov 领导,与沃达丰基金会和厨房理论合作。这篇文章无意作为医学建议:食物和疾病之间的关系仍然是一个新兴的研究领域,仍然缺乏系统的临床验证。厨师 Jozef Youssef 的食谱可在第一本 Hyperfoods 食谱 中在线获得。关于图形深度学习的其他文章,请参见我的 博客 关于走向数据科学, 订阅 我的帖子,获取 中等会员 ,或者关注我的Twitter。**

用于视网膜 OCT 图像分类的超参数分析

原文:https://towardsdatascience.com/hyperparameter-analysis-for-classification-of-retinal-oct-images-94254f67d914?source=collection_archive---------50-----------------------

通过使用 Monk,一个低代码深度学习工具和计算机视觉的统一包装器,使您的分类模型更好

超参数是在系统的训练过程之前指定的预定义参数。这些参数通常包括时期数、学习率和优化器等。它们识别机器学习模型的整体属性,并且可以被调整以控制机器学习算法的行为。

因此很容易猜测,设置最佳超参数意味着从您的模型中获得最大收益。通常,超参数优化涉及独立的过程,如 GridSearchCV 和 RandomizedSearchCV。在这里,我将向您展示优化超参数的最简单方法,使用 Monk 库中的内置函数。

CNV 受影响的眼睛的十月

视网膜光学相干断层扫描(OCT)是一种用于捕捉活着的患者的视网膜的高分辨率横截面的成像技术,并且这些图像的分析和解释占用了大量时间。我们的工作是将这些 OCT 图像分类为正常或 3 种疾病类型之一,即玻璃疣、CNV 或 DME。

目录

  1. 安装
  2. 建立模型
  3. 超参数分析
  4. 验证和推理

装置

安装 Monk,一个低代码深度学习工具,也是计算机视觉的统一包装器。

注意 : 我将在 Kaggle 上运行我的笔记本,我将使用的数据集是https://www.kaggle.com/paultimothymooney/kermany2018因此我将安装来自 Monk 的 Kaggle 需求。如果您希望在启用 CUDA 的系统上运行它,那么您应该安装 cu9 需求或 cu10 需求

*# Cloning the monk repository*
$ git clone [https://github.com/Tessellate-Imaging/monk_v1.git](https://github.com/Tessellate-Imaging/monk_v1.git)*# Installing the dependencies for Kaggle required by Monk*
$ pip install -r monk_v1/installation/Misc/requirements_kaggle.txt

如果您想在自己的系统上运行它,请将第二行替换为,

*# Installing the dependencies for CUDA 9 required by Monk*
$ pip install -r monk_v1/installation/Linux/requirements_cu9.txt*# Installing the dependencies for CUDA 10 required by Monk*
$ pip install -r monk_v1/installation/Linux/requirements_cu10.txt

建立模型

首先,我们将为我们的模型选择后端,在这种情况下,我将使用 MXNet 后端,

$ from gluon_prototype import prototype

然后,我们继续为我们的培训、测试和验证数据集定义路径。在我的例子中,它们在我的 Kaggle 工作目录中,在你的例子中,只需将路径粘贴到数据集中相应的文件夹中。

现在我们需要初始化我们的 Monk 原型,它将为项目建立一个工作目录

$ gtf = prototype(verbose=1)
$ gtf.Prototype("Retina-OCT", "Hyperparameter-Analyser")

现在可以用期望的基本模型、时期数和训练数据的位置来设置原型

$ gtf.Default(dataset_path=train_path,
           model_name="densenet121",
           freeze_base_network=False,
           num_epochs=5)

总之,设置的代码应该如下所示

正常眼的 OCT 对比 DME 患眼的 OCT

超参数分析

转到主要焦点,优化我们模型的超参数。调整超参数对模型的性能有明显的影响,因此优化是必要的。

我们将使用 Monk 的内置超参数分析仪,这使我们的工作变得非常容易。首先,给分析项目起一个名字,并定义您想要分析的所有超参数。

在 Monk 的内置超参数分析器中,您可以选择分析以下超参数:

  1. 学习率 : 控制模型适应问题的速度
  2. 批量 : 指训练的一次迭代中抽取的样本数
  3. 优化器 : 更新权重参数以最小化损失函数

您还可以分析历元数、输入大小和基础模型。

# Analysis Project Name$ analysis_name = "analyse_hyperparameters"
$ lrs = [0.1, 0.05, 0.01, 0.005, 0.0001] # learning rates
$ batch_sizes = [2, 4, 8, 12] # Batch sizes
$ models = [["densenet121", False, True], ["densenet169", False, True], ["densenet201", False, True]] # models
$ optimizers = ["sgd", "adam", "adagrad"] # optimizers
$ epochs=10 # number of epochs
$ percent_data=5 # percent of data to use

要分析每个超参数,使用内置函数开始分析,并输入与该超参数对应的列表。因此,如果您从学习率的分析开始,输入将是学习率列表 lrs

*# Analysis of learning rates*
$ analysis = gtf.Analyse_Learning_Rates(analysis_name,lrs,
           percent_data,num_epochs=epochs, state="keep_none")

所以为了分析所有的超参数

验证和推理

现在我们的模型已经完全优化了,我们可以用它来验证和推断我们的验证和测试数据集。

当然,在这之前,我们需要训练我们的模型。Monk 中的训练过程再简单不过了,它只是一行代码。

$ gtf.Train()

在等待该培训完成后,我们可以继续获取该模型的准确性。因此,我们再次初始化我们的原型,但是这次用 infer-eval 标志为真,这样模型就处于预测模式。

# Set flag eval_infer as True 
$ gtf = prototype(verbose=1)
$ gtf.Prototype("Retina-OCT","Hyperparameter-Analyser", 
              eval_infer = True)

加载验证数据集,对整个数据集运行预测并显示结果

# Load the validation dataset 
$ gtf.Dataset_Params(dataset_path=val_path)
$ gtf.Dataset()# Run validation
$ accuracy, class_based_accuracy = gtf.Evaluate()

现在,我们将对测试图像运行一个样本推断,然后对整个测试数据集进行预测

# Running sample inference$ img_name = test_path +"/DRUSEN/DRUSEN-1786810-3.jpeg"
$ predictions = gtf.Infer(img_name=img_name)#Display 
$ from IPython.display import Image
$ Image(filename=img_name)# Load the test dataset
$ gtf.Dataset_Params(dataset_path=test_path)
$ gtf.Dataset()# Run inference on test data
$ accuracy, class_based_accuracy = gtf.Evaluate()

推断和验证的完整代码看起来有点像这样

结果

优化后的模型给出了惊人的结果,在验证数据集上的准确率为 100%

Result
        class based accuracies
            0\. CNV - 100.0 %
            1\. DME - 100.0 %
            2\. DRUSEN - 100.0 %
            3\. NORMAL - 100.0 %
        total images:            32
        num correct predictions: 32
        Average accuracy (%):    100.0

这是一个关于测试图像的示例推断,

Prediction
    Image name:         ../input/kermany2018/OCT2017 /test/DRUSEN/DRUSEN-1786810-3.jpeg
    Predicted class:      DRUSEN
    Predicted score:      5.612982273101807

玻璃疣受累眼的 OCT

在测试数据集上给出了 99.17% 的准确率。

你可以在 Kaggle 上找到完整的笔记本

如果有任何问题,可以联系 Abhishek 和 Akash 。请随意联系他们。

我是 Monk Libraries 的开源贡献者。

由 Unsplash 上的 v2osk 拍摄的照片

最佳变压器模型的超参数优化

原文:https://towardsdatascience.com/hyperparameter-optimization-for-optimum-transformer-models-b95a32b70949?source=collection_archive---------15-----------------------

如何使用简单的转换器调整超参数,以实现更好的自然语言处理。

格伦·汉森在 Unsplash 拍摄的照片

任何深度学习模型的目标都是接受输入并生成正确的输出。这些输入和输出的性质在不同的应用程序之间有很大的不同,这取决于模型应该执行的特定工作。例如,狗品种分类模型可以将图像作为其输入,并生成狗品种的名称(或对应于该品种的数字标签)作为输出。另一个模型可能接受一条狗的文本描述作为其输入,并生成狗的品种名称作为其输出。第一个模型是计算机视觉模型的一个例子,而后者是自然语言处理(NLP) 模型的一个例子。

参数与超参数

这两个模型的内部都将包含许多花哨的部分(卷积层、注意力机制等)。),每个都是为他们的特定任务量身定制的。从高层次的角度来看,所有这些组件构成了一组参数(或权重),它们决定了任何给定输入的输出。训练深度学习模型是为这些参数寻找一组值的过程,这些值在给定的任务中产生最佳结果。

相比之下,超参数是控制训练过程本身的因素。学习速率、训练时期/迭代次数和批量是常见超参数的一些例子。为超参数选择的值对学习到的参数有重大影响,并进而影响模型的性能。

简而言之,参数是模型学习的内容,超参数决定了模型学习的好坏。

超参数优化

就像我们有各种技术来训练模型参数,我们也有方法找到最佳超参数值。寻找最佳超参数值的过程是超参数优化,该过程使模型能够发现执行给定任务的最佳参数组

作为一个松散的类比,考虑超频一个 CPU。通过优化电压、温度、时钟频率等。(超参数),你可以在不改变 CPU 架构(型号),或者 CPU 的组件(型号的参数)的情况下,让 CPU 以更高的速度运行。

知道了什么是超参数优化,您可能想知道在训练模型时是否需要它。毕竟,我们中的许多人都不会考虑超频我们的 CPU,因为它们通常开箱即用。就像现代的 CPU 一样,最先进的深度学习模型即使没有超参数优化,通常也能表现良好。只要你坚持明智的默认,SOTA 预训练模型结合迁移学习的力量足以产生一个性能令人满意的模型。

但是,当您认为“足够好”还不够好时,超参数优化是您工具箱中的一个重要工具,可以帮助您的模型走得更远。

简单变压器的超参数优化

Simple Transformers 是一个库,旨在使变压器模型的训练和使用尽可能简单。根据这一想法,它通过 W & B 扫描特性为超参数优化提供了本机支持。

简单的变形金刚是建立在令人难以置信的变形金刚库之上的,拥抱脸为 NLP 的普及做出了巨大的贡献!

本文将重点关注使用简单的 Transformers 库,以及 W&B 扫描,对识别 SuperGLUE [2】基准的文本蕴涵 [1】任务执行超参数优化。任务是对句子对进行二元分类,如下所述。

文本蕴涵 识别最近被提出作为一种通用任务,其捕获许多 NLP 应用的主要语义推理需求,例如问题回答、信息检索、信息提取和文本摘要。这个任务需要识别,给定两个文本片段,一个文本的含义是否是从另一个文本中推导出来的。

— 识别文本蕴涵 —

在本指南中,我们将执行三项主要任务来强调超参数优化的价值,并了解如何定制优化流程。

  1. 合理的默认值训练一个模型。
  2. 进行扫描以优化基本超参数
  3. 进行扫描以获得更多高级超参数优化

对于每项任务,我们将在 RTE 数据集上训练 RoBERTa-Large [3]模型。让我们设置好开发环境并下载数据集,这样我们就可以开始培训了!

设置

  1. 从这里安装 Anaconda 或 Miniconda 包管理器。
  2. 创建新的虚拟环境并安装软件包。
    conda create -n simpletransformers python pandas tqdm wandb
    conda activate simpletransformers
    conda install pytorch cudatoolkit=10.2 -c pytorch 注意:选择您系统上安装的 Cuda 工具包版本。
  3. 如果您使用 fp16 培训,请安装 Apex。请遵循此处的说明。
  4. 安装简单的变压器。
    pip install simpletransformers

数据准备

  1. 从这里下载数据。
  2. 将档案文件解压到data/。(应包含 3 个文件,train.jsonlval.jsonltest.jsonl)

下面给出的函数可用于读取这些jsonl文件,并将数据转换成简单的变压器输入格式(带有三列text_a, text_b, labels的熊猫数据帧)。

因为我们将在许多地方使用这个函数,所以将它添加到项目根目录下的文件utils.py中,这样就可以根据需要导入它。

RTE 数据集包含三个子数据集。

  1. 训练集(带标签)-用于训练模型。
  2. 验证集(已标记)—用于验证(超参数优化、交叉验证等)。)
  3. 测试集(未标记)-可以提交对该集进行的预测进行评分。

为了避免提交预测来测试我们的最终模型,我们将把验证集分成两个随机部分,一个用于验证(eval_df),另一个用于测试(test_df)。

运行上面显示的data_prep.py文件将创建eval_dftest_df,我们将使用它们来验证和测试我们的模型。

用合理的默认值训练模型

有了经验,大多数人倾向于对重要的超参数以及哪些值对那些超参数有效产生直觉。根据我的经验,在 NLP 任务中训练 Transformer 模型时要考虑的两个最重要的超参数是学习速率训练时期数。

训练太多的历元或使用太高的学习率通常会导致灾难性遗忘,模型通常会对任何给定的输入生成相同的输出/标签。另一方面,训练历元数量不足或太低的学习率会导致低于标准的模型。

我对这两个超参数的定位值通常是5e-52学习率3训练时段(我增加了较小数据集的训练时段数量)。

然而,当我在 RTE 数据集上应用这些值训练模型时,我发现我的直觉让我失望了。该模型最终预测所有输入的标签相同,这表明学习率过高。将学习率降低到1e-5足以避免这个问题。

下面的脚本展示了如何用合理的默认值训练一个模型。

关于 *model_args* 属性的详细信息,可以根据需要参考变形金刚的简单文档( 此处 此处 )。

由于 RTE 任务使用准确性作为 SuperGLUE 基准测试中的度量,我们也将这样做。

使用可感知的默认超参数值,该模型达到了 0.8116 的精度。模型的混淆矩阵如下所示。

用合理的默认值训练的模型的混淆矩阵

您还可以在这里 看到完整的训练进度以及其他指标

还不错,不过还是看看超参数优化能做什么吧。

基本超参数优化

简单变压器中的 W&B Sweeps [4]集成简化了超参数优化过程。

可以通过 Python 字典定义扫描配置,该字典指定要优化的度量、要使用的搜索策略和要优化的超参数。

我强烈推荐浏览 文档 了解更多关于如何配置扫描的信息。

对于我们的基本超参数优化,我们将关注与前面部分相同的两个超参数,即学习率训练时期数

扫描配置可定义如下。

注意:你可以使用简单变压器模型的 配置选项 中的任何一个作为扫描时要优化的参数。

这里,我们使用bayes(贝叶斯优化)搜索策略来优化超参数。

贝叶斯优化使用高斯过程来模拟函数,然后选择参数来优化改进的概率。

— W & B 文档

我们想要优化的指标是accuracy,目标显然是最大化它。请注意,要优化的指标必须记录到 W & B 中。

需要优化的参数是learning_ratenum_train_epochs。这里,学习率可以取从04e-4的任何值,而训练时期的数量可以是从140的任何整数。

W&B 扫描还可以通过终止任何表现不佳的运行来加速超参数优化(early_terminate)。这使用了超波段算法,如这里的所解释的。

扫描的最后一个要求是一个函数,可以调用该函数用一组给定的超参数值来训练模型。

该函数将初始化wandb运行,建立简单的 Transformers 模型,训练模型,最后同步结果。

当前运行的一组超参数值包含在wandb.config中,可以传递给一个简单的变压器模型。所有简单的变形金刚模型都接受一个sweep_config关键字参数,并将根据传递给sweep_configwandb.config自动更新model_args

我们还确保在训练模型时,在验证集(eval_df)上计算accuracy指标。简单转换器中的所有eval_model()train_model()方法都接受由指标名和指标函数名组成的关键字参数。这里用来计算eval_df上的accuracy(更多信息在 文档 )

将所有这些放在一个 Python 文件中,我们得到了下面的脚本。

现在我们让它跑吧!

W&B 仪表板提供了许多图表和可视化效果,其中包含了大量有价值的信息。下图描绘了在扫描过程中(48 次运行约 13 小时)每个模型获得的精度。

准确度 vs 创造的

根据达到的精度对这 48 次运行进行细分,我们得到以下结果:

  • 10 次运行获得的准确度大于 0.8
  • 23 次运行达到了精确到0.5507 的精度
  • 15 次运行达到的精度为精确到0.4493

这些结果可能看起来有点奇怪(使用精确的相同的准确度分数进行多次运行),直到您考虑到这样一个事实,即当使用错误的超参数值进行训练时,变压器模型可能会完全崩溃。这导致模型对任何输入预测相同的标签,解释具有相同准确度分数的模型(由于测试集中不平衡的标签,有两种可能的准确度)。

这个假设在参数重要性可视化中得到证实。

基本超参数优化的参数重要性

这里,我们有两个超参数对最终精度的影响。learning_rate与准确度有很高的负相关性,因为高学习率导致模型预测所有输入的标签相同。

下面的平行坐标图证实了同样的理论。

基本超参数优化的平行坐标图

专注于准确度高于 0.8 的运行进一步强化了这一想法。

基本超参数优化的平行坐标图(精度> 0.8)

有趣的是,当在这个范围内使用学习率值时,训练时期的数量也开始发挥更重要的作用。

基本超参数优化的参数重要性(精确度> 0.8)

在这里随意挖掘扫描结果!

现在,让我们看看用这些超参数训练的模型在测试集上的表现。

提醒:模型在训练集上训练,扫描在验证集( *eval_df* )上评估,最终模型(使用最佳超参数值)将在测试集( *test_df* )上评估。

该脚本使用扫描过程中在eval_df上产生最佳精度的超参数值。

learning_rate = 0.00003173
num_train_epochs = 40

用这些超参数值训练的模型获得了 0.8768 的精度,比敏感默认值模型( 0.8116 )有了显著提高。

查看测试集预测的混淆矩阵:

用基本超参数优化训练的模型的混淆矩阵

显然,我们的超参数优化取得了成效!

您还可以在这里 看到完整的训练进度以及其他指标

高级超参数优化

在上一节中,我们看到了学习率在一个经过训练的模型的性能中起着至关重要的作用。具有太高的学习率会导致模型损坏,而训练具有太低的学习率的模型会导致模型拟合不足或模型陷入局部最小值。

这个难题的一个潜在解决方案依赖于这样一个事实,即学习率似乎并不平等地影响模型的所有部分。例如,添加在 Transformer 模型层之上的分类层在更高的学习速率下更不容易被破坏。这可能是因为分类层在微调预训练模型时被随机初始化。即分类层不是预训练层,因此没有任何获得的知识会因灾难性遗忘而丢失。另一方面,分类层更有可能陷入局部最小值(具有低学习率),这正是因为它是随机初始化的。

当比较学习速率对早期层和后期层的影响时,可以观察到相同的现象,尽管程度较低(且一致性较低)。早期层比最终层更容易发生灾难性遗忘。

对于简单的变压器,我们可以为变压器模型中每个名为参数定义不同的学习速率。方便的是,我们还可以为模型中的任何给定层设置学习速率(RoBERTa-LARGE 为 24 层)。让我们看看是否可以将这一特性与我们对学习率的影响的了解结合起来,以推动我们的模型达到更好的性能。**

虽然我们可以尝试分别优化每一层的学习速率,但我选择将这些层捆绑成四个相等的组,每个组包含六个连续的层。这将使我们更容易看到扫描结果,也可能使扫描更容易优化超参数,因为变量更少。

RoBERTa 模型的分类层有四个命名的参数,每个参数将被单独优化。或者,这些也可以组合成一个组(这可能是更合理的选择),但是出于演示的目的,我将它们分开。

提示:所有简单的变形金刚模型都有一个 *get_named_parameters()* 方法,该方法返回模型中所有参数名称的列表。

同样,我们将从设置扫描配置开始。

我们正在使用从基本超参数优化中获得的见解,为变压器模型层的学习率设置一个较小的最大值,同时为分类层参数提供更多的余地。

关于使用自定义参数组和改编自文档的简单变压器的快速补充说明:

简单变形金刚模型的model_args(在本例中是一个ClassificationArgs对象)有三个与配置自定义参数组相关的属性。

  1. custom_layer_parameters
  2. custom_parameter_groups
  3. train_custom_parameters_only

自定义图层参数

custom_layer_parameters为给定层或层组设置(PyTorch)优化器选项更加方便。这应该是一个 Python 字典列表,其中每个字典包含一个layer键和任何其他与优化器接受的关键字参数匹配的可选键(例如lrweight_decay)。layer键的值应为指定层的int(必须是数字)(如0111)。

例如:

自定义参数组

custom_parameter_groups提供最精细的配置选项。这应该是一个 Python 字典列表,其中每个字典包含一个params键和任何其他与优化器接受的关键字参数匹配的可选键(例如lrweight_decay)。params键的值应该是一个命名参数列表(例如["classifier.weight", "bert.encoder.layer.10.output.dense.weight"])。

例如:

仅训练自定义参数

train_custom_parameters_only选项仅用于方便特定参数的训练。如果train_custom_parameters_only设置为True,则只训练custom_parameter_groupscustom_layer_parameters中指定的参数。

返回超参数优化:

虽然您可以使用简单变压器模型中可用的任何配置选项作为要优化的超参数,但 W&B Sweeps 目前不支持具有嵌套参数的配置。这意味着配置选项中预期的数据类型是集合(字典、列表等。)不能在扫描配置中直接配置。但是,我们自己可以轻松处理这个逻辑。

查看我们之前定义的sweep_config,我们可以观察到没有一个参数是嵌套的,尽管我们想要具有相同学习速率的多个层。**

扫描将为配置中定义的每个参数提供一个值(每次运行)。我们将在扫描的train()函数中把它转换成简单转换器所期望的格式。

选择sweep_config中的参数名称是为了使转换相对简单。

  • 层组的名称格式为layer_<start_layer>-<end_layer>
  • 参数组(分类器参数)的名称格式为params_<parameter name>

基于这个命名约定,让我们看看如何解析sweep_config来提取适当的超参数值。

首先,我们获取分配给当前运行的超参数值。这些可以通过 Sweep 的train()方法中的wandb.config对象来访问。幸运的是,我们可以将wandb.config转换成易于解析的 Python 字典。

我们还移除了_wandb键,并将其他字典条目重新排列成从参数名称到其当前值的直接映射。

接下来,我们遍历字典中的每一项,并以简单转换器所期望的格式构建一个字典。最后,我们用字典值更新model_args(一个ClassificationArgs对象)。

将所有这些整合到一个 Python 脚本中,我们就可以开始比赛了!

精确度与为高级超参数优化创建的

在高级超参数优化扫描中,四十(40)次运行中有三十八(38)次达到了高于 0.8 的精度(相比之下,基本优化中为 48 次运行中的 10 次)。

当我们包括所有运行时,平行坐标图有点难以可视化,但我们可以专注于单个组以获得更清晰的图片。

高级超参数优化的平行坐标图

我推荐你亲自去看看平行图(这里),因为它有许多互动功能,比单独的图像更好地可视化扫描。

第 0 层至第 6 层

0–6 层的平行坐标图

第 6 至 12 层

第 6-12 层的平行坐标图

第 12 至 18 层

12-18 层的平行坐标图

第 18 至 24 层

18-24 层的平行坐标图

精确度> 0.8 的运行的第 0-24 层

对于精度> 0.8 的运行,0-24 层的平行坐标图

虽然这个图确实有点嘈杂,但我们仍然可以看到,较好的模型(浅绿色)在 24 层的前半部分确实具有较低的学习率,而在另一半部分具有较高的学习率

精确度> 0.8 的运行的分类层

准确度> 0.8 的运行分类层的平行坐标图

**分类层的平行坐标图似乎比变压器模型层的图更嘈杂。这可能表明分类层相对更健壮,并且只要学习率足够高以避免陷入局部最小值,就可以学习良好的权重。

最后,让我们看看用从高级扫描中找到的最佳超参数训练的模型将如何在测试集上执行。

要下载包含最佳运行超参数的 CSV 文件,请转到 W&B 仪表板中的扫描表,搜索deep-sweep(最佳运行的名称),然后单击下载按钮(右上角)。创建一个目录sweep_results并将 CSV 文件保存为sweep_results/deep-sweep.csv

从最佳运行下载超参数值

下面的脚本将训练模型并根据测试集对其进行评估。

deep-sweep.csv提取的超参数值如下所示。

该模型在测试集上的最终精度得分为 0.8913

查看测试集预测的混淆矩阵:

用高级超参数优化训练的模型的混淆矩阵

与从基本超参数优化* vs 敏感默认值(0.8768vs0.8116】)获得的精度增益相比,从高级超参数优化 vs 基本超参数优化(0.8913vs0.8768】获得的精度增益要小得多。然而,这仍然是对基本超参数优化的显著改进。*

结果

准确(性)

混淆矩阵

总结

  • 超参数优化可用于训练具有显著更好性能的模型。
  • **学习速率训练时期数是训练变压器模型时要考虑的两个最关键的超参数。
  • 通过对模型的不同层使用(并优化)不同的学习速率,可以进一步提高性能增益。
  • 在任务复杂且模型难以学习的情况下,高级超参数优化可能会更加出色。
  • 超参数调谐可用于找到临界超参数的良好值范围,然后可用于寻找更好的值。
  • 如果您想阅读更多关于超参数调整和相关算法的内容,这篇文章非常值得一读!

参考文献

[1]詹皮科洛博士、马尼尼博士、达甘博士和多兰博士,2007 年。第三个帕斯卡认识到文本蕴涵的挑战。在ACL-PASCAL 关于文本蕴涵和释义的研讨会会议录(第 1-9 页)。

[2]王敬实、亚大·普鲁克萨奇昆、尼基塔·南吉亚、阿曼普里特·辛格、朱利安·迈克尔、菲利克斯·希尔、奥梅尔·利维和塞缪尔·鲍曼 2019。强力胶:通用语言理解系统的一个更棘手的基准。 arXiv 预印本 1905.00537

[3]刘,y .,奥特,m .,戈亚尔,n .,杜,j .,乔希,m .,陈,d .,列维,o .,刘易斯,m .,泽特勒莫耶,l .和斯托扬诺夫,v .,2019。Roberta:稳健优化的 bert 预训练方法。 arXiv 预印本 arXiv:1907.11692

https://docs.wandb.com/sweeps

利用 Scikit-Learn、Scikit-Opt 和 Keras 优化超参数

原文:https://towardsdatascience.com/hyperparameter-optimization-with-scikit-learn-scikit-opt-and-keras-f13367f3e796?source=collection_archive---------10-----------------------

探索使用网格搜索、随机搜索和贝叶斯优化来优化模型超参数的实用方法。

超参数优化通常是数据科学项目的最后步骤之一。一旦你有了一个有前途的模型的候选名单,你会想要微调它们,使它们在你的特定数据集上表现得更好。

在本文中,我们将介绍三种用于寻找最佳超参数的技术,并举例说明如何在 Scikit-Learn 中的模型上实现这些技术,最后介绍 Keras 中的神经网络。我们将讨论的三种技术如下:

  • 网格搜索
  • 随机搜索
  • 贝叶斯优化

你可以在这里查看 jupyter 笔记本。

网格搜索

一种选择是手动调整超参数,直到找到优化性能指标的超参数值的最佳组合。这将是非常乏味的工作,你可能没有时间探索许多组合。

相反,你应该让 Scikit-Learn 的GridSearchCV为你做这件事。你要做的就是告诉它你要试验哪些超参数,要试验哪些值,它会用交叉验证来评估超参数值的所有可能组合。

让我们来看一个例子,在这个例子中,我们使用GridSearchCV为使用流行的 MNIST 数据集训练的 RandomForestClassifier 搜索超参数值的最佳组合。

为了让您对分类任务的复杂性有所了解,下图显示了 MNIST 数据集中的一些影像:

为了实现GridSearchCV,我们需要定义一些东西。首先是我们想要试验的超参数和我们想要尝试的值。下面我们在一本名为param_grid的字典中对此进行详细说明。

param_grid告诉 Scikit-Learn 评估指定的bootstrapmax_depthmax_featuresmin_samples_leafmin_samples_splitn_estimators超参数的 1 x 2 x 2 x 2 x 2 x 2 = 32 种组合。网格搜索将探索 RandomForestClassifier 的超参数值的 32 种组合,并且它将训练每个模型 5 次(因为我们正在使用五重交叉验证)。也就是说,总而言之,会有 32 x 5 = 160 轮的训练!这可能需要很长时间,但完成后,您可以获得如下超参数的最佳组合:

forest_grid_search.best_params_

由于 n_estimators=350 和 max_depth=10 是评估的最大值,您可能应该尝试用更高的值再次搜索;分数可能会继续提高。

你也可以直接得到最佳估计量:

forest_grid_search.best_estimator_

当然,评估分数也是可用的:

forest_grid_search.best_score_

我们在这里的最好成绩是 94.59%的准确率,这对于这样一个小参数网格来说已经不错了。

随机搜索

当您探索相对较少的组合时,网格搜索方法很好,就像前面的例子一样,但是当超参数空间很大时,通常最好使用RandomizedSearchCV来代替。这个类的使用方式与GridSearchCV类非常相似,但是它不是尝试所有可能的组合,而是通过在每次迭代中为每个超参数选择一个随机值来评估给定数量的随机组合。这种方法有两个主要好处:

  • 如果让随机搜索运行 1000 次迭代,这种方法将为每个超参数探索 1000 个不同的值(而不是网格搜索方法中每个超参数只有几个值)。
  • 只需设置迭代次数,您就可以更好地控制分配给超参数搜索的计算预算。

让我们像以前一样浏览同一个例子,但是使用RandomizedSearchCV。由于我们使用了RandomizedSearchCV,我们可以搜索比使用GridSearchCV更大的参数空间:

同上,我们可以看到探索的最佳超参数:

forest_rand_search.best_params_

也是最好的评估者:

forest_rand_search.best_estimator_

并查看最佳分数:

forest_rand_search.best_score_

我们最好的表现是 96.21%的准确率,比GridSearchCV高出 1.5%。如你所见,RandomizedSearchCV允许我们在相对相同的时间内探索更大的超参数空间,并且通常比GridSearchCV输出更好的结果。

现在,您可以保存这个模型,在测试集上对它进行评估,如果您对它的性能满意,就可以将它部署到生产环境中。使用随机搜索并不太难,对于许多相当简单的问题来说,它工作得很好。

然而,当训练很慢时(例如,对于具有较大数据集的更复杂的问题),这种方法将只探索超参数空间的很小一部分。您可以通过手动协助搜索过程来部分缓解这个问题:首先,使用大范围的超参数值运行快速随机搜索,然后使用以第一次运行中找到的最佳值为中心的较小范围的值运行另一次搜索,以此类推。这种方法有望放大一组好的超参数。然而,这非常耗费时间,而且可能不是对时间的最佳利用。

贝叶斯优化

幸运的是,有许多技术可以比随机更有效地探索搜索空间。他们的核心思想很简单:当空间的一个区域被证明是好的,它应该被更多地探索。这种技术为您处理“缩放”过程,并在更短的时间内产生更好的解决方案。

其中一种技术叫做贝叶斯优化,我们将使用 Scikit-Optimize(Skopt)https://scikit-optimize.github.io/来执行贝叶斯优化。Skopt 是一个通用优化库,它使用一个类似于GridSearchCV的接口,用它的类BayesSearchCV执行贝叶斯优化。

如果您还没有安装 Skopt,请在您的虚拟环境中运行下面一行代码:

! pip install scikit-optimize

使用 Skopt 的BayesSearchCV进行贝叶斯优化有两个主要区别。首先,在创建你的搜索空间时,你需要把每个超参数的空间做成一个概率分布,而不是使用像GridSearchCV这样的列表。Skopt 通过他们的库 skopt.space 使这一点变得简单,它允许我们导入实数、整数和分类数来创建概率分布。

  • :连续超参数空间。
  • 整数:离散超参数空间。
  • 分类:分类超参数空间。

下面你可以看到使用分类函数和整数函数的例子。对于分类空间,只需在函数中输入一个列表。对于整数空间,输入您希望BayesSearchCV探索的最小值和最大值。

函数on_step允许我们实现一种提前停止的形式,并在每次迭代后打印出分数。在这里,我们指定在每次迭代之后,我们要打印最好的分数,如果最好的分数大于 98%的准确度,就不再需要训练。

就像在 Scikit-Learn 中一样,我们可以查看最佳参数:

forest_bayes_search.best_params_

最好的估计是:

forest_bayes_search.best_estimator_

最好的成绩是:

forest_bayes_search.best_score_

贝叶斯优化让我们在与随机搜索相同的迭代次数下,将准确率提高了整整一个百分点。我希望这能说服你使用GridSearchCVRandomizedSearchCV离开你的舒适区,尝试在你的下一个项目中实现像BayesSearchCV这样的新事物。超参数搜索可能会很繁琐,但是有一些工具可以为您完成这项繁琐的工作。

微调神经网络超参数

神经网络的灵活性也是其主要缺点之一:有许多超参数需要调整。您不仅可以使用任何可以想象的网络架构,而且即使在一个简单的 MLP 中,您也可以更改层数、每层神经元的数量、每层中使用的激活函数的类型、权重初始化逻辑等等。很难知道什么样的超参数组合最适合您的任务。

一种选择是简单地尝试超参数的许多组合,看看哪一个在验证集上效果最好(或者使用 K-fold 交叉验证)。例如,我们可以使用GridSearchCVRandomizedSearchCV来探索超参数空间。为此,我们需要将 Keras 模型包装在模仿常规 Scikit-Learn 分类器的对象中。第一步是在给定一组超参数的情况下,创建一个将构建和编译 Keras 模型的函数:

此函数使用给定的输入形状和给定的隐藏层和神经元数量为多类分类创建一个简单的顺序模型,并使用配置了指定学习速率的 SGD 优化器对其进行编译。

接下来,让我们基于这个build_model()函数创建一个 KerasClassifier:

keras_clf = keras.wrappers.scikit_learn.KerasClassifier(build_model)

KerasClassifier对象是使用build_model()构建的 Keras 模型的一个薄薄的包装器。这将允许我们像使用常规 Scikit-Learn 分类器一样使用这个对象:我们可以使用它的fit()方法训练它,然后使用它的score()方法评估它,并使用它的predict()方法进行预测。

我们不想像这样训练和评估单个模型,我们想训练数百个变体,看看哪一个在验证集上表现最好。由于有许多超参数,最好使用随机搜索而不是网格搜索。让我们尝试探索隐藏层的数量、神经元的数量和学习率:

现在,我们可以像在 Scikit-Learn 中一样访问最佳参数、估计值和分数:

keras_rand_search.best_params_
keras_rand_search.best_score_

我们的准确率又提高了 0.5%!最后一步是观察每个模型在测试集上的表现(见下文)。

结论

超参数调整仍然是一个活跃的研究领域,目前正在产生不同的算法。但是在你的口袋里有基本的算法可以减轻许多寻找最佳超参数的繁琐工作。

请记住,随机搜索几乎总是比网格搜索更可取,除非您需要探索的超参数非常少。如果您在使用更大的数据集时遇到了更复杂的问题,您可能希望求助于一种更有效地探索搜索空间的技术,如贝叶斯优化。

一如既往,非常感谢任何反馈和建设性的批评。

如果您想查看演示幻灯片或 jupyter 笔记本,并在此处查看完整的代码和描述,请随意查看 Github 资源库。

额外资源

[## scikit-optimize:Python-scikit-optimize 0 . 7 . 3 中基于顺序模型的优化…

编辑描述

scikit-optimize.github.io](https://scikit-optimize.github.io/stable/)

这篇文章涵盖了两个不同的能够执行贝叶斯优化的库,绝对值得一看:

[## Optuna vs Hyperopt:应该选择哪个超参数优化库?-海王星,我

思考应该选择哪个库进行超参数优化?使用远视有一段时间了,感觉像…

海王星. ai](https://neptune.ai/blog/optuna-vs-hyperopt) [## 机器学习的贝叶斯超参数优化的概念解释

使用贝叶斯优化的高效超参数调整背后的概念

towardsdatascience.com](/a-conceptual-explanation-of-bayesian-model-based-hyperparameter-optimization-for-machine-learning-b8172278050f)

迭代扫描超参数搜索

原文:https://towardsdatascience.com/hyperparameter-search-with-iterative-sweeps-3799df1a4d45?source=collection_archive---------42-----------------------

如何在深度学习模型上运行有效的超参数搜索,使用来自 Weights & Biases 的特定可视示例

我花了几年时间来复制和优化各种深度学习模型,主要是针对计算机视觉和 NLP,通常有极短的期限。我提炼的超参数搜索的高级策略是有界探索(用更少的变量尝试更大范围的值)和更快的迭代(更多的探索阶段建立在彼此之上)。我希望这个超参数搜索的概述可以帮助你更快地调整深度学习模型,不管你使用的是什么框架或工具。

什么是超参数搜索?

超参数搜索——或调整,或优化——是为学习算法寻找最佳超参数的任务。这种调整可以完全手动完成:运行一个受控实验(保持所有超参数不变,只有一个除外),分析单个值变化的影响,基于此决定接下来要改变哪个超参数,运行下一个实验,并重复。当然,对于卷积或递归神经网络等深度学习算法来说,这将是非常缓慢的:每个实验(超参数值的一个组合)都需要端到端地训练模型。我们可以通过在手动搜索中使用 meta 来使这个过程更易于管理。

一个示例在权重和偏差 UI 中扫描工作空间。图片作者。

方法:手动、网格、随机

算法或自动化超参数调优的核心承诺是更明智地选择下一个实验。如果我们无论如何都需要为一系列不同的超参数尝试一系列不同的值,我们如何才能最佳地选择下一个组合——并运行更少的实验,浪费更少的计算资源,甚至更快地获得结果?这方面的标准方法是网格随机和贝叶斯或贝叶斯(尽管您会听到这个领域中其他术语和策略的长尾效应,尤其是基于模型的优化)。网格搜索会尝试所有可能的组合——可以把它想象成一个嵌套的 for 循环,其中实验的总数大约是超参数的数量乘以每个超参数的可能值的数量。如果您的搜索空间很小,并且希望确保找到最佳选项,这将非常有用。随机搜索通常更快,如果你有更大的搜索空间,特别推荐使用随机搜索,因为它会对更大范围的组合进行采样,并比网格搜索更快地给你一种可能性的感觉。但是,不能保证找到最佳组合。

贝叶斯

贝叶斯优化建立了一个概率模型,或有根据的猜测,从您的超参数选择到您的性能的目标测量,通常是验证准确性的函数映射。您正在训练的实际模型的贝叶斯模型基于迄今为止看到的所有值和结果,预测接下来要尝试什么值。该过程旨在平衡探索-利用的权衡,根据预设的目标,尝试它不确定获得关于空间的更多信息的值和它期望接近最优的值。在实践中,贝叶斯优化比网格和随机更快,因为它运行的“坏”实验更少。贝叶斯确实需要目标度量来优化,这可以默认为模型的验证损失。你可以点击阅读关于贝叶斯优化的更详细的介绍。

其他方法的长尾效应

其他方法包括基于梯度的优化,以明确地计算关于某些超参数的梯度,早期停止以避免在没有希望的运行上浪费时间,以及应用于连续的所选超参数集的进化优化。还有基于群体的训练,其中多个独立的过程同时学习超参数值和网络权重。这里有很多选项——包括算法细节和黑盒优化服务——我无法一一介绍。一旦你研究了这些细节和权衡,我会问自己,我是否已经考虑了我正在调优的特定模型和我正在解决的特定问题,并得出结论说我没有其他聪明的办法可以做——我只想用 GPU 来完成这项任务?如果是的话,我会建议使用一些优化,比如贝叶斯,因为这很可能会更快地工作,并去考虑其他事情。但是以我的经验来看,更有趣、更有挑战性、更有回报的超参数调整工作发生在这个阶段之前,我们还没有很好的算法来解决这个问题——这就是为什么我们中的许多人仍然从事机器学习的工作。因此,让我们深入了解这一部分!

超参数编码谱

在您开始尝试不同的超参数之前,您需要决定什么是超参数。在网络的常规参数和超参数之间有一个重要的区别,常规参数如模型权重和偏差,它们本身是学习的,或者在训练过程中反复改进,而超参数在训练过程之外配置,并且通常在其持续时间内是固定的(尽管有些可以是自适应的,如学习速率)。对于给定的网络,这些可以包括训练时期的数量、学习优化器类型、批量大小、权重衰减等等。网络架构本身可能是一个超参数:我是从像 Inception 或 ResNet 这样的知名基础网络开始的吗?相对于微调,我冻结了多少层?如果我正在从头开始设计一个网络,那么层的数量、大小、类型和连接模式,以及卷积中滑动窗口的维度,都可以是超参数。要决定给定的超参数是固定的还是可变的,您可能需要考虑如何提前预测它的影响,以及它将如何影响搜索的整体运行时间和复杂性。

纪元

epochs——或通过整个训练数据的次数——是一个非常好理解的超参数。当我运行重复的实验时,我希望将这个值设置得足够高,以看到明确的改进,但又不要高到在非常缓慢收敛的曲线上浪费时间。我通常尝试 10 次左右,如果我能逃脱的话——只要我能看到损失减少并开始渐近。看到验证损失的改善对于确保模型不仅仅是记忆训练数据是特别重要的。

资料组

你的训练数据的大小,以及你用多少例子来验证你的训练,是另一个被充分探索的超参数。假设您的数据和分割是有代表性的无偏样本,数据集越大,性能越好-当然,每个假设的测试时间也越长。我遵循 80/10/10 分割的传统智慧,在所有训练和调优完成之前保留 10%的数据,以获得模型泛化能力的最佳感觉。在手动模式下,我训练 80%,在每个时期后验证 10%。在实践中,每次 80%的实验训练和 10%的验证对于超参数搜索来说太慢了。我降低了这些要求,将每次分割的 20-50%作为每次实验的标准。我试图将一个实验的运行时间缩短到几分钟。

在每组实验运行之后——它们一起形成一个扫描— ,您可以使用完整的训练和验证集进行测试。希望观察到的模式保持不变,甚至可能略有增加。如果添加更多的数据没有帮助或伤害,我可能会适得其反,可能需要增加每次扫描所用数据的百分比。验证数据在这里尤其棘手,因为小得多的样本可能噪声太大,不具有代表性。一个解决方案是每次随机选择一个验证子集,记住,如果有的话,你正在解决一个更难的问题。

迭代扫描

对于超参数搜索过程来说,这是一个很好的框架:迭代扫描,或者在一个小的子集上重复调优阶段,然后在完整的训练和验证集上进行测试。在每一次扫描中,您可能隐含地决定,哪些超参数在代码中保持固定,哪些将通过改变它们来测试。因此,您的首要选择之一是一次改变多少:如果您对每个可能的设置进行扫描,或者如果您对一个超参数测试了太多的值,您需要等待几天才能得到结果。

可管理的探索

一般的策略是,尤其是在时间紧迫的情况下,从简单的架构或现有的最佳解决方案开始。运行一些手动测试来选择一个好的历元计数和训练/验证大小。尝试对一小组超参数(比如 3-10)进行探索性扫描。开始的超参数越多,这个阶段就越长。对于每个超参数,在更宽的范围内采样更少的值——即使一些运行失败,您也会对搜索空间有更好的感觉。在这一点上,我不会进入非常精确或不寻常的值——常见的默认值是好的,例如,批量大小为 2 的幂,并且每个超参数也不要太多——我可以在后面的扫描中缩小我的关注范围。

调音的第一人选

我发现,探索训练动态——网络学习的快慢——是一个可靠的第一关:在这里,你可以通过落入正确的范围来轻松获胜。例如,通过学习速率和批量大小,我可以只对几个值进行采样,以获得关于网络对该超参数的敏感度的大部分信息。获得正确的学习率数量级:比如说,0.01 比 0.001 比 0.0001,通常比获得 0.0001 比 0.00015 的完美值更有影响力。优化器将与学习速度和批量大小高度相关,但它们也会对收敛产生巨大影响,并且值得探索(例如,Adam 对于许多应用程序来说都很棒,但我见过 SGD 大大优于 Adam 的项目)。

调整的下一个候选对象

一旦我在训练动力学中为更容易的候选者设置了一些范围,我就挑选一些更高级的细节,比如层大小或过滤器的数量。总体网络架构很适合在这里探索,但我会避免一次进行太多的更改或一次尝试太多详细的假设,因为这样会产生更多的案例需要测试。例如,我会构建两个或更多的架构来捕捉我的想法之间的一般差异——比方说,一个常规的 RNN 和一个鸟瞰 RNN,或者一个具有最大与平均池的 CNN,并使用这些作为分类变量。另一种方法是参数化卷积块的数量。但是,如果一个超参数是卷积块的数量,另一个是每个卷积层中的滤波器数量,另一个是最大或平均池,我会遇到组合爆炸,我试图通过将这些扫描限制在紧凑、可管理的迭代来避免这种爆炸。在这一点上,辍学可以很好地测试,但通常是在我已经学得很好之后——当我在探索过程中过早地增加辍学时,我的跑步中有很大一部分根本没有学到很多东西。你可以在这里加入其他细节,比如体重衰减、学习率时间表、训练阶段、冻结层数等等。可能性是无穷无尽的,我的主要建议是,不要试图太快捕捉太多——首先坚持比你可能想要的更简单的扫描,然后看看你能学到什么。

保姆和被完成

你如何判断你的清扫表现如何,何时停止?我经常着迷地刷新我的终端输出,以查看缓慢运行的统计数据。有了像权重&偏差这样的工具,这部分就更令人愉快了,因为我可以看到我的损耗和精度的实时图。尽管如此,这并不是对人类超参数调节能力的有效利用。对于我运行超参数扫描的任何模型,我已经验证了训练和验证损失通常会减少,并且训练和验证准确性(或任何其他性能指标)通常会增加。一旦您调试了代码,并且确定扫描运行正确,并且在某个地方记录了结果,我强烈建议不要刷新它,如果您能够抵制改进指标的诱惑的话。与手动探索模式不同,实验 B 不再以查看实验 a 中的假设如何实现为条件。相反,我们让自动超参数调整为我们工作。假设单次运行可以限制在几分钟内,一个小时或几个小时通常足够进行一次扫描。有了权重&偏差,缩放扫描也很容易。在另一台机器上运行相同的启动命令,管理超参数的下一个选择的逻辑将在两台机器或代理上并行化。这使您可以在尽可能多的 GPU 上运行一次扫描,而没有跟踪哪个实验在哪个机器上的认知开销。

设置约束

提前设定一个限制是有用的,比如我想尝试的实验总数,或者我想花费的计算量或时间,这既是为了效率,也是为了我自己的理智。我已经浪费了比我愿意承认的更多的时间来观看清扫,希望有一个神奇的组合就在眼前。真的没有最优答案——我的启发是这样的,如果结果的模式看起来没有变化或者不会很快产生任何令人惊讶的东西,就停止。在最坏的情况下,如果我已经跑了两倍的时间来获得最后的最佳值,我就会停下来。

了解您的结果

现在进行分析。这一阶段至关重要——深入研究结果,最好以书面形式总结任何模式,尤其是你观察到的关系。例如,降低学习率会增加验证的准确性吗?增加辍学有帮助吗,但只有在至少有三层的情况下?考虑哪些实验会证实或反驳你的观察,以及你下一步想做什么。我做的笔记越具体,我就越容易有意识,未来的自己——更不用说队友或更广泛的观众——就越容易理解过去的自己到底在做什么,为什么。

平行坐标图

可视化所有超参数如何与目标指标交互非常有帮助。重量和偏差平行坐标图是一种特别方便的方法。最右边的一列绘制了一次扫描中每次运行的结果指标(如认证准确度、认证损失)。一条波浪线将该结果与该特定实验的所有相应超参数值联系起来:这些是波浪线与其他每条垂直数字线的交叉点(例如,学习率、批量、辍学率)。因此,每条波浪线代表一个实验,并根据结果进行着色(例如,准确度越低,紫色越多,准确度越高,黄色越多)。这让你一眼就能看出相关性。在下面的示例中,动量的中间值更好,将学习率和动量都设置得较高会导致验证准确度较低。你可以在这里阅读更多关于和互动探索这个图,以及在这个关于在超参数搜索中量化显著性的更长报告中。

可视化 138 CNNs 时尚培训-MNIST。图片作者。

参数重要性面板

权重和偏差参数重要性面板使这些视觉相关性更加具体。它在你的扫描过程中运行一个随机森林(即哪些超参数值导致了哪些结果),以计算每个超参数对结果度量的重要性和相关性。额外的好处是,这个指标不一定是您在扫描中试图优化的指标。下面,我展示了在 Fastai 中训练的用于驾驶场景语义分割的 UNet 的平行坐标图和两个参数重要性面板(将每个像素识别为属于汽车、人、自行车、建筑物、人行道等,总共 20 个类别)。我的性能指标是 IOU:所有类的交集/并集平均值,当我的模型的预测区域与地面实况标注完全重叠时,该值最高,当我的预测区域与地面实况不匹配时,该值较低。第一个图清楚地表明,ResNets 是比 Alexnet 更好的编码器来增加 IOU,而学习率的效果是不确定的。

学习速度的影响很难理清。图片作者。

当我参考参数重要性面板关于所有班级的 IOU 时,我发现学习率有很强的负相关性:我应该将学习率设置得更低,以增加平均 IOU。然而,如果我查询相对于人类 IOU 的参数重要性——仅针对人类类别的 IOU——我发现使用 Alexnet 作为编码器要重要得多,如果我的目标是检测人类,这是最佳选择。你可以阅读这份报告了解更多细节:基本上,Alexnet 倾向于预测更大的误报区域,改善了像人类这样的罕见类别的 IOU,但削弱了整体性能。

相对于总体平均 IOU(左)和仅人类 IOU(右)的超参数重要性。作者图片。

扫过,想象,重复

一旦您分析了您的扫描,记录了您的发现,并制定了下一步的计划,您就可以运行更多的手动测试或尝试另一次扫描。我建议在推荐的方向上扩大窗口(例如,如果较低的学习率增加了验证准确性,则尝试更低的值)或在更有成效的超参数上增加精度(在最佳值附近更紧密地采样)。如果任何超参数设置明显很好,请注意并考虑将它们提升为常量:保持这些已经调好的值不变,也许可以在代码中添加注释来解释原因。另一方面,如果有任何设置由于异常值而破坏了脚本(例如,过大的批处理大小导致 OOM 错误),请缩小未来运行的范围。您还可以添加一些新的超参数来探索,并且您已经准备好重复这个过程了!在 Weights & Biases 中,你甚至可以从现有跑步中开始一次清扫:从你刚刚完成的清扫中标记出一些你最好的跑步,作为你下一次清扫配置的灵感或草稿。创建扫描时会考虑它们,并且在运行下一次扫描时不会重复它们的配置。

我希望这个概述可以帮助您更快地调整深度学习模型,而不管您使用的是什么框架或工具。在高层次上,我推荐有约束的探索(用更少的超参数获得更大范围的值)和尽可能收紧你的反馈回路(更短的实验,更小的扫描,在更多的迭代中完成)。这里有更多资源来开始使用权重&偏差扫描。我很想听听你的意见,我们如何让 W & B 扫描更好地为你的用例服务。

超参数调谐:实用指南和模板

原文:https://towardsdatascience.com/hyperparameter-tuning-a-practical-guide-and-template-b3bf0504f095?source=collection_archive---------18-----------------------

FreeImages.com上哈蒙·德夫的照片

Y 你已经煞费苦心地完成了你的探索性数据分析,数据处理和最后😎,该造型了!但是你很快意识到,你有相当多的超参数需要调整,你可能要花上一千年的时间在这个巨大的超参数空间中搜索最优设置。

生命短暂,因此,懒惰的我决定编写不止一个,而是两个代码模板,以自动化和加快机器学习和深度学习模型的超参数调整过程。点击此处获取代码链接(或滚动至底部),但请继续阅读,了解更多关于超参数调整的信息,并理解代码的作用。

超参数调谐的情况有哪些

在我们深入研究这两个代码模板之前,有必要首先列出我们可能面临的超参数调优的背景。

本质上有两种情况:

  1. 试验次数>超参数次数;和
  2. 试验次数

其中每个试验都是对一组超参数的评估。

情况 1 通常(但不总是)适用于机器学习。训练时间不是特别长,因此我们可以进行大量试验来覆盖超参数空间(即,探索超参数的许多可能组合)。面临的挑战是,如果超参数空间很大,我们可能仍然需要大量的试验和很长时间才能达到最佳设置。因此,如果算法能够智能地操纵超参数空间,将有助于加快优化。

然而,在深度学习中,训练时间通常要长得多;可能几天甚至几周。因此,我们没有能力进行多次试验,这就是情况 2。在这种情况下,我们需要通过并行运行许多试验来提高我们的能力,而不是针对全部数量的时期训练所有试验,该算法应该在训练期间尽早淘汰最没有希望的试验候选,以将计算资源重新分配给其他更有希望的试验。

考虑到上述情况,我们现在来看看各种超参数调整算法以及为我们的目的而选择的算法。

超参数调整算法

下表显示了超参数调整算法的高级概述。

我们不会详细讨论每一个算法,但是如果你有兴趣了解更多,下面有其他资源的链接供你参考。

网格搜索和随机搜索

网格搜索系统地评估网格中指定的每个超参数组合的模型,而随机搜索从可能参数值的分布中对每个超参数集进行采样。

来源:伯格斯特拉等人(2012 年)

在上面由 James Bergstra 和 Yoshua Bengio 在他们的 2012 年论文中的著名图表中,我们看到左边的网格搜索和右边的随机搜索,都有九个试验(黑点)和两个参数。每个方块上方的绿色区域显示了通过改变重要参数值的函数增益,每个方块左侧的黄色区域显示了由不重要参数引起的增益。该图说明了随机搜索可能更彻底地探索参数空间,并导致发现更优的设置。

贝叶斯优化(Parzen 估计器树)

虽然随机搜索比网格搜索好,但还是有可能做得更好。

请注意,在超参数空间中,同一区域中的点往往会返回相似的性能。贝叶斯优化利用了这一事实,并以较高的可能性对性能较好的点的区域进行采样。Parzen 估计树(TPE)是采用贝叶斯优化方法的算法之一。

上图说明了贝叶斯优化搜索超参数空间的方式。假设红色区域是最佳损失发生的地方,每个白色圆圈是一次尝试,数字代表搜索的顺序。最初,超参数搜索类似于随机搜索,但随着贝叶斯优化算法用过去试验提供的信息更新自身,搜索逐渐开始向红色区域移动。这本质上是贝叶斯优化优于随机搜索的直觉。

在 T4 的一篇论文中,作者也是 James Bergstra 等人,TPE 算法被证明能够找到比随机搜索更好的超参数配置。

来源:伯格斯特拉等人(2013 年)

上图中的灰点表示使用随机搜索的 n 次试验中的最低误差,而绿点是 TPE 算法对于相应的 n 次试验的最低误差。因此,该论文在他们的实验中显示,TPE 通常发现超参数配置,这些配置返回比随机搜索更低的验证错误。

异步连续减半算法(ASHA)

然而,以并行的方式运行贝叶斯优化是很重要的。在深度学习中,模型训练通常需要很长时间,并行计算尤其重要,ASHA 利用了这一点。

为了理解 ASHA 是如何工作的,我们需要介绍两个组件。第一,连续减半算法(SHA ),第二,异步方面。

【SHA】逐次减半算法

假设有 64 个超参数配置需要评估,SHA 将以如下方式制定策略。

对于每个梯级,将剩余 1/配置缩减系数

参考上表,SHA 将首先评估所有 64 个超参数配置,每个配置 1 个历元。这 64 项试验的性能将相互比较,试验的前 1/缩减系数将被“提升”。在我们的示例中,我们任意将缩减因子设置为 4,因此 1/4 * 64 = 16 次试验将被“提升”到下一个梯级,在那里将运行另外 3 个时期。在每个下一个梯级进行类似的比较,直到只剩下 1 次试验。

来自 SHA 的关键见解是,我们不需要完全评估全部 64 个时期的所有试验来选择最佳超参数配置。通常情况下,最没有希望的试验可以在几个时期后确定,我们可以提前停止这些试验,将我们的资源重新分配给其他更有希望的试验。

异步算法

不幸的是,由于 SHA 需要等待一个梯级中的所有试验完成后才能继续下一个梯级,因此在存在掉队者(即运行速度比其他试验慢的试验)的情况下,很难实现最佳并行化。并且假设我们有 10 个计算节点,并且每次试验分配一个计算节点,SHA 也将导致越来越多的剩余计算节点没有被利用,因为对于更高的梯级,试验的数量减少(例如,梯级 3 处的 6 个空闲节点)。

因此,ASHA 通过尽可能提升配置来调整 SHA 算法,而不是等待所有试验都在一个梯级中完成。参考上表中的相同示例,ASHA 将每评估 4 次试验,就将一次试验提升至下一级。

根据本文的研究,与其他可以在并行环境中运行的现有算法相比,ASHA 的性能通常不亚于甚至更好。

我从论文中得到的直觉是,ASHA 可能会表现得更好,因为它能够充分利用并行计算来评估给定时间范围内尽可能多的配置。对于其他算法,它们可能无法在掉队的情况下充分利用并行计算。

进化算法

其他类型的算法包括基于进化的算法,如基于群体的训练。欲知详情,请参考 DeepMind 的博文。

我们的代码模板

在回顾了关于超参数调优算法的现有文献并回忆了我们的两种情况后,我决定为每种情况使用两个单独的代码模板。

第一个代码模板适合更简单的情况 1,我们不需要并行计算,所以我写了一些可以在 Google Colab 中轻松运行的东西。第二个代码模板将迎合情况 2,利用 Google 云平台进行分布式试验。

在算法方面,第一个代码使用贝叶斯优化,而第二个代码使用 ASHA。

情况 1 的代码模板

Hyperopt 是一个超参数优化库,实现了贝叶斯优化的 TPE。远视的主要贡献者之一是詹姆斯·伯格斯特拉。

我们的代码模板使用 Hyperopt 库,可以很容易地在 Google Colab 中运行,有两个主要部分。

1。车型配置探究

在本节中,我们将设置我们想要研究的模型的配置。例如,下面的代码块为 XGBoost 分类器设置超参数空间。

# XGB Classifier parametersmodel_params = {
'learning_rate': hp.choice('xgbc.learning_rate', np.arange(0.05, 0.31, 0.05)),'max_depth': hp.choice('xgbc.max_depth', np.arange(5, 16, 1, dtype=int)),'min_child_weight': hp.choice('xgbc.min_child_weight', np.arange(1, 8, 1, dtype=int)),'colsample_bytree': hp.choice('xgbc.colsample_bytree', np.arange(0.3, 0.8, 0.1)),'subsample': hp.uniform('xgbc.subsample', 0.8, 1),'n_estimators': 100,
}

为了方便起见,我们为 3 个主要模型设置了模板,每个模型都有一个分类器和回归器:

  • XGBoost
  • LightGBM
  • 随机森林

要根据您的目的修改代码模板,只需相应地修改相关的代码块。

2。远视类对象

这一部分包含我们的主要代码。

要执行超参数优化,只需实例化 HyperOpt 类对象并调用 optimize 方法。此外,您还可以通过在 experiment_space 字典中包含其他模型来执行模型搜索。

# set dictionary containing hyperparameter space defined
experiment_space = {'model_type': hp.choice('model_type',[rf_clf_params, xgb_clf_params, lgbm_clf_params])}# Perform optimal model search
param_search = HyperOpt(X, y, cv=5)
param_search.optimize(space=experiment_space, max_evals=2)

例如,在上面的代码中,我们已经将 max_evals 设置为 2,但是您也可以将其设置为其他的试验次数。或者,将其设置为‘auto’,让代码搜索最佳设置,直到损失度量在预定义的试验次数内没有改善。

情况 2 的代码模板

Ray Tune 是一个 Python 库,用于任何规模的超参数调谐,允许我们轻松地执行多节点分布式计算,以同时评估各种超参数配置。

我们的代码参考了 Ray Tune 的 GitHub,由两个文件组成,可以在这里下载。

  1. cluster_config_cpu.yml (分布式集群的配置)
  2. tune_cifar10.py (超参数调整脚本)

我们将利用谷歌云进行分布式计算,并以 CIFAR-10 为例。请注意,谷歌云为新客户提供了免费试用。

在我们的 CIFAR-10 示例中,我们能够在一个小时内使用 40 个 CPU 评估 100 个配置,而这通常需要一天的时间。所有这些都是在创建谷歌云账户后通过 5 个主要步骤实现的。

1.设置 Google 云端认证

  • 创建服务帐户并下载包含您的密钥的 JSON 文件
  • 设置环境变量指向下载的 JSON 文件的目录

2.启用以下 API:

  • 云资源管理器 API
  • 身份和访问管理(IAM) API
  • 计算引擎 API

3.将项目 ID 复制粘贴到 cluster_config_cpu.yml 配置文件中的 project_id

在配置文件的 project_id 下填写您的项目 ID

4.通过在终端中运行来启动集群:

ray up -y cluster_config_cpu.yml

5.通过在终端中执行以下命令开始超参数调整试验:

ray submit cluster_config_cpu.yml tune_cifar10.py# To trial run scripts, add argument smoke-test
# ray submit cluster_config_cpu.yml tune_cifar10.py --smoke-test

在超参数调整过程中,您将在终端中看到状态更新,如下图所示。每次迭代( iter )后,将为每次试验报告指标( acc,总时间)。

在我们的示例中,我们调整了三个超参数:

  • 丢弃层将元素设置为零的概率( dropout_p )
  • 第二全连接层中的节点数( dense2_nodes
  • 第二卷积层输出的通道数(输出通道)

超参数空间可以在脚本顶部的 tune_cifar10.py 中与其他主要配置一起设置。

要在 tune_cifar10.py 中设置的主要配置

为了使代码适合您的目的,您可能希望修改 ConvNet 类(用于模型架构)和 get_data_loaders 函数(用于数据集加载)。

要设置使用的 cpu 类型和数量,请修改 cluster_config_cpu.yml 中的 head_nodeworker_nodesmax_workers 。或者,要启动 gpu,请参见 cluster_config_gpu.yml

在超参数调优过程结束时,将报告最佳配置,并且可以从 Google 云集群的头节点下载相应的模型检查点。

每个试验的最佳模型将作为 model_xxx.pth 保存在头群集节点的/home/Ubuntu/ray _ results/train model 下的每个试验文件夹中

快速提示:

  • 如果您正在启动大量的 CPU,请确保您的 head 节点是足够强大的机器类型。
  • 默认情况下,Google Cloud 对您可以启动的 CPU 和 GPU 数量有配额限制。但是您可以编辑您的配额。

通过上面的插图,我们希望展示如何为机器学习和深度学习模型执行超参数调整。

如果您错过了代码模板链接,它们也在这里:

  • Google Colab 笔记本针对情况 1
  • 情况 2 的 Github 存储库

感谢阅读,我希望代码和文章是有用的。如果您有任何问题或建议,请随时发表评论。

参考

  • http://jmlr . csail . MIT . edu/papers/volume 13/bergstra 12a/bergstra 12a . pdf
  • http://proceedings.mlr.press/v28/bergstra13.pdf
  • https://blog . ml . CMU . edu/2018/12/12/massively-parameter-optimization/
  • https://github.com/hyperopt/hyperopt
  • https://ray.readthedocs.io/en/latest/tune-usage.html

机器学习模型的超参数调整

原文:https://towardsdatascience.com/hyperparameter-tuning-for-machine-learning-models-1b80d783b946?source=collection_archive---------3-----------------------

使用随机搜索、网格搜索和超点优化方法提高机器学习模型的准确性

照片由乔·凯恩在 Unsplash 拍摄

简介

本文介绍了使用 Sci-kit learn 和 HyperOpt 库对机器学习模型的超参数调整进行随机搜索、网格搜索和贝叶斯优化方法的比较和实现。超参数调整至关重要,因为它们控制机器学习模型的整体行为。每个机器学习模型都有不同的可以设置的超参数。

超参数是在学习过程开始之前设置其值的参数。

我将使用来自 Kaggle 的 Titanic 数据集进行比较。本文的目的是探索随机森林模型的性能和计算时间如何随着各种超参数调整方法而变化。毕竟,机器学习就是要在计算时间和模型性能之间找到正确的平衡。

具有默认参数的基线模型:

random_forest = RandomForestClassifier(random_state=1).fit(X_train, y_train)
random_forest.score(X_test,y_test)

当在测试装置上使用时,该模型的精度为 81.56

我们可以使用命令获取用于模型的默认参数。**randomforest.get_params()**

**The default parameters are:** {'bootstrap': True, 'ccp_alpha': 0.0,  'class_weight': None,  'criterion': 'gini',  'max_depth': None,  'max_features': 'auto',  'max_leaf_nodes': None,  'max_samples': None,  'min_impurity_decrease': 0.0,  'min_impurity_split': None,  'min_samples_leaf': 1,  'min_samples_split': 2,  'min_weight_fraction_leaf': 0.0,  'n_estimators': 100,  'n_jobs': None,  'oob_score': False,  'random_state': 1,  'verbose': 0,  'warm_start': False}

如果您不知道这些参数以及它们的使用方法,也不必担心。通常,关于所有参数的信息可以在模型的 Scikit 文档中找到。

随机森林中的一些重要参数:

  1. max_depth: int,default=None 该选项用于选择你希望森林中每棵树的深度。树越深,它就有越多的分支,它就能获取更多的数据信息。
  2. 判据 :{"Gini "," entropy"},default=" Gini": 衡量每个拆分的质量。“基尼系数”使用基尼系数杂质,而“熵”则根据信息增益进行分割。
  3. max_features: {"auto "," sqrt "," log2"},int 或 float,default=" auto": 这表示在寻找最佳分割时,在分割前级别上考虑的特征数量。这提高了模型的性能,因为每个树节点现在都在考虑更多的选项。
  4. min _ samples _ leaf*:int 或 float,default=1:*** 该参数帮助确定在随机森林中的每个决策树节点的末端对其进行拆分所需的最小观察次数。
  5. min_samples_split :
  6. n_estimators : int,default=100: 这可能是最重要的参数。这表示在计算预测值之前,要在随机森林中构建的树的数量。通常,数字越高越好,但是这在计算上更昂贵。

关于其他参数的更多信息可以在随机森林分类器模型文档中找到。

网格搜索

执行超参数调整的一种传统且流行的方法是使用 Scikit learn 的穷举网格搜索。该方法尝试每组超参数的每种可能的组合。使用这种方法,我们可以在参数搜索空间中找到最佳的一组值。这通常使用更多的计算能力,并需要很长时间来运行,因为这种方法需要尝试网格大小中的每个组合。

参数网格大小将是所有参数的乘积。即,对于我们模型中的以下参数,网格大小将是 102453*5 = 12000

parameters ={'max_depth': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
     'criterion' : ['gini', 'entropy'],
     'max_features': [0.3,0.5,0.7,0.9],
     'min_samples_leaf': [3,5,7,10,15],
     'min_samples_split': [2,5,10],
     'n_estimators': [50,100,200,400,600]}**from** sklearn.model_selection **import** ParameterGrid
param_size = ParameterGrid(parameters)
len(param_size)**Output:
12000**

使用 sklearn 的GridSearchCV,我们可以搜索我们的网格,然后运行网格搜索。

%%time**from** sklearn.model_selection **import** GridSearchCV
grid_search = RandomForestClassifier()grid_search = GridSearchCV(
    grid_search, 
    parameters, 
    cv=5,
    scoring='accuracy',n_jobs=-1)

grid_result= grid_search.fit(X_train, y_train)
**print**('Best Params: ', grid_result.best_params_)
**print**('Best Score: ', grid_result.best_score_)

输出

与基线模型相比,网格搜索 CV 模型的交叉验证分数从 81.56%提高到 84.12%。这是 3.3%的改进。计算时间几乎是 5 小时,这对于这样一个简单的问题是不可行的。

关于实现 Gridsearch 的不同方法的更多信息可以在这里找到。

随机搜索

与 GridCV 相比,RandomizedSearch CV 的主要区别在于,它不是尝试每个可能的组合,而是从网格空间中随机选择超参数样本组合。因为这个原因,不能保证我们会像网格搜索一样找到最好的结果。但是,这种搜索在实践中非常有效,因为计算时间非常少。

计算时间和模型执行主要取决于n_iter值。因为该值指定了模型应该搜索参数的次数。如果这个值很高,就有更好的机会获得更高的精度,但这也带来了更多的计算能力。

我们可以通过使用 sklearn 的库来实现RandomizedSearchCV

%%time
**from** sklearn.model_selection **import** RandomizedSearchCV
random_search=RandomizedSearchCV(estimator = RandomForestClassifier(), param_distributions=parameters,verbose=1, n_jobs=-1,
                            n_iter=200)
random_result = random_search.fit(X_train, y_train)
print('Best Score: ', random_result.best_score_*100)
print('Best Params: ', random_result.best_params_)

输出

与基线模型相比,使用随机搜索 CV 模型,我们的交叉验证分数从 81.56%提高到 83.57%。这是 2.5%的改进,比 Grid CV 少 0.8%。但计算时间不到 5 分钟,几乎快了 60 倍。对于大多数简单的问题,这种随机搜索将是超参数调整的最可行的选择。

更多关于实现随机搜索的不同方法的信息可以在这里找到。

使用 HyperOpt 的贝叶斯模型优化

为了在 Hyperopt 中公式化优化问题,我们需要一个目标函数,该函数接受一个输入并返回一个损失以最小化模型。以及一个域空间对于超参数类似于网格搜索,我们要用输入值的范围创建一个参数空间来评估。

函数可以简单到 f(x) = sin(x),也可以复杂到深度神经网络的误差。该模型根据前面的步骤选择超参数。

这个模型的工作过程很简单:

  1. 创建目标函数的替代概率模型。
  2. 找到在代理模型上表现最好的超参数。
  3. 在真实模型上使用这些值来返回目标函数并更新代理模型。
  4. 重复步骤 2 和 3,直到达到最大评估值。

简单来说,如果我们想找到精度最高的超参数。计算精度的函数称为目标函数

%%time
import **numpy** as **np**
from **hyperopt** import **hp**, **tpe**, **fmin**,**STATUS_OK**,**Trials****def** accuracy_model(params):
   clf = RandomForestClassifier(**params)
   **return** cross_val_score(clf, X_train, y_train).mean()param_space = {'max_depth': hp.choice('max_depth', range(10,100)),
'max_features': hp.uniform('max_features', 0.1,1),
'n_estimators': hp.choice('n_estimators', range(50,500)),
'min_samples_leaf': hp.choice('min_samples_leaf',range(3,5)),
'min_samples_split': hp.choice('min_samples_split',range(2,10)),
'criterion': hp.choice('criterion', ["gini", "entropy"])}best = 0
**def** f(params):
    global best
    acc = accuracy_model(params)
    if acc > best:
       best = acc
    **return** {'loss': -acc, 'status': STATUS_OK}Trials = Trials()
best_params = fmin(f, param_space , algo=tpe.suggest,max_evals=500, trials= Trials)**print**('New best:', best, best_params)
**print**(best_params)

输出

我们使用贝叶斯优化的交叉验证交叉为 84.44%,优于随机搜索和网格搜索。计算时间为 20 分钟,考虑到这种方法的性能最好,这是合理的。

使用贝叶斯优化模型的另一个好处是不同于随机搜索或网格搜索;我们可以跟踪用于形成概率模型的所有过去的评估模型,该概率模型将超参数映射到目标函数的得分概率。

关于安装和实现 Hyperopt 库的更多信息可以在这里找到。

结论

超参数调整对于提高机器学习模型的准确性非常有利。在我们的例子中,随机森林模型在预测存活率方面已经很好了,所以使用超参数调整方法在准确性方面没有太大的提高。

总之,使用网格搜索选择最佳超参数可能非常耗时。随机搜索速度快但不可靠。然而,即使这些方法也比贝叶斯优化效率低,因为它们不基于先前的结果选择下一个超参数来评估。由于这个原因,这些方法消耗更多的时间来评估无用的参数。

额外资源

除了随机搜索、网格搜索和贝叶斯优化,还有一些高级方法,如超波段和 BOHB,它们结合了超波段和贝叶斯优化,更适合超参数调整。关于它们的详细解释在 n eptune.ai 的精彩博客中有所涉及,可以在这里找到

完整的数据和代码可以在我的 Github 库中找到。

希望那有用!非常感谢你读到这里。如果你对这篇文章有任何问题,或者想要联系和交谈,请随时在 LinkedIn 上直接给我发消息。我非常乐意和你聊天,并尽我所能提供帮助。

支持向量机的超参数调整— C 和 Gamma 参数

原文:https://towardsdatascience.com/hyperparameter-tuning-for-support-vector-machines-c-and-gamma-parameters-6a5097416167?source=collection_archive---------2-----------------------

理解支持向量机的超参数

照片由 Unsplash 上的 Aziz Acharki 拍摄

支持向量机(SVM)是一种广泛使用的监督机器学习算法。它主要用于分类任务,但也适用于回归任务。在这篇文章中,我们将深入探讨支持向量机的两个重要参数:T4 C 和伽马。所以我假设你对算法有一个基本的了解,并关注这些参数。

大多数机器学习和深度学习算法都有一些可以调整的参数,称为超参数。我们需要在训练模型之前设置超参数。超参数在构建稳健而精确的模型时非常关键。它们帮助我们找到偏差和方差之间的平衡,从而防止模型过拟合或欠拟合。为了能够调整超参数,我们需要理解它们的含义以及它们如何改变模型。随机尝试一堆超参数值将是一项单调乏味且永无止境的任务。

我们强调了超参数的重要性。让我们开始讨论 C伽马。SVM 创建了一个决策边界来区分两个或更多的类。如何绘制或确定决策边界是 SVM 算法中最关键的部分。当不同类中的数据点是线性可分的时,就很容易画出决策边界。

线性可分数据点

然而,真实数据是有噪声的,并且在大多数情况下不是线性可分的。一个标准的 SVM 试图将所有的正面和负面例子(即两个不同的类)分开,不允许任何点被错误分类。这导致过度拟合模型,或者在某些情况下,无法使用标准 SVM 找到决策边界。

考虑以下二维空间中的数据点:

标准 SVM

标准的 SVM 会使用黑色曲线作为判定边界来区分蓝色和红色等级。然而,这是一个过于具体的分类,很可能以过度拟合而告终。过度拟合的 SVM 在训练集上取得了很高的精度,但在新的、以前未见过的样本上表现不佳。该模型对噪声非常敏感,即使数据点值中非常小的变化也可能改变分类结果。使用这条黑线作为决策边界的 SVM 不适用于该数据集。

为了解决这个问题,1995 年,Cortes 和 Vapnik 提出了“软余量”SVM 的概念,它允许一些例子被错误分类或位于决策边界的错误一侧。软边际 SVM 通常会产生更好通用模型。在我们的示例中,软利润 SVM 的决策边界可能看起来像黑色直线,如下所示:

软利润 SVM

有一些错误的分类点,但我们最终有一个更一般化的模型。当确定决策边界时,软裕度 SVM 试图解决具有以下目标的优化问题:

  • 增加决策边界到类别(或支持向量)的距离
  • 最大化训练集中正确分类的点数

这两个目标之间显然有所取舍。决策边界可能必须非常接近一个特定类,才能正确标记训练集中的所有数据点。然而,在这种情况下,测试数据集的准确性可能会较低,因为决策边界对噪声和独立变量的微小变化过于敏感。另一方面,决策边界可能被放置在尽可能远的每个类,代价是一些错误分类的异常。这种权衡由 c 参数控制。

C 参数为每个错误分类的数据点增加一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。

在介绍 gamma 参数之前,我们需要先说一下内核的诀窍。在某些情况下,不可线性分离的数据点会使用核函数进行变换,以便它们变得可线性分离。核函数是一种相似性度量。输入是原始特征,输出是新特征空间中的相似性度量。这里的相似性是指接近的程度。将数据点实际转换到高维特征空间是一个代价很高的操作。该算法实际上并不将数据点转换到新的高维特征空间。内核化 SVM 根据高维特征空间中的相似性度量来计算决策边界,而不实际进行变换。我想这就是为什么它也被称为内核把戏的原因。

常用的核函数之一是径向基函数(RBF)。RBF 的 Gamma 参数控制单个训练点的影响距离。低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。对于高 gamma 值,这些点需要彼此非常接近,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。以下可视化更好地解释了这个概念:

第一幅图像代表低伽马值的情况。相似性半径很大,因此彩色区域中的所有点都被认为属于同一类。例如,如果我们有一个点的右下角,它被归类为“绿色”类。另一方面,第二个图像是具有大伽马的情况。对于要分组到同一类中的数据点,它们必须落在紧有界区域中。因此,一个小的噪声可能导致数据点脱离类别。大的伽玛值可能会导致过度拟合。

随着灰度系数的降低,分隔不同类别的区域变得更加一般化。非常大的 gamma 值会导致太特定的类别区域(过度拟合)。

伽马与 C 参数

对于线性核,我们只需要优化 c 参数。然而,如果我们想要使用 RBF 核,则需要同时优化 c 和γ参数。如果γ很大,c 的影响可以忽略不计。如果 gamma 很小,c 会像影响线性模型一样影响模型。c 和γ的典型值如下。然而,根据应用可能存在特定的最佳值:

0.0001

0.1 < c < 100

对于 SVM 来说,记住输入数据需要进行归一化以使要素具有相同的比例和兼容性是非常重要的。

感谢您的阅读。如果您有任何反馈,请告诉我。

超参数调整减少过度拟合— LightGBM

原文:https://towardsdatascience.com/hyperparameter-tuning-to-reduce-overfitting-lightgbm-5eb81a0b464e?source=collection_archive---------7-----------------------

用例子演示

安德烈斯·达利蒙提在 Unsplash 上的照片

对大量数据的轻松访问和高计算能力使得设计复杂的机器学习算法成为可能。随着模型复杂性的增加,训练模型所需的数据量也会增加。

数据不是模型性能的唯一因素。复杂模型有许多超参数,需要正确地调整或调整,以便充分利用它们。

例如,XGBoost 和 LightGBM 的性能高度依赖于超参数调优。这就像以每小时 50 英里的速度驾驶法拉利,在不仔细调整超参数的情况下实现这些算法。

在本帖中,我们将实验 LightGBM 的性能如何根据超参数值而变化。重点是有助于推广模型的参数,从而降低过度拟合的风险。

让我们从导入库开始。

import pandas as pd
from sklearn.model_selection import train_test_split
import lightgbm as lgb

数据集包含 60 k 个观测值、99 个数字特征和一个目标变量。

(图片由作者提供)

目标变量包含 9 个值,这使其成为多类分类任务。

我们的重点是超参数调优,因此我们将跳过数据争论部分。下面的代码块将数据集分为训练和测试子集,并将它们转换为适合 LightGBM 的格式。

X = df.drop('target', axis=1)
y = df['target']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state=42)lgb_train = lgb.Dataset(X_train, y_train)
lgb_test = lgb.Dataset(X_test, y_test)

我们将从一组新的基本超参数开始,并逐步引入新的超参数。

params = {
'boosting_type': 'gbdt',
'objective': 'multiclass',
'metric': 'multi_logloss',
'num_class':9
}

我们现在可以训练模型,并根据指定的评估指标查看结果。

gbm = lgb.train(
params,
lgb_train,
num_boost_round=500,
valid_sets=[lgb_train, lgb_test],
early_stopping_rounds=10
)

评价标准是多级测井曲线损失。这是训练集和验证集的结果。

(图片由作者提供)

助推轮数设置为 500,但出现了提前停止。如果在指定的回合数内成绩没有提高,early_stopping_rounds 将停止训练。

因为在训练集和验证集的损失之间存在显著的差异,所以该模型似乎高度过度适合训练集。

min_data_in_leaf 参数是一种减少过度拟合的方法。它要求每片叶子都有指定数量的观察值,这样模型才不会变得太具体。

'min_data_in_leaf':300 #added to params dict

(图片由作者提供)

验证损失几乎相同,但差异变小,这意味着过度拟合的程度降低。

防止模型过于具体的另一个参数是 feature_fraction ,它表示在每次迭代中随机选择的特征的比率。

'feature_fraction':0.8 #added to params dict

现在模型在每次迭代中使用 80%的特性。这是结果。

(图片由作者提供)

过度拟合进一步减少。

Bagging_fraction 允许在每次迭代中使用随机选择的行样本。它类似于 feature_fraction,但用于行。bagging_freq 指定更新所选行的迭代频率。

#added to params dict
'bagging_fraction':0.8,
'bagging_freq':10

(图片由作者提供)

训练损失和验证损失之间的差异正在减小,这表明我们在正确的轨道上。

LightGBM 是一种使用 boosting 技术组合决策树的集成方法。单个树的复杂性也是过度拟合的决定因素。它可以通过 max_depth 和 num_leaves 参数来控制。max_depth 决定了一棵树的最大深度,而 num_leaves 限制了一棵树可以拥有的最大叶子数。因为 LightGBM 适应逐叶的树生长,所以一起调整这两个参数很重要。

另一个重要的参数是 learning_rate。较小的学习速率通常更好,但它会导致模型学习更慢。

我们还可以添加一个正则项作为超参数。LightGBM 支持 L1 和 L2 正则化。

#added to params dict
'max_depth':8,
'num_leaves':70,
'learning_rate':0.04

(图片由作者提供)

我们进一步降低了训练和验证损失之间的差异,这意味着更少的过度拟合。

迭代次数也是模型训练的一个重要因素。更多的迭代导致模型学习更多,因此模型在一定数量的迭代之后开始过度拟合。

您可能需要花费大量时间来调优超参数。最终,你会创造出你自己的方法或策略来加速调整的过程。

有很多超参数。有些在准确性和速度方面更重要。其中一些主要用于防止过度拟合。

交叉验证也可以用来减少过度拟合。它允许在训练集和验证集中使用每个数据点。

我们只关注减少过度拟合。然而,如果精度或损失不令人满意,消除过拟合没有多大关系。您还可以调整超参数以在一定程度上提高精度。提高模型性能的一些方法有:

  • 特征工程
  • 特征抽出
  • 集成多个模型

感谢您的阅读。如果您有任何反馈,请告诉我。

基于信息搜索的超参数调整

原文:https://towardsdatascience.com/hyperparameter-tuning-with-informed-searching-37ed58d331f8?source=collection_archive---------31-----------------------

威尔·弗朗西斯在 Unsplash 上的照片

咻…已经几个星期了,但是很高兴赶上了!这些帖子的目标是希望找到一些对我来说是新的东西,这样我就可以“向前支付”。你们中的许多人可能听说过 GridSearchCV,甚至可能听说过 RandomSearchCV,但是知情搜索呢?

使用信息搜索技术的优势在于超参数是通过顺序学习来调整的。GridSearch 和 RandomSearch 都很棒,但它们只深入一层。知情搜索从先前的超参数调整中学习,以优化调整过程。有三种方法是我知道的,请随意分享其他方法!

伊恩·施耐德在 Unsplash 上的照片

粗调至微调

这是微调超参数最明显的方法。只有四个步骤:

  1. 执行随机搜索(或网格搜索)。
  2. 查看结果。
  3. 根据检查结果定义新的参数范围。
  4. 继续,直到获得最佳得分。

现在,这是非常明显的,但最容易实现,无需安装任何软件包。这也是最耗时的。

贝叶斯定理

贝叶斯调谐

是的,贝氏又来了!该方法将采用一系列超参数,并利用贝叶斯信念原则来迭代超参数,以提供最佳结果。hyperpt套装提供您需要的一切!Parzen 估计器的树 (tpe.suggest)是函数中的算法。此外,还创建了一个目标函数来迭代参数并测量损失。

下面是一个例子:

from hyperopt import hp, space, fmin, tpe
# Set up space dictionary with specified hyperparameters
space = {'max_depth': hp.quniform('max_depth', 2, 10, 2),'learning_rate': hp.uniform('learning_rate', 0.001,0.9)}

  # Set up objective function
def objective(params):
    params = {'max_depth': int(params['max_depth']),'learning_rate': params['learning_rate']} # model can be set - scoring must be 'accuracy'
    gbm_clf = GradientBoostingClassifier(n_estimators=100, **params) 
      best_score = cross_val_score(gbm_clf, X_train, y_train, scoring='accuracy', cv=2, n_jobs=4).mean()
    loss = 1 - best_score
    return loss# Run the algorithm - test max evals
best = fmin(fn=objective,space=space, max_evals=20, rstate=np.random.RandomState(42), algo=tpe.suggest)
  print(best)#Sample output:
 0%|          | 0/20 [00:00<?, ?it/s, best loss: ?]
  5%|5         | 1/20 [00:00<00:04,  4.16it/s, best loss: 0.26759418985474637]
 10%|#         | 2/20 [00:00<00:04,  4.32it/s, best loss: 0.2549063726593165] 
 15%|#5        | 3/20 [00:00<00:03,  4.60it/s, best loss: 0.2549063726593165]
 20%|##        | 4/20 [00:00<00:03,  4.82it/s, best loss: 0.2549063726593165]
 25%|##5       | 5/20 [00:01<00:04,  3.64it/s, best loss: 0.2549063726593165]
 30%|###       | 6/20 [00:01<00:03,  3.71it/s, best loss: 0.2549063726593165]
 35%|###5      | 7/20 [00:01<00:03,  4.09it/s, best loss: 0.2549063726593165]
 40%|####      | 8/20 [00:01<00:02,  4.29it/s, best loss: 0.2549063726593165]
 45%|####5     | 9/20 [00:02<00:02,  4.49it/s, best loss: 0.2549063726593165]
 50%|#####     | 10/20 [00:02<00:02,  4.69it/s, best loss: 0.2549063726593165]
 55%|#####5    | 11/20 [00:02<00:01,  4.77it/s, best loss: 0.2549063726593165]
 60%|######    | 12/20 [00:02<00:01,  4.53it/s, best loss: 0.2549063726593165]
 65%|######5   | 13/20 [00:03<00:01,  4.16it/s, best loss: 0.2549063726593165]
 70%|#######   | 14/20 [00:03<00:02,  2.81it/s, best loss: 0.2525688142203555]
 75%|#######5  | 15/20 [00:03<00:01,  3.29it/s, best loss: 0.2525688142203555]
 80%|########  | 16/20 [00:04<00:01,  3.57it/s, best loss: 0.2525688142203555]
 85%|########5 | 17/20 [00:04<00:01,  2.41it/s, best loss: 0.24246856171404285]
 90%|######### | 18/20 [00:05<00:00,  2.41it/s, best loss: 0.24246856171404285]
 95%|#########5| 19/20 [00:05<00:00,  2.46it/s, best loss: 0.24246856171404285]
100%|##########| 20/20 [00:05<00:00,  2.69it/s, best loss: 0.24246856171404285]
100%|##########| 20/20 [00:05<00:00,  3.40it/s, best loss: 0.24246856171404285]
{'learning_rate': 0.11310589268581149, 'max_depth': 6.0}

Johannes Plenio 在 Unsplash 上拍摄的照片

遗传调谐

最后,我们将看看基因调整。这是最有趣的概念,因为它遵循达尔文的进化过程:

  1. 不同种类(不同型号)
  2. 最强的生存下来(最好的得分被选出)
  3. 复制(创建与最佳模型相似的新模型)
  4. 遗传随机性发生在繁殖过程中(增加随机性,这样就不会达到局部最优)
  5. 重复

这个过程可以用 TPOT 包来执行。有了 TPOT,你可以设置所有这些“遗传”参数:

  • 世代—周期数
  • population_size =要保留的模型数量
  • 后代大小=每个中后代的数量
  • 突变率=应用随机性的管道比例
  • crossover_rate =每次迭代的管道比例

TPOT 是建立在几个库之上的,所以一定要查看文档以确保正确安装。(有一个链接附在第一次提到 TPOT 的地方)

这里有一个 TPOT 的例子:

# Assign the values outlined to the inputs
number_generations = 3
population_size = 4
offspring_size = 3
scoring_function = 'accuracy'

# Create the tpot classifier
tpot_clf = TPOTClassifier(generations=number_generations, population_size=population_size,
                            offspring_size=offspring_size, scoring=scoring_function,
                            verbosity=2, random_state=2, cv=2)# Fit the classifier to the training data
tpot_clf.fit(X_train, y_train)

# Score on the test set
print(tpot_clf.score(X_test, y_test))#sample output:
    Generation 1 - Current best internal CV score: 0.7549688742218555
    Generation 2 - Current best internal CV score: 0.7549688742218555

    Best pipeline: DecisionTreeClassifier(input_matrix, criterion=gini, max_depth=7, min_samples_leaf=11, min_samples_split=12)
    0.75

你有它!在寻找最佳超参数的过程中,需要实施三个(基本上是两个)新过程。

这些过程不会凭空出现,我确实通过数据营的课程学到了很多。DataCamp 是一个保持练习、学习新技术、巩固已学知识和发现新程序的好方法。强烈推荐。

保重,下次再见!

使用 Keras 和光线调节进行超参数调节

原文:https://towardsdatascience.com/hyperparameter-tuning-with-keras-and-ray-tune-1353e6586fda?source=collection_archive---------10-----------------------

使用 HyperOpt 的贝叶斯优化和超带调度器为机器学习模型选择最佳超参数

Alexis Baydoun 在 Unsplash 上拍摄的照片

在我之前的文章中,我解释了如何构建一个小巧灵活的图像分类器,以及在卷积神经网络中拥有可变输入维度的优势。然而,在经历了模型构建代码和训练例程之后,人们可以问这样的问题:

  1. 如何选择一个神经网络的层数?
  2. 如何选择各层单元/滤波器的最优数量?
  3. 我的数据集的最佳数据扩充策略是什么?
  4. 什么样的批量和学习率是合适的?

建立或训练神经网络包括找出上述问题的答案。例如,您可能对 CNN 有一种直觉,随着我们越来越深入,每一层中的过滤器数量应该增加,因为神经网络学习提取越来越复杂的特征,这些特征建立在早期层中提取的简单特征的基础上。但是,可能有一个更优的模型(对于您的数据集而言)具有更少的参数,其性能可能优于您根据直觉设计的模型。

在本文中,我将解释这些参数是什么,以及它们如何影响机器学习模型的训练。我将解释机器学习工程师如何选择这些参数,以及我们如何使用一个简单的数学概念来自动化这个过程。我将从我以前的文章中的相同模型架构开始,并对其进行修改,以使大多数训练和架构参数可调。

什么是超参数?

超参数是机器学习工程师在训练模型之前设置的训练参数。在训练过程中,机器学习模型不会学习这些参数。例子包括批量大小、学习速率、层数和相应的单元等。机器学习模型在训练过程中从数据中学习的参数称为模型参数。

为什么超参数很重要?

当训练机器学习模型时,主要目标是获得在验证集上具有最佳性能的最佳性能模型。我们关注验证集,因为它代表了模型的泛化能力(在看不见的数据上的性能)。超参数构成了训练过程的前提。例如,如果学习速率设置得太高,那么模型可能永远不会收敛到最小值,因为它在每次迭代后将采取太大的步骤。另一方面,如果学习率设置得太低,模型将需要很长时间才能达到最小值。

超参数调整前后的机器学习管道

为什么超参数很难选择?

找到正确的学习率包括选择一个值,训练一个模型,评估它,然后再次尝试。每个数据集都是独一无二的,有这么多参数可供选择,初学者很容易感到困惑。经历了多次失败训练尝试的机器学习工程师最终会对超参数如何影响给定的训练过程产生直觉。然而,这种直觉并不能推广到所有的数据集,一个新的用例通常需要一些实验才能确定令人信服的超参数。然而,有可能错过最佳或最优参数。

我们希望选择超参数,以便在训练过程完成后,我们有一个既精确又通用的模型。当处理神经网络时,评估目标函数可能非常昂贵,因为训练需要很长时间,并且手动尝试不同的超参数可能需要几天。这变成了手工完成的困难任务。

超参数调整/优化

超参数调整可被视为一个黑盒优化问题,我们试图在不知道其解析形式的情况下找到函数 f(x)的最小值。它也被称为无导数优化,因为我们不知道它的解析形式,也不能计算导数来最小化 f(x),因此像梯度下降这样的技术不能使用。

一些著名的超参数调整技术包括网格搜索、随机搜索、差分进化和贝叶斯优化。网格搜索和随机搜索的性能略好于手动调整,因为我们建立了一个超参数网格,并对分别从网格中系统或随机选择的参数运行训练和评估周期。

然而,网格和随机搜索相对低效,因为它们不基于先前的结果选择下一组超参数。另一方面,差分进化是一种进化算法,其中最佳执行超参数配置的初始集合(其是随机初始化的个体之一)被选择来产生更多的超参数。新一代的超参数(后代)更有可能表现得更好,因为他们继承了父母的良好特征,并且群体随着时间的推移而改善(一代又一代)。在这个美丽而实用的教程中阅读更多关于这个概念的内容。

尽管差异进化起作用,但它需要很长时间,并且仍然没有采取明智的步骤,或者它不知道我们试图实现/优化什么。贝叶斯优化方法跟踪过去的评估结果,并使用它来创建待优化的实际训练目标函数的概率模型。这个概率模型被称为目标函数的“替代物“”,其形成了超参数到目标函数表现如何的概率分数的映射。要评估的下一组超参数是基于它们在代理上的表现来选择的。这使得贝叶斯优化有效,因为它以知情的方式选择下一组超参数。在这篇详细的文章中阅读更多关于这个概念的内容。这篇文章解释了 Tree Parzen Estimators (TPE)代理模型,它将在我们下面的实现中内部使用。

去拿圣经

一如既往,你可以在这个 GitHub 链接中获得本教程使用的所有代码。我建议读者克隆这个项目,并按照教程一步一步来更好地理解。注意:本文中的代码片段只突出了实际脚本的一部分,完整代码请参考 GitHub 链接。

[## himanshurawlani/hyper_fcn

这个项目使用 HyperOpt 的贝叶斯优化和光线调整来执行简单图像的超参数调整…

github.com](https://github.com/himanshurawlani/hyper_fcn)

什么是雷调?

Ray Tune 是一个 Python 库,通过允许您大规模利用尖端优化算法来加速超参数调整。它建立在射线之上,旨在消除缩放和设置实验执行过程中的摩擦。

来源

Ray Tune 与 MLFlow、TensorBoard、weights and biases 等实验管理工具无缝集成。并为 HyperOpt (以下实现) Ax 等众多前沿优化算法和库提供了灵活的接口。

建立一个超级模型

超模型是一种模型,其超参数可以使用优化算法进行优化,以便在某个指标上提供最佳性能(在这种情况下为验证损失)。这些超参数包括层数、每层中的单元数、要使用的层的类型、激活函数的类型等。让我们创建一个简单的超级模型来执行图像分类任务。

在上面的模型构建代码中,我们传递了一个config字典,其中包含过滤器数量、辍学率、是否使用特定的数据扩充层等值。每次运行超参数调整都会创建一个新的配置字典。对应于最佳运行的config将被选为最佳配置,包括数据扩充、模型和训练程序的最佳参数。下面的超参数搜索空间部分解释了一个config的例子。

选择最佳数据扩充

选择数据扩充对模型被训练的应用的性质非常敏感。人脸识别系统可能会遇到不同亮度、方向、部分裁剪等的人脸。然而,用于从系统生成的 PDF 中提取文本的基于 OCR 的文本提取系统肯定会遇到方向和亮度变化非常小的文本。

如果我们有庞大的数据集,可能无法检查每一张图像来决定要使用的数据扩充。我们可以将这个任务作为超参数之一留给我们的优化算法。在 TensorFlow 2 中,使用 Keras 预处理层作为模型代码的一部分来添加数据扩充变得比以往任何时候都容易。这些预处理层仅在训练模式下是活动的,并且在推断或评估期间是禁用的。点击了解更多信息。

定义超参数搜索空间

为了定义超参数搜索空间,我们首先需要了解哪些可能的有效配置可以用来创建我们的模型。让我们考虑下面一个有效的config字典:

如果我们考虑batch_size,那么我们可以选择 1 到 100 之间的任意值,甚至更高。然而,最常见的批量大小是 2 的幂,介于 8 和 64 之间。因此,我们可以将搜索空间定义为 1 到 100 之间的任意整数值,或者我们可以通过提供一个最常见值的列表来减轻优化算法的负担,比如[8, 16, 32, 64]。同样,如果考虑学习率(lr),可以选择 0.0001 到 0.1 之间的任意浮点值。我们可以更低或更高,但这通常是不必要的。我们可以指定最常见的值,这些值通常是 10 的幂,就像[0.1, 0.01, 0.001, 0.0001]一样,而不是去寻找 0.0001 到 0.1 的穷尽搜索空间。

在 HyperOpt 中,搜索空间由嵌套的函数表达式组成,包括随机表达式。随机表达式是超参数,优化算法通过用自适应探索策略替换正常的“采样”逻辑来对其进行工作。点击了解更多信息。我们可以定义一个随机表达式,它由一列batch_size值组成,称为hp.choice(‘batch_size’, [8, 16, 32, 64])。同样,对于学习率,我们可以定义一个表达式为hp.choice(‘lr’, [0.0001, 0.001, 0.01, 0.1])。如果您想定义一个由双边区间约束的连续空间,我们可以将表达式修改为hp.uniform(‘lr’, 0.0001, 0.1)。这里可以参考参数表达式的完整列表。我们最终的超参数搜索空间将如下所示:

指定试验调度程序和搜索算法

搜索算法是一种“优化算法”,它通过在每次后续试验中建议更好的超参数来优化训练过程的超参数。 Tune 的搜索算法是围绕开源优化库的包装器,用于高效的超参数选择。每个库都有特定的方式定义搜索空间,就像上面的搜索空间是为 HyperOpt 定义的。要使用这个搜索算法,我们需要使用pip install -U hyperopt单独安装它。

试验调度程序也是一种优化算法,作为“调度算法”实现,使超参数调整过程更加有效。试验调度程序可以提前终止不良试验、暂停试验、克隆试验,并更改正在运行的试验的超参数,从而加快超参数调整过程。注意:与搜索算法不同,试验调度程序不会为每次运行选择要评估的超参数配置。我们将使用asynccessivehalvingalgorithm(ASHA)调度器,它提供了与 HyperBand (SHA)类似的理论性能,但提供了更好的并行性,并避免了消除期间的掉队问题。我们不需要单独安装 AsyncSuccessiveHalvingAlgorithm 调度程序。

通过随机采样 n 个配置开始连续减半。在每次迭代中,它丢弃最差的一半,并将剩余部分的资源加倍,直到达到最大资源。每条线对应一个配置,每个梯级对应连续的一半。(来源)

所有的试验调度程序和搜索算法都接受根据mode最大化或最小化的metric。试验调度程序也接收grace_period,类似于 Keras 中提前停止回调中使用的patience。对于搜索算法,我们可以提供一个初始配置(搜索空间),这通常是通过手动调整找到的最佳配置,或者如果没有,我们可以跳过它。

定义超参数调整的目标

要开始超参数调整,我们需要指定一个目标函数进行优化,并将其传递给tune.run()。训练(更新模型参数)我们的图像分类器的损失函数将是分类交叉熵。训练和验证损失更准确地反映了我们的模型的表现。然而,在过度拟合期间,我们的训练损失将减少,但我们的验证损失将增加。因此,验证损失将向右度量,以监控超参数调整。

训练图像分类器是一个漫长的过程,等待训练完成,然后报告验证损失度量不是一个好主意,因为我们的试验调度程序不知道训练进展如何,也不知道是否需要提前停止它。为了克服这个问题,我们将利用 Keras 回调,在每个时期结束时计算验证损失,因此我们可以使用 **tune.report()**将分数发送给 Tune。下面给出了 Keras 回调的最小代码,请参考 GitHub 上的完整代码。

在 Ray Tune 中,我们可以使用基于函数的 API 或基于类的 API 来指定目标函数,在本教程中,我们将使用基于函数的 API。在超参数调整完成后,我们获得了最佳配置,用于训练我们的最终模型,该模型将保存在磁盘上。我们将把我们的目标函数封装在一个类中,以存储几个目录路径和一个布尔变量,该变量告诉我们给定的运行是否是最终的运行。

可视化结果

如果安装了 TensorBoard,Tune 会在tune.run()期间自动输出 Tensorboard 文件。运行实验后,您可以通过指定结果的输出目录来使用 TensorBoard 可视化您的结果:$ tensorboard --logdir=~/ray_results/my_experiment

张量板标量视图

在 TF2,Tune 也自动生成 TensorBoard HParams 输出,如下所示:

TensorBoard HParams 平行坐标视图

关于超参数调整的更多信息

在许多用例中,我们使用标准架构(如 ResNet50)而不是从头开始构建。这些架构非常庞大,执行超参数调整可能不切实际,或者您可能希望利用预先训练的 ImageNet 权重,因此改变模型架构不是一个选项。在这种情况下,我们可以在模型架构之外寻找超参数,例如数据扩充、批量大小、学习速率、优化器等。

物体检测中的锚框

让我们考虑对象检测作为一个这样的用例,其中我们利用锚框进行边界框预测,这在训练过程中没有被学习到。每个对象检测数据集都有要检测的对象的唯一纵横比,默认锚点配置可能不适合检测数据集中的对象。例如,如果您的对象小于最小锚点的大小,或者您的对象具有较高的纵横比。在这种情况下,修改锚配置可能是合适的。这可以通过将锚参数设置为要调整的超参数来自动完成。

结论

我希望这篇博文让你对机器学习模型训练中涉及的不同超参数有所了解。手动调整这些参数是乏味且不直观的,但在贝叶斯优化的帮助下,我们可以跟踪过去的评估结果,并使用它来创建实际训练目标函数的概率模型。这不仅自动化了调优过程,还产生了一个我们可能无法通过手动调优找到的最佳模型。

将 HyperOpt 搜索算法与 HyperBand 试验调度程序相结合,可以显著减少我们的超参数调谐搜索时间和计算资源。此外,能够找到给定数据集的最佳数据扩充步骤只是锦上添花。在讨论本文中的各种主题时,我已经链接了一些很棒的资源,但我将在下面重新链接它们,以便您不会错过任何内容。继续学习!

参考资料和资源

  1. 机器学习的贝叶斯超参数优化的概念解释
  2. 大规模超参数优化新手指南
  3. BOHB:大规模稳健高效的超参数优化
  4. 使用贝叶斯优化的云机器学习引擎中超参数调整
  5. 贝叶斯优化初级读本
  6. Python 差分进化教程
  7. Python 中超参数调优:2020 年完整指南

我很乐意听到你对这篇文章和 GitHub 项目的反馈和改进。你可以在推特( @raw_himanshu )和 LinkedIn(himanshurawlani)上找到我

使用 Keras 调谐器进行超参数调谐

原文:https://towardsdatascience.com/hyperparameter-tuning-with-keras-tuner-283474fbfbe?source=collection_archive---------6-----------------------

充分利用您的模型

在 Unsplash 上由尹卡·阿迪奥蒂拍摄的照片

伟大的数据科学家不会满足于“还行”,他们会超越去实现非凡。

在这篇文章中,我们将回顾数据科学家用来创建模型的技术,这些模型工作良好并赢得竞争。充分利用我们的模型意味着为我们的学习算法选择最佳的超参数。这项任务被称为超参数优化或超参数调整。这在深度学习中尤其费力,因为神经网络充满了超参数。我假设您已经熟悉回归和均方差(MSE)指标等常见的数据科学概念,并且具有使用 tensorflow 和 keras 构建模型的经验。

为了演示超参数调优方法,我们将使用 keras tuner 库来调优波士顿房价数据集上的回归模型。该数据集包含 13 个属性,分别具有 404 个和 102 个训练和测试样本。我们将使用 tensorflow 作为 keras 后端,因此请确保您的计算机上安装了 tensorflow。我用的是 tensorflow 版本' 2.1.0 '和 kerastuner 版本' 1.0.1 '。Tensorflow 2.0.x 附带了 keras,因此,如果您拥有 2.0.x 版本,则无需单独安装 keras。您可以使用以下代码检查您拥有的版本:

import tensorflow as tf
import kerastuner as ktprint(tf.__version__)
print(kt.__version__)

加载数据集

波士顿房价回归数据集可以使用 keras 直接下载。这是 keras 附带的数据集列表。若要加载数据集,请运行以下代码。

from tensorflow.keras.datasets import boston_housing(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

请注意,如果这是您第一次在 keras 中使用该数据集,它将从外部源下载该数据集。

这是我将在演示中使用的回归模型。下面的代码显示了模型是如何在没有任何调整的情况下构建的。

from sklearn.preprocessing import StandardScaler
from tensorflow.keras import models, layers# set random seed
from numpy.random import seed
seed(42)
import tensorflow
tensorflow.random.set_seed(42)# preprocessing - normalization
scaler = StandardScaler()
scaler.fit(x_train)
x_train_scaled = scaler.transform(x_train)
x_test_scaled = scaler.transform(x_test)# model building
model = models.Sequential()
model.add(layers.Dense(8, activation='relu', input_shape=(x_train.shape[1],)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.1))
model.add(layers.Dense(1))# compile model using rmsprop
model.compile(optimizer='rmsprop',loss='mse',metrics=['mse'])# model training
history = model.fit(x_train_scaled, y_train, validation_split=0.2, epochs=10)# model evaluation
model.evaluate(x_test_scaled, y_test)

该模型的 MSE 约为 434。我已经将 numpy 和 tensorflow 中的随机种子设置为 42,以获得可重复的结果。尽管这样做了,但每次运行代码时,我还是会得到稍微不同的结果。让我在评论中知道我还错过了什么,让这个可重复。

使用 Keras 调谐器调谐

要开始在 keras tuner 中调优模型,让我们首先定义一个超级模型Hypermodel 是一个 keras tuner 类,它允许您用可搜索空间定义模型并构建它。

创建一个从 kerastuner 继承的类。超模,像这样:

from kerastuner import HyperModelclass RegressionHyperModel(HyperModel):
    def __init__(self, input_shape):
        self.input_shape = input_shape def build(self, hp):
        model = Sequential()
        model.add(
            layers.Dense(
                units=hp.Int('units', 8, 64, 4, default=8),
                activation=hp.Choice(
                    'dense_activation',
                    values=['relu', 'tanh', 'sigmoid'],
                    default='relu'),
                input_shape=input_shape
            )
        )

        model.add(
            layers.Dense(
                units=hp.Int('units', 16, 64, 4, default=16),
                activation=hp.Choice(
                    'dense_activation',
                    values=['relu', 'tanh', 'sigmoid'],
                    default='relu')
            )
        )

        model.add(
            layers.Dropout(
                hp.Float(
                    'dropout',
                    min_value=0.0,
                    max_value=0.1,
                    default=0.005,
                    step=0.01)
            )
        )

        model.add(layers.Dense(1))

        model.compile(
            optimizer='rmsprop',loss='mse',metrics=['mse']
        )

        return model

这与我们之前构建的模型相同,只是对于每个超参数,我们定义了一个搜索空间。你可能已经注意到了惠普公司的 hp.Int。浮动,和 hp。Choice,它们用于定义超参数的搜索空间,该超参数分别接受整数、浮点和类别。超参数方法的完整列表可在这里找到。“hp”是 Keras Tuner 的超参数类的别名。

超参数如密集层中的单元数接受一个整数,因此,hp.Int 用于定义一个整数范围来尝试。类似地,辍学率接受浮点值,因此 hp。使用了 Float。无论是 hp.Int 还是惠普。Float 需要一个名称、最小值和最大值,而步长和默认值是可选的。

下面的 hp.Int 搜索空间被命名为“单位”,其值为 8 到 64 的 4 的倍数,默认值为 8。惠普。Float 的用法与 hp.Int 类似,但接受浮点值。

hp.Int('units', 8, 64, 4, default=8)

惠普。Choice 用于定义分类超参数,如激活函数。下面名为“dense_activation”的搜索空间将在“relu”、“tanh”和“sigmoid”函数之间进行选择,默认值设置为“relu”。

hp.Choice('dense_activation', values=['relu', 'tanh', 'sigmoid'], default='relu')

实例化超级模型

让我们实例化一个超级模型对象。输入形状因数据集和您试图解决的问题而异。

input_shape = (x_train.shape[1],)
hypermodel = RegressionHyperModel(input_shape)

开始调音吧!

随机搜索

顾名思义,这种超参数调优方法从给定的搜索空间中随机尝试超参数的组合。要在 keras tuner 中使用这种方法,让我们使用一个可用的调谐器来定义一个调谐器。这里有一个完整的名单调谐器。

tuner_rs = RandomSearch(
            hypermodel,
            objective='mse',
            seed=42,
            max_trials=10,
            executions_per_trial=2)

使用搜索方法运行随机搜索调谐器。

tuner_rs.search(x_train_scaled, y_train, epochs=10, validation_split=0.2, verbose=0)

选择调谐器尝试并评估的最佳超参数组合。

best_model = tuner_rs.get_best_models(num_models=1)[0]
loss, mse = best_model.evaluate(x_test_scaled, y_test)

随机搜索的 MSE 是 53.48,与根本不执行任何调整相比,这是一个非常大的改进。

超波段

Hyperband 基于李等人的算法。al 。通过自适应资源分配和提前停止优化随机搜索方法。Hyperband 首先运行随机超参数配置一次或两次,然后选择表现良好的配置,然后继续调整表现最佳的配置。

tuner_hb = Hyperband(
            hypermodel,
            max_epochs=5,
            objective='mse',
            seed=42,
            executions_per_trial=2
        )tuner_hb.search(x_train_scaled, y_train, epochs=10, validation_split=0.2, verbose=0)best_model = tuner_hb.get_best_models(num_models=1)[0]
best_model.evaluate(x_test_scaled, y_test)

得到的 MSE 是 395.19,与随机搜索相比要差很多,但比完全不调优要好一点。

贝叶斯优化

贝叶斯优化是一种概率模型,将超参数映射到目标函数的概率得分。与随机搜索和超波段模型不同,贝叶斯优化跟踪其过去的评估结果,并使用它来建立概率模型。

tuner_bo = BayesianOptimization(
            hypermodel,
            objective='mse',
            max_trials=10,
            seed=42,
            executions_per_trial=2
        )tuner_bo.search(x_train_scaled, y_train, epochs=10, validation_split=0.2, verbose=0)best_model = tuner_bo.get_best_models(num_models=1)[0]
best_model.evaluate(x_test_scaled, y_test)

使用贝叶斯优化调整的最佳模型 MSE 是 46.47,比我们尝试的前两个调谐器要好。

结论

我们能够证明,实际上,调优帮助我们最大限度地利用我们的模型。这里讨论的只是众多超参数调整方法中的 3 种。当尝试上面的代码时,我们可能会得到稍微不同的结果,出于某种原因,尽管设置了 numpy、tensorflow 和 keras tuner 随机种子,但每次迭代的结果仍然略有不同。笔记本上传在我的 github repo 里。

此外,调谐器也可以调谐!是的,你没看错,调整调谐器。调谐器接受诸如 max_trials 和每次试验的执行次数之类的值,因此也可以进行调谐。尝试更改这些参数,看看是否能获得进一步的改进。

参考

[1] F. Chollet,用 Python 进行深度学习 (2018),曼宁出版公司。

[2] Keras 调谐器文档,【https://keras-team.github.io/keras-tuner/

[3]李,贾米森,德萨沃,罗斯塔米扎德,塔尔沃卡,超波段:一种基于 Bandit 的超参数优化新方法(2018),

使用 Python 进行超参数调优:完整的分步指南

原文:https://towardsdatascience.com/hyperparameter-tuning-with-python-keras-xgboost-guide-7cb3ef480f9c?source=collection_archive---------8-----------------------

为什么以及如何使用示例 Keras / XGBoost

来源:土坯股票

我们都喜欢建立机器学习或统计模型。但是,一个经常被忽略的重要步骤是超参数调整

在这篇文章中,你会看到:

  • 为什么要使用这种机器学习技术。
  • 如何使用搭配 Keras (深度学习神经网络) Tensorflow 搭配 Python
    本文是文章用 Python 调优超参数:完整分步指南的配套文章。要查看关于 XGBoost 的示例,请阅读上一篇文章。

如果你想更快更远地提高你的模型的性能,让我们开始吧!

常见问题解答:什么是超参数调整/优化,为什么

超参数到底是什么?

超参数是一个参数,其值在学习过程开始前设置。

相比之下,其他参数的值是通过训练数据得出的。

维基百科

例如,神经网络有许多超参数,包括:

  • 隐藏层数
  • 神经元数量
  • 学习率
  • 激活功能
  • 和优化器设置

我们为什么要关心这些超参数?

因为这些超参数对于机器学习模型的性能、速度和质量至关重要。因此,我们应该优化它们。

超参数优化找到一个超参数元组,该元组产生一个最佳模型,该模型最小化给定测试数据上的预定义损失函数。目标函数采用一组超参数,并返回相关的损失。

维基百科

但是这些超参数看起来都很复杂。将它们结合在一起会导致更高维的问题,这甚至更糟糕。

我们应该如何选择这些超参数的值?

通常,我们根据自己的经验并通过反复试验的过程来选择它们。它是非常手动的,并不能保证我们的模型是最好的。

有什么更好的方法来调优超参数?

我们需要一个系统的方法来优化它们。

有网格搜索、随机搜索等基本技术;还有更复杂的技术,如贝叶斯优化,进化优化。

虽然我们没有涵盖这些方法的细节,但看看维基百科或【YouTube 视频了解详情。

现在让我们一步一步地看看超参数调优。

相关文章: 超参数调优的冠状病毒死亡率是多少

步骤#1:预处理数据

在本帖中,我们使用来自 Kaggle 的俄罗斯住房数据集。这个项目的目标是预测俄罗斯的房价波动。我们不会为它找到最好的模型,而只是将它作为一个例子。

在我们开始构建模型之前,让我们先来看看它。

为了准备用于建模演示的数据 df ,我们仅通过以下方式对其进行轻微处理:

  • 将目标 log(price_doc) (房价的对数),作为 y ,与其余的数字特征,作为 X
    在本例中,我们将只使用数字特征。
  • 使用数值要素的中值输入缺失值。
  • 将 X 和 y 进一步拆分为训练和测试数据集。
  • 为训练数据集和测试数据集缩放特征。
    如果不进行转换,数据集无法适合神经网络。

现在,我们有了一个新的训练数据集 X_train_scaled ,其中 90%的数据来自原始数据集。

相关文章:Python 中的数据清理:终极指南(2020)
在之前的这篇文章中,我们探索了使用相同数据集的数据清理技术。

步骤#2:定义优化的目标

在开始调优过程之前,我们必须为超参数优化定义一个目标函数。

我们将使用 Tensorflow Keras 对房价建模。这是一个用于 Python 的深度学习神经网络 API。

首先,我们需要建立一个模型 get_keras_model 。这个函数定义了 多层感知器 (MLP),这是最简单的深度学习神经网络。MLP 至少由三层节点组成:输入层、隐藏层和输出层。

然后基于该模型,我们创建目标函数 keras_mlp_cv_score 如下:

  • 关键输入参数化包括将被调整的 MLP 的超参数:
    –数量 _ 隐藏 _ 层数
    –神经元 _ 每层
    –丢弃 _ 速率
    –激活
    –优化器
    –学习 _ 速率
    –批处理 _ 大小
  • MSE (均方误差)用作得分/损失函数,该函数将在超参数优化中最小化。
  • 我们还使用交叉验证来计算给定的一组超参数值的得分(MSE)。

对于任何一组给定的超参数值,该函数基于交叉验证返回得分的平均值和标准差(MSE)。

您可以在下面的 Python 代码中看到详细信息。

根据我们自己的经验,我们还为将要调整的超参数值设置了限制。

选择这些限值没有一致的方法。你需要理解这些超参数并做出决定。

步骤 3:选择包:Ax

在我们之前的文章(什么是使用超参数调整的冠状病毒死亡率)中,我们使用hyperpt包应用了超参数调整。虽然它是一个流行的包,但我们发现它使用起来很笨拙,并且缺乏好的文档。

我们一直在寻找其他包,最终找到了 Ax (自适应实验平台)。

Ax 是一个新的平台,有助于优化任何类型的实验,包括机器学习、A/B 测试和模拟。它是由脸书开发的,现在是脸书开源项目的一部分。

我们选择它是因为它:

  • 内置特性,支持将结果保存到 JSON 文件或 MySQL 数据库。
  • 从属参数约束的支持。
    比如我们可以将参数 m 和 n 的界限设置为 1 < m < 10,0 < n < 10,mn > 10。而其他大多数软件包不支持 mn > 10 条件。
  • 良好的可视化功能。
  • 体面的文件。
    虽然不是全部清晰,但比其他包装如远视要好。

Ax 也有三种不同的 API(使用模式)用于超参数调整:

  • 循环 API 使用起来最简单。但是它不允许足够的定制。
  • 服务 API 比循环 API 允许更多的控制,尤其是对试验的控制。这种控制很有价值,因为:
    –您可以将试验安排在不同的时间进行,甚至可以与其他试验同时进行。
    –您还可以在每次试验后保存进度,而不是等到所有试验完成后才看到结果。
  • 开发者 API 允许最多的控制,但需要最多的知识,这并不容易,因为:
    –特性的文档并不都很清楚。
    –网站上的例子没有显示优化后如何获得最佳参数。
    –你经常需要浏览 API 来完成这个过程。

由于 Loop API 的局限性和缺乏明确的开发者 API 示例,我们将使用服务 API

相关文章: 超参数调优的冠状病毒死亡率是多少

步骤#4:优化/调整超参数

最后,我们可以开始优化过程。

在服务 API 中,我们不需要太多关于 Ax 数据结构的知识。所以我们可以按照它的样本代码来设置结构。

我们用之前构建的目标函数和超参数列表创建实验 keras_experiment

运行上面的代码后,您会看到下面的日志记录。

如前所述,有不同的方法来搜索超参数的最佳值。根据generation _ strategy的 Ax_client 文档,如果没有显式选择,则根据搜索空间的属性智能选择方法。从注释中可以看出,Ax_client 在本练习中选择了 Sobol (一种统一搜索)。

接下来,让我们运行实验来评估不同的超参数值。

由于这个项目只是为了演示,我们进行了少量的 25 次试验。

每个试验评估超参数值的可能组合,并从 keras_mlp_cv_score 函数中输出分数。Ax_client 跟踪参数和分数的历史,并智能地猜测下一组更好的参数。

随着代码的运行,您还可以看到每次试验的日志记录。

步骤 5:打印/可视化结果

打印结果

要以表格的形式查看结果,您可以使用下面的代码将其打印出来。

为了查看超参数的最佳值,我们使用下面的代码。

可视化结果

除了打印数字之外,您还可以可视化结果。

我们可以绘制 keras_cv 分数在迭代过程中的演变。可以看到,经过 2 次迭代/尝试,分数达到了最小值。

评估结果

另外,我们可以使用这个模型对测试数据集进行预测。

以下 Python 代码打印出的测试结果的 MSE 为 0.30,与训练数据集中的 MSE 接近。

步骤#6:保存结果—可选

如前所述,Ax 还允许我们将流程保存到 JSON 文件中。

当我们想暂停并在以后继续这个过程时,这很方便。

就是这样。你做到了!如果你有任何问题,请留言。

如果你想看一个 Python 中 XGBoost 的例子,请阅读Hyperparameter Tuning with Python:Complete Step-by-Step Guide。

离开之前,别忘了去 报名参加刚刚进入数据通迅的 !或者通过推特、脸书与我们联系。
因此,您不会错过我们的任何新数据科学文章。

原载于 2020 年 3 月 13 日 https://www.justintodata.com

* [## 如何在 Python 中使用 NLP:一个实用的分步示例——只进入数据

这是 Python 中超参数调优的实用指南。要提高模型的性能,请学习:-为什么你…

www.justintodata.com](https://www.justintodata.com/use-nlp-in-python-practical-step-by-step-example/) [## 如何提高体育博彩赔率 Python 中的一步一步指南-只是进入数据

体育博彩可能不仅仅是利用你的直觉。查看我用来赚 20,000 美元的数据科学策略…

www.justintodata.com](https://www.justintodata.com/improve-sports-betting-odds-guide-in-python/) [## Python 中的数据清理:终极指南(2020)——只进入数据

我们用 Python 创建了这个新的完整的分步指南。你将学习如何寻找和清理的技巧:丢失…

www.justintodata.com](https://www.justintodata.com/data-cleaning-python-ultimate-guide/)*

用可视化解释决策树的超参数

原文:https://towardsdatascience.com/hyperparameters-of-decision-trees-explained-with-visualizations-1a6ef2f67edf?source=collection_archive---------5-----------------------

超参数在建立稳健模型中的重要性。

决策树是一种广泛使用的监督学习算法,适用于分类和回归任务。决策树是一些著名的集成学习算法的构建模块,如随机森林、GBDT 和 XGBOOST。

决策树建立在反复询问问题以划分数据的基础上。例如,下图显示了一个用作预测客户流失模型的决策树。

决策树在机器学习领域很流行,因为它们既成功又简单。使它们非常高效的一些特性:

  • 易于理解和解释
  • 可以处理数字和分类数据
  • 需要很少或不需要预处理,如标准化或虚拟编码

不利的一面是,决策树容易过度拟合。它们很容易变得过于复杂,这使得它们无法很好地推广到数据集中的结构。在这种情况下,模型很可能以过度拟合而告终,这是机器学习中的一个严重问题。

为了克服这个问题,我们需要仔细调整决策树的超参数。在本帖中,我们将尝试使用树形可视化来全面理解这些超参数。

我们将使用 scikit-learn 的一个内置数据集。葡萄酒数据集包含三个不同葡萄酒类别的 13 个特征(即列)。数据集中有 178 个样本(即行)。

import numpy as np
import pandas as pdfrom sklearn.datasets import load_wine
X, y = load_wine(return_X_y = True)

让我们从没有任何超参数调整的决策树分类器开始。

from sklearn import treeclf = tree.DecisionTreeClassifier()
clf.fit(X, y)

所有超参数都设置为默认设置。我们可以使用 plot_tree 函数绘制我们的模型。

import matplotlib.pyplot as plt
%matplotlib inlineplt.figure(figsize=(24,14))
tree.plot_tree(clf, filled=True, fontsize=14)

该模型不断分割节点,直到所有节点都是纯的(即包含仅来自一个类别的样本)。让我们先了解一下 a 中的信息

盒子告诉我们。第一行表示特征的名称(即列)。因为我们没有命名列,所以显示了列的索引。样本表示观察值的数量(即行数)表示这些样本根据目标变量的分布。

基尼系数是衡量杂质的一个标准。正如在维基百科上所述,“基尼不纯度是对从集合中随机选择的元素被错误标记的频率的度量,如果它是根据标签在子集中的分布随机标记的话”。基本上就是杂质随着随机性增加。例如,假设我们有一个盒子,里面有十个球。如果所有的球都是同样的颜色,我们就没有随机性,杂质为零。然而,如果我们有 5 个蓝色球和 5 个红色球,杂质是 1。如果你看一下叶节点(树末端的节点),你会发现基尼等于零。

评估分裂质量的另一个函数是,它是不确定性或随机性的度量。一个变量的随机性越大,熵就越大。

熵 vs 随机性

我们可以使用标准参数选择基尼或杂质。默认值是基尼。

我们通常不希望一棵树只有纯叶节点。它会太具体,可能会过拟合。

当算法执行拆分时,主要目标是尽可能减少杂质。杂质减少得越多,分裂获得的信息量就越大。随着树变得更深,杂质减少的量变得更低。我们可以利用这一点来防止树做进一步的分裂。该任务的超参数是最小杂质减少。默认情况下,它被设置为零。让我们改变它,看看有什么不同。

clf = tree.DecisionTreeClassifier(min_impurity_decrease=0.2)
clf.fit(X, y)
plt.figure(figsize=(18,10))
tree.plot_tree(clf, filled=True, fontsize=14)

我们现在有了一棵更小的树。考虑底部的绿色节点。它包含 65 个样本,其中 61 个属于一个类。没有必要进一步分割该节点,因为我们可以承受 65 个样本中的 4 个错误分类。如果我们继续分割那个节点,模型可能会过拟合。最小杂质分割参数可用于根据杂质值控制树。它设定了基尼系数的门槛。例如,如果 min _ infinity _ split 设置为 0.3,则节点需要具有大于 0.3 的基尼值才能进一步分裂。

另一个控制树深度的超参数是 max_depth 。它不进行任何关于杂质或样品比率的计算。当达到 max_depth 时,模型停止分割。

clf = tree.DecisionTreeClassifier(max_depth=3)
clf.fit(X, y)
plt.figure(figsize=(20,10))
tree.plot_tree(clf, filled=True, fontsize=14)

与最小杂质减少相比,最大深度灵活性较差。举个例子,

我们也许不应该在左边分开。它只能区分 2 个样品,杂质减少不到 0.1。这实际上带给我们另一个超参数,即 min_samples_leaf 。它表示叶节点上所需的最小样本数。在一起使用超参数时,我们需要小心。例如,如果我们在前一个树中将 min_samples_leaf 设置为 3,那么将不会发生分隔 2 个样本的拆分,因为我们不能拥有少于 3 个样本的叶节点。嗯,不太对。让我们看看到底会发生什么。

clf = tree.DecisionTreeClassifier(max_depth=3,min_samples_leaf=3)
clf.fit(X, y)
plt.figure(figsize=(20,10))
tree.plot_tree(clf, filled=True, fontsize=14)

在这种情况下,min_samples_leaf 实际上对模型是有害的。这并不妨碍模型进行最后的分割。此外,它还造成了额外的错误分类。因此,以这种方式使用 min_samples_leaf 是不明智的。

我们还可以使用 max_leaf_nodes 参数限制叶节点的数量,该参数以最佳优先的方式增长树,直到达到 max_leaf_nodes。最佳分割是基于杂质减少来决定的。

clf = tree.DecisionTreeClassifier(max_leaf_nodes=5)
clf.fit(X, y)
plt.figure(figsize=(20,10))
tree.plot_tree(clf, filled=True, fontsize=14)

我们最终得到一个有 5 个叶节点的树。

决策树的另一个重要超参数是 max_features ,它是寻找最佳分割时要考虑的特征数量。如果未指定,模型将考虑所有特征。我们的数据集中有 13 个要素。如果我们将 max_features 设置为 5,则模型随机选择 5 个特征来决定下一次分割。Max_features 参数也有助于防止模型过度拟合,但仅仅使用 max_features 是不够的。如果我们让模型变得太深,它最终会使用所有的功能。

需要仔细调整超参数,以获得具有高样本外精度的健壮决策树。我们不需要使用所有的方法。根据任务和数据集的不同,几个就足够了。如果同时使用多个超参数,请格外注意,因为其中一个可能会对另一个产生负面影响。

感谢您的阅读。如果您有任何反馈,请告诉我。

超光谱图像分析分类

原文:https://towardsdatascience.com/hyperspectral-image-analysis-classification-c41f69ac447f?source=collection_archive---------10-----------------------

初学者指南

使用 python 对高光谱图像(HSI)进行分类的演练。

美国地质勘探局在 Unsplash 上拍摄的照片

本文提供了高光谱图像(HSI)上不同分类算法的详细实现。

目录

  • 高光谱图像(HSI)简介
  • 降维
  • 分类算法
  • 实施 HSI 分类
  • 参考文献

超光谱图像(HSI)介绍

遥感中,高光谱遥感器以其高光谱分辨率被广泛用于监测地球表面。通常,与传统的 RGB 图像相比,HSI 包含三个以上的波段。高光谱图像(HSI)用于解决不同领域的各种问题,如 C rop 分析,G 地质测绘,M 矿物勘探国防研究、城市调查、军事监视、等。

使用以下文章,该文章提供了关于 HSI 上的数据收集数据预处理、探索性数据分析的信息。

[## 超光谱图像分析—入门

使用 Python 进行高光谱图像分析的演练。

towardsdatascience.com](/hyperspectral-image-analysis-getting-started-74758c12f2e9)

有各种开源网站为学习目的提供超光谱数据。以下是两个受欢迎的网站:

[## 高光谱遥感场景

收集者:M . graa,MA Veganzons,B . ayer di 在这里你可以找到一些公开的高光谱信息…

www.ehu.eus](http://www.ehu.eus/ccwintco/index.php/Hyperspectral_Remote_Sensing_Scenes) [## 数据- rslab

(1)在 VV 和 VH 极化下的 SAR 哨兵-1 卫星图像

rslab.ut.ac.ir](https://rslab.ut.ac.ir/data)

在本文中,我们使用印度松树(IP) 高光谱图像数据集。印第安松树(IP) HSI 数据是使用 AVIRIS 传感器在印第安纳州西北部的印第安松树试验场收集的,由 145 X 145 像素、16 类和 200 个波段组成。以下是印度松树(IP)数据集的地面实况详细信息:

印度松树(IP)数据集的地面实况细节-作者提供的图像

读取数据集的代码:

Indian Pines 数据集的地面真实情况的可视化如下所示:

印度松树数据集的地面真实可视化——图片由作者提供

六个随机选择的超过 200 个波段的可视化如下所示:

印度松树条带(IP)数据集的可视化-图片由作者提供

降维

降维用于减少数据的维数,从而为分类器以低计算成本生成综合模型铺平道路。因此,降维在提高高光谱图像像素分类精度方面变得越来越重要。

降维有两种方式。它们是:

  • 特征选择
  • 特征抽出

特征选择是选择数据集特征维度的过程,它为机器学习任务(如分类、聚类等)提供模式。这可以通过使用不同的方法来实现,如相关性分析、单变量分析等

特征提取特征提取是通过选择和/或组合现有特征来创建缩减的特征空间,同时仍然准确和完整地描述数据集而不丢失信息,从而发现新特征的过程。

基于准则函数和收敛过程,降维技术也分为凸和非凸两类。一些流行的降维技术包括 PCA、ICA、LDA、GDA、核 PCA、Isomap、局部线性嵌入(LLE)、Hessian LLE 等。

使用下面的文章“使用 Python 降低超光谱图像的维数”来更好地理解。

[## 利用 Python 实现高光谱图像的降维

高光谱图像的降维技术。

towardsdatascience.com](/dimensionality-reduction-in-hyperspectral-images-using-python-611b40b6accc)

在本文中,我们将使用主成分分析(PCA) 来降低数据的维度。

主成分分析

主成分分析(PCA)是用于降低数据维度的标准算法之一。PCA 是一种非参数算法,其增加了可解释性,同时减少了最小化的信息损失(重建误差)。

使用下面两篇论文来更好地理解 PCA 背后的数学原理。

[## 主成分分析教程

主成分分析(PCA)是现代数据分析的中流砥柱-一个广泛使用的黑箱,但…

arxiv.org](https://arxiv.org/abs/1404.1100) [## 主成分分析:回顾与进展

大型数据集在许多学科中越来越普遍。为了解释这样的数据集,方法是…

royalsocietypublishing.org](https://royalsocietypublishing.org/doi/10.1098/rsta.2015.0202)

基于解释的方差比,组件的数量取为 40。下面的代码解释了—

前八个主成分或八个波段如下所示:

主成分分析后的前八个波段

分类算法

分类指的是预测建模问题,其中为给定的输入数据预测类别标签。分类可分为:

  • 分类预测建模
  • 二元分类
  • 多类分类
  • 多标签分类
  • 不平衡分类

今天,我们正在处理多类分类问题。有不同的分类算法用于高光谱图像(HSI)的分类,例如:

  • k-最近邻
  • 支持向量机
  • 光谱角度制图仪
  • 卷积神经网络
  • 决策树

在本文中,我们将使用支持向量机(SVM) 对高光谱图像(HSI)进行分类。

支持向量机(SVM)

支持向量机是一种监督分类算法,可以最大化数据和超平面之间的间隔。不同的核函数用于将数据投影到更高维度,例如线性、多项式、径向基函数(RBF)等

为了更好的理解,SVM 背后的概念参考下面的讲座:

[## 大间隔分类背后的数学-支持向量机| Coursera

斯坦福大学为“机器学习”课程制作的视频。支持向量机,简称 SVMs,是一种机器…

www.coursera.org](https://www.coursera.org/lecture/machine-learning/about-3eNnh) [## 内核 II -支持向量机| Coursera

斯坦福大学为“机器学习”课程制作的视频。支持向量机,简称 SVMs,是一种机器…

www.coursera.org](https://www.coursera.org/lecture/machine-learning/kernels-ii-hxdcH) [## 优化目标-支持向量机| Coursera

斯坦福大学为“机器学习”课程制作的视频。支持向量机,简称 SVMs,是一种机器…

www.coursera.org](https://www.coursera.org/lecture/machine-learning/optimization-objective-sHfVT)

实施 HSI 分类

以下代码用于实现支持向量机对高光谱图像进行分类。

混淆矩阵是使用代码生成的:

混淆矩阵-作者图片

生成的分类报告由分类准确度、准确度精度、召回率、F1 分数、支持组成,如下所示:

分类报告—按作者分类的图像

最后,分类图如下所示:

印度松树(IP)数据集的分类地图-按作者分类的图像

我在本文中写的全部代码可以在 GitHub 和 CoLab 中使用下面的笔记本来访问。

[## syamkakarla 98/超光谱 _ 图像 _ 分析 _ 简化

超光谱图像分析-分类

github.com](https://github.com/syamkakarla98/Hyperspectral_Image_Analysis_Simplified/blob/master/Articles/Hyperspectral_Image_Analysis _ Classification.ipynb) [## 超光谱图像分析分类

使用 Python 对高光谱图像进行分类的演练

colab.research.google.com](https://colab.research.google.com/drive/1hugIX9_PJxAvKoXySzQcZ4aW-yYYUqIk?usp=sharing)

参考

[## 评估降维方法对信息类和分类器的影响…

土地覆被分类更喜欢分类器和降维方法的某些组合。*设计 MCS…

www.sciencedirect.com](https://www.sciencedirect.com/science/article/abs/pii/S0273117713007308) [## 奇异值分解和主成分分析

Wall M.E .,Rechtsteiner A .,Rocha L.M. (2003)奇异值分解和主成分分析。在:贝拉尔…

link.springer.com](https://link.springer.com/chapter/10.1007%2F0-306-47815-3_5) [## sk learn . decomposition . PCA-sci kit-learn 0 . 23 . 2 文档

主成分分析。使用数据的奇异值分解进行线性降维…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html) [## sk learn . SVM . SVC-sci kit-learn 0 . 23 . 2 文档

c-支持向量分类。该实现基于 libsvm。拟合时间至少与…成二次比例

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)

超光谱图像分析—入门

原文:https://towardsdatascience.com/hyperspectral-image-analysis-getting-started-74758c12f2e9?source=collection_archive---------10-----------------------

初学者指南

使用 Python 进行高光谱图像分析的演练。

美国地质勘探局在 Unsplash 上拍摄的照片

高光谱图像(HSI)分析是人工智能(AI)研究的前沿领域之一,因为它在从农业到监控的各个领域都有应用。许多研究论文发表在这个领域,这使得它更加有趣!“对于初学者来说,在 HSI 上开始模式识别和机器学习非常麻烦”,因为与计算机视觉中的其他机器学习(ML)技术(如对象检测、人脸识别、GAN、自动编码器等)相比,它对社区的影响有限。

这篇文章提供了帮助初学者开始高光谱图像(HSI)分析的信息,从数据收集到数据可视化和分析,以及使用使用 Python 的交互式数据可视化工具。

让我们开始:

目录

  • 简介
  • 数据收集
  • 数据预处理
  • 探索性数据分析

简介

遥感中,高光谱遥感器以其高光谱分辨率被广泛用于监测地球表面。高光谱图像(HSI) 数据通常包含同一空间区域内的数百个光谱带,这些光谱带为识别各种材料提供了有价值的信息。在 HSI 中,每个像素可以看作一个高维向量,其条目对应于从可见光到红外的光谱反射率。

高光谱数据的获取和收集变得更加容易和经济,使得高光谱图像分析成为许多应用中有前途的技术之一,包括精确农业、环境分析、军事监视、矿物勘探、城市调查等

超光谱图像分类的任务是对使用超光谱传感器捕获的图像中的每个像素的类别标签进行分类。本博客重点介绍数据收集数据预处理探索性数据分析

数据收集

困难的部分来了,HSI 没有流行的数据源,这使得初学者很难开始 HSI 分析。以下是 HSI 的几个数据来源。

  • 计算智能集团
  • 遥感实验室

数据预处理

高光谱图像(HSI)数据大多以。mat 文件。可以使用不同的编程语言访问,博客使用 python。

提取 HSI 的像素是重要的预处理任务之一。这使得更容易处理数据,也更容易实现机器学习算法,如分类、聚类等

帕维亚大学数据集用于说明目的。在意大利北部帕维亚上空的一次飞行活动中,安明传感器拍摄到的 HSI 场景。光谱波段数为 103 ,HSI大小为610340 像素,地物包含 9 个。图像中的一些像素不包含信息,并且在分析之前必须被丢弃。几何分辨率为 1.3 米。这里是来自帕维亚大学 HSI 的几个样本乐队。*

帕维亚大学 HSI 的样本波段—图片由作者提供

读取数据集

通过使用科学 Python(SciPy) python 库,我们可以读取数据集。以下代码用于读取数据集。

该函数返回数据和地面实况或类,还显示数据和地面实况的大小,它们是 3D 和 2D 矩阵。

提取像素

像素是高光谱图像(HSI)中的单个元素,它是一个长度等于 HSI 波段数的向量。以下代码用于从 HSI 提取像素,保存到 CSV 文件中,并返回熊猫数据帧。

探索性数据分析

这是很难处理的数据是巨大的,因为帕维亚大学数据集的维数很高。因此,使用主成分分析(PCA)将数据的维度降低到 3D,这是一种流行且广泛使用的维度降低技术。以下代码用于将数据集的维度缩减为三个。

上面的代码生成了一个数据帧,其中列是三个主要组件(PC)和类。让我们看几个交互式可视化来检查数据中的模式。

很难想象数据集中的所有模式,因为它包含近 45k。因此,采样数据是可视化所有数据点或观察值或像素的最佳方式。除计数图外,随机使用每个类别的 200 个样本来描绘这些图。

  • 计数图:可以认为是一个分类变量的直方图,而不是一个定量变量。下图说明了 HSI 类别之间的关系。我们可以看到在帕维亚大学 HSI* 中,“沥青、裸土、自阻挡砖块和树木”是最受欢迎的课程。*

计数图-按作者排列的图像

  1. 结对图:这是一种非常简单的可视化每个变量之间关系的方法。它提供了数据中每个变量之间的关系矩阵。下图显示了主成分* (PC1、PC2 和 PC3)之间的关系。*

PC-1、PC-2 和 PC-3 之间的配对图—图片由作者提供

2. 3D 散点图:绘制三维轴上的数据点,显示三个变量之间的关系。下图以 3D 散点图的形式展示了主成分(PC1、PC2 和 PC3)之间的关系

PC-1、PC-2 和 PC-3 之间的 3D 散点图—图片由作者提供

3. 3D 线图:与 3D 散点图非常相似,但区别在于每个数据点都用一条线连接。下图以 3D 线图的形式显示了数据的可视化。这里我们可以看到,即使使用线性降维技术(PCA)* ,类的投影也相当好。*

PC-1、PC-2 和 PC-3 之间的 3D 线图—作者提供的图像

4.面积图:表示连接数据点和线段的一个变量相对于另一个变量的变化。主要组件(PC1、PC2 和 PC3)的可视化如下所示:

PC-1 和 PC-2 之间的面积图—作者提供的图像

PC-2 和 PC-3 之间的面积图—图片由作者提供

PC-2 和 PC-3 之间的面积图—图片由作者提供

这些是几种交互式可视化。

现在,您知道了在哪里可以找到 HSI 数据,如何读取和转换,以及可视化数据或模式的不同方法。

如果您对帖子中显示的代码感兴趣,可以使用下面的链接访问:

* [## 超光谱图像分析—入门

使用 Python 进行高光谱图像分析的演练

colab.research.google.com](https://colab.research.google.com/drive/1YxdtSvvhZCIf5u_d4pD69SKfpqPe0OrZ)

下一篇博客将介绍在 HSI 分类中使用的不同分类算法。

[## 超光谱图像分析分类

使用 python 对高光谱图像(HSI)进行分类的演练。

towardsdatascience.com](/hyperspectral-image-analysis-classification-c41f69ac447f)

来源:

[## Python 图形库

Plotly 的 Python 图形库制作出交互式的、出版物质量的图形。如何制作线图的示例…

plotly.com](https://plotly.com/python/) [## sk learn . decomposition . PCA-sci kit-learn 0 . 22 . 2 文档

主成分分析。使用数据的奇异值分解进行线性降维…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)*

真实问题的假设检验

原文:https://towardsdatascience.com/hypothesis-test-for-real-problems-64aafe17c1ad?source=collection_archive---------24-----------------------

数据科学,统计学

假设检验对于评估与数据样本相关的问题的答案非常重要。

来源:自己的工作

在这篇文章中,你可以探索一种假设,为什么我们需要它,以及如何计算它?

一个统计 假设是关于一个人口参数的一个信念。这种信念可能对,也可能不对。换句话说,假设检验是科学家用来支持或拒绝统计假设的一种恰当的技术。

决定一个统计假设是否正确的最理想的方法是检查整个人口。

因为这通常是不切实际的,我们通常从总体中随机抽取一个样本,并检查其等效物。在样本数据集与统计假设不稳定的情况下,假设被拒绝。

假设的类型

有两种假设,零假设(Ho)和替代假设(Ha)必须是完全互斥的事件。****

  • 无效假设通常是假设事件不会发生。
  • 另一种假设是事件将会发生的假设。

为什么我们需要假设检验?

假设一家公司需要在市场上推出一款新自行车。对于这种情况,他们将一起遵循假设检验来决定新产品在市场上的成功。

其中产品在市场上无效的可能性被假定为无效假设,产品盈利的可能性被假定为替代假设。

通过遵循假设检验的过程,他们将预见到成就。

如何计算假设检验?

克里斯·利维拉尼在 Unsplash 上拍摄的照片

  • 陈述两种理论,目标是只有一种可能是正确的,以至于这两种情况完全不相关。
  • 现在制定一个研究计划,该计划将列出如何评估数据。
  • 现在完成计划并真正研究样本数据集。
  • 最后检查结果,接受或拒绝零假设。

另一个例子

照片由 Ruthson Zimmerman 在 Unsplash 上拍摄

假设,一个人去求职,他在简历中表示他的写作速度是每分钟 70 字。招聘人员可能需要测试他的情况。万一他认为他的情况是充分的,他会招募他,无论如何,拒绝他。

于是,经过测试,发现他的速度是每分钟 63 个单词。目前,他可以决定是否雇用他。如果他符合所有其他资格标准。这个程序用通俗的语言描述假设检验。

在统计学术语假设中,他的排版速度是每分钟 70 字是一个待检验的假设,即所谓的零假设。显然,交替假设他的写作速度不是每分钟 70 字。

因此,正常合成速度是总体参数,样本合成速度是样本统计量。

接受或拒绝其申请的条件由遴选代表选择。例如,他可能得出结论,6 个单词的错误对他来说是没问题的,所以他会每分钟承认 64 到 76 个单词。

从各方面考虑,每分钟 63 个单词的样本速度将接近拒绝他的情况。此外,选择将是他在制造一个假的索赔。

在任何情况下,如果选择代表将他的接受区域扩展到正/负 7 个单词,即 63 到 77 个单词,他将容忍他的情况。

最后,假设检验是一个检验依赖于样本的总体的过程。这是一个迷人的合理的主题,带有相当的统计学术语。你得多潜水才能熟悉细节。

假设的显著性水平和拒绝区域

第 1 类错误概率通常用α表示,通常设置为 0.05。α的值被认为是显著性水平

拒绝区域是提示拒绝零假设的样本数据集。显著性水平α决定了拒绝区域的大小。

拒绝区域的样本结果被标记为在 α 水平上具有统计显著性。

不同α的影响是,如果α很小,例如 0.01,则第 1 类错误的可能性很小,并且在可以排除零假设之前,需要大量替代假设的样本证据。

然而,当α较大时,例如 0.10,拒绝区域较大,并且更容易排除零假设。

p 值的显著性

随后的方法是避免使用显著性水平,而只是报告样本证据的显著性。这种方法现在更加普遍。

这是通过一个 P 值的方法完成的。p 值是针对零假设的证据能力的度量。

它是得到检验统计量的观察值的可能性,或者如果调查问题的零假设为真,得到对零假设(Ho)具有显著更显著证据的值的可能性。

P 值越不显著,就越有证据支持替代假设。只有当 P 值小于α时,样本证据在α水平上才是显著的。

他们对双尾检验有关联。当利用置信区间进行双尾假设检验时,当且仅当假设值不在参数的置信区间内时,拒绝零假设。

假设检验和置信区间

假设检验和置信区间是从同一块布上剪下来的。95%置信区间拒绝假设的事件是对总体进行 p <0.05 under the relating hypothesis test, and the other way around.

A P-value is letting you know the greatest confidence interval that despite everything prohibits the hypothesis.

As such, if p<0.03 against the null hypothesis, that implies that a 97% confidence interval does exclude the null hypothesis.

假设检验意味着的事件

我们在总体均值未知的情况下进行 T 检验。

总的目的是将样本均值与一些假设的总体均值进行对比,以评估观察到的事实相对于假设是否具有如此大的独特性,以至于我们可以有把握地说假设的总体均值实际上不是真实的总体均值。

人口比例的假设检验

当你有两个独特的群体时, Z 检验有助于你选择两个群体中某些特征的比例是否相等。例如,如果两个国家的男性比例相等。

等总体方差的假设检验

F 检验取决于 f 分布,用于考虑两个公正样本的方差。此外,这还用于方差调查,以确定两个以上样本的显著性。

t 检验、f 检验和 Z 检验

T-testF-test完全是两个独特的东西。T 检验用于评估总体参数,例如总体均值,同样也用于总体均值的假设检验。****

但是,在不知道总体标准差的情况下,必须利用它。万一我们知道总体标准差,我们将利用 Z 检验。

我们同样可以利用 T 统计量来近似总体平均值。t 统计同样用于在样本均值的帮助下发现两个总体均值的差异。

Z 统计量T 统计量用于评估总体参数,如总体均值和总体比例。它同样用于检验人口平均数和人口比例的假设。

与我们管理平均值和比例的 Z 统计或 T 统计相反,卡方或 f 检验用于查看样本内部是否有任何差异。f 检验是两个样本的波动比例。

结论

假设鼓励我们做出一致的决定,变量之间的联系,并提供了额外调查的过程。

假说,在很大程度上,来自对研究行为、自然现象或已证实的理论的推测。一个诚实的假设应该是清晰的,详细的,可靠的数据。

在建立假设之后,接下来的阶段是验证或测试假设。假设检验包括允许同意或不同意已表达的假设的过程。

现在,把你的想法放在TwitterLinkedin,以及Github!!

同意 还是 不同意 与 Saurav Singla 的观点和例子?想告诉我们你的故事吗?

他乐于接受建设性的反馈——如果您对此分析有后续想法,请在下面的 评论 或联系我们!!

推文@ SauravSingla _ 08Saurav _ Singla,还有明星SauravSingla马上!******

假设检验:解释 A/B 检验

原文:https://towardsdatascience.com/hypothesis-testing-a-b-tests-explained-4d89de6b4ad2?source=collection_archive---------9-----------------------

假设检验的分类、A/B 检验的解释和 A/B 检验案例研究。

图片作者:特里斯特·约瑟夫

统计分析的一个重要目标是发现数据中的模式,然后将这些模式应用于“现实世界”。事实上,机器学习通常被定义为寻找模式并将其应用于大型数据集的过程。有了这种发现和应用模式的新能力,世界上的许多过程和决策都变得非常数据驱动。想一想;当一个人从亚马逊查看或购买一件商品时,他们通常会看到亚马逊推荐的他们可能会喜欢的产品。

现在,亚马逊不是在表演魔术。相反,他们已经建立了一个推荐系统,使用从用户那里收集的关于他们观看什么产品、喜欢什么产品以及购买什么产品的信息。有许多因素可以决定一个人是否“可能喜欢”一种产品并购买它。这些可以包括以前的搜索、当前搜索的频率、用户统计数据甚至一天中的时间。如果购买按钮是一种平静的颜色,如蓝色,人们是否更有可能点击购买按钮?嗯,这可以通过分析数据中的模式找到。

图片作者:特里斯特·约瑟夫

问题是,当数据受到随机噪声的影响时,很难确定一个合适的模式。这是因为随机噪声可以偶然产生模式。由于这种困难的存在,分析师必须使用所有适当的工具和模型来从他们的数据中做出推论。确定一个模式是否偶然出现的一种非常常见且严格的方法是进行假设检验。

假设检验是使用统计学来确定给定假设为真的概率。这意味着,可以通过假设一个特定的结果,然后使用统计方法来确认或拒绝该假设来解释数据。假设检验的通常过程包括四个步骤。首先,必须提出假设。零假设指的是被假定为真实的事情,通常的事实是,观察结果纯属偶然。替代假设指的是被检验为无效的东西,通常观察结果显示了一个真实的影响,并结合了一个随机变化的成分。

图片作者:特里斯特·约瑟夫

接下来,必须决定测试统计量。这是将用于帮助确定零假设的真值的方法和值。有许多测试统计可以使用,最合适的一个将取决于正在进行的假设检验。一旦找到检验统计量,就可以计算出 p 值。p 值是在假设零假设为真的情况下,获得至少与观察到的统计量同等重要的检验统计量的概率。换句话说,它是相应检验统计右侧的概率。p 值的好处是,通过将这个概率与α直接比较,可以在任何期望的显著性水平α下对其进行测试;这是假设检验的最后一步。

Alpha 指的是对结果有多少“信心”。当 alpha 为 5%时,意味着对结果有 95%的置信度。当比较 p 值和α值时,一旦 p 值小于或等于α值,就排除零假设。一般来说,p 值越低越好。这是因为低 p 值意味着,如果零假设为真,则出现与被测观测一样极端的观测结果的概率较小。本质上,p 值衡量样本统计量与给定的零假设的一致性。因此,如果 p 值足够小,就可以断定样本与零假设不相容,可以拒绝零假设。

图片作者:特里斯特·约瑟夫

现在,回到购买按钮是蓝色还是红色时人们更有可能点击这个问题。我仍然不知道,但像这样的场景在数据驱动的业务中经常大规模发生。这是假设检验的一种形式,用于优化业务的特定特征。这被称为 A/B 测试,指的是一种比较两个版本的东西,以找出哪个表现更好的方法。它包括同时向不同的业务用户群展示同一产品或功能的两个变体,然后通过使用成功和跟踪指标来确定哪个变体更成功。

A/B 测试往往与网站和 app 联系在一起,在大型社交媒体平台上极为常见。这是因为平台的转化率(有多少人看到了某样东西并点击了它)在很大程度上决定了平台的命运。因此,平台用户可以看到的每一条内容都需要优化,以实现其最大潜力。

A/B 测试的过程与前面解释的假设测试的过程相同。它需要分析师进行一些初步的研究,以了解正在发生的事情,并确定需要测试什么特性。此时,分析师还可以确定什么是成功和跟踪指标,因为他们会使用这些统计数据来了解观察结果的趋势。在此之后,假设将被公式化。没有这些假设,测试活动将没有方向。接下来,测试特性的变化将被随机分配给用户。然后收集和分析结果,并部署成功的变体。

图片作者:特里斯特·约瑟夫

最后,让我们检查一个假设的 A/B 测试。考虑一个大型社交媒体平台,其中既有分享生活内容的个人用户,也有分享重要信息(如公司更新或世界新闻)的公司。可以看出,用户对公司内容的参与度很低,这是一个问题,因为该平台希望确保其用户群尽可能跟上世界各地发生的事情。从逻辑上讲,我们的目标是制定一个计划来提高用户对公司内容的参与度。

可以合理地假设,参与度可能较低,因为公司内容隐藏在个人内容中,用户不会立即意识到他们正在浏览两种不同类型的内容。因此,如果将公司内容从个人内容中分离出来,然后放在自己的“新闻页面”上,参与度可能会提高。这样,用户将确切地知道他们正在观看的内容类型,他们可能会花更多的时间来了解他们周围的世界;从而提高参与度。因此,零假设可能是重新设计的平均参与度和原始设计的平均参与度之间的差异不等于零。另一个假设是,均值之间的差异明显大于零。

图片作者:特里斯特·约瑟夫

这个测试的成功标准是访问这个“新闻页面”的用户数量(来自测试样本)。原因是这种重新设计只有在用户访问和消费该页面上的内容时才能成功。跟踪指标可以是每个用户的观看时间。这是因为需要确定用户到达页面后是否还在与内容互动,或者他们是否已经登陆页面(出于偶然或类似原因)并立即离开。

如果发现重新设计的参与度明显更高,而且这不是偶然的,那么应该对整个平台实施重新设计。应该注意的是,该示例是 A/B 测试过程的简化版本,但是仍然可以应用这些概念。

欢迎来到假设检验的奇妙世界!

参考文献:

ab 测试/#如何执行 ab 测试

machinelearningmastery.com/statistical-hypothesis-tests/

【mathworld.wolfram.com/HypothesisTesting.html

ncbi.nlm.nih.gov/pmc/articles/PMC5991789/

statistics byjim . com/假设检验/解释-p 值/

其他有用的素材:

Amazon . com/Introducing-Statistics-Graham-J-G-Upton/DP/0199148015

optimize ly . com/optimization-glossary/AB-testing/#:~:text = AB % 20 testing % 20 is % 20 essentially % 20 an,for % 20a % 20 given % 20 conversion % 20 goal。

researchgate.net/post/how_to_interpret_P_values

towards data science . com/statistical-tests-when-to-use-which-704557554740

neilpatel.com/blog/ab-testing-introduction/

假设检验、特征和计算

原文:https://towardsdatascience.com/hypothesis-testing-characteristics-and-calculation-ba3bdf516ea5?source=collection_archive---------35-----------------------

在 Unsplash 上由 Albert S 拍摄的照片

什么是假设检验,它的重要特征以及如何进行假设检验

假设检验是一种统计方法,用于检验关于总体的公认主张的有效性。这种被普遍接受的说法被称为无效假设。基于 p 值,我们拒绝或未能拒绝零假设。

要记住的关键特征

  1. p 值越小,应该拒绝零假设的证据就越强。
  2. 当样本量足够大时,检验统计量服从正态分布。当样本中至少有 10 个肯定答案和 10 个否定答案时,样本量就可以称为足够大。请参见下面的例子以获得更清楚的解释。

用一个例子理解假设检验

下面是研究问题:

去年,52%的父母认为电子产品和社交媒体是他们青少年睡眠不足的原因。“现在有更多的父母认为他们的孩子睡眠不足是由电子产品和社交媒体造成的吗?”

这个问题摘自 Coursera 的“使用 Python 进行推断统计分析”课程。在这个问题中,我们被要求测试,是否有大量的父母认为社交媒体是他们青少年睡眠不足的原因。以下是执行该测试的逐步过程:

第一步:

建立了零假设。在任何假设检验中,我们都需要在收集任何数据之前建立假设。研究人员提出了两个假设。第一个是零假设,即研究者想要检验和拒绝的信念或前提。在上面的例子中,零假设是 0.52。因为 52%的父母认为电子产品和社交媒体导致了他们青少年的睡眠不足。

第二步:

定义替代假设。再看研究题。我们需要弄清楚今天是否有更多的父母认为电子产品和社交媒体是睡眠不足的原因。这意味着,我们必须找出今天 p 是否大于 0.52。

在进行 p-检验后,如果我们有足够的证据拒绝零假设,我们将接受替代假设。

第三步:

选择显著性水平。大多数时候研究人员选择 0.05。这意味着置信度为 95%。显著性水平小于或等于 5%的 p 值意味着结果不是随机的概率大于或等于 95%。所以,你的结果是有意义的,有足够的证据来拒绝零假设。对于这个例子,我们将使用显著性水平 0.05。

第四步:

收集数据。在明确假设和显著性水平后,我们应该收集数据。对于这个例子,莫特儿童医院收集了数据,发现了这个:

随机抽样调查了 1018 名有一个十几岁孩子的父母。56%的人说,他们认为电子产品和社交媒体是他们青少年睡眠不足的原因。

第五步:

为假设检验检查标准假设 。有两个假设:

  1. 我们需要一个简单的随机样本。
  2. 我们需要足够大的样本量来保证样本比例的分布是正态的。

如何知道样本是否足够大?n* p 需要至少为 10,n*(1-p)也需要至少为 10。这里 p 是 0.52。因为 0.52 是我们的零假设。n 是人口数量。在这种情况下是 1018。

n*p = 1018 * 0.52 = 529

n *(1-p)= 1018 *(1–0.52)= 489

样本是随机的。因此,检查假设已经完成。现在我们可以进行 p 测试了。

第六步:

计算 p 值。计算检验统计量 Z 的公式为:

如果我用符号代替文字:

标准误差(SE)的公式为:

插入值:

标准误差为 0.0157。检验统计量 Z 为:

检验统计量 Z 是 2.555。这意味着观察样本比例(0.56 或 56%)比零假设(0.520 或 52%)高 2.555 个零标准误差。

在上图中,散列区域是 p 值。使用 Z 检验统计,我们可以发现的 p 值为 0.0053 。您可以使用 Python 等编程语言或 z-table 找到这个 p 值。

第七步:

得出结论。由于 p 值(0.0053)小于显著性水平(0.05),我们有足够的证据拒绝零假设。所以,我们的另一个假设是正确的,今天超过 52%的父母认为电子产品和社交媒体是他们青少年睡眠不足的原因。

这个例子是对人口比例进行 p 检验。我希望解释清楚了。以下是一些更有效的假设检验示例,并附有详细解释:

[## 如何在 Python 中执行假设检验:比例和比例差异

学习在 python 中对一个人口比例和两个人口的差异进行假设检验…

towardsdatascience.com](/how-to-perform-hypothesis-testing-in-python-proportion-and-the-difference-in-proportions-ea7d23dcd038)

本文解释了总体均值的假设检验以及两个总体均值的差异:

[## Python 中的假设检验:一个均值和两个均值的差异

学习在 python 中对一个均值和两个均值的差异进行假设检验。

towardsdatascience.com](/hypothesis-testing-in-python-one-mean-and-the-difference-in-two-means-87cb60b02a51)

这里还有一些阅读材料:

如何为有意义的数据分析提出好的研究问题

置信区间、计算和特征

如何计算均值的置信区间和均值的差

假设检验:数据科学

原文:https://towardsdatascience.com/hypothesis-testing-data-science-1b620240802c?source=collection_archive---------19-----------------------

利用实验数据进行统计决策的一种统计方法

图片由皮克斯拜的 Gerd Altmann 提供

使用推断统计学,我们学会了如何分析样本数据,并对总体均值和其他总体数据做出推断。然而,我们无法证实我们对人口数据得出的结论。这就是为什么假设检验的概念出现了。

关于推断统计和中心极限定理可以在我之前的文章中了解更多。

假设

使用推断性、描述性和探索性分析,我们对人口样本进行了一些研究。我们从样本中得出了一些见解,并对整个人口做出了断言。这些只是主张;它们并不完全正确。这种类型的主张或假设被称为假设。

假设检验

有一些方法或技巧来检查假设,如果假设是正确的,那么我们将它应用于整个人口。这个过程被称为假设检验。最终目标是是否有足够的证据证明假设是正确的。正如我们在推论统计学和中心极限定理(CLT)中已经看到的,我们将使用样本数据并在假设检验中证实我们关于总体的假设。

在假设检验中,我们提出两个假设:

  • 零假设(H₀) :现状
  • 另类假设(H₁) :挑战现状

零假设(H₀)

零假设是关于一个群体的普遍看法。它声明情况或索赔没有变化或差异。 H₀ 表示零假设

替代假设(H₁)

替代假设是反对零假设的主张。H₁表示另一种假设。

例如,在刑事审判中,陪审团必须决定被告是无辜的还是有罪的。这里的无效假设是,被告是无辜的,就像指控之前一样。另一种假设是被告有罪,检察官会试图证明这一点。

假设检验的结果

在假设检验中,如果有足够的证据支持替代假设,我们拒绝零假设。如果替代假设没有足够的证据,我们就不能拒绝零假设。这就是我们索赔的方式。在任何情况下,我们都不应该说我们“接受”了零假设。要么我们拒绝,要么我们不能拒绝零假设,就是这样。

举例:

如果一家公司有 30000 名员工,声称员工每天到达办公室平均需要 35 分钟。

这里,
空 Hypothesis(H₀) :员工平均时间= 35 分钟
候补 Hypothesis(H₁) :员工平均时间≠ 35 分钟

制定无效和替代假设

有一个共同的规则来制定索赔声明的无效和替代假设。

  • 零假设总是有以下符号: =
  • 交替假设总是有以下迹象:≠或<或>

例 1

一家公司在一份声明中声称,其 2022 年 8 月的总估值至少为 200 亿美元。

上述主张的假设是:

  • Null Hypothesis(H₀): 总估值≥200 亿美元
  • 候补 Hypothesis(H₁): 总估值<200 亿美元

例 2

另一家公司声称其 2020 年 8 月的总估值超过 200 亿美元。

上述主张的假设是:

  • Null Hypothesis(H₀): 总估值≤200 亿美元
  • 候补 Hypothesis(H₁): 总估值>200 亿美元

正如我们从上面两个例子中所观察到的,我们不能从索赔陈述本身决定现状或制定无效假设。零假设从不包含≠或< or >符号。

在制定无效假设和替代假设之后,下一个最关键的步骤是做出决定拒绝或不拒绝无效假设。

决定

我们举个例子来理解如何决定拒绝还是不拒绝零假设。

索赔:员工到达办公室的平均时间是 70 分钟。我们从公司里随机挑选了一些人,计算出平均时间为 50 分钟。

  • 空 Hypothesis(H₀): μ = 70
  • 样本均值: x̅ = 50

现在,我们根据分布图做出决定,

作者图片

  • 如果样本 mean(x̅位于临界区域内,我们拒绝零 hypothesis(H₀。
  • 如果样本 mean(x̅位于临界区域之外,我们无法拒绝零 hypothesis(H₀。

无效假设和替代假设的公式决定了检验的类型和临界区在正态分布中的位置。

基于备选假设中的“符号”,有三种类型的测试:

  • ≠在 H₁ →双尾检验→分布两侧的拒绝/临界区域
  • < in H₁ → Lower-tailed test → Rejection/Critical region on the left side of the distribution
  • h₁→上尾检验→分布右侧的拒绝区域

示例:

  1. 如果平均通勤时间至少为 30 分钟,那么 H₀ ≥ 30,H₁ < 30, that means the test is a Lower Tailed test since the critical region will be on the left side of the distribution.
  2. If the average commute time is at most 30 minutes, then H₀≤ 30 and H₁> 30,这意味着测试是一个上尾测试,因为临界区域将在分布的右侧。
  3. 如果平均通勤时间是 30 分钟,那么 H₀=是 30 分钟,H₁≠30 是 30 分钟,这意味着测试是一个双尾测试,因为临界区域将在分布的两侧。

为了找到临界区域的临界值,我们使用临界值方法或 p 值方法。

临界值法

使用临界值方法进行决策的步骤如下:

  1. 制定假设,确定 H₀H₁ 并确认我们要做的测试类型。
  2. 根据给定的α值(显著性水平)计算 z 临界值(Zc)的值。
  3. 根据试验类型从 Zc 计算临界值(UCV 和 LCV)。
  4. 该决定基于临界值的样本 mean(x̅)。

使用示例查找临界值

声称:假设天气预报声称一个国家的平均降雨量为 350 毫米,标准差(σ)为 90。现在,我们以全国 36 个城市为样本,计算出样本平均 mean(x̅为 370.16。我们不得不拒绝或未能拒绝 5%重要性的索赔。

现在,利用这些信息,我们需要计算临界值。

1。制定假设

  • 零假设(H₀): μ = 350
  • 替代假设(h₁)350

由于 H₁包含≠符号,因此该检验将是一个双尾检验,其临界区域位于正态分布的两侧。

2。查找 Zc 值

假设α = 0.05,由于这是一个双尾检验,临界区域位于分布的两侧,因此两侧的显著性水平都是 0.025。这意味着右侧临界区域的面积为 0.025。这意味着直到 UCV 的面积(直到该点的累积概率)将是 1–0.025 = 0.975。

按作者分类的图像—计算临界值

因此,我们需要使用 Z 表找到值为 0.975 的 Z 得分。Z 分数将是 1.96

来源— Z 表 : Z 值为 0.975 时的得分

Zc = 1.96

3。计算临界值

计算临界值的公式为:
UCV =μ+(Zc *σx)
LCV =μ-(Zc *σx)

σx = σ/√n = 90/√36 = 90/6 = 15

UCV = 350+(1.96 * 15)= 379.4
LCV = 350-(1.96 * 15)= 320.6

现在,让我们将μ、x̅、UCV 和 LCV 的所有值绘制在分布图中,并做出决定。

按作者分类的图像—绘制分布图中的所有点

正如我们所看到的,样本 Mean(x̅位于临界区域之外。

4。做决定

由于样本均值位于临界区域之外,我们无法拒绝零假设。

这就是我们如何使用临界值方法来判断假设是否正确。接下来,我们将看到另一个叫做的方法 p 值法。p 值法很重要,在行业中使用更频繁。

p 值法

简单来说,p 值定义为零假设不被拒绝的概率。这不是正式的定义;是为了更好的理解。

以下是我们使用 p 值法确定零假设时需要遵循的步骤:

  1. 制定假设,确定 H₀H₁ 并确认我们要做的测试类型。
  2. 计算样本平均值的 Z 值。
  3. 使用 z 表计算给定 z 得分的 p 值。
  4. 根据给定值σ(显著性)的 p 值做出决定

使用 z 得分计算 p 值。

情况 1: 如果样本均值在分布均值的右边,Z 值= +3.02,那么从 Z 表中,我们可以找到值= 0.9987

现在,

对于单尾检验→p = 1–0.9987 = 0.0013
对于双尾检验→p = 2(1–0.9987)= 0.0026

情况二:如果样本均值在分布均值的左侧,Z 值= -3.02,那么从 Z 表中,我们可以找到值= 0.0013

现在,

对于单尾检验→ p = 0.0013
对于双尾检验→ p =2*0.0013= 0.0026

使用示例查找 p 值

让我们以临界值法所用的同一个天气预报为例。我们有μ = 350,x̅ =370.16,σ=90,α = 5%

σx = σ/√n = 90/√36 = 15

1。制定假设

  • 零假设(H₀): μ = 350
  • 替代假设(h₁)350

由于 H₁包含≠符号,因此该检验将是一个双尾检验,其临界区域位于正态分布的两侧。

按作者分类的图像-分布图中的样本平均值

2。计算样本平均值的 Z 得分值

z =(x̅-μ)/σx =(370.16–350)/15 = 1.34

使用 Z 表,我们将找到 Z 值的累积概率

来源— Z 表:Z = 1.34 时的概率

P(Z=1.34) = 0.9099

3。计算 p 的值

使用前面提到的两种情况,因为样本均值位于分布均值的右侧。

由于样本均值位于分布均值的右侧,并且检验是双尾检验,

p = 2(1–0.9099)= 0.1802

4。做出决定

由于 p 值(0.1802)大于α值(0.05),我们无法拒绝零假设。

错误

在假设检验过程中,我们会犯两种错误:

  1. 第一类误差
  2. 第二类误差

第一类错误

当零假设正确时,第一类错误发生,但我们拒绝它,即当它为真时拒绝 H₀。
1 类错误的概率用 alpha(α)表示,通常为 0.05 或 0.01,即只有 5%或 1%的几率。第 1 类误差也称为假设检验的显著性水平。

第二类错误

当零假设为假时,第二类错误发生,但我们未能拒绝它,即,当它为假时,未能拒绝 H₀。实际上,这是我们可能犯的最严重的错误。第二类错误的概率用β表示。

结论

正如我们所看到的,假设是我们对一个或多个总体参数的主张或假设。有两种假设,零假设(H₀)和交替假设(H₁).基于这些假设,我们设计了三个检验:双尾检验、下尾检验和上尾检验。最后,借助临界值法和 p 值法,我们决定拒绝或不拒绝零假设。

还有许多其他的方法来做决策,如 t 分布法、双样本均值检验、双样本比例检验、A/B 检验等。一旦我们理解了假设是如何工作的,我们就可以探索更多的方法和技术。

感谢您阅读快乐编码!!!

在这里查看我以前关于 Python 的文章

  • (CLT)中心极限定理:数据科学
  • 推断统计:数据分析
  • 探索性数据分析(EDA): Python
  • 使用 Python 对 Pandas 数据帧进行索引
  • Seaborn:Python
  • 熊猫:蟒蛇
  • Matplotlib:Python
  • NumPy: Python
  • 数据可视化及其重要性:Python

参考

  • 假设检验:https://www.statisticssolutions.com/hypothesis-testing/
  • 假设检验在数据科学中的重要性:https://analyticsindiamag . com/Importance-Of-Hypothesis-Testing-In-Data-Science/
  • 假设检验:https://365 data science . com/explainer-video/Hypothesis-testing-steps/
  • Z 评分表:http://www.z-table.com/

假设检验去神秘化

原文:https://towardsdatascience.com/hypothesis-testing-demystified-e434a665e055?source=collection_archive---------32-----------------------

如何将数学翻译成简单的英语

图片由在 Pixabay 上的免费照片提供

假设检验可能是统计研究中最有价值的阶段。这是你得出结论的地方,在这里你可以找到你一直在寻找答案的问题的答案。这些问题应该是简单的是/否问题。假设检验是统计研究的一个阶段,在这个阶段,你正在将数学翻译成英语

假设检验很可能是你的老板希望你做的,如果你是一名统计学家的话。如果你去找他,只是说:“1 = 135,2 = 140”之类的话,那么他/她可能会说:“好吧。但是…这些数字对我的业务意味着什么?好吃吗?很糟糕吗?”。告诉他这样的话会好得多:“我发现统计证据表明,你的新营销策略比以前的策略给我们带来了更多的利润”。

在假设检验的这一点上,是时候把所有那些从你的数据集中获得的讨厌的数字转化成关于你感兴趣的问题的容易理解的陈述了。

与反证法的比较

假设检验与数理逻辑中最简单的证明方法之一有一些相似之处:矛盾证明。假设检验可以被认为是矛盾证明的概率对等物。

让我们先回忆一下这个方法。反证法是如何工作的?

假设我们想证明一个陈述,称之为 A。当我们用矛盾证明时,我们首先假设 A 的对立面(表示为~A 或非 A)为真,然后我们试图得出一个矛盾(一个总是假的陈述)。如果我们得出一个矛盾,那么这意味着我们的假设~A 为真,应该为假,因此 A 应该为真。

假设检验的思想类似于用矛盾证明的思想,但这一次~A 被称为“零假设”并由 H0 表示,而 A 被称为“替代假设”并由 H1 表示。达到一个矛盾(即得到一个不可能为真的结果)现在是达到一个可以为真的低概率的结果。这个概率应该有多低?一个常用的值是 0.05;这个阈值被称为显著性水平,用α表示。所以,如果给定零假设,你的观测数据的概率≤ α,那么你认为这个概率太低,H0 不可能是真的;所以,你将拒绝 H0,因此接受 H1。在假设检验的情况下,而不是证明 H1 (即以 100%的置信度;数理逻辑证明就是这样),你 1-α确信 H1 为真

请注意,我们只能接受 H1,不能接受 H0。仅仅因为我们有时不能拒绝 H0,这并不意味着我们接受它。正如用矛盾证明的情况一样,仅仅因为我们假设~A 为真,我们可能不知道如何得出矛盾,这并不一定意味着~A 为真。

基于 H0 是真实的最初假设而得出 H0 是真实的结论是自相矛盾的,因此我们只能拒绝 H0。

统计公式

为了进行假设检验,我们首先需要做一些假设:我们假设我们的观测值 X1,X2,…,Xn 是独立同分布的(独立同分布),其概率分布为;其中θ是一个固定但未知的参数(也可以是更多标量参数的向量)属于θ(大写 theta 所有可能参数的集合为 概率分布族)。

在假设检验的背景下,我们想对参数θ进行陈述。为此,我们取θ的两个不相交子集:θ0 和θ1,然后考虑以下两个假设:

按照惯例,H0 应该被拒绝,而 H1 是我们想要接受的。

例如,考虑以下场景:

你想研究大学毕业生在申请大学之前是否最终得到了他们想要的工作,或者他们是否倾向于改变主意?为此,你去那里收集一些随机选择的 5 年前毕业的人的数据,对于他们每个人,如果他/她在大学前找到了他们想要的工作,你就写下 1,否则写下 0。然后,您将该数据视为 i.i.d .伯努利(p ),并想要测试 p >与否。所以,我们有这些假设:

那么,我们如何决定是否拒绝零假设呢?我们使用一个随机变量来做这个决定。这个 r.v .(随机变量)是我们的数据的函数,只输出 0(不拒绝)或 1(拒绝)。对于固定参数θ,该 r.v .具有伯努利分布。我们用来做决定的这个简历叫做 测试 ,用ψ表示。

测试通常有以下形式之一:

或者:

其中:ψ是观测数据 X 1,…,Xn 的函数,记法 1{。} 是一个指示器随机变量,当大括号内的表达式为真时取值 1,否则取值 0。Tn 是一个叫做检验统计量的随机变量,c 是一个常数。

第一种形式被称为单侧测试,因为只有当 Tn 在常数 c 的右侧时,测试才为 1。第二种形式被称为双侧测试,因为当 Tn 在 c 的两侧时,测试可以为 1;Tn > c 或 Tn < -c 将导致测试为 1。

测试误差

正如您在上面看到的,我们的测试依赖于我们观察到的数据,这些数据是随机的,我们将其建模为 r.v.s X1,…,Xn。所以,我们测试的结果是,嗯…,随机的。我们不能保证当我们应该拒绝 H0 时它总是给我们 1,或者当我们不应该拒绝 H0 时它总是给我们 0。无论我们选择什么样的测试,它都会给我们带来一些错误。

假设检验中可能出现两种错误:

I 型错误发生在我们拒绝 H0 的时候,但实际上是真的。第二类错误是当我们没有拒绝 H0 的时候,其实是假的。

第一类和第二类错误的概率都取决于真参数θ,因此它们是θ的函数。

I 类误差的概率,用αψ表示:

这是当真θ属于θ0 时,我们的测试指示 1 的概率。与θ0 不同的θ可以给出不同的 I 型误差概率。

第二类误差的概率,用βψ表示:

这是当真θ属于θ1 时,我们的测试指示为 0 的概率。θ与θ1 的每一个不同,都会给我们不同的第二类错误概率。

显著性水平和 p 值

我们希望我们的测试有小概率的错误。因此,我们希望选择检验统计量 Tn 和常数 c,使这两种错误的概率最小。但是同时最小化两种类型的误差是一个困难的问题。在真参数θ处于θ0 和θ1 之间的边界的最坏情况下,这两类误差的概率是互补的;当一个小的时候,另一个大,我们没有办法把两个都变小。

我们所做的是区分第一类错误的优先级。我们对第一类错误的概率设定了一个上限,这样我们也可以得到一个合理的第二类错误。

为什么我们优先考虑第一类错误?第一类错误是当 H0 为真时,我们拒绝它。在假设检验中,拒绝 H0 是导致“发现”的事情,证明我们最初的猜测(H1)。一个大的 I 型错误意味着我们证明了许多错误的东西。我们不希望这样。我们倾向于不那么频繁地总结 H1,但是当我们这样做的时候,要非常自信地认为我们的结论实际上是正确的。

我们确定的 I 型误差的上限被称为测试的显著性水平,用α表示,因此:

测试ψ拒绝 H0 的最小水平α称为测试ψ的 p 值

这可能一开始听起来有点混乱。α和 p 值有什么区别?α是一个你选择的数字,你提前确定它。你可以在收集任何数据或者做任何实验之前选择α。p 值是根据观察数据计算出来的,这是您可以为α确定的最小数值,因此,在根据观察数据计算测试后,您仍然可以剔除 H0。p 值越小,你越有信心拒绝 H0。

双样本测试

基于我们之前展示的测试公式:

我们可能会倾向于认为,我们到目前为止所讨论的内容仅适用于我们想要将单个样本的参数与常数进行比较的情况,并且 Tn 应该是该参数的某种估计量。

如果我们不想测试某个样本的参数如何与常数进行比较,而是测试它如何与另一个样本的参数进行比较,该怎么办?我们需要想出另一个公式来测试吗?不。我们可以使用相同的测试公式,并保持我们到目前为止讨论的所有内容有效。我们唯一应该做的是给 Tn 加上一个特殊的形式:

其中 Un 和 Vn 是基于不同的样本计算的。通过使用这个 Tn,我们可以测试 Un 是否大于 Vn。如果您只对 Un 和 Vn 之间的绝对差异感兴趣,只需将它们放在绝对值中,并使用双边测试。

利用中心极限定理进行假设检验

到目前为止,我们只是笼统地讨论了假设检验,没有描述具体的检验方法。在我们展示的测试公式中,Tn 可以是任何随机变量。任何基于我们的数据并能以最多α个误差概率拒绝 H0 的怪异和非直觉的随机变量都将是检验统计的良好候选。

然而,一种常用的方法是使用中心极限定理(CLT)来做假设检验。如果我们使用独立同分布随机变量(我们的数据)的平均值作为我们想要测试的参数的估计量,那么 CLT 暗示,当样本大小为 n → ∞时,这个平均值将具有正态分布。然后我们将这个量标准化(减去平均值并除以标准偏差),并将其视为我们的测试统计量 Tn。以这种方式计算的 Tn 将具有标准正态分布。这是一个众所周知的概率分布,我们可以用它来确定我们的测试需要的常数 c,以满足我们选择的水平α。

其中:

  • 是 Xi 的期望值;这通常是在零假设中假设的
  • σ是 Xi 的标准差;这通常是基于样本的估计值,当 n 趋于无穷大时,它应该非常接近真实的标准差。
  • 上面带“d”的箭头表示分布收敛
  • N(0,1)表示标准正态分布

下面是单面情况下的图像:

常数 c 是拒绝区域(蓝色)和非拒绝区域之间的阈值。如果 Tn > c (Tn 落在拒绝区域中),我们拒绝 H0,否则我们拒绝失败。c 是基于选择的α值计算的;经过计算,拒绝区域的面积为α。我们可以通过表格或计算器/软件包找到 c。

在这种情况下,p 值是我们得到的 Tn 值右边的区域面积。我们还可以测试 Tn < -c, in which case things would be similar, but the rejection region would be to the left of -c.

Below is illustrated a two-sided test:

In the case of a 2-sided test, things would be similar, but α is now split between the 2 sub-regions: Tn < -c and Tn > c。这两个区域的面积都是α/2。

如果您有足够大的样本量(比如说,几百个),那么您的测试统计量 Tn 将非常接近标准正态分布,并且样本方差将非常接近真实方差。因此,这种方法是进行假设检验的最简单、最好的方法之一。

“学生”t 检验

用标准正态近似 Tn 的缺点是,它对于小样本量来说是不准确的。

在小样本的情况下,误差主要有两个来源:

  • X̅n 分布的形状可能不够接近正态分布
  • Xi 的估计方差σ hat 可能不够接近 Xi 的真实方差σ

那么,如果样本量相对较小,我们能做些什么呢?

我们可以用来克服估计方差问题的一种方法是学生的 t 检验。学生的 t-检验是一种 Tn 遵循学生的 t-分布的检验(学生这个名字来自于 1908 年威廉·希利·戈塞以笔名“学生”首次发表的事实)。

t 分布类似于标准的正态分布,但它有一个称为自由度(df) 的参数,它只是样本大小减一(df = n-1)。当 df 很大时(几百个数量级),t 分布非常接近标准的正态分布。随着 df 变小,钟形曲线开始变平,让更多的概率出现在它的尾部。因此,当我们有一个小样本时,我们需要一个更大的 Tn 值来拒绝 H0,以便考虑方差估计可能产生的误差。

理论上,对于具有 t 分布的 Tn,随机变量 X1,…,Xn 需要正态分布。但是,在实践中,如果 n > 30(CLT 的经验法则)或者如果 X1,…,Xn 接近正态分布,则 t 分布应该足够好地模拟检验统计量 Tn。

其中:

  • σ这是贝塞尔校正样本方差。我们除以 n-1,以便获得一个无偏估计量。如果我们按照直觉,只除以 n,估计值将会有偏差。

T(n-1)是具有 n-1 个自由度的 t 分布。

一个例子

让我们回到上面提到的一个例子:“我们想研究大学毕业生在申请大学之前是否最终得到了他们想要的工作,或者他们是否倾向于改变主意?”

我们将我们的数据建模为参数为 p 的 n i.i.d .伯努利随机变量。如果此人拥有他/她在大学之前想要的工作,则这些变量中的每一个都将具有值 1,否则为 0。参数 p 代表得到 1 的概率。

我们想得出结论,大多数人会改变主意。根据我们假设的模型,p < ½. So, we will state our hypotheses as follows:

For this hypothesis test, we want to use a significance level of α = 0.05.

I do not have any real data for this, so I will just come up with some numbers as an example. Let us say the sample size is 81, sample mean is 0.4 and sample variance is 0.24. For this sample size, we want to use a Student’s t-test.

Now let us assume H0 to be true. This means that p ≥ ½. But we need only one value for p to use in computing Tn. We will choose the value of p from the interval [1/2, 1] that can lead to the biggest error: p = ½. We want to be cautious, that is why we assume the worst value of p for our test. In this way, if we reject, we can be really confident of our result.

Now, let us compute the test statistic:

To see if this test statistic falls in the rejection region we will use a t-distribution table (like the one 在这里):

我们在表格的表头(在显示“单尾”的那一行,因为我们在做单侧测试)寻找我们选择的α,在我们的例子中是 0.05。然后我们用我们的自由度(80)寻找行。我们在表格中先前找到的列和行的交叉点处找到的值是我们的常数 c 的值,它是拒绝和非拒绝区域之间的阈值;在我们的例子中,这个值是 1.664。但是这些表是考虑到右边的拒绝区域而制作的。在我们的问题中,拒绝区域在左侧。因为 t 分布关于 0 是对称的,这并不重要,我们只取表中的负值。所以,c = -1.664 是我们的分隔符。如果 Tn < -1.664 we reject H0, otherwise we fail to reject.

Our test statistic was Tn ≈ -1.84 < -1.664, therefore we reject the null hypothesis and accept the alternative hypothesis H1. So, we conclude that p < ½. In English, this would be:“我们有统计证据表明,大多数人最终都有了不同于他们大学前最初想法的其他工作”

在我们的例子中,p 值是 t ≤ -1.84 处 t 分布曲线下的面积。为了计算这个数量,你可以使用在线计算器,比如这里的。

我们的 p 值是 0.0347,这是我们可以拒绝 H0 的最小α。

我希望这些信息对你有用,感谢你的阅读!

这篇文章也贴在我自己的网站这里。随便看看吧!

尽可能简单地解释假设检验

原文:https://towardsdatascience.com/hypothesis-testing-explained-as-simply-as-possible-6e0a256293cf?source=collection_archive---------8-----------------------

数据科学家最重要的概念之一

图片来源:Pixabay 的 PIRO4D

目录

  1. 简介
  2. 术语
  3. 拒绝还是不拒绝?
  4. 显著性检验的意义是什么?
  5. 假设检验的步骤

介绍

如果您听说过术语零假设p 值、α,但并不真正知道它们的含义或它们之间的关系,那么您来对地方了!如果你从未听说过这些术语,我强烈建议你通读这篇文章,因为这是一个需要理解的重要话题。

我先举一个简单的例子:

想象你和你的朋友玩一个游戏。如果硬币正面朝上,你赢 5 美元,如果硬币反面朝上,他赢 5 美元。

作者创建的图像

假设前两次抛硬币都是正面朝上,意味着你的朋友赢了 10 美元。你应该担心他用的是作弊的硬币吗?嗯,硬币连续两次正面朝上的概率是 25%(见上图),这不是不可能的。

作者创建的图像

如果硬币连续六次落在反面会怎样?发生这种情况的概率约为 1.56%(见上文),这是极不可能的。在这一点上,假设硬币被操纵是公平的。通常,人们会设置一个阈值,通常是 5%,来确定一个事件是否是偶然发生的(如果你以前学过这个,这就是所谓的 alpha!)

术语

为了理解假设检验,你必须理解一些术语:

  • 零假设:样本观察值纯粹是随机产生的假设。无效假设倾向于说明没有变化。
  • 备选假设:样本观测值受某种非随机原因影响的假设。
  • P 值:假设零假设正确,获得某个检验的观测结果的概率;较小的 p 值意味着有更强的证据支持替代假设。
  • α:显著性水平;当零假设为真时拒绝零假设的概率—也称为1 类错误。

我将再次使用硬币的例子,以便您能更好地理解这些术语:

  • 在我们的例子中,零假设是硬币是一个公平的硬币,观察结果纯粹是偶然的。
  • 另一种假设是,硬币是而不是公平的,因此,观察结果不是偶然发生的。
  • 连续 2 次翻转尾巴场景中的 p 值为 25%,连续 6 次为 1.56%。
  • 显著性的α水平将为 5%。

拒绝还是不拒绝?

确定是否拒绝空值的主要规则很简单,PGADRN

如果P-值大于 A lpha,则 D o not R 弹出 N ull。

在连续翻转两次尾部的情况下,我们不会拒绝空值,因为 25% > 5%。然而,在连续翻转 6 次尾部的情况下,我们会拒绝 1.56%以来的零假设< 5%.

What is the point of Significance Testing?

So now that you understand the use of hypothesis testing through the coin toss example, know the relevant terminology, and know the main rule to determine whether to reject the null or not, let's dive into significance testing.

What is the point of significance testing? It’s used to determine how likely or unlikely a hypothesis is for a given sample of data. The last part of the statement, ‘for a given sample of data’ is key because more often than not, you won’t be able to get an infinite amount of data or data that represents the entire population.

Steps for Hypothesis Testing

Here are the steps to performing a hypothesis test:

  1. State your null and alternative hypotheses. 重申一下,零假设通常表明一切都是正常的——没有任何变化。
  2. 设置你的重要性等级,阿尔法值。这通常设置为 5%,但也可以根据情况和犯 1 型和/或 2 型错误的严重程度设置为其他水平。
  3. 收集样本数据并计算样本统计数据。
  4. 计算给定样本统计的 p 值。一旦得到样本统计数据,就可以通过不同的方法确定 p 值。最常用的方法是正态分布的 T 得分和 Z 得分。在这里 了解更多关于 T 分和 Z 分的
  5. 拒绝或不拒绝零假设。

感谢阅读!

如果你喜欢我的工作,想支持我…

  1. 支持我的最好方式就是在媒体这里关注我。
  2. 成为第一批在TwitterT2 上关注我的人之一。我会在这里发布很多更新和有趣的东西!
  3. 此外,成为第一批订阅我的新 YouTube 频道 这里!
  4. LinkedIn 上关注我这里。
  5. 在我的邮箱列表 这里报名。
  6. 看看我的网站,terenceshin.com

假设检验分三步进行

原文:https://towardsdatascience.com/hypothesis-testing-in-3-steps-c23789e92a09?source=collection_archive---------32-----------------------

图片来自 Pixabay

p 值,零假设,真实世界的例子等等

统计有助于分析大多数数据集合。假设检验也是如此,即使没有科学理论存在,它也能证明结论是正确的。

在这篇文章中,我们将了解假设检验如何帮助我们分析数据、涉及的各种术语以及检验过程。此外,考虑一个现实世界的场景来执行假设检验。

文章的流程如下,

  1. 假设检验和各种术语
  2. 假设检验过程
  3. 真实世界场景

让我们开始吧!

假设检验:

假设检验是一种通过矛盾的证明。假设我们要证明一个陈述,比如说,X 为真,我们从假设 X 不为真开始。我们试图证明这一点。

这个“X 不为真”被称为零假设(Ho) 。而“X 是真的”被称为(H1 的)。X 称为检验统计量(T)。用于理解接受或拒绝检验统计的区域的界定值称为临界值(显著性水平)

与想要证明的理论相矛盾的假设叫做零假设。与想要证明的理论相关的假设(通常是复合的)是另一种假设。

p-值概率值是检验统计量实际观察结果的概率,假设零假设是正确的。

小概率值意味着在零假设下观察值不太可能。这反过来意味着我们需要拒绝零假设。

假设检验过程:

从更广的角度来看,假设检验是通过这三个步骤实现的,

  1. 状态零假设和替代假设
  2. 决定测试统计和临界值
  3. 计算 p 值。如果 p 值小于临界值,拒绝零假设(意味着接受替代假设)。否则,接受零假设。

考虑到这一点,让我们详细了解每个步骤是如何执行的。

第一步:

  • 在任何测试环境中,清楚地理解实验是第一步也是最重要的一步。
  • 第一步是陈述相关的无效备选假设。这一点很重要,因为错误的假设将会使整个过程变得混乱。

第二步:

  • 决定哪种测试是合适的,并说明相关的测试统计量 T。
  • 从假设中推导出零假设下检验统计量的分布。
  • 选择一个临界值( α ),一个概率阈值,低于该阈值的无效假设将被拒绝。常见的数值是 5%和 1%。

第三步:

  • 计算 p 值
  • 决定拒绝无效假设(支持替代方案)或不拒绝它。

现实世界问题的假设检验过程:

考虑两个数据集,包括两个国家的人口高度,比如 C2 的 C1。问题陈述是为了理解这两个数据集(或分布)是否具有相同的均值(均值是所有数据点的平均值)。该信息可以进一步用于各种原因,如衣服或任何家具的销售。

第一步:

问题陈述是为了理解两个数据集均值之间的差异。所以零假设和替代假设如下,

  • 零假设:这两个国家的平均值没有差异
  • 替代假设:两个国家的均值有差异

第二步:

这里的测试统计非常简单。需要大量的领域知识和研究来设置最佳临界值。让我们假设,0.05 (5%)左右的临界值是可以接受的。

  • 检验统计:两个国家均值的差异。
  • 临界值: 0.05(或 5%)

第三步:

  • 为了计算 p 值,我们需要两个国家全部人口的身高。但是,要获得全部数据,我们需要大量的时间、金钱和精力,这通常是不可行的。
  • 因此,我们从每个数据集形成样本,并计算这些样本的平均值。比方说,我们计算了来自 C1 的 n 个样本的平均值,比如 a1,a2,a3,a4…an。来自 C2 的 n 个样本的平均值是 b1,b2,b3,b4…bn。
  • 现在,从这些来自每个国家的 n 样本平均值中,我们计算出均值差异的检验统计量。

计算测试统计

  • 在数学上, P 值是假设零假设为真的检验统计的概率。因此,P 值计算如下:

计算 p 值

  • 从实验的观察来看,

—如果 p 值小于或等于 0.05(临界值),则拒绝零假设。因此,得出的结论是,两国人口的平均身高存在差异。

—如果 p 值大于 0.05(临界值),则接受零假设。 因此,得出的结论是两国人口的身高均值没有差异。

谢谢你的阅读。以后我会写更多初学者友好的帖子。请在媒体上关注我,以便了解他们。我欢迎反馈,可以通过 Twitter ramya_vidiyala 和 LinkedIn RamyaVidiyala 联系。快乐学习!

假设检验:直觉

原文:https://towardsdatascience.com/hypothesis-testing-intuition-701852364717?source=collection_archive---------44-----------------------

直观地展开假设检验

通俗地说,假设检验是一种从统计学上验证我们对样本所来自的人群的假设是否正确的技术。我们如何做到这一点?我们使用样本统计的抽样分布知识(z、t 或其他)来检验我们的假设是否正确。

为了更好地理解,让我们先来看看什么是抽样分布。抽样分布是从总体中抽取样本计算出的统计值的分布。例如,样本均值的抽样分布是从总体中抽取的样本均值的分布。它遵循正态分布,均值=总体均值,标准差=总体标准差* sqrt(样本大小)/总体标准差。同样,让我们看看什么是零假设和备择假设:零假设是无差异的陈述,它通常是等式陈述,而备择假设是零假设的补充,它通常是不等于,小于或大于陈述。

假设检验背后的想法是什么?我们在假设检验中所说的是,考虑到所选样本来自我们假设的总体,那么,来自我们样本的统计值应该位于抽样分布的某些边界内。这种抽样分布对我们来说是已知的,并且是利用我们假设样本所属的总体的某些已知事实计算出来的。决策界限是基于由进行测试的人决定的显著性水平而建立的。在双尾检验的情况下,10%的显著性水平意味着我们将在曲线的两侧找到点,每个点在曲线下分离出 5%的区域。位于这两个点内的曲线区域是接受区域,位于这两个点外的区域是拒绝区域。下图显示了当抽样分布为正态时,双尾检验中 10%显著性水平的可接受区域。

作者图片

我们在尾部的两侧有一个 5%的区域,这是拒绝区域。只有当样本统计量位于这些尾值之间,或者换句话说,当零假设为真时,获得样本值的概率小于显著性水平,零假设才会被拒绝。也就是说,我们没有足够的信心说样本属于我们假设的总体。

作者图片

下面是一个直观的例子。萨姆最喜欢的颜色是红色吗?我们的无效假设是最喜欢的颜色是红色。另一个假设是最喜欢的颜色不是红色。假设,在我的经验中,喜欢红色的人一般有超过 2/5 的东西是红色的,也就是说,如果我们发现超过 2/5 的东西是红色的,我会接受萨姆喜欢红色的零假设,否则我们会拒绝。这是决策边界。现在,为了判断他是否喜欢红色,我们随机挑选了 5 样东西(样本)并检查它们是否是红色的。假设我们发现 5 样东西中有 2 样是红色的,那么我们有足够的证据说他喜欢红色吗?不,我们没有。所以,我们拒绝零假设,说我们没有足够的证据支持萨姆喜欢红色,或者我们可能想说也许萨姆不喜欢红色。但是,如果 3/5 的东西是红色的,那么我们就有一些他喜欢红色的证据,所以我们接受零假设,声称山姆喜欢红色。

假设检验——了解根源

原文:https://towardsdatascience.com/hypothesis-testing-learning-the-roots-93a150e07f2?source=collection_archive---------33-----------------------

莎伦·麦卡琴在 Unsplash 上的照片

本文将尝试:

  • 涵盖假设检验的基础知识。
  • 解释它对中心极限定理的依赖

你应该已经知道的:

  • 概率论基础
  • 中心极限定理(CLT)
  • 高斯分布

如果你是统计学或商业研究、数据分析或商业分析的学生,你可能听说过很多关于这个术语“假设检验”。有可能你已经在应用它了,但对周围发生的事情还没有一个清晰的认识。你困惑于零假设是如何定义的,什么是零假设,它是如何以及何时被拒绝的,或者它的拒绝意味着什么,等等。如果你有以上任何一个疑问,并且直到现在还不能消除它们,那么你就来对地方了。这篇文章将试图消除围绕假设检验的疑云。

在谈任何技术问题之前,让我们先从一个简单的问题开始,以引起人们的好奇心。有人给了你一个装有成千上万颗糖果的大糖果罐,有人声称平均每颗糖果重 10 克。你必须证实这一说法。一种方法是称一下罐子里的所有东西,数一下里面有多少颗糖果,然后算出平均值。但是这种方法对你来说似乎有点不可行和不切实际,因为数成千上万的糖果会花费你几天的时间。你现在想出了另一个主意。你从里面拿出 100 颗糖果,称它们的重量,计算它们的平均值。一百颗糖果的平均重量却只有 8 克。现在摆在你面前的问题是,是接受还是拒绝他的要求。但是在你做出任何结论之前,请记住,他说的是整个糖果罐,而你刚刚证实了只有 100 颗糖果的说法。

要回答这些问题,有一种叫做假设检验的统计技术可以帮你。这个想法是这样的:

让我们假设罐子实际上装满了平均重量为 10 克的糖果,为了便于理解,让我们进一步假设您从罐子中取出了 1000 个这样的样品,每个样品有 100 颗糖果,正如您在第一个地方取出的一样,您得到的结果如下表所示:

上表显示,在 1000 个样品中,80 个样品的平均重量为 7 克,120 个样品的平均重量为 8 克,300 个样品的平均重量为 9 克,依此类推。我们只是根据共同的平均重量将样品分组。

现在,假设您的特定样本的平均重量为 8 克,您可以说,从随机选择的数千个样本中,只有 120 个样本是可能的。换句话说,你的样本的概率是 120/1000,即 12%。现在,如果 12%对你来说是一个很大的数字,可以说这个罐子的平均重量是 10 克。请注意,这是因为最初假设这个罐子实际上和那个人声称的一样,我们得到的平均重量分布表实际上来自这个罐子。

到目前为止,你可能已经对我们的发展方向有了一点了解。上述假设为这个话题扫清了一点阴霾,但仍有许多问题需要回答,如:

  • 为什么只有 1000 个样本,从罐子里可能有无限个大小为 100 的随机样本。
  • 罐子平均重量为 10 克的假设和样品表是如何连接的?

我将尝试连接这些点,但在此之前,是时候了解中心极限定理。为了清楚地理解这篇文章,你应该知道这个定理,但是让我们也稍微讨论一下这个定理。

中心极限定理(CLT)

中心极限定理描述了总体的抽样分布,其正式定义如下:

I 如果你有一个均值为 μ 且标准差为 σ 的总体,并且你从该总体中抽取足够大的随机样本,那么样本均值的分布将近似为正态分布。不管源总体是否正常,这都是真实的。

此外,该特定抽样分布的平均值将等于总体的平均值,抽样分布的方差将等于总体的方差除以样本大小。这进一步表明,样本量越大,这种抽样分布就越趋向于常态。

我将试着把上面的陈述放到当前的场景中,使其易于理解。例如,从糖果罐中,如果你开始随机抽样大小为 100。每次你抽取一个样品,计算它的平均重量,然后把糖果放回去,再拿出一个样品,重复这个过程。您将获得所有可能的平均权重值,当根据常见的平均权重将它们分组时,您将获得类似于上图所示的表格。不过会有一点变化,你得到的数字不一定是整数,也可以是小数,比如 8.3 克。将所有的十进制数字分组是不可行的,因此平均重量的频率将根据班级间隔来确定。

例如,上表可以表示为:

这个频率表告诉我们,有 80 个样品的平均重量在 7 克到 8 克之间,120 个样品的平均重量在 8 克到 9 克之间,以此类推。平均体重等级将有发生的频率或次数。为了绘制分布图,频率值将被转换成相对频率或概率值。如果你把所有的相对频率加在一起,你会得到值 1。

如果将类间隔设置得非常小,并进行无限次采样,则中心极限定理表明平均权重类与概率值的关系如下所示:

以上剧情亮点:

  • 剧情性质很正常。
  • 该地块的平均值为 10 克。
  • 该图的方差将是总体方差/100(样本量=100)。

重复采样后得到的这种分布图称为采样分布

所以现在,CLT 给了我们工具来检查糖果罐中所有可能的无限随机样本,而不仅仅是 1000 个。

回到测试

现在让我们回忆一下最初的问题,我们从 100 颗糖果中抽取一个样本,得到平均重量为 8 克。由于原始索赔的平均重量超过 8 克,我们将计算从总平均重量为 10 克的罐子中抽取随机样本时,获得平均重量为 8 克或更少的概率。如果概率足够高,我们可以得出结论,假设是正确的,或者换句话说,平均重量为 10 克的说法不能无效。如果概率值太小,这意味着从平均体重为 10 克的人群中获得该样本的机会太低&因为我们仍然获得了该样本,所以关于人群平均体重为 10 克的说法是值得怀疑的。到目前为止,通过抽样分布验证样本的概念必须是清楚的。我们现在将进行数学的东西和假设公式。

假设检验

回想之前的假设。糖果罐中糖果的平均重量是 10 克,根据 CLT,罐子的抽样分布将是正态的,其峰值在 10 克,如下所示(我知道我一直在重复这一点:p)。如您所知,对于正态概率分布,如果我们必须计算两点之间的概率,它由这两点之间的曲线下面积给出,如下图所示(概率在 8 和 10 之间):

如果我们想要解析地计算概率值,我们必须使用高斯方程:

应用于当前上下文,我们需要找到平均重量小于或等于 8 克的概率,这将由下式给出:

让我们检查一下上述方程中的各种参数

𝜇 =抽样分布的平均值

=人口的平均值

= 10 克

𝜎 =抽样分布的标准偏差

=总体的标准偏差/√n

=总体的标准偏差/√100

将正常变为标准正常

你可能知道,我们可以通过设置 x-均值/标准差= Z,将任何正态分布积分转换为标准正态积分

(z 将是标准正规方程中的新变量)

你可以在这里阅读更多关于正态分布和标准正态分布

标准正态分布是均值为 0,标准差为 1 的分布。

在上面的例子中,𝜇等于人口平均值,标准差等于𝜎/√n,所以我们有:

上述数量被称为 Z 统计量(Zee 统计量),并与假设检验直接相关。

从平均值和标准差计算 Z-statistic 的优点是,我们可以轻松地使用已经公式化的 Z 表来计算概率值。比如这里可用的。

此外,在大多数情况下,如目前的情况,我们不知道总体的标准偏差,在这种情况下,我们计算样本的标准偏差,并将其视为总体标准偏差。

假设检验的步骤

  • 假设关于人口数据的声明是真实的(零假设)。
  • 取一个样本,计算平均值和标准偏差。
  • 使用以下公式计算 Z-统计量
  • 使用 Z 统计从 Z 表中计算概率值(称为 p 值)
  • 基于 p 值拒绝或不拒绝零假设

关于 p 值

你可能会问这样一个问题,什么是概率值,低于这个值我们拒绝零假设。答案是:这取决于具体情况,完全取决于检验假设的人。被认为是阈值的概率值称为显著性水平。在大多数情况下,通常认为显著性水平为 5%。

结案

回到糖果罐。我们目前所知的是

样本平均值= 8 克

群体平均值= 10 克

总体标准偏差(让我们假设它的某个值,在实际场景中,你可以从你得到的样本中计算出来)= 2 克

样本量(n) = 100

显著性水平= 5%(让我们定在 5%)

上面的 Z 统计现在可用于计算 p 值(概率),以确定我们的样本有多重要。这里我们将使用可用的 Z 轴工作台。如果您查找 Z 表,您会发现 p 值非常低(远低于我们的显著性水平)。因此,我们可以安全地拒绝糖果罐平均重量为 10 克的无效假设。

延伸阅读

如果你觉得上面的概念很有趣,你可以进一步阅读下面的主题来了解更多关于这个统计学领域的知识。

  • 置信区间
  • t 统计量

感谢你阅读这篇文章

过得愉快😊

这篇文章也发表在这里

分享

假设检验和 p 值

原文:https://towardsdatascience.com/hypothesis-testing-p-value-13b55f4b32d9?source=collection_archive---------11-----------------------

图片来源:【luminousmen.comT2【clipartart.com】T4

最近,我在工作中采用了一种新的方法。我做了一些实验,分析了结果,并用一些统计计算证明,新的方法比现有的方法更好…

是的。!我做了假设测试!!!

我相信保持事情简单,这是理解假设检验的简化方法…

假设检验…

作为人类,我们总是对几乎所有的事情都有疑问。它可以是关于买一栋房子,一辆汽车或者仅仅是吃一个冰淇淋。我们总是认为,巧克力冰淇淋是否比香草好,或者一辆跑车是否比一辆简单的小货车好。同样,企业和研究人员也有一些问题,如新方法是否更好,新产品是否会比现有产品产生更多的收入等等…

为了能够回答这样的问题,我们需要将它们转化为所谓的假设。然后我们需要通过实验、调查和过程来收集数据。在执行一些统计测试之后,最终,我们可以回答所提出的问题。

假设检验是一种统计方法,仅在样本数据的帮助下,用于对整个群体进行决策。为了做出这个决定,我们想出了一个叫做 p 值的值…

假设检验帮助企业和研究人员做出更好的基于数据的决策。

让我们一步一步来...

在这整篇文章中,让我们考虑一个例子,它使事情变得容易理解。

有一家 ABC 公司,想知道欢迎网页的新设计是否会导致更多的网站订阅。因此,让我们考虑下面的符号。

N_new =收到新设计的欢迎网页后,网站的平均订阅用户数

N_old =收到旧设计的欢迎网页后,网站的平均订阅用户数

假设检验用于了解总体参数,如均值和标准差。

第一步:将问题转化为假设

假设是一个论点,作为研究的基础…

要回答的问题转化为 2 个竞争非重叠假设。我们必须做出以下两种类型的假设。

图片来源:luminousmen.com

  • 【h₀】零假设

甚至在我们收集任何数据之前,这就是我们认为正确的论点

在这个论证中,我们要检验的两组被认为是相等的或者它们之间没有差别。例如,巧克力冰淇淋和香草冰淇淋一样美味,或者一种新方法给出的结果和现有方法一样差或一样。

因此,该参数通常包含数学运算符,如=、≤或≥。

在我们的例子中,H₀ : N_newN_old

  • 【h₁】替代假设

这就是我们想要证明为真的论点。例如,巧克力冰淇淋比香草冰淇淋味道更好,或者新方法产生的结果比现有方法更好。

因此,该参数通常包含数学运算符,如≦< or >。

在我们的例子中,H₁ : N_new > N_old

第二步:确定显著性水平

显著性水平是当原假设实际为真时,拒绝原假设的概率 。它用α表示。这是在进行实验之前确定的。

在许多统计分析中,我们观察到这样的东西——“具有 95%置信区间的”。这个陈述实际上告诉了我们显著性水平,

Confidence Interval = 1 — Significance Level

所以,这里“95%置信区间”告诉我们显著性水平是 0.05。这意味着在被比较的组中有 5%的概率存在差异,而实际上没有差异,即 5%是拒绝零假设的概率。

在我们的例子中,有 5%的概率是N_new > N_old,而实际上N_newN_old

因此,显著性水平用于确定是否应该拒绝或保留零假设。为了拒绝零假设,观察到的数据效应必须是显著的。而当观察到的效应显著时,仅仅意味着我们有信心它是真实的,不是偶然获得的。

通常,医学领域的显著性水平为 1%,研究和商业领域的显著性水平为 5%。

第三步:计算 p 值

p 值是观察零假设结果的概率 。显著性水平是目标值,如果我们想保留零假设,就应该达到这个目标值。

图片来源:luminousmen.com

因此,只要 p 值小于显著性水平,我们就必须拒绝零假设。较低的 p 值意味着,总体或整个数据具有反对零假设的有力证据。

p 值是根据样本数据计算的。它评估样本数据支持零假设的程度。因此,较高的 p 值表明采样数据确实支持零假设。换句话说,在抽样数据中没有足够的证据来拒绝零假设。

然而,研究人员总是寻找低于显著性水平的 p 值。p — value ≤ Significance Level,意味着采样数据提供了足够的证据来拒绝零假设。换句话说,我们想要证明为真的另一种假设赢得了这场战斗。数据中观察到的效应在统计学上是显著的。

在推断统计学中,p 值有助于确定观察到的效应相对于零假设的显著性。它给研究者支持或拒绝零假设的信心。

图片来源:索尔·麦克劳德

从图形上看,具有统计显著性的观测效应的 p 值位于上述概率分布中的阴影区域。“极不可能观察值的区域表示不支持零假设的观察结果。换句话说,当零假设H₀为真时,p 值是获得有利于替代假设H₁的观察统计的概率。

关于 p 值实际计算的更多说明可在这里找到。

第四步:做决定

既然我们已经掌握了拼图的所有部分,现在是做决定的时候了。

布鲁诺·沃尔夫在 Unsplash 上拍摄的照片

为了确定保留哪个假设,将 p 值与显著性水平进行比较。

If p - value **≤** significance level, we reject the null hypothesisIf p - value **>** significance level, we fail to reject the null hypothesis

拒绝零假设意味着我们接受另一个假设。

当我们观察采样数据时,我们可能会在决定保留或拒绝零假设时出错。这些错误的决定被转化为叫做的错误。我们不会在这里详细讨论这些错误,但这是两种错误的概述。

  • I 型错误:

当拒绝零假设的决策出错时,就会出现这种错误。在这个错误中,当零假设H₀为真时,选择替代假设H₁。这也叫假阳性

第一类误差通常用αα表示,即显著性水平。alpha α是我们愿意犯的第一类错误的百分比阈值。

  • 第二类错误:

当保留原假设的决策出错时,就会出现这种错误。在这个错误中,当替代假设H₁为真时,选择了零假设H₀。这个错误也被称为假阴性

然而,这些错误总是存在于统计测试中,在解释结果时必须牢记在心。

感谢阅读!!

我希望,我用更简单的术语介绍了假设检验。如果你喜欢我的文章,给这篇文章一些掌声会让我有动力写更多。你可以在脸书、LinkedIn 和其他社交专业网络平台上自由分享这些信息,这样有需要的人就可以得到帮助。

我随时欢迎你的建议和问题。你可以在 LinkedIn 、 Twitter 和 GitHub 上和我联系。

假设检验折扣的提高

原文:https://towardsdatascience.com/hypothesis-testing-the-discount-bump-4b8b6b4c4fec?source=collection_archive---------17-----------------------

你的折扣策略是推动销售,还是只是让你花钱?

我打赌你知道这种感觉:一件你需要的东西正在打折,所以你高兴地把它放进你的购物车,然后开始想,“用我刚刚攒下的钱,我还能买什么?”几下点击(或在商店里转几圈),你的购物车里就有了比你想要的更多的东西。

这是一个如此普遍的现象,以至于一些零售商公开利用它。亚马逊有那些“附加”商品,如果你将它们添加到一定规模的订单中,这些商品会更便宜(或者只有现货)。我很肯定我听说过 Target 广告,这些广告开玩笑地描述了这样一种体验:去商店买一些必需品,然后带着一车你并不需要但却想要的东西离开,一旦你看到你得到了多么划算的东西。

在我的数据科学训练营的一个项目中,我被要求使用一个包含产品和销售数据的数据库来形成和测试一些假设,这些数据来自一个虚构但现实的精细食品经销商。这是 Northwind 数据库,微软创建了它作为学习如何使用他们的一些数据库产品的样本。虽然这些数据并不真的真实,但它是真实的,所以大多数时候它的表现就像你所期望的真实销售数据一样。它也非常非常干净,这在数据科学中是不寻常的。

在这篇文章中,我将带你通过一个假设检验,使用韦尔奇的 t 检验来确定顾客在得到折扣后是否会花更多的钱(剧透:他们会的!),如果是,他们又多花了多少钱。

如果“打折促销”是一个广为人知的现象,你可能会问,为什么我还要测试它存在的假设呢?嗯,如果你是一家企业,而你的折扣没有让人们花更多的钱,难道你不想知道吗?如果你的顾客真的利用折扣作为省钱的机会,而不是花同样多的钱购买更多的产品,那会怎样?在我的项目中,我定义了一个商业案例,在这个案例中,Northwind 公司的整个折扣策略正在接受检查;高管们想知道什么在起作用,效果如何,这样他们就可以在必要时做出改变。

假设来说

在继续之前,我想明确地陈述我的假设。

我的无效假设是,没有打折商品的订单的平均总金额等于至少有一个商品打折的订单的平均总金额。

我的另一个假设是,没有折扣商品的订单的平均总金额小于至少有一个商品折扣的订单的平均总金额

因为我试图确定一个分布的均值是否大于另一个分布的均值,所以这将是一个单尾测试。

现在让我们准备好数据。

推购物车

在我从 Northwind 数据库收集的数据中,每个观察都代表客户订单中的一个独特产品。我的表中的每一行都包括订单的标识符、产品的标识符、产品的数量和单价、应用的折扣百分比(如果有的话)、产品的名称、类别(例如,“饮料”)以及代表类别的数字。我添加了一个 boolean 列来记录是否有折扣(以便于以后排序),并添加了一个计算产品单价乘以数量再乘以折扣(如果有)的列来获得订单中该产品的总价。看一看:

来自 Northwind 数据库的数据

对于我的分析,我需要按订单编号对观察结果进行分组,然后将订单分为两组:有一个或多个折扣项目的订单,以及没有折扣项目的订单。

# Assume my data is stored in a DataFrame called `df`

# Get list of orders where no items are discounted
group_by_discount_bool = pd.DataFrame(df.groupby('OrderId')['Discount_bool'].sum())
ids_no_disc = group_by_discount_bool[group_by_discount_bool.Discount_bool == 0]
ids_no_disc = list(ids_no_disc.index)

# Get list of orders with at least one discounted item
ids_with_disc = group_by_discount_bool[group_by_discount_bool.Discount_bool > 0]
ids_with_disc = list(ids_with_disc.index)

# Subset products by whether they occur in orders with discounts or not
orders_discount = df[df.OrderId.isin(ids_with_disc)]
orders_no_discount = df[df.OrderId.isin(ids_no_disc)]

# Group by order; these orders contain ONE OR MORE discounted items
orders_discount = orders_discount.groupby('OrderId')['ProductTotal'].sum()

# Group by order; these orders contain NO discounted items
orders_no_discount = orders_no_discount.groupby('OrderId')['ProductTotal'].sum()

这留给我两个一维数组( orders_discountorders_no_discount ),分别包含有折扣和没有折扣的订单的总美元值。我的假设检验的目的是确定这两个数组的均值是否显著不同。

但在此之前,我们先来看看分布本身。

扭曲的观点

核密度估计图。y 轴值是概率密度值。

啊哦。

这是一些强大的积极倾斜!看起来大多数订单总额低于 5000 美元,但一些大订单给了两种分布长的右尾。我担心这些巨额订单可能并不能代表大多数客户的行为。

让我们更详细地检查一下这些分布,看看发生了什么。

有折扣和无折扣订单的箱线图和核密度估计图。

核密度估计图(右栏)告诉我,这两种分布确实有很长的右尾。盒须图(左栏)让我们更容易看到这些极值落在哪里。我想剔除这些大订单,这样我就可以把我的分析重点放在绝大多数顾客的购买行为上。

为了修整分布,我将删除超出右须的值,右须代表每个分布的四分位数范围(第 25 和第 75 个百分点之间的距离)的 1.5 倍。在这些分布的情况下,这种调整相当于可用值的 7–8%。这是我愿意做出的牺牲。

# Calculate the cutoff point (1.5*IQR + 75th percentile) for non-discounted
iqr = stats.iqr(orders_no_discount)
upper_quartile = np.percentile(orders_no_discount, 75)
cutoff = 1.5 * iqr + upper_quartile

# Remove outliers from non-discounted sample
orders_no_disc_trimmed = orders_no_discount[orders_no_discount <= cutoff]

# Calculate the cutoff point (1.5*IQR + 75th percentile) for discounted
iqr = stats.iqr(orders_discount)
upper_quartile = np.percentile(orders_discount, 75)
cutoff = 1.5 * iqr + upper_quartile

# Remove outliers from non-discounted sample
orders_disc_trimmed = orders_discount[orders_discount <= cutoff]

修剪分布的箱线图和核密度估计图

那更好。现在离群值少得多(也不那么极端),虽然分布仍然是正偏的,但它们比以前看起来更正常。

快速 Levene 检验表明这两个样本的方差在统计上没有差异。这对于我以后想要计算统计检验的能力来说是个好消息,但是 Welch 的 t 检验也可以。

测试一下

不幸的是,没有一个方便的 Python 包来执行 Welch 的 t-test,所以我编写了自己的包,并将其包装在另一个包中,该包将 t-statistics 与我选择的 alpha 值进行比较,并让我知道我是否可以拒绝(或无法拒绝)零假设。

这就是它的作用:

这产生了 p 值 0.00000355,远低于我选择的 alpha 值 0.05。我拒绝无效假设!假设没有潜在的变量在起作用,我可以自信地认为有折扣和没有折扣的订单的平均总金额之间存在统计上的显著差异。

那个肿块有多大?

现在我们知道,包含打折商品的订单往往比没有打折商品的订单要大,但是它们有多大的不同呢?为了找到答案,让我们看看效果大小,或者有折扣的平均订单和没有折扣的平均订单之间的差异。

我给自己写了一些函数来计算一个原始效果大小,用它来计算一个标准化的效果大小(科恩的 d ) ,然后把它传递给一个能量分析。请注意,我针对 Cohen 的 d 的函数考虑了两个样本可能具有不同长度和方差的可能性,并且我的功效分析将两个样本的平均长度作为观察次数(“nobs1”)。代码如下:

# Define a function to calculate Cohen's d
def cohen_d(sample_a, sample_b):
    """Calculate's Cohen's d for two 1-D arrays"""

    diff = abs(np.mean(sample_a) - np.mean(sample_b))
    n1 = len(sample_a) 
    n2 = len(sample_b)
    var1 = np.var(sample_a)
    var2 = np.var(sample_b)
    pooled_var = (n1 * var1 + n2 * var2) / (n1 + n2)

    d = diff / np.sqrt(pooled_var)
    return d

# Define a function to calculate effect size and power of a statistical test
def size_and_power(sample_a, sample_b, alpha=0.05):
    """Prints raw effect size and power of a statistical test, 
       using Cohen's d (calculated with Satterthwaite 
       approximation)
       Dependencies: Numpy, scipy.stats.TTestIndPower"""

    effect = abs(np.mean(sample_a) - np.mean(sample_b))
    print('Raw effect size:', effect)

    d = cohen_d(sample_a, sample_b)
    power_analysis = TTestIndPower()

    sample_length = (len(sample_a) + len(sample_b)) / 2
    power = power_analysis.solve_power(effect_size=d, 
                                       alpha=alpha,       
                                       nobs1=sample_length)

    print('Power:', power)

这就是它的作用:

286.68 的原始效应大小意味着有折扣的平均订单总数和无折扣的平均订单总数之间的差异是 286.68 美元。0.995 的幂意味着我只有 0.05%的机会犯第二类错误(也就是假阴性)。我希望幂至少为 0.8,所以我对这个结果很满意。很有可能是我正确的检测到了一个真实存在的现象——woohoo!

TL;大卫:如果你给他们打折,他们会花更多的钱。

如果我们想知道 286.68 美元是否是一个很大的差异,我们可以对这两个样本运行我的 cohen_d() 函数,得到的值是 0.33。在科恩的 d 值的世界里,我们通常会说 0.2 是小影响,0.5 是中等影响,0.8 及以上是大影响,但这都是相对的。如果我们每年都进行这个测试,并且总是得到大约 0.2 的科恩的 d 值,那么有一年得到 0.33,我们可能会认为这在我们的特定环境中是一个很大的影响。

你可以在我的 GitHub repo 中查看我在 Northwind 数据库上的其余项目。因为我发现它既有用又漂亮,这里的是一个非常好的可视化工具,可以帮助你理解样本大小、效果大小、alpha 和功效是如何联系起来的。

跨贴自jrkreiger.net

假设检验:分布不重要(!)

原文:https://towardsdatascience.com/hypothesis-testing-the-distribution-doesnt-matter-79882ba62f54?source=collection_archive---------39-----------------------

进行 t 检验,扔掉 t。剩下的也一样整洁。

1.索赔

我在网上读到过(所以这肯定是真的)优秀作家与众不同的地方在于,他们甚至在开始写作之前就知道自己的故事将如何结束。知道结局提供了方向、清晰和目标,因为他们知道他们的目标是什么。所以,我会给你这个故事的结局,妙语就在这里(此后称为“索赔”)——进行两个样本的 t 检验(或任何假设检验);现在扔掉 t 分布(零假设的分布——我们将讨论它是什么),用世界上任何其他分布代替它。新的分布可能是高斯分布,也可能是某种奇怪的多模态形状,这无关紧要。现在,如果您对任何数据使用这种“修改”的假设检验,您最终会得到与原始检验相同的性能(错误率)。从表面上看,这就像打开一辆法拉利,拆掉它的引擎,换上其他车的引擎。这辆“改装”法拉利的性能依然如故,就好像我们没有改变任何东西一样!?怎么会?

1.1 背景

好的,在这次旅程中,你需要基本的假设检验。如果你感到生疏,请点击此处。虽然这种说法适用于任何假设检验(我们将会证明),但我们将使用双样本 t 检验作为模板来比较均值,因为它是更广为人知的假设检验之一。

什么是假设检验?让我们举一个两样本 t 检验的具体例子。假设我们有一个生产给定尺寸坚果的生产流程。当然,没有一个过程是完美的,因此,生产的坚果在大小上有一些小的差异。昨天引入了一种新的自动化流程,使这一流程更加高效。我们担心这可能会改变坚果大小的分布,这是不可接受的。双样本 t 检验为我们提供了一种比较新旧流程平均规模的方法。如果新流程的平均规模有显著差异,这将是一个问题。我们所需要的是得到一些用旧工艺生产的坚果和一些用新工艺生产的坚果,并将与它们的大小相关的数据输入假设检验。

假设检验就像一个守望者,密切关注我们制造过程的质量,并在它被破坏时提醒我们。这就引出了一个问题——谁来监视守夜人?就像制造过程不是完美的一样,我们用来判断方法是否不同的假设检验也不是完美的。它可能会出错。它会犯两种错误。它可能会忽略方法上的真正差异,说实际上没有差异,或者它可能会发出错误的警报,说实际上没有差异,但实际上有差异。第一种错误被称为假阴性(我们将其标记为 b),第二种错误被称为假阳性(我们将其标记为 a)。这两种错误之间总是有一个权衡。例如,从不说有差异(测试从不返回阳性,所以没有假阳性)来获得完美的(零)假阳性率是微不足道的。但是,这种策略会导致 100%的假阴性率。类似地,可以得到零假阴性率,但是会导致 100%的假阳性率。有用的测试通常介于这两个极端之间。测试预测阳性越积极,假阳性率越高,假阴性率也越低(真正的差异不太可能被遗漏)。假阳性率和假阴性率之间的这种权衡可以在任何测试中绘制出来(见下面的图 1)。如果 test-1 的曲线低于 test-2 的曲线,我们可以说 test-1 产生的错误更少,比 test-2 更好(也称为“更强大”)。现在,让我们用双样本 t 检验来比较平均值。给了我们一个误差率的图表。如果我们用另一个任意分布来代替测试中的 t 分布,那么图表肯定会变得更糟吗?让我们看看会发生什么。

1.2 测量误差

要了解我们的测试表现如何,我们不必等待来自人造坚果的真实世界数据。只有两种可能;要么新过程导致均值改变(零假设),要么不改变(替代假设)。假设我们要做一个实验,用旧的生产工艺生产 30 个坚果,用新的生产工艺生产 30 个,并将数据传递到我们的测试中。嗯,我们可以首先假设新流程没有改变平均大小,并模拟 30 个对应于旧流程的大小和 30 个来自相同分布的新流程的大小(例如,平均大小设置为适当值和一些附加方差的正态分布)。我们知道在这种情况下各组之间没有区别,因为我们是这样模拟数据的。如果测试开始,并说它发现了均值的差异,我们知道这是一个假阳性。类似地,我们从旧流程中生成 30 个尺寸,然后从新流程中生成 30 个尺寸,这一次为新流程设置一个不同的(比如稍微高一点)值。然后,我们也将这些数据点传递给测试。我们现在希望我们的测试能找到不同之处。如果不符合,这就是假阴性。我们将我们的测试应用到这些有不同倾向的数据点上(“触发快乐”),并多次重复这个过程。这给了我们测试的假阳性对假阴性率的权衡。

1.3 插图

现在,我们继续进行上一节中描述的模拟,使用按原样应用的 t 检验,具有正确的分布。但是接下来,我们通过将测试中使用的 t 分布与其他任意分布交换来“修改”测试。我们可能预期这些修改对测试的有效性有不利影响(因此错误率更高,意味着假阳性对假阴性的权衡曲线应该向上移动)。

但是当我们实际绘制这些曲线时,下图是我们得到的结果:

图 1:用于比较平均值的双样本 t 检验框架中插入的各种零假设分布的假阳性率与假阴性率的权衡。

在该图中,我们首先使用 t 分布(根据测试要求,平均值为 0,标准差为 1),接下来我们将 t 分布替换为具有相同平均值和标准差的正态分布。接下来,我们用均值为 1、标准差为 2 的正态分布来代替它。最后,我们用均值为 0,标准差为 1 的柯西分布来代替它。对应于这些测试的假阳性率对假阴性率的线如图 1 所示。令人惊讶的是,它们都在彼此之上。因此,将 t 分布与其他不相关的分布交换对测试的性能没有任何影响!现在让我们来看看用来绘制这个图的代码。

2.创造情节

现在,让我们探索一下用来创建上面这个情节的代码。由于我们要进行 t 检验,并用其他分布替换 t 分布,所以“uno”步骤是从头开始实现双样本 t 检验。这是基于这里的描述。

从零开始的两个样本 t 检验。参见 gist at:https://gist . github . com/Ryu 577/6146 e88b 347 BC E5 a 66 DDA 168 BC 5 cefe 0

接下来,我们将它包装在一个函数中,该函数可以使用两个数组来代替原始的均值和方差。

将数组作为输入的双样本 t 检验的包装。我们也可以通过分布来作为零假设。参见 gist at:https://gist . github . com/Ryu 577/b 18 fcddaa 73216448 ef 72593 a 76 a2 d 15

现在,我们实现了一个函数,该函数模拟来自零假设和替代假设的数据,并在不同的显著性水平上生成假阳性和假阴性率,从而绘制出 alpha-beta 曲线。

在双样本 t-检验中交换各种分布来代替 t 的函数。参见代码:https://gist . github . com/Ryu 577/925 FB 03 bb2a 1869 a 60037 EEC 74 ddf cf 5

最后,将所有这些放在一起,使用两样本 t-检验中的零假设的不同分布绘制α-β图。

这将生成与我们在上一节中看到的图形非常相似的东西。

如果你不喜欢数学,这就是你把新的知识添加到你的收藏中,并骑向夕阳的地方。否则,留下来..

3.索赔的证据

首先,我们定义一些符号。我们将假设我们的测试是单侧的,另一个假设是第二总体在某些度量上更大(比如双样本 t-检验的均值)。

我们感兴趣的假设检验操作如下:

  1. 我们想知道一组的某些性质是否比另一组的大。
  2. 我们计算一个检验统计量(X ),如果第二组的性质确实比第一组大得多,那么这个检验统计量将会取大值。
  3. 我们从两组中随机收集一些样本,并根据这些样本计算这个检验统计量。
  4. 如果检验统计量如此之大,以至于看到某个事物等于或大于它的概率小于某个显著性水平α,我们拒绝零假设,并得出结论,第二组可能对所讨论的属性具有更大的值。

各种情况下测试统计量 X 的分布:

X_0:零假设下检验统计量的分布(假设我们感兴趣的度量没有差异;假设无罪——所有的审判都是从这个开始的。

Y_0:在我们测试的完美世界中,在零假设下测试统计量的分布——我们测试的所有分布假设都完全满足,独角兽跨越彩虹。

X_a:当两组之间的感兴趣度量存在差异时,交替假设下检验统计量的分布。

3.1 错误率

根据上述第四点,我们拒绝零假设的标准是(在某个显著性水平,α)😛(X≥y0)< α. But the left hand side is the probability that Y_0 will be greater than some value, which is the survival function of Y_0 (denoted S_{Y_0}). So, the probability of rejecting the null hypothesis becomes:

where in the last step, we used the fact that the survival function of any distribution is monotonically decreasing. When the null hypothesis is true, the distribution of the test statistic, X is: X ∼X_0. So the probability above becomes:

But under the null hypothesis, rejecting the null is by definition an error. So the probability above is an error rate; the rate of erroneously rejecting the null when it is true. Let’s call this false positive rate, a.

So, the significance level that leads to a false positive rate, a is given by:

Eq (1): The significance level that leads to false positive rate, a.

Similarly, under the alternate hypothesis, the distribution of the test statistic becomes: X ∼ X_a. So the probability of rejecting the null becomes:

In the case of the alternate hypothesis, we’d be making an error if we 不拒绝零假设。所以,当我们应该拒绝空值时,误差率 b 变成:

等式(2):假阴性错误率。

现在,我们希望 b 是 a 的函数(假阴性率是假阳性率的函数)。因为实际误差率的权衡才是最重要的。为了得到这个,我们可以将等式(1)代入等式(2 ),这样我们得到:

等式(3):假阴性对假阳性率的权衡。

等式(3)告诉我们,当使用假设检验时,在我们的检验的零假设中使用的分布 Y_0 与假阴性与假阳性率之间的权衡无关。这证明了我们开始写这个博客时的说法。换句话说,不管我们在双样本 t 检验中使用的 Y_0 是 t 分布,还是正态分布或柯西分布。假阴性对假阳性率的权衡(如等式(3)给出的 b 作为 a 的函数)将保持完全相同。

用人工智能创造真正的商业价值

原文:https://towardsdatascience.com/i-am-on-a-mission-to-make-data-scientists-happy-again-c10dd6b948b2?source=collection_archive---------45-----------------------

我的使命是让数据科学家(再次)开心……同时帮助公司利用人工智能产生真正的商业价值……这是 2020 年 1 月在瑞士洛桑 EPFL 举行的应用机器学习日的演讲摘要。你也可以在 YouTube 上找到这个演讲。

我是如何完成这个任务的

在 2018 年之前,我自己也是一名不快乐的数据科学家。我从事的项目没有产生真正的商业价值。在我的团队中,我们缺少做正确事情的正确技能和工具。我们不知道如何建立一个管道或生产系统。与此同时,我们所做的事情往往没有真正的商业利益。
我很沮丧,因为我更喜欢研究有影响力的话题。

我不是市场上唯一一个有这种沮丧的人,这时我意识到问题就在眼前。

在我处理这个问题的最初几个月,我认为数据科学家的项目管理将是这个问题的解决方案。端到端如何将您的数据项目投入生产。

当我和人们谈论这个话题时,我意识到这还不够。这里有一些来自该领域数据科学家的轶事…

来自数据科学家的轶事…熟悉吗?

以及那些在 AI 工作,但本身不是从业者的人的轶事…

这让我想到,数据科学家和公司其他人之间是否存在不匹配?

是否存在不匹配?

收集半结构化证据

在某一点上,我开始意识到这一切都是为了让公司准备好利用人工智能产生商业价值。

然而,仍然有一些悬而未决的问题,下面是我进一步探索的三个假设和收集的一些初步数据。

假设一

对工作不满意的数据科学家在那些更难从人工智能中创造商业价值的公司工作。

假设 2

公司没有用人工智能产生商业价值的主要原因是管理层缺乏人工智能素养。

假设三

为了从人工智能中产生真正的商业价值,需要在公司的多个层面上进行转型。

我用这些假设与人交往,我问了以下四个问题。

问题 1

作为一名数据科学家,是什么让你在工作中感到快乐?

问题 2

贵公司能够利用人工智能创造商业价值的主要原因是什么?

问题 3

你在工作中不开心的主要原因是什么?

问题 4

你能说说为什么你的公司不能用人工智能创造价值吗?

结果

快乐的数据科学家在他们的工作中有自由。他们在他们能够解决问题的项目上工作,他们在整个公司的跨学科项目上工作。这是惊喜吗?对我来说不是,前两点是数据科学家经常被指责的事情。也许将正确的问题放到数据科学家的桌面上很重要?

其他三个问题的结果

公司在人工智能方面取得成功的原因首先是对正在进行的项目有明确的商业价值,因此他们朝着一个目标努力。如果你现在问自己。这个应该清楚了吧?嗯,我见过很多项目开始,因为它们很酷或者只是很有趣。

管理支持非常重要,一方面是为了一个目标而努力,另一方面也是为项目提供合适资源所需的关注和能力。如果没有管理层的支持,将很难获得建立一个高效系统所需的资源。

由于缺少技能和资源,公司无法利用人工智能创造价值。一方面是使事情端到端工作的技能。另一方面是资源,即预算、技术以及 IT 或业务等不同利益相关方的时间。

如果没有端到端的承诺,那么在概念验证后基本上是向前推进,那么将很难获得最终用户的实际价值并产生底线影响。

一方面,人们经常提到的是同行对人工智能或机器学习的理解。人们不止一次地被要求做特别的报告或构建闪亮的可视化。与此同时,我感到沮丧的是,人们不明白“做人工智能”需要什么,而且原型明天就无法上线。这种缺乏素养实际上会导致错误的期望,而这又会导致双方的挫败感。

我们还看到,不快乐的数据科学家不快乐的原因与公司不成功的原因相同。是素养,是管理承诺,是权利资源

重新审视假设

有了这些新获得的信息。让我们重温一下假设。

假设一

对工作不满意的数据科学家在那些更难从人工智能中创造商业价值的公司工作。

一方面这是真的,但实际上有快乐的数据科学家在还没有产生商业价值的公司工作。

当我们关注是什么让公司在人工智能方面取得成功;我们同时致力于那些让数据科学家不高兴的事情。这意味着我们有一个问题要解决。

假设 2

公司没有用人工智能产生商业价值的主要原因是管理层缺乏人工智能素养。

我还不相信这是主要原因。可能当管理层具备人工智能素养时,他们将能够提供承诺,以及缺少的技能和资源。但这就够了吗?

假设三

为了从人工智能中产生真正的商业价值,需要在公司的多个层面上进行转型。

我们需要人工智能转型。

是啊!这是我确信无疑的事情。这些问题不会在一夜之间得到解决,当然雇佣一名数据科学家是不够的。我还没有找到一个人,他有时间和技能来建立在大公司内部工作的解决方案。同时提供业务真正需要的东西。

当我们谈到转型时,我们可以想到我们的运营模式。我们需要包括必要的部分来准备公司。

  • 这是关于一个的愿景和战略,在人工智能方面你想成为什么样的公司,以及你将如何实现。
  • 为此你需要什么样的技术,你会购买还是制造?这对你的数据策略和结构意味着什么?
  • 你需要什么样的,你将如何招聘培养他们?
  • 你需要实施哪些流程来确保你的项目顺利进行?
  • 变革管理。公司的其他人将如何为即将到来的事情做准备?
  • 你做的事情是否符合 T21 GDPR 的法规,你做的事情是否合乎道德?
  • 最后,围绕所有这些为治理做准备,以使其发挥作用。

我现在确信,所有这些话题都与人工智能在现实生活中的工作相关。

概括起来

让数据科学家一步步开心起来

我们可以把我们所学的放在时间轴上。我们从这位数据科学家开始,他与一家公司的领导层一起工作(1)。数据科学家很不开心,直到领导看到了曙光,变得有人工智能素养(2)。他们会采取行动,把之前提到的所有必要的东西整理好(3)。然后我们将能够成为快乐的数据科学家(4)。

如果你想从这篇文章中带走或传递一部分。就这样吧…

“希望利用人工智能造福组织的公司领导人应该在人工智能方面培养自己,并成为懂人工智能的人。这意味着不仅要了解可能的应用,还要了解如何让人工智能在他们的组织中取得成功。”

“一旦他们这样做了,他们将能够提供超越概念验证所需的承诺,并提供产生人工智能真正商业价值所需的资源和技能。”****

“最后,我们的数据科学家再次变得快乐起来。”

当然,这并不是它的终点。我会让你了解这次旅程的最新进展。更多后续!

关于我:我是一名分析顾问,也是当地一所商学院“人工智能管理”研究的主任。我的使命是让数据科学家(再次)开心,并帮助组织利用人工智能创造商业价值。 在这里报名我的简讯。

我分析了数据科学帖子的标题,以了解读者感兴趣的内容——以下是我的发现

原文:https://towardsdatascience.com/i-analyzed-towards-data-science-post-titles-to-understand-what-readers-were-interested-in-here-9e49b2a96474?source=collection_archive---------40-----------------------

钳工在 Unsplash 上拍照

作为一名作家,我总是想知道读者对什么帖子感兴趣,以及是否有办法让我了解这一点。

事实证明,我可以。

我所需要的只是相关的数据,并充分利用我的数据科学知识!

在这篇文章中,我将分享我通过分析 3000 多篇文章标题和它们相关的掌声所得到的发现。

和我的其他作品一样,比如:

[## 使用广义翻译向量来处理拼写错误和不在词汇表中(OOV)的单词…

我的实验和结果是用一种新颖的方法来处理拼写错误和 OOV 单词。希望你能找到他们…

towardsdatascience.com](/using-a-generalised-translation-vector-for-handling-misspellings-and-out-of-vocabulary-oov-words-494cd142cd31) [## 网络越深越好吗?案例研究

网络越深越好吗?为什么偏差/方差和预测结果的下游影响是什么?

towardsdatascience.com](/are-deeper-networks-better-a-case-study-6ee9bcb0725b)

这篇文章主要是关于数据驱动的,有很多代码片段和结果可以查看。

就这样,让我们开始吧!

研究问题

在这个项目中,有几个问题我想知道答案。

  1. 作家发布了什么帖子?
  2. 读者对哪些帖子感兴趣?

数据清理

照片由 Gaelle Marcel 在 Unsplash 上拍摄

有 3153 篇帖子的发布者被贴上了“走向数据科学”的标签。

数据清理过程并不太困难。

对于非文本列,我只需要过滤、删除空白行并转换日期。

对于文本专栏,我做了小写、删除标点符号、单词替换、词汇化,并将有意义的二元模型转换为一元模型。

以下是用于清洁过程的相关包。

正如您所看到的,典型的 numpy、pandas、re、nltk、spacy、gensim 和 maplotlib 肯定会被使用。

这里值得注意的是 pyLDAvis。

这个包为你的 LDA 模型输出提供了一个漂亮的仪表板。

它看起来会像这样:

pyLDAvis 输出示例

你可能注意到的下一件事是“display _ side _ by _ side(…)”定义。

这允许我在同一个单元格内输出两个数据框,从而非常容易地显示参考表。

display_side_by_side 定义示例

最后,我将显示列宽扩展到 100 个字符,以便能够看到完整的文章标题。

清理日期列

为了清理日期列,我简单地创建了一个定义,在将所有日期转换为日期时间格式之前,将年份“2020”附加到日期中。

没什么特别的。

以下是清理后的输出:

带有清除日期的数据帧的输出

清理标题列

为了清理标题,我使用了小写字母、删除标点符号、单词替换、词汇化,并将有意义的双字母词转换为单字母词。

小写、删除标点符号和替换单词

我做了两种类型的替换:

  1. 将版本号替换为“版本号”
  2. 将所有数字替换为“num_sub”

我做了这些替换,因为我想保留版本号和数字号可能带来的信息。

例如,在一些帖子的标题中,有很多标题看起来像“ 10 种做… ”或“ 5 种做… 的技巧和诀窍”。

从分析中移除这些数字将会丢失关于这些帖子标题是如何撰写的信息。我不放心删除这些数字,因此,我用“num _ subtoken”替换了它们。

至于版本号,一些帖子的标题被写成“… Tensorflow 2.0 … ”或其他类似的版本。

同样,我认为最好完整地保存这些信息,以便进行分析。

下面是替换后的输出示例。

令牌替换的示例

词汇化

我只应用了词汇化,并去掉了词干以保持标记的可读性。

对于那些不熟悉这两者的人来说,下面的例子可以清楚地说明两者的区别。

Stemming:
trouble -> troubl
troubling -> troubl
troubled -> troublLemmatization:
trouble -> trouble
troubling -> trouble
troubled -> trouble

我用 Spacy 做了引理化。

运行该程序后,示例结果将如下所示:

词汇化的例子

将有意义的二元模型转换为一元模型

在进行主题分析之前,我做的一件不寻常的事情是将有意义的二元模型放在一起。

我是在和新加坡式英语合作的时候学会这个窍门的。

我意识到单独分析某些令牌没有意义。

以 unigrams、神经网络vs bigram、神经网络为例。

把 bigram " 神经网络"放在一起做题目分析不是更好吗?

也就是说,将类似于"神经网络的二元模型转换成类似于"神经网络的一元模型。

进行这种转换将有助于使主题更具可读性、可理解性和准确性。

那么,你将如何做到这一点呢?

为此,您需要利用 NLTK 库。

您可能希望使用搭配包,通过逐点相互索引(PMI)来查找共现标记。

第一步是在运行 NLTK 搭配包之前将所有句子标记成一个列表,以获得每个二元模型的 PMI 分数。

下面是"finder . score _ ngrams(score)"的输出:

[(('neural', 'network'), 65.91936507936508),
 (('datum', 'science'), 63.632571637945574),
 (('machine', 'learning'), 40.09489351902355),
 (('artificial', 'intelligence'), 35.65887096774193),
 (('how', 'to'), 27.32665009222873),
 (('in', 'python'), 17.652721482339317),
 (('deep', 'learning'), 16.500750302833072),
 (('time', 'series'), 14.835164835164836),
 (('part', 'num_sub'), 13.934801929913661),
 (('jupyter', 'notebook'), 12.422360248447205),
...]

注意 NTLK 如何输出一组有意义的二元模型以及相关的分数?

在我的例子中,对于任何高于 1 分的 PMI,我创建了一个有意义的二元词典,如下所示:

{'neural network': 'neural_network',
 'datum science': 'datum_science',
 'machine learning': 'machine_learning',
 'artificial intelligence': 'artificial_intelligence',
 'how to': 'how_to',
 'in python': 'in_python',
 'deep learning': 'deep_learning',
 'time series': 'time_series',
 'part num_sub': 'part_num_sub',
 'jupyter notebook': 'jupyter_notebook',
...}

一旦我创建了这样一个字典,我就创建了一个定义,用它各自的 unigram 替换每个有意义的二元模型。

下面是替换后的示例:

有意义二元模型替换的例子

注意“ scikit learn ”现在是“ scikit_learn ”。二元模型已被转换为一元模型。

有了所有这些清洁步骤,我现在准备好了我的主题分析。

基于潜在狄利克雷分配和网格搜索的主题分析

回想一下,这里的目标是回答这些问题:

  1. 作家发布了什么帖子?
  2. 读者对哪些帖子感兴趣?

为了回答这些问题,我首先需要将文章标题分解成不同的主题。

为了实现这一点,我用网格搜索运行了 LDA 主题模型。

这里是使用的 sklearn 包。

第一步是通过术语矩阵为 LDA 创建文档。

为了进行矢量化,我使用了 sklearn 的 CountVectorizer 函数。

输出形状是稀疏度为 1.32%的(3018,169)稀疏矩阵。即 1.32%的单元是非零的。

接下来要做的事情是建立我的网格搜索和绘制相关的情节。

我运行了 18 个不同的 LDA 模型,从 5 个主题到 10 个主题,学习衰减率不同——0.5,0.7 和 0.9。

之后,我提取了每个组合的对数似然分数,并绘制它们以找到最佳的主题数量。

网格搜索的结果

选择的最佳主题数量实际上是 5 个,但在试验了不同的主题后,我觉得学习衰减 0.5 的 7 个主题是一个更好的设置。

因此,我选择了后者。

看看这 7 个主题在视觉化时是如何分开的。

7 个主题在 0.5 学习衰减时的 LDA 可视化

另外,请注意将有意义的二元模型转换成一元模型是多么有用。

如您所见,LDA 现在可以将“深度学习”、“神经网络”和“数据科学”视为单个令牌,这使得主题更具可读性。

为了获得每个主题的术语相关性的表格视图,我们总是可以为它创建一个数据框。

每个主题的前 12 个术语

下一个合乎逻辑的步骤是根据相关术语标记主题类别。这比看起来要难。

以下是我标注的主题名称。(我试过了)

手动创建的主题名称

但是样本中主题的分布是怎样的呢?

主题分布输出

在这里,我们可以清楚地看到,大多数帖子属于主题 0—“特性和功能指南,关于可视化、熊猫或 jupyter 笔记本的帖子

然而,从宏观层面来看这种主题分布是不够的。

我觉得最好是从更细的层面来看待这些话题。

跨月。

会有什么模式吗?

为了进行这种分析,我必须准备相关的分析表。

首先,我将主题表合并到主数据框中。接下来,我将日期拆分成月份。

为进一步分析准备的表格

一旦我得到了这个工作表,就该进一步分析数据了。

作家发布了什么帖子?

为了按月绘制折线图,matplotlib 接受 2 个变量列表来绘制 X 和 Y 轴。

因此,我需要执行一些分组处理来提取相关信息以形成这些列表。

处理完成后,我简单地将结果绘制出来。

每月发布的主题频率

参考表格

乍一看,你可以看出,对于主题 0,TDS 作者从 2019-01 年开始才开始发表更多关于这个主题的文章-请注意峰值

主题 1 也是如此。

为了获得更好的视角,这里是单独的地块。

每月发布的主题频率(分开)

从单个情节来看,就为主题 3 和主题 6 撰写的帖子而言,它们似乎越来越受欢迎。

而主题 2 和 5 似乎呈下降趋势。

话虽如此,这里的混淆变量是新冠肺炎疫情。

注意到大多数话题是如何在 2020 年 3 月达到峰值的吗?

我猜所有国家的封锁导致了这些峰值。

但有人可能会说,如果封锁确实是一个混淆变量,那么人们应该预计在所有话题中都会出现峰值,但这显然不是这里的情况。

尽管我相信上面的情节很好地概括了 TDS 作者所写的内容。

它仍然没有告诉我们 TDS 的读者对什么帖子感兴趣。

为了了解这一点,我决定通过鼓掌的次数来估算读者的兴趣。

读者对哪些帖子感兴趣?

照片由 Unsplash 上的思想目录拍摄

了解读者兴趣的唯一方法是通过他们给每篇文章的掌声。

因此,我决定将拍手分成 4 个不同的类别。

很高兴趣:≥1000 拍
高兴趣:500 ≤拍<1000
过得去兴趣:150 ≤拍< 500
低兴趣:< 150 拍

有了这些类别箱来代理读者的兴趣,我简单地创建了一个名为“兴趣分组”的新专栏。

增加了“兴趣分组”一栏

一旦分组形成,我必须为每个主题创建子组,以获得在折线图上绘制每个主题所需的所有输入。

有了所有相关的信息,是时候逐个主题地查看结果了。

对于每个部分,我将显示每个主题的 3 个结果集。

  1. 每个兴趣组的帖子频率的折线图
  2. 参考表和术语相关性图
  3. 给定主题的帖子标题示例

读者兴趣分析—主题 0

主题 0 兴趣小组的频率

主题 0 的参考表

主题 0 中的文章标题示例

在这里你可以看到这个话题的大部分帖子属于“低兴趣”和“高兴趣”组。

同样清楚的是,与“高兴趣”或“非常高兴趣”组相关的帖子似乎呈下降趋势——帖子频率已降至平均水平以下。

过去一个月,与“体面兴趣”群体相关的帖子频率也有所下降。这可能预示着下降趋势的开始。

关于“低兴趣”组的帖子,有越来越多的作家发布与此话题相关的帖子。

在宏观层面上,你也可以看到趋势是如何转变的。

这个话题的高兴趣时代是从 2018 年到 2019 年年中。到 2020 年,读者的兴趣转移了,但作家似乎仍在这个主题上发表了很多文章。

这对 TDS 写手意味着什么?

  • 这些趋势表明,读者不再对阅读与这个话题相关的帖子感兴趣。
  • 如果你想为你的读者写一篇引人入胜的文章,你的文章可能仍然会引起不错的兴趣,但这种趋势正在迅速消失。我再等几个月。

读者兴趣分析—主题 1

主题 1 兴趣小组的频率

主题 1 的参考表

主题 1 中的文章标题示例

对于“非常高兴趣”群体,读者对该主题的兴趣似乎仅在 2018-10 至 2019-04 期间达到峰值。

几个月过去了,读者兴趣从 2019–04 年转移到 2019–09 年的“高兴趣”群体。

从 2019-04 年到 2020-03 年,可以看到从“高兴趣”群体到“体面兴趣”群体的另一次兴趣转移。

最后,从 2020 年到 2003 年,随着关于这个主题的文章数量增加,读者的兴趣减少,并落入“低兴趣”组。

这对 TDS 写手意味着什么?

  • 如果你的计划是在这个话题上获得高参与度,这条船似乎早就起航了。很多关于这个话题的文章正在被撰写,但是大部分都属于“低兴趣”一类。

读者兴趣分析—主题 2

主题 2 兴趣小组的频率

主题 2 的参考表

主题 2 中的文章标题示例

在宏观层面上,如果我们看一下过去 4 个月所有利益群体,似乎作家们就这个主题发表的文章越来越少——注意所有折线图中的下降趋势。

除此之外,即使发表了文章,它们似乎也不属于“高兴趣”或“非常高兴趣”群体。

这对 TDS 作家来说意味着什么?

有两种方法可以解释这种趋势:

  1. 机遇。随着关于这个主题的文章越来越少,这可能是一个发表关于这个主题的杀手级帖子的好时机,这个帖子肯定会从读者倾向于在他们的提要中看到的所有其他主题中脱颖而出。
  2. 不是好兆头。或许,作者感觉到读者不再有兴趣阅读这些类型的帖子。你仍然可以发表与这个主题相关的帖子,但是你可以期待更低的参与度。

读者兴趣分析—主题 3

主题 3 兴趣小组的频率

主题 3 的参考表

主题 3 中的文章标题示例

这个话题很有趣,因为就跨兴趣组的帖子分布而言,23%的文章属于“非常高兴趣”组。

在过去的几个月里,你也可以清楚地看到“低兴趣”组中许多关于这个主题的文章。

除此之外,没有任何其他明确的趋势/模式。所有的趋势似乎都是零星的。

这对 TDS 写手意味着什么?

  • 如果你专注于写关于这个主题的好的高质量的文章,你可能会得到很高的参与度。然而这个话题是一个拥挤的空间——2 个月内写的 60 篇文章在“低兴趣”组。

读者兴趣分析——主题 4

主题 4 兴趣小组的频率

主题 4 的参考表

主题 4 中的文章标题示例

这很难看出,但如果你关注 2018 年 7 月至 2019 年 8 月的日期范围,你会注意到大多数文章都属于“非常高兴趣”和“高兴趣”组。

几个月过去了,利息水平开始下降,主要集中在“合理利息”一组。

这对 TDS 写手意味着什么?

  • 看起来这个话题对 TDS 的读者来说还是很有趣的。我认为很多读者对进入数据科学的故事感兴趣。无论是理论知识还是数据科学访谈的故事。

读者兴趣分析—主题 5

主题 5 兴趣小组的频率

主题 5 的参考表

主题 5 中的文章标题示例

这是我在解释什么类型的文章属于这个主题时最纠结的话题。

从趋势来看,在过去 3 个月中,对“体面兴趣”群体的兴趣水平呈下降趋势。在此期间,没有多少文章属于“高兴趣”或“非常高兴趣”组。

这对 TDS 写手来说意味着什么?

  • 结果似乎表明读者对这个话题的兴趣下降了。如果你发表与这个话题相关的文章,你可以期待更低的参与度。

读者兴趣分析—主题 6

主题 6 兴趣小组的频率

主题 6 的参考表

主题 6 中的文章标题示例

这个话题只占所有文章的 7.3%,而且似乎正在引起人们的兴趣;尽管是零星的。

从宏观的角度来看,作家们似乎在这个话题上发表了很多。(回想一下之前关于主题 6 的图表,作者发布的帖子数量在增加)

但是从读者兴趣的角度来看,我看不到一个清晰的模式。

也许,这个题目里有“高息”。

这对 TDS 写手来说意味着什么?

  • 我不确定。我认为有某种形式的兴趣。但也许,这根本就是一个糟糕的话题。我应该添加术语“使用”作为停用词,并且不应该用“ num_sub ”替换数字。

结尾注释

我们终于来到了帖子的末尾!

我想在我结束这篇文章之前,我想补充一些免责声明。

本帖的结果,如果可能的话,应该掉以轻心。

在这次分析中,我没有考虑到很多令人困惑的变量。即新冠肺炎、Medium 在 2019 年的算法变化或 Medium 随时间的增长率。

例如,由于算法的变化,鼓掌行为可能从 2019 年末开始发生了巨大变化。如果事实确实如此,那么利用掌声来引起读者兴趣的方法是有缺陷的。

除此之外,我无法解释这些年来 TDS 作者数量增加的 TDS 增长率。从逻辑上讲,更多的作者等同于更频繁的文章计数。

最后,在详细查看了所有 7 个主题之后,我可能犯了一个错误,没有在 5 个主题上停下来。理解第五题和第六题变得相当困难。

无论如何,我仍然希望你喜欢这篇文章!

所有代码都可以在我的 GitHub 中找到:

[## timtan-github/TDS-使用潜在的 Dirichlet 分配和网格搜索的后标题分析

这是一个分两部分的项目:数据收集数据分析的数据收集代码可以在这个…

github.com](https://github.com/timtan-github/TDS-Post-Title-Analysis-with-Latent-Dirichlet-Allocation-and-Gridsearch)

祝写作愉快,下一期再见!😄

再见了,朋友们!

LinkedIn 简介:蒂莫西·谭

从熨斗学校毕业后,在数据科学领域找到一份工作

原文:https://towardsdatascience.com/i-attended-flatiron-school-and-got-a-job-in-data-science-aeda2b69b02b?source=collection_archive---------19-----------------------

阿德里安·特林考斯在 Unsplash 上拍摄的照片

办公时间

结束我的数据科学传奇

大家好,有一段时间了。对于那些一直关注我的数据科学训练营之旅的人来说,这将是我的数据科学之旅现阶段的最后一章。希望这不会是我发表的最后一篇博客,但是我想和你分享我旅程的最后一步。

两年前,也就是 2018 年 8 月,我从瑞银的理财规划师和销售顾问的工作岗位上被裁了。在意识到很难找到进入另一家公司的道路一年后,我决定通过帮助指导战略来实现我的愿望,即能够改变人们的生活。良好的策略和决策是通过对可用数据的仔细分析而制定的,而良好的商业决策也是通过这种分析而制定的。

考虑到这一点,2019 年 7 月,我在熨斗学校的沉浸式数据科学项目中开始了我的数据科学之旅。如果你一直关注我所有的博客,你会知道这是一个艰难的旅程,但我学到了难以置信的东西。我获得了许多硬技能,我可以磨练和发展这些技能,使自己成为更有吸引力的候选人,其中许多技能可以应用于不止一个行业。

很多阅读我博客的人可能会问,这很好,但是汉密尔顿现在在哪里?他毕业后是什么样子的?真的像他们广告宣传的那样神奇吗?更重要的是,人们想知道,你找到工作了吗?

是的,我做到了。

熨斗之后的艰难之路

由于博客会有点长,我将从熨斗学校为你提供的资源开始,以及毕业后的第一个 90 天是什么样子。在我的下一篇文章中,我将谈一谈我的求职过程,它有多令人沮丧,以及我最终是如何找到工作的。

所以让我们来谈谈毕业后的生活是什么样子的。首先,你必须习惯于早上不早起,不去绞尽脑汁解决前一天晚上你积极思考的数学或编码问题。第二,你必须习惯不被你的同学、你的同路人控制,在艰难的上坡路上到达终点。十五周的压力、痛苦、自我怀疑会让人们团结起来,这是任何团队建设练习都无法完成的。毕业后的第一个早晨,我深切地感受到他们的缺席。

熨斗的研究生资源

接下来你需要知道的是,毕业后,Flatiron 有两个机构帮助他们的毕业生找到工作。第一个是雇主合伙组织。第二是他们的职业指导服务。我将在下面为你一一列举:

雇主合伙集团 : 熨斗学校雇佣的猎头。他们与潜在雇主交谈,帮助协商最初的工资期望,或者安排与潜在雇主的面试,或者在某些情况下,只是给你发送一个职位空缺的链接。他们的素质因人而异。有些人试图帮你找到你梦想中的工作,有些人只是想把你塞进任何空缺的职位中,这就是“任何工作都重要”的方法。我们通常会收到他们发来的电子邮件,宣布一个空缺职位,如果你感兴趣,请回复邮件。

职业教练服务:熨斗学校聘请的职业教练。这些人会每周和你联系,通常是通过视频电话。他们将帮助构建求职策略,进行模拟文化面试,帮助你整理简历和 LinkedIn,并检查你的心理健康状况。他们是你的私人啦啦队长,你永远不会意识到你一直需要一个,直到你有一个。通过代理,他们也是熨斗学校毕业后的代言人。他们会检查你的每周工作追踪,以确保你符合退款保证的要求。一旦你得到退款保证,你就失去了与他们的联系。

熨斗招聘事件

毕业后你要做的第一件事就是清理你的 github,完成你的最终项目,因为雇主肯定会想谈论它。与你的教练会面,检查你的个人品牌,建立或重新格式化你的简历,让你的 LinkedIn 闪闪发光。接下来是准备熨斗的招聘活动,对我的班级来说,是在毕业后两个星期。

招聘活动是什么?Flatiron 的雇主伙伴关系小组每季度举办一次招聘会。本质上,你和所有其他软件工程和数据科学毕业生都在 WeWork 空间见面,EP 为你安排了 15 分钟的面试,面试对象是希望招聘熨斗毕业生的公司。这些基本上都是速配约会,而且会如你所料。在规定的 15 分钟内,你必须拿出你最强的“准备好给人留下深刻印象”来说服这些人让你进入下一轮更严肃的面试。我会见了三家公司。一家是基于人工智能的抵押贷款处理公司,第二家是一家主要的服装零售商,最后一家是专门为投资银行提供研究和建模的金融科技公司。其他人会见了一家与内容创作者合作的公司 Frederic Fekkai(美发沙龙/美容集团),以及一家帮助其他企业识别市场机会的公司。没有特别的主题,他们会将你与你提前指明的行业偏好相匹配。

说实话,我们都没有为招募活动做好准备。这将是我们许多人毕业后的第一次面试经历。我们都去了,因为首先“如果我真的找到工作了呢?”其次,我们都认为,即使没有任何结果,我们至少可以从数据科学面试过程中获得一些经验。我们很努力,但我们觉得比我们先毕业的那一届在这方面有更多的面试经验,很可能会进入下一轮。我们班有 10 人参加了招聘活动,6 人参加了后续面试,3 人进入了第三轮,2 人收到了录用通知,1 人被录用。

模拟面试

招聘活动结束后,我安排了熨斗公司给新毕业生的模拟技术面试。模拟面试是由一家名为 Skilled Inc .的公司运营的。他们通过签约的专业人士为各种行业提供模拟技术面试,这些专业人士希望将他们的经验货币化,并为像我这样的新手提供一些帮助。熨斗免费提供一个模拟技术,如果你想要更多,你必须自己付费。

关于我个人的模拟面试,我不打算讲太多细节。每个面试官都是不同的,他们的经历是不同的,因此他们的面试风格也是不同的。我的没有问编码或数学问题,而是详细介绍了我的项目、它的商业应用,以及如何最好地将其扩展为一个持续工作的模型。有趣的是,由于我来自销售和业务开发背景,这是一种我非常熟悉的方法。我的一个同学有一个亚马逊工程师,这对于一些严肃的 DFS 和 BFS 算法编码以及真正困难的亚马逊级 DS 问题来说是难以置信的困难。

对于那些想知道的人来说,这些面试的目的是不要成功,尽管如果你成功了那就太好了。关键是要接触到在真实面试中可能会被问到的问题类型,并突出你可能有的和需要努力的知识差距。我觉得我的面试没有让我在这方面做好准备。这在一些面试中行得通,但不是大多数。对于我那位得到了 Amazon guy 的同学来说,他在加强编码方面得到了大量有用的反馈,但在数学部分有所欠缺,直到今天他仍然对此感到有点不舒服。

在模拟技术面试之后,我和我的教练进行了模拟文化面试。这是我感觉更舒服的一种方式,在这种方式中,你努力向潜在的面试官展示你的品牌和价值。如果你对找工作认真一点,你会花大量时间打造你的品牌和信息。你应该准备好回答的最简单的问题是“告诉我关于你自己的情况”,“你为什么想在这里工作?”“你为什么从事这个职业?”

在模拟文化面试中,我拿到了一份类似上述的常见面试问题清单,并被告知要做好准备。然后我的采访被录了下来,录音被发给我进行评论。我的教练给了我极大的帮助,让我的脚本变得更加用户友好,我应该和不应该使用的时髦词汇,我过度使用的单词或短语,以及调整我的语气或肢体语言。她还给了我一些建议,告诉我雇主希望在他们的潜在候选人身上看到什么样的东西,以及一系列可以问潜在雇主的好问题。

最后,还有简历和 LinkedIn 评论。这两点通常是潜在雇主对你的第一印象,也是唯一的印象。Flatiron 为软件工程师和数据科学家提供了首选的技术简历格式。这种格式包括从对你和你的信息的标准描述开始,然后列出你的关键词搜索技巧。然后它会深入到你的项目列表中,包括使用的技术和结果。最后,列出你的工作经历,以及你希望作为附录包括的任何其他内容。看一看:

现在这种格式有几个问题,有些对我来说是特殊的,有些是一般的问题。如你所见,我的简历有两页,这很不寻常。我今年 37 岁,在银行业 10 多年,升职频繁。通常,如果我申请一份银行工作,这将是一个很好的事件序列。然而,作为一名职业改变者,我需要人们看到我的项目,并证明我有能力成为一名数据科学家,所以我的项目占据了很大的空间,我简历的其余部分致力于显示我在其他工作中做了 DS 类型的“东西”。

雇主伙伴关系对此有很大的问题,因此我没有收到他们的很多来信。他们希望我大幅缩减简历的可读性,尽管熨斗的指导方针规定,如果你有 5 年以上的工作经验,两页纸是可以接受的。因此,在我找工作大约 5 个月后,当 Flatiron 评估我的情况时,他们问 EP 为什么我没有被录用,他们指出我的简历长度是一个问题。这是我专门为 EP 准备的简历。

我将在这里花一点时间,就这个问题大声疾呼。当然,EP 有很多候选人需要他们去筛选。另一方面,我是 10 月份从 Flatiron 毕业的,到 11 月份我清理好的简历就在他们手里了。然而,不知何故,在他们整理简历、推荐工作等的整整 7 个月里,没有人费心与我或我的教练沟通,这是一个潜在的障碍?在这整整 7 个月的时间里,当我看着我的就业缺口逐月扩大时,我预算着每一分钱,担心被录用?提到我的简历太长确实是他们最起码能做的,但没人会在意?不,相反,他们只是去找那些容易跳槽的毕业生,去他妈的这个家伙和他长长的简历。

我跑题了。第二个问题是,对于许多人力资源人员来说,这种格式有点令人困惑。我不确定这种格式是否是一种标准,但我的很多回复和招聘信息都是这样的:

*“So tell me about the work you did at Yelp…”*.At which point the conversation devolves into: *“Actually, I didn’t work at Yelp, my final project utilized data from Yelp to…”* Followed by:*“Oh, I see, well we really need someone who has* (insert random skill here)*, I’ll pass on your resume and maybe we’ll reach out…”***end call**

我不知道这是谁或什么造成的,懒惰的人力资源人员还是糟糕的申请人跟踪软件。无论哪种方式,每个人都受到影响。也许我会造一个更好的 ATS,卖几百万。

开始的结束

我的求职之旅的第一部分就这样结束了。我一定会在我的下一篇帖子中写下我的求职经验和策略!下次见!

我给你带了些高清图!神经网络如何改进旧游戏

原文:https://towardsdatascience.com/i-brought-you-some-hd-grphics-how-neural-net-can-improve-old-games-7a8b97dffd61?source=collection_archive---------21-----------------------

用于实时超分辨率的神经网络

铁血联盟截图(图片作者)

用于游戏图形增强的实时超分辨率(RTSR)神经网络(仅限 Nvidia GPU)

在 90 年代,当我还是个孩子的时候,我喜欢在我的电脑上玩视频游戏。在俄国,那时个人电脑还不太多,所以我的第一个游戏站是 ZS Spectrum,里面有游戏磁带。色彩鲜艳明亮的 DOS 游戏后来成了我真正的发现。对我来说,大多数现存的流派都是从 90 年代开始的。在有点怀旧之后,我决定回忆一下我的青春,在 Dosbox 模拟器上运行一个旧游戏,但受到了巨大像素和低分辨率的不愉快打击。虽然大像素的旧图形可能有其魅力,但许多人现在对这种质量不满意。

对于游戏玩家来说,提高图形质量通常至关重要。育碧在 2014 年花了大约六个月的时间为高清游戏《英雄 3》重绘纹理,并引发了人们对这款游戏的兴趣

【https://trends.google.com/trends/explore? 日期= 2012-06-01% 202020-06-25&q = % 2Fm % 2f 056 _ 97,%2Fm%2F065pfn

同样的情况也发生在 CNC 系列第一场由于高-its res remaster(红线)(https://www . ea . com/ru-ru/games/command-and-conquer/command-and-conquer-remastered)。

并不是每个游戏都值得高清重制,因为重绘图形需要花费很多精力。另一种方法是算法增强。

为了提高分辨率,消除游戏中的大像素和台阶,目前使用了各种后处理和反走样算法(更多详细信息,请参见https://vr.arvilab.com/blog/anti-aliasing),但反走样算法会导致所有令人讨厌的“模糊”图片,这往往比大像素的棱角更不可取。

但是你可以尝试使用超分辨率技术来提高图像质量。超分辨率的想法是使用神经网络来提高图像的分辨率,绘制丢失的像素。现在已经取得了令人印象深刻的结果,类似于改进 Bladerunner 电影中的图像的场景

超分辨率技术改善了图像的视觉感知,例如,这里的https://github.com/tg-bomze/Face-Depixelizer,但是给图像带来了新的信息。它可以用来提高电影质量【https://www.youtube.com/watch?v=49oj2JUtn0A【https://www.youtube.com/watch?v=3RYNThid23g】T5。然而,大多数算法都是资源密集型的,而且相当慢,我想创建一个脚本来实时改善游戏。

一点理论

以下所有内容将适用于卷积神经网络(https://en.wikipedia.org/wiki/Convolutional_neural_network),这是一种用于处理图像的神经网络子类型。首先,让我们看看神经网络如何解决超分辨率问题。该任务非常类似于自动编码器任务的解决方案(https://en.wikipedia.org/wiki/Autoencoder)。为了在输出端得到相同的图像,有必要将图像输入到网络输入端。然而,自动编码器通常用于解决高效数据压缩的问题,因此,其架构的一个特点是瓶颈——瓶颈,即具有少量神经元的网络层。这种层的存在使得剩余部分学习信息的有效编码和解码。为了训练超分辨率网络,首先有意降低高质量图像的分辨率,并将其输入神经网络。预期的输出是高质量的源图像。超分辨率任务定义了所用网络的架构。

通常,输入和输出数据之间有一个连接(跳过连接),这大大加快了学习速度。输入数据的像素大小增加,并被添加到卷积网络的输出中。因此,你不需要完全从头开始训练网络来把图像变成几乎一样的。这种联系允许训练画出通过增加像素尺寸而放大的图像和真实的高清图像之间的差异。在不同级别和通过不同层数的跳跃连接的想法是非常有效的,并导致了网络的剩余网络类的出现。如今,几乎所有流行的建筑都采用了这种连接方式。在这里可以找到解决超分辨率问题的最新架构的很好的概述(https://github.com/krasserm/super-resolution)。我的任务是创建一个神经网络来实时解决超分辨率问题。

具有四个残差块的 edsr 架构被选择为分辨率增加 4 倍(标准 edsr 具有 16 个块)。在研究和优化之后,其尺寸显著减小(非线性部分的尺寸减小了 4 个块,并且线性上采样步骤被优化而没有优化质量损失),并且速度被提高而没有显著的质量损失。一般网络架构如图所示。每个块是一个 X * Y * N 图像,其中宽度对应于通道的数量。转换—对应于 3×3 卷积(在 res 块之后激活非线性 ReLU 的情况下)。升级步骤——由于渠道变平而导致的维度增加。

超分辨率的 EDSR 卷积网络(图片作者

我提出的 RTSR 建筑(更快)(作者图片)

高质量的照片已经从https://data.vision.ee.ethz.ch/cvl/DIV2K/.下载,一般任何照片都可以。训练的代码在这里(有一些来自https://github.com/krasserm/super-resolution的函数用于数据生成器)。用于更好工作的图像大小调整是像素化游戏中最接近的方法

我要指出的是,裁员方法对培训质量影响很大。下采样的最佳方法是最近邻或中值滤波。包括像素平均的方法通常不适用。

之后,移除。/cache 文件夹并用我们的数据重新创建生成器(适当缩小)

输出是具有简单架构的相对较小(2.6 MB)的神经网络。同时,该检查给出了与预训练的 16 块网络的细微差别:

左侧—初始图像,右侧—16 块 edsr,中间 rtsr。低分辨率图像来自 Github 项目。增强图像是作者图像

运行网络

我已经在一个支持 cud nn(https://developer.nvidia.com/cudnn)的显卡(我有一个 GTX 1060 3 Gb)上启动了最终的网络,以获得高性能。以下是与 RTSR 一起玩的链接:

【https://github.com/Alexankharin/RTSR

用于推断的管道如下:

1.从区域或窗口捕捉图像

2.经由 RTSR 的图像增强

3.在新窗口中绘制增强图像

在开发过程中,我发现当在 DOSBox 模拟器中启动游戏时,分辨率是 640x480 像素,但大多数情况下它是通过将像素大小加倍来产生的,因此在增强之前,可能需要可选的初始 320x240 图像恢复步骤(我后来发现了详细信息https://www . dosgamers . com/dos/dos box-dos-emulator/screen-resolution)。

截图使用 Linux 中的 mss 库或 windows 中的 d3dshot 库

图像处理和绘图——使用 OpenCV-python 和 PIL 库。要关闭窗口,激活它并按 q 键。

脚本写在 superres_win.py 文件中。

我的 1060 3GB 笔记本电脑在 320x240 图片下提供 20–22 FPS,我发现它对于大多数类型的游戏都是可以接受的。根据基准测试http://ai-benchmark.com/ranking_deeplearning_detailed.htmlGTX 1070 和 1080 在类似的任务应该超过 1060 近 2 倍(也没有真正测试)!对于舒适的游戏来说,大约 40 的 FPS 应该足够了。下面是一段视频,展示了街机游戏的质量改进:

安装了 GTX 1060 3 GB 和 Linux 的固定 PC 只能提供 17 FPS(我还没有发现为什么模型运行得更慢)。
对于主线任务来说已经足够了:

它甚至对一些平台游戏也很有效:

如何使用:

你需要一个支持 cuda 和 cud nn(https://developer.nvidia.com/cuda-gpus)以及已安装的 cuda / cudnn 库的显卡。需要安装 python 3.7 和 TensorFlow(有 GPU 支持的 2.0 以上版本)。这可能是一项艰巨的任务,兼容性问题(【https://www.tensorflow.org/install/source_windows】T2)可能会发生。最简单的方法是安装 Anaconda 发行版(【https://www.anaconda.com/products/individual】T4),然后打开 Anaconda 提示符命令行并编写

conda install tensorflow-gpu

如果因为冲突而没有成功,那么

conda install cudnnpip install tensorflow-gpu

应该管用。

可以使用 pip 安装其他库:

pip install opencv-python
pip install mss
pip install d3dshot
pip install pywin32

D3dshot 库安装可能需要额外的步骤https://github . com/SerpentAI/d3d shot/wiki/Installation-注意:-Laptops

从 https://github.com/Alexankharin/RTSR下载并解包 EDSR 脚本和模型

使用命令运行 superres_win.py

python superres_win.py

在 7 秒钟内,你应该激活游戏窗口。将会出现一个窗口,增强您显示器的游戏区域。调整窗口捕获区域 WSAD 键。捕捉区域的大小可以用 IJKL 键来改变。将捕获区域放置到游戏中后,按 0 启动超分辨率模式。1 键或 2 键定义最初捕获的图像是否有大(2x2)像素。制作一个窗口,让你的游戏活跃起来,开始玩吧!

例子

增强前后的 MegaMan X screeenshots(图片由作者提供)

真人快打 3 屏幕截图(图片由作者提供)

凯兰迪亚传说截图(图片作者)

暗黑 2 截图(图片由作者提供)

英雄无敌截图(图片作者)

我建立了一个区块链,而我得到的只是一篇 17 页的研究论文

原文:https://towardsdatascience.com/i-built-a-blockchain-and-all-i-got-was-a-17-page-research-paper-c85987228f4c?source=collection_archive---------50-----------------------

我的成绩是通过血、汗和泪获得的,但我不禁感到悲伤的是,这个项目并没有多少现实生活中的奖励。

由图米苏于pixabay.com

我目前是一名大学生。哇,在学校的时光真美好(感谢我要毕业了)。碰巧的是,这个故事的主要焦点发生在上学期,在所有新冠肺炎的东西加速之前。

作为一名计算机科学专业的学生,我需要完成一门名为高级研究的学期课程。这是一个非常(故意)模糊的课程名称,在这个课程中,他们希望你做的是,选择一个你认为可以应用计算机科学的问题,并研究解决方案。哦,让我们不要忘记项目的高潮,论文和演示。

该项目

我的教授(嗨!如果你正在读这篇文章),让我们根据项目想法分组(为了他和我们的利益)。我很乐意承认,我的项目想法不是我想出来的,是我的合伙人想出来的。然而,我确实热情地推动了这个项目的建设,直到今天,我的合作伙伴还会高兴地取笑我。你问的这个神秘项目是什么?

我们想建立一个使用区块链的投票系统。

点击这里查看 GitHub 上的项目(如果你想看的话,那里也有论文和演示文稿的副本)。

为什么?

嗯,我的合作伙伴对技术的信息安全领域非常感兴趣(对政治学也有热情),我喜欢挑战。这个想法引起了我的兴趣。这个挑战嘲弄了我。事实上,由于压力,我度过了许多不眠之夜,还长了几绺头发。

我们决定使用 Hyperledger Fabric (HF)来构建项目(没有 Composer)。最终,由于项目的操作系统相关部分的问题,实际的链变成了我的项目部分,我的合作伙伴在概念证明 Merkle-tree 上做了一点工作(很抱歉,但我仍然无法解释它是如何准确工作的)。

那个学期的大部分时间,我都在试图完成这个链条上的基本功能。我重新开始了很多次。我筛选了目前存在的关于 vanilla Fabric 的少量文档,试图找到答案,尽我所能进行故障排除——其中一些是中型文章,我将在下面链接。那个项目极大地考验了我的耐心,但我太固执了,无法从不那么困难的事情重新开始。

但是为什么要有投票系统呢?

我相信很多人都不知道,目前(在美国)使用的大多数投票系统/机器都经过研究,发现非常不安全。没有用确切的术语来说明原因。可能是因为很难确定这些机器是在由第三方测试之前制造和销售的。

本质上可以归结为三个可能的原因。

  • 开发人员没有多少安全培训或经验。
  • 公司为了省钱,偷工减料。
  • 该公司几乎没有进行任何测试。

所以,这门课的目的是尝试将我们的计算机科学知识应用到现实世界的问题中,为什么不采用投票系统呢?

为什么是区块链?

由于区块链的整个前提是成为一个不可编辑的、仅附加的账本,由一个对等网络来维护,还有什么更好的办法来解决安全问题呢?由于投票被认为是一个几乎符合圣经的民主进程,再多的安全措施也不过分,对吗?

区块链的真理是,安全性的大小取决于有多少对等体参与到网络中来维护账本的完整性。由于这一点,你仍然必须满足拜占庭将军问题的要求,以便有效地保护网络,参与的对等体数量越大,欺骗网络就越困难。

一个新兴的竞争者?

所以第无数次,我让步了,重新开始,直接使用了 HF 的一个例子,并尽可能少的修改以使它工作。而且成功了!我们写了论文,做了期末报告,并获得了分数。突然之间,这个项目除了一个奇怪的一次性副业项目之外,再也没有任何意义了。在撰写论文的最后阶段,我们甚至发现弗吉尼亚州实际上有一个由 Hyperledger Fabric 支持的公开可用的(尽管是私下维护的)电子投票应用程序。

第一反应是,这让我们的项目失去了意义。然而,它没有。为什么?因为那是出于“安全原因”而私下维护的我们的是开源的。重要的区别是,我们没有任何方法来研究他们是否改善了我们发现的关于旧的(尽管目前仍在使用)投票系统的研究论文所带来的安全条件。开源 it 的想法是让维护者对社区发现的漏洞负责,并在需要的地方寻找社区人才。

经验教训

最后,我学到了新的东西,克服了巨大的挑战,并为自己做了一些我仍然感到自豪的工作。完全公开,我花了大部分时间做前端开发,我已经作为一名开发人员/初级软件工程师工作了将近两年。

我给你的建议是,新程序员,当你把基础做好了,挑战你自己。想一些非常有挑战性的事情,甚至可能是稀奇古怪的事情,经历碰壁和重新开始的动作。挑战会迫使你发现你需要解决问题的深度,或者迫使你放弃。

无论哪种方式,即使没有真正的、有形的回报——不幸的是,我仍然不能把这 100 英镑存到银行——它也会让你更多地了解你自己和你用来实现你的解决方案的技术,这比在堆栈溢出中寻找你真正在寻找的解决方案的零零碎碎要好得多。

[## 区块链 Hyperledger 结构—错误和解决方案

你好,在这篇文章中,我想分享一些你可能面临的错误和可能的解决方案。

medium.com](https://medium.com/coinmonks/hyperledger-fabric-composer-errors-solutions-827112a3fce6) [## Hyperledger Fabric 链码测试教程

大家好!我在这里向您解释我是如何创建测试环境,使我能够真正…

medium.com](https://medium.com/coinmonks/tutorial-on-hyperledger-fabrics-chaincode-testing-44c3f260cb2b) [## 在 Node.js 中开始开发 Hyperledger 结构链代码

用 Node.js 编写链代码的初学者指南

medium.com](https://medium.com/coinmonks/start-developing-hyperledger-fabric-chaincode-in-node-js-e63b655d98db) [## 了解 Hyperledger 结构-认可事务处理

Hyperledger Fabric 与许多其他区块链平台之间的一个关键区别是交易的生命周期。在…

medium.com](https://medium.com/kokster/hyperledger-fabric-endorsing-transactions-3c1b7251a709)

我用树莓派和机器学习做了一个 DIY 车牌阅读器

原文:https://towardsdatascience.com/i-built-a-diy-license-plate-reader-with-a-raspberry-pi-and-machine-learning-7e428d3c7401?source=collection_archive---------0-----------------------

机器学习终于变得可行了

GIF 来自预测视频。检查结果部分。

几个月前,我开始考虑让我的汽车具有探测和识别物体的能力。我很喜欢这个想法,因为我已经看到了特斯拉的能力,虽然我不想马上买一辆特斯拉( Model 3 看起来越来越多,我不得不说),但我想我会尝试满足我的梦想。

所以,我做到了。

下面,我记录了项目中的每一步。如果你只是想看探测器运行的视频 GitHub 链接,跳到底部。

第一步。确定项目范围

我开始思考这样一个系统应该有什么能力。如果说我一生中学到了什么的话,那就是从小处着手永远是最好的策略:循序渐进。所以,除了明显的车道保持任务(每个人都已经做过了),我想到的只是在开车时简单地识别车牌。该识别过程包括 2 个步骤:

  1. 检测车牌。
  2. 识别每个牌照的边界框内的文本。

我认为,如果我能做到这一点,那么转移到其他任务应该是相当容易的(如确定碰撞风险、距离等)。甚至可能创建一个环境的向量空间表示——这将是 dope。

在过多担心细节之前,我知道我需要:

  • 一种机器学习模型,将未标记的图像作为输入,并检测车牌。
  • 某种硬件。粗略地说,我需要一个连接到一个或多个摄像机的计算机系统来查询我的模型。

首先,我着手建立正确的对象检测模型。

第二步。选择正确的型号

经过仔细研究,我决定采用以下机器学习模型:

  1. yolov 3——这是迄今为止最快的车型,可与其他最先进的车型相媲美mAP。该模型用于检测物体。
  2. CRAFT 文本检测器——用于检测图像中的文本。
  3. CRNN —基本上是递归的 CNN (卷积神经网络)模型。它必须是递归的,因为它需要能够将检测到的字符以正确的顺序组成单词。

这三种模式如何协同工作?嗯,操作流程是这样的:

  1. 首先, YOLOv3 模型检测从摄像机接收的每一帧中的每个牌照的边界框。建议预测的边界框不要太精确,包含比检测到的对象更多的内容是个好主意。如果太窄,那么后续流程的性能可能会受到影响。这与下面的模型是相辅相成的。
  2. CRAFT 文字检测器从 YOLOv3 处接收裁剪下来的车牌。现在,如果被裁剪的帧过于狭窄,那么很有可能会遗漏部分车牌文本,这样预测就会失败。但是当边界框更大时,我们可以让 CRAFT 模型检测字母在哪里被发现。这给了我们每个字母非常精确的位置。
  3. 最后,我们可以将每个单词的边界框从 CRAFT 传递给我们的 CRNN 模型来预测实际的单词。

有了我的基本模型架构草图,我可以转移到硬件上。

第三步。设计硬件

知道我需要低功率的东西让我想起了我的旧爱:树莓派。它有足够的计算能力预处理帧在一个体面的帧速率,它有 Pi 相机。Pi 相机是树莓 Pi 的实际相机系统。它有一个非常棒的图书馆,非常成熟。

至于互联网接入,我可以只扔在一个 EC25-E 的 4G 接入,也有一个 GPS 模块嵌入从我以前的一个项目。下面是第篇讲的就是这个盾。

我决定从圈地开始。把它挂在汽车的后视镜上应该效果不错,所以我最终设计了一个双组件支撑结构:

  1. 在后视镜的一侧,树莓 Pi + GPS 模块+ 4G 模块会留下。查看我在 EC25-E 模块上的文章,了解我对 GPS 和 4G 天线的选择。
  2. 另一方面,我有一个 Pi 摄像机,通过一个带有球形接头的臂来支撑。

这些支架/外壳将由我信赖的 Prusa i3 MK3S 3D 打印机打印。

图 1—Raspberry Pi+4G/GPS 屏蔽外壳

图 2 — Pi 摄像机支架,带有用于定向的球形接头

图 1图 2 显示了渲染时的结构。请注意, C 型支架是可插拔的,因此 Raspberry Pi 的外壳和 Pi 摄像头的支架不附带已经印刷好的支架。它们有一个插座,灯座插在上面。如果我的一个读者决定复制这个项目,这将非常有用。他们只需调整支架,就能在汽车后视镜上工作。目前,持有人在我的车上工作得很好:这是一辆路虎神行者。

图 3-Pi 摄像机支撑结构的侧视图

图 4—Pi 摄像机支撑结构和 RPi 支架的前视图

图 5——摄像机视野的想象图

图 6 —包含 4G/GPS 模块、Pi 摄像头和 Raspberry Pi 的嵌入式系统特写照片

显然,这些需要一些时间来建模——我需要几次迭代来使结构坚固。我在 200 微米的图层高度使用了PETG材质。PETG在 80-90 度(摄氏度)下工作良好,抗紫外线辐射能力很强——虽然没有ASA好,但也很强。

这是在 SolidWorks 中设计的,所以我所有的SLDPRT / SLDASM文件以及所有的STLsgcodes都可以在这里找到。也可以使用它们来打印您的版本。

第四步。训练模型

一旦我有了硬件,我就开始训练模型。

不出所料,最好不要多此一举,尽可能重用别人的作品。这就是迁移学习的意义所在——利用来自其他超大型数据集的见解。一个非常恰当的迁移学习的例子是几天前我在这篇文章中读到的。在中间的某个地方,它谈到了一个隶属于哈佛医学院的团队,该团队能够微调一个模型来预测“从胸片中预测长期死亡率,包括非癌症死亡”。他们只有一个只有 50,000 张标记图像的小数据集,但他们使用的预训练模型( Inception-v4 )在大约 1400 万张图像上进行训练。他们花的时间不到原始模型训练时间的一小部分(时间和金钱),但他们已经达到了相当高的精度。

那也是我打算做的。

YOLOv3

我在网上寻找预训练的车牌模型,并没有我最初预期的那么多,但我找到了一个对大约 3600 张车牌图像进行训练的模型。虽然不多,但也比什么都没有强,除此之外,它还在 Darknet 的预训练模型上进行了训练。我可以利用这点。这是那家伙的型号。

由于我已经有了一个可以记录的硬件系统,我决定用我的在镇上开几个小时,收集帧来微调上面那个家伙的模型。

我用 VOTT 给收集到的帧做了注解(当然还有车牌)。我最终创建了一个由 534 张图片组成的小型数据集,并为车牌添加了带标签的边框。这里是数据集。

然后我找到了 YOLOv3 net 的这个 Keras 实现。我用它来训练我的数据集,然后将我的模型预测到这个 repo 中,这样其他人也可以使用它。我在测试集上得到的90% ,这确实很好地给出了我的数据集有多小。

克拉夫特和 CRNN

在无数次试图找到一种好的网络来识别文本之后,我偶然发现了 keras-ocr ,这是 CRAFT 和 CRNN 的打包和灵活版本。而且还附带了他们预先训练好的模型。太棒了。我决定不对模型进行微调,让它们保持原样。

最重要的是,用keras-ocr预测文本非常简单。基本上只有几行代码。查看他们的主页,看看是怎么做的。

第五步。部署我的车牌检测器模型

我可以采用两种主要的模型部署方法:

  1. 在本地进行所有的推理。
  2. 在云中进行推理。

这两种方法都面临着挑战。第一个意味着有一个大的“大脑”计算机系统,这是复杂和昂贵的。第二个挑战是延迟和基础设施,特别是使用 GPU 进行推理。

在我的研究中,我偶然发现了一个叫做[cortex](https://github.com/cortexlabs/cortex)的开源项目。这对于游戏来说是相当新的,但它肯定是人工智能开发工具进化的下一步。

基本上,cortex是一个只需轻轻一按开关,就可以将机器学习模型部署为生产 web 服务的平台。这意味着我可以专注于我的应用程序,剩下的交给cortex来管理。在这种情况下,它在 AWS 上做所有的准备工作,我唯一要做的就是使用模板模型来编写我的预测器。更牛逼的是,每个型号我只需要写几十行。

这是从他们的 GitHub repo 中截取的cortex在终端中的动作。如果这不是美丽和简单的,那么我不知道该叫它什么:

来源: Cortex GitHub

由于这个计算机视觉系统不是由自动驾驶仪使用的,所以延迟对我来说并不重要,为此我可以选择cortex。如果它是自动驾驶系统的一部分,那么使用通过云提供商提供的服务就不是一个好主意,至少现在不是。

使用cortex部署 ML 模型只是一个问题:

  1. 定义cortex.yaml文件,这是我们的 API 的配置文件。每个 API 将处理一种类型的任务。我分配的yolov3 API 用于检测给定帧上的车牌边框,crnn API 用于使用工艺文本检测器和 CRNN 预测车牌号码。
  2. 定义每个 API 的预测值。基本上,在cortex中定义一个特定类的predict方法来接收一个有效载荷(所有的 servy 部分都已经被平台处理了),使用有效载荷预测结果,然后返回预测结果。就这么简单!

在不深入我是如何做到这一点的具体细节的情况下(为了让文章保持一个适当的长度),这里有一个经典虹膜数据集的预测器的例子。cortex 实现这两个 API 的链接可以在上找到,他们的资源库在这里——这个项目的所有其他资源都在本文的末尾。

# predictor.pyimport boto3
import picklelabels = ["setosa", "versicolor", "virginica"]
class PythonPredictor:
    def __init__(self, config):
        s3 = boto3.client("s3")
        s3.download_file(config["bucket"], config["key"], "model.pkl")
        self.model = pickle.load(open("model.pkl", "rb"))    def predict(self, payload):
        measurements = [
            payload["sepal_length"],
            payload["sepal_width"],
            payload["petal_length"],
            payload["petal_width"],
        ]        label_id = self.model.predict([measurements])[0]
        return labels[label_id]

然后做一个预测,你就像这样用curl

curl [http://***.amazonaws.com/iris-classifier](http://***.amazonaws.com/iris-classifier) \
    -X POST -H "Content-Type: application/json" \
    -d '{"sepal_length": 5.2, "sepal_width": 3.6, "petal_length": 1.4, "petal_width": 0.3}'

预测响应看起来像这样"setosa"。很简单!

第六步。开发客户端

有了cortex来处理我的部署,我可以继续设计客户端——这是棘手的部分。

我想到了以下架构:

  1. 从 Pi 摄像机中以 30 FPS 的速度采集分辨率合适的帧( 800x450480x270 ),并将每一帧推入一个公共队列。
  2. 在一个单独的进程中,我将从队列中取出帧,并将它们分发给不同线程上的许多工作线程。
  3. 每个工作线程(我称之为推理线程)都会向我的cortexAPI 发出 API 请求。首先,向我的yolov3 API 发出一个请求,然后,如果检测到任何牌照,向我的crnn API 发出另一个请求,请求一批被裁剪的牌照。响应将包含文本格式的预测车牌号码。
  4. 将每个检测到的牌照(有或没有识别的文本)推送到另一个队列,最终将其广播到浏览器页面。同时,还将板号预测推送到另一个队列,以便稍后保存到磁盘(以csv格式)。
  5. 广播队列将接收一堆无序的帧。其消费者的任务是在每次向客户端广播新的帧时,通过将它们放置在非常小的缓冲区(几个帧大小)中来对它们进行重新排序。该使用者正在单独运行另一个进程。这个消费者还必须设法将队列的大小保持在一个指定的值,以便帧能够以一致的帧速率显示,即 30 FPS。显然,如果队列大小下降,那么帧速率的下降是成比例的,反之亦然,当队列大小增加时,帧速率也成比例地增加。最初,我想实现一个滞后函数,但我意识到这会给流一种非常不稳定的感觉。
  6. 与此同时,在主进程中会有另一个线程运行,从另一个队列中提取预测和 GPS 数据。当客户端收到终止信号时,预测、GPS 数据和时间也被转储到一个csv文件中。

这里是与 AWS 上的云 API 相关的客户端的流程图。

图 7 —客户端流程图以及配备 cortex 的云 APIs】

在我们的例子中,客户端是 Raspberry Pi,推理请求发送到的云 API 是由 AWS 上的cortex提供的( Amazon Web Services )。

客户端的源代码也可以在其 GitHub 库上查看。

我必须克服的一个特殊挑战是 4G 网络的带宽。最好降低该应用程序所需的带宽,以减少可能的挂起或对可用数据的过度使用。我决定在 Pi 摄像头上使用非常低的分辨率:480x270(我们可以使用小分辨率,因为 Pi 摄像头的视野非常窄,所以我们仍然可以轻松识别车牌)。尽管如此,即使在这个分辨率下,一帧的 JPEG 大小在 10 兆比特时也有 100KB 左右。乘以每秒 30 帧得到 3000KB,大约是 24 Mb/s,这还不包括 HTTP 开销——这是一个很大的数目。

相反,我做了以下几招:

  • 将宽度缩小到 416 像素,这正是 YOLOv3 模型调整图像的大小。规模显然保持完整。
  • 已将图像转换为灰度。
  • 移除图像顶部 45%的部分。这种想法是,车牌不会出现在画面的顶部,因为汽车不会飞,对吗?据我所见,剪切掉 45%的图像不会影响预测器的性能。
  • 再次将图像转换为 JPEG,但质量较低。

最终得到的帧大小约为 7–10KB,非常好。这相当于 2.8Mb/s。但是加上所有开销,大约是 3.5Mb/s(包括响应)。

对于crnn API,即使没有应用压缩技巧,裁剪后的车牌也不会占用太多时间。他们坐在大约 2-3KB 的一块。

总而言之,要以 30FPS 的速度运行,推理 API 所需的带宽大约是 6Mb/s。这个数字我可以接受。

结果

有用!

上面的例子是通过cortex运行推理的实时例子。我需要大约 20 个配备 GPU 的实例才能顺利运行。根据集群的延迟,您可能需要更多或更少的实例。从一帧被捕获到广播到浏览器窗口的平均延迟大约为 0.9 秒,考虑到推断发生在很远的某个地方,这真是太不可思议了——这仍然让我感到惊讶。

文本识别部分可能不是最好的,但它至少证明了这一点——通过提高视频的分辨率、缩小摄像头的视野或进行微调,它可以更加准确。

至于高 GPU 数量,这可以通过优化来减少。例如,转换模型以使用混合/全半精度( FP16/BFP16 )。一般来说,让模型使用混合精度将对精度产生最小的影响,所以我们不会有太大的损失。

T4 和 V100 GPUs 具有特殊的张量核,在半精度类型的矩阵乘法上速度超快。与单精度运算相比,半精度运算在 T4 上的加速比约为 8 倍,在 V100 上为 10 倍。这是一个数量级的差异。这意味着,已经转换为使用单精度/混合精度的模型进行推理所需的时间可以减少 8 倍,而在 V100 上只需十分之一的时间。

我没有将模型转换为使用单精度/混合精度,因为这超出了本项目的范围。在我看来,这只是一个优化问题。我最有可能在cortex的版本0.14发布时这样做(具有真正的多进程支持和基于队列的自动伸缩),这样我也可以利用多进程 web 服务器。

总而言之,如果所有优化都到位,将集群的大小从 20 个配备 GPU 的实例减少到只有一个实例实际上是可行的。如果适当优化,甚至不可能最大化一个配备 GPU 的实例。

为了让成本更容易接受,在 AWS 上使用弹性推理可以减少高达 75%的成本,这是一个很大的数目!打个比方,你可以花一毛钱买一个管道来实时处理一个流。不幸的是,目前cortex还不支持弹性推理,但我可以预见在不久的将来它会得到支持,因为它已经引起了他们的注意。见票cortexlabs/cortex/issues/618。

注意:YOLOv3 和 CRNN 模型,可以通过在更大的数据集(大约 50-100k 个样本)上对它们进行微调来大大改进。在这一点上,即使帧的大小可以进一步减少,以减少数据的使用,而不会失去太多的准确性:“补偿某处,以便能够从其他地方”。这与将所有这些模型转换为使用半精度类型(以及可能的弹性推理)相结合,可以构成一个非常高效/划算的推理机。

更新一

有了支持 web 服务器多进程工作器的cortex版本0.14,我能够将yolov3 API 的 GPU 实例数量从 8 个减少到 2 个,将crnn API(在 CRNNCRAFT 模型上运行推理)的 GPU 实例数量从 12 个减少到 10 个。这实际上意味着实例总数减少了 40%,这是一个非常好的收获。所有这些实例都配备了单个 T4 GPU 和 4 个虚拟 CPU。

我发现计算最密集的模型是 CRAFT 模型,它是建立在大约 138 米重的 VGG-16 模型之上的。请记住,每一帧通常需要多个推断,因为在一个镜头中可能会有多个检测到的车牌。这大大增加了 it 的计算需求。从理论上讲, CRAFT 模型应该被淘汰,取而代之的是改进(微调)CRNN 模型,以更好地识别车牌。通过这种方式,crnn API 可以缩小很多——减少到只有 1 或 2 个实例。

更新二

其他一些可以显著降低计算成本的因素包括:

  1. 使用 TinyYOLOv3 代替 YOLOv3 。运行一个推理大约需要 12 倍的时间。运行不太复杂的模型时丢失的映射可以通过在更全面的数据集上训练模型来恢复。
  2. 使用对象跟踪来避免必须检测每一帧上的牌照。这大大减少了两个 API 所需的推理总数。目标跟踪应该在本地完成,因为它在计算上是廉价的。
  3. 此外,我们不一定需要所有类型的锚盒为约洛夫 3 。我们只需要那些符合车牌形状的。减少数字可以使推断更快。
  4. 为输入源选择更高的帧速率,并在处理时只选取第帧。例如,如果摄像机以 120 FPS 的速度运行,只需每隔 4 帧选取一帧,仍然可以得到 30 FPS。这允许更清晰/清晰的帧,从而导致更准确的预测。快速行驶的汽车是文本识别的罪魁祸首。
  5. 用 OpenALPR 代替 CRAFT + CRNN。我不完全确定这是不是一个完全好的主意,但是从我从别人那里听到的来看,这非常快。
  6. 知道发送到文本识别 API 的每一批帧都是车牌,我可以看到如何使用自动编码器来大幅度压缩图像以进行数据传输。或者如果不是这样,那么至少它们可以用来从这些帧中去除噪声。由于自动编码器运行起来通常非常便宜,我可以看到如何在 Raspberry Pi 上使用它们来预处理帧。然后它们会在 API 级别被解码。

这里的这里的、这里的、这里的或者这里的讨论了这些改进。

至于产生的 AWS 集群成本,我有以下想法:

  • 在当前配置下,运行此操作的成本约为 4.00 美元/小时。只有使用 spot 实例才有可能。
  • 假设所有的改进都到位了,成本可能会下降到 ~0.2 美分/小时。实际上,只需要大约 1%的 T4 GPU 的能力来运行这些。这也是一个非常粗略的数字。这当然可以通过运行 spot 实例来实现。

结论(以及 5G 如何融入所有这些)

我看到设备开始越来越依赖云计算,尤其是计算能力有限的边缘设备。由于 5G 目前正在部署,理论上它应该使云更接近这些计算受限的设备。因此,云的影响力应该随之增长。5G 网络越可靠,越普及,人们就越有信心将所谓的关键任务的计算转移到云上,比如无人驾驶汽车。

我从这个项目中学到的另一件事是,随着在云中部署机器学习模型的流线型平台的出现,事情变得多么容易。5 年前,这可能是一个相当大的挑战:但现在,一个人可以在相对较短的时间内做这么多。

资源

  • 3D 打印支架的所有SLDPRTs / SLDASMs / STLs / gcodes都可以在这里找到。
  • 这个项目的客户端实现可以在找到。
  • 这个项目的cortex实现在这里找到。
  • KerasYOLOv3 模型的库在这里找到。
  • 用于工艺的库文本检测器+ CRNN 文本识别器在这里找到。
  • 欧洲车牌的数据集(由我的 Pi 相机拍摄的 534 个样本组成)在这里找到。
  • Keras(license _ plate . H5)和saved model(yolov 3folder/zip)格式的 YOLOv3 模型在这里找到。

我做了一个电报机器人来对抗食物浪费——下面是我的方法

原文:https://towardsdatascience.com/i-built-a-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot-to-combat-food-wastage-heres-how-293259a1bd32?source=collection_archive---------19-----------------------

使用 python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 创建电报机器人的完整 Python 指南

elegram 机器人现在风靡一时——从让你玩游戏、寻找朋友、寻找新机器人,甚至创造新机器人的机器人——可能性是无穷无尽的。今天,我将介绍我如何构建一个电报机器人来消除食物浪费,提供一个完整的教程,从(1) 如何使用 BotFather 创建一个电报机器人,赋予它(2) 提问,(3) 接收和存储用户响应和图片,(4) 将此信息发布到公共电报频道,同时(5) 调用谷歌地图 API 来显示

代码可以在我的 Github 库这里找到。代码进一步在 Heroku 上部署了这个机器人,你可以在这里阅读我的关于我如何部署这个机器人的教程。

食物浪费——一个荒谬的问题

根据联合国粮食及农业组织(FAO)的统计,全球每年大约有 13 亿吨的食物被浪费掉,相当于所有人类消费食物的三分之一。一些常见的罪魁祸首包括自助餐,餐馆,甚至家庭,原因包括购买了太多,甚至更荒谬的是,食物看起来不好吃。

照片由 Yukiko Kanada 在 Unsplash 上拍摄

然而,与此同时,每天有 8.2 亿人挨饿。这似乎是矛盾的——我们怎么能浪费这么多食物,而同时让世界上这么多人挨饿?这归结为剩饭剩菜和需要食物的人之间缺乏沟通。当然,有慈善组织接受食物捐赠,但是在需要食物的人和有剩菜的人之间没有直接的交流。再加上令人沮丧的错综复杂的监管程序,毫不奇怪,在食品捐赠和它们真正惠及最需要的人之间存在着巨大的时间差。

考虑到这个问题,为什么不促进剩饭剩菜和需要食物的人之间的交流呢?这将有助于把那些有剩菜的人直接联系到那些需要食物的人。这样,需要食物的人可以很快收到食物,不会有任何明显的时间延误。

电报机器人简介

当然,这听起来不错,但是我们如何去实现它呢?这就是电报机器人和频道提供轻量级解决方案,将食品供应商与需要食品的人联系起来的地方。

食物供应商可以首先与电报机器人聊天,提供关于食物的关键信息,如食物的位置、饮食规格等。收集完这些信息后,机器人会将它们的食物列表发布到公众可以访问的电报频道上。一旦食物被发布在频道上,有需要的人可以简单地收集食物。所有这些都可以在没有任何明显时间延迟的情况下完成——事实上,将食品邮寄给收到信息的最终用户的整个过程只需不到 10 秒钟!

食品过账流程图解

为此,机器人将从食物海报中询问以下问题:

  1. 食物的位置。使用 Google Maps API,位置将被转换为相应的纬度和经度坐标,然后可以显示在地图上,使用户可以轻松地导航到该位置。
  2. 食物的图片。
  3. 饮食规格,即食物是否是清真的、素食的等等。
  4. 可供食用的食物数量。
  5. 食物被清除前必须收集的时间。

食物海报将回答这些问题,机器人将把这些回答汇编成一条消息。有了这个摘要消息,在发帖人确认输入的细节是正确的之后,机器人将把信息转发到公共频道。

创建你的机器人

既然我们已经了解了这个过程是如何工作的,那就让我们来看看本质的细节吧!

首先,我们将创建一个机器人。为此,通过电报向机器人父亲发送/newbot 命令。它将提示您输入 bot 的名称,后面是用户名(必须以 bot 结尾)。您可以使用/setname 命令轻松地更改 bot 的名称,但不可能通过 BotFather 更改 bot 的用户名,因此如果您不确定,可以先用随机用户名创建一个测试 bot,一旦您测试了所有功能并确保 bot 正常工作,就用您想要的用户名创建一个新 bot。

与机器人父亲的第一次交流——“一个机器人统治所有人”!

创建 bot 后,BotFather 将向您发送 bot 的 API 密钥(在“使用此令牌访问 HTTP API:”行下)。把这个 API 密匙留给你自己,因为它可能被任何拥有 API 密匙的人滥用来控制你的机器人,这是你不希望发生的!你可以向机器人之父发送一堆命令来定制你的机器人,包括改变机器人的描述,它的简介图片等等,这些都是不言自明的,所以我会让你在官方电报文档上阅读它。

使用 python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 与机器人交互

已经创建了我们的机器人,是时候给它一些额外的功能了!由于目标是创建一个与食物海报交互的机器人,该机器人必须能够向海报发送问题,以提示所需的信息,然后在转发到公共频道之前存储这些信息。为此,我们可以使用一个非常方便的 python 包装器, python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 。Github 页面提供了许多使用该包装器编写的机器人示例,所以请查看该页面,看看是否有满足您的用例的示例!

首先,我们将安装所需的软件包。因为我们调用 Google Maps API 来提供食物位置的地图,所以我们还将安装 googlemaps python 包。如果你不想使用谷歌地图,你可以跳过这个包的安装。

在终端/命令提示符下,键入以下命令来安装这两个库:

pip install python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot # using version 12.7
pip install googlemaps # using version 4.3.1

现在我们已经安装了这两个库,让我们开始研究代码吧!下面是代码(以防你想直接跳到它),我将在下面详细介绍。

电报机器人的完整代码,包括调用谷歌地图 API

首先,我们导入相关的库:

import logging
import 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨
from 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 import (ReplyKeyboardMarkup, ReplyKeyboardRemove)
from 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨.ext import (Updater, CommandHandler, MessageHandler,  Filters, ConversationHandler)
from googlemaps import Client as GoogleMaps

我们正在导入日志记录,以显示用户在终端中与机器人交互时的日志消息,以及 python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 下的各种模块。我们也在导入谷歌地图,在地图上显示食物的位置。

接下来,我们配置日志记录设置如下:

# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) 
logger = logging.getLogger(__name__)

接下来,我们定义六个状态,这六个状态决定了机器人将提出的问题:食物的位置、照片、饮食规格、份数、领取食物的时间,以及与海报的确认。

LOCATION, PHOTO, DIET, SERVINGS, TIME, CONFIRMATION = range(6)

对于确认,将有一个回复键盘,用户将能够选择两个选项:确认信息是正确的或重新开始整个过程。

确认并重启按钮

因此,我们使用 python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 模块中的 ReplyKeyboardMarkup 模块指定了这两个选项,代码如下:

reply_keyboard = [['Confirm', 'Restart']]
markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)

之后,我们指定一些变量,包括你的 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 bot 的 API(你从 BotFather 获得的),以及 Google Maps 的 API。

为了获得谷歌地图应用编程接口,你需要一个谷歌云平台账户。创建帐户后(会有免费的信用点数,所以只要你不超过限额,这应该是免费的),转到谷歌云平台控制台并执行以下操作:

  1. 在搜索栏中搜索 API &服务
  2. 点击搜索栏正下方的蓝色加号按钮启用 API 和服务
  3. 搜索地理编码 API 并启用。
  4. API &服务下,转到凭证并选择创建凭证 > API 密钥

将会生成一个 API 密钥,所以只需复制这个密钥。这将是您的谷歌地图 API 令牌。再说一遍,保管好这个!地理编码 API 提供了 200 美元的免费积分,这应该足够满足您的需求了。

TOKEN = 'YOUR丨t丨e丨l丨e丨g丨r丨a丨m丨s丨BOTTOKEN'
bot = 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨.Bot(token=TOKEN) GMAPSAPI = 'YOURGOOGLEMAPSAPITOKEN'
gmaps = GoogleMaps(GMAPSAPI)

现在我们已经定义了变量,让我们深入研究代码的实际部分!首先,我们定义一个函数来总结食物海报提供的信息,如下所示:

def facts_to_str(user_data):
    facts = list()
    for key, value in user_data.items():
        facts.append('{} - {}'.format(key, value))
    return "\n".join(facts).join(['\n', '\n'])

当这个函数被调用时,它将以 key-value 的格式返回信息(例如,饮食规范- Halal)。

接下来,我们定义当用户启动机器人时会发生什么。这是通过使用命令/start 来完成的(它的工作方式类似于您使用命令/newbot 和 BotFather 来创建您的 bot)。当海报启动 bot 时,我们希望 bot 问候用户并提示他发送食物的位置,因此我们将 start 定义如下:

def start(update, context):
    update.message.reply_text("Hi! I am your posting assistant to help you advertise your leftover food to reduce food waste. To start, please type the location of the leftover food.")
    return LOCATION

前一个函数返回 LOCATION,这是下一个函数,因为 bot 将存储用户提供的位置,以便在最后创建一个摘要。在函数 location 中,代码做了几件事:首先,它告诉机器人有一条来自用户的新消息,然后它将用户提供的信息存储在键“location”下,以便以后打印摘要时参考。接下来,记录器将记录用于调试目的的信息,以防出错。最后,机器人会回复一条信息,要求提供食物的照片。然后,函数返回 PHOTO,这是下一个函数。

def location(update, context):
    user = update.message.from_user
    user_data = context.user_data
    category = 'Location'
    text = update.message.text
    user_data[category] = text
    logger.info("Location of %s: %s", user.first_name, update.message.text)
    update.message.reply_text('I see! Please send a photo of the leftovers, so users will know how the food looks like, or send /skip if you don\'t want to.')
     return PHOTO

在下一个函数中,用户有两个选择:要么给食物拍照并发送给机器人,要么如果没有准备好图像就跳过。

def photo(update, context):
    user = update.message.from_user
    photo_file = update.message.photo[-1].get_file()
    photo_file.download('user_photo.jpg')
    logger.info("Photo of %s: %s", user.first_name, 'user_photo.jpg')
    update.message.reply_text('Great! Is the food halal? Vegetarian? Please type in the dietary specifications of the food.')
     return DIET def skip_photo(update, context):
    user = update.message.from_user
    logger.info("User %s did not send a photo.", user.first_name)
    update.message.reply_text('Is the food halal? Vegetarian? Please type in the dietary specifications of the food.')
    return DIET

同样,机器人首先接收来自用户的消息,然后从用户那里获取照片文件,然后保存为 user_photo.jpg。然后,记录器记录信息,机器人用下一个关于食物饮食规格的问题进行响应。

下面几行遵循和以前一样的结构,因为机器人询问饮食规格、份数、收集食物的时间。您会注意到相同的结构:机器人首先接收来自用户的消息,然后将用户响应存储在 user_data 中,接着进行日志记录,然后机器人做出响应,提示用户下一个问题。

def diet(update, context):
    user = update.message.from_user
    user_data = context.user_data
    category = 'Dietary Specifications'
    text = update.message.text
    user_data[category] = text
    logger.info("Dietary Specification of food: %s", update.message.text)
    update.message.reply_text('How many servings are there?')
    return SERVINGS def servings(update, context):
    user = update.message.from_user
    user_data = context.user_data
    category = 'Number of Servings'
    text = update.message.text
    user_data[category] = text
    logger.info("Number of servings: %s", update.message.text)    update.message.reply_text('What time will the food be available until?')
     return TIMEdef time(update, context):
    user = update.message.from_user
    user_data = context.user_data
    category = 'Time to Take Food By'
    text = update.message.text
    user_data[category] = text
    logger.info("Time to Take Food By: %s", update.message.text) 
    update.message.reply_text("Thank you for providing the information! Please check the information is correct:{}".format(facts_to_str(user_data)), reply_markup=markup)
    return CONFIRMATION

从海报中获得所有必要的信息后,是时候总结信息并与海报进行确认了。首先,机器人合并信息,然后使用我们在上面定义的函数 facts_to_str(用户 _ 数据)发出摘要。

如果用户选择“确认”,机器人会将信息转发到公共频道。bot.send_photo 的 chat_id 参数代表频道的链接。

def confirmation(update, context):
    user_data = context.user_data
    user = update.message.from_user
    update.message.reply_text("Thank you! I will post the information on the channel now.", reply_markup=ReplyKeyboardRemove())
    bot.send_photo(chat_id='@nameofchannel', photo=open('user_photo.jpg', 'rb'), caption="<b>Food is Available!</b> Check the details below: \n {}".format(facts_to_str(user_data)) +  "\n For more information, message the poster {}".format(user.name), parse_mode=丨t丨e丨l丨e丨g丨r丨a丨m丨s丨.ParseMode.HTML) geocode_result = gmaps.geocode(user_data['Location'])
    lat = geocode_result[0]['geometry']['location'] ['lat']
    lng = geocode_result[0]['geometry']['location']['lng']
    bot.send_location(chat_id='@nameofchannel', latitude=lat, longitude=lng)

此外,我们现在调用谷歌地图来精确定位海报提供的确切位置。当用户回答关于位置的第一个问题时,位置已经存储在 user_data['Location']中,所以现在我们将使用 google maps 提取位置的纬度和经度。有了这些信息,机器人将位置和地图一起发送到由 @nameofchannel 指定的频道。

bot 在公共频道上发布的消息;自助餐图片摘自https://my fave . com/johor-Bahru/V8-hotel-johor-Bahru-V8-hotel-johor-Bahru-晚餐-自助餐-1 人份-成人-64925

以下是一些帮助功能,以防用户取消与机器人的对话或出现错误:

def cancel(update, context):
    user = update.message.from_user
    logger.info("User %s canceled the conversation.", user.first_name)
    update.message.reply_text('Bye! Hope to see you again next time.', reply_markup=ReplyKeyboardRemove())
     return ConversationHandler.ENDdef error(update, context):
    """Log Errors caused by Updates."""
    logger.warning('Update "%s" caused error "%s"', update, context.error)

我们到了代码的最后一段!这里,代码定义了机器人应该为六种状态中的每一种状态做什么。最后,我们开始投票,这基本上使我们能够从海报中获取信息。python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 的 Github wiki 在解释这里的代码方面做得更好,所以如果你不确定每一行是做什么的,一定要检查一下!

def main():
    updater = Updater(TOKEN, use_context=True)
     # Get the dispatcher to register handlers
    dp = updater.dispatcher
     # Add conversation handler with the states LOCATION, PHOTO, DIET, SERVINGS, TIME and DONE
    conv_handler = ConversationHandler(entry_points=[CommandHandler('start', start)],states={            
LOCATION: [MessageHandler(Filters.text, location)],             PHOTO: [MessageHandler(Filters.photo, photo),                             CommandHandler('skip', skip_photo)],             
DIET: [MessageHandler(Filters.text, location)],             
SERVINGS: [MessageHandler(Filters.text, bio)],             
TIME: [MessageHandler(Filters.text, time)],             
CONFIRMATION: [MessageHandler(Filters.regex('^Confirm$'), done),            MessageHandler(Filters.regex('^Restart$'), start)]        },         fallbacks=[CommandHandler('cancel', cancel), CommandHandler('start', start)]    )
    dp.add_handler(conv_handler)     # log all errors
    dp.add_error_handler(error) # start the bot
    updater.start_polling() # Run the bot until you press Ctrl-C  
    updater.idle() if __name__ == '__main__':
    main()

要启动您的 bot,只需进入终端/命令提示符并执行 python 文件。执行完文件后,进入 bot 并键入/start。你的机器人应该响应并问你上面编码的问题!当您响应时,您还应该看到出现以下日志:

记录在命令行中看到的张贴者的响应

原来如此!如果你想看看我创建的机器人,你可以在 @foodrescuerbot 找到它。公共频道的链接是 https://t.me/foodrescuers 的。

试试这个!我希望你能从中得到乐趣,并告诉我进展如何!如果你需要任何澄清,请随时提问。让我们都三思而后行,我们是否可以在购买之前吃完食物,并努力减少食物浪费~

如果你正在寻找免费的 部署机器人 ,请点击这里的获取一个关于如何在本地成功运行机器人后在 Heroku 上部署机器人的教程。

我建了一个网站来可视化冠状病毒

原文:https://towardsdatascience.com/i-built-a-website-to-visualize-coronavirus-a367b8140871?source=collection_archive---------66-----------------------

展示冠状病毒趋势、统计数据和新闻的交互式 Covid19 仪表板

粘土银行在 Unsplash 拍摄的照片

大家好,
我希望每个人都尽自己的一份力量呆在家里,保持健康。我们再次被放回野外只是时间问题,一线工人可以放松一下了。

当呆在家里时,我明白事情似乎有点模糊不清。我们不确定外面发生了什么,这感觉就像生活在岩石下。你很幸运,我在这里为你提供完美的解决方案。一个冠状病毒网站。

来自tenor.com的 gif

我创建了一个互动网站,跟踪全球冠状病毒的统计趋势新闻。该网站每 30 分钟更新一次,为其浏览器保持几乎实时状态。它具有流畅的用户体验,非常适合你监控你的国家发生了什么,等等。

[## 电晕病毒 Covid19 交互式仪表板

电晕趋势提供最新的趋势,新闻和数据可视化的死亡,感染和恢复的情况下,由于…

corona-trend.com](http://corona-trend.com/)

在这篇文章中,我将谈谈我为什么建立网站。我将谈论它背后的动机,我决定在它里面包括什么,以及我在每件事情背后的思考过程。这是为了与你们分享我的旅程,也许会激励你们做得更好。开始了。

问题是

奥拉夫·阿伦斯·罗特内在 Unsplash 上拍摄的照片

已经有一些网站和我的网站有着相似的目的。你可能熟悉像 Worldometers世卫组织冠状仪表板 这样的网站,它们在显示冠状病毒的当前数据方面做得很好。

这些网站的问题是它们提供了冠状病毒现状的全球视角。这很好,但是有些用户只对某个国家的数据感兴趣。通常,当我寻找关于冠状病毒的数据时,我发现自己在搜索一个特定的国家,以真正了解该国是如何恢复的。

据谷歌首席执行官桑德尔·皮帅在的一篇帖子称,冠状病毒搜索结果将被改变。谷歌努力展示与政府等机构相关的搜索结果。因此,在搜索冠状病毒时,像 这样的网站会频繁出现。

冠状病毒搜索结果截图

我知道一些网站使用地理布局来展示全世界冠状病毒的规模。然而,很多时候,我们甚至不知道自己感兴趣的国家在世界地图上的位置,找起来很麻烦。

例如,我们都读过关于冠状病毒如何在美国传播的新闻。知道了这一点,我去任何网站寻找冠状病毒在美国的统计数据,但还没有找到一个流畅的体验。

worldometers.com

我也对我的国家的具体表现感兴趣。我住在马来西亚,目前处于运动控制令中。这里的政府已经一周又一周地延长了这个命令,没有人知道这什么时候会结束。话虽如此,我发现自己经常查找关于马来西亚的数据,这在一些网站上很难找到。

解决方案

照片由 NeONBRAND 在 Unsplash 上拍摄

在多次搜索特定的国家之后,我想为什么不自己做点东西呢。一个冠状病毒仪表板,允许用户获得全球视图,并能够顺利地深入到特定国家的数据。

该网站采用了简单的设计,用多种颜色来代表新病例、死亡和康复。用户能够清楚地查找全球数据,也能够搜索感兴趣的国家。表格、图表和数字会根据用户指定的国家自动更新

**【corona-trend.com **

我发现自己刚刚进入网站,搜索马来西亚日报。通过观察趋势和数字,我对马来西亚的复苏情况有了很好的了解。为了好玩,我把新加坡和菲律宾等邻国包括进来,以比较我们的复苏情况。看起来马来西亚并没有那么糟糕。

布局

这是我对冠状病毒互动网站的看法。这可能并不适合所有人,所以如果你不好意思留下反馈或发邮件给我,请随意。

共有 3 页:

  • 登录页面
  • 统计页面
  • 趋势和新闻页面

登录页面

corona-trend.com

登陆页面显示 3 个数字。总病例数、死亡数和痊愈数。
它们的意思与它们所显示的完全一样,即全球范围内冠状病毒导致的总病例数、死亡人数和康复人数。这是全球冠状病毒情况的一瞥。

统计页面

corona-trend.com

这就是有趣的地方。该页面以一种有组织的方式向您展示了几乎所有您需要知道的数据,同时在顶部有一个搜索栏。输入你感兴趣的国家,页面会随之改变。****

趋势和新闻页面

趋势部分提供了关于各国如何复苏的见解。有 3 个主要图表通过搜索栏更新来显示这一点,但我想强调一下新案例与新恢复图表。如果绿色持续高于读数,这意味着你选择的国家(默认为全球)正在走向全面复苏。

corona-trend.com

根据另外两个图表,你可以大致猜测你的国家将在多长时间内开始运转。我每天都追踪这个,以估计我什么时候可以去理发。

来自 romainlaurent 的 gif

新闻版块是一个不错的版块,展示了所有关于冠状病毒的最新消息。它是从 Reddit 的一个名为“冠状病毒”的子论坛上刮下来的,这个子论坛展示了来自著名来源的新闻,如 BBC卫报

在幕后

在后端,有每 30 分钟更新一次网站的代码。该代码从 Covid19api.com、世卫组织、Reddit 等来源收集最新数据,以填充图表、表格和新闻。这是为了确保用户在浏览网站时获得最新的数据。

动机

克拉克·蒂布斯在 Unsplash 上拍摄的照片

企业家精神

我是千禧一代。我们都有内在的企业家精神。
我很自豪地说,这个项目
极大地满足了我内心的企业家精神。****

通常,像我这样的年轻人并不真正知道生产一个可用的数字产品是什么感觉。我们中的一些人认为这只是代码。我处理网站从设计,前端和后端,产品,部署和营销的一切。这对我来说是一次很好的经历,我很自豪地说,我从这次经历中学到了很多。

这个网站已经开通快一周了,已经收集了大约 5000 个会话。我积极地从用户那里寻求反馈来改进我的网站。我了解到不同的目标受众对某个产品有不同的看法,我需要考虑这些来改进我的网站。

就拿我爸妈来说吧,他们其实不太会看数据。他们不能真正翻译图表。因此,他们发现这个网站非常令人困惑。另一方面,我的同事发现这个网站非常有用。他们还提到颜色在表现不同的统计数据方面做得很好。

来自 warnerarchive 的 gif

作为产品负责人,这帮助我确认了我的目标受众。它还为我提供了关于不同用户如何看待我的产品的宝贵反馈,以及我如何为每个人改进它。

提供价值

该网站的主要目标从来不是赚钱,而是提供价值。我发现了一个问题,并认为如果我能为某人解决这个问题,他们会发现这个问题是有价值的。

如果我从这个网站赚了一点钱,那很酷。然而,这不是我的主要目标。有比提供一个没有广告的免费网站更好的商业模式。

简单地说,这是我第一次通过解决一个我认为很多人都面临的问题来提供价值。不管那是不是真的,我们很快就会知道了。

建造一些很酷的东西

我的职业是数据科学家/数据工程师。我一直想做一些很酷的东西。这个网站只是一个开始。

照片由克莱门特·H在 Unsplash 上拍摄

通过为网站写所有的代码,我学到了很多关于前端和后端如何工作的知识。我学到了新的框架,如何通过我的代码优化页面加载速度和移动响应。

有趣的事实:当我最初完成这个网站时,它几乎花了 20 多秒来加载,这是完全不能接受的。现在,平均大约需要3-5 秒

我将在网站上发表一篇关于技术细节的文章,你们中的一些人可能会对此感兴趣。

未来

**[## 电晕病毒 Covid19 交互式仪表板

电晕趋势提供最新的趋势,新闻和数据可视化的死亡,感染和恢复的情况下,由于…

corona-trend.com](http://corona-trend.com/)**

这就差不多概括了。以上是链接再次链接到我的网站。看看它,告诉我它对你是否有用。如果你认为这对你亲近的人有帮助,就和他们分享吧。

我希望这本书对你来说是有趣的/鼓舞人心的。我在制作这个网站的时候玩得很开心,我希望你在使用它的时候也玩得开心。

在你走之前

我们的旅程还没结束。请继续关注,我正在网站上写关于技术细节的文章。与此同时,请随意查看我的其他文章来暂时填补您对数据的渴望。

像往常一样,我引用一句话作为结束。

当你认为一件事足够重要时,即使成功希望渺茫你也会去做。——埃隆·马斯克

订阅我的时事通讯,保持联系。

感谢 的阅读!如果你想与我取得联系,请随时通过 nickmydata@gmail.com 或我的 LinkedIn 个人资料 联系我。也可以在我的Github中查看之前写的代码。

我不能在 10 天内教你数据科学

原文:https://towardsdatascience.com/i-cant-teach-you-data-science-in-10-days-f3beeb099b60?source=collection_archive---------27-----------------------

理解数据科学空间中的实体和需求的案例研究方法

“大约四年半以前,我一直在努力理解数据科学的整个概念。来自一个非统计学背景的人,我怀疑、担心,更重要的是,我令人讨厌。我怀疑自己是否能在一个我认为是数据密集型的行业中生存下去。但我现在仍然在风中航行,同时也学到了一些技能。我不会教你数据科学,因为我还在学习。但我会告诉你我与穆适马和诺华合作的经历,从零开始,设法爬上阶梯,缓慢而稳定"

我总是听到很多关于什么构成数据科学项目的问题?是否有多个交叉功能组合在一起形成了这个更广泛的范围?一个非计算机专业或者非统计学背景的人能进入这个行业吗?多个实体联合起来形成一个数据科学组。角色和职责通常是预先定义好的,需要统一的工作方式来实现更大的目标。这篇文章的唯一目的是让你对这些实体有所了解,并帮助你选择一个轨道,而不是跳进一个在线课程。

让我举一个例子来解释不同实体之间的交互。一家大型药房零售商(一家销售药品的公司)正计划扩大其市场并提高收入。作为该过程的一部分,他们决定与医生交谈,并让他们了解患者在访问他们的药房时将获得的所有好处。好处可能是在专业护理、折扣、减少排队或等待时间、药品供应、更顺畅的保险索赔过程等方面。这一过程通常被称为【医师定位】。现在,为了启动这一计划,分析主管决定将所有四个团队召集在一起。

业务分析师的角色

在这个项目中,业务分析师需要与不同的利益相关者互动,如品牌负责人、药剂师、商店经理、销售代表,并了解市场如何运作。这将有助于他们考虑所有可能的关键绩效指标(KPI),并使用它们来确定需要针对的医生的优先级。

比方说,业务分析师确定患者数量(就诊患者总数)、脚本(开出的处方)、医生专业(,比如医生是否是神经科医生、心脏病专家、家庭医生等。)、患者人口统计(住在药店周围的人,他们的年龄、收入、病史) &竞争对手市场(收入,竞争对手药店产生的患者量)作为一些 KPI。现在,他们将把数据需求传递给数据分析师团队。然而,业务分析师的角色不止于此。他们需要创建关于初始市场趋势的报告,以及按医师专业、地理位置等分类的患者和脚本量等摘要。一旦他们收到数据。

对业务分析师的要求

  • 了解医疗保健系统如何运作
  • 分析思维,能够识别不同的问题领域、导致这些领域的可能因素,更重要的是质疑每个假设、趋势和商业数据的关键方法
  • 基本统计概念,如描述性统计(均值、中值、众数和何时使用它们)、相关性、假设和显著性检验(z 检验和 t 检验)。Excel 具有执行这些任务的所有内置函数。业务分析师应该能够解释结果,并使用它们来支持他们的发现和见解
  • 有使用 ETL 工具的实践经验——SQL、Python、R、SAS 或 Alteryx (SQL 是一种可以跨多个平台使用的编程语言)。大多数拥有大量数据的大型企业主要在 SQL 上运行
  • excel——公式、数据透视表和图表、切片器、VBA(有助于自动化)
  • powerpoint
  • 向更大的群体展示发现和见解的有效沟通技巧

数据分析师的角色

我认为数据分析师在任何决策周期链中都扮演着最关键的角色。两个原因。“首先,它们是确保数据以结构化和随时可用的方式获取、转换和存储的关键杠杆。第二,大多数组织都有大量的数据,需要时间和技能才能处理成有用的形式”。在上面的例子中,一次,业务分析师传递数据需求,数据分析师致力于采购、清理和集成数据到组织的专用存储区域,供不同的业务单位访问。

药店零售商会产生大量的交易数据,这些数据以未经处理的形式存储在他们自己的数据库中。此类数据集将包含与医生、患者、商店、药品等相关的信息。现在,数据分析师的目标是处理这些数据,添加来自其他相关表格的必要信息,并创建所谓的 分析数据集 ADS。广告在任何分析行业都是一个关键概念。由于多个业务部门最终会处理相似的数据集,因此创建一个单一真实来源以确保整个组织内报告的数字的一致性非常重要。此外,很多时候,组织从第三方供应商处获取数据,例如竞争对手的数据。数据分析师负责确保此类数据库在公司系统中的简化集成。

对数据分析师的要求

  • 对关系数据库管理系统有透彻的理解
  • 彻底理解数据集、它们包含的信息、它们的级别(主键和外键)等等
  • 必须有使用 SQL、SAS 或任何其他 ETL 工具的实践经验
  • 良好的统计学知识,以防大量数据清理需要完成。需要了解与缺失值处理相关的技术,如均值、中值、众数等基本技术,以及 K 近邻、空间聚类和 K 均值等高级技术
  • SAS 有运行描述性统计和聚类算法的内置函数,但是在整个数据预处理都是在 SQL 中完成的情况下,了解 R 或 Python 中的一个是很重要的

高级分析师的角色

一旦数据分析师完成了数据准备,业务分析师进行了一些初步的深入研究,高级分析师(也称为数据科学家)将被要求运行细分模型,以确定其销售代表可以瞄准的高机会医师群。所有可能的推荐变量列表将提供给高级分析师,高级分析师将根据这些变量运行模型并产生最终建议。

在这个用例中,一旦生成了患者、HCP、脚本、竞争对手级别的数据集,业务分析师将对现有业务场景在不同地理区域的表现进行基本概述。将推荐一个高机会地理位置列表,高级分析师将根据该列表运行他们的模型并创建最终推荐列表。

高级分析师的要求

  • 深入了解机器学习技术,最重要的是算法及其背后的数学。我们经常忽略线性回归、逻辑回归、决策树或神经网络的概念,因为大多数平台提供的功能可以在一段时间内产生结果。然而,了解数学知识可以让你对数据进行切片和切块,以获得想要的结果
  • 通常,任何建模练习的结果都不会像您在大多数教程中看到的那样。有时很难解释结果并从中获得商业意义,因此一些市场商业敏锐度是有用的
  • 使用 SAS、R 或 Python 的实践经验
  • 商业利益相关者不太熟悉统计学,因此需要良好的沟通技巧来将 theta 值转化为商业行动

可视化分析师的角色

一个可视化的分析师在计划展开后开始描绘项目的后期。一旦销售代表开始瞄准医生,就该进行一些影响评估了,还有什么比创建一个在一个地方跟踪每个绩效指标的仪表板更好的呢?

如今,大多数组织都在避免各自为政。因此,以前涉及不同业务单位的多个报告的趋势正在减缓锚定到某种 360 度仪表板中。因此,可视化分析师很受欢迎,因为他们知道如何创建最好的仪表板。在这种情况下,一旦业务部门决定跟踪他们的 ROI (投资回报),他们就会要求可视化分析师创建一个仪表板,以粒度形式显示摘要。

[## 现代分析的黎明——了解商业智能的一些最新趋势…

基于调查的方法来确定每个数据科学家都应该知道的 BI 工具

medium.com](https://medium.com/@angeleastbengal/the-dawn-of-modern-analytics-a-look-into-some-of-the-recent-trends-of-business-intelligence-fc12cdf41cae)

可视化专家的要求

  • 对以下 Power BI、Tableau 或 Qlik Sense(有时是 HTML)之一有透彻的了解
  • Tableau 目前统治着市场,但组织也在慢慢采用 Qlik Sense。 Qlik Sense 被认为是一个具有 ETL 功能和更快数据处理速度的自助式仪表盘自助式仪表板被定义为一个平台,非可视化专家只需拖放即可创建摘要、图表、过滤器等。QVD 或 Qlikview 数据处理时间更短,并且驻留在 Qlik 架构中,确保易于维护

既然你已经知道不同的实体是如何运作的,我建议你思考你感兴趣的东西,并相应地选择一个在线课程,而不是直接跳到任何在线课程。如果你想了解数据科学行业的历史和未来的详细信息,你可以阅读大卫·多诺霍 的这篇文章 《数据科学 50 年》。

我创造了一个深度学习驱动的不和谐机器人来和 smily 反应😎

原文:https://towardsdatascience.com/i-created-a-deep-learning-powered-discord-bot-to-react-with-smily-fec831d30d1b?source=collection_archive---------37-----------------------

检测信息的情绪、情感和讽刺,并以适当的微笑回复。

和我的同事一起微笑

动机

我最近看了很多论文,大部分是关于深度学习的,RNN,CNN,LSTM[1],Transformer(注意力是你需要的全部)[3],BERT 等等。这个名单只会越来越长。但是学习任何东西的最好方法是体验它。此外,如果我用我的脸部署一个机器人,在我的办公室服务器上,它有时可以在我忙于阅读时为我提供代理。😜开玩笑的。作为一个有经验的软件开发人员,这只是一种实现新知识的冲动。

但是有一些很大的障碍。我上哪去弄这么多数据来训练一个神经网络?即使我管理数据,我也需要一台高保真配置的机器,或者至少需要一个强大的 GPU 来用数据训练我的模型。但是,有志者事竟成。🤓经过一番研究我发现, DeepMoji 🧙🏻‍♂️.我们可以使用像 DeepMoji 这样的预训练模型来实现我们的机器人。现在,在一个预先训练好的模型上工作,并根据需要使它变得更好是一种常见的做法。

对我来说,这是一个制作不和谐机器人(因为我的办公室交流是不和谐的)的绝佳机会,也是体验 NLP 过程如何使用各种 LSTM 和注意力机制的绝佳机会。这个机器人可以监听所有正在接收的消息,并用表情符号做出反应。

DeepMoji

DeepMoji 是建立在 Keras 上的模型,后端在 Tensorflow 上。Deepmoji 基于这篇由 Bjarke Felbo、Alan Mislove、Anders sgaard、Iyad Rahwan 和 Sune Lehmann 开发的论文。

本文表明,通过将远程监督扩展到更多样化的噪声标签集,模型可以学习更丰富的表示。通过对包含 64 种常见表情符号之一的 12 亿条推文数据集进行表情符号预测,他们使用单一预训练模型在情绪、情感和讽刺检测的 8 个基准数据集上获得了最先进的性能。

火炬手

TorchMoji 是由 huggingface 构建的 DeepMoji 模型的 pyTorch 实现。DeepMoji 构建在 python 2.7 之上。所以我们将使用 TochMoji,它是 python3 中的一个实现。所以我们将使用 torchmoji 来实现。

设置

对我来说,这次旅程中最紧张的部分是准备工作。因为我找不到任何合适的例子来在项目中实现 torchMoji。所有的例子都是在 jupyter 笔记本中使用的测试用例。但是我特别感兴趣的是使用我的 VS 代码在一个项目中实现它,这样我就可以用我的 discord BOT 连接它,并从那里发送响应。

这里可以看到我的完整代码:
https://github . com/anuragbhattacharjee/discord-NLP-smily-bot/

***在 github 库上给予⭐️之星帮助我们共同成长。你将获得项目的所有更新,我将获得更新项目的灵感。

那我们开始吧。

1.设置不和谐机器人

设置不和谐机器人很简单。导航至应用页面。创建一个应用程序,然后在您的应用程序下创建一个 bot。

创建机器人后,您将看到机器人的几个设置。您将需要在您的 BOT 设置下使用“BOT Token”来从您的代码连接它。

如果你进入 OAuth2 设置,你可以创建一个需要权限的链接,通过点击链接,一个不和谐的服务器所有者可以将机器人添加到他们的服务器。出于测试目的,我为自己创建了一个服务器,并在我的办公室服务器上测试之前先添加了 bot。

此时,您应该看到机器人已经加入到您的服务器中。但是离线了。因为我们还没有把它和我们的代码联系起来,赋予它生命。🤖❤

如果您在创建 discord bot 时遇到任何问题,请遵循以下链接中的详细可视步骤:

[## 创建 Bot 帐户- discord.py 1.4.0a 文档

为了使用这个库和 Discord API,我们必须首先创建一个 Discord Bot 帐户。正在创建…

discordpy.readthedocs.io](https://discordpy.readthedocs.io/en/latest/discord.html)

2.设置 python 环境

我在这里呆了很长时间。因为火炬手说要用康达来酝酿项目。但是当我试图下载所有的依赖项时,遇到了一系列的错误。

虽然你可以使用任何你喜欢的环境管理工具(conda/venv),你只需要知道如何使用它。Conda 在数据科学中使用时最受青睐,因为它们可以一次性设置所有需要的环境包。哪个更容易。但是我认为 Venv 更灵活。

不管怎样,经过几次反复试验失败后,我终于找到了一种方法。我下载了 torchMoji 项目,并在我的项目中作为一个包使用。我使用 venv 进行环境管理。你可以跟着我的 github repo 进行设置。https://github . com/anuragbhattacharjee/discord-NLP-smily-bot/

3.测试预测

设置完成后。现在是做一些测试的时候了。我必须对 torchMoji 库进行一些修改,以便在我的代码模块中正常工作。

现在编写一个代码来使用 torchMoji 来预测微笑是非常简单的:

我们可以通过在终端中运行来测试它

python3>>> from emojize import Emojize
>>> e = Emojize()
>>> e.predict("I am doing great today!")
:smile:

4.连接到不和谐机器人

这就是乐趣的开始。在您的项目设置好之后,现在是时候连接到您的 bot 并进行一些测试了。

要连接到 discord,我们需要安装 discord.py 包,如果您安装了 requirements.txt,那么这个包应该已经安装了。

现在要连接到不和谐机器人,我们需要做一个。env 文件并将我们的密钥放在。env 文件作为 DISCORD_TOKEN。我制作了一个 env.demo 文件,并把它放在我的 git repo 中,这样你就可以使用它了。😁

设置好令牌后,我们可以连接到discord.Client()并监听客户端的几个事件。

我做了一个简单的实现,只需发送一个 smily 消息并对所有消息做出反应。但是我们可以通过检查消息来让它变得更聪明,如果我被提到了,或者如果消息中有我的名字,只是为了让它更人性化,因为什么样的开发者会回复帖子中的每一条消息。🤷🏻‍♂️

但是我会根据您的需要来实现它。如果需要,不要忘记分叉和启动回购。

以下是您可以使用的不一致事件的详细信息:

[## API 参考- discord.py 1.4.0a 文档

以下部分概述了 discord.py 的 API。请注意,该模块使用 Python 日志记录模块来记录诊断…

discordpy.readthedocs.io](https://discordpy.readthedocs.io/en/latest/api.html#event-reference)

参考资料:

[1] 长 SHORT􏰀-TERM 记忆
作者 Hochreiter 和 Schmidhuber,1997;苏茨基弗等人,https://www.bioinf.jku.at/publications/older/2604.pdf2014􏰅􏰊􏰊􏰈

[2] 使用数百万个表情符号来学习任何领域的表达,以检测情绪、情感和讽刺
作者:比亚克·费尔博、艾伦·米斯洛夫、安德斯·索加德、伊亚德·拉万、苏内·莱曼
https://arxiv.org/abs/1708.00524

阿希什·瓦斯瓦尼、诺姆·沙泽尔、尼基·帕尔马、雅各布·乌兹科雷特、莱昂·琼斯、艾丹·戈麦斯、卢卡斯·凯泽、伊利亚·波洛舒欣
、T4

【4】deep moji
https://github.com/bfelbo/DeepMoji

https://github.com/huggingface/torchMoji

我希望你喜欢这个博客。这是我正在写的关于 NLP 的几个主题的系列的第二个故事。如果你想看更多我的博客,你可以在这里关注我。

我是阿努拉格。从 2014 年开始专业从事软件工程师工作。我目前正在为我现在的雇主做一个 NLU 微服务。最近,我正在研究论文,以了解更多关于自然语言处理。在我的空闲时间,我喜欢开发简单有用的网络和移动应用程序。您可以在此与我联系:

🔗https://www.linkedin.com/in/anuragbhattacharjee/t20】🕸http://anuragbhattacharjee.com

快乐编码😀

阿努拉格·巴塔查尔吉

我设计了一个人工智能系统,可以预测“学术不诚实”,准确率很低

原文:https://towardsdatascience.com/i-designed-an-ai-system-that-can-predict-academic-dishonesty-with-marginal-accuracy-daf165426aed?source=collection_archive---------47-----------------------

AIEMS 项目

第一章

未来的虚拟现实辅助课堂【照片由克里斯蒂安·弗瑞格南在Unsplash上拍摄】

标识 AIEMS(人工智能教育监控系统)

项目名称:“AIEMS(人工智能教育监控系统):网络教育高级人工智能(AI)监控与反馈系统开发”

第一章

智慧课堂与人工智能技术

作为一名电气工程专业的研究生,我喜欢接受挑战,接受不同的项目来帮助解决现实世界的问题。随着新冠肺炎的实施,有几个机构转向了在线教育,因为该平台在疫情期间既方便又安全。然而,尽管在线教学有许多优点,但该系统仍然缺乏“强大”的基础设施来应对面对面的传统课堂所带来的挑战。

据预测,未来 5 年,在线教育可能达到 3250 亿美元

1.1 面对面和在线课堂教学的挑战

1 个性化及其对学习能力的影响长期以来一直是人们感兴趣的焦点[1]。然而,仅在美国;由于课堂人数的巨大差异,一个教育工作者在计划他们的课程时很难遵循一个【标准技术】【2】。有各种因素可以解释学习过程的有效性[3,4]。作为一名研究生助教,我有过直接教学和与学生一起工作的经验,我意识到学生的范围和确保优质教育是一个挑战。问卷经常被用作预测个人学习风格的工具[5–8]。学习分析,包括收集、分析和使用这些数据[9],也被认为可以改善学生的学习体验。然而,在大多数情况下,这些评估特别用于概括一个班级群体的整体学习模式,而不是利用它们来称赞任何一个学生的学习风格。

除了学习风格的要素之外,一个重要的标准是学术评估并确保其完整性。根据发表在学术和商业伦理杂志上的一项研究,强调了在线教育者努力确保在线学生成绩的完整性。挑战包括:(一)确保注册学生参加考试并上交作业。(ii)个人作业在提交过程中不会受到影响。

在线记录和现场监督是最近几个学期大多数教师采用的各种方法,以确保在线评估的完整性。然而,当学生在他们的方法中变得有创造性时,有效地监控就变得困难了。因此,人工智能驱动的监考可能更有效,并有助于机构教育的整体质量。

3 博尔特等人调查了情绪状态对直觉判断能力的影响。该研究得出结论,消极情绪会限制直觉一致性判断。由疫情引起的情绪困扰的影响同样可能引发对学习轨迹和个人表现的反应。然而,据我们所知,在这种危机或类似的刺激环境下没有进行重大研究。了解动态变化对单个学生表现的影响,可以有效地帮助开发人工智能(AI)系统,从而帮助提高在线教学的质量。

教学和评估中的挑战

1.2 人工智能与智慧课堂

疫情新冠肺炎严重影响了传统的或地区性的课堂学习。这种中断更有可能成为我们历史上著名流行病的频繁中断,包括黑死病、西班牙流感、霍乱、淋巴腺鼠疫和疫情流感,或者第二波可能发生。疫情期间的核心任务之一包括避免社交聚会,社交聚会严重影响传统课堂的学习和评估行为。在完全或部分过渡到在线学习的过程中,人工智能(AI)可以在创新当前教育系统方面做出重大贡献。应用推理或认知技能和评估程序可以用来开发一个先进的人工智能系统,以补充我们现有的审议。在新冠肺炎疫情期间,很可能会在学生群体中引发情绪反应。这可能会极大地影响个别学生的学习轨迹。

人工智能(AI)技术已经获得了广泛的普及,因为它能够以边际精度进行预测,并具有解决复杂问题的潜力。在智能教室环境中使用人工智能的几个优势之一是它的认知潜力。人工智能开发中使用的算法最终可以帮助具有不同学习风格和能力的学生实现个性化学习节奏的目标。Lo 等人利用多层前馈神经网络(MLFF)开发了一个基于网络的学习系统,重点关注学生的认知风格[10]。Curilem 等人还提出了一个基于学生行为的智能教学系统(ITS)的数学模型[11]。

除了人工智能的认知能力之外,该系统还允许选择预测,这对预测至关重要。使用人工智能进行时间序列预测之前已经在金融行业[12–14]和医疗决策过程[15]中使用过。同样,在教育行业,人工智能已经被用于预测辍学[16]或逃避电子学习课程[17]。

在智能教室环境中利用 AI 的架构的概念肯定会提高理想场景中的学习质量。设计的架构面向参加传统和/电子学习的工程专业学生。因此,该系统需要对其最初的概念设计进行修改,以适应普通学生群体的需求,这些学生要么是高中学生,要么是最近才进入大学**。**

1.3 智慧课堂的概念

智能教室的概念是一个不断研究的领域,它能够利用硬件和软件组件来适应学生的需求[18,19]。Aguilar 等人[20]提出,在智能教室环境中利用机构的学习分析可以产生更有效的结果。无线传感器和物联网(IoT)在智能教室环境中分析社会和行为模式的应用也在几个测试平台中得到解决[21–25]。因此,随着技术的发展,现在更容易预测个人的学习情况,从而相应地分析和提供学习情况。这最终会提高学生的学习成绩和学习动力。

不同学习能力的学生参加同一堂课的典型课堂环境

1.4 拟议概念项目的科学价值和意义

主要目标是开发一个先进的人工智能驱动的在线学习系统,补充我们现有的在线方法。人工智能已经成为大多数教育机构采用的课题。

最近,微软进行了一项调查,强调了以下统计数据:99.4 %的人同意人工智能是机构竞争力的组成部分,92 %的人同意对该技术进行实验。

因此,改进我们当前的在线学习系统将提高我们与其他领先机构的竞争力。电子学习是教育的未来,即使在疫情结束后,无论从短期还是长期来看,这都是一项不错的投资。据预测,未来 5 年,在线教育可能达到 3250 亿美元。由于地区壁垒不再是一种义务,投资改进这种技术可能会产生潜在的收入流(国内和国际)。根据乔治梅森大学和斯基德莫尔学院的一份报告,除其他因素外,导致学生和教师对在线学习不满的主要因素包括:
“监管和实质性的学生-教师互动是在线教育质量的关键决定因素,可提高学生满意度、学习和成果。”
教授们对在线课程表达的另一个担忧包括:
“但当这些学生参加微积分或遗传学的期末考试时,他们的教授如何知道远处笔记本电脑上的考生正在做自己的作业,而不是向谷歌先生寻求帮助。”

总而言之,任何教育机构要想成为在线教育领域的全球领先企业,都需要应对以下挑战:( I)及时且经济高效的学生反馈机制;( ii)增强在线监督机制,以确保学术诚信。

注:下一章重点介绍架构设计和流程图来理解模型。

参考

[1]史密斯、琳达 h .和约瑟夫 s .伦祖利。"学习风格偏好:课堂教师的实用方法."理论到实践* 23,第 1 期(1984):44–50。*

[2]好吃,喜英。“学习风格偏好”。

[3]苏塔托,佐科。"等效教育学习过程和学习成果有效性的决定因素."社会科学、教育和人文学科进展* (2017)。*

[4] Rahman、Roselainy Abdul、John H. Mason 和 Yudariah Mohamad Yusof。“影响学生改变学习行为的因素。"过程社会学和行为科学56(2012):213–222。

[5]奥尔蒂戈萨、阿尔瓦罗、佩德罗·帕雷德斯和皮拉尔·罗德里格斯。" AH 问卷:学习风格的适应性分层问卷."计算机&教育* 54,第 4 期(2010):999–1005。*

[6] Tzouveli、Paraskevi、Phivos Mylonas 和 Stefanos Kollias。“基于学习者档案和学习资源调整的智能电子学习系统。”计算机&教育* 51,1 号(2008):224–238。*

[7]沃森、马克、米歇尔·麦克索利、谢丽尔·福克斯克罗夫特和安德里亚·沃森。"探索大学一年级学生的动机取向和学习策略."高等教育&管理* 10,第 3 期(2004):193–207。*

8 Petocz、Peter、Anna Reid、Leigh N. Wood、Geoff H. Smith、Glyn Mather、Ansie Harding、Johann Engelbrecht、Ken Houston、Joel Hillel 和 Gillian Perrett。“大学生的数学概念:一项国际研究。"《国际科学与数学教育杂志》* 5,第 3 期(2007):439–459。*

[9]阿尔莫纳德、弗洛伦西亚、爱德华多·费尔南德斯、阿德尔·梅利特和索特里斯·卡洛吉鲁。"基于人工神经网络的聚光光伏技术电特性技术综述."可再生和可持续能源评论75(2017):938–953。

[10]罗家俊、陈亚珍和修杰楷文。“根据在线确定的学生认知风格,设计一个自适应的基于网络的学习系统。"计算机&教育* 58,1 号(2012):209–222。*

[11] Curilem、S. Glória、Andréa R. Barbosa 和 Fernando M. de Azevedo。"智能教学系统:作为自动机的形式化和使用神经网络的界面设计."计算机&教育* 49,第 3 期(2007):545–561。*

[12] Schierholt,Karsten 和 Cihan H. Dagli。"股票市场预测使用不同的神经网络分类结构."金融工程的计算智能,1996 年。IEEE/IAFE 1996 年会议记录,第 72-78 页。IEEE,1996 年。

[13] 本特兹 Y布恩 L* ,康纳 J用卡尔曼滤波器和神经网络模拟股票收益对经济因素的敏感性。金融工程中的计算智能会议录。纽约州 : IEEE 出版社,1996 年*。**

[14]布劳纳、埃里克·奥、朱迪思·戴霍夫、孙晓云和沙伦·霍姆比。"黄金交易模型的神经网络训练技术."金融工程计算智能(CIFEr),1997 年。IEEE/IAFE 1997 年会议录,第 57-63 页。IEEE,1997 年。

[15] Loch、Tillmann、Ivo Leuschner、Carl Genberg、Klaus Weichert-Jacobsen、Frank Küppers、Evangelos Yfantis、Michael Evans、Valeri Tsarev 和 Michael Stö ckle。"前列腺经直肠超声的人工神经网络分析."前列腺 39,3 号(1999):198–204。

[16]马丁尼奥、瓦尔基利亚·里贝罗·德卡瓦略、克洛多瓦尔多·努内斯和卡洛斯·罗伯托·米努西。"基于人工神经网络的高校课堂辍学风险群体智能预测系统."在人工智能工具(ICTAI),2013 IEEE 第 25 届国际会议上,第 159–166 页。IEEE,2013 年。

[17] Lykourentzou、Ioanna、Ioannis Giannoukos、Vassilis Nikolopoulos、George Mpardis 和 Vassili Loumos。“通过结合机器学习技术在电子学习课程中进行辍学预测。”计算机&教育 53,第 3 期(2009):950–965。

[18]阿吉拉尔、何塞、普里西拉·巴尔迪维索、豪尔赫·科尔德罗和曼努埃尔·桑切斯。"基于多智能体系统的智能教室概念设计."载于【T2 人工智能国际会议论文集(ICAI)】,第 471 页。2015 年世界计算机科学、计算机工程和应用计算大会(WorldComp)指导委员会。

19 何塞·阿吉拉尔。"大学的智能教室是电子社会的支柱之一."在电子民主&电子政务(ICEDEG),2016 年第三届国际会议上,第 138–144 页。IEEE,2016。

20 阿吉拉尔、何塞和普里西拉·巴尔迪维索-迪亚斯。“在智能教室中学习分析,提高教育质量。”在 eDemocracy &电子政务(ICEDEG),2017 年第四届国际会议上,第 32–39 页。IEEE,2017。

[21]维纳、劳拉·r 和杰里米·库珀斯托克。"智能教室:在不断发展的技术环境中改变教与学."计算机&教育 38,第 1 期(2002):253–266。

[22]斯蒂费尔哈根、莱纳、妮可·贝纳丁、哈齐姆·凯末尔·埃克内尔、j .麦克多诺、凯·尼克尔、迈克尔·伏伊特和马蒂亚斯·沃尔费尔。"一位讲师在智能研讨室的视听感受."信号处理 86,12 号(2006):3518–3533。

23 亚历克斯·彭特兰。“社会意识、计算和交流。”计算机 38,3 号(2005):33–40。

[24]马丹、安摩尔、罗恩·卡内尔和亚历克斯·桑迪·彭特兰。“GroupMedia:分布式多模态接口。”第六届国际多式联运接口会议论文集,第 309–316 页。美国计算机学会,2004 年。

[25] Gligori、Nenad、Ana Uzelac 和 Srdjan Krco。“智慧课堂:讲座质量实时反馈。”在普适计算与通信研讨会(PERCOM Workshops),2012 IEEE 国际会议上,第 391–394 页。IEEE,2012 年。

注:下一章重点介绍架构设计和流程图来理解模型。

我设计了一个人工智能系统,它可以以边际准确度预测‘学术不诚实’(智能教室)

原文:https://towardsdatascience.com/i-designed-an-ai-system-that-can-predict-academic-dishonesty-with-marginal-accuracy-smart-162b29523f5e?source=collection_archive---------45-----------------------

AIEMS 项目

第 2 章,第 1 部分,人工神经网络架构

未来的虚拟现实辅助课堂【照片由克里斯蒂安·弗瑞格南在Unsplash上拍摄】

标识 AIEMS(人工智能教育监控系统)

项目名称:“AIEMS(人工智能教育监控系统):网络教育高级人工智能(AI)监控与反馈系统开发”

第二章

人工神经网络体系结构

在我们之前的第章中,我们重点介绍了具有嵌入式人工认知能力的智能教室的概念。由于疫情仍然有效,课堂转移主要在网上进行,智能教室的架构应该提供创新,并解决传统教育平台的挑战。

我们强调了在线教育的两个主要挑战:( I)加强在线监督机制,确保学术诚信;( ii)提供及时且具有成本效益的学生表现反馈机制。

作为教育工作者的另一个主要挑战是识别学生的学习风格。大多数学生可以很容易地分为以下几类:

(1)口头:他们更喜欢通过关键词来学习。

(2)视觉:他们更喜欢通过图片来学习。

(3)听觉:他们更喜欢通过声音/节奏来学习。

(4)身体/亲缘美学:他们更喜欢通过身体接触来学习。

(5)逻辑/数学:他们更喜欢通过推理来学习。

作为一名教育工作者,在教案中不可能总是涉及所有不同的学习风格。人工智能(AI)技术可以将这一挑战转化为现实,并提供更多灵活性。本章主要关注在开发我们的项目 AIEMS 中使用的人工神经网络(ANN)架构。AIEMS 的动机是开发一个智能虚拟教室,为其学生成员提供全面的学习体验。同时,它将通过人工智能增强的监考机制来解决学术不诚实的挑战。

深度学习(DL)已经在这个特定的模型应用程序中用于开发 AIEMS 平台,因为它可以很容易地应用于多层神经网络。人工神经网络(ANN) 是一种数学模型,其灵感来自于神经元(我们大脑的基本工作单元)的架构。人工神经网络的基本结构如下所示:

人工神经网络(ANN)的体系结构

数学上,单层神经网络可以由下面的等式(1)表示

神经网络方程

学习分析需要处理大数据。因此,自适应计算算法可以通过管理模式并同时将新的输入数据累积到该模型中来进行有效的分析。深度学习(DL)已经在 fintech 行业显示出应用和范围,并不断用于检测欺诈活动。

了解平台的基础设施

AIEMS 是一个虚拟的电子学习平台,将有助于智能教室环境中的几个主要目的之一:

识别学生的认知学习风格。

这一点尤其重要,因为在大多数教室里,导师或教育者讲授的课程通常是标准化的,并偏向具有特定学习风格或能力的学生听众。这最终对一个学生的全部潜力的发展有很大的影响。在人工神经网络的帮助下,可以准确地识别学生固有的学习风格,从而可以为学生提供对他们的学习和发展理想的学习材料风格。同样,教育工作者需要通过分析和预测智能教室(或虚拟教室)中发生的学术和社会变化来了解他们的表现。

为了便于理解学生的认知学习风格,可以用流程图来补充。下面的流程图可以用来识别学生是否是视觉学习者。

确定可视学习者并将学生记录存储在数据库中的流程图

所附流程图是用于确定视觉学习者的模型的简化表示。由于视觉学习者通过图片和图表适应学习过程,因此教师可以提供包含图片的课程计划。在材料呈现给学生后,可以问他们一系列与材料相关的问题。如果学生能够以 50%及以上的分数准确回答,那么该学生可以被视为视觉学习者。

尽管这可能不是一个非常准确的模型,并且存在潜在的挑战。然而,它确实提供了一个机会来推进当前提供给学生和导师的学习平台。

网页参考资料

[1]https://sites . Google . com/site/holistic app education/engaging-different-learning-styles

我不相信电子

原文:https://towardsdatascience.com/i-dont-believe-in-electrons-8f1b59adc1ec?source=collection_archive---------12-----------------------

…不要让我开始谈论“共识”科学

约翰·哈维·凯洛格医生,由安东尼·霍普金斯扮演,在 1994 年电影《威尔维尔之路》的一个场景中成功完成手术后图片:巴特尔克里克询问者

所以,我参加了加州大学进化生物学系的员工会议。本周最大的担忧是校园被基督徒占领。史蒂文·j·古尔德被传唤去做一次演讲,谴责神创论(有点矫枉过正)。这在当时是一项非常流行的活动——丹尼尔·丹尼特和理查德·道金斯正在互相超越,以证明谁的无神论最纯粹。其中一个教授问房间里的人,“你们今天看了的报纸 了吗?35%的美国人不相信进化论!”我控制不住自己——我脱口而出:“太好了!”他们都盯着我,好像我放了个屁。我不是在交朋友,所以我解释说,“50%的美国人相信占星术。我们赢了!”

他们一点也不觉得这有趣。因此,我在那里默默忍受了余下的学业。也许我全错了,但我不认为科学中的任何问题是“信仰”的问题。科学家应该是专业的怀疑论者。的确,可能问科学家最烦人的问题是他们是否相信一个理论。更令人不安的是询问普通大众,他们是否相信科学家无法证明的事情:“真相。”

科学到底是什么?

从童年开始,我们都被灌输了科学的童话观点 :

科学在人类的努力中是独一无二的,因为它是累积的和进步的。将科学与其他形式的知识区分开来的是一种被称为“科学方法”的东西,在这种方法中,观察到的事实通过逻辑演绎或假设得到扩展,通过归纳产生,并被测试和验证。新的科学理论包含并取代了旧的理论,如 matryoshka 玩偶,扩大了范围、应用和预测的准确性,永远朝着真理前进。

这是一个神话,任何有思想的科学家都知道。然而,所有从事实践的科学家都在积极地延续这种虚构,以一种枯燥的、假设性的演绎叙述(观察、假设、方法、结果、结论)发表他们的工作,而不管想法是如何产生的,或者工作实际上是如何完成的。

卡尔·波普尔(Karl Popper)在标准观点(逻辑实证主义或逻辑经验主义)中戳出了巨大的漏洞,令人信服地指出,科学理论永远无法被证明,我们所能期望的最好结果是证伪一个科学理论。普拉特认为,科学家应该应用“多重假设的方法”,在这种方法中,他们提出尽可能多的替代解释,并着手根据每一个 other⁴.来检验它们

托马斯·库恩在他对科学 revolutions⁵.的历史分析中挑战了科学进步是知识的稳定积累的观点库恩区分了“正常”科学和“革命”科学的阶段。正常科学在一个普遍的理论共识(“主导范式”)内运作,很像经典观点。库恩将正常科学时期的科学进步比作“解谜”,在这种情况下,群体得出理论的含义,类似于演绎推理。当出现当前理论无法解释的异常或不一致时,科学家不一定会放弃该理论,但往往会开发出特设假设来修正当前理论(例如,在托勒密轨道或玻尔原子模型中添加本轮[图 2])。

图二:特设还是辉煌? 左:玻尔原子模型:允许电子占据离散轨道,对应驻波。右:太阳系的第谷模型:地球为中心,月球和太阳围绕地球运行,其他行星围绕太阳运行。这在数学上等同于哥白尼体系,没有一些我们感觉不到地球旋转的怪异现象。作为一名天文学家和炼金术士,布拉赫是科学史上最古怪的人之一,他养了一只宠物驼鹿,雇佣了一名矮人灵媒,还和女王有一腿。可悲的是,他的驼鹿死了,因为它喝醉了,掉进了 stairs⁷.图片:维基共享

历史并不总是善待被抛弃的理论或临时的假设,认为它们是毫无理性基础的无稽之谈。费耶阿本德庆祝他们的发明。摆脱了教条,科学革命充满了创造力。特别的理论使停滞不前的领域恢复生机和活力。他们受到启发,为激进的新思想和理论铺平道路。

另一方面,新的或竞争的理论可以解释异常现象,但抛弃了以前理论的大部分范围。一个很好的例子是从炼金术到化学的转变(图 3)。库恩和费耶阿本德都没有达成一致的范式(共同的前提、观察、定义、范围、价值),理论之间的争论是不相称和不合理的。新的价值观、论点、方法、美学、对大众媒体的吸引力,都变成了公平的游戏(费耶阿本德称之为“一切皆有可能”)。费耶阿本德提倡方法论无政府主义,认为不存在科学 method⁶.这样的东西

图 3:燃素理论炼金术士 J.J .贝尔彻(1667 年)、皮埃尔·约瑟夫·麦克克尔、格奥尔格·恩斯特·斯塔尔(1731 年)开始对元素进行系统分类,对早期化学做出了贡献,其中包括 phlogiston⁸.燃素理论提供了一个结合燃烧(如火)和腐蚀(如锈)的一般理论。氧气的发现(约瑟夫·普利斯特列和安托万·拉瓦锡 1774 年)是炼金术终结的开始。可以说,炼金术正在进步,如果你愿意接受燃素具有负质量。图片:布朗大学干草展览[8]

图 4:勒内·笛卡尔的肌肉收缩气动理论。【2000 多年来,肌肉收缩理论经历了几次范式转变。盖伦(公元 129-200 年)指出,肌肉以激动剂/拮抗剂对的形式发挥作用,由“动物精神”驱动(动画是动物区别于植物的能力)。勒内·笛卡尔在 1664⁹.提出了肌肉的液压机制(气球)理论 1667 年,Jan Swammerdam 证明肌肉收缩时体积不变。加尔瓦尼(1791 年)证明了电可以引发肌肉收缩,从而产生了电动理论(灵感来自玛丽·雪莱的《弗兰肯斯坦》中的动画)蛋白质折叠或蛋白质弹簧理论主导了 200 年。目前的滑动灯丝理论是在 1954 年才建立起来的。这些理论中的每一个都具有深刻的创造性,并得到了很好的支持。每一个都对我们的知识有所贡献,尽管并不正确。图片:维基共享

科学辩论的一个不受重视的方面是所使用的修辞,这通常远非理性。第谷·布拉尼年轻时在一次决斗中失去了鼻子,戴着黄铜假肢。这给了他在辩论中的巨大优势,就好像一个演讲者提出了一个相反的观点,他会不经意地移开并擦亮他的鼻子,分散观众的注意力。伽利略的文章充满了讽刺和嘲笑,即使对现代人来说也很有趣。他用意大利方言而不是学术性的拉丁语发表论文,以面对更广泛的读者⁰.对大众媒体和名人的吸引力一直延续到现代,不管是好是坏。

在波普尔、库恩和费耶阿本德之后,新实证主义“死了,或者说像一场哲学运动一样死了。”除了证伪之外,科学家们对于什么是科学、什么是独立于理论的事实、什么方法是发展理论的有效方法、当在理论之间做出决定时应该应用什么价值观都没有达成共识,并且很少有人轻率地宣称他们的理论在任何客观意义上都是“真实的”。公开的问题是,科学理论是否至少是对现实的真实描述,以及相信不可观察的实体是否合理——比如我们的朋友电子。

实用主义

许多科学家的谨慎立场是对理论的真实性采取不可知论的立场,同时重视其成果。由于量子力学的怪异,大多数物理学家已经放弃了形而上学。量子力学被接受是因为它与实验相符;就是这样。在礼貌的谈话中,人们会回避它的意思或它是否为“真”。(“闭嘴算了。”)

实用主义者对科学的主张没有那么夸张:一个理论的价值是功利的——它有预测价值,并使应用成为可能。理论只是“理论”,而不是事实或定律。通常,“模型”一词被用来代替“理论”,部分是为了避免认识论的包袱。(模型被弱定义为“某事物的数学或统计表示或近似。”)事实上,模型被视为现实的有用类比或图像。经常使用的一个生动的比喻是从巴勃罗·毕加索那里借用的——“艺术是帮助我们看到真理的谎言。"

一个不那么深奥,但更有趣的世界

这种世界观比听起来更乐观。考虑到另一种现实主义观点最终会导致科学的完成。1996 年,《科学美国人》记者约翰·霍根在中同样暗示了科学的终结,大部分科学中的重大问题都将得到解答的时刻即将到来。一旦物理统一了,就可以推导出化学,解释出生物学。留给科学的只是细节的逻辑推理,即解谜。那有什么好玩的?在不可知论者的观点下,真理永远无法被知晓,科学探索是一种更加人性化的活动,科学辩论也是无穷无尽的有趣。

你必须亲眼目睹,才能相信吗?

利用望远镜,伽利略看到了月球上的山脉、太阳上的斑点以及围绕木星运行的卫星。这可能被视为可验证的科学,因为原则上,一个人可以到月球上去看看山。但是微观世界呢?起初,望远镜和显微镜似乎没有什么区别。也许我们可以相信光学显微镜…在某种程度上。但如果你接受当前的理论,微观领域与宏观领域完全不同,物理定律也有完全不同的表现形式。没有办法像月球上的山一样,用我们的感官直接体验这个世界。我们看到的东西有多少取决于我们对所看到的东西的理论?我们没有看到什么?

理性经验主义也因复杂性而受挫。你可能很难找到一个了解大脑如何工作的神经科学家或者一个了解免疫系统如何工作的免疫学家。我们还不清楚疫苗是如何起作用的,也不清楚为什么免疫系统不能在一连串的免疫反应中自我消化。有数百种类型的细胞、分子受体、细胞因子和神经递质——所有这些都在一个组合的连接网络中相互作用,往往产生与它们在体外单独作用截然相反的效果。神经科学中充满了神秘和冒险。一个关于所有认知系统的令人沮丧的说法是“也许一个事物最简单的表现就是它本身。”

那么,我们如何看待这一切呢?很明显,科学发现了一些东西。牛顿力学仍然被用来解决绝大多数的工程问题,尽管它是“错误的”在发现 DNA 的 100 年前,基因是假设的、不可观察的实体,具有非凡的预测能力。它们现在几乎可见,那么我们应该‘相信’它们吗?我想是的——你难倒我了。

另一方面,我们对电子含义的理解在 100 年里已经发生了多次转变。电子既不是粒子也不是波,或者也许它们是场中的扰动。它们有电荷和自旋,但没有质量(它们只是从希格斯玻色子那里‘借用’了质量)。他们既不在这里也不在那里。你踢一个,另一个就掉在 60 光年之外。相信电子是双重思考的练习:同时持有相互矛盾的想法。我们只能同意电子是一个有用的概念。当你死的时候,你可以问上帝它们是什么。

你不会真的相信这一切吧?

费耶阿本德在我伯克利的哲学专业朋友中非常受欢迎。年轻的时候做一个反传统的人很有趣。我觉得我错过了,所以我在研究生院旁听了他的一些讲座。他非常有趣。下课后,我抓住他,诚恳地告诉他我一直在读他的一本书。他问我:“哪一个?”当我告诉他,“反对方法”时,他似乎很惊慌。“天哪,我太尴尬了。那是一本可怕的书。”

费耶阿本德从未把自己看得那么重,他在《科学的终结》中告诉约翰·霍根,“我认为西方科学能够为自己辩护。”库恩发现自己与库恩派分道扬镳,坚称自己不支持一种文化相对主义。建设性的经验主义者认为,科学已经取得了如此多的成就,并做出如此准确的预测,而没有一些真理内容,这将是一个“奇迹”。

但是费耶阿本德对暴政科学教条的警告受到了广泛关注。教条限制了自由的思想和辩论。教条很无聊。鹦鹉学舌不是学习。教条可能是错误的。唯一仍然有效的认识论原则是可证伪性。学术界和媒体的伪善让我们所有人都支持他们被证明在从气候变化到碳水化合物的所有事情上都是错误的。在他的自传《⁴》中,他哀叹道,“我常常希望我从未写过那本该死的书。”我很高兴他这么做了。

信念的意志

这让我想起了教员会议。在实践中,科学家认为什么是“真”并不重要。公众认为科学家们相信什么更不重要。在员工会议上,高度敏感的研究生对著名科学家伪造上帝的努力充满敬意。

一个可能很重要的问题是“有自由意志这种东西吗?”在笛卡尔物理学的时钟宇宙下,答案似乎是“不”。量子力学给我们留下了一些关于相信什么的可怕选择:从不可证伪和不相关的“多世界”解释到悲观的超级决定论观点。这两个极端都不允许自由意志。我当然希望自由意志存活下来,因为我发现宿命论令人沮丧。在那之前,我仍然坚定地站在实用主义者一边。正如威廉·詹姆斯所宣称的,“我自由意志的第一步就是相信自由意志。”

改变我的想法。

Russell Anderson 拥有加州大学的生物工程博士学位和电子工程学士学位。他的学术研究涉及生物系统(神经、免疫和进化)中的学习。他在洛斯阿拉莫斯和利弗莫尔国家实验室、加州大学(伯克利、旧金山、戴维斯和尔湾)、史密斯-凯特尔维尔眼科研究所和加州卫生部进行研究生研究。他曾在 IBM、Opera Solutions、HNC Software、KPMG、NICE/Actimize、HCL、Mastercard、JP Morgan Chase 和苏格兰哈利法克斯银行担任首席科学家。他发表了 30 多篇科学论文,拥有 5 项商业预测系统专利。

后记:对⁵ 的回复和讨论的总结

欢迎提问/评论:anderson.transactionanalytics@outlook.com

脚注:

1.理查德·道金斯(2006 年)。神痴。波士顿:霍顿·米夫林

2.在加州大学,“报纸”指的是《纽约时报》。当地报纸的所有标题都是关于辛普森的慢速汽车追逐,它发生在大约 15 英里以外(1994 年 6 月)。

3.卡尔·波普尔 (1935,1959)。科学发现的逻辑

4.约翰·r·普拉特(1964)。强有力的推论。科学第 16 期,第 146 卷,第 3642 期,第 347-353 页

5.托马斯·s·库恩(1962)。科学革命的结构 (1962)芝加哥大学出版社

6.保罗·费耶阿本德(1975 年)。反对方法:一种无政府主义知识论的提纲。纽约州纽约市 Verso 图书公司。

7.JLE·德雷耶(1890 年)。第谷·布拉尼:一幅 16 世纪科学生活和工作的图画。爱丁堡的亚当和查尔斯·布莱克。第 210 页

8.Pierre Macquer,《化学理论与实践的要素》,第二版,第 1 卷, Hay 展品,2020 年 1 月 9 日访问,https://library.brown.edu/exhibit/items/show/7。

9.m .科布(2002 年)。《时间线:驱走动物灵魂:简·斯瓦默达姆论神经功能》 (PDF) 。自然评论神经科学。3(5):395–400。

10.斯蒂尔曼·德雷克(1957)。伽利略的发现和见解。纽约:双日。

11.约翰·帕斯莫尔(1967)。逻辑实证主义,哲学百科全书。).纽约:麦克米伦

12.约翰·霍根(1996 年)。科学的终结:在科学时代的黄昏面对知识的极限。艾迪森-韦斯利

13.巴斯·范·弗雷森(1980)。“我认为当前科学理论的成功不是奇迹。这对科学(达尔文主义者)来说并不奇怪。因为任何科学理论都诞生于激烈竞争的生活中,是一片满是牙齿和爪子的丛林。只有成功的理论幸存下来——那些事实上抓住了自然界实际规律的理论。”《科学的形象 (1980),第 40 页。

14.保罗·费耶阿本德(1995) 消磨时间。芝加哥大学出版社。

15.我不相信电子——续集(2020 年 3 月)。走向数据科学。https://towards data science . com/I-don-t-believe-the-sequel-FFA 1 b 76 EC 7 a

我不相信电子——续集

原文:https://towardsdatascience.com/i-dont-believe-in-electrons-the-sequel-ffa1b76ec7a?source=collection_archive---------42-----------------------

戴上你的金属头盔…今天是粉丝感谢日

作者:“危险”和“有毒”照片:霍克电影公司

上个月,我发表了一篇调皮的文章《我不相信电子》,鼓吹不可知论的科学观,贬低其现代崇拜(https://towards data Science . com/I-Don-Don-Believe-in-electronics-8f1b 59 ad C1 EC)。来自资深科学家同行的如此多的积极回应让我不知所措。感谢您的所有评论和交流。其中一个例子是奥利弗·赖辰斯坦(@reichenstein)的这条慷慨的推文:【这是我几个月来读到的最顽强的文章。充满了伟大的引用位。是的,费耶阿本德在娱乐。但是,第一名是约瑟夫·赫茨林格(@赫茨利),他完美地抓住了这种精神:

“每当科学家说‘我不相信电子’,某个地方就会有一个电子死去。”

现实主义的捍卫者在哪里?

最令人惊讶的结果是,似乎没有多少现实主义者存在……或者至少没有人能够提出一个论点。我对此感到失望,因为我渴望听到他们的反驳意见。为什么要冒风险宣称确定呢?在大自然的奇迹面前,我更喜欢谦逊。

好的。现在到了有趣的部分。异议者…有两种口味。

#1。不要把我们的脏衣服挂在公共场合

有相当多的回应,如“我不反对你,但这样的论点可能会被公众滥用。”争论大概是这样的:“在大众的手中,反现实主义可能被用来支持扁平地球论者、神创论者、勒德分子、反恐怖分子,[或者其他真实的或想象的威胁]。”这些批评者似乎害怕科学民主化,害怕失去公共资金或什么的。也许我们应该恢复用拉丁文出版。

我从未见过“地球是平的”,我怀疑他们只存在于社交媒体的想象中。我见过各种各样的神创论者。我不害怕它们,也不认为它们是医学进步的威胁。大多数轻度摄入咖啡因的人认为科学和信仰之间没有冲突,但我坚持我的开放立场:科学不是信仰的问题。

#2。但是……科学!

少数直言不讳的人变得完全精神错乱,大喊“危险”和“有毒”等形容词,但带有悲剧性的反驳。最令人愤怒的反应似乎来自年轻人和非科学家。作为慈善机构,大多数人似乎混淆了反现实主义和反科学。再一次说明:暂时接受一个理论及其效用并不等同于相信它是正确的。

当我在大学的时候,教授们只是假设你已经读过科学革命的结构,并且他们已经听厌了。我也这么认为,因为这本书比大多数机场小说卖得都多。我记得我的一位教授抱怨说,“实用主义在美国如此占主导地位,真奇怪他们还在教哲学。”(我认为他是一个现实主义者,他认为不可知论是懒惰的)。所以,令我惊讶的是,这些读者中有许多人从未听说过反现实主义。在一个奇怪的传统颠倒中,年轻一代似乎已经用“发誓忠于传统智慧”取代了“颠覆主导范式”的口号。

有趣的困惑

最令人困惑的海报向我解释说,一个“电子是真正的数学对象。”我不知道从哪里开始。

另一个被贴上标签的复杂性理论是“伪科学”。我指的是数学中使用的复杂性,它至少在一个方面不同于科学:数学命题可以被证明为真。

另一位读者想象他看到了安·兰德(真的!)并认为这篇文章具有“经典计算视角”(大概这是某种坏科学)。他向我们保证有一种科学方法,但没有向我们透露秘方。但是他至少为溯因推理的方法的局限性提供了一个绝技演示。他继续宣称“可重复的发现是科学中的基本‘真理’。”我很高兴他澄清了这一点。

我希望这些反对意见大多只是酒后发短信。但是,当我努力去理解它们的时候,我又一次想起了保罗·费耶阿本德,有人问他:“为什么你被认为是科学最大的敌人?“⁴”他的回答,带着顽皮的笑容:“我不知道。”

Russell Anderson 拥有加州大学生物工程博士学位和电气工程学士学位。他的学术研究涉及生物系统的学习(神经、免疫和进化)。他在洛斯阿拉莫斯和利弗莫尔国家实验室、加州大学(伯克利、旧金山、戴维斯和尔湾)、史密斯-凯特尔维尔眼科研究所和加州卫生部进行研究生研究。他曾在 IBM、Opera Solutions、HNC Software、KPMG、NICE/Actimize、HCL、Mastercard、JP Morgan Chase 和苏格兰哈利法克斯银行担任首席科学家。他发表了 30 多篇科学论文,拥有 5 项商业预测系统专利。

欢迎提问/评论:anderson.transactionanalytics@outlook.com

1.r 安德森(2020)我不相信电子。走向数据科学【https://medium.com/me/stats/post/8f1b59adc1ec

2.托马斯·s·库恩(1962)。科学革命的结构。芝加哥大学出版社

3.约翰·霍根(1996 年)。科学的终结:在科学时代的黄昏面对知识的极限。艾迪森-韦斯利

我终于明白了反向传播:你也可以…

原文:https://towardsdatascience.com/i-finally-understood-backpropagation-and-you-can-too-44f7dd98ff52?source=collection_archive---------30-----------------------

为什么梯度是最陡上升的方向。

照片由在 Unsplash 上拍摄

反向传播算法是训练神经网络的关键因素之一,但它也可能是理解事物实际工作方式时最难掌握的概念。至少在我自己的经历中,这是我一直努力去深入理解的一件事。在这个主题的大量材料之间变戏法之后,我有了自己的灵光一现,所有的东西都到位了。像我一样,你也可能通过在线课程自学,可能已经完成了几个项目,但你仍然会感觉到那种 一知半解、 模糊理解训练神经网络(或任何其他机器学习模型)时实际发生的事情的痛苦。

在这篇博文中,我将让你了解我的直觉,希望你能在此基础上更好地理解这个非常重要的概念。我还提供了对我有很大帮助的资源的链接。

让我们从梯度下降开始

但是为什么呢?因为这是我最容易忽略的一点。许多在线课程会告诉你梯度下降法找到了损失函数相对于权重的partial derivative(即。梯度)并在与该梯度相反的方向上迈出一步;因为坡度指向最陡上升的方向,向相反方向迈一步将意味着我们向最陡下降的方向移动。但他们从不说明为什么,我是说为什么的为什么。我们朝着与梯度相反的方向迈出一步,因为它指向最陡上升的方向,但问题是:为什么梯度是最陡上升的方向?

查看渐变

梯度只是一个包含函数所有偏导数的向量。因此,这里的关键思想实际上是partial derivatives的概念。偏导数告诉我们,当我们保持除一个输入变量之外的所有输入变量不变,并向不固定的那个变量的方向稍微移动时,函数会改变多少。

另外,典型的神经网络包含数千个参数,但是为了简单和易于可视化,我们将考虑具有两个变量的函数:𝑓(𝑥,𝑦).幸运的是,我们在这里所做的一切可以很好地推广到任何数量的维度。

对于我们的两个变量的情况,偏导数告诉我们,如果我们保持𝑦变量不变,并在𝑥方向稍微移动一下,函数的输出会改变多少,反之亦然。

具体来说

作者图片

我们在输入空间中的点(2, 3)处,该点对应于输出平面中的特定点t,即对于输入(2, 3),我们的函数的输出为t。相对于𝑥的偏导数告诉我们,如果我们保持𝑦固定在3并稍微向𝑥方向移动,会导致多少变化。类似地,当𝑥固定在2并且我们向𝑦方向移动一点点时,对𝑦的偏导数测量了由此产生的产出变化。

我们来考虑一下函数:𝑓(𝑥,𝑦)=xy。相对于 x ,∂f/∂x 的偏导数为 2 xy ,即。我们保持 y 为常数,并对整项进行微分。同样,关于 y ,∂f/∂y 的偏导数是 x

记住梯度把所有的偏导数打包成一个向量,这个函数的梯度是:∇𝑓 = [2𝑥𝑦,𝑥 ]。在点(2, 3),梯度将是∇𝑓=[12,4】。因此,纯粹在x方向上的轻微推动将导致函数输出发生12倍的变化,而在y方向上的类似变化将导致函数输出发生4倍的变化。

尝试推导函数的偏导数:𝑔(𝑥,𝑦)=3𝑥𝑦。希望不难看出这个函数的梯度是:∇𝑔=[3𝑦,9𝑥𝑦】。

偏导数的问题在于,它们只告诉我们,如果我们只朝一个方向运动,事情会如何变化。偏导数是partial,因为它们都没有告诉我们,当输入改变时,函数 f ( xy )是如何变化的。然而,我们不仅想知道当我们沿 xy 方向移动时,事物是如何变化的,我们还想知道如果我们在输入空间内沿任意方向移动,事物会发生多大的变化。这正是directional derivatives的作用。

方向导数

一个方向上的方向导数,比如说𝑤⃗,告诉我们,如果我们在向量𝑤⃗.的方向上轻微移动,函数的输出会改变多少方向导数是通过取函数的梯度和𝑤⃗ ie 的dot product得到的。我们想要前进的方向。

如果𝑤⃗ =[3,5],那么方向导数:

评估点(2,3)的方向导数:

这意味着,假设我们在输入平面上的点(2, 3),在向量(3, 5)的方向上迈出一小步,我们函数的输出就会改变56倍。看待这一点的另一种方式是考虑在我们的输入平面(即 x,y 平面),该平面中的任何点或方向都可以被认为是𝑥和𝑦方向上的运动的组合。

作者图片

在上图中,𝑤⃗ =[3,5]是𝑥方向的 3 步和𝑦方向的 5 步的组合。因此,直觉上,沿着某个任意方向迈出一步,会导致 x 轴和 y 轴的变化。取方向导数的点积,将 x 轴和 y 轴上的变化相加。

现在我们有了方向导数,它本质上是偏导数的推广,用来处理输入平面上的任意方向。在训练神经网络时,我们寻求解决的问题是:假设我们处于某个点,比如说对应于损失(我们函数的输出)为t(2, 3),我们想知道导致我们损失最大增加的方向?一旦我们知道这个方向,我们就向相反的方向迈出一步,这将导致损失的最大减少。请注意,我有意强调了单词方向。我们正在寻找最佳方向,幸运的是,我们已经有了一个工具,可以衡量一个特定方向有多好(或多坏),正如你可能已经猜到的那样,这就是directional derivative

有了方向导数,我们可以解决这个问题的一个方法是找到所有可能运动方向的方向导数。最佳方向将是具有最大方向导数的方向。但是计算起来太慢了,想想我们可能移动的方向,这个列表是无穷无尽的。但是,想法是好的,我们只是需要一个更简单的方法,找到方向导数最大的方向。

寻找最陡上坡的方向

我们现在的目标是找到:

请注意,上式中的向量的大小或长度为 1。从某种意义上来说,这确保了我们不会因为向量比其他向量大而选择错误的向量,从而最大化点积,即使它指向错误的方向。

如前所述,方向导数是通过梯度和指向我们想要的方向的矢量的点积得到的。点积有一个非常好的性质,可以让我们找到最大化方向导数的方向,而不必考虑所有可能的方向。点积衡量两个向量之间的相似性。它给两个向量在同一方向上的移动量打分。形式上,两个向量𝑢⃗和𝑣⃗之间的点积是:

其中𝜃是两个向量之间的角度。

作者图片

在上图中,当𝑢⃗ =[0,1]和𝑣⃗ =[1,0]时,他们的点积为 0,因为他们之间没有相似性,𝑢⃗完全指向𝑥方向(它没有𝑦分量,而𝑣⃗也完全指向𝑦方向)。它们之间的角度是 90 度(它们是垂直的),𝑐𝑜𝑠(90 = 0 度。当𝑢⃗ =[0,1]和𝑣⃗ =[0,1]时,点积最大化,因为它们指向相同的方向。在这种情况下,点积是 1,因为它们之间的角度是 0。

向量的大小不会影响点积的结果,因为两个向量的大小都是 1。因此,使用上述公式的点积结果取决于两个向量之间的角度。从前面所述,我们不难理解这样一个事实,即对于单位长度的矢量,当两个矢量平行时,即它们指向相同的方向或它们之间的角度为 0°时,点积最大。

为了提醒我们的目标,我们希望找到使方向导数最大化的向量:

方向导数也是一个点积,所以从我们对点积的理解中可以很自然地得出,使方向导数最大化并导致函数最大增量的向量,是指向与梯度相同方向的向量,也就是梯度本身。这就是为什么坡度是上升最陡的方向。梯度下降朝相反的方向迈出了一步,因为我们在训练中的目标是使损失函数最小化,而不是最大化。

希望你从这篇文章中获得了一些有用的见解,帮助你巩固对神经网络和其他机器学习算法的基础的理解。下一篇博文将着眼于链式法则,这是反向传播背后的另一个主要概念。

资源

偏导数和方向导数:可汗学院:多元微积分
点积:可汗学院:线性代数微积分: 3Blue1Brown

你被解雇了

原文:https://towardsdatascience.com/i-fired-a-data-scientist-a137fca5b80e?source=collection_archive---------19-----------------------

如何发展和管理一个快乐的数据科学团队

艾伦·布兰科·特耶多尔在 Unsplash 上的照片

TLDR: 大多数 ML 团队不喜欢做数据和基础设施方面的工作,因为这不如建模有趣。对这个问题管理不当会导致高流动率和有害的团队氛围。我想分享一个叫做洞察驱动开发(IDD)的解决方案,几个例子,以及采用它的五个步骤。IDD 的目标是创建一个高绩效、敬业、快乐的数据科学团队,该团队既接受有趣的 ML 内容,也接受非 ML 工作。

喜欢读什么? 跟我上 领英 推特 。查看我的《 用机器学习影响 》指南。它有助于数据科学家更好地交流。

免责声明 :这篇文章没有得到我工作的任何公司的支持或赞助。我交替使用术语分析、数据科学和 ML。

你被解雇了!

“嘿,伙计,没用的。我们必须让你退出这个项目。不好意思。”亚历克斯,一个能干的数据科学家,不带感情地看着我。我感到无助、紧张和悲伤。

他可能在用最激烈的语言诅咒我。

因此,我刚刚“解雇”了项目中两位数据科学家中的一位。 为什么?亚历克斯讨厌做数据工作。他对此直言不讳。他用各种借口把它“卸”给别人。我们讨论过这个问题。他仍然做着半吊子的工作。其他人感到沮丧,抱怨为什么只有亚历克斯可以做酷的事情。如果这种情况继续下去,我们作为一个团队将会失败。那么,我们到了。

“嘘*t 老兄。我很抱歉。”亚历克斯说,终于。该死,真尴尬。

问题是

“亚历克斯问题”在数据科学团队中相当普遍。许多数据科学家感到无聊和没有动力。我认为有两个根本原因:

  1. 数据科学团队想要做的事情与我们在现实世界中需要做的事情之间存在差距
  2. 非数据科学家希望培养最受欢迎的技能

解决方案

那天,我“处理”了 Alex 的问题,我感到很紧张。那一刻,建立高效、敬业、快乐的数据科学团队成了我的使命。

至少,我想要一个鼓励数据科学团队接受非 ML 工作并从中获得乐趣的系统。好吧,显而易见的解决办法就是强迫人们去做(我们都是拿工资去工作的,对吧?).但这是不可持续的。因此,解决方案必须是实用的、愉快的、自我激励的

在接下来的几年里,我开始了尝试和混合来自产品管理、敏捷软件开发和管理咨询的核心思想的旅程。我想我找到了解决方案:洞察驱动开发(IDD)。

本文的范围

通常,有两种类型的 ML 项目:以业务为中心的和基于软件的项目。在本文中,让我们在以业务为中心的 ML 项目的背景下讨论 IDD 的原则。这些项目的输出通常是管理层的演示或仪表板。团队需要使用特定的 ML 技术,从简单到复杂,以找到一些洞察力。

取决于这篇文章如何做,我可以深入研究 1)IDD 如何在项目的早期、中期和后期阶段工作,以及 2)如何使 IDD 适应以软件为中心的 ML 项目(例如,输出是与核心操作集成的全栈解决方案)。

关于团队的假设

要利用 IDD,你要么需要一个有经验的团队,他们有独特的手艺,有尝试新事物的动力,要么需要一群初级通才,他们有动力,能把事情做好,有可塑性。如果不是,IDD 不适合你的团队(你应该重新审视一下你的招聘策略)。

让我们进入正题:缺碘症原则

IDD 归结为做两件不同的事情:

  1. 如何确定每个团队成员的工作范围(例如,也称为“工作包”,每个人都需要交付的东西)。
  2. 如何根据人的力量分配责任

首先,让我们通过一个示例来看看工作包是如何被不同地定义的。下面是同一个项目的两个积压无 IDD 和有 IDD ,在同一个 冲刺 ,有相同的近期目标。

无(左)和有(中)IDD 的工作包比较;详细的工作包定义(右);作者自己的分析

我们通常如何管理 ML 项目?在大多数 ML 项目中,我们将工作包分为四组:

  1. 数据
  2. 分析(我将此作为一个涵盖探索性分析和模型开发的总括术语)
  3. 软件(如系统集成、基础设施设置和 CICD)
  4. UI 设计和开发。

如果是管理咨询类型的约定,一些项目可能有业务垂直。

有什么变化?在 IDD 中,最明显的变化是有了更多的“分析”项目(黄色的东西)。在一种分析中,每个分析项目都被仔细地措辞;每个分析都旨在驱动出有趣的见解;基于我们的假设,每一个洞察都有助于解决更大的业务问题。因此,这种方法被称为洞察驱动开发。

数据和基础设施工作会发生什么变化?如果我们仔细观察,在“完成的定义”中,每个分析项目都包括 ETL 和基础设施数据和基础设施工作仍然非常关键。我们并没有回避它们,而是把它们作为洞察之旅的一部分。这种方法有一定的注意事项。例如,一些数据和基础设施工作必须是独立的,尤其是在项目的早期阶段。我们将在后续文章中讨论更多内容。

我们如何分配工作?与分析相关的项目似乎更多了。将它们全部分配给数据科学家是不现实的。人们有不同的优势、经历和兴趣。因此,这就把我们带到了 IDD 的第二个方面:责任分配。

通常,角色定义了人们的责任。例如,数据工程师拥有并处理所有数据,并且可能只处理与数据相关的东西。

无 IDD:ML 项目所有权结构示例;作者自己的分析

在 IDD 中,每个人的责任从他们的直接角色转移到产出。该团队“围绕一种洞察力开展工作”每个人都拥有最终交付的见解。为了保持质量的平衡,每个专家设定标准,领导程序设计(如果需要的话),并成为其领域专业知识的最终质量把关人。

IDD:ML 项目所有权结构示例;作者自己的分析

考虑到这一点,无论有无 IDD,工作分配都会是这样的。主要的区别在于,人们可以在他人的支持下领导他们直接角色和领域之外的工作。

角色类型(左),不带 IDD 的分配(中)和带 IDD 的分配(右);作者自己的分析

请注意,特定的工作仍然需要高度专业化的技能,最好分配给专家。作为项目负责人,您需要监控工作量,并为领导其专业知识之外的工作的人(例如,创建客户分析的数据工程师)提供足够的指导。每个团队成员都需要紧密合作,并交流期望和时间安排。

好处

我一直在与具有不同经验的业务分析师、数据专家、数据科学家和软件工程师团队一起,在以业务和软件为重点的 ML 项目中使用 IDD。它一直工作得很好,我将继续使用和完善 IDD。具体来说,IDD 之所以有效,是因为它让每个人都可以:

  1. 参与解决问题的过程(更有趣)
  2. 了解他们的工作如何直接有助于最终目标的实现(更加投入)
  3. 了解如何在给定更多上下文(更多质量)的情况下改进他们的设计
  4. 获得在新领域工作的机会(更多学习)
  5. 继续成为他们领域的专家(同样确定)

每个公司的每个团队都有不同的工作方式。所以,请接受这些原则,并相应地应用它们。做好一些困惑、紧张和不确定的准备。耐心点,事情会好起来的。

行动计划

如果你喜欢这种方法,这里有一些你可以在你的公司采用 IDD 的方法。

第一步。确保您的团队和朋友了解 IDD。所以,把这篇文章以“必读”为题分享给你的朋友和团队😉

第二步。选择一个以商业洞察力为中心的小型 ML 项目(例如,使用 ML 寻找新的客户群并评估潜力)。理想情况下,这应该是一个由 5 名经验丰富的工程师组成的团队可以在 2-4 个月内完成的事情。

第三步。召集你的精英团队。核心团队应该是你(作为项目负责人),数据工程师,机器学习工程师,软件工程师,UI 设计师。您可能需要业务分析师和 IT 人员的兼职支持。

第四步。与团队一起喝杯咖啡或饮料,并与这种方法保持一致(我发现当我们不在办公室时,人们更容易接受新想法)。

第五步。启动项目。抵制回到旧的工作方式的诱惑。给团队一些时间去学习(和失败)。注意个人如何传递 IDD。

奖金

这里有一些不要做的事情可以让你避免一些尴尬的时刻:

  • 不要选择大型的关键任务项目。
  • 不要选择以软件为中心的 ML 项目
  • 不要将 IDD 引入正在进行的项目。
  • 除非每个人都同意,否则不要开始这个项目。
  • 如果人们不喜欢,不要强迫他们引领洞察力的发展(你可以教,但不能强迫人们)。

如果你对这个话题感兴趣,我们在 Neptune 的朋友写了一篇关于如何建立机器学习团队来交付的精彩博客。

我希望你喜欢这个。我很想听听 IDD 如何为您的团队工作(以及如何不工作)。可以在 LinkedIn,或者Twitter上与我取得联系。****

取决于这篇文章的表现,我将继续讨论 IDD 如何为以软件为中心的 ML 项目工作(例如,输出是与核心操作集成的全栈解决方案)。

你可能也会喜欢这些…

** [## 最有用的 ML 工具 2020

每个懒惰的全栈数据科学家都应该使用的 5 套工具

towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58) [## 被遗忘的算法

用 Streamlit 探索蒙特卡罗模拟

towardsdatascience.com](/how-to-design-monte-carlo-simulation-138e9214910a) [## 12 小时 ML 挑战

如何使用 Streamlit 和 DevOps 工具构建和部署 ML 应用程序

towardsdatascience.com](/build-full-stack-ml-12-hours-50c310fedd51) [## 越狱

我们应该如何设计推荐系统

towardsdatascience.com](/how-to-design-search-engines-24e9e2e7b7d0) [## 数据科学很无聊

我如何应对部署机器学习的无聊日子

towardsdatascience.com](/data-science-is-boring-1d43473e353e) [## 我们创造了一个懒惰的人工智能

如何为现实世界设计和实现强化学习

towardsdatascience.com](/we-created-a-lazy-ai-5cea59a2a749) [## ML 和敏捷注定的联姻

Udacity 的创始人巴斯蒂安·特龙毁了我的 ML 项目和婚礼

towardsdatascience.com](/a-doomed-marriage-of-ml-and-agile-b91b95b37e35) [## 抵御另一个人工智能冬天的最后一道防线

数字,五个战术解决方案,和一个快速调查

towardsdatascience.com](/the-last-defense-against-another-ai-winter-c589b48c561) [## 人工智能的最后一英里问题

许多数据科学家没有充分考虑的一件事是

towardsdatascience.com](/fixing-the-last-mile-problems-of-deploying-ai-systems-in-the-real-world-4f1aab0ea10)**

我跟着数据工程师的简历学习如何进入这个领域

原文:https://towardsdatascience.com/i-followed-data-engineer-resumes-to-learn-how-to-break-into-the-field-78019ece7887?source=collection_archive---------19-----------------------

数据工程

以下是 50 名数据工程师的简历中关于经验和教育要求的内容

来自突发事件的莎拉·普鲁格的照片

每个人都想成为数据科学家。

但是没有人谈论数据工程师

利用跨软件工程、devops 和数据科学的专业知识,这无疑更加有趣。

我分析了 50 名数据工程师的简历,看看怎样才能找到工作。

我们来调查一下。

以前的工作

数据工程师在担任第一个数据工程职位之前从事什么工作?

大多数以前的角色涉及编码。与数据科学相比,我们看到的学术和“数学”背景要少得多。

超过 50%的先前职位属于软件工程(SDE)、数据科学(DS)和商业智能(BI)。

我有两个假设可以解释这种分布:

  1. 数据工程涉及大量使用云基础设施,最好通过实践而不是在学校里学习。SDE、DS 和 BI 角色提供了获得这些技能的机会。
  2. 由于数据工程支持 SDE、DS 和 BI,后一种角色的经验也可以产生对数据工程的兴趣,引导人们进入这个领域。

因此,如果你对数据工程感兴趣,先成为软件开发人员或数据科学家可能是有意义的。

平均工资

数据工程师的平均工资是多少?

根据 Payscale ,数据工程职位的平均薪酬(92k 美元)高于软件工程(86k 美元)和数据科学(87k 美元)职位。

我们知道平均值有误导性,但是 6000 美元的差异意义重大。

工资等级

工资等级

工资等级

我怀疑这部分归因于数据工程师的职位平均比 SDE 和 DS 职位高。资深候选人和少量人才库可能会推高价格。

也就是说,你可能不应该进入数据工程(或任何角色?)只是为了钱。

最高教育水平

在获得数据工程职位之前,最高学历是多少?

50 份简历中,90%有硕士学位,10%有学士学位,没有一份有博士学位。

这个角色可以说没有数据科学那么“学术”。因此,博士的缺乏并不令我惊讶,但硕士学位的高比例令我惊讶。

这可能是由于一个坏的样本,但我怀疑这背后有一些基本原理。

如果有人煽动,我很想听听!

学位专业

最高学历期间学的是什么专业?

所有专业都是 STEM,大部分都是 CS 相关。

与数据科学相比,经济学、商学和数学专业的学生要少得多。

我怀疑以前的角色是一个比教育程度更强的合适性指标,但分布仍然很有趣。

相关认证

数据工程师是否持有数据工程相关认证?

几乎 60%的人会。实际数字可能更高,因为这只考虑了简历上列出的证书。

我一直建议不要为了获得工作资格而收集证书。还有更好的方法。

但是我认为数据工程和 devops 是这个规则的例外。

软件工程面试中的算法挑战给出了一些关于编码能力的信号。但是提供云服务的能力更难测试。

出于这个原因,大型云提供商(GCP、AWS、Azure……)提供的认证计划实际上可能是交流能力的一个好途径。

从毕业到第一次担任数据工程师的时间

从完成本科学位到获得数据工程职位,数据工程师有多少年的工作经验?

几乎没有数据工程师在毕业后直接进入角色。

这支持了我的假设,即数据工程不是一个入门级的工作,需要在其他角色中得到最好发展的能力。

相比之下,我猜想 SDE 和 DS 的相同图表会显示数据向左移动。

这一分析的问题

  • 这些结果不具有统计学意义。只审查了 50 份简历,可变性很高。
  • 我们只分析了最前面的角色和教育。先前的角色和教育也可能影响获得数据工程角色。
  • 所有数据均来自美国,可能不适用于其他国家的招聘实践。

结论

如果任何数据工程师有任何纠正或见解,我都乐意倾听!

如果你想自己完成某件事,先看看别人是如何完成同样的任务的。这就是我在这里试图做的。

虽然数据点的数量很少,但它提供了在数据工程中工作的个人类型的一些想法。

如果你喜欢这个,你可能会对我的数据科学分析感兴趣。

我跟踪了数据科学家的简历,看看他们在数据科学之前是做什么的

原文:https://towardsdatascience.com/i-followed-data-scientists-resumes-to-see-what-they-did-before-data-science-730ec54d95d4?source=collection_archive---------14-----------------------

你可以从任何背景进入数据科学领域

照片由来自佩克斯的克里斯蒂娜·莫里洛拍摄

非 STEM 毕业生经常问我是否有可能进入数据科学领域。

我的回答永远是“是”。尽管我仍然相信成为一名软件开发人员对于那些没有技术背景的人来说是一个更好的选择。

我认为调查人们在闯入数据科学之前的经历会很有趣。

这是 50 个数据科学家在数据科学之前做的事情。

最高教育水平

闯入数据科学之前获得的最高学历是什么?

博士学位和学士学位的比例相当,硕士学位的比例略高。

有趣的是,这与我所看到的相符。

和我聊过的博士数据科学家的普遍共识是,博士在工作中没什么用,但它确实有助于获得面试机会。

根据上面的推断,你可能不应该仅仅为了成为一名数据科学家而攻读更高的学位。花在工作和社交上的时间可能更有价值。

教育专业

在达到的最高教育水平期间学习了什么专业(前数据科学)。

数据科学家大多毕业于 STEM 学位。但我们也看到许多非 STEM 学位,如商业和经济学(社会科学)。

品种比我预想的高一点。

这支持了你不需要 STEM 学位就能进入数据科学的观点。

也就是说,这个领域有很多变化。一个物理学毕业生可能在做与经济学毕业生完全不同的工作。

之前的职位

数据科学家在进入数据科学职位之前从事什么工作?

研究、软件和财务职位构成了之前职位的大部分。

大量的金融分析师、分析专家和顾问让我相信,许多数据科学角色并没有过多的技术性,可能更重视解释和呈现数据,而不是建模。

又来了。你能从任何领域进入数据科学吗?是的,很可能。但是,您的数据科学角色可能与其他背景不同的人完全不同。

数据科学相关证书

数据科学家的简历中有任何数据科学、分析或机器学习证书吗?

接近 2/3 的数据科学家在他们的简历上列出了证书。

我一直觉得证书对获取知识有用,但对找工作没用。有趣的是,我怀疑面试官并不重视这些。

也就是说,数据科学家似乎觉得证书足够重要,可以写进他们的简历。

这一分析的问题

很多。

  • 我只回顾了在成为数据科学家之前所获得的最高学历和工作。其他之前的工作和教育都被忽略了。
  • 所有的数据点都来自美国和加拿大。
  • 没有进行统计意义上的计算。

结论

这并不是一项严肃的研究。探索很有趣,所以我想分享一下我的成果。不要把这个看得太重。

也就是说,我认为它总体上支持这样一种观点,即你可以从任何背景进入数据科学。

用 AI 写诗(差)

原文:https://towardsdatascience.com/i-forged-emily-dickinsons-poetry-with-an-rnn-8a160ff98cf4?source=collection_archive---------30-----------------------

数据科学|机器学习

根据艾米莉·狄金森的作品集训练的递归神经网络(RNN)的输出

虽然不像沃贡诗歌那么糟糕,但也很糟糕。

为了创作新的诗歌,我最近对艾米莉·狄金森的集体作品训练了一个循环神经网络。

为了实现这一点,我在谷歌联合实验室这里做了一个演示。如果你看看这个笔记本,它记录了一个相当标准的张量流预测模型。

我使用古腾堡诗歌全集为模型的训练数据加油。我给模型输入了一个很大的文件,但是一个更好的方法是在训练前把每首诗分开。

样本输入诗歌

下面是艾米莉·狄金森写的一首真实的诗(许多用于训练数据的诗中的一首)。

DESIRE.

Who never wanted, — maddest joy
   Remains to him unknown:
The banquet of abstemiousness
   Surpasses that of wine.

Within its hope, though yet ungrasped
   Desire's perfect goal,
No nearer, lest reality
   Should disenthrall thy soul.

生成的诗歌

有趣的是,该模型一次预测一个字符,而不是整个单词、句子或段落。该模型还添加了回车符、标点符号,并决定每个字母是否大写。

(无标题)

Smale got wot' lost the blood.Sweec that from though moundered
And God, and-beath just are
Concomate I lest you,
    How Itemity.Who lust it glow is tere.The ridet his wait,
In privilener through till.Whose badnity what it too!
That fluen the seal that?
"Revice the atte!I failed of ancont, aganor!
Winds thou all take uthingful
Of inlit bolnow, —
But shall yet in ear,
To his these mistrancelf near,
In compentecant my little mound
Which landly guight be;I the

俄亥俄州

OHPungred so smides and hold!
I doon st is can to chair, abseab,
Cancelt to perches of the ais,
And you shall not have to take
And ofter donther hell
    On thou the slope would be;If I should disappoint the eyes
That hunted take thee?
Then dinnar' revel,
Of the is lone becad.The grass die wou nettled monnetsmy
At Lavid for your theen
Berest the heaven haughty.
It was not night that way!
Sovered solemn when the East
With such a pitely children on my father's will.

填缝

not aftaing!Each neighbor zoulled hours,
Araugh of surprise,
One little host in blaze below
That mast and pranor of wine.An oper for meray'mand
    And anl yet to-day, —
Could kingdows hannot a charge
    To hel she is failed syefest
Upon a thought my dairy.Why need insprites the strite;
'T was with I ever canchead,"
We usselves in her going;Of, fas it Just as that deathous
    When burness to rest.The say, I shall despaired thread, —
    A hocome to reat.Caultions

GAI 河

THE GAI HE MAL.The old brighatedices chass Carved ther away
    Serappicabed to be a field,
And yet that ore the decture sea,
Some natire of lately row,
The plead is brigrion
Then the hurred strings the one
Than head I sailod that ang I
South through the streets came a fut
    Bereath the wing was so nore,
As if the room from through poats!

关键见解

  • 该模型将标点符号适当地放置在行尾。
  • 该模型增加了返回字符和缩进,以匹配艾米莉·狄金森的风格。
  • 该模型将每行的第一个字母大写。
  • 该模型将“上帝”一词大写。
  • 该模型大量使用破折号和分号。
  • 该模型使用了来自训练数据的惊人数量的常用术语,但没有经过专门训练来记住任何单词。

这些见解都是艾米莉·狄金森的写作风格以及我提供的文本文件格式的结果。转录者有一个相关的注释:

正如有据可查的那样,艾米莉·狄金森的诗被她的朋友编辑成早期版本,以更好地适应时代的习俗。尤其是她的破折号,常常小到看起来像点,变成了逗号和分号。

难怪生成的诗歌中破折号、逗号和分号很多。感叹号也出现了。

未来的改进

  • 该模型可以被训练来预测整个单词/句子,或者被训练来正确拼写。
  • 训练文件中的每首诗都可以拆分成自己的文档来帮助训练模型。
  • 该模型可以被训练成使行尾的单词更押韵。
  • 该模型可以被训练以生成具有特定主题的诗歌。
  • GAN 可能是一个更好的方法,只要最终的模型不是简单地以 1:1 的比例重复迪金森的诗。

我对袜子有意见

原文:https://towardsdatascience.com/i-have-a-problem-with-socks-636740675dcf?source=collection_archive---------13-----------------------

让我们来学习如何回答著名的概率面试问题。

在网上看到过一个很有名的面试问题。事情是这样的:

I have 'x' blue socks and 'y' red socks in a drawer. I take 2 socks from the drawer without looking. What is the probability that I have drawn a pair of matching coloured socks?

对于那些没有花太多时间思考概率的人来说,这种问题可能看起来令人困惑。如果你是那种人,我希望给你展示一个直观的思考这类问题的方法。

让我们简化这个问题

不要从 10 只蓝袜子和 10 只红袜子开始,而是从每双袜子 2 只开始

我们将在一个矩阵中描述袜子抽屉的内容。记住我们将画几双袜子。矩阵中的行将代表我们配对中选择的第一只袜子。这些柱子将代表我们选择的第二只袜子。

我们将描绘这样一双特殊的袜子:

取样…无替换

假设我们从抽屉里抽出一只袜子,结果是第一只蓝色的袜子。我们把它放在一边(,也就是说,我们不把它放回抽屉)。当我们从抽屉里挑选第二只袜子时,blue-1在我们小小的袜子世界里,我们再也无法选择了!

为了描述这种没有替换的采样,我们将矩阵中的对角线灰化。也就是说,如果我们选择blue-1作为我们配对的第一只袜子,blue-1就不能形成我们配对的第二只袜子。

现在谈谈逻辑

让我们通过一些场景来更好地理解我们的问题。

场景一:我们选择“蓝色-1”

在这个场景中,我们挑选了第一只袜子,结果是blue-1。我们将blue-1放在一边(即,在挑选第二只袜子之前,我们不会将它放回抽屉中)。在选择第二只袜子之前,我们停下来想一想:

"此时抽屉里还有哪些袜子?"

这是一个很容易回答的问题!第二只袜子我们有三个选择:

  • blue-2
  • red-1
  • red-2

假设我们已经选择了blue-1作为我们的第一双袜子,那么我们可以用剩下的袜子组成哪双袜子呢?

如果我们计算一下在这种情况下我们可以做多少对,我们可以做 3 对!

场景二:我们选择蓝色-2

我们在精彩的游戏中点击“重置”按钮,重新开始。

我们选择第一只袜子。这次正好是blue-2。我们把blue-2放在一边。我们停下来,再次思考:

"此时抽屉里还有哪些袜子?"

“这很容易,”你想。我们只有三个选择:

  • blue-1
  • red-1
  • red-2

假设我们已经选择了blue-2作为我们的第一双袜子,那么剩下的袜子可以做成哪些双呢?

计算这些线对,我们可以看到,在这个场景中,我们还可以制作 3 对

填充矩阵

让我们重复上述过程,直到我们填写我们的矩阵。

我们总共能做几双?

在这里,我们想弄清楚我们的袜子微观世界的大小。如果我们只是简单地计算 2 双蓝色袜子和 2 双红色袜子可以做成多少双袜子,我们可以忽略“颜色匹配”的限制。如果没有这种限制,我们可以将一双蓝色袜子和一双红色袜子搭配在一起。这些是我们可以建立的可能配对:

数一数没有“匹配颜色”限制的可能配对,我们发现有 12 !这恰好等于排列的数量:

有多少双相配的袜子?

观察袜子的微观世界,我们可以数出包含相同颜色袜子的袜子的数量:

把它们数起来,我们发现有 4 双相配的袜子

让我们再深入一点,从不替换的角度考虑我们的配套袜子。对于我们的第一只袜子,我们有 4 只袜子可供选择。我们从抽屉里拿出一只袜子,放在一边。对于下一只袜子,需要考虑两种情况:

我们的第一只袜子是蓝色的

如果我们画了一只蓝色的袜子作为我们的第一只袜子,我们可以从抽屉里剩下的袜子中挑选哪一只来做一双相配的袜子?我们必须画另一只蓝袜子!也就是说,我们的第二只袜子只剩下一个选择,可以组成一双相配的蓝袜子。

我们的第一只袜子是红色的

如果我们的第一只袜子是红色的,那么我们必须画另一只红色的袜子!也就是说,我们的第二只袜子只剩下一个选择,可以组成一双相配的红袜子。

我们选择哪只袜子作为我们的第一只袜子并不重要。为了做出一双相配的袜子,我们只剩下第二只袜子的一个选择——剩下的同色袜子!对于我们的例子,我们有:

看看上面的矩阵,说服自己这是有道理的!

大揭秘

为了回答我们最初的问题,如果我们盲目地从抽屉里拿出两只袜子而不替换,抽出一双相配的袜子的概率是:

不错吧?

如果我们增加袜子的数量呢?

让我们把这个问题(看起来)变得更难。这次我们有 100 只蓝袜子和100 只红袜子。要解决这个,我们要做的就是遵循同样的逻辑!

总共有多少对?

  • 对于我们的第一只袜子,我们总共有 100+100 = 200 只袜子可供选择。
  • 我们拿一个放在一边。
  • 我们在寻找抽屉里的袜子能做成多少双。这意味着我们的第二只袜子有 199 种选择。
  • 因此,我们抽屉里的袜子总共有 200*199 = 39,800 双可供制作。

有几双相配的袜子?

  • 第一只袜子又有 200 种选择。
  • 我们注意到袜子的颜色,并把它放在一边。
  • 现在我们知道了第一只袜子的颜色,我们也知道了剩下多少只袜子可供选择来制作一双相配的袜子!我们必须有 100–1 = 99 双袜子可供选择,作为第二只袜子。
  • 所以我们有 200 * 99 = 19800 双搭配的袜子。

那么从这个抽屉里抽出一双相配的袜子的概率是多少呢?答案如下:

如果我们改变颜色的比例会怎么样?

在上面的例子中,我们在抽屉里放了同样数量的蓝色和红色袜子。如果我们让蓝袜子的数量和红袜子的数量不一样呢?假设我们现在有 100 只蓝袜子和25 只红袜子。

总共有多少对?

  • 我们从抽屉里的 125 只袜子开始。
  • 我们拿起第一只袜子,把它放在一边。
  • 我们的抽屉里还有 124 双袜子。
  • 因此,我们总共有 125 * 124 = 15500 对。

有多少双相配的袜子?

  • 我们有两种情况要考虑:第一只袜子是蓝色的,第一只袜子是红色的。
  • 如果我们的第一只袜子是蓝色的,那么我们最初有 100 只袜子可供选择。我们有剩下的 99 只蓝袜子可供选择,组成一双相配的蓝袜子。因此,有 100 * 99 = 9900 双可能的蓝袜子。
  • 如果我们的第一只袜子是红色的,那么我们有 25 只袜子可供选择。我们还有剩下的 24 只红袜子可以选择,组成一双相配的红袜子。因此,有 25*24 = 600 双可能的红袜子。

为了得到我们在这种情况下可以形成的配对袜子的数量,我们简单地将配对的蓝色和红色袜子的数量相加:

那么抽到一双相配的袜子的概率是多少?这是我们的答案:

让我们从经验上测试一下

我们可以用 Python 模拟上面的场景!是的,是的,是的——做这件事有更有效的方法。然而,我试图解释一个概念,而不是展示我的工程肌肉,所以请容忍我的冗长。

我们将使用的唯一软件包是NumPy。我们设置随机种子,因为我们将执行一些随机抽样!

import numpy as npnp.random.seed(123)

我们定义袜子的数量和我们想要重复模拟的次数:

NUM_BLUE_SOCKS = 100
NUM_RED_SOCKS = 25
NUM_TRIALS = 100_000

我们创建了两个袜子清单,我们将从中取样。

blue_socks = ['B' for _ in range(NUM_BLUE_SOCKS)]
red_socks = ['R' for _ in range(NUM_RED_SOCKS)]print(f"blue_socks:\n\n{blue_socks}")
print()
print(f"red_socks:\n\n{red_socks}")

这是输出:

blue_socks:['B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']red_socks:['R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R']

我们通过合并这两个列表来创建我们的 sock universe:

all_socks = blue_socks + red_socksprint(f"all_socks:\n\n{all_socks}")

这是我们漂亮的袜子抽屉:

all_socks:['B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R']

我们编写了一个简单的函数来绘制袜子:

我们编写另一个程序来计算配对对总数的比例:

然后我们调用我们的函数:

results = draw_pairs(NUM_TRIALS) 
calc_prop_matching_pairs(results)

我们密切关注我们的结果:

running trial number: 0 
running trial number: 10000 
running trial number: 20000 
running trial number: 30000 
running trial number: 40000 
running trial number: 50000 
running trial number: 60000
running trial number: 70000 
running trial number: 80000
running trial number: 90000prop valid pairs over 100,000 trials: 0.68

我们看到我们的结果相匹配。我们坐下来微笑。

结论

我想这篇文章的目的绝不是向你展示如何数一双相配的袜子。我们学到了比这更有价值的东西!

我们已经看到,一个看似困难的问题,可以通过简化来解决。一旦我们找到了解决简单问题的方法,我们就可以看到我们的逻辑是否适用于更复杂的问题。

另外,如果你在面试中被问到这个问题,你可以沾沾自喜地告诉面试官:

“我知道如何回答这个问题。但你难道不应该着眼于大局吗?”

下次见。

贾斯廷

信用

这篇文章中使用的袜子图片来自 Noun 项目的用户ibrandify。谢谢大家!

原载于 2020 年 3 月 16 日【https://embracingtherandom.com】

我主持了一个流行的人工智能伦理播客:我从商标设计失败中学到的 3 个教训

原文:https://towardsdatascience.com/i-host-a-popular-ai-ethics-podcast-3-lessons-i-learned-from-failing-at-our-logo-design-d7ba6810b921?source=collection_archive---------80-----------------------

以及它们如何帮助你设计更道德的技术

我共同主持了一个流行的人工智能伦理播客,名为“激进的人工智能播客”在我们发布后的第一个半月,我们收到了近 5000 次独立下载,在 iTunes 上的“新的和值得关注的”技术播客列表中排名很高。由于 Twitter 上人工智能伦理社区的惊人支持,我们得以采访全球人工智能伦理领域最具影响力的学者和行业领袖。

第一个标志

我们开始时是一个小项目,任务很简单,“创建一个吸引人的、专业的、有教育意义的和可访问的平台,集中产业和学院中边缘化或激进的声音,进行对话、合作和辩论,共同创造人工智能伦理领域。”我们预计只有几十个听众,并为此做了准备。我雇佣了一名博士生来设计我们的第一个标志,希望只有少数人能看到。这个标志适用于一个小项目,但我和我的共同主持人很快意识到我们需要一个新的标志,来代表我们对这个项目和我们试图提升的社区的未来的愿景。

我们雇佣了一位平面设计师,他是我的搭档,之前和他一起工作过,我们开始构思一个新的标志。一开始是一个快速的项目,很快就升级为我们关于技术、工业、平面设计和我们价值观的深度学习体验。本着脆弱性和教育的精神,我想和你们分享我在为我自己的流行播客创作标志的一个月的过程中所学到的三个教训。

第一课:语言很重要

播客的标题“激进的人工智能”首先出现在科罗拉多州博尔德的一家酒吧。大约两周前,在巴塞罗那的一次关于人工智能公平、问责和透明的会议(FAT*/FAccT 2020)上,我刚刚见过我即将成为的共同主持人,我们进行了后续会议,讨论我们的研究和联系。当我们坐下来喝啤酒时,很明显,我们不仅相处得很好,而且我们也对人工智能伦理在会议和媒体上的突出表现感到沮丧;即。它被著名的白人男性学者所控制。

根据我们的经验,我们知道,在人工智能伦理空间,特别是人工智能伦理播客中,历史上被强调的那些人,只代表了学术界和工业界从事开创性人工智能伦理工作的不可思议的人们的冰山一角。简单地说,我们有一个共同的挫败感,那就是即使在一个以道德为名的行业里,那些历史上被边缘化的人的故事(例如妇女、黑人、有色人种等等)仍然被如此骇人听闻地埋葬着。我在结束谈话时不假思索地说,“嗯,我在考虑开一个播客,这个播客是……因为没有更好的词,关于人工智能伦理的更激进的。”

大约一个星期后,我们再次见面进行计划,“激进的人工智能播客”诞生了。问题是,我们仍然不完全确定“激进”一词在我们工作的上下文中是什么意思。当我住在纽约市时,我来自一个社区组织和诗歌背景,我对我所说的“激进”有一些印象,但很难找到语言。这个项目既是一个提升优秀学者的采访空间,也是一个让我们收集一系列“激进人工智能”定义的空间。

当我们开始采访人们时,加利福尼亚的一个组织联系了我们,这个组织已经开始在“激进人工智能”的旗帜下组织起来我们会见了他们,不仅讨论了可能的合作伙伴关系,还想看看我们对“激进人工智能”的定义是否相似。他们的定义如下:激进的人工智能始于一个共同的理解,即社会分配权力不均衡——将有色人种、黑人、土著人、妇女、同性恋、穷人、残疾人和其他许多群体推向边缘。从这些根源开始,激进的人工智能研究了人工智能如何重新安排权力,并批判性地与激进的希望接触,即我们的社区可以梦想出不同的人/人工智能系统,帮助将权力放回到人们手中。

使用这个定义作为起点,我们开始计划我们的标志设计。我们希望设计具有包容性,代表我们希望提升的人民和价值观,并体现我们对权力再分配的呼吁。对我们来说不幸的是,这个起点没有考虑到“激进”可能具有的全部含义,我们即将犯下一个我们很快就会后悔的错误。

第二课:身份表示很重要

我们想要一个有着莫霍克发型的酷儿朋克雌雄同体机器人。你不能编造这些东西。杰斯和我都是白人,直男,身体健康。我们设计标志的第一步是告诉我们的平面设计师模仿尚未发布的《赛博朋克 3030》中的一个角色。让我们开门见山地说:这是一个巨大的错误。我们拥有它。

标志的尝试:巨大的失误版

我们的心肯定是好的。他们的想法是‘好吧,如果我们试图提升现状之外的身份,那就大胆地去做,把这些身份放在我们的标志中心。’不幸的是,正如许多通往地狱的道路一样,这条路是由良好的意愿铺成的。起初,我们看不到,我们不仅狭隘地定义了可能符合“激进”泡沫的身份,从而成为简化论者,我们还创造了我们都不代表的身份的品牌。

值得庆幸的是,在发布这个标志之前,我们与人工智能伦理领域的几位朋友和导师进行了交谈。我们可以很快看出他们对我们采取的方向不满意。他们很有帮助,诚实地指出了我们的盲点。特别是,他们有助于将“激进”的概念从任何一个群体或一组身份中分离出来,转而将其根植于我们植根于权力和共同价值观的原始定义中。

我们无意中让我们隐藏的偏见和对身份分组的假设妨碍了创建一个更具包容性的标志。所以我们又回到了起点。

第三课:有时候简单是最好的

我们与我们的设计师合作,回归到我们对激进人工智能的最初定义以及支撑它的价值观。从那里,我们确定了隐喻,代表了我们认为作为播客的基本项目。我们想出了诸如“奉献”、“播种”和“根除滥用权力的制度”等短语。然后我们想出了一些符号来概括这些隐喻,最后落在了:一只手、土壤和一棵树苗。当我们朝着最终形象努力时,我们有三个目标:

1.对于图像来说,帮助听众能够有空间来解释和定义自己的“激进的人工智能”。

2.标志代表了韧性和希望。

3.为标志要简单,而不是规定性的或过于复杂。

经过几周的反复,我们想出了下面的标志,这是现在激进的人工智能的标志:

标志马赫 3:我们结束了

我们喜欢这个标志是因为它简单,代表了我们的价值观,并创造了一种运动,弹性和希望的感觉。虽然我们对来自我们社区的反馈保持谦虚和开放的态度,但是到目前为止,我们已经收到了积极的反馈,并且对这个项目的结束感到满意。

结论:这和技术设计有什么关系?

在技术领域,我们经常忘记这三条经验: 语言很重要,身份表示很重要,有时(通常)简单的解决方案是复杂问题的最佳解决方案。

通过尝试、失败和从这个标志设计过程中的错误中学习,我意识到我们这些设计和消费技术的人把这些教训记在心里是多么重要。

道德的核心是关于我们如何将我们的价值观融入世界。这包括我们如何创造和消费技术。对于我们这些处于设计岗位或创造公共品牌岗位的人来说,我们必须对我们使用的语言、我们可能无意识地带入工作中的偏见、我们分享的图像对下游的影响,以及我们给简单可能更好的解决方案带来的复杂程度保持警惕。

我为我的女朋友做了一个游戏作为我们周年纪念的礼物。你也能做到

原文:https://towardsdatascience.com/i-made-a-game-6beb4d35593d?source=collection_archive---------18-----------------------

为你爱的人提供简单的应用程序

所以你决定为你爱的人创造一些神奇的东西,却对自己应该做什么毫无想法。好了,不要再看了,因为我要带你做你的第一个问答游戏,这让每个人都很惊讶。

当我和我女朋友的一周年纪念日即将到来时,我不得不想出一些非常好的东西。我是学计算机科学的,所以自然地,把我日常教育生活中的技能包括进来是有意义的。在思考这个问题的时候,我知道我想做一些和我们夫妻有关的东西,但也要有趣和容易“玩”

这是我想到的:

智能手机应用程序。小测验。奖励。

卡尔·劳在 Unsplash 上的照片

看起来很简单,对吧?实际上是。你的伴侣所要做的就是打开田地,做一个小谜语(这对你们的关系有意义),然后你奖励他们一份礼物。

我们谈完了,让我们开始这个项目吧。

写下问题和奖励的想法

拿一张纸,立即开始写下你能想到的与你和他们有关的一切。开一些有趣的玩笑,但也要给神秘感留些空间,让他们猜猜会有什么回报。

这个礼物可以由许多小礼物组成,比如鲜花、项链、糖果等等。

应用程序本身

我在安卓工作室创建了这个应用。它可以免费使用,并且非常容易安装和设置。

创建新项目

Android Studio 的欢迎屏幕

打开 AS 时,启动一个新的 Android Studio 项目。

接下来它会问你,你想要什么样的项目,你应该从一个“空活动”开始。

项目类型

你可以给你的项目命名,选择位置,还可以告诉 AS,你想要哪个 android 版本,它会告诉你设备的兼容性。

项目配置

android 设备图表

当你设置好一切,点击完成,这就是全部,一个新的窗口将会打开,让你开始。

项目开始

一旦开始,就没有限制,工作室里的一切都是你可以使用的,你的想象力必须能够拓宽你的应用程序的视野,并获得令人惊叹的效果!

Android Studio 中至关重要的是 Pallete 和文件概述。

从调色板中添加元素并查看每个文件(活动、布局、字符串、图像……)。

就我的想法而言,我将提出以下几点:

欢迎屏幕

让他们有家的感觉,用一点信息告诉他们你有多爱他们,并添加一个按钮进入游戏。

此外,添加一个背景图片,使其更温暖。

当您转到另一个屏幕时,您应该创建一个新的活动,并且最好让它再次为空。

右键单击布局创建新布局。

恶作剧

问题领域。在屏幕上创建许多按钮,让他们点击后打开新的屏幕。和以前一样,打开新活动,只需创建一个新活动,并为其命名即可!

这是从我创建的应用程序和它可能会如何寻找你,但你可以自由创造自己的想法!

在礼物和问题中,可以隐藏在测验中的字段后面,你可以做的是放一条短消息,如果这是你喜欢的东西,就倾吐你的心声!

在短消息和告诉他们你有多爱他们之后,添加一些最喜欢的情侣照片作为幻灯片,这也很容易。

我没有深入这个想法的编码部分,但是如果你想让我写一篇更多的编码文章,请告诉我!
这里有一个链接到一个教程让你开始。
网上那么多教程,真的不难!

激励的遗言

如果这是你第一次编程,它可能会变得令人沮丧,不要担心,因为这是随之而来的。然而,保持决心,不要放弃。谷歌一切。

我希望你喜欢这个应用程序的想法,我希望你在做了一些很棒的东西后有一段美好的时光!

我为身为数据分析师的您撰写了这篇 SQL 学习入门文章

原文:https://towardsdatascience.com/i-made-this-introductory-sql-learning-article-for-you-as-a-data-analyst-897c9e6a2cb6?source=collection_archive---------35-----------------------

SQL 对于寻找数据分析师的职位仍然是重要和必要的

SQL(结构化查询语言)已经有几十年的历史了。SQL 听起来可能不像 Python 或 R 这两种更现代的流行编程语言那样花哨,但它一直是成为数据分析师的要求的一部分。

以下是数据分析师的工作要求。正如你所看到的,SQL 的丰富经验是这篇文章的必备条件。

哪个公司的?

特斯拉。精通 SQL 让你有更高的机会成为许多大公司的一员。在 Linkedin 上,有超过 7100 条关于美国“SQL 数据分析师”的结果。

我相信这些图片已经足以证明 SQL 的重要性。凭借多年的 SQL 编码经验,我将在这里指导您如何在数据分析师级别使用 SQL。由于这篇文章是给没有任何先验知识的人看的,所以我会把一切都解释透彻。此外,我将只讨论查询和分析部分。因此,不会有 insert into/update/delete/alter table…语句。所有语句都以“Select”开头。

我们开始吧。

Unsplash 上 AltumCode 拍摄的照片

展示的数据集来自卡格尔的学生饮酒量(链接)。模式名为“dataset”,表名为“student_mat”

基本的选择语句

要从表中查询记录,您需要知道哪个表中哪个列是必需的。因此,在每个用于查询的 SQL 语句中,您必须在语句中提供这样的信息。基本陈述是

SELECT * FROM dataset.student_mat;

这个声明有四个部分。第一部分是关键字select,用于从数据库中选择记录。第二部分是 select 子句,*。这部分是输入你要查询的列。*表示查询表中的所有列。第三部分是另一个关键字from,最后一部分是from 子句dataset.student_mat。最后一部分是输入表的名称。dataset是一个模式的名称。模式是表、视图等的集合。您可以将模式视为一组表,而dataset是这个组的名称。student_mat是表名。该语句末尾有一个分号;表示该语句结束。(尽管在一些 SQL 数据库系统中,并不要求以分号结尾,但在这里我只包括它。)我们可以将这条 SQL 语句解释为“查询模式“dataset”中表“student_mat”的所有列。”需要记住的一点是,关键字是不区分大小写的。因此select相当于SELECTSelect

这个语句的结果将是这样的:

SELECT * FROM dataset . student _ mat;

如上所述,您可以用您想要的列名替换*。结果将只包括那些列。

select 学校,性别 from dataset.student

有要求—在哪里

但是在大多数情况下,如果不是全部,您不希望查询表中的所有记录。您希望查询符合特定条件的记录。然后我们需要扩展 SQL 语句。where是你需要包含在语句中的内容。例如,我们希望查询学校是 GP 的表中的所有列。我们可以把前面的陈述扩展到

select * from dataset.student_mat **where school = 'GP';**

where是表示查询条件的关键字。where条款school = 'GP'是代表“学校等于‘GP’”的标准。。注意GP是用单引号引起来的。这对单引号对于作为标准值的字符串是必需的。如果标准值是数字,则没有引号,如下所示

select * from dataset.student_mat where age = 18;

结果将只包括符合条件的记录。

select * from dataset.student_mat 其中 school = ' GP

如果需要同时满足一个以上的标准,您可以用连接词and进一步扩展where子句。

select * from dataset.student_mat where school = 'GP' and sex = 'F';

select * from dataset.student_mat 其中 school = 'GP ',sex = ' F

以上示例选择学校等于“GP”且性别等于“F”的记录。但是如果我们想要选择一个列不等于某个值的记录呢?那你应该改用!= or <>。在大多数数据库系统中,它们是等价的。个人比较喜欢!=

select * from dataset.student_mat where school = 'GP' and sex != 'F';

select * from dataset.student_mat 其中 school = 'GP '和 sex!= ' F

此外,如果您想要查询满足任一条件的记录,您可以使用连接词or而不是and

select * from dataset.student_mat 其中 school = 'GP '或 sex!= ' F

如果您想要过滤具有多个标准值的列,而不是逐个创建并用and连接它们,您可以使用in来包含一列的所有标准值。

select * from dataset.student_mat where Mjob in ('health','other');

select * from dataset . student _ mat where Mjob in(' health ',' other ');

对于数值标准值,除了使用=!=外,还可以使用其他运算符>, <, >= and <=来构建标准。

select * from dataset.student_mat 其中年龄> = 16;

您可能已经注意到,关键字可以用来将 SQL 语句分解成不同的部分。并且使用这些关键字的顺序受到限制。不能将from放在select之前或where之后。

下面显示了一个更复杂的标准条件的例子。

select * from dataset.student_mat where ((school = 'GP' and sex = 'F') or (school = 'MS' or age <18));

select * from dataset . student _ mat where((school = ' GP ' and sex = ' F ')or(school = ' MS ' or age < 18));

但是,在某些情况下,您不能或没有提供准确的条件字符串值。相反,您希望使用特定的模式来过滤列,比如以特定的字符作为开头。然后您可以使用带有通配符的like操作符。通配符有两种类型,%_。(在 Microsoft Access 中,它使用*?。)与其解释如何使用%_,我觉得不如直接去举例说明如何使用。

select * from dataset.student_mat where Mjob like 'o%';

select * from dataset.student_mat 其中 Mjob like ' o %

在这个例子中,where子句是Mjob like 'o%'%指一个、多个或空字符。该where子句表示选择 Mjob 列中值以“o”开头的所有记录,不管字母“o”后面有多少个或是否有任何字符。

select * from dataset.student_mat where Mjob like '%her';

select * from dataset.student_mat 其中 m job like“% her”;

然后在这个例子中Mjob like ‘%her’过滤值以‘她’结尾的记录。所以“其他”和“教师”都包括在选择中。

此外,您可以将%放在字符中间,以便包含具有特定开始和结束字符的值。

一旦你理解了%,那么就很容易理解如何使用_%_的区别在于_只代表一个字符,而%代表一个、多个甚至空字符。

select * from dataset.student_mat where Mjob like 'o_h_r';

select * from dataset.student_mat 其中 Mjob like ' o _ h _ r

聚合-分组依据

SQL 的另一个常见应用是执行数据分析。我们更多的是在数据分组后进行数据分析。例如,您可能想知道表中每个学校的记录数,或者想知道每个性别的平均年龄。此时,您需要在 SQL 语句中包含group by。例如,如果您想知道每个学校的记录数量,分组级别是school,因此您必须在 SQL 语句中包含group by schoolgroup by语句跟在where语句后面。而且,您必须在select子句中包含school才能返回每个组的名称(在本例中是学校)。

下一步是计算每组的记录数。对于这一部分,我们需要在select子句中包含一个聚合函数count。每个聚合函数后面都有一个花括号,其中包含此类聚合的列名。既然要算学校,可以在select语句中包含count(school)。但是,对于count函数,不需要指定要统计哪一列,因为选择哪一列没有区别。事实上,你甚至可以输入count(1)来计数。

select school, count(school) from dataset.student_mat group by school;

select school,count(school from dataset . student _ mat group by school;

结果显示了学校中每个组的记录数。

此外,我们可以将分组级别扩展到多个列。

select school, sex, count(school) from dataset.student_mat group by school, sex;

select 学校,性别,count(学校)from dataset.student_mat group by 学校,性别;

下面是您可以在select语句中使用的聚合函数:count, max, min, sum, avg

select school, avg(age) from dataset.student_mat group by school;

select school,avg(age)from dataset . student _ mat group by school;

别名—作为

正如您在前面的示例中看到的结果,平均年龄的列名变成了avg(age)。它仍然是可以自我解释的。但是当然,如果我们重命名这个列名就更好了。然后我们可以在avg(age)之后包含as,并给这个列取一个新名字。我们还可以修改select语句中其他列的名称。

select school as school_name, avg(age) as average_age from dataset.student_mat group by school;

select school 作为 school_name,avg(age)作为 average _ age from dataset . student _ mat group by school;

我建议不要在列名中包含空格,因为这只会在您在select语句中进一步选择该列时带来麻烦。

排名—排序依据

order by语句帮助您按照一列或多列的升序或降序对返回的数据进行排序。默认顺序是升序,因此不需要指定。如果要按降序排序,必须在order by语句中的列名后面加上desc

select school as school_name, sex, count(school) as num_count 
from dataset.student_mat group by school, sex order by school, sex desc;

select school as school_name,sex,count(学校)as num _ count
from dataset . student _ mat group by school,sex order by school,sex desc;

order by语句是order by school, sex desc。因此,返回的结果第一个订单列school由于没有指定而被升序排列。然后sex降序排列。结果是,(GP,M)在(GP,F)之前,而(GP,F)在(MS,M)之前。

到目前为止,我已经讲述了 SQL 在查询和数据分析方面的基本用法。对于一个完全没有 SQL 经验的初学者来说,我相信这篇文章可以帮助你毫无困难地快速学习基本的 SQL 应用。请告诉我这篇文章是否对你有所帮助,或者你是否想进一步了解其他 SQL 用法,比如 join、having 或 window 函数。下次见。

我从工程转到了数据科学:有什么区别?

原文:https://towardsdatascience.com/i-moved-from-engineering-to-data-science-what-are-the-differences-50121ceef70d?source=collection_archive---------1-----------------------

转向数据科学:如果你是工程背景,你需要知道什么。

被我重新感动。vectorpouch / Freepik 的原创作品

答几年前,我做出了人生中的一个重大决定,离开了一家德国科技巨头的工作,去追求数据科学的更高学位,并将我的职业生涯转向这个领域。当我决定的时候,我可能没有考虑到这一点,可能是因为我对许多来自欧洲的销售人员的伟大创新想法太着迷了。尽管这些愿景让我对人工智能在许多行业的潜力有了概念性的理解,并激励我做出改变,但到目前为止,我还没有看到这些想法在现实中变成现实。就像我的一个朋友曾经相信,如果他知道如何建立一个好的机器学习模型,他就能预测股票价格,成为亿万富翁。这是他探索数据科学的动机,带着这种热情,他因为他强大的模型赢得了许多 ML 竞赛。然而,迄今为止,他还不是亿万富翁,尽管他因自己的才华获得了极高的薪水。如果有一天他成功跟踪预测了指数,我会让你知道。

回到故事,这种职业转换,然而,给了我很多机会去探索可能性,扩展我的知识,在另一个国家生活,更重要的是,在一个新的领域工作的经验,与我正在工作的工程领域相比,有许多不同的方面。那么有什么区别呢?

瀑布 vs 敏捷

快速失败,经常失败

这是敏捷的关键概念,敏捷是一种广泛应用于软件开发和数据科学领域的项目管理方法。这里的想法是,快速失败将允许我们从错误中快速学习,而失败通常帮助我们更频繁地执行这种学习和错误循环,以在下一版本中交付更好的产品。敏捷并不是最好的,但是到目前为止,它和 ML 项目有着很好的结合。基本上,一切可重复和可迭代的东西对敏捷来说都是完美的。可以重新训练模型以获得更好的准确性和性能,可以用另一种方法处理数据以获得更清晰的输出,可以修改可视化以传递更好的信息。

然而,由于产品的性质,瀑布或按顺序做事更适合工程项目。例如,当你已经在 20 级建造时,你不能破坏和重做塔的 2 级。此外,即使在开发过程中,也必须不惜一切代价避免工程上的失败。当电缆被埋在地下几米的时候,从错误中吸取教训的唯一方法就是等到下一个项目。或者当你在管理一个建筑工地时,你不希望这种“快速失败,经常失败”的事情发生,因为有人可能会因此受伤。

软件错误造成的损害

“404 找不到错误页面”

我必须承认,在之前的工程生涯中,我确实用代码中的 bug 搞砸了很多事情。你可能想知道为什么软件会引起爆炸,伙计们,我不是在这里谈论制造炸弹。这里的意思是,作为一名工程师,你做的每一件事都会有直接的物理 影响,因此一个软件错误可能意味着严重的物理 损害。让我们看看下面的简单代码:

IF (#currentPressure > #pressureHighLimit) THEN
    #pumpOut := 0;
END_IF;

这是用于保护泵系统的代码。对于许多软件开发人员来说,这看起来很简单,因为他们甚至可以在不了解这种编程语言的情况下解释它。该代码表示:“如果当前压力大于阈值,则必须停止泵”。我想你现在可能对这里的情况和我们为什么需要这段代码有一点了解了。如果由于另一端的堵塞,管道内的压力持续增加,管道可能会爆炸。即使是算法也是显而易见的,知道由软件控制的实际物理组件如何相互作用是极其重要的。错过一个条件是相对容易的,当一个软件错误可能引起爆炸并可能有人受伤时,一切都可能完全出错。

在数据科学中,错误是指未处理的异常、数据处理管道错误、选择次优模型参数或导致数据泄露的后门。这些“错误”可能会对客户体验产生负面影响,直接影响业务,甚至给组织带来声誉损害。因此,在将软件部署到生产环境和扩大规模之前,需要“快速失败,经常失败”的策略,以便在开发过程中尽早发现这些失败。即使在操作过程中出现了错误,也可以通过软件更新来修复。

当苹果急于在 2019 年如期发布 iOS 13 时,许多用户遇到了电池耗尽、蓝牙连接不可靠、Apple pay 和移动数据服务问题等几个问题。不久之后,他们发布了某些补丁来修复漏洞,并在几轮更新后迅速改进了操作系统。

然而,同样在 2019 年,由于用于控制飞机稳定性的软件存在漏洞,波音公司没有机会在 737 Max 事故中做到这一点。他们还召回了所有的飞机进行软件更新,但为时已晚。189 人在空难中丧生,737 架 Max 飞机在全球停飞,43 亿美元的市值蒸发,首席执行官不得不下台。当团队试图在截止日期前完成任务时,一切都是从几行错误代码开始的。

当工程中发生事故时,人员损失将首先出现,然后是财务损失,而在软件开发或数据科学中,对业务的影响将是首先出现的,如果有人因股价下跌而跳楼,人员损失可能会发生。

安全与安保

“安全第一”

没有一个系统是完美的,失败总是会发生。然而,当这些事件发生时,处理它们的优先级在工程和数据科学之间是不同的。

你可能在开车经过建筑工地或参观工厂时看到过“安全第一”的标志。事实上,安全是工程领域的重中之重,保护原则是以人为本。例如,当出现可能导致人员触电死亡的危险故障时,保护电路断路器必须切断电源,甚至企业可能会因这种停机时间而损失数十亿美元。

说到数据科学,数据是受保护的对象。数据治理和安全性将被赋予最高优先级,所有应用程序都必须遵守这些要求。如果一个人工智能应用程序违反了治理框架并构成数据泄露的威胁,那么无论模型有多精确,它都不会被部署到生产中。这些是数据科学家在数据科学项目中获取数据时必须处理的第一个也是最大的问题,尤其是敏感和高价值的数据。

标准与惯例

" ISO 45001 "

工程师在设计产品时必须遵循特定的标准,而在数据科学领域,约定俗成更为流行。

例如,Python 中的变量应该这样命名:first_variable,second_variable,等等。或者在有监督的机器学习问题中,应该使用“X”和“y”来分别命名特征集和目标变量。这些约定从来没有写入任何法律文件,我们都知道这样命名变量是合法的:“thisismyvariable”,尽管你可能会成为开发人员和审查人员眼中的怪人。

相比之下,当国家标准中写道:“一般电源插座不得安装在离地面小于 75 毫米的地方”时,那么在设计中,所有工程师和承包商都必须遵循这一规定。如果他们试图将电源插座安装在低于标准距离的位置,并且有人由于这种不正确的安装而触电身亡,将会发生严重的法律诉讼。

薪水

“哪个工作工资高?”

我想这是你们大多数人最感兴趣的部分。我将告诉你我的个人经历,即使这可能是主观的,而不是提供数字和可视化以及工资见解的报告。

虽然面临着更高的风险和许多严格的法规,但工程师的平均工资低于数据科学家。我是一名在工厂自动化领域工作了 8 年多的工程师,我作为工程师的最后一年收入仅比我作为入门级数据科学家的当前工资高一点。

然而,工程顾问可能比中高级数据科学家挣得多。一些在阿联酋和北欧大型项目中工作的控制工程师职位,提供的薪酬是澳大利亚数据科学家职位平均薪酬的两倍。想象一下,你只需要工作六个月就可以得到你需要工作一整年才能得到的收入。这可能意味着半年工作,半年休假。

职业发展

“这不仅仅是钱的问题”

工程可以被认为是一个传统行业,在这个行业中,经验往往比创造力更重要。除非你转到管理层,否则工程领域的顶级职位已经饱和,人力资源配置也没有太多变化。由于工程师总是受到国家和地区标准的限制,在另一个使用不同标准的国家工作对他们来说绝不容易。由于这个原因,他们不太可能成为全球员工,最终在同一个职位上呆上十年以上。

另一方面,由于数据科学是一个具有光明未来和机遇的新兴领域,作为一名数据科学家将为员工提供更大的职业发展空间和拓展可能性。此外,除了数据保护政策,数据科学家通常不会受到当地法规的限制。例如,无论数据科学家来自哪里,Python 编程语言的使用方式都是一样的。换句话说,这些技能可以跨境转移,因此数据科学家更容易在其他国家申请工作。

未来

“销售人员怎么说?”

我相信,数据科学和工程之间将会有一个交叉点,这两个领域之间的界限将变得模糊。工业 4.0 实际上是数据科学和自动化工程的结合。与具有固定或结构化程序的传统控制系统相比,大数据资源的分析结果可以为自动化系统提供见解,以做出自己的生产决策,并且制造过程将动态执行。虽然将人工智能作为大脑,将机械系统作为肌肉的想法尚未成功和广泛实施,但数据科学和工程的融合过程已经开始。

一些工程项目现在能够通过使用模拟来应用敏捷模型。工程师可以快速设计虚拟原型,并使用模拟数据在下一次迭代中改进他们的设计。通过这种方式,他们可以预见设计中的大多数潜在故障,并缩短产品的上市时间。三年前,我有机会使用一种叫做 digital-twin 的技术来测试我的程序,然后在真正的工厂上运行它。我可以建立一个我正在工作的机器的虚拟模型,并运行我的程序来控制该机器的虚拟机械部件。通过使用虚拟工厂,我能够在不破坏实际管道的情况下快速测试我的程序,因此实施阶段的风险大大降低。

另一个例子是预测性维护应用,其中可以收集和分析来自设备周围传感器的数据,以提前预测该设备何时无法执行必要的维护。我可以使用泵周围的流量计、压力变送器和温度传感器的数据来评估当前性能,并预测泵即将出现的机械故障。这将有助于管理层在维护计划、生产调度和减少停机时间方面变得更加主动。

结论

虽然这个故事似乎给了数据科学更多的信任,但我并不鼓励你离开你的工程工作,转行。有时候,这不仅仅是在两者之间画一条线并选择其中之一,更重要的是,这是关于你如何看待未来 5 年或 10 年的自己,以及如何弥合未来的技能差距。

我只是希望这个基于我个人经历的故事能让你对这两个领域有一个清晰的了解,这样你就能以此为参考来规划你的下一步。例如,如果你是一名数据科学家,你可以选择了解更多关于使用电子板开发物联网和大数据应用的信息。或者,如果你目前是一名电气工程师,你可以开始研究时间序列模型,它可以用来预测家庭的电力消耗。

最后,永远记住,你的激情终究会引领你走向更美好的未来。

我从没想过我会有这种顿悟。

原文:https://towardsdatascience.com/i-never-thought-i-would-have-this-epiphany-b0a4b6f86e90?source=collection_archive---------39-----------------------

我为什么选择数据科学。

当我发现数据科学时,我觉得这个世界一直在向我隐瞒一个奇怪的秘密。为什么没人给我发短信说,

“森林!听我说。如果你正在寻找一份职业,可以将你对重复、平凡任务的热爱(让我们面对现实吧——预处理数据很乏味,但我真的很喜欢它)与你对解释复杂主题的热爱(我是一名数学教师,曾在苹果公司担任 iOS 技术支持)结合起来,并渴望将你的技术能力用于实际上可以改变世界的项目,然后成为一名数据科学家。”

不幸的是,我没有收到这样的信息,不得不自己得出这个结论。

我最大的挣扎之一一直是试图找出我在“职业世界”中的位置。大学毕业后,我放弃了我的职业生涯,因为虽然它有技术方面(金融分析师),但它从来没有真正的人的方面。此外,我觉得如果我把剩下的时间都花在通勤上班上,我会疯掉的。

我想要一份工作:

  • 我可以利用位置独立性。
  • 解决了独特而有趣的问题。
  • 允许我在一段时间里做内向的自己。
  • 但也给我留下了足够的空间,让我以一种有意义的方式与他人互动。
  • 触及了广泛的独特而有趣的问题。
  • 哦,而且薪水很高。什么?想把包包安全,没有错。

如果我列举我在寻找这个神秘职业时走过的所有兔子路,那真的会很无聊,但是让我们说这个发现来之不易。

好吧,酷。

所以我发现了数据科学——你不能打个响指就得到你的第一个角色(不幸的是——有人在研究这个吗?).我的兴趣是一致的,但是唉,我的技能不是。

还好!大约在同一时间,我还发现了“新兵训练营”。具体来说,我发现了 Flatiron 为期五个月的全职、完全远程数据科学训练营。

新兵训练营有不同的观点,如果我不得不猜测的话,你的观点可能与你的学习风格相对应。对于那些说“训练营毫无意义”的人来说!你可以通过网上的免费资源学到你需要的一切!!"

你 100%正确!不幸的是,为了浏览大量的材料,我需要一点结构来学习。熨斗是完美的组合,因为当我们每天上课时(不是强制性的!)和每周与我们的讲师进行交流,这或多或少是一门非常自学的课程。就像戴着保险杠去打保龄球一样。

课程。

总共五个月,我们涵盖了…..很多。

我们首先介绍了 SQL 和 Python,重点是 Python。我们了解了数据科学中使用的主要库(Pandas、NumPy、Seaborn、MatplotLib、ScitkitLearn),以及如何有效地使用和导航 GitHub。

然后我们有了一个完整的统计单元!思考:A/B 测试、统计分布、概率论、线性回归等。

然后我们进入了课程的核心部分:机器学习。这对我来说是最令人兴奋的部分,当我真正开始感觉到生活很快就会变成什么样子。

在介绍了机器学习中使用的基本模型后,我们过渡到了“大数据”、深度学习和 NLP。

在整个课程中,我完成了近 200 个实验,5 个使用真实世界数据集的项目,阅读了无数关于数据科学的课程和文章,并观看了更多关于梯度下降和神经网络的视频,我不想一一列举。

总体来说?太棒了。

现在。

现在吗?我已经开始了这个过程中最无趣的部分:找工作。

在早期,这绝对是一个挑战。人际关系从来都不是我的强项,我肯定也在和自己的冒名顶替综合症做斗争,但我正在学会相信这个过程,相信完美的职位会出现——是的,即使是在 COVID 时代。

会的。总是这样。

感谢阅读。更多的技术文章和操作方法正在准备中。

🌲🌲🌲(森林)

我对谷歌的开放图像数据集进行了错误分析,现在我有了信任问题

原文:https://towardsdatascience.com/i-performed-error-analysis-on-open-images-and-now-i-have-trust-issues-89080e03ba09?source=collection_archive---------32-----------------------

深入分析

我用 SOTA 物体检测模型重新评估开放图像,结果发现超过 1/3 的假阳性是注释错误!

在开放图像数据集上由于缺少地面实况而导致假阳性的例子

现代基准数据集

随着在大规模数据集上训练的深度学习模型的性能不断进步,大规模数据集竞赛已经成为最新和最伟大的计算机视觉模型的试验场。从 MNIST(只有 70,000 张 28x28 像素图像的数据集)成为事实上的标准的时代开始,我们作为一个社区已经走过了漫长的道路。为了训练更复杂的模型来解决更具挑战性的任务,新的、更大的数据集应运而生:ImageNet、COCO 和谷歌的 Open Images 是最受欢迎的。

但即使在这些庞大的数据集上,顶级模型的性能差异也在缩小。 2019 开放图像检测挑战赛显示,前五名团队在平均精度(地图)中的差距不到 0.06。对于 COCO 来说就更少了。

毫无疑问,我们的研究团体在开发创新的新技术以提高模型性能方面做出了贡献,但模型只是图片的一半。最近的发现越来越清楚地表明,另一半——数据——至少起着同样重要的作用,甚至可能更大。

就在今年…

  • …谷歌和 DeepMind 的研究人员重新评估了 ImageNet ,他们的发现表明,最近的发展甚至可能没有找到有意义的概括,而只是过度适应了 ImageNet 标签程序的特质。
  • …麻省理工学院在一篇论文揭露了 8000 万张图片中的一部分包含种族主义和厌恶女性的诽谤之后,已经对这个微小的图片数据集进行了横向绘制。
  • …分别来自斯坦福和谷歌的 Jo 和 Gebru】认为需要通过类比更成熟的数据归档程序,将更多注意力放在数据收集和注释程序上。
  • …来自加州大学伯克利分校和微软的研究人员进行了一项研究表明,当使用自我监督的预训练时,人们可以通过关注第三个轴数据本身,而不是关注网络架构或任务/损失选择,来实现下游任务的收益。套用一句话:关注数据不仅是一个好主意,在 2020 年这还是一个新颖的想法!

这是该领域的两位领导者对此的看法:

  • “在构建实际系统的过程中,通常有更多的人工错误分析和更多的人类洞察力进入这些系统,这比深度学习研究人员有时愿意承认的要多。” —吴恩达
  • 与数据融为一体”——安德烈·卡帕西在他关于训练神经网络的热门文章

有多少次你发现自己要花费数小时、数天、数周的时间在数据中寻找样本?您是否对人工检查的必要性感到惊讶?或者你能想出一个比你应该相信的更多的时候吗?

计算机视觉社区开始意识到我们需要接近数据。如果我们想要行为符合预期的精确模型,光有大型数据集是不够的;它需要正确的数据并且需要准确的标记。

每年,研究人员都在争夺登上排行榜榜首的机会,而决定命运的是极其微弱的差距。但是我们真的知道这些数据集发生了什么吗?地图上 0.01 的空白有意义吗?

开放图像数据集上的误差分析

随着另一个开放图像挑战刚刚结束,调查这个流行的基准数据集并尝试更好地理解具有高 mAP 的对象检测模型意味着什么似乎是唯一合适的。因此,我决定对一个预训练模型进行一些基本的错误分析,目的是观察数据集环境中的错误模式,而不是模型。令我惊讶的是,我发现这些错误中有很大一部分实际上并不是错误;相反,数据集注释是不正确的!

什么是错误分析?

误差分析是手动检查模型预测误差的过程,在评估期间识别,并记录误差的原因。你不需要看整个数据集,但至少有足够多的例子知道你在正确地逼近一个趋势;假设最少 100 个样品。打开一个电子表格,或者抓起一张纸,开始记笔记。

为什么要这么做?也许你的模型所处理的大部分图像都是低分辨率或者光线不足。如果是这种情况,向训练集添加更多高分辨率的明亮图像不太可能表现为模型准确性的显著提高。数据集的任何数量的其他定性特征都可能起作用;找出答案的唯一方法就是分析你的数据!

准备分析

我使用这个快速 CNN+InceptionResNetV2 网络在开放图像 V4 测试集上生成了预测。这个网络似乎是一个理想的选择,因为它是在开放图像 V4 上训练和评估的,具有相对较高的 0.58 的 mAP,并且公众可以通过 Tensorflow Hub 轻松获得。然后我需要单独评估每张图片。

Open Images 使用一种复杂的评估协议,考虑等级、分组,甚至指定已知存在和已知不存在的类别。尽管有专门支持开放图像评估的 Tensorflow 对象检测 API 可用,但需要一些重要的代码来获得每张图像的评估结果。为什么这个不是原生支持的?无论如何,我最终能够准确地确定每个图像的检测是真阳性还是假阳性。

我决定过滤检测,只查看那些置信度> 0.4 的检测。这个阈值大概就是真阳性数量超过假阳性数量的点。

错误类型

该分析的结构受到了 2012 年的一项研究的启发,该研究采用了两个最先进的(当时的)检测器并进行手动误差分析。Hoiem 的小组创建了诸如定位错误、语义相似对象混淆和背景误报等类别,但有趣的是没有任何与地面真实错误相关的内容!

我把误差的原因分成三组:模型误差、地面真实误差和其他误差,每一组都有一些特定的误差原因。接下来的部分定义了这些特定的错误并提供了示例,以便在我们查看错误分析的汇总结果之前提供上下文。

模型误差

模型误差是 Hoiem 的论文建立的一组常见误差,许多研究人员随后在他们自己的出版物中使用了这些误差。我在这里做了一个小小的修改,删除了“其他”错误,并添加了“重复”错误,这是“本地化”错误的一部分。

  • loc: 定位错误,即 IoU 低于阈值 0.5
  • 语义相似对象的混淆
  • 背景:与背景混淆
  • dup: 重复框,表示定位错误和真阳性都存在;这是从锁定中分离出来的一个类别,因为它被认为是一种非常常见的错误

模型误差的例子。左上:没有捕捉袖子的服装盒的定位错误。右上:与语义相似的物体混淆,因为一个填充动物被误认为是一只。左下:与背景混淆,被误认为是船。右下:两个重复的狗盒子围绕着同一只狗,定位错误。

地面真实误差

基本事实错误是假阳性的原因,其“错误”在于注记,而不是模型预测。如果这些被纠正,它们将被重新分配为真阳性。

  • 缺失:基础真相框应该存在,但不存在
  • 不正确:基本事实框存在,但标签不正确,或者在标签层次结构中不够具体
  • 组:地面真相框应标记为组,但不是

一个缺少基础事实的例子,汽车的后轮清晰可见,模型检测到了它,但是由于缺少基础事实,这被错误地标记为假阳性。

一个不正确基本事实标签的例子;在这种情况下,基本事实标签不够具体。这些猫鼬的真实标签是动物,站在右边的猫鼬的预测是食肉动物。 食肉动物技术上是正确的。基本事实不够具体。

群错的一个例子。玉米上的四个预测中的三个被正确定位并标记为蔬菜盒。(第四个是一个 dup )。然而,地面真相是围绕所有三个部分的一个单独的盒子。要修复这个注释,需要将地面真实边界框标记为一个组,或者用三个单独的框替换它,就像对右边的西葫芦所做的那样。

其他错误

最后,我们有不清楚的错误,这意味着边缘情况,预测是否正确并不明显。

  • 不清楚:模型错误?地面真实误差?问十个不同的人,你会得到十个不同的答案

幸运的是,这一类别仅占大约 6.5%的错误,但仍然需要注意的是,当试图创建一个可以对世界上的一切进行分类的标签层次结构时,总会有像这个模型预测为玩具的 circuit lady 这样的边缘情况。

你认为这是一个玩具吗?一个“责任”不清的错误例子

汇总结果

下表显示了对总共 125,436 个测试图像中的 178 个图像子集的分析结果。

由在开放图像 V4 测试集上的快速 CNN 对象检测模型检测的 275 个假阳性边界框的误差分析的结果。

这太疯狂了。36%的假阳性其实应该是真阳性!目前还不清楚这会对 mAP 产生什么影响,因为它是一个相当复杂的指标,但是可以肯定地说,官方报告的 mAP 0.58 低估了该模型的真实性能。

最常见的错误原因是缺少基本事实注释,占所有错误的 30%以上。这是一个具有挑战性的问题。要求一个没有丢失盒子的数据集是不现实的。许多这些缺失的注释是外围对象,而不是图像的中心焦点。但是这仅仅强调了需要容易的,可能是自动化的,将通过额外一轮审查的注释的识别。还有其他的含义。外围物体一般较小;当分割成小/中/大的边界框大小时,这些缺失的注释如何影响精确度?

其他一些错误原因——特别是重复的边界框、不正确的基本事实标签和组错误——表明了标注本体和标注协议的重要性。复杂的标签层次会导致不正确的地面真实标签,尽管这项研究表明开放图像并非如此。处理组是需要仔细定义和审查的另一个复杂因素;虽然不像其他错误原因那样普遍,但 7.6%是由于应该被标记为一个组的盒子引起的,这当然不是微不足道的。最后,重复的边界框至少部分可能是扩展层次结构的副产品。在开放图像对象检测挑战中,模型的任务是为分层结构中的每个标签生成边界框。例如,对于一个包含美洲虎的图像,开放图像挑战赛希望不仅能为美洲虎,还能为食肉动物哺乳动物动物生成盒子。这会不会无意中导致一个模型为同一个动物生成多个 Jaguar 盒子?更快的 RCNN 在区域建议后应用分类作为后处理步骤。因此,如果模型被训练为它看到的每只美洲虎生成四个盒子,那么这四个盒子有时获得相同的分类标签就不足为奇了。

下一步是什么?

如果这些基本事实错误得到纠正,开放图像排行榜会发生什么变化?这如何影响我们对什么策略最有效的理解?

应该注意的是,这些误差不仅仅是统计噪声。与 DeepMind 团队分析 ImageNet 的发现类似,开放图像中的注释错误也存在模式。例如,缺少人脸注释是误报的一个非常常见的原因,而树周围的边界框通常应该被标记为组,但实际上却不是。

这篇文章的目的不是批评开放图像的创造者——相反,这个数据集及其相应的挑战催生了巨大的成就——而是揭示了一个可能阻碍进步的盲点。这些流行的开放数据集的影响是深远的,因为它们经常被用作微调/迁移学习的起点。此外,如果流行的数据集受到注释正确性的困扰,那么在检查我们自己的数据集时,我们很可能会遇到同样的问题。但我肯定不是凭经验说的……咳咳

我们正处于重心转移的最前沿,数据本身被理所当然地认为与基于数据的模型同等重要,甚至更重要!也许我们会看到更小、更仔细管理的数据集越来越受欢迎,或者对主动或半监督学习等方法的需求越来越多,这些方法允许我们自动化和扩展注释工作。无论哪种方式,一个关键的挑战将是创建基础设施来管理动态数据集,这些数据集的规模会增长,并根据人类和机器学习模型的反馈而发展。这个新生的话题有很大的潜力!

可视化对象检测数据集

为了进行这项错误分析研究,我使用了 Voxel51 的数据可视化工具 FiftyOne ,这是一个 Python 包,可以非常容易地加载数据集,并通过代码和可视化应用程序交互式搜索和探索它们。下面是我在这项研究中执行错误分析时运行的 51 个代码:

想亲自探索这些数据吗?下载到这里!

想要在开放图像上评估自己的模型吗?试试这个教程!

想了解有关检查可视化数据集的最佳实践的更多信息吗?看看这个帖子!

参考

[1] L. Beyer 等人,我们对 ImageNet 的使用结束了吗? (2020)

[2] V. Prabhu 和 A Birhane,大型图像数据集:计算机视觉得不偿失的胜利? (2020)

[3] E. Jo 和 T. Gebru,来自档案的教训:在机器学习中收集社会文化数据的策略 (2020),公平、问责和透明度会议

[4]R . Rao 等人,多模态预训练数据选择的质量和相关性度量 (2020),计算机视觉和模式识别会议(CVPR)研讨会

[5] D. Hoiem 等人,物体检测器的错误诊断 (2012),欧洲计算机视觉会议(ECCV)

[6] S. Ren 等,更快的 R-CNN:利用区域提议网络实现实时目标检测 (2015),神经信息处理系统进展(NeurIPS)

视频游戏如何为人工智能应用提供优质数据

原文:https://towardsdatascience.com/i-play-video-games-but-not-for-entertainment-c20d28d998bf?source=collection_archive---------47-----------------------

当视频游戏被用作改善人工智能和机器学习应用的工具时

照片由肖恩·多在 Unsplash 上拍摄

我过去一直认为电子游戏只是为了好玩,从来没有认为它们只是另一种娱乐形式。

在进入最终改变我想法的过程之前,我想给你简单介绍一下我自己和我的工作。我是一名 AI 研究生研究员。我真的很喜欢从事对人们生活有直接影响的研究项目。话虽如此,我目前正在研究一种基于人工智能的计算机视觉解决方案,旨在帮助的盲人满足他们最重要的日常需求之一,即在环境中导航,而不会受伤或遇到障碍。

我不打算在这里完全解释我的项目,但我试图指出我在这个过程中遇到的最大问题,以及使用视频游戏如何帮助了我。

数据就是一切

几个月前,当我开始了解这个话题时,我不知道为这个问题开发一个安全的解决方案有多麻烦。但在所有的困难中,最不幸的是缺乏高质量的数据集。

提到的导航系统应该在户外环境中工作(主要在人行道上),并且没有人行道场景的数据集。特别是当我们在谈论人工智能和机器学习应用时,无论你的算法有多棒,你的方法有多聪明,当没有足够的高质量数据时,一切都失败了。

因此,我需要某种数据集来工作,过了一段时间,我开始考虑自己收集所有需要的数据。然后我面临两个大问题:

  1. 我单独收集这个数据集所需的时间总量
  2. 对大量数据进行注释和标记的成本

这些问题大到足以让我去想一个替代方案。几天后,我已经阅读了许多论文,这些论文大多是关于无人驾驶汽车或为无人机或机器人建造的导航系统的,我一直注意到这些论文中有一个共同的模式。他们中的大多数人都经历过和我一样的问题,他们的解决方案是使用模拟而不是处理真实世界的数据。使用模拟器,基本上可以零成本、快速地生成大量数据。

有很多用于开发自动驾驶汽车的模拟器,例如:

  • 卡拉模拟器
  • AirSim(微软)
  • Udacity 汽车模拟器
  • 深度驱动
  • Unity SimViz
  • TORCS(开放式赛车模拟器)

以及大量用于开发机器人导航系统的室内环境模拟器和数据集(又名具体化人工智能):

  • 人居 AI(脸书)
  • 迈诺斯
  • 吉布森
  • 复制品
  • MatterPort3D

视频游戏比开源模拟器好得多

尽管存在所有这些模拟器,我的问题仍然存在。上述开源模拟器都不适合我的用例。我需要一个超级真实的城市环境模拟,一些看起来完全像现实的东西,除了在高预算的商业游戏中,我在任何地方都找不到。我在 GTA V 中找到了我需要的一切,这是过去十年中发布的最好的开放世界动作冒险游戏之一。

照片可在 GTA Fandom Wiki:【https://gta.fandom.com/wiki/Grand_Theft_Auto_V? file=CoverArt-GTAV.png

这 3 篇论文研究了 GTA V 和类似的游戏,以提取有价值的数据集。它们为从商业游戏中提取数据的过程提供了有价值的见解。

  • 为数据而玩[1]
  • 为基准而战[2]
  • 来自电子游戏的自由监督[3]

通过使用这些论文提供的解决方案,我们不仅可以从游戏中提取 RGB 帧,还可以提取许多有用的基本事实,如实例分割、语义分割、包围盒、反照率、深度图和光流。

从游戏中收集数据所需的工具

GitHub 上有几个开源库,您可以使用它们轻松地从 GTA V 和其他视频游戏中提取信息。以下是一些最重要的问题:

  • Gamehook
  • DeepGTAV
  • 激光雷达
  • GTAVisionExport

除了这些工具,你还可以使用 RenderdocNvidia Nsight Graphics 手动拦截 GPU 渲染管道,从视频游戏中提取大量有用的数据。

到目前为止,我们发现了视频游戏如何被用来合成在视觉上接近真实世界的数据。在本文的其余部分,我们将讨论机器学习领域中视频游戏的另一个重要用例。

使用视频游戏开发更好的机器学习算法

视频游戏不仅用于提取逼真的数据集,还用于支持最先进的机器学习算法和优化技术。

机器学习的一个领域叫做强化学习,它已经存在了很多年,当英国公司 DeepMind 开发的著名人工智能 AlphaGo 与十年来最伟大的围棋选手 Lee Sedol 先生比赛,并在 2016 年的世界锦标赛中以 4 比 1 击败他时,它变得非常受欢迎。

强化学习是一种机器学习技术,它使代理能够在交互式环境(如游戏环境)中使用来自其自身行为和经验的反馈通过试错来学习。下面是由Shweta Bhatt在博客上发表的一篇解释kdnuggets.com用一种非常清晰的方式描述了游戏和强化学习的关系:

一个强化学习的问题可以通过游戏得到最好的解释。让我们以吃豆人的游戏为例,代理人(吃豆人)的目标是吃掉格子里的食物,同时避开路上的鬼魂。网格世界是代理的交互环境。吃豆人因吃食物而获得奖励,如果被鬼杀死(输掉游戏)则受到惩罚。州是吃豆人在网格世界中的位置,总的累积奖励是吃豆人赢得游戏。

强化学习与游戏的关联是如此不可避免,以至于许多行业巨头,如 DeepMind、微软、OpenAI 和 Unity,都已经开发了自己的开源游戏环境,以便为该领域做出贡献。这些是由这些公司开发的四种流行环境:

  • ****DeepMind 实验室:https://deep mind . com/blog/article/open-sourcing-deep mind-Lab
  • ****马尔默项目:https://www . Microsoft . com/en-us/research/Project/Project-Malmo/

微软研究院 Youtube 频道

  • OpenAI 健身房:【https://gym.openai.com/】T22
  • ****Unity ML-Agents:【https://unity3d.com/machine-learning】T2

游戏产业有如此多的潜力

人工智能正在快速进化和进步。在当今世界,尽管几十个行业都有难以置信的海量数据,但人们比以往任何时候都更需要高质量的数据。在计算机视觉领域,对于视频游戏和精确模拟环境可以部分提供的数据仍然有巨大的需求。游戏行业每天都在变得越来越先进,想想它能为人工智能行业带来什么样的进步是非常有趣的。

[1]https://arxiv.org/abs/1608.02192

[2]https://arxiv.org/abs/1709.07322

[3]http://open access . the CVF . com/content _ cvpr _ 2018/papers/Krahenbuhl _ Free _ Supervision _ From _ CVPR _ 2018 _ paper . pdf

我收集了超过 1k 的顶级机器学习 Github 配置文件,这就是我的发现

原文:https://towardsdatascience.com/i-scraped-more-than-1k-top-machine-learning-github-profiles-and-this-is-what-i-found-1ab4fb0c0474?source=collection_archive---------2-----------------------

从 Github 上的顶级机器学习档案中获得见解

动机

在 Github 上搜索关键词“机器学习”时,我找到了 246632 个机器学习知识库。由于这些是机器学习领域的顶级知识库,我希望这些知识库的所有者和贡献者是机器学习方面的专家或有能力的人。因此,我决定提取这些用户的个人资料,以获得对他们的背景和统计数据的一些有趣的见解。

马库斯·温克勒在 Unsplash 上的照片

在 GitHub repo 中,您可以随意使用本文的代码:

[## 数据科学/可视化/大师 khuyentran1401 的 github 数据科学

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/khuyentran1401/Data-science/tree/master/visualization/github)

我的刮痧方法

工具

为了刮,我使用三种工具:

  • 美汤提取机器学习标签下所有知识库的 URL。Beautiful Soup 是一个 Python 库,它使得从网站上抓取数据变得极其容易。如果你不知道美人汤,我在这篇文章中写了一篇如何用美人汤刮痧的教程。

[## 详细的初学者教程:网络刮电影数据库从多个页面与美丽的汤

你可能听说过美味的汤。但是如果你想访问的数据的标签不具体,你会怎么做…

medium.com](https://medium.com/analytics-vidhya/detailed-tutorials-for-beginners-web-scrap-movie-database-from-multiple-pages-with-beautiful-soup-5836828d23)

  • PyGithub 提取用户的信息。PyGithub 是一个使用 Github API v3 的 Python 库。有了它,你可以管理你的 Github 资源(仓库、用户档案、组织等)。)来自 Python 脚本。
  • 请求提取关于存储库的信息以及到贡献者简档的链接。

方法

我收集了搜索中弹出的前 90 个存储库的所有者和前 30 名贡献者

通过删除重复的以及像 udacity 这样的组织的概要文件,我获得了一个 1208 个用户的列表。对于每个用户,我收集了 20 个数据点,如下所示

new_profile.info()

具体来说,前 13 个数据点就是从这里获得的

其余数据点从用户的库(不包括分叉库)中获得:

  • total_stars是所有储存库的恒星总数
  • max_star是所有存储库中最大的星
  • forks是所有仓库的分支总数
  • descriptions是来自所有存储库的用户的所有存储库的描述
  • contribution是去年内的捐款数

将数据可视化

条形图

清理完数据,就到了好玩的部分:数据可视化。将数据可视化可以让我们对数据有更多的了解。我使用 Plotly 是因为它容易创造互动的情节

因为粉丝数低于 100 的用户有长尾效应,所以图表很难看到。我们可以放大图表的最左边部分,以便更好地查看图表。

我们可以看到,llSourcell (Siraj Raval)获得了大多数的关注者(36261)。下一个用户获得的关注者大约是 llSourcell 的 1/3(12682)。

我们可以做进一步的分析,以确定前 1%的用户有多少比例的追随者

>>> top_n = int(len(top_followers) * 0.01)12>>> sum(top_followers.iloc[0: top_n,:].loc[:, 'followers'])/sum(top_followers.followers)0.41293075864408607

1%的顶级用户获得 41%的关注者!

与其他数据点如total_stars, max_star, forks的模式相同。为了更好地查看这些列,我们将这些特征的 y 轴更改为对数刻度。 contribution的 y 轴不变。

这些图表类似于 Zipf 定律,在某些数据集中的统计分布,例如语言语料库中的单词,其中某些单词的频率与它们的排名成反比。

例如,英语中最常见的单词是“the”,它在典型的文本中出现的时间约为十分之一,尽管它不如其他单词重要。

我们在其他排名中也经常看到齐夫定律,比如各县市的人口排名、收入排名、买书人数排名等等。现在我们在 Github 数据中再次看到这种模式。

相互关系

但是这些数据点之间有什么关系呢?他们之间有很强的关系吗?我使用scatter_matrix来获得这些数据点之间相关性的大图。

数据点倾向于聚集在左下轴周围,因为大多数用户的数据点都在这个范围内。之间有很强的正相关关系

  • 最大星数和总星数(0.939)
  • 叉数(来自他人)和星总数(0.929)
  • 分叉的数量和追随者的数量(0.774)
  • 关注者数量和明星总数(0.632)

语言

顶级机器学习用户最喜欢的语言有哪些?Python,Jupyter 笔记本,C,R 的百分比是多少?我们可以用柱状图来找出答案。为了更好地了解最流行的语言,我们删除了低于 10 的语言

从上面的条形图中,我们可以看到机器学习用户中的语言排名:

  • 计算机编程语言
  • Java Script 语言
  • 超文本标记语言
  • Jupyter 笔记本
  • 壳等等

可雇佣的

我们使用牛郎星来显示将自己列为可雇佣的用户的百分比

位置

为了了解用户在世界上的位置,我们的下一个任务是可视化用户的位置。我们将使用 31%显示其位置的用户提供的位置。从从 df 中提取位置列表开始,用geopy.geocoders.Nominatim定位它们

然后用 Plotly 的 scatter_geo 创建地图!

放大以查看所有用户位置的更多详细信息。

描述和简历的文字云

我们的数据还包括用户的 bios 以及他们的存储库的所有描述。我们将用这些来回答问题:他们的主要关注点和背景是什么。

生成单词云可以让我们对单词及其在描述和 bios 中的使用频率有一个大致的了解。使用 Python 创建单词云也不会比使用 W ordCloud 更容易!

用 bio 制作单词云

这些关键词看起来像我们期望从机器学习用户那里看到的。

分享你的发现

我们一直在收集清单上的地块。是时候创建一个报告并分享你的发现了!Datapane 是这方面的理想工具。

现在,我们已经在一个由 Datapane 主持的网站上拥有了我们在这篇文章中创建的所有情节,并准备分享!

结论

数据是从机器学习关键字中的前 90 个最佳匹配储存库的用户和贡献者处获得的。因此,这些数据并不能保证聚集 Github 中所有顶尖的机器学习用户。

但是我希望你可以用这篇文章作为指南或灵感来收集你自己的数据并将其可视化。你很可能会对你的发现感到惊讶。当你能用你的知识分析你周围的事物时,数据科学是有影响力的和有趣的。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。

星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何用 Github 组织你的数据科学文章

被新信息淹没?现在,您可以轻松地跟踪文章并为其创建自定义注释

towardsdatascience.com](/how-to-organize-your-data-science-articles-with-github-b5b9427dad37) [## Datapane 简介:构建交互式报表的 Python 库

创建精美报告并与您的团队分享分析结果的简单框架

towardsdatascience.com](/introduction-to-datapane-a-python-library-to-build-interactive-reports-4593fd3cb9c8) [## 如何用 Altair 创建交互式剧情

在 5 行简单的 Python 代码中利用您的数据分析

towardsdatascience.com](/how-to-create-interactive-and-elegant-plot-with-altair-8dd87a890f2a) [## 如何在数据科学项目中利用 Visual Studio 代码

直到发现一种新的有效方法,我们才意识到我们是多么低效

towardsdatascience.com](/how-to-leverage-visual-studio-code-for-your-data-science-projects-7078b70a72f0) [## 如何用支持向量机学习非线性数据集

支持向量机简介及其在非线性数据集上的应用

towardsdatascience.com](/how-to-learn-non-linear-separable-dataset-with-support-vector-machines-a7da21c6d987)

我跳过大学自学数据科学

原文:https://towardsdatascience.com/i-skipped-college-to-teach-myself-data-science-eb23fb6ed137?source=collection_archive---------36-----------------------

六个月的自学比三年的学位课程教会了我更多

由 Unsplash 上的 Element5 数码拍摄

几个月前,我决定学习数据科学。为了做到这一点,我翘了整整一学期的数据科学专业课。

背景

选专业的时候,想挑一个毕业后能保证工作的学科。

大约在这个时候,数据科学开始成为一种炒作。《哈佛商业评论》称之为“21 世纪最性感的工作”

当时全国只有一两所大学开设数据科学专业,我报了其中一所。

就像其他追求这个专业的人一样,我很兴奋。我要学习站在新兴技术前沿的必要技能!

不幸的是,事情并不完全是这样。

真是一团糟

里卡多·维亚纳在 Unsplash 上的照片

课程进行了两年,我意识到我实际上没有学到任何东西。

因为我们是第一批数据科学学生,所以大学的数据科学系似乎还没有建立起来。

讲师对这门学科知之甚少甚至一无所知,作业都是从教科书上抄来的,课堂结构也不合理。

结果,我们没有一个人在数据科学的任何方面有坚实的基础。

即使在我完成了整整一学期的机器学习(并在班上获得 A)后,我对所教的主题也几乎没有掌握。

当我的朋友(也是优等生)在完成整个学期后问我“监督学习”是什么意思时,我们对这个主题的理解是多么贫乏。

两年后,我意识到,除非我做点什么,否则我不会拥有为就业市场增值所需的技能。很快。

创造我自己的学习道路

照片由 Aaron Burden 在 Unsplash

我当时在读全日制大学,并参加了几个俱乐部活动。我也在周末兼职做家教。

然而,这一切在几个月前政府实施全国封锁时停止了。

突然间,我有了空闲时间。很多。

我决定利用这段时间自学数据科学。我开始时没抱什么期望,因为我怀疑自己是否有能力抓住我需要学习的话题。

我几乎没有编程经验,也不了解任何数据科学主题。

我不得不从头开始。

我从一门名为“Python for Data Science and Machine Learning boot camp”的课程开始,这门课程教会了我 Python 中数据科学的基础知识。这门课程激发了我对数据科学的兴趣。演讲者的热情感染了我。

很长时间以来,我第一次真正感觉到自己好像在学习一些东西。

我意识到,通过网上可用的资源,我可以自学所有我必须知道的东西。

我花了大约 7-8 个小时观看在线课程、阅读和做项目。通过反复试验,我创造了一条适合我的学习路径。

我在一个月里学到的东西比我在两年的学位课程中学到的还多。

一个月后,宣布我们将在大学开设网络课程。

这占据了我一天的大部分时间,我几乎没有时间自学或做自己的项目。由于这些课没什么帮助,我决定干脆不上了。

然而,我的一些讲师对出勤率要求非常严格。

他们中的一个举报我缺了两周的课,为此我出示了一份诊断书。

我还是觉得上课不值得我花时间,就在手机上安装了微软团队 app,每天一边上课,一边自学自己的材料。

然后我会熬夜完成我的大学作业、期中考试和考试。尽管从来没有去上课,我做作业没有问题,因为我已经自学了所有这些东西。

我这样做了几个月,完成了整个学期,一节课也没上。

学习如何学习

马特·拉格兰在 Unsplash 上拍摄的照片

自学的时候,没有考试考你,没有竞争,没有人一起学。

这使得坚持下去变得困难,尤其是对于我们这些习惯了学校和大学环境的人来说。

我们大多数人学习通过考试,取得好成绩,在班上名列前茅。我们在这种情况下茁壮成长,因为有最后期限的临近,有学习的需要。

自学教会了我如何为了学习而学习。

我的学习是由好奇心推动的,没有别的。

我会花几个小时盯着电脑屏幕,试图修复损坏的代码。在学习和完成大学作业后,我会在早上 9 点睡觉。

我能坚持下去的唯一原因是我很好奇,渴望了解更多。我喜欢从事新项目,学习使用新工具。

我受到高级数据科学家的启发,他们自学并创建了自己的学习路径,并希望跟随同样的脚步。这种动力让我坚持下去。

结果呢

在短短几个月的自学中,我自学的东西比我想象的要多得多。

我创建了各种各样的数据分析项目,为初学数据科学家制作了教程,从零开始建立了自己的作品集网站,得到了一份数据科学实习。

这几个月为我打开了许多新的大门,我终于觉得我喜欢我所做的事情。

当然,还有很多我不知道的,前面的路还很长。我渴望在工作中学习新的东西。

本文到此为止!

如果您希望过渡到数据科学或“进入该领域”,只要知道这样做永远不会太晚!你只需要有纪律,每天留出一些时间来学习新的东西。

我不再使用 Firebase 仪表盘。我自己建了一个。

原文:https://towardsdatascience.com/i-stopped-using-firebase-dashboards-ive-built-my-own-instead-299631185b41?source=collection_archive---------20-----------------------

你如何解释火基数字?以下是答案。包括整洁的模板以及用于 BigQuery 分析的示例 Firebase 数据集。

我经常对我在 Firebase 中看到的东西感到困惑。背后的数据是什么?

现在我在 Google Data Studio 中使用 Firebase Crashlytics 和性能数据,因为它帮助我更好地了解我的用户。

Crashlytics 仪表板

如果你愿意,你可以复制 模板 。包括所有样本数据集。如果你在 BigQuery 中也需要它们,请告诉我,我会将它们作为公共数据集共享。

如何使用 Data Studio 模板

如何在 Google Data Studio 中使用 Firebase Crashlytics 数据?如何使用 Firebase 性能数据计算平均登录时间?

如果您使用 Firebase 来跟踪 iOS 或 Android 客户端版本中的性能和崩溃,您可能希望使用这些数据创建一个自定义仪表板。这篇文章是关于如何在 BigQuery 和 Google Data Studio 中使用 Firebase Crashlytics 和性能数据集来构建这样的东西:

碰撞分析数据

您可能想要显示以下内容:

  • 猛撞
  • 无崩溃用户(计数),所选时间段与之前时间段。
  • 崩溃事件(计数),所选时间范围与先前时间范围。
  • 所选月份中前 3 名崩溃的列表(打开和关闭)
  • 所选月份中关闭的前 3 个崩溃列表(必须仍然关闭)

或您的应用性能数据:

登录统计,例如:

  • 登录次数中位数;月平均值和显示时间段与上一时间段的线形图
  • 前十个国家/地区当月的登录时间中位数与上月相比;按用户数量排序
  • 前三个应用版本的月登录时间中位数与上月相比;按用户数量排序
  • 月登录成功/失败百分比—饼图。

首先推荐看这篇文章。它解释了如何连接到 Firebase 并将数据提取到 BigQuery 中。

火灾数据库数据提取

如果您已经设置了 Firebase 与 BigQuery 的集成,您应该准备好以下数据集:

所以现在您可以在这些表上运行查询。

我们将使用这两个工具在 Google Data Studio 中创建自定义报告。

Google data studio 模板

我使用了来自谷歌数据工作室的标准谷歌广告模板。我觉得它看起来不错,我根据自己的需要稍微做了些改动。

下载报告模板

如果您想打开演示报告并下载我创建的模板:

  1. 如果你没有谷歌账户,你可以创建一个。
  2. 点击这个链接。
  3. 单击使用模板。

第 1 页

让我们开始构建我们的仪表板。

平均登录时长

图一。数据集配置

前两个小部件使用相同的数据集,并显示中值登录时间。

示例

假设在我们的性能数据中,我们有以下登录持续时间记录

ntile(4)

因此函数NTILE(4) OVER (PARTITION BY COUNTRY_NAME ORDER BY duration)将根据行排序将数据分成 4 个存储桶,并返回分配给每一行的从 1 开始的存储桶编号。存储桶中的行数最多相差 1。

类似地,如果我们使用 NTILE(100 ),它会将数据分成 100 个桶。例如,50 块第一持续时间记录将表明所有登录的持续时间的 50%小于第 50 块中的该第一持续时间记录。

点击阅读更多官方谷歌文档。

让我们使用这些知识创建一个自定义数据集来计算我们需要的图块的最小和最大登录时间。

转到谷歌数据工作室,添加新的数据源,然后选择自定义查询,并插入下面的 SQL。不要忘记启用日期参数。

如果您用实际日期替换@DS_END_DATE 和@DS_START_DATE,并在 BigQuery 中运行整个脚本,它将给出以下结果:

这足以使用面积图创建小部件。增加 dt 为尺寸,增加为分解尺寸,如图 1 所示。上方的数据集配置。

让我们创建一个数据集来显示相同的小部件,但是是上一个时间段的。

示例:

我们将使用来自 login_ios.sql 的 SQL,并简单地添加一些参数转换,以获得基于所选报告日期的先前日期范围:

只需在设置中选择“数据范围”,即可完成:

如何显示以前日期的数据

现在,让我们按国家、应用版本和收音机类型添加登录时长。

我决定为每个小部件添加单独的数据集将是最好的,因为我们已经有了tile细目,可能需要使用它作为过滤器。

我使用 logonCount 按照登录次数对结果表小部件进行排序,并过滤到中间间隔。

如何使用中值滤波器

以类似的方式添加数据集login_ios_version.sqllogin_ios_radio.sql,并将它们添加到右边的小部件中。

对于下面的小部件,添加带有修改日期参数的新数据集,就像我们在login_ios_previous.sql做的那样

登录持续时间

对于包含成功登录百分比的饼图,创建另一个自定义数据集:

是否使用滤镜由你决定。

完成了。您可以为您的 Android 数据添加额外的页面。只需复制数据集,将 IOS 性能表替换到 ANDROID 即可。

第二页。崩溃。

崩溃和受影响的用户

让我们在 google Data Studio 中创建一个自定义数据集crashlytics_ios.sql,我们将统计is_fatal标志等于true的崩溃事件。

以类似的方式,使用 pd 中的previous_start_dtprevious_end_dt为下面的小部件创建另一个数据集,但只是为之前的时间段创建。

这个表格小部件使用相同的数据集crashlytics_ios.sql ,只是显示了issueeventsusers的计数:

按问题标题列出的崩溃

无崩溃用户

让我们创建一个自定义数据集来显示无崩溃用户的百分比。

为此,我们将使用 firebase analytics数据集,如 Goggle 文档的示例 7 所示。

无碰撞用户

让我们创建名为crashes :的数据集

如果您在 BigQuery 中运行它,结果将是这样的:

用参数处理程序替换日期,并在 Google Data Studio 中创建一个自定义数据集。

第二页写完了!

感谢阅读!

请记住,真正的客户端应用程序可以生成大量数据!确保在您的脚本中使用分区来降低 BigQuery 成本,并遵循本文中的 Google 最佳实践。

如果你有任何问题让我知道。

推荐阅读:

Google 的 Firebase 查询示例:https://Firebase . Google . com/docs/crashlytics/big query-export

我在疫情中部转行了。两次。以下是我学到的。

原文:https://towardsdatascience.com/i-switched-careers-mid-pandemic-twice-heres-what-i-learned-567715ac405c?source=collection_archive---------26-----------------------

从一个非技术人员到数据科学,再到软件开发,我经历了 11 个月令人伤脑筋的旅程,从这段旅程中我得到了一些可行的建议

来源:Needpix.com

你看,我们都知道你有像…其他八个媒体文章打开在其他标签上,你渴望得到它们。如果你是来寻求实用的建议或纯粹的好奇,我会给你一份书目清单。他们都很好,很大胆,就像我们这样的撇油器喜欢它。

不过,如果你有几分钟的空闲时间,我想在这些词中可以找到一些关联。我会尽量让它读起来轻松些。我可以很有趣。想卖给我东西的人觉得我很搞笑。请记住,这是一个各种各样的生活故事,所以请容忍我一点。

“只要给我我想要的,没人会受伤”

-沃克斯,博诺。可能你现在也是。

实用建议可以在我所学我所用求职资源下找到。你会发现这些对我有用的东西:

  • 在这个看似恐怖的世界中穿行的小贴士
  • 全球求职工具

背景故事

了解自己可能是我们一生中面临的最大、最有意义的挑战之一。我们越早真正理解我们所有人都是不断工作的草稿,我们肩上的压力就会越早减轻。你不会免于将自己与他人进行比较,但至少你会很快记住这个事实,从而更容易过渡到更少关心和善待自己。

我不想在这里成为达丨赖喇嘛,但是我在生活中发现的真正的、突破性的发现是我自己。我很幸运地找到了我的另一半和促成这种关系的生活伴侣,但正是通过治疗,我不断地重新发现自己。

作为一个内向的人,在我生命中的 27 年里,我不知不觉地低估了真正沟通的力量,这是犯罪行为。我没有告诉别人我是谁的代价是我对自己的理解,尽管我完全忘记了这个事实。

让我们回到 16 年前,一个 13 岁,非常瘦的罗德里戈。我爸爸在 IT 基础设施部门工作。有一天,他回到家,在我们的电脑上安装了 Visual Studio(一种开发应用程序的平台)的早期版本,教了我一些编程逻辑,并告诉我要从中获得乐趣。

我不知道是什么样的孩子造就了我,但见鬼,我乐在其中。

编程是一种艺术形式。你有想法,你写代码。那个代码不起作用,所以你在你的呼吸之下发誓并且寻求答案直到你改正它。然后,你移动到下一段代码。你被困住了。这次你骂得更大声了。重复这个过程几次,你就有了一大笔财富,幸运的是,还有一个工作软件。也许是邻居让你闭嘴。你明白了。感觉就像魔术一样,我被迷住了。

我非常喜欢编程,甚至在 StackOverflow 出现之前就已经学会了。对于程序员来说,StackOverflow 就像维基百科对于试图在争论中证明某个观点的学生或醉汉一样。想象一下。

总之。

两年后,我在一所以 IT 为重点的技术高中学习了 4 到 5 种编程语言。我渴望有一个开始工作的机会,实习对我的技术文凭有帮助。我得到了一个在全国最大的银行之一工作的机会,所以我抓住了这个机会。唯一的问题是,它不在 it 棒球场的任何地方——无论如何,它会计入我的文凭,不要问我为什么。

我在那里工作了两三年。后来另一家银行意识到我有银行工作经验,在我上大学时给了我一份临时工作。我拿了。后来,另一家公司看了我的表现,认为我可能很聪明,于是给我安排了一个分析职位。这是接下来 10 年的逻辑。我接受了数据分析。我确实编码、创造东西、重新设计流程,但大部分都是兼职。这些工作中最重要的事情是处理数字和制作精美的幻灯片,试图用外交辞令传达本财年的销售目标注定要失败的信息。

我曾受邀在一家跨国公司创建分析部门。在某一年,我平均每周向 7 个国家的人提交 4 份报告和宏观经济研究。经过 90 分钟的通勤,我会在早上 7 点到办公室,晚上 10 点到家。我推动了相当大的项目,最终产生了数十万美元的收入,否则这些收入是不存在的——甚至还为此获得了一些奖励。

我性格中很大一部分是关于创造的。构建应用,探索新的可能性,以新的方式推动智能发展。至少有几次,我开发了数据应用程序,却在它出现并在另一个国家、在另一面旗帜下运行之前,被办公室政治否决了,而其他人也因此获得了荣誉。

我所在的地区,即使是我认为对一家普通公司来说很有表现力的数字,也只占全球收入的不到 1%。我每天工作 12 个小时,只为了几句好话和一份微薄的薪水,最好的情况是一年结束时拿到半个月的工资,他们称之为绩效奖金。为了销售业绩,我每周至少要在四个不同的场合接受训练,尽管我并没有参与其中。有一段时间,我的工作变成了 Excel 填充和 PowerPoint 制作,而不是其他任何事情,为了政治,我会竭尽全力让本地故事适合全球故事。我不得不整天传递我不相信的信息。

过了一会儿,信不信由你,我筋疲力尽了。

决策制定

“你好,我的新经理!这是我的工作,这是公司的运作方式。现在,请你解雇我好吗?”

这基本上总结了我与 2019 年初分配到我团队的新经理的第一次谈话。我很直率。我想更深入地研究数据科学,如果我想有所成就,我需要全身心投入,而且我需要我的遣散费。因为一千条公司政策,那部分是不行的——嘿,至少我试过了。

我在过量交货上撞了刹车。我做了我该做的,仅此而已。我的精神疲惫和不被重视的感觉让我有些早上很难起床。这位新经理轻而易举地成为我 12 年来共事过的前三名最佳专业人士之一,这让事情变得简单了一些,但伤害已经造成了。事实上,我最终需要离开那里。

我参加了为期 5 个月的数据科学训练营。我开始为工作做数据科学的东西,尽管它还没有完全准备好。

收入计划是通过全球 Excel 模板制定的!你说有比假装我们知道事情如何更好的方法来得到结果是什么意思?我让你卖什么你就卖什么!

不管怎样,我做到了。我研究分类模型,收入模型。我甚至用 Python 编写了一个机器人,从网上搜集一些我会在每周报告中用到的信息。我从中获得了极大的乐趣,但这与我的工作描述完全不符。转念一想,的确是这样,但是的现状占据了主导地位。我只是不得不在某个地方体验到实际上喜欢做更伟大的事情,而不是说这是他们文化的一部分。

我知道我在这里很强势。我不希望看起来对伟大的经理和文化让我能够做的所有伟大的事情不领情,这种文化实际上给了我做我认为正确的事情的自由,但最终,我过度劳累地创造了改进,这些改进会被关闭,除了“让我们保持现状”之外没有任何理由,漂亮的话只能让你到此为止。

职业改变,职业改变。

我被烧成这样,我是以前的自己的一个影子,可能部门里的每个人都知道。

最终,我被解雇了。我拿到了遣散费。我不记得有一天像那时那样笑得这么多。每个人都在期待,我也在期待。我在一个星期五被裁掉了,然后我和团队出去吃汉堡喝啤酒庆祝——包括我那令人敬畏的经理。时代是美好的。我身边有我一生的挚爱,银行里有钱可以用来全职学习,还有数据经验可以让这种转变容易得多。不过,我做的第一件事是休了一个月的长假来给电池充电。

在接下来的三个月里,我学习了线性代数、算法和微积分——你知道,这是每个人在学校都期待的有趣的东西。如果我知道我会走这条路,我会在大学里获得一个 STEM 学位。相反,我成了一名工商管理学士,所以这相当于 5 年的数学学习。非常感谢,年轻的我!无论如何,回到主题。

在某个时候,我开始思考如何以一种用户友好的方式来交付这种数据科学的东西。信不信由你,人们通常不喜欢理解一堆代码下面的无标签数据。去想想。如果你是一名数据科学家,并且正在阅读这篇文章,我只是不想展示笔记本。

所以我开始研究软件开发,偶然发现了那些我 15 年前学过的技术,现在这些技术刚刚成形,而且很流行。大量类固醇。

我开始摆弄它,尤其是一个叫做 React 的框架。我又一次爱上了发展。我开始每周创建成熟的应用程序。每当我发现有新东西要学的时候,我就跳到一个新项目。我看了一下开发人员的职位空缺。数量是压倒性的。我意识到我可以说“去他妈的”,然后重新开始软件开发。于是我照做了。

这是一个冒险的举动。我期望在一两个月内找到一份数据科学的工作。我的遣散费不会持续太久。我意识到我会更乐意接受数据科学的职位,因为我会开发应用程序来交付数据产品。一切看起来都很美,将我所爱的两个世界融为一体。

我完全买了全改行。我开发了我的网站,我重新标记的身份。

然后,疫情大受欢迎。

惊喜惊喜。事情变得艰难了。

两年前,我考虑了大量我从未见过的数据科学和分析领域的职位空缺。我正在做的事情绝对有一个炒作列车正在进行,我正要乘坐它。

一旦疫情来袭,这些机会就消失了。突然之间,我唯一的选择是试图在需要 5 年机器学习经验的职位上竞争,或者作为一名专业软件开发人员进入未知领域。我是一个在市场上工作了 12 年的专业人士,如果你从招聘广告的描述来判断的话,我没有任何选择的经验。我变得非常没有安全感,疯狂地申请我最低要求的职位。这并不是说我没有这方面的经验,但外界的期望绝对是疯狂的。

有时,我会没有公司关注我。然后,我会同时面试 9 个职位。一周后,就像什么都没发生过一样。我的银行账户一直在枯竭,我的焦虑和不确定性达到了创纪录的高度。

每周至少有一次,我会在 36 小时内不吃饭,睡上几个小时后醒来,然后在凌晨 3 点开始编码。日出时,我会精神疲惫,无法入睡,因为我的大脑在飞速运转。

这大约持续了 3-4 个月。在那段时间里,我编码,学习,挫败自己。我重新设计了我处理事情的方法,次数多得数不清。然而,我仍然是一个数据专家,所以我总结如下:

  • 提交了 138 份申请(87 份通过 LinkedIn,51 份通过 AngelList)
  • 有 48 个人去了 InMails
  • 采访了 15 家公司;

很多申请我都没有得到面试的机会,但我确实从招聘海报或相关人员那里得到了热情的信息。在相当多的情况下,这是一个非常具体的要求或技术上不可能雇用我的问题,因为他们不能有国际承包商(至少不能有没有美国签证的承包商,即使这些职位完全是偏远的——这似乎是一件经常发生的事情)。

2020 年 11 月 6 日我在写这个。到目前为止,我已经被“雇佣”了 5 次。一家公司没钱雇佣我,一家公司把全职职位变成了随需应变的职位(我可能一个月工作 0 到 160 个小时,这对我一点帮助都没有),两家公司完全陷入困境,声称他们必须取得一些进展才能真正聘用我。

与此同时,为了管理,我让自己成为一名自由职业者。我设法找到了一些工作,在一个货币大幅贬值的国家用美元支付报酬,这真的很有帮助。美国公司支付给海外开发者的平均薪酬在每小时 25-50 美元之间。在这里,在巴西,它的范围是每小时 20-50 BRL。很接近了,不是吗?除了美元几乎以 6 比 1 的比例超过 BRL。

这意味着得到那几份工作实际上让我度过了相当长的一段时间。没有我想的那么多,但是他们支付了大部分账单。

然而,幸运的是,几天前我与第五家也是最近一家接触我的公司签约,结束了我在大约 11 个月内从战略规划专家到数据科学家再到软件开发人员的转变之旅。

我学到了什么

一封诚实的求职信会给你带来奇迹。

我可能有编码的经验,但我从来没有真正的工作头衔来展示它。我几乎没有时间发布公共代码。一旦我精心制作了一封求职信,分享了我在这篇文章中与你分享的一些内容,我来自哪里,我喜欢做什么,我愿意做什么,我开始收到大量的回复。

作为自由职业者获得第一份工作非常困难。

我独自在 Upwork 上申请了 56 次,得到了 8 次面试机会(其中 6 次我拒绝了,因为工作描述写得很差,没有反映现实),并获得了其中的 1 次。如果你对比一下我申请的全职工作的统计数据,并不是有什么不同,而是结果非常不同。如果你找到一份全职工作,就这样。你知道到月底你能挣多少钱。

获得一份工作的报酬只是全职工作的一小部分,如果你想再获得一周的报酬,你必须再做一次销售(显然,这取决于项目的长度)。

很有可能,你将不得不付出非常低的工资来为自己赢得 5 星评级,只有这样,你的出价才会得到更好的回应。这些自由职业平台中的成功人士声称,工作越多越容易,你可以获得越来越高的工资,这使它成为一种非常有吸引力的生活方式——但要准备好迎接艰难的开始。

即使事情看起来很确定,他们也可以随时改变主意。

我实际上是在五月份被雇佣的。原本应该相隔几周的采访和放映被缩短到一两天。人们在我们的谈话中理所当然地感到兴奋,谈论从那时起一年后我的角色的计划。但那时,这个职位依赖于他们完成一份合同。或者它的预算从来没有保证过。我艰难地认识到,现实会毫不犹豫地戳破你的泡沫。

有时候依赖别人也没什么。

我有一个严重的问题,那就是我是事情的接受者。我的另一半和我的父母联系了我几次,向我保证如果需要的话,他们会在情感上和经济上支持我。我不得不提醒自己,我没有懈怠,他们都在和我一起赌我的热情,因此最终获得支持是件好事。

技术工作并不经常进行真正的技术面试。

这是最让我惊讶的。你需要软件开发和数据科学方面的编码技能。然而,我惊讶地发现,只要你像一个老手那样说话,口头展示你的经验,提到你过去做过的事情,你遇到的麻烦,你就可以在大多数面试中过关,进入录用阶段,而不用写一行代码。

几周前,我和一家科技公司的技术主管通了电话。我非常确定我会被代码和基础设施优化的问题所困扰,为什么要使用一个框架而不是另一个,等等。事实证明,这是我有一段时间以来在我的核心圈子之外进行的最富有哲理的对话之一,在这个圈子里,一旦我提到我喜欢做什么,事情的代码方面就仅仅是一个细节了。

请记住,这并不是鼓励你不做准备,但你肯定不必为了成为一名体面的候选人而在黑客排名挑战中失眠。

你应该伸出手。真正伸手。

大多数求职公告板会告诉你在过去的两周或几个月里有多少人申请了那个职位。想想你的应用程序到达某人手中的几率吧。

通过官方途径申请,并直接与决策者联系。如果你申请的是数据分析师的职位,登陆 LinkedIn,搜索该公司的数据分析经理。发一条信息,我在第一个话题提到的求职信的简化版。LinkedIn 允许你在邮件中附上你的简历。至少,你会有更好的机会。

人是可以善良的。

网络。我知道这个建议无处不在,但这是有原因的。说起来容易做起来难。在我的数据科学训练营期间,我的处境很糟糕。我没有把自己放在那里,我没有真正与人交流。我只是挣扎着起床去工作,并度过一天,这让我精神疲惫到无法接近最佳状态的程度。

不管怎样,在得出结论的几个月之后,我仍然在和班上的同学进行群聊。有人分享了他们收到的一个软件开发人员的职位空缺。我申请了,并感谢他在小组中分享了这一点。不到两天后,他找到我,问我过得怎么样,并要了我的简历,这样他就可以和他所在的一群初创公司分享了。我得到了两个采访。

我不认为我们在那五个月里交谈过超过一打的话。没有人能为我担保。他可以轻松地说他不认识我。更糟糕的是,我在精神上处于一个黑暗的地方,几乎没有展示出我的能力——他完全有理由什么也不做。然而,他想尽办法让我有事发生。

想象一下如果我和他有联系。

我使用的求职资源

令人难以置信的大量国际职位空缺都在美国。这意味着他们通常需要工作签证或在该国的居住权,你才会被考虑——即使是非常遥远的地方,不管是什么原因。

当你寻找工作时,Jooble、Glassdoor 和 Indeed 等网站会成为你的主要选择,但这些网站 99.99%都是针对美国公民和居民的。LinkedIn 在寻找远程机会方面很糟糕,所以我甚至懒得列出它。以下是一些你可以用来逃离这种趋势的方法:

  • AngelList(https://angel . co):这是目前为止,我用过的最好的资源。AngelList 是一个专注于创业公司的求职板。当你申请一个职位时,你的信息会直接传递给招聘者(通常是决策者)。所有的工作都有预设的年薪范围。你可以专门搜索适合你技能的工作。几乎所有我抓住或进入最后阶段的机会都来自这里。不过,要确保你对公司的筛选和它对你的筛选一样多。我们谈论的是创业公司。对于他们来说,资金告罄或者简单地采用一种与他们一开始让你相信的不同的招聘模式并不罕见。
  • up work(https://www . up work . com):在我找到一份全职工作之前,我不得不做一些自由职业来赚些钱。输入 Upwork。我要提前告诉你:对于一个刚开始的自由职业者来说,这可能不是最好的平台。据说它的算法优先考虑那些已经有正面评价的自由职业者。然而,它的工作组织最吸引我。确保你有一个简洁而可靠的描述——在客户点击查看更多内容之前,只有前两行会显示在出价中。同样,关于给自己一个相当大的降薪的暗示也适用于第一个客户。
  • 自由职业者(https://www . Freelancer . com):他们自称是地球上最大的自由职业者网站,我相信他们。他们对你的第一个 500 美元收取的费用(10%的佣金)低于 Upwork (20%,直到上限,然后逐渐减少)。然而,如果你想真正脱颖而出,他们有测试,每个 5 美元。这看起来很便宜,但如果你来自一个货币不坚挺的国家,你可能会遭受金融打击来让自己站稳脚跟。
  • we work remote(www . we work remote . com):这不是我见过的最好的工具,但很有效。本质上,你可以通过按类别无限滚动列表来找到工作,链接会将你引向外部申请网站——通常是自己公司的网站。
  • JS remote(www . JS remote . com):这个是专门给 JavaScript 开发者的。它的工作方式与 WeWorkRemotely 极其相似(我不知道这些网站之间是否有联系)。不过,你可以用框架来过滤机会,不管是节点、反应、角度、Vue、电子还是流星。

结束语

这无疑是我一生中最有启发性的一年。我抛弃了一个相当保守的自己,去寻找我最初的激情所在,无论它以什么形式出现。这让我度过了几个不眠之夜,少吃了几顿饭,还引发了几次焦虑,但我几乎可以肯定地说,我做到了。

我明白,我们所有人都会至少一次面对自己的良心,面对自己做出的人生选择。很容易感到不安全。在法律允许我们喝啤酒之前,我们必须决定我们生活的大部分方向。

如果你有疑虑没关系。与自己联系,相信你内心看到的那个人,并制定一个计划去见那个人。

尽管困难重重,但如果有一件事我可以向你保证的话,那就是更好地了解自己不会有任何坏处,制造一点麻烦让整个经历至少对你自己好一点也绝对没有错。

不过,这只是一个艰难的提示:如果你打算搬家,尽可能确保世界不会在那个时间框架内终结。

我给 10 所不同学校的 300 名商科学生教授应用人工智能。

原文:https://towardsdatascience.com/i-taught-applied-ai-to-300-business-students-in-10-different-schools-3860431b968e?source=collection_archive---------73-----------------------

我学到的关于如何从教学上接近人工智能的 15 课。

在过去的一年里,我有幸在法国给各种商科学生教授应用人工智能。

对没有数学/统计学背景的人来说,教授人工智能比看起来更困难。

但这是迄今为止最有趣的话题。

它涉及如此广泛和众多的方面,对于未来的商业领袖来说,从经济的角度来看,当然也从伦理和哲学的角度来看,都是至关重要的,所以试图获取这门学科的精髓并教授它是非常令人着迷的。

我想我比我的学生学到了更多,我决定分享我的发现。

我也调查了其中的 100 个。

这篇文章有一个教学目标,这些课程实际上可以应用于任何类型的主题,而不是专门针对人工智能。

1.学生首先需要明白为什么要听你说的话。

我上了 10 节不同的课。我有机会 A/B 测试我的开场白。

你猜怎么着,当我用最简单的解释开始课程,告诉他们为什么需要关注这门课程时,他们更加投入了。至少在最初的 5 分钟里。前 5 分钟决定了你整个课程的剩余时间。

你知道他们说什么,你永远没有第二次机会留下第一个好印象。嗯,是真的。

对于人工智能,介绍是这样的:

  • 谁觉得他今天用了 AI?→及时吸引他们的问题
  • 对于没用过的人来说,AI 是什么?→尝试测量温度
  • 如果我告诉你,如果你用手机,你很可能用的是 AI,你会怎么说?→ AI 无处不在,而他们不知道这件事,它一定很重要..

上钩了。

2.学生首先需要明白为什么要听你的。

嘿,你是谁?你在跟我说什么?

信任就是一切,如果他们相信你能胜任他们感兴趣的话题,他们可能会想继续听下去。

3.总是回到主题的基础知识

我们为什么要创造人工智能?从根本上引出什么是 AI?这导致了什么是创新呢?

创新总是以扩展人类属性为目标。

从书到网络。

扩展人性的一面。

赋予人类超能力。

那么,我们试图赋予人工智能什么样的超能力呢?

提示:它在 AI 这个词里..

一旦我们知道我们正试图通过赋予机器像人类一样思考和行动的能力来扩展我们的智力,我们就可以试图理解它背后的“如何做”。

4.逆向工程是终极教学技能

从客户需求开始,一直到技术的后端,史蒂夫·乔布斯

从应用程序开始,向后追溯到理论。

5.使用“系统设计”方法分解概念

实际上,系统设计是软件工程中最重要的技能之一,它主要考虑如何构建复杂的产品。

当你想到架构时,你会想到结构和过程。

事实证明,我们所知道的大多数事情都可以被设计成生活中的三个阶段:

输入→系统→输出

这是一个我如何把 4 和 5 结合起来的例子。

然后你通过问正确的问题来解构这个系统。

1.学会开车意味着什么?

从根本上说,这是关于观察和预测。

2。我们如何看待和预测?

我们需要学习如何去做。

3.机器是如何学习的?

机器学习部分来了。

最后:

导致以下结果的示例:

6.尽可能多地使用隐喻

将一个众所周知的概念应用到你的专业领域。

例如人工智能,我想到的一个有用的比喻和比较概念是:

建筑:为了建造房子(你的产出),你需要水泥和石头等原材料(你的数据),你需要水泥搅拌车等工具(你的算法和框架),你需要仔细的指导方针(你的模型)来遵循计划。

你可以把它应用到烹饪、学习和更多的活动中…

7.点对点学习是必须的

我成对设计案例研究,而不是分组。结果证明效率要高得多。

8.邀请专家进行实时企业案例研究

大师班在这一点上给了我很大的启发。

没有什么比真正的世界级专家给你的应用科学课程带来实用性更有效的了。

9.基于交叉学习经验,创建原创的应用案例研究

我开设了一门课程,内容是从国际象棋到人工智能的商业策略,从扑克到人工智能决策,我们能从中吸取什么。

这似乎引起了共鸣。

10.基于跨格式经验创建原创应用案例研究

我曾经围绕鲨鱼池表演设计过责任案例研究。学生们非常着迷。

游戏、视频、辩论、运动都是强有力的学习刺激物。

例如,谷歌人工智能提供了有用的实验来测试现场教室中的人工智能工具。

例如,麻省理工学院关于人工智能伦理的道德机器是一个强大的参与工具。

10.与他们共建内容

从白板开始。

提问。

继续前进。

用他们的答案从头开始建立部分。

11.实验可能会失败,但从长远来看是有益的

尝试新的教学方法。

你唯一的限制是你的想象力。

有时学生不会参与,但它将永远教你为什么。

12.尽可能多地总结和重复

每 30 分钟,我会花 1 分钟来总结到目前为止学到的东西。

学生们非常欣赏这一点。

特别是当你的课程是自下而上建立的,你需要理解接下来会发生什么。

13.教授内容,尤其是解决你提出的问题的思维框架

商科学生并不想让他们的问题得到答案。他们想知道在任何情况下如何回答。

我发现一个特别有用的练习是陈述一个极其宽泛和开放的问题:人工智能将如何影响社会?

他们必须想出答案,然后发现如果那样说就没那么容易了。

他们需要一个思维框架。

这是我提供的答案:

14.尝试建立内在动机

我没有设置等级。

他们不喜欢它,我也不喜欢。

首先,试着找出他们为什么想听你说话。

15.每次都要感谢他们。

如果可以的话,直呼他们的名字。

始终声明他们的问题是真正相关的。

如果可以的话,在小组学习之前尝试一对一的高质量会议。

感谢您读到这里,欢迎随时和我连线 Linkedin 来聊聊 AI。

在发现这些技巧之前,我一直以为自己在掌握 Python

原文:https://towardsdatascience.com/i-thought-i-was-mastering-python-until-i-discovered-these-tricks-e40d9c71f4e2?source=collection_archive---------0-----------------------

Python 最佳实践和技巧将使您快速高效地编码

阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片

Python 是最受初学者欢迎的编程语言之一,这使它成为世界各地学校中教授最广泛的语言。

但是,学习 Python 并不是一件容易的事情。要开始,你首先需要找到到达那里的最佳在线方式,这本身就很难。有成千上万不同的 Python 课程和教程,都声称是最好的。

诚然,光是练习是不完美的,但完美的练习才是。这意味着你需要确保你总是遵循最佳的编码实践(评论你的代码,使用正确的语法,等等)。),否则你很可能会养成坏习惯,这会损害你未来的代码行。

“一个通用的约定提供了所有的可维护性、清晰性、一致性,以及良好编程习惯的基础。它没有做的是坚持让你违背自己的意愿去跟随它。那是 Python!”

——Tim Peters 关于 comp.lang.python,2001 年 6 月 16 日

在本文中,我将给出我的 10 大技巧来帮助你快速有效地用 Python 编码。

1.可读性很重要

程序必须写给人们阅读,并且只是附带地给机器执行。

哈尔·阿伯尔森

首先,遵循一些编程惯例,尽量让你的程序易读。编程惯例是经验丰富的程序员在编写代码时遵循的惯例。没有比无视习俗更快的方式来表明你是一个新手了。其中一些约定是特定于 Python 的;其他的被所有语言的计算机程序员使用。

从本质上来说,可读性是一种特性,它规定了另一个人理解你的代码的某些部分有多容易(而不是你!).

举个例子,我不习惯用垂直对齐来写,也不习惯用开始定界符来对齐函数的参数。

*# No, to avoid: 
func = long_function_name(var_one, var_two,
       var_three, var_four)#Yes, 
func = long_function_name(var_one, var_two,
                          var_three, var_four)*

看看 Python 代码的风格指南中的其他例子,决定什么看起来最好。

我们经常做的另一件重要的事情是模仿我们以前看过或写过的程序,这就是为什么我们接触可读程序在学习编程中很重要。

2.避免无用的条件

通常,一个长的 if & elif & …else 条件是代码需要重构的标志,这些条件会让你的代码变得冗长且难以解读。有时它们可以很容易地被取代,例如,我曾经这样做过:

*def f():
    if condition:
    	return True
    else:
    	return False*

这太蠢了。该函数返回一个布尔值,那么为什么要首先使用 if 块呢?正确的做法应该是:

*def f():
	return condition*

在一个黑客排名的挑战中,给你一年,你必须写一个函数来检查这一年是否是闰年。在公历中,识别闰年必须考虑三个标准:

  • 一年可以被 4 整除,是闰年,除非:
  • 一年可以被 100 整除,它不是闰年,除非:
  • 年份也能被 400 整除。然后就是闰年了。

所以在这个挑战中,忘记ifelses 只做以下事情:

*def is_leap(year):
    return year % 4 == 0 and (year % 400 == 0 or year % 100 != 0)*

3.充分使用空白

  • 不要混用制表符和空格
  • 函数之间的换行
  • 两个类之间的换行符
  • 在字典中的"、"、列表、元组、参数列表中的参数后和字典中的 ":" 后添加一个空格,但不在前面。
  • 在赋值和比较周围加空格(列表中的参数除外)
  • 左/右括号或参数列表前没有空格。
*def function(key, value=0):
    """Return a dictionary and a list..."""
    d = {key: value}
    l = [key, value]
    return d, l*

4.文档字符串和注释

  • Docstrings =如何使用代码
  • 注释=为什么(rational)和代码如何工作

文档字符串解释了如何使用代码:

  • 解释一个功能的目的,即使它对你来说是显而易见的,因为它对其他人来说不一定是显而易见的。
  • 描述预期的参数、返回值和引发的异常。
  • 如果该方法与单个调用者强耦合,则提及调用函数。

注释解释了代码维护者的需求。例子包括给自己的注释,例如:

# !!!BUG: …

# !!!修复:这是一个黑客

# ???为什么会在这里?

写好的文档串和好的注释是你的责任,所以要经常更新它们!进行更改时,确保注释和文档字符串与代码一致。

你会发现一个详细的 PEP 专用于 Docstring:【Docstring Conventions】

5.变量和赋值

在其他编程语言中:

*c = a
a = b
b = c*

在 Python 中,最好在一行代码中使用赋值:

*b, a = a, b*

你可能已经看过了,但你知道它是如何工作的吗?

  • 逗号是构建元组的语法。
  • 右边创建一个元组(元组打包)。
  • 元组是左边的目标(元组解包)。

其他示例:

*>>> user =['Jan', 'Gomez', '+1-888-222-1546']
>>> name, title, phone = user
>>> name
'Jan'
>>> title
'Gomez'
>>> phone
'+1-888-222-1546'*

在结构化数据的循环中有用(上面的变量用户已被保留):

*>>> people = [user, ['German', 'GBT', 'unlisted']]
>>> for (name, title, phone) in people:
...      print (name, phone)
...
Jan +1-888-222-1546
German unlisted*

也可以反过来做,只要确保左右两边的结构相同即可:

*>>> jan, (gname, gtitle, gphone) = people
>>> gname
'German'
>>> gtitle
'GBT'
>>> gphone
'unlisted'
>>> jan
['Jan', 'Gomez', '+1-888-222-1546']*

6.列表连接和联接

让我们从字符串列表开始:

*colors = ['red', 'blue', 'green', 'yellow']*

我们想把这些链连接在一起,形成一条长链。特别是当子字符串的数量很大时,请避免这样做:

*result = ''
for s in colors:
    result += s*

它非常慢。它使用大量的内存和性能。总和将被累加、存储,然后移动到每个中间步骤。

相反,请这样做:

*result = ''.join(colors)*

join () 方法一次性完成整个拷贝。当你只处理几个字符串的时候,没什么区别。但是要养成以最佳方式构建链的习惯,因为有了成百上千条链,它将真正发挥作用。

下面是一些使用 join () 方法的技巧。如果您想要一个空格作为分隔符:

*result = ' '.join(colors)*

或者逗号和空格:

*result = ', '.join(colors)*

为了造一个语法正确的句子,我们希望每个值之间都有逗号,除了最后一个值,我们更喜欢用“或”。拆分列表的语法完成了剩下的工作。 [: -1] 返回除最后一个值之外的所有内容,我们可以用逗号将最后一个值连接起来。

*colors = ['red', 'blue', 'green', 'yellow']
print ('Choose', ', '.join(colors[:-1]), \
      'or', colors[-1])>> Choose red, blue, green or yellow*

7.测试真实条件

对于布尔值,利用 Python 既优雅又快捷:

*# Do this :     # And not this :
if x:             if x == True:
   pass                  pass# Do this :     # And not this :
if items:         if len(items) != 0:
    pass                pass# and especially not that :
        if items != []:
               pass*

8.尽可能使用枚举

枚举 函数获取一个列表并返回对(index,item):

*items = ['zero', 'one', 'two', 'three']
>>> print list(enumerate(items))
[(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three')]*

需要使用列表来显示结果,因为 enumerate 是一个惰性函数,仅在被请求时才一次生成一个项目(一对)。for 循环需要这样的机制。 打印 不一次取一个结果,但必须拥有要显示的全部信息。因此,在使用 print 之前,我们自动将生成器转换为列表。

因此,使用下面的循环要好得多:

*for (index, item) in enumerate(items):
    print (index, item)# compared to :              # And :
index = 0                     for i in range(len(items)):
for item in items:                    print (i, items[i])
    print (index, item)
    index += 1*

枚举的版本比另外两个版本更短更简单。一个展示枚举函数返回迭代器的例子(生成器是迭代器的一种)

9.列表理解

传统方式用表示表示:

*new_list = []
for item in a_list:
    if condition(item):
        new_list.append(fn(item))*

使用列表理解:

*new_list = [fn(item) for item in a_list if condition(item)]*

列表内容清晰而直接。如果条件 在同一个 listcomp 内,但超出两个或三个,或者条件比较复杂,那么循环 和 可以有几个 ,建议您使用通常的 循环

例如,从 0 到 9 的方块列表:

>>> [n ** 2 for n in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

前一个列表中的奇数列表:

>>> [n ** 2 for n in range(10) if n % 2]
[1, 9, 25, 49, 81]

另一个例子:

>>>   [(x, y) for x in (1, 2, 3, 4) if x % 2 == 0 
       for y in ['a', 'b'] if y == 'b']
[(2, 'b'), (4, 'b')]

10.生成器表达式

让我们对小于 100 的数字的平方求和:

# With a loop :
total = 0
for num in range(1, 101):
    total += num * num

我们也可以使用 sum 函数,它通过构建正确的序列来更快地完成这项工作。

# With a list comprehension :
total = sum([num * num for num in range(1, 101)])# With a generator expression :
total = sum(num * num for num in xrange(1, 101))

生成器表达式类似于列表理解,除了在它们的计算中,它们是懒惰的。Listcomps 在一次传递中计算整个结果,并将其存储在一个列表中。必要时,生成器表达式一次计算一个值。当序列非常长,并且生成的列表只是一个中间步骤而不是最终结果时,这特别有用。

例如,如果我们必须对几十亿个整数的平方求和,我们将达到一个列表理解的内存饱和,但是生成器表达式不会有任何问题。不过,这需要一段时间!

total = sum(num * num for num in range(1, 1000000000))

语法上的区别是 listcomps 有方括号,而生成器表达式没有。生成器表达式有时需要括号,所以您应该总是使用它们。

简而言之:

  • 当预期结果是列表时,使用列表理解
  • 当列表只是一个中间结果时,使用生成器表达式

来源:https://www.azquotes.com/quote/669106

结论

在本文中,我介绍了一些学习 Python 编程的最佳技巧。如果你真的想成为一名程序员或者在你的技能中增加一项编码技能,学习 Python 是一个很好的起点。在网上寻找高质量的 Python 培训,并开始了解如何用 Python 编程。我建议您在学习更难的概念之前,先通过互动课程学习基础知识。

你不应该把学习过程加快太多,否则你可能会错过重要的信息。记笔记,确保定期复习,并尽可能多地练习编写代码。

与像你一样学习的同事联系,当你有问题时不要害怕提问。当别人有问题时帮助他们可以是一个很好的回顾,使用别人的代码是学习新事物的好方法。

如果你做到了这一切,没有什么可以阻止你!你还在等什么?现在就开始用 Python 编程!

我尝试过(也失败了)用甘斯创作艺术,但还是值得的。

原文:https://towardsdatascience.com/i-tried-and-failed-to-use-gans-to-create-art-but-it-was-still-worth-it-c392bcd29f39?source=collection_archive---------43-----------------------

这部作品大量借鉴 Pytorch DCGAN 教程 和 NVIDA 论文关于渐进式 GAN。

我一直想探索的一个计算机视觉领域是 GANs。所以,当我和妻子搬进一个有额外墙壁空间的房子时,我意识到我可以创建一个网络来制作一些墙壁艺术,这样就不用去贝德柏士比昂公司了(一举两得!).

我将尝试创造的风格的一个例子(照片由 Jen Theodore 在 Unsplash 上拍摄)

什么是甘?

GANs(生成对抗网络)使用两个协同神经网络工作:一个创建伪造图像(生成器),另一个神经网络接收伪造图像以及真实的艺术作品,并试图将它们分类为真实或伪造(鉴别器)。然后网络不断迭代,生成器越来越擅长制造假货,鉴别器越来越擅长检测假货。在这个过程的最后,你有希望拥有一个生成器,它可以随机地创建看起来真实的艺术作品。在她的书《你看起来像个东西,我爱你》中,Janelle Shane 讨论了如何使用 gan 来制作各种东西,从饼干食谱到接台词(这也是这本书得名的原因)。

如果你不知道 GANs 是什么,我建议你阅读这篇 Pytorch 文章以获得更深入的解释。

挑战

创建一个能产生满意结果的 GANs 模型有几个困难,我需要在我的项目中解决这些困难。

数据。像所有的神经网络一样,你需要大量的数据;然而,GANs 似乎有更大的胃口。我读过的大多数 GAN 项目都利用了数万或数十万张图片。相比之下,我的数据集只有几千张图片,是我从谷歌图片搜索中获得的。就风格而言,我喜欢以类似 Rothko 的东西结束,但我会满足于普通的床浴和其他东西。

训练时间。在 NVIDA 关于 progressive GANs 的论文中,他们使用多个 GPU 对他们的网络进行了数天的训练。在我的情况下,我将使用谷歌 Colab,并希望免费层硬件将足够好。

模式崩溃。除了是我的新 dubstep 项目的名字之外,当各种生成的图像开始汇聚时,就会发生模式崩溃。本质上,生成器看到一些图像在欺骗鉴别器方面做得很好,并决定使其所有输出看起来像这几个图像。

图像分辨率。想要的图像越大,需要的网络就越大。那么我需要多高的分辨率呢?嗯,数码照片每英寸的推荐像素数是 300,所以如果我想要的东西可以挂在 12x15 英寸的框架中,我需要 54,000 平方像素的最终分辨率!很明显,我不能建立一个如此高分辨率的模型,但是对于这个实验,我会说这是我的目标,我会看看我的最终结果。为了帮助解决这个问题,我还将使用一种渐进的 GANs 方法。这是由 NVIDA 首创的,他们首先在低分辨率下训练一个模型,然后逐步添加增加图像分辨率所需的额外层。你可以把它想成是涉水入池,而不是直接潜入深水区。在他们的论文中,他们能够生成分辨率为 1024 x 1024 像素的名人图像(我的目标只是这个数字的 50 倍)。

进入代码

我的完整代码可以在 github 上找到。我想在本文中展示的主要内容是生成器和鉴别器。

鉴频器。我的鉴别器看起来像任何其他图像分类网络。这个类的独特之处在于它将层数(基于图像大小)作为参数。这使我可以做渐进式 gan 的“渐进式”部分,而不必在每次增加图像大小时重写我的类。

发电机。发生器本质上是鉴别器的反向器。它将一个随机值向量作为噪声,并使用转置卷积层将噪声放大到图像中。我的图层越多,最终图像就越大。

测试网络

在我开始尝试生成抽象艺术之前,我首先要测试我的网络,以确保事情设置正确。为此,我将在另一个 GANs 项目的图像数据集上运行该网络,然后看看我是否会得到类似的结果。animeGAN 项目非常适合这个用例。在他们的项目中,他们使用了 143,000 张动漫人物的脸部图像来创建一个生成新角色的生成器。下载完他们的数据集后,我用 32 像素的目标图像大小运行了我的模型 100 个时期,瞧!

我的 GAN 模型的结果

结果实际上比我预期的要好。有了这些结果,我确信我的网络设置正确,我可以移动到我的数据集。

培养

现在是最后在艺术数据上训练模型的时候了。我的初始图像大小将是一个微薄的 32 像素。我将在这个尺寸下训练一段时间,之后我将添加一个额外的层到生成器和鉴别器,将图像尺寸加倍到 64。只是冲洗和重复,直到我得到一个令人满意的图像分辨率。但是我怎么知道什么时候该穿下一个尺码呢?围绕这个问题已经做了很多工作。我将采取简单的训练方法,直到我从 Google 获得 GPU 使用限制,然后我将手动检查结果。如果他们看起来需要更多时间,我会等一天(这样使用限制就解除了)再训练一轮。

你好黑暗,我的老朋友

32 像素结果。我的第一组结果看起来很棒。不仅没有模式崩溃的迹象,生成器甚至复制了一些图像包含一个框架。

以 32 尺寸生成的图像

64 和 128 像素的结果。64 像素的效果也相当不错;然而,当我将尺寸增加到 128 像素时,我开始在生成器结果中看到模式崩溃的迹象。

开始看到相同的输出

256 像素结果。当我得到这个尺寸的图像时,模式折叠已经将结果减少到只有大约 3 或 4 种类型的图像。我怀疑这可能与我有限的数据集有关。当我达到这个分辨率时,我只有大约 1000 张图像,有可能生成器只是在模仿集合中的一些图像。

模式崩溃

结论

最后,我的渐进式甘斯模型并没有取得很大进展。然而,我仍然惊讶于一个相当简单的网络能够创造出什么。当它生成动漫人脸或将其生成的一些画作放入相框时,令人震惊。我理解为什么人们认为 GANs 是近年来最伟大的机器学习突破之一。现在这只是我对 GANs 的 hello world 介绍,但我很可能会回来。

我用代码创造了动画。以下是方法。

原文:https://towardsdatascience.com/i-used-code-to-create-animation-heres-how-a7c7cd88fccd?source=collection_archive---------15-----------------------

在处理过程中执行简单的 Java 代码,创建有趣、娱乐和有用的动画。

KOBU 社在Unsplash【1】上的照片。

目录

  1. 介绍
  2. 处理
  3. 编码
  4. 例子
  5. 摘要
  6. 参考

介绍

从我的文章中,你会学到两个要点:

1.处理软件平台是什么。

2.如何执行代码来创建一个娱乐性和美观的动画?

你不需要成为一个专业的程序员或软件开发人员来创建令人敬畏的可视化。在本教程和大纲中,有几种方法可以展示用一点点代码和一点点处理技巧可以做些什么。本文中的所有原则也可以应用于可视化数据科学计划。最终,你将能够呈现一个动人的动画;一张信息图、一幅有趣的漫画或一个具有强大视觉效果的故事。通过使用易于理解的可视化和动画,该工具可用于将复杂的数据科学结果解释为非技术用途。

本文中的例子具体展示了一艘帆船在海洋上穿过雷暴。类似于 Excel、Tableau 或 Google Data Studio 的图表、图形和地图也可以在处理中执行。要了解有关处理的更多信息,请阅读下面的内容,以及对所用代码的进一步解释和更多代码的参考资料。最后,如果你想跳到最后的动画,请点击视频。

处理

当您单击鼠标来激活灯光时,创建一个动作的示例代码。作者截图[2]。

Processing【3】是一个没有多少人听说过的软件,但是非常有价值,当然,使用起来也很有趣。它被认为是一个为独特的可视化编码的素描本。这些视觉效果甚至可以被认为是艺术,因为代码是由用户一行一行地编写的,创作的数量是无穷无尽的。主要由 Java 代码组成,用户创建相互继承的编程类和 voids,这将最终创建移动和动画的形状。

Processing 和 Java 的伟大之处在于,使用这个工具,你不需要成为一个专业的数据科学家或软件工程师。

因为它是开源的,这意味着有大量可用的信息和代码,你可以在他们的网站上找到模板、教程和想法,让你可以制作相同的可视化和动画。一旦您也习惯了它,并从中学习,您就可以添加自己的代码并创建个性化的输出来共享。

编码

由欧文·史密斯在Unsplash【4】上拍摄。

如果您对代码本身感兴趣,请阅读这里;如果没有,继续滚动,看看成品是什么样子,以及可用的模板和例子的信息。

闪电动画

我将在这里概述本文最终可视化中使用的一个类。闪电级是一个黄色的动画形状,将在这场暴雨中击中船只。它是一个包含对象的颜色、位置和形状坐标的类。如您所见,有几个顶点,它们是 X 和 Y 坐标的位置,最终充当闪电形状的轮廓。你用同样的颜色填充灯光轮廓,这样它看起来完全是实心的。下面的代码[6]创造了闪电的形状:

class Lightning {
color c;
float xpos;
float ypos;Lightning(color tempc, float tempxpos, float tempypos) {
c = tempc;
xpos = tempxpos;
ypos = tempypos;
}void display(){
beginShape();
noStroke();
fill(c);vertex(xpos+246, 0);
vertex(xpos+145, ypos-285);
vertex(xpos+172, ypos-269);
vertex(xpos+54, ypos-184);
vertex(xpos+89, ypos-178);
vertex(xpos, ypos);vertex(xpos+112, ypos-187);
vertex(xpos+94, ypos-191);
vertex(xpos+210, ypos-278);
vertex(xpos+189, ypos-291);
vertex(xpos+300, 0);
endShape(CLOSE);
endShape(CLOSE);
}
}

上面的代码指的是一个特定的形状,但是,有一个特定的模板或格式,你可以按照它来开发你的第一个简单的动画。通常的代码模板是:

  • 空设置()-形状的尺寸
  • void draw() —背景的颜色

还有其他几个独特的处理部分,比如鼠标点击,这意味着当你点击鼠标时,这个 X 动画就会出现。

例子

为了找到大量的例子来练习,OpenProcessing 在他们的网站上编辑了一个独特的列表。

这个代码【6】是用来创建视频中动画的一些代码。它非常全面,但对于学习如何包含不同的颜色、形状和动画是一种有益的方式。

最终产品。下面是动画[7]。执行代码后,或'击中 play ',帆船将在暴雨中开始移动,随后由于雷击在船上造成一些损坏,并将继续在水面上向右移动,也变得更靠近移动的风车:

加工最终的动画。作者视频[7]。

摘要

起初,处理看起来令人生畏,但是通过使用代码样本、示例和教程,您可以学习制作几乎任何您想要的动画。无论是抽象艺术、图表、类似漫画的动画,还是在暴风雨中航行的船只,处理都允许用户表达他们的创造力。像 Tableau 这样的工具是可视化的领跑者,这个软件被证明是一个独特的技能集,你可以将其作为简历、教育或工作的一部分,特别是作为一名数据科学家甚至软件工程师。我希望你觉得这篇文章有趣,谢谢你的阅读!如有疑问,欢迎在下方评论。

参考

[1]照片由 KOBU 机构在Unsplash(2018)上拍摄

[2] M.Przybyla,处理截屏,(2020 年)

[3] 加工,(2020)

[4]Irvan Smith 在 Unsplash 上拍摄的照片,(2018)

[5] 打开处理,(2020)

[6] M.Przybyla,要点,(2020)

[7] M.Przybyla,动画,(2020)

我研究了 500 多个数据科学面试问题

原文:https://towardsdatascience.com/i-worked-through-500-data-science-interview-questions-51e2e4dead9d?source=collection_archive---------9-----------------------

以下是我一路走来学到的东西

感谢一群专注的数据科学训练营毕业生、Zoom 和万维网,我已经听了太多的数据科学面试实践问题,并回答了太多的问题。过去几个月的实践教会了我很多东西,不仅是数据科学,还有自信、努力工作以及通过网络建立关系的力量。

绿色变色龙在 Unsplash 上的照片

我将从数据科学的东西开始,因为这是一个数据科学博客,这也是你们可能在这里的原因。

我就拿“什么是数据科学?”请给我 200 美元。

在参加数据科学训练营时,我觉得自己已经很好地掌握了大多数主题。但是,当回答关于关键主题和模型的概念性问题时,我意识到我的一些知识很肤浅。

在博学的同事面前当场回答概念问题非常有价值。我从大学就知道,和别人一起学习是一个好主意,因为当你独自一人时,很容易说服自己知道主题,但回答朋友的问题将测试和巩固你的知识。

我建议找一个已经在这个领域的人或者也想进入数据科学领域的人,解决一系列概念性问题,为面试做好准备,并加强你的数据科学知识和理解。以下是我认为是“经典”概念问题的一些问题的列表,基于在不同网站上收集的 10 多个问题。

  • 定义机器学习。
  • 什么是合奏模型?
  • 解释决策树模型的工作原理。
  • 数据科学中的偏倚/方差权衡是什么?
  • 解释交叉验证。为什么用?
  • 什么是第一类和第二类错误?举例说明。
  • 什么是 PCA?你什么时候使用它?
  • 如何处理数据中的缺失值?
  • 请向我介绍探索性数据分析的一般步骤。在项目的这个阶段,你在寻找什么?
  • 解释离散变量和连续变量。
  • 解释描述性、预测性和规范性模型之间的区别。
  • 有监督和无监督的机器学习有什么区别?
  • 解释过拟合和欠拟合。你如何减少这些?

你对这些问题的回答是否感到不确定?是时候找个朋友了!或许是教科书,或者更可能是谷歌。我不会给出我会给出的答案——也许我会在以后的文章中给出——因为我发现寻找这些答案、与他人讨论和辩论并自己得出答案是一个有价值的学习过程。

JESHOOTS.COM在 Unsplash 上拍照

互联网上有足够多的编码问题和挑战,足以让你忙上很长时间。对于数据科学家来说,精通编程非常重要。但是,在我看来,让数据科学家有价值的主要是他们对该领域的知识以及应用这些知识的能力。你可以随时参加 Python 速成班,温习 R,或者谷歌一下 95%置信区间的公式。但是,如果你对基本的数据科学概念没有信心,当你接手一个项目时,你怎么知道从哪里开始呢?

如果你正在寻找面试问题,我已经在这篇文章的结尾包括链接。如果你想知道成百上千的问题还教会了我什么,请继续阅读。

人际网络和全面发展的重要性

通过一位家庭成员,我与我在本文开头提到的数据科学训练营毕业生群体建立了联系。他们承诺每周三次在 Zoom 上回答实践数据科学面试问题,每次一小时。(印象深刻吧?)

起初,很容易说服自己不要加入他们的 Zoom 电话。我的新兵训练营还没有结束,有一半的时间我既不理解问题也不理解他们的答案。我觉得我会搞砸一个简单的答案,或者根本无法做出贡献。

照片由艾莉在 Unsplash 拍摄

我过去也有过类似的感受。这很难,很不舒服,而且好处通常不会立即(或永远)显现出来。但是,这些变焦电话教会了我坚持下去的价值!这些电话中的其他有抱负的数据科学家已经成为我的惊人资源,最重要的是,他们已经成为朋友。我认为,与仅仅获得一张名片或 LinkedIn 联系相比,互利互惠、更像是建立关系的人际关系网,会让你不那么疲惫。

我了解到我可以为数据科学面试做好充分准备,但实际上获得面试是另一个更重要的挑战,我没有为此做好充分准备。

所有这些最终成为我在过去几个月里学到的一大课:全面发展的重要性。

我听说过数据科学独角兽这个词,用来描述雇主想要一个几乎可以做任何事情的数据科学家的职位描述。虽然这种期望是不现实的,但成为一名数据科学家有很多不同的要求。因此,当你申请工作时,注重培养你在所有这些方面的技能是很重要的!我知道我需要花时间拓宽我的编码知识,加深我对统计和数学的理解,学习更多关于数据科学的概念,并练习将这些东西传达给更关注业务的受众。

这都需要时间。

我通常是一个没有耐心的人。但是,你不能指望自己在短短几个月内深入了解所有这些领域!这没关系。我的新兵训练营经历从 5 个月的目标变成了总共 7 个月,我很高兴我花时间慢下来,真正理解事情,并通过写文章和在 LinkedIn 上变得更加活跃来建立网络。

为了你好,我希望你已经是数据科学独角兽了。但是,因为我自己还没有在野外见过,所以我希望这篇文章对您成为数据科学家有所帮助。

现在,对于那些练习题链接:

* [## 109 个常见的数据科学面试问题

准备面试并不容易-数据科学面试问题存在很大的不确定性…

www.springboard.com](https://www.springboard.com/blog/data-science-interview-questions/) [## 2020 年 100+数据科学面试问答| Edureka

在这个数据科学面试问题博客中,我将向您介绍数据方面最常见的问题…

www.edureka.co](https://www.edureka.co/blog/interview-questions/data-science-interview-questions/) [## 30 大数据科学面试问题。

数据科学面试问题

towardsdatascience.com](/top-30-data-science-interview-questions-7dd9a96d3f5c) [## 超过 100 个数据科学家面试问题和答案!

来自亚马逊、谷歌、脸书、微软等公司的面试问题!

towardsdatascience.com](/over-100-data-scientist-interview-questions-and-answers-c5a66186769a) [## Top 210+机器学习面试问答 2020[更新]

如果你正在搜索机器学习面试问题和答案,那么你就在正确的地方。我们的…

www.gangboard.com](https://www.gangboard.com/blog/machine-learning-interview-questions-and-answers)

附注:我很抱歉,其中有些问题或答案令人困惑和/或写得不好。不过总体来说都是不错的资源:)

祝你好运,学习愉快!

要阅读我关于走向数据科学的其他文章,请点击这里。*

Ibis:用于开发和生产的 Python 数据分析框架

原文:https://towardsdatascience.com/ibis-a-framework-to-tie-together-development-and-production-code-588d05e07d11?source=collection_archive---------32-----------------------

Ibis 通过统一的 API 将开发和生产阶段结合在一起。

由亚历克斯·维根在 Unsplash 上拍摄的照片

训练完你的机器学习模型后,你想投入生产。一旦您的模型被提供并准备好进行预测,您可能需要在将收到的数据发送到模型之前对其进行预处理。这可能是某种类型的要素工程或数据清理,但无论是什么,通常都会使用标准数据框来完成,一次一个样本。

然而,当您仍处于开发阶段时,您正在处理更大的数据,可能有数百万个训练样本或更多。在这种情况下,使用常规数据帧(例如熊猫)会太慢。所以你求助于其他工具,比如 Spark,BigQuery 等。

这就存在一个潜在的问题:这些工具有不同的 API。对于 Spark,它将是 big Spark 的 DataFrame API 对于 BigQuery,应该是 SQL。诸如此类。要点是:这段代码不同于您将在生产中使用的代码。从长远来看,维护两个不同的代码库并不是一个好主意。

有解决这一困境的办法。例如,使用谷歌的数据流,它可以完全消除它,因为数据流可以在训练和预测时使用。另一个解决方案涉及 TensorFlow Extended ,它的创建正是为了解决深度学习应用的这个问题。或者,您可以尝试尽可能多地提取核心功能,并使其可由定型代码和预测代码重用。

这些解决方案都不完美,尽管 Ibis 也不完美,但这是一个有趣的提议,因为它从另一个角度处理问题,因此在这个领域非常独特。

Ibis 提议的是一个用于数据操作的 api,以及一个核心引擎,它将根据后端把这个高级 api 翻译成低级代码。因此,如果我们使用一个 pandas 后端,Ibis 将翻译成 pandas python 代码。如果我们使用一个 BigQuery 后端,Ibis 将转换成 SQL。用户使用 Ibis api 编写代码,只是在训练和预测之间交换后端。

目前,Ibis 支持相当多的后端:pandas、Spark、BigQuery、PostgreSQL、sqlite 等等。在项目健康方面,有一些正在进行的提交和问题,尽管它不是有史以来最活跃的项目。熊猫的创造者韦斯·麦金尼几年前是一名投稿人,但现在不是了。

让我们看一个具体的例子,因为我是 BigQuery 的粉丝,所以我就从它开始。我将使用stackoverflow公共数据集,特别是posts_questions表。

安装必备组件:

pip install ibis-framework 
pip install ibis-framework[bigquery]

为了连接到 BigQuery,我使用一个凭证文件:

from google.cloud import bigquery 
from google.oauth2.service_account import Credentials credentials = Credentials.from_service_account_file('path_to_file') client = bigquery.Client(credentials=credentials,
                         project=credentials.project_id )

然后连接到表:

import ibis conn = ibis.bigquery.connect(project_id=credentials.project_id,
                             credentials=credentials ) table = conn.table('posts_questions', 
                   database='bigquery-public-data.stackoverflow')

我们可以print(table):

现在,我们可以进行一些简单的数据操作(例如,创建新列):

projection = table['title', 'answer_count', 'creation_date'] projection = projection.mutate(
          year=projection.creation_date.year(),
          javascript=projection.title.re_search('(?i)java.?script'),
          answered=projection.answer_count > 0)

此时,实际上没有从 BigQuery 中检索到任何行。Ibis 只构建了内部执行图。

要实际执行查询:

res = projection.head().execute() 
res

您会注意到,在上面的代码中,我只要求我的投影的头部,所以我只得到 5 行返回,但是我可以很容易地在整个表上运行查询。为了好玩,我们可以编译我们的投影,并查看 Ibis 为我们生成的代码:

ibis.bigquery.compile(projection)

漂亮!

再过几个月,我们就可以投入生产了。这意味着,我们需要对小熊猫数据帧进行完全相同的预处理。

没问题:

import pandas as pd 
from datetime import datetime df_local = pd.DataFrame({
    'title': ['Matlab Function block with Design Verifier'],  
    'answer_count': [1],
    'creation_date': [datetime.now()]
})

Ibis 连接到本地数据框的方式如下:

conn = ibis.pandas.connect({'data': df_local}) 
projection = conn.table('data')

下面是我们在 BigQuery 上使用的几乎完全相同的代码:

projection = projection.mutate(
    year=projection.creation_date.year(),
    javascript=projection.title.re_search('(?i)java.?script'),   
    answered=projection.answer_count > 0) projection.execute()

美妙之处在于:我们没有被 BigQuery 所困,甚至没有被熊猫所困。例如,我们可以轻松地切换 sqlite(在磁盘上和/或内存中)或 Spark,而不需要对我们的代码库做任何修改。最后,值得一提的是,Ibis 支持所有典型的数据处理操作:聚合、过滤、连接、应用用户定义的函数等。

结论:Ibis 是一个非常有趣的项目,值得一看。我希望看到更多关于它的活动,如果时间允许的话,也可以做出贡献,但同时,我会毫不犹豫地使用它,或者向任何寻求统一培训和生产数据处理代码的人推荐它。

感谢阅读!

链接:

  • 宜必思首页:https://docs.ibis-project.org/index.html
  • 如果你想看代码或者投稿:https://github.com/ibis-project/ibis

Coursera 上的 IBM 数据科学专业证书:工作准备好了吗?

原文:https://towardsdatascience.com/ibm-data-science-professional-certificate-on-coursera-job-ready-a06a08c14341?source=collection_archive---------7-----------------------

来自之前认证的数据学生的诚实评论

Nikolay Trebukhin 在 Unsplash 上拍摄的照片

介绍

去年,我参加并完成了 9 门主要课程,这些课程组成了 IBM 在 Coursera 上提供的IBM 数据科学专业证书 (此处链接到证书)。

在过去几年中,我一直想证明我的数据科学技能,因此当我发现 IBM 在著名的电子学习平台上发布了一个大规模目录时,我抓住了参加这一系列课程的机会,我发现自己在其他课程和专业中使用了很多目录,其中一些我也在 Medium 上回顾过。

[## Coursera 的 GCP 专业证书数据工程:更好的内容还是更好的营销?

来自最近认证的数据学生的诚实评论

towardsdatascience.com](/courseras-data-engineering-with-gcp-professional-certificate-better-content-or-better-marketing-6159bc95e7f5)

总体体验

参加证书考试无疑是一次总体上积极的经历,让我对现代 Python 数据科学堆栈的很大一部分有了坚实的概念理解,并让我能够接触到 capstone 项目,这些项目让你远离更多的理论讲座。

我特别欣赏课程系列的广泛和模块化方法,它从植根于数据科学方法的理论基础开始,然后引导您进入更实用的编码课程和顶点项目。同时,这些课程还向您介绍了如何使用 IBM Watson Studio 等 IBM 云资源,以便您学习如何将 IBM 产品集成到您的工作流中。

我欣赏的证书的另一个方面是,它的整个课程结构就像一个项目,以一种平稳的方式带你从一知半解到项目交付,不会让你觉得太累或太无聊。因此,我经历了各种主题和组件之间的平稳过渡。

为了让您自己判断,我在下面总结了如果您决定参加 Coursera 上的 IBM 数据科学专业证书课程将会发生什么,以便您能够决定是否继续进行时间和投资(29/月订阅,直到完成-价格可能会因您所在的位置而异

结构、课程主题和技术堆栈

IBM 的数据科学专业证书由 9 门课程组成。

指示性总时长为 10 个月,每周 5 小时。如果你热衷于花固定的时间学习和浏览资料,你绝对可以把它缩短到几个月,尤其是如果这不是你的第一个数据科学系列课程。

课程列表如下:

  1. 什么是数据科学?
  2. 数据科学工具
  3. 数据科学方法论
  4. 数据科学的 Python 和 AI
  5. 数据科学的数据库和 SQL
  6. 数据分析用 Python
  7. 用 Python 实现数据可视化
  8. 用 Python 进行机器学习
  9. 应用数据科学顶点

遵循并完成本系列课程没有先决条件,这将有助于解决以下问题:

工具: Jupyter / JupyterLab、GitHub、R Studio 和 Watson Studio

: Pandas,NumPy,Matplotlib,Seaborn,Folium,ipython-sql,Scikit-learn,ScipPy 等。

项目:随机相册生成器,预测房价,最佳分类器模型,邻里之战

赞成者

  1. 参与学习体验

我从不厌倦听课,这是一个很大的优势,尤其是如果你的目标是完成专业证书的全部课程。

视频讲座和实践很好地结合在一起,而且传达材料的方法和信息感觉非常自然和流畅,让你想从一个讲座跳到另一个讲座,以了解更多信息,从而建立在以前看过的材料上。

学习体验当然是主观的,但将这些课程与我参加的其他课程相比,我发现在这种情况下,内容的交付更有效,这使我坚持到最后。

教师都是 IBM 数据科学从业者,这严重影响了该系列对实用性的关注,使得可能纯粹的学术教学方法有点落后。

在电子学习行业中,在线课程的完成率很低,找到能激励你并激发你想知道更多并因此浏览所有资料的课程是一项非常难得的壮举,因此,这个 IBM 专业证书绝对值得称赞。

2。树立信心开始个人项目

该证书强调的实用方法在最终的 Capstone 项目中得到最好的体现,该项目围绕使用 RESTFUL APIs 来获取地理位置数据,然后在聚类算法中使用。

虽然自然会有一些学生参与,但以一个项目结束课程系列确实很好,因为好奇的学生希望围绕新获得的数据科学技能和个人兴趣的交集探索更多项目工作,这将不可避免地导致更多基于项目的学习。

在这方面,证书当然让学生处于一种非常“动手”的心态,这肯定是值得赞赏的。

3。更高级课程的精彩介绍

我喜欢把这门课看作是一个很好的“”使学生能够进入更深层次的训练领域。它教你足够多的 Python、SQL 和数据科学方法,让你继续学习。

尤其是在 Coursera 上,他说学习的土壤非常肥沃,可以引导你走上各种有趣的道路。

我推荐的后续课程/专业是:

  • 机器学习(作者 Andrew NG) :常青树经典必备(即使是基于 MATLAB/Octave)→为了透明起见,我在这里链接了我的课程完成证书
  • IBM AI 工程专业证书:IBM 提供的另一系列课程,这次更侧重于围绕深度学习的实际应用。我清单上的下一个。
  • 深度学习专业化 : 由 DeepLearning.ai 提供,旨在覆盖深度学习算法和应用的所有重要方面,具有完善的理论方法。一般建议在尝试这一项之前,先完成 机器学习(Andrew NG)

4。入门级数据科学职位大卖

总的来说,这是申请入门级数据科学/数据分析职位的一个很好的证书,特别是如果你正在重新掌握技能,并在来自邻近和相关领域的数据科学浪潮中跳跃。

展示您的证书表明您对学习和实践您的技能非常感兴趣,以便作为初级数据科学家从业者迈出第一步,为各种公司和项目增加价值。

我对这门课程的问题是,这方面的定位有点混乱。

IBM 承诺他们将使你达到数据科学的“熟练程度”,我认为这更像是一种营销策略(如果不是简单的夸大的话),而不是一种现实的学生期望,因为我不会认为自己完全精通这样一个广泛定义的专业领域。

因此,我会小心地为自己定位更高级的数据科学职位,并将更多地关注利用此类证书来构建基础工具包和该领域的入门知识,然后通过进一步的培训和在职学习来补充。

坏处

  1. 点亮统计和数学

虽然这是一门实践性很强的课程,但我肯定会对一些对数据科学至关重要的基本构件的背景信息有更多的了解,例如基本的统计概念和定理,以及线性代数变换和推导。

相反,该系列更侧重于用入门级和开箱即用的数据科学工具包武装学生,而有时会掩盖一些更好奇的学生可能想要了解而不是想当然的理论方面。

从某种意义上说,这些课程旨在向您展示数据科学概念和方法背后的“是什么”,而不一定总是“为什么”。****

虽然不可能要求一份包罗万象的证书,但对一些基本直觉的一些提示肯定会受到赞赏。

2。对 IBM 云资源的依赖

作为该系列的提供者,IBM 投入了大量时间来利用 IBM 资源,这些资源是 IBM 云产品套件的一部分,比如 Watson studio。

因此,寻找更开放源代码的学习方法的学生可能会不满意,因为学生依赖于采用 IBM 套件来完成证书。

这是一般的(营销?)组织采用的实践,这些组织建立了向公众开放的学习计划,同时利用屏幕时间达到提高产品利用率的次要目标。这方面肯定是超越了整体伟大的课程质量,因此,这不能被认为是一个重大故障。

至少在撰写本文时,IBM 可能会遇到的问题是,学生可能希望将学习数据科学技能与市场上更广泛采用的其他云平台(GCP、AWS、Azure)结合起来,以最大化即时技能平台的适用性。

定论

总而言之,如果您符合以下条件,我仍然建议您参加本课程:

  1. 一位卓有成就的 BI 分析师,希望在您的分析职业生涯中迈出下一步
  2. 希望获得认证并准备/申请入门级数据科学职位
  3. 寻找现代数据科学堆栈和项目方法的广泛概述,同时不要只在 Jupyter 笔记本上工作。

如果您符合以下条件,我会而不是仍然推荐您参加本课程:

  • 希望在完成 Coursera 的专业证书后成为一名熟练的数据科学家
  • 寻找对最先进的机器学习模型的深入研究,尤其是在深度学习领域。更多的深度学习和神经网络课程可能会证明对你更有效。

访问我的免费数据科学资源清单 这里

** [## 通过我的推荐链接加入 Medium-Edoardo Romani

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

edo-romani1.medium.com](https://edo-romani1.medium.com/membership)**

为了追求正义和种族平等,IBM 不再提供面部识别技术。

原文:https://towardsdatascience.com/ibm-no-longer-offers-facial-recognition-technology-in-pursuit-of-justice-and-racial-equity-134aca27c2a?source=collection_archive---------62-----------------------

机器反映了训练它们的人的“编码凝视”——优先权、偏好和偏见。

鸣谢:@ Cooper _ baumgartnerviaUnsplash

“我们认为,现在是时候就国内执法机构是否应该以及如何使用面部识别技术展开全国性对话了。”

—阿文德·克里斯纳(IBM 首席执行官)

IBM 将不再提供、开发或研究通用面部识别技术。首席执行官 Arvind Krishna 向国会发表了关于有偏见的系统的内在危险的演讲,引用了对“大规模监控、种族貌相[和]侵犯基本人权和自由”的担忧。

这种奥威尔式的技术需要改革。以人工智能为燃料的自动化有助于确定谁被解雇、雇用、晋升、获得贷款或保险,甚至一个人要在监狱里呆多久。州和地方警察部门有他们自己的先进的面部识别系统,这些系统在很大程度上是不受监管的,并且已经被证明会对少数种族和少数民族造成不成比例的影响。

截至 2016 年,每两个美国成年人中就有一个在执法人脸识别网络中。至少有四分之一的州或地方警察局可以选择通过他们或其他机构的系统进行人脸识别搜索,这影响了美国 1.17 亿人。这些系统并不是天生中立的:它们反映了那些有能力塑造人工智能的人的“优先事项、偏好和偏见——编码的目光”。

机器受到人类视觉的偏见。与其他人相比,算法在分析黑色和棕色身体时表现更差,并且错误识别 POC 的可能性高达 100 倍。根据麻省理工学院和斯坦福大学发表的一项研究,这些偏见的存在是因为算法被输入了训练数据超过 77%的男性和 83%的白人。当面部识别程序搜索面部照片数据库时,POC(特别是年轻的黑人男性)在可能的匹配中出现过多。即使算法被输入公平的数据来纠正有偏见的训练,现有刑事司法系统中面部识别的 使用可能只会复制黑人和棕色人种社区的过度监管

2018 年初,IBM 软件在分析性别和肤色方面的固有偏见受到了严格审查。《性别阴影:商业性别分类中的交叉准确性差异》一书的作者发现,在分析包含深色皮肤女性的图像时,存在较高的误差,而对浅色皮肤男性的分析结果最为准确。在多年试图提高准确性和减少边际结果的偏差后,IBM 决定终止该软件,这样州和联邦机构就不能再滥用该技术了。私营公司终于开始采取措施把人放在利润之上。但是这就够了吗?

高级记分卡告知普通消费者具体的州和联邦机构表现,但忽略了关于种族偏见的具体指标。在分配和获利之前,我们需要更好地理解人工智能如何促成系统性种族主义和偏见的循环。我敦促你们在发布算法或软件系统之前,考虑一下新兴技术是如何反映编码凝视的。

“我们冒着失去民权运动和妇女运动在机器中立的错误假设下取得的成果的风险。我们必须要求增加透明度和问责制。”

— 性别差异

你能做些什么来保持消息灵通?

  • 跟随米米·奥诺哈,布鲁克林的艺术家、研究员和技术专家调查数据收集的社会含义。她的工作使用文本、代码、性能和对象来探索缺失的数据以及人们被抽象、表现和分类的方式。
  • 与半机械人妈妈(又名戴安娜·努塞拉)保持同步。她是一名组织者和艺术家,她的工作重点是开发受欢迎的教育材料,使社区能够使用媒体和技术来调查、阐明和开发应对挑战的有远见的解决方案。她的音乐和激光表演创造了连接故事、振奋灵魂和提升我们集体科技意识的机会。
  • 看看这篇关于人工智能的文章。
  • 考虑向为未来而战捐款,这是一个非营利性的草根倡导组织,旨在组织禁止不公正的面部识别技术。

阅读一些技术文献:

  • 数学毁灭武器:大数据如何加剧不平等并威胁民主
  • 自动化不平等:高科技工具如何描述、监管和惩罚穷人

感谢阅读!我真的很想听到你的反馈😃。

ICLR 2020: NLP 亮点

原文:https://towardsdatascience.com/iclr-2020-nlp-highlights-511deb99b967?source=collection_archive---------25-----------------------

ICLR 2020 概述,重点关注自然语言处理(NLP),尤其是变形金刚和 BERT 变体。

作者图片

这篇文章是我关于 ICLR 2020 的一些亮点。因为我目前的研究是自然语言处理(NLP),所以这篇文章将重点关注这一领域。但是,计算机视觉、量子启发算法、通用深度学习方法等。也会提到。

这也是我在 Medium 上的第一篇帖子,所以我也很乐意联系并听取社区的反馈!

1.关于 ICLR 2020

从主网站https://iclr.cc/:

https://iclr.cc/ ICLR 标志(来源:)

学习表征国际会议(ICLR) 是专业人士的顶级聚会,致力于促进人工智能的表征学习分支,但通常被称为深度学习

ICLR 是顶级的国际人工智能会议之一,与 NIPS 和 ICML 齐名。其中一个区别是,ICLR 的主要关注点是深度学习。

参与者可以来自许多背景,“从 学术和工业研究人员,到企业家和工程师,到研究生和博士后。”

审查过程是双盲和开放式审查,即作者和审查者在审查过程中互不认识,所有审查和作者的回应都可以公开查看。

所有资料均可在 ICLR 虚拟页面上访问

带有 ICLR 2020 代码的文件

2.技术趋势

我的主要兴趣是自然语言处理(NLP),所以我将把重点放在这个领域。

答:热门话题:

  • 变形金刚和预先训练好的语言模型仍然是非常热门的话题。自从“注意力是你所需要的全部”( Vaswani 等人,2017 )和“BERT:用于语言理解的深度双向变压器的预训练”( Devlin 等人,2018 )在各种 NLP 任务上取得了最先进的(SOTA)结果后,研究人员继续深入研究变压器的架构和预训练的语言模型。
  • 论文可以放在理论证明方 ( 石等,2020;布鲁纳等人,2020;云等,2019; Cordonnier 等人,2019 。
  • 有论文关注提高变形金刚和预训练语言模型的任务绩效(王等 2019;李等人,2019 。
  • 其他一些论文关注的是缩小模型的或者减少训练的时间(吴等,2020;兰等,2019;基塔耶夫等人,2020;克拉克等人,2020; Rae 等人,2019;范等,2019;尤等,2019 )。
  • 传统的 LSTM,RNN 也得到了更深入的发掘( Melis et al .,2019;奥尔罕等人,2019;涂等著 2019

NLP 的许多其他主题我在这里没有涉及,所以请到网站来阅读和发现这些主题。

b .新出现的议题:

我发现会议中出现了几个话题:

  • 多语言/跨语言任务的语言架构和模型 ( Karthikeyan 等人,2019;Berend 2020;曹等人,2020;王等,2019
  • 用于计算机视觉和 NLP 的量子启发算法(Panahi 等人,2019; Kerenidis 等人,2019
  • 多模态模型 ( 苏等,2019 )
  • 强化学习与 NLP 跨学科(于等,2019;克里夫特等人,2019
  • 模型压缩/修剪 ( 张等,2019 )

3.思想

今年是 ICLR 第一次以虚拟方式举行,从我的角度来看,组织者做了出色的工作:接受论文的搜索引擎,论文相似性的可视化,作者和参与者的聊天论坛,缩放室等。

我有机会直接询问许多作者,也参与了 NLP 和 Huggingface(一个流行的 NLP 框架)研究人员的公共论坛。我也有机会参加公司的赞助商聊天。

Yann LeCun 和 Yoshua Bengio 关于深度学习方向的最后一次演讲也非常有见地,例如如何将 NLP 中的自我监督学习成功应用于计算机视觉,他们如何看待量子算法,神经科学思想也将是重要的。他们如何走到今天的故事也很鼓舞人心。

你可以在 VentureBeat 上读到其中一篇总结。

4.详情:精选论文集锦:

【多语伯特跨语言能力实证研究】

多语言模型的一个流行假设是,由于语言之间的词汇重叠,它们学习得很好。在本文中,作者发现“语言之间的词汇重叠在跨语言成功中起着微不足道的作用,而网络的深度是其中不可或缺的一部分。”(Karthikeyan 等人,2020 年)

ELECTRA:预训练文本编码器作为鉴别器而不是生成器

来源: ELECTRA:预训练文本编码器作为鉴别器而不是生成器

这篇论文为计算资源少的实体预先训练他们自己的语言模型打开了大门。特别是,作者“在一个 GPU 上训练了一个模型 4 天,在 GLUE 自然语言理解基准测试中,它的表现超过了 GPT(使用 30 倍以上的计算进行训练)。”(克拉克等人,2020 年)

  • 代码可在 Github 上获得。
  • ELECTRA 型号可用于支撑面。
  • 在 Github 上有一个针对越南人的培训前电子小程序项目

关于自我注意与卷积层的关系

来源: 关于自我注意与卷积层的关系

在 NLP 任务中成功地用基于注意力的模型取代了 RNN 之后,研究人员现在正在探索他们是否可以在卷积层和计算机视觉任务中做同样的事情。在这篇论文中,作者“证明了具有足够数量的头的多头自我关注层至少与任何卷积层一样具有表达能力。我们的数值实验表明,自我关注层与 CNN 层一样关注像素网格模式,这证实了我们的分析。(Cordornnier 等人,2019 年)

  • 该代码可在 Github 上获得

StructBERT:将语言结构融入深度语言理解的前期训练

来源: StructBERT:将语言结构融入深度语言理解的前期训练

在本文中,作者添加了两个额外的预训练任务,这些任务“在单词和句子级别利用语言结构”,并在 GLUE benchmark 中取得了 SOTA 结果。(王等,2019)

变压器是序列间函数的通用近似器吗?

本文更多的是在理论方面。在这篇论文中,作者“证明了变换器模型可以普遍地逼近紧域上任意连续的序列间函数。”他们还证明了“固定宽度的自我注意层可以计算输入序列的上下文映射,在变压器的通用近似属性中起着关键作用。”(云等,2019)

关于我

我是一名 AI 工程师和数据工程师,专注于研究最先进的 AI 解决方案和构建机器学习系统。你可以在 LinkedIn 上找到我。

参考

瓦斯瓦尼,a。新泽西州沙泽尔;新泽西州帕马尔;Uszkoreit,j;琼斯湖;戈麦斯。凯撒大帝。;和 Polosukhin,I. 2017。你需要的只是关注。神经信息处理系统进展,5998–6008。

德夫林,j。张明伟;李,k。以及图塔诺瓦,K. 2018。Bert:用于语言理解的深度双向转换器的预训练。arXiv 预印本 arXiv:1810.04805。

变压器是序列到序列函数的通用近似器吗?." arXiv 预印本 arXiv:1912.10077 (2019)。

《论变形金刚中的可识别性》(2020).

石,,等,“变压器的鲁棒性验证”arXiv 预印本 arXiv:2002.06622 (2020)。

科多尼尔、让·巴普蒂斯特、安德里亚斯·洛卡斯和马丁·贾吉。"自我注意和卷积层的关系." arXiv 预印本 arXiv:1911.03584 (2019)。

把语言结构融入深层语言理解的前训练。 arXiv 预印本 arXiv:1908.04577 (2019)。

Lee,Cheolhyoung,Kyunghyun Cho 和 Wanmo Kang。"混合:微调大规模预训练语言模型的有效正则化." arXiv 预印本 arXiv:1909.11299 (2019)。

吴,,等。〈长短距注意的简装变压器〉。arXiv 预印本:2004.11886 (2020)。

兰,等译,《阿尔伯特:一个用于自我监督学习语言表征的简易伯特》 arXiv 预印本 arXiv:1909.11942 (2019)。

尤,杨,等《面向深度学习的大批量优化:76 分钟训练 bert》国际学习代表会议。2019.

基塔耶夫、尼基塔、祖卡斯·凯泽和安塞姆·列夫斯卡娅。"改革家:高效的变压器." arXiv 预印本 arXiv:2001.04451 (2020)。

伊莱克特:预先训练文本编码器作为鉴别器而不是生成器 arXiv 预印本 arXiv:2003.10555 (2020)。

《用于长程序列模拟的压缩变压器》 arXiv 预印本 arXiv:1911.05507 (2019)。

范、安吉拉、爱德华·格雷夫和阿曼德·朱林。"通过结构化压差按需降低变压器深度." arXiv 预印本 arXiv:1909.11556 (2019)。

Lee,Cheolhyoung,Kyunghyun Cho 和 Wanmo Kang。"混合:微调大规模预训练语言模型的有效正则化." arXiv 预印本 arXiv:1909.11299 (2019)。

梅利斯、加博尔、托马什·科奇斯克和菲尔·布伦松。"莫格里弗·伊斯特姆" arXiv 预印本 arXiv:1909.01792 (2019)。

Orhan、A. Emin 和 Xaq Pitkow。“用顺序非正常动力学改进循环神经网络的记忆。” arXiv 预印本 arXiv:1905.13715 (2019)。

涂、、何凤翔、陶大成。"理解递归神经网络中的泛化."国际学习代表会议。2019

多语种伯特的跨语言能力:实证研究。国际学习代表会议。2020.

加博尔·贝伦德。"大规模多语言稀疏单词表示."(2020 年):Azonosító-2582。

曹、史蒂文、尼基塔·基塔耶夫和丹·克莱因。"上下文单词表示的多语言对齐."arXiv 预印本:2002.03518 (2020)。

王,子瑞,等。“跨语言对齐与联合训练:一个比较研究和一个简单的统一框架。” arXiv 预印本 arXiv:1910.04708 (2019)。

帕纳西、阿里阿克巴、塞兰·萨伊迪和汤姆·阿罗兹。" word2ket:受量子纠缠启发的节省空间的单词嵌入." arXiv 预印本 arXiv:1911.04975 (2019)。

克伦尼迪斯,约尔达尼,乔纳斯·兰德曼和阿努帕姆·普拉卡什。"深度卷积神经网络的量子算法." arXiv 预印本 arXiv:1911.01117 (2019)。

苏,,等。〈视觉语言表征的预训练〉。 arXiv 预印本 arXiv:1908.08530 (2019)。

陈、于、吴和穆罕默德扎基。"基于强化学习的自然问句生成图序列模型." arXiv 预印本 arXiv:1908.04942 (2019)。

《逻辑和$ 2 $-单纯变压器》 arXiv 预印本 arXiv:1909.00668 (2019)。

张,马修·顺时,和布拉德利·斯塔迪。"通过雅可比谱评估对递归神经网络进行一次性剪枝." arXiv 预印本 arXiv:1912.00120 (2019)。

余,郝楠,等。〈用奖励和多种语言玩彩票:RL 和 NLP 中的彩票〉 arXiv 预印本 arXiv:1906.02768 (2019)。

数据科学的理想 Python 环境设置

原文:https://towardsdatascience.com/ideal-python-environment-setup-for-data-science-cdb03a447de8?source=collection_archive---------10-----------------------

设置 Python 环境以开始数据科学项目的指南。

视频教程带你完成这个过程。

手头有一个数据科学项目要开始吗?不确定什么是合适的 Python 机构来平滑这个过程?你不需要再深入,因为这篇文章将解决数据科学环境中的所有问题,让你在本地工作。我们将介绍在您开始从这些数据中抽离出来之前,您可能需要安装的工具、软件包或软件。

您需要开始项目的三个要素是:

  1. 在你的机器上安装一个 UNIX shell 并熟悉它。
  2. Anaconda
  3. Git 和 GitHub — 使用最令人惊叹的版本控制系统来跟踪变更,并优化协作开发,从而对您的项目进行版本控制。

1。UNIX shell

数据科学家或软件工程师几乎每天都在使用 UNIX shell 来完成他们过多的分析任务。

UNIX shell 对数据科学家的重要性:

在某个阶段之后,你的项目将不得不投入生产。你将在一个云计算平台上工作,比如谷歌云平台或亚马逊网络服务。几乎所有的平台都是基于 Linux 的,并且要求您使用 UNIX shell。这里有一个关于 shell 脚本的备忘单。

我们将使用命令行界面来安装 anaconda、git 并执行其他操作,如启动 jupyter notebook 本地服务器、提交和推送我们对远程存储库的更改。

MacOS 用户:您的系统已经有了一个 Unix shell(bash)。如果没有,可以用自制安装。

Windows 用户: Windows 没有附带 UNIX shell。你可以安装 Cygwin ,它提供了一系列 GNU 和开源工具以及 Windows 上的其他功能。

2.安装 Python 和 Anaconda

蟒蛇标志

要设置您的 python 环境,您首先需要在您的机器上安装一个 python。有各种 python 发行版可用,我们需要最适合数据科学的版本。Anaconda 附带了自己的 Python 发行版,将与它一起安装。

为什么是蟒蛇?

数据科学通常需要你使用许多科学软件包,如 scipy 和 numpy,数据操作软件包,如 pandas 和 IDEs,以及交互式 Jupyter Notebook 。
Anaconda 自带 conda(用于命令行界面)和 Navigator (用于图形用户界面)。它是所有这些包版本和依赖项的完美管理器。

现在,你不需要担心任何 python 包,大多数都是预装的,如果你想安装一个新的包,你可以简单地通过使用 condapip 来完成。

以下是 Anacondan for MAC OS 安装的分步指南:

[## 在 macOS 上安装- Anaconda 文档

您可以使用图形化安装程序(“向导”)或命令行(“手动”)指令来安装 Anaconda

docs.anaconda.com](https://docs.anaconda.com/anaconda/install/mac-os/)

为 Windows 安装 Anaconda。

为 Linux 安装 Anaconda。

【Conda 环境管理

随着您的进步,您会发现自己正在处理多个应用程序/项目。这些应用程序将依赖于不同版本的 Python/包。您将与一个团队/合作伙伴一起工作,并且可能想要标准化配置,以便他们都能够运行项目。

在这种情况下,您需要创建和配置不同的环境。

Conda 帮助了我们,它允许我们创建包含文件、包及其依赖项的独立环境,这些环境与其他环境相隔离。

使用 conda 环境

  1. 使用 conda 创建一个名为dswh_env的新环境:
conda create --name dswh_env

您的环境现在已经创建,但是您现在还没有使用它。

2.使用或激活环境:

conda activate dswh_env

3.如果您想查看系统中的所有环境,请键入:

conda info --envs

4.要停用环境,请使用:

conda deactivate

3.安装 Git 和使用 GitHub

版本控制是程序员的福气,Git 是使用最广泛的版本控制系统。它允许我们跟踪我们的进展。我们有一个日志,记录了我们什么时候做了什么,并允许我们回到项目的前一个状态。

GitHub 是一个基于云的代码托管服务,可以帮助你跟踪你的源代码历史。如果我们想在本地跟踪我们的项目,我们不需要使用 GitHub。但是,如果你正在与一个团队合作,或者如果你想展示你的项目和技能,你可以通过把你的项目以存储库的形式发布出来,在 GitHub 上建立一个强有力的档案。

  1. 下面是为您各自的机器安装 Git 的链接:

[## Git -安装 Git

在开始使用 Git 之前,您必须让它在您的计算机上可用。即使已经安装了,也是…

git-scm.com](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)

2.如果您没有帐户,请在 GitHub 上创建一个帐户。

摘要

随着对每个组件的熟悉,您现在应该能够使用 UNIX shell、Python & Anaconda 和 Git 来设置您的环境。

Harshit 的数据科学

通过这个渠道,我计划推出几个涵盖整个数据科学领域的系列。以下是你应该订阅频道的原因:

  • 该系列将涵盖每个主题和副主题的所有必需/要求的高质量教程。
  • 解释了为什么我们在 ML 和深度学习中做这些事情的数学和推导。
  • 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
  • 项目和说明,以实现迄今为止所学的主题。

[## Harshit 的数据科学

涵盖整个数据科学课程和其他所有内容。指导了 1500 多名学生,课程…

www.youtube.com](https://www.youtube.com/channel/UCH-xwLTKQaABNs2QmGxK2bQ)

你可以在 LinkedIn 、 Twitter 或 Instagram 上与我联系(在那里我谈论健康和福祉。)

注意:在这些黑暗的时期,自我隔离为自我提升腾出了一些空间,我们可以利用这些空间来发展新的技能、爱好,并帮助未来的自己。

识别社交媒体上与投诉相关的帖子

原文:https://towardsdatascience.com/identification-of-complaint-relevant-posts-on-social-media-4bc2c8b625ca?source=collection_archive---------63-----------------------

针对投诉检测的平台无关的半监督方法的初步工作

通过这篇博客,我旨在解释在 2020 年计算语言学协会第三届电子商务和 NLP 研讨会上接受的论文“针对社交媒体中特定领域投诉检测的半监督迭代方法”中所做的工作。这个顶级场所服务于研究的融合,包括但不限于计算语言学、认知建模、信息提取和语义学。这项工作是首次尝试利用分散的社交媒体景观来列出投诉和识别不满。我们通过在社交媒体平台 Twitter 上评估交通相关服务来强调我们方法的实用性。这篇文章将简要概述这项研究的动机、方法和应用。更多的技术细节可以在论文中找到。我们的团队热切期待任何关于这项工作的建议和改进。

动机

社交媒体最近已经成为用户表达对各种产品和服务的意见的主要场所之一。这些意见对于了解用户对这些服务的看法和感受极其有用。它们对于识别潜在缺陷也很有价值,并且对于下游客户服务响应的执行至关重要。像运输和物流这样的公共部门企业受到公众舆论的强烈影响,并构成一个国家经济的一个重要方面。通常,企业依靠社交媒体来确定客户反馈和初步反应。因此,自动检测社交媒体上的用户投诉可以证明对客户和服务提供商都有利。

一名社交媒体用户向相关部门表达了他们的不满。

拥有大量市场份额的运输相关公司。

传统上,列出投诉涉及社交媒体用户用他们的投诉标记相关个人。然而,有一些缺点降低了这种方法的实用性。
与其他贴有相关当局标签的帖子相比,此类帖子的出现率较低。此外,媒体平台受到冗余的困扰,帖子在重新发布之前会被重新措辞或进行结构变形。此外,大量不可避免的噪音使得很难识别可能需要立即关注的帖子。

我们的贡献

为了建立这样的检测系统,我们可以采用有监督的方法,这通常需要大量的标记训练样本。然而,正如我们所讨论的,标记社交媒体帖子以捕捉对特定服务的投诉是一项挑战。先前在事件检测方面的工作已经证明,简单的语言指示符(短语或 n-gram)在准确发现社交媒体中的事件方面是有用的。虽然用户投诉与事件不同,更像是一种言语行为,但我们认为类似的指标也可以用于投诉检测。为了追求这一假设,我们提出了一种半监督迭代方法来识别抱怨特定服务的社交媒体帖子。在我们的实验工作中,我们从 326 个交通投诉样本的注释集开始,经过该方法的四次迭代,我们收集了 2,840 个指标和超过 3,700 条推文。我们从最终数据集中随机抽取了 700 条推文进行注释,发现超过 47%的样本是实际的交通投诉。我们还描述了基本分类算法在这个数据集上的性能。在这样做的时候,我们还研究了不同的语言特征是如何对该领域中的监督模型的性能做出贡献的。

方法和途径

我们提出的方法从大量与交通相关的推文和少量带注释的投诉开始。我们使用这些标记数据来创建一组种子指标,以驱动我们迭代投诉检测流程的剩余部分。

数据收集

我们将实验集中在 2018 年 11 月至 2018 年 12 月期间。我们创建交通相关推文语料库的第一步是识别与交通领域相关的语言标记。为此,我们从交通相关的网络论坛 中随机搜集了一些帖子。这些论坛让用户讨论他们的不满,并提高对各种交通相关问题的认识。然后,我们处理这些数据,提取具有高 tf-idf 分数的单词和短语(单字、双字和三字)。然后,我们让人工注释者进一步删除重复和不相关的项目。

我们使用 Twitter 的公共流 API 来查询在所选时间范围内包含 75 个短语中任何一个的推文。然后,我们排除了非英语推文和任何少于两个令牌的推文。这导致收集了 19,300 条推文。我们将这个集合称为文集 C 。我们从这个集合中随机选择了 1500 条推文作为人类注释的样本。我们雇佣了两名人工注释者从这 1500 条推文中识别与交通相关的投诉。手稿中提到了注释细节。在注释者不同意的情况下,标签通过讨论来解决。分歧解决后,最终的种子数据集包含 326 个与交通相关的投诉样本。我们将这个集合称为 Ts

从精选数据集中识别为投诉相关的示例推文图像。从图像中删除个人识别信息。

迭代算法

图中总结了我们提出的迭代方法。首先,我们使用种子数据 Ts 构建一组投诉的语言指标 I 。然后,我们使用这些指标从语料库 C 中获取潜在的新投诉 Tl 。然后我们合并 TsTl 来构建我们的新数据集。然后,我们使用这个新的数据集来提取一组新的指标。指标与原指标 I 结合,提取出下一版本 Tl 。这个过程一直重复,直到我们再也找不到任何新的指标。

迭代投诉检测算法。

提取语言指标

如算法所示,提取语言指标(n-grams)是该过程中最重要的步骤之一。这些指标对于识别最有可能是特定领域投诉的推文至关重要。我们采用两种不同的方法来提取这些指标。对于带注释的种子数据 Ts ,我们只选择 tf-idf 得分最高的 n 元文法。在我们的实验工作中, Ts 有 326 条带注释的推文。我们确定了 50 个具有最高 tf-idf 分数的 n-grams 来初始化 I 。一些例子包括像问题、车站、服务、通行费、回复、故障、提供信息、司机、地区、乘客这样的术语。

当从没有注释的 Tl 中提取指标时,可能会出现不一定表示投诉的频繁出现的短语。这些短语可能会导致后续迭代中的概念漂移。为了避免这些离题,我们在选择指标时使用了一个域相关性的度量。这被定义为 n-gram 在 Tl 中的频率与在 Tr 中的频率之比。 Tr 是随机选择的不与 C 相交的 tweets 的集合。我们将 Tr 定义为来自不同时间范围的 5000 条推文的随机样本,而非 C.

我们的迭代方法在四轮中收敛,之后没有提取任何新的指标。经过四次迭代,这种方法选择了 3732 条推文,生成了 2840 个独特的指标。我们还手动检查了流程中选择的指标。我们观察到,只有域相关性分数大于 2.5 的指标被选择用于后续迭代。

一些强弱指标的例子。括号中的数字表示各自的域相关性分数。

每次迭代后收集的指标和 tweets 的频率。

我们从最终的投诉数据集 T 中随机选择了 700 条推文,并手动对它们进行了注释,以帮助理解质量。手稿中已经讨论了这些指导方针,并且也使用了和以前一样的注释者。注释者获得了 kappa= 0.83 的高一致分数。在解决分歧后,我们观察到 332 条推文被标记为投诉。这占了 700 条样本推文的 47.4%。这表明,我们的半监督方法选择的近一半推文是与交通相关的投诉。这在原始 seed 数据 Ts 中的比例要高得多,其中只有 21.7%是实际投诉。

系统模型化

我们进行了一系列实验,以了解我们是否可以自动建立简单的机器学习模型来检测投诉。这些实验还帮助我们评估最终数据集的质量。此外,这项实验工作还研究了不同类型的语言特征如何有助于发现社交媒体投诉。对于这些实验,我们使用 700 篇文章的注释样本作为测试数据集。我们通过从原始语料库 C 中选择另外 2000 个帖子来建立我们的训练数据集,并再次对它们进行注释。为了评估机器学习算法的预测强度,我们使用了各种语言特征。这些特征可以大致分为四组。

(i) 语义:第一组特征基于简单的语义属性,例如 n-grams、单词嵌入词性标签

(ii) 情感:第二组特征基于预先训练的情感模型词汇库

(三)正投影:第三组特征使用正投影信息,如标签用户提及增强符

(iv) 请求:最后一组特征再次使用与一个请求相关联的预训练模型或词典,这是一个密切相关的言语行为。

出于实验目的,我们对来自每个预训练模型或词典的完整推文使用了定量或归一化的分数。关于这些类型特征的先前文献的更多细节可以从该论文中获得。

结果

我们使用描述的每一个特征训练了用于投诉检测的逻辑回归模型。表现最好的模型基于 unigrams,准确率为 75.3%。不同情感模型的性能没有显著差异。有趣的是,观察到简单的特征,如不同代词类型的数量和加强词的数量,具有很强的预测能力。总的来说,我们观察到这里研究的大多数特征都有一些预测抱怨的能力。

与不同类型特征相关的预测准确性和 F1 值。分类器利用逻辑回归(弹性网络正则化),因为与同类产品相比,它具有最佳性能。

这项研究的潜在使用案例

正如所讨论的,我们所提出的架构的效用是多方面的:
(i)我们相信我们的工作可能是改进下游任务的第一步,这些任务与投诉相关,例如聊天机器人开发、创建自动查询解决工具或收集关于服务的低成本公众意见。(ii)我们的方法将帮助语言学家从词汇或语义的角度理解批评和抱怨中使用的语言。
(iii)所提出的方法具有高度的
灵活性,因为它可以根据种子数据中使用的词汇扩展到其他领域。
(iv) 架构的迭代本质减少了人为干预,因此在训练阶段不会出现任何无意的偏差。这也使得
对帖子中随时间发生的词汇变化具有鲁棒性
(iv)由于它是半监督的,因此
减少了投诉检测对大量预标记样本的依赖,并且减轻了监督方法中普遍存在的类别不平衡问题。

结论和未来工作

作为这项工作的一部分,我们提出了一种迭代半监督方法,用于自动检测投诉。投诉解决是各种基于产品的公司的产品改进计划的重要部分;因此,我们认为,我们提出的方法可以有效地衡量公众意见的低成本评估或路由投诉到适当的平台。我们手动验证了所提出方法的有效性,并观察到在收集投诉相关推文方面有显著的改进。未来,我们的目标是部署聚类机制来隔离不同性质的事件相关推文。我们还计划使用额外的元数据上下文和 tweet 会话性质来增强系统性能。我们的团队热切地期待着关于这篇论文的任何反馈或建议。请随时联系论文的作者。我希望这篇文章能激励另一位像我这样的年轻研究人员去着手解决一个相关的社会问题,并利用人工智能和数据科学的潜力来解决这个问题。

相关链接

[## 社交媒体中特定领域投诉检测的半监督迭代方法

摘要在本文中,我们提出了一种半监督自举方法来检测产品或服务相关的…

www.aclweb.org](https://www.aclweb.org/anthology/2020.ecnlp-1.7/) [## MIDAS-研究/运输-投诉-检测

这个语料库可以免费用于研究目的。下面列出的文件提供了创建和使用…

github.com](https://github.com/midas-research/transport-complaint-detection)

识别词汇语义词的关系——初学者指南

原文:https://towardsdatascience.com/identification-of-lexico-semantic-word-relations-a-beginners-guide-427ed331e287?source=collection_archive---------38-----------------------

对我目前工作的一个虚拟介绍——识别一对给定单词之间的语义关系的本质。

当我请求你“请容忍我”的时候,你让自己做好了不得不容忍我的准备。如果你被告知“这个泰迪熊是毛绒绒的”,你的大脑会想象出一个柔软、可爱、毛茸茸的玩具,让蹒跚学步的孩子抱上床。如果你读到熊濒临灭绝,你会想到北极海冰中的北极熊。当他们在下周的新闻中告诉你冠状病毒危机让我们陷入了我们这一代人最糟糕的熊市时,你会本能地知道他们在谈论股票。

你的英语知识,以及你理解上下文依赖、词汇和句法结构以及语言细微差别的能力,有助于你区分同一个词的四种意思。你认为这是理所当然的,几乎不去想它,但是你花了很多年才获得这种能力。你直接或间接地从你的个人经历中学习。你通过在上下文、信息、行为和反应之间建立联系来学习。当你下意识地触发一组中子来交流或倾听时,神经认知反应的级联反应是一个奇迹。所有这些再加上你的遗传天赋,让语言对你来说毫不费力。

另一方面,理解人类语言对计算机来说是个难题。不像你和我,计算机没有像我们一样进行语言训练的特权。甚至编程语言也不由它们直接解释——它们首先被转换成低级机器语言。真正的机器码仅仅是一串原始的,通常是二进制的(1 和 0)数据。虽然人类获得了分析、处理、推断和交流的能力,但对于计算机来说,从人类语言中挑选出来的任何单词都是难以理解的胡言乱语,直到它接受了足够的训练来理解这种语言。

这项任务是教机器像我们一样理解语言,这被称为自然语言处理或 NLP。NLP 是人工智能的一个分支,它本身是许多其他子问题的保护伞。这类问题的日常例子有搜索、语音识别、翻译、摘要、问答等。但是所有这些都回避了一个问题——如果计算机除了 1 和 0 什么也不懂,它们怎么能理解人类语言的复杂性呢?

单词向量—以数字的形式表示单词

考虑一个空间,其中所有的英语单词都是基于它们的语义特征来填充的。这个想象的空间是这样的,共享相似描述或概念的词共享相似的空间属性。例如,“猫”和“狗”这两个词会非常接近,因为猫的概念和狗的概念非常相似。两者都是四足动物,是可爱宠物的家养品种。对于意义不相似但代表相同概念的单词,单词相对于彼此的位置概括了这种关系。在语义空间中,“国王”与“王后”的相对位置类似于“男人”与“女人”或“男孩”与“女孩”之间的相对位置,因为在所有三种情况下分隔单词的定义概念是相同的——性别。

在下面的语义空间示例中,您可以看到狮子、老虎、猎豹和大象等动物的向量非常接近。这很直观,因为它们经常在相似的上下文中被讨论;例如,这些动物很大,是野生的,而且有潜在的危险——事实上,描述性的单词“野生”与这组动物非常接近。

由于单词最纯粹的形式无法被计算机解释,我们通过将单词固有的概念和思想映射到每个单词的一组代表性数字来简化它们。这些数字集由“神经网络”(一种算法)以代数方式生成或“学习”,被称为“单词向量”。这些词向量具有跨词集合捕获关于语义关系和句法结构的信息的能力。生成单词向量的方法建立在 Firth(1957)分布假设的基础上,该假设陈述:

“从一个人所交的朋友,你就可以知道他说了什么。”

换句话说,拥有相似语境的单词往往有相似的意思

词向量可以有任意维数,尽管标准数通常是 50、100 或 300。这些维度中的每一个都代表一个意义或一个抽象概念,其程度取决于该词在该特定维度上的数字权重。这里有一个例子来说明这一点。考虑一个只有十个单词(而不是几百万个)的词典,想象我们的单词向量是三维的(而不是三百个)。

在上图中,为了更好的理解,我们假设每个维度都有一个明确定义的含义,而不是一个抽象的概念。例如,如果你想象第三维度代表“蓬松度”的概念,那么每个单词在那个维度上的权重代表它与那个概念的关系有多密切。让兔子拥有最高的蓬松系数 0.45 是完全合理的。这是对单词向量的相当大的简化,因为维度在现实中并不具有如此明确定义的含义,但这是一种有用且直观的方式来让你理解单词向量维度的概念。我们不会深入研究神经网络如何学习单词嵌入的数学细节,因为这将涉及到线性代数的漫长弯路。但是现在你知道了驱动数学的基本思想。

词汇关系解析

我目前的研究工作集中在一个叫做词汇关系消解的问题上。词汇关系是一种文化上认可的关联模式,存在于一种语言的词汇项(一个词、一个词的一部分或一串词)之间。例如,“打开”和“关闭”之间的词汇关系是反义关系,而“关闭”和“关闭”是通过同义关系连接的。其他不对称的词汇语义关系包括上下义关系(如电话←→监视器)、上下义关系(如电话→扬声器电话)或部分义关系(如电话→话筒)等

识别给定单词对之间的语义关系的确切性质是至关重要的,并且形成了所有其他 NLP 应用(问答、摘要、语音识别等)的基础。)就是我上面提到的。

过去已经提出了几种方法来区分一对单词之间的多种语义关系。但是,这仍然是一项艰巨的任务,尤其是在区分某些关系时。(例如同义和同义)。

研究工作—补丁、注意、长方体

为了解决这个问题,我们的工作提出研究在特定单词的邻域中引入相关单词,并测量它对单词关系的预测准确性的影响。我们最初的假设是,如果每个单词被固定数量的相邻单词(或“补丁”)的单词向量所增强,则可以获得改进的性能。

存在许多相似性度量来说明链接两个单词的词汇语义关系。在我们的例子中,我们使用余弦相似性度量,它在过去被证明对于各种语义关系是成功的。简单地说,余弦相似性是一种用于确定两个实体有多相似度量。我们以直接的方式将余弦相似性扩展到面片。两个块之间的相似性是它们各自块中所有单词之间的一对一余弦相似性度量的集合。

下一步包括将补丁转换为学习输入,因为尽管我们可以在大脑中绘制和可视化补丁,但计算机需要具体的数字数据来理解它。将每个单词的 300 维单词向量与小块中所有单词的 300 维单词向量进行比较,并且为每次比较提供单个相似性得分。实际上,我们取 600 个值(两个单词各取 300 个)并借助余弦相似度将其简化为一个。如果我们将邻居的数量设置为 10,那么我们将得到 10×10 次比较,从而得到 100 个相似性值。这些值一起形成“片内相似度表”。下面给出了四个不同补丁及其补丁内分数的例子。

人们决定,除了在片内保持概念中心性之外,在片之间保持关系中心性也是有意义的。重要的是要认识到,只有两个补丁中的某些单词可能是决定两个单词是否处于词汇语义关系的核心。如果两个补丁共享对两个概念都很重要的一组紧密语义相关的单词,那么决策过程在直觉上应该更可靠。

然而,我们最初的发现表明,直接引入邻词并没有带来改善。我们认为这主要是由于战略变化导致的概念中心性的丧失。如果通过并列两个补丁而不是两个单词来评估单词关系,那么对原始单词的关注可能会被削弱。

下一个合乎逻辑的步骤是根据单词向量在概念中的中心地位来权衡它们。为此,我们引入了一种基于 PageRank 算法的注意力机制(这是谷歌用于网络搜索的算法之一。PageRank 是为了衡量网站页面的重要性而开发的)。我们用它来分配一个权重的中心性的每个词的邻居在补丁。一个单词在补丁中越重要,它得到的分数就越高。这些分数然后被用作邻居的相应单词向量表示的注意力权重。该机制的目标是基于补丁中每个词向量的重要性分数来提高我们的系统的预测能力。我们发现,当与正确的架构结合部署时,注意力调整补丁支持了我们的模型,并对先前的结果给予了显著的推动。我将不得不涉足非常技术性的领域来解释架构的细节,所以,现在,我们将省去那些细节。

事实上,与非补丁基线方法相比,二元分类(在两个关系之间做出决定)的平均改进可以达到 10.6%,多类分类(在两个以上关系之间做出决定)的平均改进可以达到 8%。就目前情况而言,我们认为,如果我们构建一个长方体,我们可能会获得更好的结果,其中两个单词的单词向量不是折叠成单个相似度值,而是通过仅将它们从 600 维压缩到 300 维来更大程度地保留。(我们通过取两个向量之间的点积来实现。两个 300 维向量的点积产生新的 300 维向量)。我们在长方体上的结果很有希望,并且在我们以前的基线上表现出了增强的性能。然而,在被称为对其前身的彻底升级之前,该模型还需要通过更多的测试。我们的下一步是将我们的结果与试图解决同样问题的模型进行比较。无论结局如何,我一定会在博客上更新我们的进展。

至于一般的 NLP,毫无疑问,我们仍然需要几十年,或者最多几年,才能设计出像我们一样说话和交流的人工智能。今天训练一台计算机完成最简单的任务所需的数据量是巨大的。就数据表示的质量而言,我们既没有达到顶峰,也没有足够的计算能力来将基于当前数据表示训练的模型扩展到特定范围之外。

然而,回想起来,对我来说,有一点数学知识、足够的计算能力和对编程语言的相当熟悉,就可以教一个完全无生命的物体理解我们人类的语言,这永远不会停止疯狂。当你想到它的时候,它是相当超现实的。​

这篇博文基于 Nesrine Bannour 和 Houssam Akhmouch 在 gal Dias 教授的指导下所做的工作。

您可以访问我的页面 这里 。你可以关注我的推特 这里

使用华盛顿 DC 地铁数据确定有利可图的广告位置

原文:https://towardsdatascience.com/identify-profitable-advertising-locations-using-washington-dc-metro-data-a03c5c4fc18f?source=collection_archive---------59-----------------------

深入分析

使用 Python 中的骑手脚步数据进行简单分析

感谢:大卫·TRAN/SHUTTERSTOCK

在 DC 的华盛顿生活了一年,我开始意识到 WMATA 地铁是这个充满活力的城市的生命线。地铁网络庞大,在整个车管所区域连接良好。当我第一次搬到没有汽车的首都时,我经常跳上地铁四处走动。我一直喜欢坐火车旅行,因此不出所料,地铁成了我探索这座美丽城市最喜欢的方式。在旅途中,我经常注意到地铁站台上、自动扶梯/电梯附近、地铁车厢内等地方的产品广告。对地铁乘客数据的良好分析将有助于广告商识别哪些地铁站在什么时间最繁忙,从而增加广告曝光。我偶然发现了这个免费的数据集,并决定深入研究它。在本文中,我将向您介绍我的分析。

第一步:导入必要库

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

第二步:读取数据

让我们称我们的熊猫数据帧为“df_metro ”,它将包含原始数据。

df_metro = pd.read_csv("DC MetroData.csv"

第三步:目测数据帧的数据和长度

df_metro.head()

df_metro.columns

len(df_metro)

第四步:检查不同列下的不同值

让我们检查一下“时间”列中的唯一值是什么

df_metro['Time'].value_counts().sort_values()

“日”列中的唯一值如下:

df_metro['Day'].value_counts().sort_values()

下一步是分析几个问题。

Q1。有哪些热门的出入口?

按降序排列的每个地铁站的不同记录计数将告诉我们哪些是受欢迎的入口和出口。

df_metro['Entrance'].value_counts().sort_values(ascending=False).head()

df_metro['Exit'].value_counts().sort_values(ascending=False).head()

热门地点似乎是

  1. 画廊区-唐人街:主要景点有首都一号竞技场(吸引大量人群观看体育赛事和音乐会)、餐馆、酒吧等。
  2. 雾谷:该地区的政府办公楼使其成为一个受欢迎的通勤目的地
  3. 五边形城市:距离华盛顿市中心的国家广场仅 2 英里,这使得该地区成为酒店和企业的热门地点。
  4. 杜邦环岛:位于该地区的国际使馆
  5. 联合车站:长途旅行者的重要地点
  6. 地铁中心:一个受欢迎的市中心位置
  7. 托腾堡的地铁站是绿色、黄色和红色线路的热门换乘点

要点:广告商应该瞄准上述乘客流量高的热门地铁站,以最大限度地吸引买家的注意力。

Q2。在一周的不同日子/时间,乘客量是什么样的?

这可以通过简单地绘制不同日期和时间的骑手数据来回答。我们将利用 seaborn 库来创建这个。

sns.set_style("whitegrid") 
ax = sns.barplot(x="Day", y="Riders", hue="Time",
             data = df_metro,
             palette = "inferno_r")
ax.set(xlabel='Day', ylabel='# Riders')
plt.title("Rider Footfall on different Days/Times")
plt.show(ax)

外卖:地铁是城市中工作通勤的热门选择,因此,正如所料,工作日期间乘客流量最高,尤其是在早高峰和晚高峰期间。计划推出新产品的公司应该瞄准这些时段,以吸引消费者的注意力并引起他们的兴趣。对于周末期间的广告机会,最有吸引力的时间段似乎是中午,紧随其后的是下午高峰。

Q3。在一个典型的工作日期间有什么繁忙的路线?

为了分析这个问题,我们将考虑在任何给定的地铁站超过 500 名乘客的客流量。首先,我们将创建一个数据帧“busy_routes ”,其中包含关于超过 500 名乘客的路线的数据。其次,我们将过滤该数据帧,使其仅包含“AM 峰值”的数据。第三,我们将对过滤后的输出进行排序。

busy_routes = weekday[weekday['Riders']>500][['Merge', 'Time', 'Riders']]
peak_am = busy_routes.query('Time=="AM Peak"')
peak_am.sort_values('Riders').tail()

对“PM 峰值”重复相同的步骤。

peak_pm = busy_routes.query('Time=="PM Peak"')
len(peak_pm)
peak_pm.sort_values('Riders').tail()

外卖:我们看到,上午高峰期间客流量大的路线与下午高峰期间客流量大的路线相同,如西福尔斯教堂—法拉古西,维也纳—法拉古西,Shady Grove —法拉古北。这告诉我们,这些是受欢迎的工作通勤路线,因为人们在上午高峰期间去法拉格特工作,在下午高峰期间返回他们在维也纳/瀑布教堂/Shady Grove 的家。广告商应该瞄准这些高流量的通勤路线,以最大化他们的广告和产品植入。

Q4。周末最受欢迎的地铁路线是什么?

让我们执行一个类似于工作日的分析。由于我们在这里处理周末数据,我们将考虑客流量超过 200 人的地铁站。

saturday = df_metro[df_metro['Day']=='Saturday']
busy_routes_sat = saturday[saturday['Riders']>200][['Merge', 'Time', 'Riders']]
busy_routes_sat.sort_values('Riders').tail()

sunday = df_metro[df_metro['Day']=='Sunday']
busy_routes_sun = sunday[sunday['Riders']>200][['Merge', 'Time', 'Riders']]
busy_routes_sun.sort_values('Riders').tail()

要点:史密森尼是一个非常受游客和城市居民欢迎的目的地,因为它有几个博物馆,并且靠近白宫、国会大厦、国家纪念碑、战争纪念馆等。我们的分析告诉我们,人群在中午从水晶城、五边形城、维也纳、弗兰科尼亚前往史密森尼博物馆,在下午高峰返回。这些人群中大多数是有孩子的年轻家庭,这是公司推出针对包括儿童在内的年轻人群的产品的理想受众。

Q5。作为一名广告客户,我应该在深夜锁定哪些位置?

我们将做一个与上面类似的分析,以确定哪些地铁站是深夜投放广告的理想场所。对于“深夜”,我们将考虑客流量超过 50 人的地铁站。

late_night = df_metro[df_metro['Day']=='Late Night']
busy_routes_latenight = late_night[late_night['Riders']>50][['Merge', 'Time', 'Riders']]
busy_routes_latenight.sort_values('Riders').tail()

外卖:我们看到,深夜,乘客们从热门地点乘坐地铁,如画廊广场、克拉伦登、杜邦环岛和 U 街,夜生活热闹非凡。因此,想要吸引这部分人群(通常是较年轻的人群)的广告商应该潜在地瞄准这些地铁站来抓住最大的注意力。

结束语:这个数据集相当简单,因此,我们没有花太多时间清理和争论数据。有了给定的数据,我们就能找到最佳点,确保广告商的钱得到最大的回报。感谢阅读!

在无向图中识别良好连接的用户

原文:https://towardsdatascience.com/identify-well-connected-users-in-a-social-network-19ea8dd50b16?source=collection_archive---------45-----------------------

该出版物主要讲述如何使用无向图和 Scipy 的稀疏矩阵实现(首席运营官)来存储数据,并通过计算三角形来分析用户连接。

艾莉娜·格鲁布尼亚克在 Unsplash 上的照片

我最近发现,我的一位前雇主有一个类似于脸书的社交网络,因此有大量数据迫不及待地需要分析。社交网络相当成熟,发展良好,最重要的是,也使用了很多。所以我决定更详细地研究一下关系数据。

在浏览网页的时候,我发现了一个让“计算连接质量”成为一个可行且有趣的任务的方法。这里的关键词是数三角形。这似乎是一个很好的方法,通过检查他们与第三方有多少关系来找到关系良好的用户。为了使这一点更具体,让我们做一个简单的例子。

甲认识乙,乙认识丙。简单,没有三角形,因此不是我们要寻找的。

A 认识 BB 认识 CC 认识 A 。嗯,这正是我们要找的,因为我们在这里看到,这三个人在这个星座中最多有 2 个联系。因此,最大连接数。

无向示例图

graph = np.array([
    [0,1,1,0,0,0,0,0],
    [1,0,1,1,1,0,0,1],
    [1,1,0,0,0,0,0,0],
    [0,1,0,0,1,0,1,1],
    [0,1,0,1,0,1,0,0],
    [0,0,0,0,1,0,0,0],
    [0,0,0,1,0,0,0,0],
    [0,1,0,1,0,0,0,0]
])

from numpy import linalg
w,v = linalg.eig(graph)
w,v

round(np.sum(w**3) / 6,1)

卡内基梅隆大学【1】发表的一篇论文中关于矩阵中三角形计数的有趣实践。本文已经提供了非常容易理解的伪代码片段——但是,我们稍后将研究另一种方法。Charalampos E. Tsourakakis(卡内基梅隆大学)提出了一种经过广泛测试的精确方法(95%+),通过“特征值的立方之和”来计算网络中的三角形。

C. E .措拉基斯的“特征三角形”

在常规的英语措辞中,我们是在计算一个无向图中三角形的总数,其中 lambda 表示第 I 个特征值。为了得到三角形的数目,我们需要特征值立方的和。请注意除以 6。这可以从一个三角形包含的三个节点中推导出来,由于我们将每个三角形计为 2,因此我们需要乘以分母,我们将在下面进一步找到这个“神奇的 6”。

如果你是那些“特征人”中的一员(笑话来自麻省理工学院的吉尔伯特·斯特朗教授[2]),我很确定上面的等式对你来说很有趣。根据 Tsourakakis 的说法,我们需要以下面陈述的形式提供数据。给定的 pseudo 和 Python 代码需要计算/创建邻接矩阵(“图”)和计算所有 Iλ:

对于你的计算机程序来说,这是一个非常简单的任务:

# a few lines implementing (1) from above
from numpy import linalg

def return_eig_triang(graph):
  w,v = linalg.eig(graph)
  w,v
  no_of_triangles = round(np.sum(w**3) / 6,1)
  return no_of_triangles # total triangles in the matrix

因此,我们现在看到的图形示例中共有 3 个三角形,这与我们在图表中看到的完全匹配。有三个三角形 (0,1,2)(1,3,4)(1,3,7) ,因此与用户 56 相比,用户 0,1,2,3,4,7 看起来连接得相当好。

现在让我们转到一个更随机的问题,我们之前没有调整数据,以观察特定的输出。为此,让我们创建一个人工稀疏数据集。我从可能有 20 个用户的数据集中选择了一个简单的随机样本——实际上这当然要多得多,因此我们将考虑一个通过坐标寻址的稀疏矩阵,尽管这对于我们的人工数据集来说不是必需的。

# create sparse dataset
connections_list = []

for i in range(31):
    connections = np.random.choice(21,2) # obviously, repeated values are likely, let's see whether we get triangles too..
    connections_list.append(list(connections))

print(connections_list)

现在我们可以检查我们的随机数据——请注意,我们也将坚持我们的第一个较小的例子来证明这个过程是可行的。在上面的几行中,我们创建了一些随机的连接。如果我们观察到(8,7)和(16,8),我们将希望得到另一个(16,7)对,以便得到一个三角形。注意,用户不能和自己做朋友!

random 函数创建的内容如下——乍一看,我认为我们可以使用它(重复是好的,必须避免自引用):

[[2, 3], [18, 3], [14, 10], [2, 10], [3, 12], [10, 11], [19, 16], [7, 2], [6, 0], [14, 9], [11, 5], [12, 3], [19, 8], [9, 0], [4, 18], [12, 19], [10, 4], [3, 2], [16, 6], [7, 3], [2, 18], [10, 11], [8, 18], [2, 10], [19, 1], [17, 3], [13, 4], [2, 0], [17, 2], [4, 0], [1, 17]]

当首先检查两个坐标 X 和 Y 中的模式值时,我们得到与该模式同时出现的值 {2,3,7,17} 。查找这些值的查询很简单,我们只需检查每个列表的元素[0]或[1]是否等于我们的模式 (X == 2) | (Y == 2) 。因为我们打算将稀疏数据存储在各自的数据结构中,所以让我们继续讨论稀疏矩阵。为了这个目的,我创建了一个快速剪辑来支持你的理解。

# adding coordinates symmetrically
x,y = [],[]

for element in connections_list:
    xi = element[0]
    yi = element[1]

    x.append(xi)
    x.append(yi) # make symmetric
    y.append(yi)
    y.append(xi) # make symmetric

# create 'one' entries for the coo matrix
vals = np.ones(len(x))

# numpy(scipy.sparse)
from scipy.sparse import coo_matrix
m = coo_matrix((vals,(x,y)))

现在看来,三角形很可能出现在之前给出的集合中。以便在更大的范围内对特定行的三角形进行计数(其中每行代表X【index _ number】)—这与我们第一种方法不同,在第一种方法中,我们对所有三角形进行计数!—我们需要另一个方程来评估这个结果。

很长一段时间我都没能解决这个问题,但是当我做一些练习时,我发现了一个非常好的解决方案,它是由非常受赞赏的 Richard Vuduc 教授提出的3。在寻找三角形的任务中,我借用了一种线性代数方法,这种方法我可以从 Vuduc 教授的一本出色的笔记本中学到。

首先,我们创建矩阵的点积(其中 M 和 M.T 总是相等的)。这将计算从一个用户到另一个用户的所有连接。正如我们将看到的,也有一些“过数”。当点积最终被初始矩阵 m 的成对乘法“掩盖”时,这些将消失

多么优雅的解决方案!

# dot & pairwise multiplication
# = connection count + "masking"

M = (m.dot(m)) * m

在最后一步,最终我们能够获得连接良好的用户,我们将计算每个用户的三角形数。请注意,任何给定的数字都不能被认为是“人 m 有 n 个三角形”,但结果可以排序,这将允许您识别最佳或最少连接的用户。

备注:如前所述,如果我们把所有的连接加起来,然后用这个数除以我们的 6 ( 1/3 代表三角形,1/2 代表我们把三角形数为 2),我们将再次看到三角形连接的总数。

正如已经从获得的模式值中假设的,与用户 2 的连接最有可能导致三角形,这也可以在我们的示例数据中观察到。高三角形值用星号突出显示:

# obtaining "triangle-values" is easy:
np.sum(M.toarray(), axis=1)
user:  0 	Triangle value:  [[66.]]
user:  1 	Triangle value:  [[26.]]
user:  2 	Triangle value:  [[**187.**]] *****
user:  3 	Triangle value:  [[**167.**]] *****
user:  4 	Triangle value:  [[69.]]
user:  5 	Triangle value:  [[13.]]
user:  6 	Triangle value:  [[22.]]
user:  7 	Triangle value:  [[70.]]
user:  8 	Triangle value:  [[30.]]
user:  9 	Triangle value:  [[24.]]
user:  10 	Triangle value:  [[**127.**]] *****
user:  11 	Triangle value:  [[59.]]
user:  12 	Triangle value:  [[71.]]
user:  13 	Triangle value:  [[15.]]
user:  14 	Triangle value:  [[34.]]
user:  15 	Triangle value:  [[0.]]
user:  16 	Triangle value:  [[15.]]
user:  17 	Triangle value:  [[77.]]
user:  18 	Triangle value:  [[93.]]
user:  19 	Triangle value:  [[39.]]

从这个例子中我们可以得出:与三角形相关的值确实具有相对较高的值,但是我们还需要考虑额外的简单连接也会增加我们的整体值。这尤其可以在非三角形和三角形的情况下 1017 中观察到。

正如我前面提到的,我们将再次查看我们的起始示例,以确保我们的结果是可信的。由于用户 1 是 3 个整体三角形的一部分,我们当然希望这个用户有最高的分数。将完全相同的步骤应用于我们的第一个小型数据集的结果证实了我们的预期,并显示了以下内容:

user:  0 	Triangle value:  2
user:  1 	Triangle value:  6
user:  2 	Triangle value:  2
user:  3 	Triangle value:  4
user:  4 	Triangle value:  2
user:  5 	Triangle value:  0
user:  6 	Triangle value:  0
user:  7 	Triangle value:  2

我希望我能为您提供一个小而有用的例子,说明如何识别无向图中的连通项,并使用稀疏矩阵来存储和处理数据。我很想听听,你是如何将这种逻辑应用到其他话题上的。下次见

[1]charalappos e . Tsourakakis,大型真实网络中三角形的快速计数:算法和法则

[2]https://www.youtube.com/watch?麻省理工学院 Gilbert Strang 教授 v=cdZnhQjJu4I

Richard Vuduc 教授,CSE 6040,https://cse6040.gatech.edu/fa17/details/

确定数据的分布

原文:https://towardsdatascience.com/identify-your-datas-distribution-d76062fc0802?source=collection_archive---------2-----------------------

你的分布假设正确吗?让我们找出它。

卢克·切尔在 Unsplash 上的照片

每天我们都会遇到各种数据,如传感器数据、销售数据、客户数据、流量数据等。此外,根据用例的不同,我们会进行各种处理,并在上面尝试几种算法。您是否想过这些关于您的数据的问题:

你的数据是什么样的?

你对它的价值有信心吗?极值‘x’出现的可能性有多大?

您应用的算法可能会对数据分布做出一些假设,这些假设是正确的吗?

数据分布会随着时间或特殊季节而变化吗?

数据分布是一个列出数据可能取的所有值的函数。它可以是一个连续的或离散的数据分布。几种已知的标准概率分布函数提供了实验中不同可能结果出现的概率。一些众所周知的概率分布有正态、对数正态、β、γ等。其具有标准形式。

但是,挑战在于现实世界的数据可能不遵循任何众所周知的概率分布。在这种情况下,我们可以近似最可能的概率分布,并检查其拟合优度。

通过这篇博客,我打算强调了解你的数据和近似它的概率分布的好处。我还将展示如何做到这一点的实际例子,并测量拟合分布与观察分布的拟合优度。博客中使用的数据集是 Kaggle 的二手车数据集 。这篇博文中用到的代码可以从 这里 下载。

了解数据潜在概率分布的优势

1.良好实践

一旦开始处理数据,了解数据是一个很好的习惯。许多算法,如线性回归,假设变量遵循特定的分布。不符合假设的成本有时会很高。

2.附加置信区间

知道了底层的概率分布,我们就可以找到它的概率密度函数。这有助于我们将置信区间与数据可能取值的范围联系起来。我们也可以求出极值出现的概率。

3.记录分布如何随着时间的推移或在特殊事件/季节中发生变化

分布有参数。有了这些参数,我们可以跟踪分布如何随着时间的推移或在特定的季节/事件中发生变化。

4.众所周知的统计特性

标准概率分布具有众所周知的统计特性,这简化了我们的工作。我们可以用几个参数来解释数据及其行为。

近似数据分布

对于这篇博客,我将使用 Kaggle 二手车数据集。我们将尝试近似各种变量的分布,并检查其拟合优度。我过滤掉了几列。让我们来看看数据:

二手车数据集的几行

Id:识别车辆的唯一标识符

价格:车辆的销售价格

年份:制造年份

制造商:汽车的品牌

状况:汽车状况

里程表:里程表读数表示行驶的距离

数据集有 539K 条记录。我们将尝试识别/近似'价格'和'里程表'变量的分布。

近似“价格”的概率分布函数

Python 的 Scipy 库允许估计 200+分布的参数。此外,拟合优度可以通过各种度量来测试,如卡方统计、科尔莫戈罗夫-斯米尔诺夫测试、 QQ 图等。

卡方统计

根据 Adam Hayes的博客,卡方(χ2)统计是一种测试,用于衡量预期与实际观察数据(或模型结果)的对比情况。用于计算卡方统计的数据必须是随机的、原始的、互斥的、来自独立变量的、来自足够大的样本的。例如,投掷一枚硬币 100 次的结果符合这些标准。[[Source invest opedia]]

卡方统计的公式如下-

χ2 统计量的计算公式(公式复制自)

其中 c 是自由度,O 是观察值,E 是期望值。

文章链接

[## 卡方统计定义

卡方(χ 2)统计是一种测试,用于衡量期望值与实际观察到的数据(或模型…

www.investopedia.com](https://www.investopedia.com/terms/c/chi-square-statistic.asp)

一定要看看我关于卡方统计测试的博客来决定打赌的赢家。

[## 统计数据决定赢家的力量

谁是对的?经理还是餐馆老板?

medium.com](https://medium.com/analytics-vidhya/whos-right-the-manager-or-the-restuarant-owner-aaa9b92e153f)

科尔莫戈罗夫-斯米尔诺夫试验

俗称 K-S 检验,用于检验观察分布与理论分布的拟合优度。

这里有一篇关于这个话题的文章。

[## 统计学— Kolmogorov Smirnov 检验

该测试用于必须在观察到的样本分布和…之间进行比较的情况

www.tutorialspoint.com](https://www.tutorialspoint.com/statistics/kolmogorov_smirnov_test.htm)

QQ 图

根据维基百科,QQ 图是一种通过绘制两个概率分布的分位数来比较它们的图形方法。

这里有一个关于 QQ plots 的有趣的 StatQuest 视频

Josh Starmer在 QQ-plots 上发布的 StatQuest 视频

通过足够好的复习,我们都可以开始我们的主要任务分配拟合。

我们将尝试使用以下分布来估算' price' ,看看哪种分布在卡方统计方面表现最佳-

dist_names = [‘weibull_min’,’norm’,’weibull_max’,’beta’,
              ‘invgauss’,’uniform’,’gamma’,’expon’,   
              ‘lognorm’,’pearson3',’triang’]

为了得到稳定的结果,我去除了极端的异常值(两端各 1%的数据)。拟合分布:

Python 代码使用 Scipy 库来适应发行版

拟合分布和检查拟合优度

基于卡方统计的不同分布拟合和拟合优度检验

按拟合优度排序的输出如下所示:

就拟合优度而言,前两种分布是指数分布和逆高斯分布

这两种分布的参数是:

**Parameters of Exponential Distribution**
<scipy.stats._continuous_distns.expon_gen object at 0x12abd2390>
(loc = -1.19, scale = 1.19)
where Lambda = 1/scale**Parameters of Inverse Gaussian Distribution** <scipy.stats._continuous_distns.invgauss_gen object at 0x12ac90c50>
(mu = 0.45, loc = -1.64, scale = 3.61)

除分布参数外, Scipy 库还提供 loc 和 scale 参数。Loc 参数将分布移动适当的量,Scale 参数根据需要拉伸分布。

[## 统计函数(scipy.stats) — SciPy v1.4.1 参考指南

这个模块包含了大量的概率分布以及不断增长的统计函数库。

docs.scipy.org](https://docs.scipy.org/doc/scipy/reference/stats.html)

让我们想象一下结果:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(9, 5))# Histogram Plot of Observed Data
axes[0].hist(y)#Exponential Distribution Fitting
axes[1].plot(y,expon.pdf(y_std,-1.19, 1.19))#Inverse-Gaussian Distribution Fitting
axes[2].plot(y,invgauss.pdf(y_std,0.45, -1.64, 3.61))fig.tight_layout()

观察数据和拟合分布

这两种分布都表现得相当不错。指数分布比逆高斯分布略胜一筹。卡方统计也表明了同样的情况。

让我们也分析一下 QQ 的情节

QQ 情节

这两个发行版都做得相当好。在近似“价格”数据方面,指数略优于逆高斯。

“里程表”概率分布函数的近似

我们将尝试使用以下分布对'里程表''进行近似,并查看哪种分布在卡方统计方面表现最佳-

dist_names = [‘weibull_min’,’norm’,’weibull_max’,’beta’,
              ‘invgauss’,’uniform’,’gamma’,’expon’,   
              ‘lognorm’,’pearson3',’triang’]

为了得到稳定的结果,我去除了极端的异常值(两端各 1%的数据)。拟合分布:

Python 代码使用 Scipy 库来适应发行版

拟合分布和检查拟合优度

基于卡方统计的不同分布拟合和拟合优度检验

按拟合优度排序的输出如下所示:

拟合优度排名前 2 的分布是贝塔和三角分布。然而,卡方统计中的差异非常大,Beta 似乎是明显的赢家。

这两种分布的参数是:

**Parameters of Beta Distribution**
<scipy.stats._continuous_distns.beta_gen object at 0x12abb72d0>
(a = 1.51, b = 2.94, loc = -1.71, scale = 5.02)**Parameters of Triangular Distribution** <scipy.stats._continuous_distns.triang_gen object at 0x12acf4050>
(c = 0.12, loc = -1.79, scale = 4.90)

除了分布参数之外, Scipy 库还提供了 loc 和 scale 参数。Loc 参数将分布移动适当的量,Scale 参数根据需要拉伸分布。

[## 统计函数(scipy.stats) — SciPy v1.4.1 参考指南

这个模块包含了大量的概率分布以及不断增长的统计函数库。

docs.scipy.org](https://docs.scipy.org/doc/scipy/reference/stats.html)

让我们想象一下结果:

观察数据和拟合分布

贝塔分布比三角分布表现好得多。从视觉上看,其清晰的卡方统计数据也表明了这一点。

让我们也分析一下 QQ 的情节

QQ 情节

QQ 图也清楚地表明,Beta 分布很好地逼近了“里程表”(距离)数据。

结论

在这篇博文中,我介绍了在分析数据或对数据应用算法之前了解数据的优势。了解/逼近数据的概率分布也有助于我们使用其统计属性,并为其可能取值附加置信区间。我还介绍了如何使用 Python 实现这一点,并介绍了各种度量标准来检查拟合度。使用的 Kaggle 数据集可以从这里下载。项目的代码可以从这里下载。

如果你有任何疑问,请联系我。我很想知道你是否有一些有趣的问题要解决,并认为近似数据的概率分布会有所帮助。

我的 Youtube 频道获取更多内容:

[## 阿布舍克·蒙戈利

嗨,伙计们,欢迎来到频道。该频道旨在涵盖各种主题,从机器学习,数据科学…

www.youtube.com](https://www.youtube.com/channel/UCg0PxC9ThQrbD9nM_FU1vWA)

关于作者-:

Abhishek Mungoli 是一位经验丰富的数据科学家,拥有 ML 领域的经验和计算机科学背景,跨越多个领域并具有解决问题的思维方式。擅长各种机器学习和零售业特有的优化问题。热衷于大规模实现机器学习模型,并通过博客、讲座、聚会和论文等方式分享知识。

我的动机总是把最困难的事情简化成最简单的版本。我喜欢解决问题、数据科学、产品开发和扩展解决方案。我喜欢在闲暇时间探索新的地方和健身。在 Linkedininsta gram关注我,查看我以前的帖子。我欢迎反馈和建设性的批评。我的一些博客-********

  • 每个数据科学家都应该避免的 5 个错误
  • 以简单&直观的方式分解时间序列
  • GPU 计算如何在工作中真正拯救了我?
  • 信息论& KL 分歧第一部分和第二部分
  • 使用 Apache Spark 处理维基百科,创建热点数据集
  • 一种基于半监督嵌入的模糊聚类
  • 比较哪种机器学习模型表现更好

识别和解决模糊的数据科学问题

原文:https://towardsdatascience.com/identifying-and-solving-ambiguous-data-science-problems-d392701a03fa?source=collection_archive---------46-----------------------

资料来源:来自 Pexels 的(CC0)。

在数据科学中,实际上是一般意义上的科学,需要解决的问题通常是不清楚的。如果你不从事科学工作,你可能会觉得这很令人惊讶。当你阅读研究论文时,似乎解决论文中提出的问题是该领域自然而然的下一步,但事实往往并非如此,往往需要大量的创造力才能决定回答什么问题。这同样适用于工业,如果不是更多的话。许多公司有大型的数据仓库,但是不知道他们可以用这些数据做什么(也就是说,他们不知道他们应该问的问题),但是没关系!幸运的是,对于公司来说,他们可以雇佣那些发现数据价值的专家——数据科学家。一名优秀的数据科学家能够适应不确定领域的工作,并能够识别和解决为公司带来价值的问题。

就识别和解决这类问题的培训而言,这是一个持续的学习过程,通常是通过经验获得的。对我来说,我目前是一名工业领域的数据科学家,但我主要是在完成博士学位的同时获得了在不确定领域工作的培训。我经常处理由另一位不再在大学工作的研究人员收集的数据集,要解决的问题并不总是很清楚。但这仍然是一个持续的学习过程。

尽管我认为最好是通过经验来学习这些技能,但在这里,我将分享一些我发现在识别和解决模糊的数据科学问题时有用的策略。

1.确定可以通过数据科学解决的高影响问题

通常,在与企业合作时,数据科学家会努力帮助增加利润。可能有许多问题如果得到解决将会增加利润,但由于一天只有这么多小时,因此识别可能受益于数据科学的高影响问题是有益的。当试图确定要解决的高影响问题时,我通常会调查客户的问题,以增加收入或降低成本。几个例子可以是建立一个推荐系统来增加销售或优化分销工作流程来降低成本。应该探索和讨论许多场景。考虑问题的可行性也很重要,这是第二步发挥作用的地方。

2.确定可用数据或资源以收集新数据

在确定了几个候选问题之后,下一步就是确定可以用来解决这个问题的数据。要解决数据科学问题,通常需要有数据。这可能是公司已经拥有的数据,也可能是开源数据集(甚至是两者的组合!).也可能存在最好收集新数据的情况。根据所收集的数据类型,使用亚马逊机械土耳其人(Amazon Mechanical Turk)这样的服务,这可能没有你想象的那么困难。如果数据不完美也是可以的。许多数据科学家都有处理杂乱数据的丰富经验,所以这对我们来说并不新鲜;此外,在第 4 步中,我将讨论我们如何随着时间的推移改进数据集。在回顾了数据来源之后,下一步是选择第一个问题作为目标!

3.解决问题

接下来就是解决问题了!我的大部分工作都涉及训练机器学习分类器,但认识到训练模型通常只是解决方案的一部分非常重要。不仅仅是模型预测,通常模型解释是最重要的步骤。例如,你可以训练一个模型来预测你是否会留住一个客户,但是仅仅预测是没有用的。你需要确定你可以操纵什么特性来改变你的客户的行为。这就是利用模型解释技术和运行模拟经常发挥作用的地方。我在我的前一篇博文中对此进行了更详细的讨论。

4.重复

根据问题的类型,通常即使在问题“解决”之后,仍然有更多的工作要做。首先,在第 2 步中,我提到你经常想要随着时间的推移改进数据集。例如,您可能希望获得用户的反馈,以继续增加数据集的大小。随着数据集的增长和质量的提高,您可能希望尝试更复杂的机器学习方法。此外,关于从用户那里获得反馈,根据问题的类型,您可能必须监控模型漂移(即,确保模型性能保持在预期的水平)。

结论

我希望这些步骤对你有用。再次强调,在不确定的领域变得舒适是一个学习的过程,所以如果你一开始很挣扎也没关系。如果你是一名有抱负的数据科学家,我认为学习这些技能的第一步是简单地认识到许多公司不知道他们应该回答哪些问题来从他们的数据中提取价值,所以你已经完成了第一步!最后,如果你认为你的公司可以从我的服务中受益,请随时联系我(我的联系信息可以在我的网站上找到)。

时间序列分析:使用 ACF 和 PACF 图识别 AR 和 MA

原文:https://towardsdatascience.com/identifying-ar-and-ma-terms-using-acf-and-pacf-plots-in-time-series-forecasting-ccb9fd073db8?source=collection_archive---------1-----------------------

尼克·崇在 Unsplash 上的照片

选择候选的自回归移动平均 (ARMA)模型用于时间序列分析和预测,理解序列的自相关函数 (ACF)和偏自相关函数 (PACF)图对于确定 AR 和/或 MA 项的顺序是必要的。虽然 ACF 和 PACF 没有直接规定 ARMA 模型的顺序,但这些图可以帮助理解顺序,并提供一个模型可以很好地适合时间序列数据的想法。在这篇文章中,我主要分享了我在理解 ACF、PACF 图以及它们在选择 ARMA 模型阶数时的重要性方面的经验。

ACF 图是时间序列与其滞后值之间相关系数的条形图。简而言之:ACF 解释了给定时间序列的现值如何与过去(1 个单位的过去,2 个单位的过去,…,n 个单位的过去)的值相关联。在 ACF 图中,y 轴表示相关系数,而 x 轴表示滞后次数。假设,y(t-1), y(t),y(t-1),…。y(t-n) 是一个时间序列在 t,t-1,…,t-n,时刻的值,那么 lag-1 值就是 y(t)y(t-1) 之间的相关系数,lag-2 就是 y(t)y(t-2) 之间的相关系数,以此类推。

PACF 是偏自相关函数,解释了序列和滞后本身之间的偏相关性。简单地说,PACF 可以用线性回归来解释,我们从 y(t-1),y(t-2),y(t-3)【2】预测 y(t) 。在 PACF,我们将 y(t)y(t-3) 中未被 y(t-1)y(t-2) 预测的“部分”关联起来。

通过 ACF 和 PACF 图识别 AR 和 MA 订单:

假设时间序列是平稳的,如果不是,那么我们可以执行序列的变换和/或差分,以将序列转换为平稳过程。一旦序列稳定下来,我们就可以绘制 ACF 图和 PACF 图来确定 ARMA 模型中 AR 项和 MA 项的阶数。有时,仅 AR 项或 MA 项就足以对流程建模。表 1 解释了如何根据 ACF 和 PACF 选择 AR 和 MA 术语[1]:

表 1:基于 ACF 和 PACF 的 AR 和 MA 术语

ACF 和 PACF 图应一起考虑,以确定该过程。对于 AR 过程,我们预计 ACF 曲线将逐渐下降,同时 PACF 在 p 显著滞后后将急剧下降。为了定义 MA 过程,我们期望从 ACF 和 PACF 图中得到相反的结果,这意味着:ACF 应该在某个 q 数量的滞后之后显示急剧下降,而 PACF 应该显示几何或逐渐下降的趋势。另一方面,如果 ACF 和 PACF 曲线都表现出逐渐下降的模式,那么 ARMA 过程应该被考虑用于建模。

图 1 和 2 示出了给定平稳时间序列数据的 ACF 和 PACF。ACF 显示出逐渐降低的趋势,而 PACF 在一个滞后之后立即降低。因此,图表表明 AR (1)模型将适用于时间序列。

图 1:时间序列的自相关函数

图 2:时间序列的部分自相关函数

图 3 和图 4 分别示出了平稳时间序列的 ACF 和 PACF。ACF 和 PACF 图表明,MA (1)模型将适用于时间序列,因为 ACF 在 1 个滞后之后切割,而 PACF 显示出缓慢下降的趋势。

图 3:时间序列的自相关函数

图 4:时间序列的部分自相关函数

图 5 和图 6 显示了另一个平稳时间序列数据 ACF 和 PACF。ACF 和 PACF 都显示缓慢衰减(逐渐降低)。因此,ARMA (1,1)模型将适用于该系列。再次观察 ACF 图:它在两个显著滞后之后急剧下降,这表明 MA (2)将是该过程的良好候选模型。因此,我们应该对该过程使用 ARMA (1,1)和 MA (2)进行试验,然后根据 AIC(赤池信息标准)等性能指标选择最佳模型。

图 5:时间序列的自相关函数

图 6:时间序列的部分自相关函数

总之,理解 ACF 和 PACF 图对于确定 AR 和 MA 项的顺序以选择合适的候选模型是必要的。

我还写了一篇文章,讨论如何为真实世界的时间序列数据选择最佳的 ARIMA 模型。你可以点击链接阅读:

[## 现实世界的时间序列数据分析和预测

应用 ARIMA 模型预测时间序列数据

towardsdatascience.com](/a-real-world-time-series-data-analysis-and-forecasting-121f4552a87)

另一个有趣的阅读- 如何在预处理步骤中避免数据泄露

阅读马苏姆的每一个故事(以及媒体上成千上万的其他作家)。

你的会员费将直接支持和激励你所阅读的作家。你还可以在媒体上看到所有的故事—【https://masum-math8065.medium.com/membership】

读书快乐!

参考

[1]https://rinterested.github.io/statistics/arima.html

[2]https://r studio-pubs-static . S3 . Amazon AWS . com/19198 _ ABA 6 db cabd 0748159 E3 f 395 cc 02 c0f 0 c . html

使用深度学习识别烛台模式

原文:https://towardsdatascience.com/identifying-candlestick-patterns-using-deep-learning-b7d706726874?source=collection_archive---------2-----------------------

在蜡烛图上训练一个神经网络,然后用它来识别蜡烛图上的模式

使用下述方法生成的一些热图(图片由作者提供)。

最近我完成了一个非常有趣的项目,其中我试图使用深度学习来识别大型印度股票图表上的烛台模式,结果非常有趣!这个博客是一个教程,这样你就可以自己尝试这个迷人的“实验”。

我称之为“实验”,是为了强调这是一个实验,并明确表示你不应该根据这里给出的内容做出任何财务决策!

简言之,我们将执行以下步骤(使用 python):

  • 使用 python 库 nsepy 收集多只股票的每日历史股票数据。
  • 将数据转换成蜡烛图。
  • 根据特定方向的百分比运动(收盘价),给蜡烛图贴上“上升”或“下降”的标签。
  • 在数据上训练深度学习模型。
  • 获取感兴趣的区域(基于激活值)并使用热图对其进行可视化。

你可以在这里找到包含这个项目的 Jupyter 笔记本的 GitHub repo。随着我们的发展,我们将需要以下库:

  • nsepy
  • 熊猫
  • numpy
  • matplotlib
  • 法斯泰

我将一段一段地解释代码。所以让我们开始吧!

在上面这段代码中,我们定义了获取历史股票数据并为其绘制蜡烛图的函数。简要概述:

  • 函数“获取数据”将股票代码、开始和结束日期作为输入,给出一个包含股票数据的 Pandas 数据帧。
  • 函数“plot_candles”(最初是由 Daniel Treiman 编写的,我对它做了一些小的改动)接收熊猫数据帧并输出一个蜡烛图。

很抱歉输出这么长,但我希望如此,以便让您了解代码是如何工作的。

在以上部分,我们将完成以下步骤:

  • 使用“获取数据”功能获取历史股票数据(过去两年)。
  • 根据未来五天的走势,决定一个特定的图表是应该分类为“上涨”还是“下跌”。
  • 创建一个 20 天的蜡烛图。
  • 将蜡烛图保存到各自的文件夹中(向上/向下)。
  • 对许多不同的股票重复上述步骤。

我们现在完成了数据收集;开始训练模型吧!

在上面这段代码中,我们正在设置数据,以便我们可以使用它来训练深度学习模型。我们正在完成以下任务:

  • 为模型定型设置批量大小。
  • 将数据分成训练和验证数据集。
  • 对数据应用扩充(以减少过度拟合)。

现在开始训练模型吧!

我们在上面训练了一个深度学习模型(在验证集上的准确率接近 62 %)。我们所做的更详细的概述如下:

  • 使用迁移学习,以适当的学习速率在我们的图表上训练预训练的神经网络。
  • 增加了我们图像的尺寸(之前的训练周期是 224 乘 224,然后我们增加到 352 乘 352)
  • 再次使用迁移学习,以适当的学习速率在新的较大图像上训练先前的网络。

在我们的验证数据集上,我们获得了近 62 %的准确率!

现在,我们将创建热图,突出显示使用激活的神经网络感兴趣的区域。让我们这样做吧!

我们完成了上一节中的以下步骤:

  • 创建了一个要分析的所有图表的列表(这些图表被高度准确地预测)。
  • 从上面的列表中获得一个特定的图像,并将其传输到 GPU。
  • 在向前传递以获得激活的过程中,使用钩子钩住模型。
  • 使用 matplotlib 激活创建热图。
  • 保存了热图。

瞧啊。我们设法训练了一个神经网络,并用它来识别蜡烛图中的模式。

我想再次强调,请不要使用此处给出的任何内容来做出任何财务决定!

希望你喜欢看这个博客,
谢谢你一直读到最后!

附注
如有任何问题或建议,请随时通过 LinkedIn 与我联系。

P.P.S.
我已经生成了许多烛台图表的热图,如果你想看看它们,请随时联系 me 。

使用数据识别客户

原文:https://towardsdatascience.com/identifying-customers-using-data-7b5cf626a301?source=collection_archive---------68-----------------------

这个项目是作为 Udacity 数据科学家纳米学位项目的一部分进行的。

图片由马库斯·斯皮斯克在 Unsplash 上拍摄

在这个竞争激烈的世界里,对一个公司来说,充分了解客户无疑是在竞争中取胜的首要条件。我们将在本文中讨论的项目围绕着这个想法。分析中使用的数据集由德国公司 Arvato 提供,该公司为全球商业客户开发和实施创新解决方案。问题陈述如下:

一家邮购公司是 Arvato 的客户之一,销售一些有机产品,并希望获得新的客户。为此,他们计划开展一场营销活动,旨在吸引越来越多的人购买他们的产品。现在的问题是如何有效地做到这一点?

我们不想接触到居住在德国的每一个人(非常耗时和低效)或任意锁定目标人群(有失去潜在客户的风险)。相反,如果我们能够以某种方式将更有可能成为顾客的人与其他人区分开来,任务就完成了!这就是数据的力量发挥作用的地方。该公司拥有其现有客户的属性和人口统计信息。德国人也有类似的一组数据。人们可以将客户数据与一般人群数据进行匹配,以识别具有高概率成为公司客户的个人。

战略

你可能已经猜到了,这本质上是一个无监督的学习问题。解决这个问题的一个想法是使用现有顾客和一般人群的可用信息来形成在每种情况下以某一组特征为特征的人群。由于客户和一般人群数据集具有完全相似的结构,因此从这些数据集形成的聚类将是等效的。剩下的问题就简单了。然后,可以使用这些聚类来识别更接近特征空间中的现有客户的普通人群的部分。因此,这些人将成为公司营销活动的目标。

分析数据

在这一节中,我们将整个分析分解成小的子步骤。

1.数据预处理

这是我们分析中最具挑战性和最耗时的部分,更不用说是最重要的部分。我们在这里考虑的数据集总共有 366 个不同的特征,与每个由 id 号唯一标识的个体相关联。数据的预处理包括以下步骤:

  • 每当处理新数据集时,首先要做的就是检查是否有空值。理解基于空值应该保留什么功能以及应该删除什么功能非常重要。这里,我们删除所有超过空值阈值 20%的列和行。

图 1:一些特性中空值的百分比

  • 通过查看随数据集一起提供的要素描述文件,我们发现数据集中的一些值被标记为未知

图 2:标记为未知的属性值

我们用 NaNs 代替所有这些未知值。在这之后,我们重新检查每一列和每一行中的空值的百分比,这些值可能会由于这种替换而增加。如果发现任何行/列超过阈值,我们就删除它。

  • 如果发现具有高相关性(> 80%)的特征对,则丢弃其中一个以避免信息中的冗余。
  • 我们丢弃基数高(> 15)的分类特征,并在必要时对它们进行编码。
  • 如果有重复的行,我们删除所有的行,只保留第一个出现的行。
  • 我们计算数据集中每个条目的 z 得分,并将 z 得分绝对值大于 3 的条目标记为异常值。如果任何列/行中有显著百分比的异常值(,例如)。,> 10%),我们立即放弃。
  • 使用 scikit-learn 库的估算类的策略最频繁中值(取决于特性)估算数据集的空值。
  • 最后,我们标准化所有的特性。

2.降维

即使在数据清理之后,我们发现数据中仍然存在大量的特征。因此,在尽可能多地保留信息的同时,尝试降低数据集的维度是一个好主意。这可以通过使用主成分分析(PCA)技术来实现,在该技术中,我们将数据集从原始特征空间转换到由不相关主成分跨越的新空间。这些主成分是原始特征的线性组合,说明了数据中的差异。在目前的分析中,我们选择了 150 个主成分来解释数据中超过 85%的方差。

图 3:作为主成分数量函数的累积方差

我们发现正相关和负相关的特征都存在于主成分中。

图 4:第一主成分中前 5 个正相关和负相关的特征

图 5:第一个主成分中的顶部正相关和负相关特征的描述

通过查看特征描述文件,我们发现第一主成分中的顶级特征与个人的财务状况相关,例如,他们拥有多少套房子,拥有多少辆汽车,他们属于社会的哪个阶层,总收入等等。

图 6:第三个主成分中最高正相关和负相关特征的描述

另一方面,第三主成分主要由与个人特征相关联的特征支配,例如、年龄、传统心态、尽职尽责、社会参与等。

3.使聚集

最后,是时候根据人们在特征(或主成分)空间中的距离对他们进行分组,为此,我们使用聚类技术,特别是 k 均值聚类。该算法最重要的超参数是要形成的簇的数量,n_clusters。找到这个数的传统方法是使用肘图,肘图是度量‘组内平方和’(wcss)作为组数的函数的分布图。随着聚类数量的增加,wcss(质心和聚类中其他数据点之间的平方距离之和)减少。可以从图中选择最佳的聚类数作为一个点,超过该点,度量不再变化或者变化不显著。

图 7:肘图

对于当前的分析,我们选择 12 个聚类,并对人口和客户数据运行 n_clusters=12 的 k-means 算法,以形成由不同特征集表征的聚类。回想一下,我们的目标是确定哪部分人群与现有客户最相似。可以通过比较每个集群中人口和客户的比例来实现这一点。

图 8:每个集群中普通人群和客户的比例

如果对于一个聚类,客户部分大于人口部分,则属于该部分特征空间的人更有可能变成公司的客户,因此是公司的目标基础。从上面的图中我们可以看出,在即将到来的营销活动中,公司的目标人群应该是第 3、8、5、6 群,也许是第 11 群(按这个顺序)。

构建预测模型

该项目的最后一部分要求我们建立一个模型,给定一组与个人相关的特征,该模型将能够预测该人对该活动做出积极响应的可能性。提供了两个数据集,一个用于训练,一个用于测试模型。数据集严重失衡,只有很少的样本(~ 1%)来自积极类(,做出回应的人)。

图 9:目标变量 y 中类的比例

因此,与其预测一个人属于哪个阶层,不如计算一个人转化为客户的概率更有意义,这样公司就可以瞄准具有高响应概率的人。因此,我们计算 ROC 曲线下的面积(假阳性率对真阳性率)来评估模型的性能。

在此分析中,我们考虑了 4 种分类算法——逻辑回归、随机森林分类、Adaboost 分类,最后是 XGB 分类,并对每种算法执行网格搜索,以找出具有最佳参数集的最佳模型,该模型在网格搜索过程中对遗漏的数据给出最高分。

图 10:模型性能的总结

虽然 Adaboost 和 XGB 分类产生几乎相等的 ROC 分数,但我们选择 XGB 分类器,因为它比 Adaboost 分类器花费更少的时间来训练模型。我们模型的一些重要特征(使用 feature_importance_ 属性计算)显示在下图中:

图 11:最终模型的前 5 个特性的重要性

显然,功能“D19_SOZIALES”优于其他功能。虽然我们没有这个功能的描述,但它很可能与个人的社会问题有关(感谢谷歌!).类似“GEBURTSJAHR”、“KBA13_HALTER_35”的下一个重要特征与年龄有关,这是关于个人拼车的信息。

唯一剩下的部分是预测测试数据集中每个个体的响应概率。下表显示了我们在测试数据集上运行模型后得到的几个个体(由 LNR 列中的唯一 id 号标识)的响应概率。

图 12:测试数据集中一些个体的响应概率

我们可以在哪里改进?

我们在这个项目中处理的数据集包含大量的特征。这使得我们可以利用它们来获得越来越精确的结果。可能需要进一步关注的一些领域如下:

  • 这个项目的主要挑战是数据争论。尽管我们删除了具有大量缺失值的特性,但是我们可以尝试从这些特性中设计新的特性,并编码它们对最终结果的间接影响。
  • 空值的插补可以高度定制化。然而,这需要关于相关特征的更多信息。
  • 应该尝试对分类模型进行更精细的超参数扫描。另外,考虑其他分类算法也是一种选择。
  • 由于我们的数据集是严重不平衡的,所以可以尝试不同的技术来提高少数(,正类,)类的模型性能,简单地过采样少数类和欠采样多数类,使用 SMOTE 技术合成少数类的新示例,等等。

你可以在我的 GitHub 库上查看分析的全部代码。编码快乐!

用 k 均值识别新兴市场

原文:https://towardsdatascience.com/identifying-emerging-market-segments-with-k-means-bf221147528f?source=collection_archive---------47-----------------------

数据如何在疫情过后有所帮助

在 Unsplash 上由 OC Gonzalez 拍摄的照片

EY 的未来消费者指数是一个 8 分钟的简短读数,汇集了 2020 年 4 月 6 日一周内对美国、加拿大、英国、法国和德国 4859 名消费者的调查结果。利用一些相当时髦的数据可视化技术,EY 提出,在新冠肺炎疫情事件之后,将出现五种不同类型的消费者,每种消费者在购买决策方面都有不同的行为和情绪。其中一些人很悲观——大幅削减支出——而一些人非常乐观,随着社交距离限制的逐渐取消,他们会抓住机会增加支出。

除了一般的定性描述之外,我们还不清楚 EY 到底是如何定义这五种类型的(“回归正常”、“谨慎奢侈”、“保持节俭”、“不断削减”和“大力反击”)。然而,它确实让我思考。ey 考虑的两个关键变量是乐观度和收入。显然,乐观与消费者的消费意愿有关,而收入与他们的消费能力有关——两者都会影响个人的购买决策。假设我们可以获得消费者相对乐观程度和收入的定量数据。我们如何根据这些数据,以严格且可重复的方式将客户分组?

k 均值算法

k-means 聚类是一种将多个点分成 k 组的方法。简而言之,该算法搜索 k 个“质心”的空间,并将每个数据点分配给这些质心之一。该算法然后反复迭代,旨在最小化每个点簇内的方差。通过这种方式,我们最终找到了(希望)不同的 k 个组,它们反映了数据中组的真实性质。

举例来说,让我们创建一个数据集,其中有五组,每组 100 名消费者,并在 r 中实现 k-means 算法。假设每组都有一个典型的收入和乐观水平,围绕这些值有一些自然变化。我们可以用图形表示这种情况,如下所示:

[...] # Set seed and generate data for 100 consumers from each groupincomes <- cbind(normal_incomes, extravagant_incomes, frugal_incomes, cutting_incomes, bang_incomes)optimisms <- cbind(normal_optimisms, extravagant_optimisms, frugal_optimisms, cutting_optimisms, bang_optimisms)colours <- c("red", "blue", "green", "orange", "purple")# Set up an empty plotting area
plot(NULL, xlim=c(0,100), ylim=c(0,100), xlab="Income", ylab="Optimism", main="500 surveyed consumers, labelled")# Plot data points
for (i in 1:5){
  points(incomes[,i], optimisms[,i], col=colours[i], pch=3)
}[...] # Add legend

有两个变量的情况特别容易思考,因为每个点都位于 2D 收入的某个地方——乐观“空间”。然而,k-means 算法可以应用于任意数量的维度,也就是说,我们可以轻松地扩展我们的模型,以包括第三个变量(可能与消费者居住的国家有关,因为不同的政府采取了不同的措施来应对病毒),第四个变量,甚至更多。

当然,在现实世界中,我们不会事先知道这些群体的特征——我们甚至不知道有多少个群体!所以暂时忘记我到目前为止告诉你的,看看你是否能把下面的数据分组:

没那么简单,是吗?确定一些集群是完全可能的,但是有多少个集群,一个集群在哪里结束,另一个集群在哪里开始?问十个不同的人,你会得到十个不同的答案。但是有了 k-means,我们可以采用一种数学的、数据驱动的方法,每次都会给出相同的答案。让我们应用算法,看看我们得到了什么:

[...] # Aggregate data into one matrix with incomes in the first column and optimisms in the second# Fit model using k-means
model <- kmeans(data[,1:2], centers=5)# Retreive centroids
centroids <- model$centers
centroids#     income optimism
# 1 68.76713 58.50722
# 2 43.95596 57.64992
# 3 65.51750 83.71031
# 4 34.73630 34.00436
# 5 39.11255 89.01036# Retreive clusters
clusters <- model$cluster
clusters# [1] 2 2 1 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 5 2 2 2 2 2 2 2 2 2 2 5 2 2 2 2 4 2 2 2 2 2 2 4 2 5 2 2 2 2 2 2 2 2 2 2 5 2 2 5 2 5 1 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 ...

我们可以看到,按照要求,k-means 已经找到了五个质心,并根据每个数据点到质心的距离,将每个数据点分类到五个聚类之一。让我们将我们的结果绘制成图表,以便更好地理解:

# Add k-means cluster result to the data
data <- cbind(data, clusters)# Define function to map cluster number to a colour
map_colours <- function(num){
  colours[num]
}# Apply function to data
clusters_colours <- lapply(clusters, map_colours)# Set up empty plotting area    
plot(NULL, xlim=c(0,100), ylim=c(0,100), xlab="Income", ylab="Optimism")# Plot data points
for (i in 1:500){
  points(data[i,1], data[i,2], col=colours[as.integer(data[i,4])], pch=3)
}

最后,进行横向比较:

我们可以看到 k-means 总体上做得相当不错——该算法已经能够从乐观程度和收入方面挑出五个群体的一般特征。在这个例子中,我们手头有基本事实,因此我们可以看到 k-means 将一些更悲观的“谨慎奢侈”的消费者分组到“保持节俭”集群的大部分中。虽然我们知道 k-means 在这方面的问题是“错误的”,但这五种类型的消费者之间无疑有重叠的地方。这甚至可能被证明是一种有用的见解——该算法指出了这些消费者之间的相似之处,否则我们可能不会发现。

结论

k-means 算法确实有其局限性,但它可以揭示数据中的模式和趋势,这些模式和趋势可能不会立即被人眼看到。这就是为什么当我们试图理解一个新的和不熟悉的数据集时,聚类算法经常被用在探索性数据分析中。每当我们进行购买时,我们都会继续以惊人的速度产生数据——你可以打赌,随着经济在大流行后的世界中逐渐复苏,将会有无数的分析师使用这样的技术,希望能够弄懂这一切。

更多信息和积分

Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。

  • 在 LinkedIn 上与我联系。
  • 看看我在 GitHub 上摆弄什么。
  • 用于制作本文作品的笔记本可以在这里找到。

图片:由 OC Gonzalez 在 Unsplash 上拍摄。

所有的情节和代码输出都是作者使用 R 和 RStudio 创建的。

分析可能影响冠状病毒传播的因素

原文:https://towardsdatascience.com/identifying-factors-that-leads-to-increased-infection-cases-with-correlation-analysis-e49d75eebbb5?source=collection_archive---------41-----------------------

使用 Python 创建和分析相关性矩阵的分步指南

本文将通过这个过程来执行一个简单的相关性分析。我们将使用冠状病毒感染数据以及我们认为可能影响感染病例的其他关键因素来分析 Python 上各因素之间的相关性。

虽然有其他方法也可以揭示因素之间的关系,但相关矩阵是筛选高度相关因素进行分析的最简单工具之一。但是,它也有自己的局限性。因此,重要的是要注意,分析的结果不是过程的结束,而是进一步探索和验证因素之间关系的起点。

了解数据集

数据集的前 20 行数据(总共 213 行)

我们将使用的数据集包含 Worldometer [1]按国家(截至 2020 年 4 月 17 日)报告的冠状病毒病例。“空白”单元格表示数据不可用。如果你想要一个更新的版本,请随时用最新的数据更新专栏。您可以在此处获得初始数据集:

https://gist . githubusercontent . com/Coronavirus-20/ecbb 27016122 e 91 ab4 a 273195d 89 b 0d 9/raw/B3 ce 86 ddfa 4a 93391 DD 1a 08400277 bea 51 a5 f 386/Coronavirus _ 17 apr . CSV

从数据集来看,我们假设有几个因素可能会影响冠状病毒数据点,如下所示:

  1. 同POPULATION密度(每公里):全国平均每平方公里人口密度(资料来源:Worldometer,2020 年)
  2. 平均值。风速(米/秒):距地面 10 米处的平均风速(来源:GlobalWindAtlas,2019)
  3. 平均值。全年温度。(c .):以摄氏度记录的年平均温度(资料来源:Mitchell,T.D .,Carter,T.R .,Jones,P.D .,Hulme,m .,New,m .,2003 年:欧洲和全球月气候综合高分辨率网格:观测记录(1901-2000 年))
  4. 平均值。年降水量(毫米/年。):以毫米为单位的平均年降水量(资料来源:世界银行,2014) —最初,我们希望找到%相对湿度数据,但由于数据相对有限,因此我们必须使用降水量,因为它与湿度高度相关
  5. %Pop。高收入:日收入超过 50 美元的人口比例(资料来源:皮尤研究中心,2011 年)
  6. %Pop。中上收入:日收入 20.01-50 美元的人口比例(资料来源:皮尤研究中心,2011 年)
  7. %Pop。中等收入:日收入 10.01-20 美元的人口比例(资料来源:皮尤研究中心,2011 年)
  8. %Pop。低收入:日收入 2.01-10 美元的人口比例(资料来源:皮尤研究中心,2011 年)
  9. %Pop。穷人:日收入≤2 美元的人口比例(资料来源:皮尤研究中心,2011 年)
  10. %Pop。年龄≤ 14 岁:2017 年年龄≤ 14 岁的人口比例(资料来源:世界银行,2017)
  11. %Pop。15-64 岁:2017 年 15-65 岁人口的百分比(资料来源:世界银行,2017)
  12. %Pop。年龄≥ 65 岁:2017 年年龄≥ 65 岁人口的百分比(资料来源:世界银行,2017)
  13. 当前锁定状态(Y/N):如果在撰写本文时在该国的任何地区实施了任何类型的锁定,则值为“是”

正如你所看到的,有些数据可能有点太旧了,有些是全国或年度平均值的形式。这是因为这些因素的许多开源详细数据是不可用的。尽管如此,我们仍将利用这些数据来了解现阶段的总体数据趋势。如果可以得出任何有意义的见解,我们总是可以将我们的方法集中在更细粒度的相关因素上。

用 Python 分析数据

既然我们已经准备好了数据集,我们将开始在 Python 上分析相关矩阵。首先,我们需要导入以下库。

**import** pandas as pd
**import** seaborn as sns

然后,我们导入数据集。在这里,我们可以直接从存储库中导入数据集,或者您也可以保存文件并使用' read_csv '或' read_excel '在本地导入数据集(如果您已经以 excel 格式保存)。

# Import the datasetdf = pd.read_csv(r'*FILE_PATH*\*FILE_NAME.csv*') # Data Previewdf.tail()

Python 上呈现的示例数据如下:

Country/Region              Infected  ...  %Pop. Age >=65  \
0                    World   2250709  ...             NaN   
1                      USA    710021  ...            15.4   
2                    Spain    190839  ...            19.4   
3                    Italy    172434  ...              23   
4                   France    147969  ...            19.7   
..                     ...       ...  ...             ...   
208            South Sudan         4  ...            3.4    
209               Anguilla         3  ...             NaN   
210  Caribbean Netherlands         3  ...             NaN   
211  Saint Pierre Miquelon         1  ...             NaN   
212                  Yemen         1  ...            2.9Current Lockdown Status (Y/N)  
0                              NaN  
1                                Y  
2                                Y  
3                                Y  
4                                Y  
..                             ...  
208                              N  
209                              N  
210                              N  
211                              N  
212                              N

正如您所看到的,有些记录包含“NaN”数据,这是因为缺少源级别的数据。然后,我们将不得不替换这些“NaN ”,以便我们可以继续分析数据集。

df_fill = df.fillna("")

这样,我们将用空白或“0”替换“NaN”。现在,清理完数据后,我们将直接进入数据分析。既然我们的目标是找到可能影响总感染病例或死亡率的因素,那么为什么不尝试相关图来查看每个因素之间的关系。

绘制相关矩阵

规则 1:相关性≠因果关系。相关性并不意味着因果关系,即使这两个因素之间有很高的相关性。因此,在建立因果联系之前,我们必须对这些因素之间的关系进行更多的研究。

首先,为了绘制因素之间的相关性,我们必须确保所有的值都是数字,以便我们可以计算相关系数。锁定状态等分类数据以“Y”或“N”格式列出。我们需要将它们转换成数字格式。通过因式分解,我们可以将“Y”和“N”分别转换为类似“0”和“1”的值。

df_num = df_fill.apply(lambda x: pd.factorize(x)[0])+ 1

你会注意到我在末尾加了+1。这是因为我不想将某个类别转换为“0”。我希望它从“1”开始。虽然这不会影响相关性分析,但是当我们在列之间进行操作时,这是很有用的。您不会希望在划分两列时发现某些值被“0”所除。

接下来,我们将绘制每个因素之间的相关性。在这里,我们将使用' seaborn '软件包以热图的形式绘制相关性。

corr = df_num.corr()ax = sns.heatmap(corr,vmin=-1, vmax=1, center=0,cmap=sns.diverging_palette(20, 220, n=200),square=True)ax.set_xticklabels(ax.get_xticklabels(),rotation=45,horizontalalignment='right');

瞧,我们现在得到了数据集的相关矩阵。

相关矩阵的每个网格都填充有不同的蓝色阴影(代表因素之间的正相关程度)和红色阴影(代表因素之间的负相关程度)

如果文本都被塞满了,或者图形太小而没有意义,你可能不得不用“ figsize 值来调整图形大小,并重新运行上面的相关代码。

sns.set(rc={'figure.figsize':(15,15)})

相关性分析

在这里,我们将从相关矩阵中筛选出因素并形成假设。有许多网格和区域是非常相关的。而其中一些是提供冗余信息的密切相关的因素(例如“测试阳性”与“活动病例”、“感染病例”与“死亡”等。),还有其他几个现阶段略显牵强,无关紧要的(例如。当前锁定状态与%Pop。年龄≥ 65 ','平均。风速(米/秒)与流行。密度(每平方公里)等。).因此,我们寻找介于这两个极端之间的高度相关的因素是很重要的。这些通常是我们可以形成假设来进一步证明因果关系的。一些假设如下:

答:“平均风速”与“感染病例”:这两个因素之间的相关性是相当深蓝的。虽然没有直接信息表明这两个因素之间的直接关系,但这种关系可能值得进一步探讨。据报道,来自被感染患者的病毒飞沫可以传播并感染附近的其他病原体。(更新:最近有报道称在空气污染颗粒上发现了病毒株[6])。风速可能会影响这些水滴的飞行距离,反之亦然。

如果观察下面的地图,美国东海岸中部高度受影响地区的平均风速似乎高于西海岸[2]。这似乎与编写本报告时迄今为止发现的病例分布情况有关。

当然,也可能有其他气候因素影响风或空气,这也可能与报告的病例数量相关。例如,有数据表明高湿度可以减缓流感的传播[3]。与相对湿度(%)数据最接近的数据是相关矩阵中的年平均降水量数据。

因此,我们需要找到更精细的数据,然后才能分析和确定感染病例上升与更高风速(或任何气候因素)之间的因果联系。

2015 年全年地面以上 10 米处的全球平均风速[2] —颜色越红表示该区域的平均风速越高。你可以看到美国东海岸、英国、冰岛和地中海大部分是红色或黄色的。

更新:约翰·霍普斯金大学发布的截至 2020 年 4 月 24 日的全球报告病例地图[5]

B. '%Pop。高收入'& '%Pop。“中上收入”与感染数据:这两个相关性呈浅红色。事实上,与感染数据相比,高收入和中高收入人群大多为红色。当您将这一部分与其余三个收入部分一起看时,低收入和贫困部分似乎比中上收入及以上部分与案件数量和活跃案件数量更呈正相关(尽管略有正相关)。

关于人口统计学和报告病例之间关系的假设并不新鲜。有数据表明,富人可能有更多的机会来抵御病毒。例如,与可能在一线工作的低收入阶层相比,上层阶级确实可以在家工作,并且在封锁期间可以维持相对较高的收入[4]。

因此,这些相关数据是我们理解不同收入阶层如何受到流行病影响的起点。如果因果关系完全成立,那么这应该是世界各国政府在这些艰难时期提供援助和支持以帮助那些需要帮助的人的首要任务之一。

最高收入人群与报告病例总数、死亡人数和活跃病例数呈负相关(基于 2020 年 4 月 17 日的报告病例[1])

C .其他值得注意的关系:从这个相关矩阵中我们还可以探索出很多东西。

  1. ‘砰’的一声。“密度(每平方公里)”与“感染病例”:这一点可能并不令人惊讶。我们知道这种病毒通过密切接触传播。但是,这一点可以与' Avg '结合使用。风速(m/s)”来建立预测感染病例的模型,因为这两个因素与“感染病例”高度相关。
  2. ’%波普。“年龄≥65”与“严重病例”:这一个可能有点棘手,因为相关系数似乎只有轻微的正相关。这并不一定说明大部分重症患者年龄在 65 岁及以上(切记:相关≠因果)。事实上,甚至有一些关于这种冠状病毒对不同年龄组患者免疫系统的影响的报告,并导致其过度活跃(也称为“细胞因子风暴”)。因此,我们不能仅由此得出因果关系。然而,这条相关信息确实表明,“老年公民比例较高的国家可能面临严重病例的风险”的可能性相当小。
  3. “当前封锁状态”与感染数据:许多人会惊讶为什么封锁状态与感染病例正相关。在这里,我们见证了游泳者的身体错觉。由于许多国家在其领土内遇到感染病例后实施封锁,因此封锁数据往往与该特定区域的感染报告流行率相关。因此,我们可以相当肯定,在这种情况下,案件的数量导致封锁,而不是相反。

含义

随着封锁的最后期限越来越近,许多人担心感染病例可能会激增,第二波感染会再次出现。因此,至关重要的是,要有一个计划来处理解除封锁前可能发生的情况。

想象一下,如果上述相关性确实有直接的因果联系。然后,我们将不得不重新思考我们应对流行病的方式,尤其是在封锁后。

  1. 如果风速确实与感染率有因果关系,那么 6 英尺的社交距离。(1.83 米)可能还不够。对于有风的地方,我们可能需要保持更远的距离,以避免感染。季节性也可能影响感染率,因为春季(大约 3-4 月)或热带地区即将开始的雨季风速可能较高。如果这是真的,与北半球或南半球的国家相比,赤道附近的国家在今年下半年遏制病毒的形势可能会更加严峻。
  2. 如果确实有很大一部分感染者来自低收入阶层,那么世界各国政府早就应该开始规划和推出计划,在不同国家解除封锁之前,提前系统地援助穷人。这种援助可能以不同的形式出现,可以减轻他们可能面临的经济和工作保障问题。

当然,戴上口罩,保持距离,防止与面部(尤其是鼻子和眼睛等软组织)的任何接触,不仅重要,而且是在这个可怕的时刻拯救你所爱的人的必要条件。然而,探索其他见解对一般预防措施也是有用的,特别是如果你曾经处于这样一个几乎没有防护设备的位置。

下一步是什么?

鉴于这些只是相关性数据,真正的工作将从这里开始。我们需要对这些因素之间的关系进行更多的研究,以证明(或否定)这些假设,然后才能得出关于因果关系的公正结论。

除了研究之外,我们可能还需要更新数据集,以更好地反映当前的情况(更新:污染数据集也可能被添加,因为有报告称在污染颗粒上发现了病毒株[6])。今后,我们可以以时间序列的形式收集数据,以便更好地分析趋势。在这种情况下,城市或月度数据也可能是有用的,因为我们将能够避免使用大面积平均数据的问题,这可能会导致错误。然后,我们可以使用收集到的精确数据,使用相关矩阵或预测能力评分(PPS) 进行重新分析,这可能会产生新的见解。

此外,对于某个区域,可以基于所述因素训练简单的预测模型。预测某个地区未来病例数的线性回归模型示例可以写成如下形式:

感染病例(第 N+1 天)~平均值。风速(过去 1 周——或潜伏期)+人口密度+当前活跃病例

这样我们也可以测试这些因素的假设是否成立。如果测试集上的预测准确性很差,那么我们可能必须改变回归模型中的因子(或找到新的因子)。

最后,我希望这篇文章已经帮助您不仅为这个数据集,而且为您可能有的任何自定义数据集创建了简单的相关矩阵。注意安全!

参考

[1]: Worldometer。(2020 年 4 月 17 日)。各国冠状病毒报告病例。https://www.worldometers.info/coronavirus/

[2]:格拉西、维罗内西、申克尔、佩尔、纽科姆、沃尔克温、马丁、胡尔尼。(2015).使用开源 GIS 数据绘制全球风能潜力图

【3】:风大。外部温度会影响冠状病毒/新冠肺炎吗?https://www . windy . com/articles/does-outside-temperature-influence-the-spreading-of-coronavirus-新冠肺炎-11519?13.762,100.532,5

【4】:石英。冠状病毒预防对富人来说更容易获得。https://qz . com/1818862/coronavirus-prevention-is-more-accessible-for-the-rich/

更新:

[5]:约翰·霍普斯金大学。约翰·霍普金斯大学(JHU)系统科学与工程中心(CSSE)的新冠肺炎仪表板。https://gisanddata . maps . ArcGIS . com/apps/ops dashboard/index . html #/BDA 7594740 FD 40299423467 b48e 9 ECF 6

[6]以色列时报。意大利科学家在空气污染颗粒上发现冠状病毒。https://www . timesofisrael . com/scientists-in-Italy-find-coronavirus-on-air-pollution-particles/

未来历史学生注意:在撰写本文时,冠状病毒感染已超过 200 万例。政府正在加紧实施和延长封锁,以延缓感染的激增。医务人员和设施都很紧张。世界各地的各种研究实验室正在加速疫苗项目,这些项目仍处于试验阶段,可能需要几个月的时间。继续战斗!

识别假新闻:骗子数据集及其局限性

原文:https://towardsdatascience.com/identifying-fake-news-the-liar-dataset-713eca8af6ac?source=collection_archive---------36-----------------------

马克斯·穆塞尔曼在 Unsplash 上拍摄的照片

我正在进入 Metis 数据科学训练营的最后阶段,只剩下一个项目了。我做的前三个项目如下:

  • MTA 十字转门数据:我对数据科学项目的第一次体验
  • MyAnimeList 用户评分:网络抓取和线性回归的乐趣
  • 是拖网渔船捕鱼吗?模拟全球渔业观察数据集

这一次,我的目标是通过对 2017 年骗子假新闻数据集应用分类技术、基本自然语言处理(NLP)和话题建模来确定哪条新闻是假的。

TL;博士:

  • 从骗子数据集中检索并设计了四个特征,对其中三个应用了主题建模
  • 骗子数据集缺少时间特征;还有重要的空白演讲者工作和从属关系
  • 随机森林和朴素贝叶斯都显示出过度拟合数据的趋势
  • 接下来的步骤是补充额外的数据集;适用不同型号;使用更高级的 NLP 工具;或者进一步设计特征

一.背景

Statista 提供以下关于美国人口的信息:

  • 超过一半的人声称经常在脸书或推特等网站上看到假新闻
  • 超过四分之一的人很少相信他们在社交媒体上看到的新闻
  • 14%的人说他们故意在网上分享虚假的政治新闻

正如 Statista 所说,这是“令人担忧的”。因此,我们的目标如下:

二。检索数据

骗子数据集由威廉杨于 2017 年 7 月出版。他又从 PolitiFact 的 API 中检索数据。这个网站收集了美国“发言人”的陈述,并给他们分配了一个从“真实”到“裤子着火”的真实值。杨主要检索了 2007 年至 2016 年期间的陈述。

来自 PolitiFact 的事实核查示例

数据集预先分为训练、验证和测试文件。出于我们的目的,我们将按如下方式使用这些文件:

  • 训练数据集:使用 80/20 分割,对我们的模型进行 5 重交叉验证
  • 验证数据集:评估我们的模型结果并选择我们的模型
  • 测试数据集:判断最终模型

骗子数据集中的 tsv 文件列表

LIAR 数据集具有以下特征:

骗子数据集中的要素列表

然后,我放弃了以下功能:

a)真实信用记录

在附带的论文中,杨利用说话人真值的总计数来分类他的数据。我发现这有问题,因为这基本上包括了未来知识,这是一个大禁忌,尤其是因为数据集不包括报表的日期。这样的时间信息需要包含在每个语句中,以便我们进行适当的时间序列分析。

不,我们不是算命的;我们看不到未来,也不应该用未来的知识来做预测。(胡尔基·奥莰·塔巴克在 Unsplash 上拍摄)

这是非常不幸的,因为从直觉上来说,一个说话者之前的陈述的真实历史很可能是一个很好的预测者,可以预测这个说话者接下来的陈述是否是真实的。但是我们将不得不将就。

b)发言人姓名

在说谎者数据集中有 2910 个独特的说话者。我放弃了这一点,因为新的发言者一直在出现,所以将发言者作为一个功能包括在内的价值有限,除非同一发言者将来会发表声明。

当然,某些“发言人”很可能会继续发表声明,尤其是高调的政治家和政府官员;然而,我觉得从长远来看,让预测更一般化会更有价值。

三。分析数据

a)真值偏向“真”和“基本真”

这种分布适用于每一个主题,如下面 20 个最常见的主题所示。

b)议长的从属关系大多是共和党、民主党或没有

还有 19 个附属机构。

c)发言人职位减少,但超过四分之一的发言人职位是空白的

这份前几名的样本可以让我们了解这些工作有多不同。

d)主题似乎是最重要的特征

我使用 scikit-learn 的默认随机森林分类器的特征重要性得出了这个推论。

深粉色条代表主题特征,浅粉色条代表来自其他列的特征。注意暗粉色是多么的普遍。

四。特征选择

a)目标特征:标签(真值)

我为我的模型考虑了两种类型的目标:

  • 原 6 个真值:'真'、'大部分-真'、'半真'、'大部分-假'、'假'和'裤子-火'。
  • 二进制‘真’和‘假’值:我把‘真’和‘大部分是真’归入‘真’,其余归入‘假’。这是基于 PolitiFact 的对真实值的描述,其中将“真实”和“基本真实”归类为准确的陈述,而其他的则在不同程度上不准确。

最初的 6 个真值以及我如何分组为二进制目标。图片来自 PolitiFact (权限待定)。

b)主题和演讲者工作

我考虑了以下方法:

  • 使用全部 141 个主题全部 1185 个扬声器工作岗位
  • 使用 20 或 50 个最常见的科目或工作
  • 使用 20 或 50 个最重要的主题或工作(由默认随机森林的功能重要性决定)

过滤 20 个最常见的主题,并将其余主题归入“其他”的示例

c)陈述、上下文和演讲者工作

我想看看我是否可以使用主题建模来做以下事情:

  • 推断每条语句的主题(又名主语)。
  • 将上下文和说话者工作分组,以便处理更少的维度(对于 2,910 个不同的说话者有 1,185 个不同的说话者工作,对于 10,240 个陈述有 3,970 个不同的上下文)。

下图说明了这种方法。

我考虑了以下主题建模方法:

不同的主题建模技术呈现的主题似乎没有明显的差异;而且,在陈述的情况下,产生的主题看起来与说谎者数据集的实际主题非常相似,说明了主题/主题的不同计数。正如后面将要看到的,这些主题对不同模型的性能也没有明显的影响。

最后,我决定采用斯坦福大学的手套单词嵌入法产生的 300 个特征。

c)说话者从属关系

我使用最初的 21 个发言者的从属关系作为类别。

下面的图表总结了我的方法。

动词 (verb 的缩写)型号选择和性能

我考虑了以下模型:

  • 随机森林(20 次迭代的超参数随机搜索)
  • 多项式朴素贝叶斯(超参数网格搜索)

最佳执行模型是随机森林。但是它在训练数据集上的 f1 分数是 0.58,从训练和评估数据集的混淆矩阵来判断,它似乎也严重过度拟合:

与训练数据集相比,评估数据集的精度极低,这表明过度拟合。

不管我上面选择的特征、目标和模型的组合如何,这种过度拟合的趋势都适用。

不及物动词观察

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

模型表现不佳可能有几个原因:

  • 缺少日期意味着缺少历史信息。
  • 普遍存在遗漏发言人工作和从属关系,这意味着这些特征对于确定哪条新闻是假的可能不是很有用。
  • 骗子数据集中的一些文章来自错误的数据集 (PolitiFact 的 Flip-o-Meter,而不是它的 Truth-o-Meter),但却标有真值。结果,那些数据点对于训练模型是没有用的,因为它们被错误地标记了。

这篇 PolitiFact 文章出现在骗子数据集(5919.json)中,被标记为“虚假”,尽管它实际上是在谈论米特罗姆尼如何在堕胎问题上转变立场,而不是一条具体的新闻(虚假或其他)

此外, Gosh 和 Shah 在 2019 年的一篇论文中指出:

“[骗子]数据集…被认为很难对进行分类,因为缺乏可供验证的来源或知识库”

七。进一步的工作和学习要点

显然,骗子数据集不足以确定一条新闻是否是假的。未来的工作可包括以下内容:

  • 补充其他假新闻数据集或 API 的。就这一点而言,PolitiFact 不再有自己的 API,而是许多利用谷歌事实检查 API 的事实检查者之一。根据初步检查,LIAR 数据集中可用的语句与从事实检查 API 检索的 PolitiFact 中的语句几乎没有重叠。
  • 进一步设计功能;例如通过聚类由手套嵌入生成的 300 个特征,或者专注于识别假新闻的来源,而不是或者除此之外,识别一条新闻是否是假的。
  • 应用不同的模型,例如梯度推进或递归神经网络。
  • 使用更高级的 NLP 工具,例如词性分析或谷歌的 BERT 模型。

该项目强调了使用高质量数据的重要性。我也学到了很多关于无数形式的主题建模的知识。当我完成最后的数据科学训练营项目时,我会牢记这些经验教训。

利用 R(程序设计)识别欺诈性招聘广告

原文:https://towardsdatascience.com/identifying-fraudulent-job-advertisements-using-r-programming-230daa20aec7?source=collection_archive---------45-----------------------

欺诈分析简单介绍

背景

在线招聘欺诈(ORF)是一种恶意行为,旨在通过欺诈性招聘广告造成隐私损失、经济损失或损害利益相关方的声誉。

分析任务的目的是从数据中识别欺诈性招聘广告,确定欺诈的关键指标,并就未来如何识别欺诈性招聘广告提出建议。

资料组

我们将使用就业骗局爱琴海数据集(EMSCAD),可以在http://icsdweb.aegean.gr/emscad下载。此页面提供了数据收集方式的描述和数据字典。

该数据集包含 17,880 个现实生活中的招聘广告。数据集中的变量包括:

方法学

首先,重要的是理解如何利用数据集来区分欺诈性和非欺诈性广告,因为这将决定将采用的分析方法的类型。作为二进制字段“欺诈性”的响应变量是我们试图预测的,其中 t =“是”,f =“否”。

了解数据集以选择分析方法

我们有一组未分类的变量,本质上是 HTML 字符串——好处、公司简介、描述和要求。文本数据需要的分析类型是情感&情感分析或频率分析。

有 11 个分类或因素变量——位置、公司徽标、行业、职能、工资范围、部门、所需教育、所需经验、就业类型、远程办公和问题,这些变量将被输入到机器学习算法中,如梯度推进机(GBM)、分布式随机森林(DRF)和广义线性模型(GLMNET ),以确定可用于区分欺诈性和非欺诈性广告的最佳预测值。

由于将使用两种分析方法—一种用于字符串变量,另一种用于因子变量,因此将有如下两组输出:

  • HTML 变量:情绪、情感和词频图
  • 名义变量和二元变量:顶级预测值、系数

一些变量对任何信息都没有贡献,因此,它们被排除在分析之外。这些包括标题和不平衡,因为标题是标识信息,不平衡用于包括和排除记录以平衡数据集。

数据 ETL

在建模之前,必须执行一些步骤来清理数据集。下面的流程图显示了为建模准备数据集所执行的步骤。

图 1:数据 ETL 流程图

结果

输出—文本分析

单词云

为每一个 HTML 字符串——公司简介、工作描述、要求和福利——创建了单词云。

下面的单词云表示非欺诈性广告(左)和欺诈性广告(右)的公司简介。

  • 非欺诈性广告强调工作生活的平衡(“家庭”、“生活”、“关怀”)和公司文化(“团队”、“体验”)
  • 欺诈性广告在很大程度上忽略了公司简介,强调金钱上的好处(“手机”、“金钱”、“成本”)

图 2.1:公司广告——非欺诈性

图 2.2:公司广告——欺诈

下面的单词云表示非欺诈性广告(左)和欺诈性广告(右)的职位描述。

  • 非欺诈性广告强调公司产品(“天然气”、“石油”、“运营”)
  • 欺诈性广告强调金钱价值(“金钱”、“财务上”、“折扣”),非欺诈性广告强调公司产品(“天然气”、“石油”、“运营”)

图 3.1:职位描述——非欺诈性广告

图 3.2:职位描述:欺诈性广告

下面是工作要求的词汇云——左边是非欺诈性的,右边是欺诈性的。

  • 非欺诈性广告强调多年的经验、技能、学位资格和项目导向
  • 欺诈性广告在较低程度上强调上述属性,非欺诈性广告强调多年的经验、技能、学位资格和项目导向

图 4.1:工作要求——非欺诈性广告

图 4.2:工作要求——欺诈性广告

最后,下面的单词云是基于对工作福利的测试。

  • 非欺诈性广告强调诸如“病假”、“工作时间”和“假期”等福利
  • 欺诈性广告似乎提供金钱上的好处,如住宿、假期、食物、有竞争力的薪水、签证和食物等。

图 5.1:工作福利——非欺诈性广告

图 5.2:工作福利——欺诈性广告

情感分析

另一种分析文本的方法是通过情感分析,这是与文本中的每个单词相关联的情感类型(积极或消极)。

例如,看看下面的非欺诈性和欺诈性招聘广告的情感类别,我们可以看到,非欺诈性广告(左)的比例更大,是积极的(“喜悦”、“惊喜”),而欺诈性广告(右)的比例则相反。

图 6:情感情绪分析:非欺诈性广告与欺诈性广告

我们也可以看看这些广告的极性,即倾向于特定的情感类别,积极的或消极的。与欺诈性广告相比,非欺诈性广告的正面比例更高。

图 7:非欺诈性广告与欺诈性广告的情感(极性)分析

如文本情感的词云和条形图的例子所示,我们可以看到文本信息在预测某些行为方面非常有用。下一个合乎逻辑的步骤是根据广告的情绪/极性将这些广告标记为正面或负面,并将这些信息作为二进制变量引入机器学习模型进行预测,以确定这些变量对预测的重要性。

例如,您将创建四个变量:工作要求、描述、福利和公司简介。对于每个变量,每个广告将被分配一个“0”或“1”来表示“积极”或“消极”情绪。

现在,让我们继续利用模型中的数字变量来预测哪些广告是欺诈性的和非欺诈性的。

机器学习模型

概观

运行多种不同类型的模型,然后选择一种或多种模型的组合,这种方法不仅可以为您提供最高的准确性,还可以提供有意义的结果,这些结果可以很容易地向业务利益相关者解释,并有可能被他们接受。

对于这个问题,我运行了三种类型的模型:

  • 分布式随机森林 ( DRF ):本质上是一个随机森林,它是一个分类树的集合,但是在 h2o 服务器上并行运行,因此有了分布式这个词。
  • 梯度推进机 ( GBM ):和随机森林一样,也是由一群树组成的分类方法。不同之处在于,随机森林用于构建深度独立的树(即,每棵树都是在数据的随机子集上的随机变量集上运行的,即“bagging”方法),而 GBM 则构建了大量浅、弱、依赖、连续的树。在这种方法中,每棵树都从先前的树中学习,并试图通过减少误差量和增加由预测变量解释的响应变量的变化量来对其进行改进。
  • 广义线性模型 ( GLM ):广义线性模型只是线性模型的扩展,可以在非正态分布的因变量上运行。由于这是一个分类问题,使用的链接函数用于逻辑回归。逻辑回归算法的输出是 logits 中预测值的系数,其中预测值变量的一个单位变化会导致对数概率的系数值变化。这些对数可以转换成比值比,以提供更有意义的信息。
  • 为了计算比值比,我们需要对每个系数进行指数运算,将其提升到 e 的幂,即 e^b

现在您对三种类型的模型有了一些了解,让我们比较一下它们的模型精度。

方法学

使用随机种子将数据集分为训练集(数据集的 80%)和测试集(数据集的 20%),目标是在训练集上训练模型,并在测试集上测试其准确性。

使用以下参数运行 GBM,其中树的最大深度被设置为 4 (4 级)、小学习率和五重交叉验证。

交叉验证 是一种在我们将训练模型应用于测试集之前,用来验证我们的训练模型的技术。通过指定五个折叠,这意味着我们构建五个不同的模型,其中每个模型在四个部分上被训练,在第五部分上被测试。因此,第一个模型在第 1、2、3 和 4 部分进行训练,在第 5 部分进行测试。第二个模型在第 1、3、4 和 5 部分进行训练,在第 2 部分进行测试,依此类推。

这种方法被称为 k 倍交叉验证,使我们对所用建模方法的性能更有信心。当我们创建五个不同的模型时,我们在五个不同的/看不见的数据集上测试它。如果我们只测试模型一次,例如,在我们的测试集上,那么我们只有一个单一的评估,这可能是一个有偏见的结果。

gbm_model <-h2o.gbm(y=y_dv, x=x_iv, training_frame = model_train.h2o, 
                    ntrees =500, max_depth = 4, distribution="bernoulli", #for 0-1 outcomes
                    learn_rate = 0.01, seed = 1234, nfolds = 5, keep_cross_validation_predictions = TRUE)

为了衡量模型的准确性,我使用了 ROC-AUC 指标。 ROC 或接收器操作特性是一条概率曲线,而 AUC,曲线下面积是对类别之间分离程度的度量。在我们的例子中,AUC 是给定模型区分非欺诈性广告和欺诈性广告的准确度。AUC 越高,模型对广告的分类就越准确。

fpr <- h2o.fpr( h2o.performance(gbm_model, newdata=model_test.h2o) )[['fpr']]
tpr <- h2o.tpr( h2o.performance(gbm_model, newdata=model_test.h2o) )[['tpr']]
ggplot( data.table(fpr = fpr, tpr = tpr), aes(fpr, tpr) ) + 
  geom_line() + theme_bw() + ggtitle( sprintf('AUC: %f', gbm.auc) )

AUC 由测试模型准确性的几个指标组成,它们是:

  • 真实肯定(TP):被正确预测为欺诈的欺诈广告
  • 真实否定(TN):被正确预测为非欺诈性的非欺诈性广告
  • 误报(FP):非欺诈性广告被错误地预测为欺诈性广告
  • 假阴性(FN):被错误预测为非欺诈性的欺诈性广告

然后可以将这些指标结合起来计算灵敏度和特异性。

敏感度是衡量欺诈性广告被正确分类的比例。

敏感度=计数(TP) /总和(计数(TP) +计数(FP))

特异性是对非欺诈性广告被正确识别的比例的度量。

特异性=计数(FP)/总和(计数(TP) +计数(FP)

当确定哪种测量对您的分析更重要时,问自己这样一个问题:对您来说,识别正确分类的阳性(灵敏度更重要)还是阴性(特异性更重要)的数量更重要。在我们的例子中,我们想要一个具有更高敏感度的模型,因为我们对正确区分欺诈性广告更感兴趣。

所有这些指标都可以在一个 混淆矩阵 中进行总结,该表比较了正确和错误预测的案例数与欺诈性和非欺诈性案例的实际数量。该信息可用于补充我们对 ROC 和 AUC 指标的理解。

ROC-AUC 度量的另一个方面是用于确定广告是欺诈性还是非欺诈性的 阈值 。为了确定使 TPs 阳性数量最大化的最佳阈值 t,我们可以使用 ROC 曲线,其中我们在 y 轴上绘制 TPR(真阳性率),在 x 轴上绘制 FPR(假阳性率)。

AUC 允许对模型进行比较,我们可以在测试集上比较它们的 ROC 曲线以获得模型准确性,如下面的模型输出所示。

模型输出

模型精度比较

下表显示了 DRF 产生的模型在测试集上具有最高的 AUC 0.962。所有三个模型都具有高 AUC 值(> 0.5 或随机预测)。

图 9:广告欺诈分类的 AUC 曲线

然而,让我们以 GLM 模型为例,通过查看下面的混淆矩阵,更深入地了解这个 AUC 在将广告正确分类为欺诈广告方面意味着什么。

测试集上 GLM 的混淆矩阵表明错误分类欺诈案例的错误率为 8.15%。该模型的灵敏度为 327/(327+29) = 92%,非常好。

现在,让我们看看模型的剩余输出,更具体地说,在对欺诈性和非欺诈性广告进行分类时,最重要的预测因素是什么。

最重要的预测因素

分类问题中的变量重要性等级告诉我们,相对于在该模式中使用的所有其他预测器,预测器变量可以多准确地将欺诈性广告分类为非欺诈性广告。

对于(a) GBM 和(b) DRF 来说,在将招聘广告分类为欺诈性或非欺诈性方面,前三个变量——地点、公司标志和行业——是相同的。这也适用于认为最不重要的远程办公变量

现在,让我们绘制数据集,以更好地了解欺诈性和非欺诈性广告的顶级预测因素是如何变化的。

让我们看看最上面的变量,位置,我们可以看到,来自美国和澳大利亚的欺诈性广告比非欺诈性广告的比例更高,如带圆圈的条形所示。

图 10:各国欺诈性广告与非欺诈性广告的频率

欺诈性广告比非欺诈性广告在招聘广告中不显示公司标志的比例更高。

图 11:欺诈性广告与非欺诈性广告的出现频率(按广告中是否出现公司标志划分)

了解模型系数

现在,让我们尝试从数字上理解预测变量和广告分类之间的关系。

如下表所示,突出显示的预测器最能区分欺诈性广告和非欺诈性广告。

  • 进入模型的 767 个变量中,只有 48 个具有非零系数(显示了顶部预测值)
  • 概率越大,广告欺诈的几率就越高

结论和下一步措施

现在,您已经很好地理解了在分类问题中使用文本和数字预测器,同时使用文本分析工具和机器学习分类算法。

那么,接下来我们能做什么?

  • 应该结合使用文本分析和预测模型来将招聘广告分为欺诈性和非欺诈性招聘广告
  • 为了提高文本分析的准确性,可以引入以下方法:
  • N-grams 建模:查看同时出现的单词组合,以识别模式
  • 寻找大写和标点符号的趋势
  • 在强调的文本中寻找趋势(粗体、斜体)
  • 寻找所用 HTML 标签类型的趋势(原始文本列表与列表元素中的列表文本)

预测模型精度可以通过以下方式提高:

  • 使用更大的数据集
  • 将数据集分为三部分:训练集、测试集和验证集
  • 将工资范围分解为数字变量:最低和最高
  • 去除相互关联的变量(即使用独立性卡方检验)
  • 将位置分为国家、州和城市
  • 通过对行业和功能类别进行分组来减少变量数量
  • 扩展数据集以包括在线行为,即广告被点击的次数、IP 位置、广告上传的时间等。

关于所有用于生成结果的代码,请参见我的 GitHub 库—【https://github.com/shedoesdatascience/fraudanalytics

利用层次聚类识别新闻报道中的隐藏趋势

原文:https://towardsdatascience.com/identifying-hidden-trends-in-news-stories-using-hierarchical-clustering-b6297df795af?source=collection_archive---------44-----------------------

了解如何使用称为凝聚聚类的通用层次聚类算法在最近的新闻文章中查找新的主题聚类

作为数据科学家,新闻报道的文本分析从学习和实践的角度来看都非常重要,因为它为我们提供了大量的数据语料库来训练文本分类、情感分析、命名实体识别等。模特。

总的来说,这些模型中的大多数都是在历史新闻语料库上训练的,该语料库使用了过去 1-3 年的新闻报道数据。这在平时很有效,但是,在新冠肺炎疫情,这给我们带来了严重的问题,因为新闻报道现在有更快的周转周期。

解决这个问题的一种方法是对在短时间内收集的新闻故事运行文本聚类算法,并在它们开始过多影响我们的预训练情绪分析模型之前识别新兴趋势。

例如,自从 Covid 疫情开始以来,我们开始看到情绪分析模型的性能下降。我们通过运行文本聚类和主题模型来缓解这一问题,并发现一个新的主题/聚类正在围绕一些令牌出现,如“工资保护计划”、“锁定”、“口罩”、“疫苗”、“空降”。我们不断保存来自这些“新”聚类的数据,直到我们有足够的数据点来重新训练我们的监督模型。

新闻 API

你可以从 Specrom Analytics 的媒体监控数据库获得最近的(<24 h) news articles in structured format by accessing a 公共新闻数据 API )公开数据。你必须在 Algorithmia 注册一个免费账户。当你注册的时候,你每个月会得到 10,000 点积分,这对于一个月 500 次 API 调用来说足够了。

要获取您的 API 密钥,请转到仪表板,然后单击我的 API 密钥,如下所示。

Algorithmia 拥有所有流行软件语言的客户端库,所以让我们通过在 bash 或命令行上键入下面的文本来获得 python 客户端。

pip install algorithmia`

每个 LatestNewsAPI 调用最多给我们 100 个结果,所以如果我们想要获取 1000 个新闻故事,我们将不得不分页大约 10 次,这对于本教程中的集群演示来说应该足够了。除了为文章的主要内容和标题指定关键字查询之外,API 本身还允许您按主题进行过滤。您还可以通过域名地址列表指定过滤,因为该数据库目前索引了超过 60,000 个新闻源。

然而,在这种情况下,我只通过在主题中指定“业务”来过滤它。

clean_response_list = []
for i in range(1,11):
    print("fetching page ", str(i))
    input = {
  "domains": "",
  "topic": "business",
  "q": "",
  "qInTitle": "",
  "page": str(i),
        "content": "true"
    }
    client = Algorithmia.client(YOUR_ALGO_KEY)
    algo = client.algo('specrom/LatestNewsAPI/0.1.4')
    response_dict = algo.pipe(input).result
    #print("Total results found: ", response_dict["totalResults"])
    clean_response_list = clean_response_list + response_dict["Article"]
len(clean_response_list) 

让我们将结果加载到一个熊猫数据框架中,并创建一个单词云来查看前 1000 个新闻故事中单词的初始分布。

import numpy as np
import pandas as pd
df = pd.DataFrame(clean_response_list)
df.head()from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
import seaborn as sns
wordcloud_generated_bywd = WordCloud(stopwords = set(STOPWORDS),background_color="white").generate(' '.join(df['content']))
# Generate plot
plt.imshow(wordcloud_generated_bywd)
plt.axis("off")
plt.show()

来自 specrom News API 的 1000 个新闻故事的词云

让我们使用 tf-idf 向量对文档进行矢量化,并通过奇异向量分解来降低维度。关于如何预处理文本的完整讨论请参考之前的博客文章。

from sklearn.feature_extraction.text import TfidfVectorizertfidf_transformer = TfidfVectorizer(stop_words=’english’, 
ngram_range=(1, 3),max_df=0.99, min_df = 0.01, lowercase=True, max_features=2500)X_train_text = tfidf_transformer.fit_transform(df[“content”])
df_dtm = pd.DataFrame(X_train_text.toarray(), columns=tfidf_transformer.get_feature_names())
#df_dtm.head()
from sklearn.decomposition import TruncatedSVDsvd = TruncatedSVD(n_components=50, algorithm='randomized', n_iter=5, random_state=None, tol=0.0)
x_svd = svd.fit_transform(X_train_text)
#len(x_svd)

此时,我们已经准备好使用凝聚聚类来创建文本聚类。所有文本聚类算法的一个问题是需要预先指定文本聚类的数量作为超参数。有经验方法可用,如 k 均值聚类的“肘方法”,但它们需要太多的计算资源,无法每天运行。

然而,凝聚聚类非常快,它允许我们通过新闻数据迭代大量可能的聚类值,并以相当低的成本检查聚类成员数量的增长。

from sklearn.cluster import AgglomerativeClusteringcluster_list = range(2,10)
def get_optimum_ag_clusters(input_array, cluster_list):
    return_list = []
    for cluster_n in cluster_list:
        temp_dict = {}
        AG = AgglomerativeClustering(n_clusters=cluster_n, affinity='euclidean', memory=None, connectivity=None, compute_full_tree=True,linkage='ward', pooling_func='deprecated')
        pred_labels = AG.fit_predict(input_array)
        valcount_series = pd.Series(pred_labels).value_counts()
        temp_dict["cluster_n"] = cluster_n
        temp_dict["cluster_values"] = valcount_series.tolist()
        return_list.append(temp_dict)
    return return_list#return_list = get_optimum_ag_clusters(X_train_text.toarray(), cluster_list)
return_list = get_optimum_ag_clusters(x_svd, cluster_list)return_list
# Output
[{'cluster_n': 2, 'cluster_values': [788, 212]},
 {'cluster_n': 3, 'cluster_values': [774, 212, 14]},
 {'cluster_n': 4, 'cluster_values': [774, 199, 14, 13]},
 {'cluster_n': 5, 'cluster_values': [761, 199, 14, 13, 13]},
 {'cluster_n': 6, 'cluster_values': [751, 199, 14, 13, 13, 10]},
 {'cluster_n': 7, 'cluster_values': [730, 199, 21, 14, 13, 13, 10]},
 {'cluster_n': 8, 'cluster_values': [718, 199, 21, 14, 13, 13, 12, 10]},
 {'cluster_n': 9, 'cluster_values': [607, 199, 111, 21, 14, 13, 13, 12, 10]}]

我们不一定对这里确定的最大集群感兴趣;这可能会被我们通过现有的文本分析渠道或经验已经知道的东西所主导。更有趣的是,当天隐藏的新闻故事可能会在多个渠道受到关注。

让我们打印 6 个 n_clusters 的每个集群的顶部术语。

AG = AgglomerativeClustering(n_clusters=6, affinity='euclidean', memory=None, connectivity=None, compute_full_tree=True,linkage='ward', pooling_func='deprecated')
#y_km = AG.fit_predict(X_train_text.toarray())
y_km = AG.fit_predict(x_svd)df_dtm["cluster_name"] = y_km
df_dtm.head()cluster_list = len(df_dtm['cluster_name'].unique())
for cluster_number in range(cluster_list):
    print("*"*20)
    print("Cluster %d: " % cluster_number)
    df_cl = df_dtm[df_dtm['cluster_name'] == cluster_number]
    df_cl = df_cl.drop(columns = 'cluster_name')
    print("Total documents in cluster: ", len(df_cl))
    print()
    df_sum = df_cl.agg(['sum'])
    df_sum = df_sum.transpose()
    df_sum_transpose_sort_descending= df_sum.sort_values(by = 'sum', ascending = False)
    df_sum_transpose_sort_descending.index.name = 'words'
    df_sum_transpose_sort_descending.reset_index(inplace=True)
    print(','.join(df_sum_transpose_sort_descending.words.iloc[:20].tolist()))

最上面的两个集群代表了关于新冠肺炎困境和全球经济影响的可预测新闻。然而,其他集群似乎有一个有趣的关键字组合,如下所示:

Cluster 2: 
Total documents in cluster:  14

huawei,networks,5g,british,britain,nikkei,5g networks,japan,nikkei said,tokyo,wireless,suppliers,british government,equipment,citing,citing sources,potential alternative suppliers,alternative suppliers,nec corp,potential alternative
********************
Cluster 4: 
Total documents in cluster:  13

trader,joe,trader joe,petition,products,josé trader,trader josé,trader josé trader,josé,food,ethnic,san,process,chain,ethnic sounding,sounding,racist,labeled,retail giant,signed online petition
********************
Cluster 5: 
Total documents in cluster:  10

freitas,congressional,state del,del,richmond,convention,gop,paperwork time,paperwork,republicans,state,campaign,house,spanberger,won,va,nick,marquee,picked,write

因此,看起来集群 2 正在与华为讨论一些与 5G 相关的问题,这些问题与英国政府有关。我们可以过滤我们的数据框架以查看集群 2 中的成员,我们可以立即看到这是一个新兴的新闻趋势,它是由几天前的一篇路透社文章引发的,当时他们报道了英国政府要求日本在 5G 无线网络上替代华为。

集群 4 是关于 Trader Joe 的品牌被认为是种族主义的,这产生了大量关于该品牌的负面报道。

确定新的集群后,您可以运行名称实体关系模型来确定集群中的顶级实体,运行情感分析来查看其影响,并检查新闻传播流,以确定集群是否会在未来几天作为企业社交监听应用的一部分进行扩展。

在过去的几个月里,我们使用相同的技术发现了许多有趣的新兴话题,这使得我们的文本分类和社交听力模型对于我们今天所处的快速变化的世界更加强大。

使用医疗保健数据的 SHAP 值识别高危人群。

原文:https://towardsdatascience.com/identifying-high-risk-groups-using-shap-values-on-healthcare-data-e3e7198f30f6?source=collection_archive---------16-----------------------

了解如何使用 shap 值进行更好的聚类。

动机

机器学习在过去几年取得了相当大的进展,这主要归功于我们可以获得的大量数据和可以从数据中提取一些结构和意义的复杂算法。一方面,这些复杂的模型提供了最先进的结果,但另一方面,它们也是一种难以理解和解释的谜。从法律和医疗保健的角度来看,模型的可解释性非常重要,因为它可以增加医疗保健中人工智能的信任和采用。

例如,在医疗保健行业,预测患者何时死亡可能是有用的,但更重要的是,了解我们的模型输出可以帮助我们识别那些具有任何不良结果高风险的聚类集(具有相似属性的患者)。这最终将导致在早期阶段更好和适当的干预。

模型可解释性

有相当多的方法可以帮助我们理解模型的结果。然而,我将讨论 SHAP 价值观,以及如何用它们来解释全球和地方层面的模型。

得体的附加解释(SHAP)

Shap 值基本上给出了每个特征对我们最终预测的平均贡献。它帮助我们更直观地分析和解释我们的模型。为了更好地理解什么是 shap 值以及它们是如何计算的,本文有一些非常好的内容https://medium . com/@ Gabriel Tseng/interpreting-complex-models-with-shap-values-1c 187 db 6 EC 83。

通过 shap 值,我们可以了解我们的模型在微观层面上为每个预测做了什么,这可以帮助我们确定哪些特征对我们的最终预测有多大贡献。

在这里,我们将使用 shap 值来创建聚类,看看它们是否有助于识别心脏病风险较高的患者。

通过聚类识别高危患者

正如你从上面的管道中看到的,这篇文章的目的首先是将 XGboost 这样的复杂模型拟合到数据中,然后使用 SHAP 库获得数据中每个例子的 SHAP 值,然后对它们进行聚类,以找到可以导致早期干预或更好地治疗患者的模式。本例的数据集由许多预测患者是否患有心脏病的特征组成。

为什么我们使用 SHAP 值进行聚类?

使用 shap 值进行聚类的优点是所有要素的 shap 值都在相同的范围内(二进制 xgboost 的对数概率)。这有助于我们生成有意义的集群。这里的目标是聚集那些具有相同预测心脏病风险的 shap 值。

#importing the required dependencies.
import pandas as pd
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pylab as pl
import shap
shap.initjs()

让我们导入数据集并将其分成训练集和测试集。

# loading the data set
data = pd.read_csv("D:/RnD/heart.csv")
#Seperating the target from the features
X = data.drop("target", axis  = 1)
#setting y as the target variable
y = data.target
#Splitting the dataset into train and test
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 100)

接下来,我们训练一个 Xgboost 模型用于分类。这里的重点不是获得一个高度精确的模型,而是我想向您展示 shap 值如何用于聚类。

model = XGBClassifier(objective = "binary:logistic")
model.fit(X_train,y_train)

好了,我们已经训练好了模型,现在我们可以使用 SHAP 库来获得模型的 shap 值。下面的代码块首先在训练好的模型上使用 Tree explainer 方法创建一个 Explainer 对象。然后使用 explainer 对象来获取测试数据的 shap 值。

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)

使用肘方法来决定有多少个分类适合我们的数据。

#convert shap_values array to dataframe
s = pd.DataFrame(shap_values, columns = X_test.columns)
#Use Elbow method to decide the optimal number of clusters
sse = []
for k in range(2,15):
    kmeans = KMeans(n_clusters = k)
    #fit the k-means model on the shap values
    kmeans.fit(s)
    #appent the error of each iteration
    sse.append(kmeans.inertia_)

pl.plot(range(2,15), sse)
pl.title("Elbow Curve")
pl.show()

x 轴=聚类数,y 轴=错误率(sse)

我在这里选择 6 作为期望的集群数。接下来,我们再次将 K-Means 模型拟合到测试集的 shap 值,聚类数为 6。

kmeans = KMeans(n_clusters = 7, random_state = 100).fit(s)
#selecting cluster centres
centroids = kmeans.cluster_centers_

现在,我们为每个患者(数据点)映射基于其训练分配给它的聚类。

patient = pd.DataFrame(X_test.index)
cluster_no = pd.DataFrame(kmeans.labels_)
df= pd.DataFrame()#Concatenating the patient ids with the assigned cluster lablesdf = pd.concat([patient,cluster_no], axis =1)
df.columns = ["patient", "cluster no"]

基于我们之前训练的 xgboost 模型的学习,我们现在将为剩余的测试数据生成预测并评估它们。

y_pred = model.predict(X_test)
y_pred = pd.DataFrame(y_pred, index= X_test.index, columns = ["target"])df = df.set_index("patient")
cluster_df = pd.concat([df, y_pred], axis = 1)

用它们各自的患者 id(索引)对聚类进行分组,以识别具有较高疾病检测百分比的聚类。

group = (100 * cluster_df[cluster_df["target"]==1].groupby(by = ["cluster no","target"]).size()/len(df.index))
group = group.reset_index(level = 1, drop = True)
group = pd.DataFrame(group, columns  = ["Disease Percentage"])
group

疾病百分比

从图中,我们可以看到,我们的聚类中的疾病百分比有所不同。注意:这里没有显示没有疾病的集群。

我们从这些星团中发现了什么吗?

所以让我们试着推理一下,我们是否能从已经生成的集群中得到一些东西。下图包含心脏病检测的百分比以及每个聚类的每个特征的平均值。为了简洁起见,我对值进行了四舍五入。

使用 shap 值的聚类分析

cp =胸彩——从上表可以明显看出,cp 越高,患心脏病的几率越大

restecg =静息心电图结果——心脏病发病率较高的聚类往往具有较高的 restecg 平均值

具有较高 thalach 平均值的聚类具有较高的心脏病检测百分比。

我们所做的推理帮助我们识别数据中的模式,我们现在可以寻找可能的干预措施或解决方案来帮助预防心脏病。

下一步是什么?

到目前为止,本笔记本中描述的方法有些天真。例如,仅从肘方法中选择聚类的数量不是一个很好的主意,我们还需要看看其他一些措施来解释该算法如何很好地对我们的数据进行聚类。剪影分数就是这样一种测量方法,它可以帮助定义我们对数据进行聚类的程度。

事实仍然是,有许多聚类指标可以帮助我们了解我们的聚类的拟合度,但这都是相对于我们认为好的指标而言的。此处进一步解释https://www . research gate . net/post/How _ can _ we _ say _ that _ a _ clustering _ quality _ measure _ is _ good

“问题是,我们不能真的说什么聚类质量度量是好的还是不好的。“好的集群”的概念是相对的,是一个观点的问题。这同样适用于质量措施。这取决于你想评价什么。”

因此,从这里得出的结论是,我们需要测试不同的集群,并决定哪个指标可以很好地适应我们的问题,并有效地解释我们所拥有的集群。

参考资料:

[1]https://shap.readthedocs.io/en/latest/

[2]https://github.com/slundberg/shap

[3]https://www.youtube.com/watch?v=vA_czRcCpvQ

[4]数据来源:https://archive.ics.uci.edu/ml/datasets/Heart+Disease

鉴定新冠肺炎冠状病毒的潜在小分子抑制剂

原文:https://towardsdatascience.com/identifying-potential-small-molecule-inhibitors-of-the-covid-19-coronavirus-a2bcf8574cfc?source=collection_archive---------22-----------------------

请注意,文章中的所有评论纯属实验性质,不应作为医疗建议。它不应被视为支持特定治疗的医学建议或证据。如果你认为自己可能感染了新冠肺炎病毒,你应该联系卫生官员并接受检测。

2019 年 12 月,世界在中国武汉发现了一种新型冠状病毒。快进 3 个月,病毒已经感染了超过 10 万人,数千人已经死亡。虽然从长远来看,疫苗可能是我们战胜这种疾病的最佳选择,但这似乎需要一年半以上的时间,现在必须取得突破。

我无法接触到实验室、病人或活的病人样本,但互联网上有大量的开放数据。我将尝试写一系列文章,利用现有数据回答有关病毒的问题,收集见解,也许还有可能用于抗击新冠肺炎的策略。

因为新药的发现、安全性测试和批准需要很多年,所以一个好的策略是努力找到一种已经被批准的、对病毒有一定疗效的药物。让我们进行一次模拟药物筛选。

我们的第一步是去蛋白质数据库,在那里你可以找到许多分子的 3D 分子结构,包括新冠肺炎的成分。

【https://www.rcsb.org/

通过滚动资源,我们可以看到他们已经结晶了主要的蛋白酶,这是药物发现的高产目标。实际上有几个版本,但我们选择这一个,因为它的分辨率最高,为 1.31 埃。这意味着我们可以看到和利用更多的分子信息。

https://www.rcsb.org/

我们现在去 pharmit 网站,它允许我们在浏览器中进行虚拟筛选。

http://pharmit.csb.pitt.edu/

我们进入目标结构的 PDB,这里是 5R82。注意,配体有两种选择,DMS 或 RZS。这正是用来稳定蛋白质,以帮助结晶和解析其结构。我们将使用 RZS,因为它只与蛋白质中的一个位点结合,而 DMS 与多个位点结合,这使得在这个平台上进行药物筛选变得容易得多。

http://pharmit.csb.pitt.edu/

然后我们点击提交,得到下面的设置。带有配体的蛋白质(屏幕中间右侧)。

http://pharmit.csb.pitt.edu/

小组的药效团部分是我们最感兴趣的。通过打开和关闭区域,我们规定了任何药物在试图适应这种蛋白质时必须满足的分子相互作用。在我看来,我们需要一种符合尽可能多标准的药物。这最大化了它在现实中被束缚的可能性。所以我们把它们都打开。

http://pharmit.csb.pitt.edu/

现在我们准备进行药物筛选。我们转到左上方的选项卡,通过单击向下箭头来查找合适的库。

【http://pharmit.csb.pitt.edu/

我们获得了许多药物库的列表,并单击贡献的库以获得更多选项。

我从天然产物库开始,它包含 2029 个天然产物结构。令人震惊的是,当所有的约束都被激活时,有些东西是合适的。不幸的是,这种分子没有名字。

http://pharmit.csb.pitt.edu/

不要气馁,我把结构画出来,发现它是这个分子。

https://chem-space.com/search

经过进一步研究,我发现它与依普黄酮结构非常相似,依普黄酮是一种用于预防绝经后妇女骨质疏松症的异黄酮。奇怪的发现,不知道是怎么回事。

https://pubchem.ncbi.nlm.nih.gov/compound/3747

然后,我改变了思路,查看了 DrugBankApproved-2019 库。当所有的限制都设定好了,没有药物能够适合结合位置。

http://pharmit.csb.pitt.edu/

我开始一个接一个地放松每一个限制。我不想放松任何不必要的,因为我觉得这将增加假阳性的可能性。

  1. 在位置(10.13,0.25,25.74)放松氢供体导致发现 38 种药物。这些药物通过 RMSD 进行排名,这是一种适合度的衡量标准,RMSD 越低,适合度越好。

http://pharmit.csb.pitt.edu/

排名最高的药物是 RMSD = 0.304 的 Stendra。这是一种用于治疗勃起功能障碍的 PDE5 抑制剂。这很可能是假阳性。问题是我不知道 RMSD 有多好。我只知道越低越好。

http://zinc15.docking.org/substances/

第二种是氨来沙诺(RMSD = 0.309),这是一种用于治疗口腔溃疡的抗炎药物。可能是假阳性。我也看到一些讨论,像布洛芬这样的消炎药可能会恶化新冠肺炎的进程,所以也许最好远离。

【http://zinc15.docking.org/substances/ 号

2.放松位置(12.01,0.43,24.32)的氢受体限制导致发现 21 种药物。

【http://pharmit.csb.pitt.edu/

排名最高的药物是 RMSD = 0.373 的利匹韦林。这是一种用于治疗 HIV 患者的非核苷类逆转录酶抑制剂(NNRTI)。虽然抗病毒药物的问世令人兴奋,但我们希望药物针对蛋白酶而不是逆转录酶。此外,RMSD 高于前 2 种药物。

http://zinc15.docking.org/substances/

排名第二的药物是 Intelence (RMSD = 0.389),这是另一种针对 HIV 的 NNRTI。

http://zinc15.docking.org/substances/

3.放松位置(11.7,-0.68,23.61)的芳香限制导致仅发现 1 种药物。

http://pharmit.csb.pitt.edu/

这种药物是乙酰唑胺(RMSD = 0.564),是一种碳酸酐酶抑制剂,可导致利尿,用于青光眼和癫痫。不太可能是什么。

http://zinc15.docking.org/substances/

4.放松(14.12,-1.82,20.58)处的氢受体约束,得到了 16 种可能的药物。

http://pharmit.csb.pitt.edu/

从一开始,我就非常兴奋,因为排名第一的药物的 RMSD = 0.159,几乎是之前最佳拟合的一半。

这种药物原来是阿巴卡韦,这是另一种艾滋病毒 NNRTI 像前两种艾滋病毒药物。我承认,如果它是一种蛋白酶抑制剂,我会开心得多。

http://zinc15.docking.org/substances/

排名第二的药物仍然是乙酰唑胺。

5.放松(11.7,-0.68,23.61)处的疏水约束导致发现 1 种药物。

http://pharmit.csb.pitt.edu/

这种药物也是乙酰唑胺。

6.放松位置(9,-0.27,27.08)的疏水限制导致发现 60 种药物。

http://pharmit.csb.pitt.edu/

排名第一的选择是头孢吡肟(RMSD = 0.192),这是第四代头孢菌素抗生素。作为一般规则,当你有一个纯粹的病毒感染,抗生素不应给予。这对你没有任何好处。在这项荟萃分析中,与其他β-内酰胺类药物相比,使用头孢吡肟治疗的患者死亡率升高。或许不值得追求。

【http://zinc15.docking.org/substances/

排名第二的药物是 copanlisib (RMSD = 0.278),一种用于治疗滤泡性淋巴瘤的 PI3K 抑制剂…我们可能不应该对新冠肺炎患者进行化疗。

http://zinc15.docking.org/substances/

总的来说,我能够模拟针对新冠肺炎主蛋白酶结合位点的药物筛选。筛选出来的一些更有趣的药物是 NNRTI HIV 药物,特别是阿巴卡韦、利匹维林和因特林。我也对头孢菌素抗生素头孢吡肟和乙酰唑胺很感兴趣。

我对 NNRTIs 的效果并不太乐观,因为之前对另一种冠状病毒 SARS 的研究发现,它们在抑制生长方面并不十分有效。也就是说,阿巴卡韦在所有测试的药物中表现出最强的适应性。

值得强调的是,结合并不等同于抑制。即使结合得最好的分子,如果作用于错误的位点,也可能对蛋白质没有什么影响。

这项工作的一个限制是所有药物测试的结合位点的选择。这受到用于稳定蛋白质晶体结构的配体 RZS 的限制。如果用 DMS 代替 RZS 作为配体,这些药物将会针对不同的位点进行测试,也许会发现更有生物学意义的位点和不同的结果。

此外,新冠肺炎蛋白酶可能不是模拟药物筛选的最佳结构。用于附着宿主细胞的刺突蛋白可能是更好的选择。

同样,药物模拟软件可能有缺陷。选择它是因为它的易用性,但也许其他的会导致更准确的发现。我打算在未来探索其他潜在的模拟软件。

希望这篇文章能教会你一些东西,激励你去对抗新冠肺炎。你不在实验室工作,并不意味着你不能做出贡献。拥有一台电脑和一些好奇心是你所需要的。

请在下面的评论中指出任何明显的错误,这样我们都可以学习。也欢迎分享任何想法、见解和改进建议。

请注意,文章中的所有评论纯属实验性质,不应作为医疗建议。它不应被视为支持特定治疗的医学建议或证据。如果你认为自己可能感染了新冠肺炎病毒,你应该联系卫生官员并接受检测。

用 Colab 鉴定蛋白质-配体相互作用

原文:https://towardsdatascience.com/identifying-protein-ligand-interactions-with-colab-2cfd26ed469a?source=collection_archive---------33-----------------------

设置自动停靠 Vina

由作者渲染

“我们迫切需要公开、快速地分享我们的方法、模型和结果,以测试发现、确保重现性、测试显著性、消除死角并加速发现。新冠肺炎应用的数据共享将有助于连接全球生物分子模拟社区的科学家,并改善模拟、实验和临床数据与研究人员之间的联系和沟通。”

关于共享新冠肺炎生物分子模拟数据的社区信函[1]。

我下面介绍的是至少两篇致力于计算分子生物化学中使用的虚拟筛选技术的文章中的第一篇。从广义上讲,它包括对蛋白质和一组候选药物之间的相互作用进行大规模探索。预测这样一个系统之间的相互作用是一个非常困难的问题,没有唯一的解决方法。虚拟筛选的第一步是一种称为对接的计算技术,其中一种分子(可能是一种药物,但不是必须的)反复与受体蛋白接触,并通过例如遗传算法选择具有最佳能量的构型。一般来说,这项技术的结果应该谨慎对待,并与实验室结果进行对比。当以这种方式进行时,可以获得这些系统中相互作用的良好指示,这改进了结果的解释。这篇文章将致力于这第一步。在另一个时间,我将回顾如何大规模地进行这项工作,然后应用分类机器学习算法,该算法受到了 [Kadioglu O,Saeed M,Johannes Greten H&efforth t .](http://Kadioglu O, Saeed M, Johannes Greten H & Efferth T. Identification of novel compounds against three targets of SARS CoV-2 coronavirus by combined virtual screening and supervised machine learning. [Submitted]. Bull World Health Organ. E-pub: 21 March 2020. doi: http://dx.doi.org/10.2471/BLT.20.255943)的最新工作的启发,他们在这些工作中进行了探索,以找到攻击 SARS-CoV2 病毒的候选药物[2]。

auto dock Vina【3】是一款流行的分子对接软件,用于预测分子是如何被蛋白质托管的。在这里,通过几个步骤,我将向您展示如何在 Google Colaboratory 或 Colab 中安装。你可以输入每个代码片段,或者去底部给出的 GitHub 链接。此外,您可以进入 Autodock 站点获取更多信息,并下载[4]。如果你不耐烦,向下滚动到底部查看分子,并打开 Colab 笔记本,看看它是如何工作的,并与小部件交互。

  1. 下载并安装 vina

为了将 vina 安装到 Colab笔记本中,我们首先要!wget 下载链接:**

下载并解压缩文件后,auto dock _ vina _ 1 _ 1 _ 2 _ Linux _ x86目录创建完成。 vina 可执行文件在子目录 bin 中:

图一。Vina 目录。图片作者。

我们可以给 vina 程序起一个别名,这样使用起来更方便。如果我们想改变目录并从那里调用 vina 这是很有用的:

现在我们可以调用 vina 作为 linux 命令(这里你可以使用!vina%vina )从笔记本单元格中的任意目录。例如,我们可以尝试帮助(查看选项):

图二。帮助选项显示 vina 程序的用法。图片作者。

这个输出除了给出 vina 的基本用法外,还说明程序运行 OK。如上图所示, vina 接收输入主要是两种类型的文件,受体和配体。配体是一种化合物,它通过与靶蛋白(受体)上的位点结合形成所谓的复合物。在本教程中,我们将研究程序教程中给出的蛋白质和配体的对接。下一个需要的信息是搜索空间,其中被定义为一个以 center_xcenter_ycenter_z 和 sides size_xsize_ysize_z 为中心的盒子,单位为埃。这个盒子是配体将被探测的地方,改变它的位置,方向和可能改变其他自由度。因此,期望具有可发生结合的活性位点的先前信息,以相应地定义盒子,否则,我们可以进行盲对接,其中盒子具有整个受体的大小,但是计算成本较高。后来,我展示了一个小工具来从 Colab 构建这样一个盒子。

2。下载教程和 pdbqt 文件

蛋白质通常以蛋白质数据库 (pdb)文件格式表示,其中包含原子位置的三维结构等信息。这里我们将从http://vina.scripps.edu/tutorial.html的 vina 教程中获取所需文件,

我们必须使用 unzip 进行解压缩,以获得配体和蛋白质 pdb 文件以及"配体 _ 实验. pdb" 文件,该文件是通过实验手段获得的“真实”坐标文件,并且 vina 预测必须尽可能类似于该结构才能被认为是可接受的,

图片作者。图片作者。

蛋白质和配体文件必须用 autodock tools 进行预处理,这是一个允许操纵结构和编写 pdbqt 文件的 GUI,但在这里我将从https://bcrf . biochem . wisc . edu/all-tutorials/tutorials-materials-molecular-graphics/66-2/获得之前准备好的文件

我们将在 vina_tutorial 目录中工作,因此我们必须将这些文件移动到那里,重命名为" protein.pdbqt" 和" ligand.pdbqt" ,如下所示:

我们将目录更改为 vina_tutorial ,在这里我们将完成余下的练习:

3。配置文件

当我们在图 2 中看到来自 vina 的帮助时,我们注意到配置文件选项,其中所有选项都可以放在一个脚本中。我们可以使用 cat 命令来编写这个文件:

我想强调一下这个文件中的一些内容。在第 3 行和第 4 行,受体和配体被清楚地设置为相应 pdbqt 文件的名称。在第 6 行中,最佳构型中配体的 out 结构保存在一个“all . pdbqt”文件中。最后,从第 8 行到第 14 行,探索框的中心和大小被定义为包围搜索区域。通常,这个框是使用 autodock tools GUI 定义的,但是也可以使用其他流行的查看器来构建它。在接下来的内容中,我将展示如何在浏览器中查看分子,以及如何生成用于对接过程的框。

4。为浏览器可视化安装 py3d mol

我认为 Py3Dmol 是在 Jupyter 或 Colab 笔记本的浏览器中可视化分子的最佳选择之一。为了使用它,我们可以用 pip 安装,导入:

下面是我写的一些函数,用来查看分子、构建盒子并制作一个小部件,以便交互式地更改盒子设置:

函数 visbox2py3Dmol 对象添加一个盒子,其中心在 bxibyibzi ,大小为 bxfbyfbzf 。在图 3 中,我们可以看到如何构建盒子。为了更好地可视化,显示了两幅图像。左图显示了 py3dmol 的默认屏幕(x-y 平面位于屏幕上),右图显示了垂直旋转 90 度后的同一屏幕(z-y 平面位于屏幕上)。在这种情况下,只是为了说明如何操作盒子,蛋白质附近的配体被封闭在盒子中。

图 3。盒子里的分子。中心位置由前三个值 bxi、byi 和 bzi 确定,而框尺寸由后三个值 bxf、byf 和 bzf 定义。左图:长方体在 x-y 平面上移动。右图:我们可以从左到右看到 z. Image 按作者的变化。

一旦您对该框的设置满意,这些值将用于配置文件中的 center_xcenter_ycenter_zsize_xsize_ysize_z

5。运行 vina

现在我们已经有了蛋白质和配体文件,并且盒子已经设置好了,我们只需调用 vina 来读取" c onf.txt" 文件。使用虚拟机的 2 个 CPU 需要几分钟时间(遗憾的是这个软件不能在 GPU 上运行):

图 4。维娜在科拉布跑步。图片作者。

6。将 pdbqt 文件转换为 pdb

最后,可以使用软件 openbabel 将 pdbqt 文件转换成标准格式 pdb:

这里是两个分子,蛋白质和配体,在" all.pdbqt" 文件中的一个输出配置中,我们可以看到配体正确地位于蛋白质的“空腔”中。

图 5。蛋白质承载的配体。图片作者。

****7。结论。Colab 是一个允许分子对接过程有序进行的工具。尽管计算能力不是最充足的,但是可以转换成 Jupyter 笔记本,在本地运行或者在另一个云服务平台上运行。此外,能够在浏览器中直接可视化也很有用,可以进一步开发以识别化学相互作用,如氢键。我们将看到当机器学习被应用时它是如何工作的。

****8。链接到笔记本。https://github . com/napoles-uach/covid 19 MX/blob/master/VINA _ auto dock _ vis . ipynb

****9。鸣谢:我要感谢 Jaime Adame Gallegos 博士(@donadame)的善意评论。

10。参考文献。

**[1] Rommie E. Amaro,Adrian J. Mulholland,化学杂志。Inf。模型。 2020 年【https://doi.org/10.1021/acs.jcim.0c00319 **

[2] [Kadioglu O,Saeed M,Johannes Greten H&efforth t .通过组合虚拟筛选和监督机器学习识别针对 SARS CoV-2 冠状病毒三个靶标的新化合物。[已提交]。公牛世界健康器官。电子酒吧:2020 年 3 月 21 日。doi:http://dx . doi . org/10.2471/BLT . 20.255943](http://Kadioglu O, Saeed M, Johannes Greten H & Efferth T. Identification of novel compounds against three targets of SARS CoV-2 coronavirus by combined virtual screening and supervised machine learning. [Submitted]. Bull World Health Organ. E-pub: 21 March 2020. doi: http://dx.doi.org/10.2471/BLT.20.255943)

[3[o . Trott,A. J. Olson,AutoDock Vina:用新的评分函数、高效优化和多线程提高对接的速度和精度,计算化学杂志 31(2010)455–461](http://O. Trott, A. J. Olson, AutoDock Vina: improving the speed and accuracy of docking with a new scoring function, efficient optimization and multithreading, Journal of Computational Chemistry 31 (2010) 455-461)

http://vina.scripps.edu/index.html

用高斯混合模型识别餐馆热点

原文:https://towardsdatascience.com/identifying-restaurant-hotspots-with-a-gaussian-mixture-model-2a840ab0c782?source=collection_archive---------29-----------------------

使用 GMM 识别加拿大多伦多的直观餐馆集群(使用 Python 代码)

聚类算法(如 GMMs)是帮助识别数据模式的有用工具。它们使我们能够识别数据集中的子群,从而提高您的理解或增强预测模型。在本文中,在 GMM 的帮助下,我们将尝试使用位置数据来识别多伦多的餐馆集群。目标是找到在地理上有意义,但在其他特征(如餐馆评级)方面具有不同特征的聚类。将讨论关键的代码片段,您可以在 GitHub 上找到完整项目。

来源:图一、图二、图三

什么是 GMM

如前所述,GMM 是一种聚类算法。这意味着它可用于根据要素对数据集中的元素进行分组。例如,假设我们有一个客户收入和年龄的数据集。聚类算法可以识别 4 个组:年老的高收入者、年老的低收入者、年轻的高收入者和年轻的低收入者。这 4 个群体可能具有非常不同的特征/行为。我们不会深入 GMM 如何创建这些集群的细节,因为那里有大量好的资源【1】【2】。重要的是,为什么我们将使用 GMM,而不是其他聚类算法,如 K-means。

对于我们的问题,GMM 最重要的优点是它在聚类方差和协方差方面更灵活。首先,更大的方差灵活性意味着 GMM 可以更好地识别方差不相等的聚类。换句话说,当我们既有密集的集群又有分散的集群时,它会给出更好的结果。我们可以在下面的图 1 中看到这一点,我们将 K-means 和 GMM 应用于一些测试数据。这里,每个点的颜色由相关算法分配的聚类决定。在这种情况下,GMM 星团似乎更合适。

图 1:不同方差集群的聚类算法比较

其次,更大的协方差灵活性意味着我们可以识别更细长/椭圆形的集群。相比之下,K-means 只能真正识别球形簇。我们可以在图 2 中看到这一点,这里 GMM 集群更为合适。当我们将 GMM 应用到我们的餐馆数据集时,我们将看到为什么 GMM 的这些属性很重要。最终,它会让我们发现更多有趣的星团。

图 2:非球形集群上的集群算法比较

资料组

为了训练 GMM,我们将使用 Yelp 开放数据集【3】。这个数据集包含了 Yelp 网站上关于餐馆的大量信息。我们对它进行了预处理,这样我们就有了多伦多每家餐馆的名称、纬度和经度。我们还包括评论的数量(review_count)和餐馆的评级(stars ),这些将在以后用于分析聚类。其他特征,如餐馆的邻居和类别,都被排除在外。我们用下面的代码读取数据集,我们可以在表 1 中看到一个例子。

表 1:餐馆数据集示例

在图 3 中,我们用纬度和经度标出了所有的餐馆。每个点代表一家餐馆,总共有 7148 家餐馆。这个想法是,餐馆的位置可能会告诉我们一些关于它的事情。例如,某些位置的餐馆可能具有较高的评级。因此,我们也许可以在一个试图预测餐馆评级的模型中使用位置。然而,仅仅输入原始的纬度和经度数据可能不会给我们带来好的结果——尤其是当您使用线性模型时。这意味着我们必须对纬度和经度特性执行某种形式的特性工程。

图 3:使用餐馆纬度和经度的散点图

从某些方面来说,考虑到我们周围有餐馆,这已经做到了。换句话说,餐馆已经基于它们的纬度和经度被分组为集群(即,邻居)。问题是多伦多有 71 个不同的社区,这需要估计很多系数。你也许可以根据某些街区的特点将它们组合在一起,但这需要多伦多餐馆领域的知识。我们将尝试另一种方法,使用 GMM 对餐馆进行分组。

安装 GMM

在下面 Python 函数的第一部分,我们训练 GMM。GMM 的一个问题是它们可能收敛于局部最优点。为了避免这种情况,我们将“n_init”参数设置为 5。这将随机初始化和训练 5 个 GMM,最后,我们将最好的模型作为我们的最终模型。我们使用这个模型获得每个餐馆的标签/预测。然后,如图 3 所示,我们绘制了餐馆,只是这次我们根据 GMM 标签分配了一种颜色。

您可能已经注意到这个函数有一个参数——集群的数量。这被认为是 GMM 的超参数,是我们必须选择的。如果我们决定太多的聚类,模型将会使数据过拟合。这意味着我们将识别出没有意义的集群,或者将更适合放在一起的集群分割开来。如果我们决定的太少,模型可能会使数据不足。这意味着我们可能会错过一些重要的集群。问题是我们如何决定集群的数量?

有几种不同的方法可以帮助确定适当的集群数量。这些包括使用轮廓分数或模型 BIC 值【4】。这些只是有用的指南,并不一定会给你最好的集群数量。由于我们只使用 2 个特征来训练我们的 GMM,我们可以很容易地将结果可视化,并了解聚类是否合适。例如,如图 5 所示,我们使用上面的 Python 函数来绘制具有 5 个聚类的 GMM 的结果。

图 5:使用 5 个聚类的 GMM 标签散点图

GMM 发现了一些有趣的集群。例如,蓝色集群似乎非常密集,附近有许多餐馆。红色的长串看起来像是一条路。在图 6 中,我们看到分别使用 4 个和 6 个集群的类似曲线。在这两种情况下,我们看到 GMM 识别出了与图 5 中相似的集群。所以,让我们继续讨论 5 个集群。我们可以进一步分析它们,以更好地了解它们是否合适。

图 6:使用备选聚类数的 GMM 标签散点图

分析集群

如果我们看看多伦多的地图,就能更好地理解这些集群。我们使用下面的代码来做到这一点。首先,我们从一个有 5 个簇的 GMM 中得到标签。然后我们创建一个以多伦多为中心的叶子地图。最后,我们将每个点叠加在地图上。像以前一样,每个点的颜色由其标签决定。我们可以在图 7 中看到这个过程的结果。

看看地图,集群开始变得更有意义了。蓝色和绿色集群位于多伦多港周围更密集的城区。这些集群被一条高速公路大致分开,这似乎是划分餐馆群的一种非常自然的方式。黄色和橙色的集群不太密集,它们由更多郊区的餐馆组成。长长的红色星团特别有趣。几乎所有这些点都落在央街。快速搜索发现,这其实是多伦多最著名的街道。考虑到这一点,将这些餐馆归入自己的一组是有意义的。

图 7:覆盖在多伦多地图上的 GMM 星团

这些集群并不完美。有一些流氓红点可能有意义的蓝色集群的一部分。同样,在高速公路的右侧有一些蓝色的点,它们可能属于绿色集群。在很大程度上,GMM 已经确定了在地理上有意义的集群。我们可以预期它们具有不同的特征,但事实并非如此。

我们可以通过考虑餐馆的评论和评级来调查其特点。在表 2 中,我们可以看到每个聚类中餐馆的平均评论数。我们看到,蓝色集群中的评论数量往往更高。事实上,平均评论数量是黄色和橙色集群的两倍多。这可能是有道理的,因为我们可以预期在一个密集地区的餐馆会有更多的顾客。

表 2:集群审查和评级分析

我们还可以看到平均评级和至少拥有 4 星评级的餐厅的百分比(%高评级)。绿色聚类中的餐馆平均评级最高,并且它们拥有最大比例的高评级餐馆。也许这是多伦多的一个更高档的地区?此外,在评级方面,两个郊区集群(黄色和橙色)往往差别很大。

这只是我们可以用来比较集群的两个特征。我们可以永远继续分析它们。最终,集群的适当性取决于您想用它们做什么。总的想法是,也许在一些微调之后,您可以用它的聚类来标记每个餐馆,并在您的分析或模型中的一个特征中使用它。您也可以使用这些集群作为相似地理标签的起点。

图像来源

所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。

参考

[1] 科里·马克林 (2019),混合模型聚类算法讲解(2019),https://towards data science . com/Gaussian-Mixture-Models-d 13 a5 e 915 c8e

[3] 里布·尼雷克,高斯混合模型(2020),https://towardsdatascience . com/Gaussian-Mixture-Models-GMM-6 e 95 CBC 38 E6 e

[3] Yelp,Yelp 开放数据集(2019),https://www.yelp.com/dataset

[4] Vincenzo Lavorini ,高斯混合模型聚类:如何选择分量数(2018),https://towards data science . com/Gaussian-Mixture-Model-clusterization-how-to-select-the-number-of-components-clusters-553 bef 45 F6 e 4

识别 Soundcloud.com 的非法毒品卖家

原文:https://towardsdatascience.com/identifying-sellers-of-illicit-narcotics-on-soundcloud-com-3ca0bece4307?source=collection_archive---------48-----------------------

识别网上毒贩的自动化框架

来自像素的图像

介绍

许多网上药品销售发生在暗网市场——隐藏在暗网上销售非法商品的平台。然而,在 Instagram 和 Snapchat 等地方,这些商品的销售开始从暗网过渡到表面网。

卖家将利用这些平台发布他们产品的图片,并建立销售。然后,客户将付款并提供送货地点。定位这些帐户可能很困难,尤其是在 Snapchat 的情况下,因为你必须将他们添加为好友才能查看他们的内容。

然而,这些卖家正在网络上宣传他们的 Instagram 和 Snapchat 个人资料。这种情况发生在流行的在线音乐流媒体网站 Soundcloud 的评论区。下面是一个评论的截图,可识别的信息被编辑,广告大麻,可卡因和迷幻药。

图片来自音云

建立一个自动化框架来收集 Soundcloud 评论并提取 Snapchat 和 Instagram 上销售毒品的个人资料,有助于提高这一新领域执法工作的有效性。

结构

该框架是用 Python 开发的,包括两个组件:web 抓取和帐户提取。网络爬虫抓取 Soundcloud.com 并下载流行歌曲的评论。然后,这些评论被输入账户提取组件,该组件识别广告销售毒品的评论,并提取 Instagram 和 Snapchat 账户。

刮网器

web scraper 从 Soundcloud 上的当前热门曲目中抓取评论,并将其存储在 csv 文件中。这一管道概述如下。

首先,Selenium 库用于访问 Soundcloud 图表页面。

driver = webdriver.Chrome()
driver.get("[https://soundcloud.com/discover/sets/charts-top:all-music:us](https://soundcloud.com/discover/sets/charts-top:all-music:us)")
time.sleep(5)

然后选择当前的顶部轨道。

driver.find_element_by_xpath('//*[[@id](http://twitter.com/id)="content"]/div/div/div[2]/div[1]/div/div[2]/ul/li[1]/div/div[3]/a[2]').click()

因为 Soundcloud 对评论使用动态加载,所以需要先滚动到页面底部,直到不能再加载评论为止。

last_height = driver.execute_script("return document.body.scrollHeight")while True: driver.execute_script("window.scrollTo(0,               document.body.scrollHeight);") time.sleep(2) new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:
 break
 last_height = new_height

评论是由班级选择的。

comments = driver.find_elements_by_class_name('commentItem__read')

然后从评论中提取文本和用户名,并分别存储在 commentTextListcommentUserList 中。

for comment in comments:
  commentText
  comment.find_element_by_xpath('.//div[1]/div/span/p').text
  commentUser =  comment.find_element_by_xpath('.//div[1]/span/a').text
  commentTextList.append(commentText)
  commentUserList.append(commentUser)

commentTextList 和 commentUserList 然后被转换成 Pandas 数据帧并导出到 csv。

df['User'] = commentUserList
df['commentText'] = commentTextListdf.to_csv('scrape.csv')

账户提取

账户提取组件搜索抓取的评论以识别毒品卖家并提取他们的 Instagram 和 Snapchat 账户。这一管道概述如下。

首先,使用 read_csv 加载注释。

df = pd.read_csv("scrape.csv")

为了识别销售毒品的广告账户的评论,使用了关键词列表。所选的关键词通常出现在这些评论中。在这个领域之外也经常使用的关键字,如“芽”,被排除在外。

keywordList = ['carts', 'pills', 'shrooms', 'lsd', 'acid']

然后在评论中搜索与关键词匹配的内容。如果找到匹配,该注释将被添加到列表 foundComments 中。

for ind in df.index:
  if any(ext in df['commentText'][ind] for ext in keywordList):
  foundComments.append(df['commentText'][ind])

如果评论包括 snapchat 或 Instagram 帐户,帐户名称几乎总是以 snap、Snapchat、insta 或 instagram 开头。为了捕捉这些不区分大小写的单词,注释被转换为小写。在某些情况下,评论中会使用表情符号。这些都是用 Demoji 库剥离出来的。然后,评论被转换成向量,一系列 if 语句被用来识别帐户在哪个平台上以及帐户名称是什么。如果找到一个账户,账户名称被添加到列表用户名列表,平台被添加到列表平台列表

for comment in foundComments:
  cleanComment = demoji.replace(comment)
  cleanComment = cleanComment.lower()
  commentVector = cleanComment.split()
  if 'insta' in commentVector:
    next_word = commentVector[commentVector.index('insta') + 1]
    usernameList.append(next_word)
    platformList.append('instagram')
 if 'instagram' in commentVector:
    next_word = commentVector[commentVector.index('instagram') + 1]
    usernameList.append(next_word)
    platformList.append('instagram')
 if 'snap' in commentVector:
    next_word = commentVector[commentVector.index('snap') + 1]
    usernameList.append(next_word)
    platformList.append('snapchat')
 if 'snapchat' in commentVector:
    next_word = commentVector[commentVector.index('snapchat') + 1]
    usernameList.append(next_word)
    platformList.append('snapchat')

然后创建一个新的 pandas 数据框架,并添加两个列表。然后将数据帧导出为 csv 文件。

df2 = pd.DataFrame()
df2['username'] = usernameList
df2['platform'] = platformList
df2.to_csv('accounts.csv')

讨论

麻醉品销售从现场销售转向网上销售给执法部门带来了新的问题。这一框架可以帮助确定在线分销商,以便进一步调查,并改善这一领域的执法工作。

虽然这种实现只抓取了 Soundcloud 上的顶级音轨,但该框架可以扩展到从多个页面收集评论,从而大大提高其效率。此外,这个框架可以适用于 Soundcloud 之外的其他平台。

关键字词典也可以改进,以包括更多的术语和识别句子结构。提取 Snapchat 和 Instagram 用户名的算法也可以改进,以处理使用其他句子结构的评论。

利用潜在狄利克雷分配识别 Soundcloud.com 非法毒品卖家

原文:https://towardsdatascience.com/identifying-sellers-of-illicit-narcotics-on-soundcloud-com-using-latent-dirichlet-allocation-cae0a66deb67?source=collection_archive---------66-----------------------

基于 PyCaret 的 Soundcloud.com 评论主题建模

介绍

之前,我开发了一个框架,用于识别 Soundcloud.com 上非法毒品广告的卖家。这个框架通过一个简单的关键词搜索来搜集评论,并识别出为药物做广告的评论。虽然这个框架由于注释的相似结构做得很好,但我想通过使用潜在的 Dirichlet 分配来尝试改进这个框架。

潜在狄利克雷分配(LDA)是用于学习文本的抽象主题的自然语言处理(NLP)模型,也称为主题建模。LDA 会将文档按主题分类,允许我们对评论进行分类,并找到宣传毒品销售的评论。

数据

该模型中使用的数据是以前收集的,用于 Tableau 中的分析。当时 Soundcloud 上排名前三的歌都是刮出来的:Playboi Carti 的@MEH,Baby Jesus 的 Find My Way,Lil Mosey 的 Blueberry Faygo。该数据集有 17048 条评论,其特征为评论药物。特征评论是刮掉的评论的文本,特征是药物包含用于广告毒品销售的帖子的 1 和用于其他帖子的 0。关于数据收集的更多信息可参见此处。

模型实现

为了开发 LDA 模型,使用了一个名为 PyCaret 的 python 库。PyCaret 有很多机器学习算法的模块,但是使用的是 NLP 模块。更多关于 PyCaret 的信息可以在这里找到。

首先,PyCaret nlp 模块和 Pandas 被导入。

from pycaret.nlp import *
import pandas as pd

然后将数据集读入熊猫数据帧。

data = pd.read_csv('ldaData.csv')

读入数据后,运行 PyCaret 设置函数。这个函数初始化 PyCaret 环境。会话 id 123 用于轻松再现环境。

dataSetup = setup(data = data, target = 'comment', session_id = 123)

制作 LDA 模型时,必须传递主题数。由于该模型的目标是将销售毒品的广告准确分类到一个主题中,PyCaret 的模型调整与 isDrugs 功能结合使用,以确定最佳主题数量。最佳主题数为 32 个,准确率为 98.9%。

tuned_classification = tune_model(model = 'lda', supervised_target = 'isDrugs')

然后使用 32 个主题创建了 LDA 模型。

lda = create_model('lda', num_topics = 32)

然后将模型分配给数据。

lda_results = assign_model(lda)

宣传毒品销售的评论被归类为话题 30。一些不相关的评论被分类到主题 30 中,但是这些评论通常可以通过过滤来过滤掉,其中特征 Perc_Dominant_Topic 大于 18% 我们可以看到这个话题中使用熊猫的一些评论。Snapchat 或 Instagram 用户名已被审查。

lda_results.loc[(lda_results['Dominant_Topic'] == 'Topic 30') & (lda_results['Perc_Dominant_Topic'] > 0.18)]

然后为主题 30 绘制频率图。

plot_model(lda, plot = 'frequency', topic_num = 'Topic 30')

话题 30 也可以被可视化为单词云。

plot_model(lda, plot = 'wordcloud', topic_num = 'Topic 30')

讨论

LDA 似乎是一个很有前途的工具,可以用来识别 Soundcloud 上非法毒品广告的卖家。虽然该模型的性能相当不错,但额外的模型调整可以提高性能。这种模式也可以实现到原始框架中(可以在这里看到),并添加一个图形用户界面供执法部门使用。

用隐马尔可夫模型识别开放离子通道的数量

原文:https://towardsdatascience.com/identifying-the-number-of-open-ion-channels-with-hidden-markov-models-334fab86fc85?source=collection_archive---------34-----------------------

一篇关于我们如何差点赢得“利物浦大学—离子交换”Kaggle 竞赛的报道

2020 年 4 月 6 日编辑:我们已经发布了我们的代码!

2 月 24 日, Kaggle 与利物浦大学合作发布了一项新的“研究”竞赛,奖金高达 25000 美元。在这场比赛中,我们获得了与离子通道数据相对应的电信号,我们的目标是创建一种算法,可以自动识别每个时间点打开的通道数量。最初,比赛以一种奇特的“二次加权科恩卡帕评分(QWK)”开始,但这导致了发布后不久近乎完美的结果,这使得 me 不愿加入。过了一段时间,竞争指标变成了更合理的宏观 F1 分数,之后很明显我们离完美的解决方案还很远。我决定加入是因为几个原因:

  • 这是时间序列数据。
  • 这只是一个单一的时间序列,这使我们能够更专注于预处理和建模,而不是功能工程。
  • 数据集相当小,在训练集中总共有 500 万个测量值,在测试集中有 200 万个测量值。所需的总存储空间约为 125 MB。

我有幸与我曾有机会共事过的两个最聪明的人合作:卡沃和兹德米。最终,我们成功获得了第三名和 5,000 美元奖金,并在 2600 多个团队中脱颖而出。 第一名和第二名设法在比赛快结束时在私人测试数据中发现了一个漏洞,我们没有发现(只是在知道它的存在之后)。换句话说,我们有了最佳无泄漏解决方案!最后,我们能够在很短的时间内自己找到这个漏洞,这让我们更加沮丧…

这篇博文将提供我们解决方案的详细概述,并提供我们提出解决方案所需的见解。以下是目录:

  • 简介
    • 问题陈述
    • 一看数据&竞赛度量
  • 预处理
    • 预处理一:去除漂移-
      -预处理二:线性变换
    • 预处理三:电力线干扰去除
    • 类别 5 =类别 4 +类别 4
  • 建模
    • 隐马尔可夫模型:1 通道数据--【隐】隐马尔可夫模型
    • 将隐马尔可夫模型扩展到 K 通道
    • 在隐马尔可夫模型中引入记忆
  • 后处理
    • 后处理后验概率-
      -一点点融合
  • 结论

介绍

问题陈述

离子通道是成孔膜蛋白,存在于动物和植物中,允许离子通过通道孔。它们对学习和记忆进行编码,帮助对抗感染,发出疼痛信号,刺激肌肉收缩。这些离子通道可以通过膜片钳技术进行记录和分析,以推断疾病的某些特性。

来自维基百科的离子通道示意图。

组织者这样描述这个挑战:“当离子通道打开时,它们传递电流。检测这些状态变化的现有方法既慢又费力。人类必须监督分析,这除了乏味之外,还会带来相当大的偏差。这些困难限制了可用于研究的离子通道电流分析的容量。科学家希望该技术能够在原始数据中快速自动检测离子通道电流事件。在过去的 20 年里,分析电池中电数据的技术没有发生重大变化。如果我们更好地了解离子通道活动,这项研究可能会影响许多与细胞健康和迁移相关的领域。从人类疾病到气候变化如何影响植物,更快地检测离子通道可以大大加快解决重大世界问题。”

当离子通道打开时,我们可以清楚地看到电流的增加。

了解数据和竞争指标

提供给我们的数据相当简单,这是这场比赛的好处之一。数据只包含三列:

  • 时间戳
  • 每个时间戳的安培值(电流)。这些值是在 10 千赫的采样频率下测量的。
  • 该时间戳对应的开放通道数(仅针对训练数据提供)。

训练数据集包含 500 万行,而测试数据集包含 200 万行。竞赛的目标是在这 200 万行上最大化宏观 F1 分数。特定类别的 F1 分数被定义为精确度和召回率的调和平均值:

“宏” F1 简单来说就是每个班级的平均 F1 分数。因此,如果我们有 K 类,我们将计算 K F1 分数,然后取这些 K 分数的平均值。如果我们检查提供的数据,我们已经可以得出一些有趣的事情…

提供的原始数据(训练和测试)

首先,通过检查训练数据中的开放通道,我们可以看到数据由批量 500K 测量值组成。我们也可以在电信号中批量看到这些转换。在测试集中,我们可以找到 100K 的批次。而且,事实证明,训练集中 500K 的批次实际上由 5x 100K 的批次组成。

训练由多批 500K 组成。摘自Chris Deotte的【一个特征模型】。

通过更多地检查训练集中的开放频道,我们可以在训练集中找到五个不同的组:

  • 开放信道等于 0 或 1 的组。有许多 0 和一些 1。(类别 1)
  • 开放信道等于 0 或 1 的群。很多 1,很少 0。(类别 2)
  • 等于 0,1,2,3 的一组开放通道。(第三类)
  • 等于 0,1,2,3,4,5 的一组开放通道。(第四类)
  • 等于 0,1,2,3,4,5,6,7,8,9,10 的一组开放通道。(类别 5)
  • 令人惊讶的是,测试数据包含许多看起来非常类似于类别 1 的数据,但在电信号中有一些尖峰,这些尖峰没有出现在列车数据中。因此,我们将这些分类为单独的类别(类别 6)

当将这种洞察力与竞争指标相结合时,很明显具有多达 10 个开放频道 (类别 5) 的组将对宏观 F1 平均值产生最大影响。它有 5 个独特的类别(6、7、8、9、10),没有出现在其他组中,因此,这组数据对我们的宏观 F1 分数的贡献超过 50%。在比赛过程中, Waylon Wu 通过打探发现公共 LB 由前 30%(或 600000)的测试值组成,而私有 LB 由剩下的 70% (1400000)组成。

预处理

预处理 I:消除漂移

我们注意到,在训练信号的开始和结束以及测试信号的不同位置都存在奇怪的漂移…我们注意到两种类型的漂移:曲线漂移(例如,在训练信号的结束)和线性漂移(例如,在训练信号的开始,时间=50 左右)。

来自信号的两个子样本说明了两种类型的漂移。

最后,事实证明“线性”漂移根本不是线性的,而实际上只是“弯曲”漂移的一小部分(例如,我们的弯曲漂移的前半部分看起来也是线性的)。比赛开始后不久, Eunho Lee 和 Markus F 发现比赛组织者通过使用频率非常低的(周期值为 1.000.000)的正弦函数,在数据中引入了人为噪声。 Chris Deotte 将来自两个独立分析的见解捆绑在一起,以执行最干净的漂移消除,并从中制作一个数据集,该数据集可被所有其他竞争对手使用(感谢 Chris!).我们的新数据现在看起来如下:

漂移消除后的数据

我们可以注意到,从时间=360 到时间=390,有些事情仍然在出错。我们决定不为此费心,因为这样的异常在测试集中不存在,并且我们从我们的训练集中删除了这个数据。

预处理 II:线性变换

通过检查数据,很明显列车信号和开放频道的数量是高度相关的。事实上,对电信号应用线性变换,然后对结果值进行舍入,已经表现得相当好了。

电信号和开放通道的数量密切相关。

我们决定学习每类数据的线性变换,将电信号值最好地映射到开放通道的数量,这使得在未来的步骤中更容易分析。转换相当简单,我们学习了以下函数的两个不同参数(1D 线性回归):

1D 线性回归,以更好地将电信号(x)与其各自的开放通道数对齐。o 是偏移量,s 是线性回归的斜率。

我们的斜率对于每个类别都是相同的(0.8107),并且偏移取决于类别(对于类别 2、3、4 和 6 是 2.221318;类别 5 为 4.4288541,类别 1 为 2.180783)

对齐的数据。请注意,电信号现在已经非常好地对应于各个开放通道的数量。对信号值进行舍入已经会产生强基线。

我们提供了一个包含 python 代码的笔记本来说明这一点。

预处理三:电力线干扰消除

正如我在上一节中提到的,舍入我们对齐的电信号值将会产生一个强基线。不幸的是,它不会产生一个完美的分数…这是由于噪音存在于我们的数据集中(幸运的是,否则这将是一个相当微不足道的挑战)!我们可以通过简单地计算以下等式来检查这种噪声:

下面是我们的训练集的前 10000 个噪声值的图:

我们训练集的前 10000 个噪音值

虽然可能很难用肉眼看到,但在我们的噪声中存在某种波形。如果我们取一个大小为 50 的居中窗口的移动平均线,这就变得更加清楚了:

我们 10000 个噪声值的移动平均值(大小为 50 的居中窗口)。

我们可以清楚地看到平均每 200 个值就有一个波峰。以 10 kHz 的采样频率测得的周期约为 200 的周期性信号对应于 50 Hz 的频率。原来英国的交流电(比赛是利物浦大学的)频率是 50 Hz!为了从我们的噪声中消除这种模式,我们决定在每批 100000 个噪声值上拟合一个正弦函数(为此,您可以使用 scipy.optimize )。虽然信号处理技术,如带通和带阻滤波器也可以做到这一点,但我们用简单的正弦函数可以得到更好的结果。结果还表明,正弦函数中有多个分量(即多个正弦波具有不同的振幅、相位和频率)效果最佳。

10000 个噪声值和相应的拟合正弦函数。

同样,我们提供了一个笔记本来用 python 代码演示这一点。

类别 5 =类别 4 +类别 4

看起来我们的噪声去除技术对所有类别都很有效,除了一个类别……类别 5 中的数据有一些独特之处,使其区别于其他所有类别。通过做一些实验,我们注意到我们可以通过将类别 4 中的两个随机批次相加,很好地模拟类别 5 中的数据。

通过将两批类别 4 相加,生成类别 5 的合成数据。

通过这种假设,我们也可以假设 5 类噪声是两个正弦函数的叠加。此外,这种见解允许对例如神经网络有用的数据扩充。

事实证明,这一见解实际上也是漏洞。我们没有追求这条途径足够长的时间,但私人测试数据正好是两个类别 4 批次的总和,其中一个可以在训练集中找到...比赛结束后,我的队友 Zidmie, 在大约 30 分钟的寻找中发现了这个漏洞 (将我们的私人得分提高到 0.95430)。令人沮丧的是,由于一个漏洞,我们在 30 分钟内改进的模型比我们两个月的工作都多。后来他发现了整个泄密: y_test[570000:5800000] = predict(X_test[5700000:5800000] - X_train[4000000:4100000]) + y_train[4000000:4100000] 。因为你现在预测的是第 4 类数据(最多 5 个通道),所以任务变得容易多了。

再现#1 和#2 使用的泄漏。#1 从 X_test 中提取 X_train,而#2 从 X_test 中提取 y_train。提取 X_train 比 y_train 好,因为你也把噪音降低了一半!

建模

隐马尔可夫模型:单通道数据

这个迷因太适合不使用它了。最后,事实证明,私有测试数据的泄露是真正的赢家(也许我应该创造一个新的迷因……)。

序列状态空间模型,如隐马尔可夫模型,在很长一段时间内是这类问题的最新技术。只是在最近,深度学习的变体才被提出来(例如竞赛组织者提出的本文),因为这些变体通常对漂移之类的事情更加鲁棒。由于我们正在预处理我们的数据以消除所有的伪像,我们决定采用隐马尔可夫模型作为我们这次比赛的建模技术。

有很多关于隐马尔可夫模型的精彩介绍,所以我在这里就不再赘述了。我们需要知道的是,每个隐马尔可夫模型都有不同的参数:

  • 隐藏状态的数量(= K)
  • 初始化概率(大小为 K 的向量)
  • 一个转移矩阵(K×K 矩阵)
  • 排放概率。每个隐藏状态都发出一定的可观测值。这些发射可以具有不同的分布,例如离散发射的多项分布和连续发射的高斯分布(我们将在这里使用,因为我们的电信号是连续的)。

简而言之,开放通道(隐藏变量)遵循特定的马尔可夫过程,并以由转移矩阵确定的特定概率从一个值转移到另一个值。当马尔可夫过程处于某个隐藏/潜在状态时,会发出一个可观测值,这里就是电信号。

作为一个例子,我们将关注具有二元响应变量(开放通道= 0 或 1)的类别 2,并假设我们的马尔可夫模型具有 2 个隐藏状态。当打开通道的数量等于 0 时为隐藏状态,当它等于 1 时为一个隐藏状态。通过查看我们的训练数据(即,计算从一个状态到另一个状态的转换,并查看与一定数量的开放通道相对应的信号值),我们可以很容易地估计转换矩阵和发射分布:

第二类训练数据的估计高斯分布和转移概率。

这意味着,例如,如果开放通道的数量等于 1,信号值也将大约为 1(有一点差异)。下一个值将以 93.6%的概率等于 1,或者以 6.4%的概率等于 0。如上所述,这些参数可以通过使用训练数据来估计,但是也可以通过应用鲍姆-韦尔奇算法来估计。该算法是期望最大化算法的一个特例,期望最大化算法是一个无监督算法(不需要交叉验证,允许更快的迭代)。简而言之(也是简单化的方式),它会基于其初始参数进行预测,然后使用这些预测来更新参数,直到收敛。一旦学习了参数,我们就可以通过应用两种算法中的一种来执行推理:

  • 维特比算法——将返回最可能的序列
  • 前向-后向算法(或最大后验概率)——返回 TxK 概率矩阵 P,其中P[t][k]将是在时间t处于隐藏状态k的概率。

初始实验已经表明,前向-后向算法比维特比算法工作得稍好(尽管较慢)。注意,这些算法也用于 Baum-Welch 算法。在 Python 中应用所有这些算法的一个很棒的库是 hmmlearn 。

让我们在类别 2 的预处理数据上拟合一个双态 HMM:

创建具有两个隐藏状态的隐藏马尔可夫模型,我们基于我们的训练数据估计我们的发射分布和转移矩阵的参数。“长度=[100000]*10”来自于类别 2 有 2 批数据的事实。每批长度为 500K,同样由 5 批 100K 组成。因此,我们总共有 10 个长度为 100000 的序列。

我们脚本的输出。hmmlearn 库执行 Baum-Welch 算法 5 次迭代以适应我们的参数,之后它收敛。这类数据的 F1 分数等于 0.9961

因此,通过使用这个相当简单的方法,我们已经可以在我们的数据类别 2 上获得 0.9961 的 F1 分数。应该注意的是,我们的数据的类别 1 和类别 2 是最简单的,具有近乎完美的性能。F1 分数随着开放频道的最大数量而迅速下降。例如,我们无法在数据的类别 5 上达到 0.9 的 F1 分数。请看这本笔记本,了解更详细的例子。

“隐”隐马尔可夫模型

当阅读组织者发表的一篇论文时,可以清楚地看到,尽管开放频道的数量遵循马尔可夫过程,但它们又是由隐马尔可夫模型生成的。:

地面真相(开放通道)由马尔可夫过程产生,这可以是合成的(这是该比赛的情况)或真实的(因为假设真实离子通道遵循马尔可夫过程)。这个地面真相然后通过膜片钳放大器播放并记录下来,这产生了我们的带噪声(电信号)的可观测数据。图取自主办方的一篇论文。

这个隐马尔可夫模型由比唯一的开放信道值的数量更多的隐藏状态组成。这是 Markus F 在比赛中指出的。

左边是“香草”HMM,右边是 2 层或隐马尔可夫模型。

一个简单的方法是在我们的 2 层模型中忽略中间层(y(t))。因此,我们有一个隐藏马尔可夫过程,其隐藏状态的数量大于唯一开放通道的数量。让我们将这一观点应用到我们的类别 2 数据中。我们将在 HMM 中使用 4 个隐藏状态(我们已经用其他数字进行了实验,但是 4 个效果最好)。前两个隐藏状态将对应于开放通道的数量等于 1 时,随后的两个隐藏状态对应于开放通道为 0 时。估计初始转移矩阵现在变得更加困难,因为我们不能从我们的训练数据中直接估计它,我们手动调整了转移矩阵。

为了适合 4 状态 HMM,我们手动初始化转移矩阵,并对不同的隐藏状态重复使用我们的均值和协方差。

我们脚本的输出。请注意,hmmlearn 在迭代过程中打印的负对数似然比具有两个隐藏状态的对数似然大一倍。

可以注意到,我们现在获得了 0.9972 的 F1 分数,与仅使用 2 个隐藏状态相比,这大约增加了 0.001。这种改善非常显著,尤其是考虑到随着开放频道数量的增加,这种改善甚至会增加更多。F1 分数 0.001 的差距就是一枚银牌和一枚金牌的差距。通过引入更多的隐藏状态或调整初始转移矩阵,F1 可能会得到更大的改进,但较小的转移矩阵有几个优点,这将在后面更加清楚。在这本笔记本中可以找到这方面的 Python 代码。关于我们如何手动调整转换矩阵的更多信息,我们建议读者查阅这本笔记本。

将隐马尔可夫模型扩展到 K 信道

看起来我们可以非常精确地对我们数据的类别 1 和类别 2 建模,这两个类别有多达 1 个开放通道。现在的问题(25,000 美元)是,我们是否可以将这种方法应用于我们的具有一个以上公开渠道的数据的其他类别。事实证明,这远不是一个微不足道的情况…设计一个大型的初始转移矩阵,并确定哪些隐藏状态对应于哪些数量的开放通道是困难和昂贵的(我们的搜索空间实际上是无限大的)。

因此,我们假设当一批数据中的最大开放通道数等于K时,我们正在处理K个独立的二元马尔可夫过程。此外,这些马尔可夫过程中的每一个都具有与我们的第二类数据非常相似的参数。让几个独立的隐藏过程产生一个可观察变量非常适合阶乘隐马尔可夫模型。不幸的是,我们没有在 Python 中找到一个好的库(有 factorialHMM ,这是一个很棒的包,但我们在比赛期间没有让它足够快地工作,还有 Pyro.ai ,但学习曲线非常陡峭(至少对我来说)。

由于没有可用的实现,我们意识到自己实现这一点将是一个困难而漫长的过程。因此,我们决定在独立流程方面“突破”,将用于模拟多达 1 个开放通道数据的较小转换矩阵转换为较大的转换矩阵。我们新的大型马尔可夫过程中的每个隐藏状态对应于独立过程中隐藏状态的可能组合。顺序无关紧要(即(0,2)(这意味着 1 个进程处于隐藏状态 0,另一个处于隐藏状态 2)与(2,0)相同)。这种构造是递归完成的,如下所示:

为了对两个独立的过程建模,我们首先将 4 个隐藏状态扩展到 16 个隐藏状态,这 16 个隐藏状态捕获了隐藏状态的所有可能组合。之后,我们将相似的状态组合在一起(用相同的颜色标记)。然后,我们可以通过将新的 10x10 矩阵扩展为 40x40,并将其还原为 20x20(以此类推)来进一步继续模型 3 流程。马尔可夫链中所有状态之间都有转移(我只是没有全部画出来)。

扩展 4x4 转换矩阵以模拟独立流程。

在每次迭代中,我们首先扩展我们的转移矩阵。如果初始转移矩阵是 N×N,那么我们新扩展的矩阵将是 N * K×N * K,它捕获了我们的 N 个初始状态与 K 个新的可能状态的所有可能的相互作用。当有两个独立的进程时,一个例子是进程 1 处于隐藏状态 0,进程 2 处于隐藏状态 1。在此扩展之后,我们将相似的状态分组在一起(例如我们图中的绿色单元)。使用我们的示例,进程 1 处于隐藏状态 0,进程 2 处于隐藏状态 1,相当于进程 1 处于隐藏状态 1,进程 2 处于隐藏状态 0。在这个过程之后,我们新生成的矩阵的维数将是 C×C,其中 C 等于来自 K 个可能状态中的 P 个独立过程的重复组合的数量。作为一个例子,对于 4 个隐藏状态和 3 个独立进程,C 将等于 20(Comb _ with _ repeation(4,3)= Comb(4+3–1,3) = 20)。

下面是实现这一点的 Python 代码:

应该注意的是,这种算法实现起来并不那么简单,当进程数等于 10 时,一个简单(但可读性更好)的实现估计需要几周的运行时间。这一实施已经花费了大约 2 分钟来生成包含 10 个流程的转换矩阵,初始矩阵为 4x4,对于 5x5 矩阵来说已经花费了更长的时间(因此我们仍然使用 4x4)。

在隐马尔可夫模型中引入记忆

我们自己实现了向前向后算法,这给了我们很大的自由度。我们对算法的普通实现尝试了许多不同的调整,但导致最显著改进的是内存的引入。当在向后传递中计算时间步长t的概率时,我们使用向前传递的时间步长t的计算概率:

计算后向概率(betas)。Psig 是我们的发射概率,Ptran 是我们的跃迁概率,c 是系数(越高,前向概率的影响越大)。

计算我们的未来概率。

总的来说,我们执行三遍。一次向前传递,其中我们在下一次向后传递中使用 alphas,最后一次向前传递使用我们新计算的 betas。我们的 Psig 计算如下:

计算我们的 Psig 使用平均值为 0 的高斯分布和可以调整的 sigma。这导致|状态|概率。

我们的适应函数,用于向前和向后传递。对于反向传递,我们只是转置了转移矩阵并反转了信号。

在这里可以找到这种定制的向前向后算法的工作示例。

后处理

后处理后验概率

在我们的向前向后算法之后,我们剩下一个TxK,它具有每个可能的隐藏状态和每个时间步长的概率。由于我们有多个对应于相同开放通道值的隐藏状态,我们需要另一个后处理步骤来将这些概率转换为预测。作为第一步,我们用我们的K状态取每个时间步中我们的K概率的点积,这与加权和相同,因此得到连续的值Y。然后我们决定学习每一类和每一类数据的阈值。如果Y落在两个阈值之间,那么它被分配到相应的类。

为了确定这些阈值,我们使用了某种无人监管的技术。首先,我们过滤掉接近其舍入值的信号(因为这些信号中不存在大量噪声),并使用其舍入值作为标签。然后,我们确定这些舍入值的分布,并选择阈值,以便产生类似的分布。

请使用我们的后处理代码检查此笔记本。

一点混合

这个 HMM 的许多变体已经在这个比赛的过程中被制造。我的队友 Zidmie 在他的脚本中使用了一个计数器,他最终是 342(所以 342 个不同的脚本只由他自己编写)。在整个比赛过程中,我们不断提高我们的简历和公众 LB 分数。通常,连续版本之间的差异比 CV 分数的差异要大得多,这意味着新版本所做的改变并不都是正确的。因此,我们将前向-后向算法的不同输出混合在一起(通过使用它们的计算概率)。这给了我们一些边际增长。

结束语

我对我们的最终结果感到非常自豪。我认为这个解决方案相当优雅,因为它不是你在 Kaggle 上经常看到的 1001 个不同模型的典型集合,而且它在不到一个小时内运行。我们也从未使用竞赛组织者的代码来创建额外的数据或对数据生成过程进行逆向工程。最后,我有点失望地掉了两个位置,因为一个漏洞被其他车队发现了,而不是我们。尽管如此,我在这次比赛中学到了很多,因为我以前从未使用过隐马尔可夫模型,并且认识了两个伟大而聪明的人!

请关注这个页面,因为在接下来的几天里,它可能会收到一些小的更新。此外,我们正在努力发布我们的代码!

再次感谢 Kha Vo 和 Zidmie 在这次比赛中有很多乐趣!

致谢:作者感谢 Marco Gorelli 的建设性反馈。

来源

[## 利物浦大学-离子交换

确定每个时间点打开的通道数量

www.kaggle.com](https://www.kaggle.com/c/liverpool-ion-switching/overview) [## 离子通道

离子通道是成孔膜蛋白,允许离子通过通道孔。他们的功能…

en.wikipedia.org](https://en.wikipedia.org/wiki/Ion_channel) [## Deep-Channel 使用深度神经网络从膜片钳数据中检测单分子事件

努曼·切利克等人提出了一种深度学习模型,可以在嘈杂的环境中自动检测单分子事件

www.nature.com](https://www.nature.com/articles/s42003-019-0729-3) [## 阶乘隐马尔可夫模型

神经信息处理系统电子会议录

papers.nips.cc](https://papers.nips.cc/paper/1144-factorial-hidden-markov-models) [## hmmlearn/hmmlearn

hmmlearn 是一组用于隐马尔可夫模型的无监督学习和推理的算法。对于受监督的…

github.com](https://github.com/hmmlearn/hmmlearn)

确定欧洲电视网歌唱比赛中的投票群体

原文:https://towardsdatascience.com/identifying-voting-blocs-in-the-eurovision-song-contest-4792065fc337?source=collection_archive---------33-----------------------

长期以来,欧洲电视网歌曲大赛一直被指责为政治投票。像希腊和塞浦路斯或者瑞典和丹麦这样的投票配对是众所周知的,但是这种偏见会更深吗?我们能在竞赛中识别整个投票集团吗?

比赛确实试图通过使用公正的陪审团分发每个国家一半的分数来抵消政治投票,但是,自 2014 年以来,欧洲电视歌曲大赛一直在发布每个国家的电视投票排名。现在这个数据集已经增长,我们有一个独特的机会来确定欧洲电视网欧洲观众的民族偏见。

在我们开始之前,我们需要一个数据集。很多相关数据可以在这里找到。然而,它缺少了几年的电视投票,所以请查看我的 Github 库中我使用的数据,并查看我为这篇文章创建的代码。

有了数据,我可以带您完成我决定使用的预处理步骤:

  • 一个国家的积分值除以该国当年获得的总积分。无论歌曲质量如何,投票集团中的国家都会投票给对方。因此,在一个国家的歌曲整体排名很差的年份,他们的投票集团将在他们的分数中占很大比例。
  • 分值 12 和 10 分别更改为 10 和 9。这将移除排名第一和第二的权重。
  • 仅使用来自决赛的数据。
  • 在决赛中没有得分的国家被除名。

我通过平均每个国家每年的得分比例,将数据汇编成一个 2D 矩阵。一个国家因为没有资格进入决赛而不能得分的年份被忽略了。

矩阵可以被视为所有国家之间的加权双向网络。这让我们使用 Louvain 方法进行社区检测,将所有国家划分为投票团体。当这些块被排列在一起时,我们会得到这样的热图:

我们可以看到几个方形的高活性区域。这些区域是不同的投票区。把这个翻译到欧洲地图上,我们得到这个:

欧洲电视网歌唱比赛的投票区。所有国家都适合。

一般来说,投票集团反映了地理和文化边界,例如,俄罗斯在东欧集团或前南斯拉夫国家的影响。然而,随着我们向西移动,这些集团变得更大,更不明确。

该表为我们提供了更多关于投票集团的详细信息:

并非所有的投票群体都是平等的。“北欧”集团的地区偏见虽然高于所有国家的平均水平,但远低于其他地区。

“不对称”度量告诉我们给出和接收的反射点如何。“非对称性”为 0 意味着一个国家从另一个国家得到的分数是相同的。高度不对称的集团是投票集团的不良例子。如果我们看看伊比利亚/德国集团的地理位置,它不是一个强大的投票集团就不足为奇了。

这凸显了试图将所有国家纳入集团的问题。一些国家有非常高的不对称度。他们不给给他们积分的国家积分。通过迫使这些国家加入投票集团,我们给聚类增加了很多噪音,这反过来又给我们发现的集团增加了很多不确定性。

为了解决这个问题,我重复了制作第一张热图的所有步骤,但这次我删除了 15 个最不对称的国家。

有趣的是,五大和澳大利亚就在这 15 个国家中。这些国家不需要通过半决赛来获得决赛资格。这可能告诉我们,投票集团中的国家更有可能通过半决赛。

移除不对称国家后,我们得到的热图如下所示:

这些集群似乎比以前更加明确,我们的指标也证实了这一点:

这相当程度上更新了地图:

欧洲电视网歌唱比赛的投票区。不对称国家被移除。

所以,我们找到了投票团!我对比赛中地域偏见的程度感到非常惊讶。不可否认,各国获得的很大一部分分数来自他们的投票集团。但是,它的作用大到足以影响获奖歌曲吗?看一下过去 6 届欧洲电视网的获奖歌曲列表。

总的来说,我们看到了来自自己阵营的强烈支持。此外,(忽略巴尔干),获奖歌曲确实设法在其他投票集团中排名很高。但是,很难说所有的集团都同意这首获奖歌曲。

投票集团是欧洲电视网投票系统的自然产物,尽管看起来很难阻止投票集团,但将它们的影响最小化是可能的。目前,各国给最多人投票的宋 12 分,给第二名 10 分。这给了每个国家投票的前 2 首歌曲额外的权重,这是一个可以在投票群体中利用的因素。我重新创建了以前的表格,但这次 12 点选票减少到了 10 点,10 点减少到了 9 点。

标准偏差从平均值 1.49 降至 1.11,偏差降至最低。我找不到在比赛中引入 12 分制的理由。然而,无论是直觉上还是显而易见的,这似乎清楚地表明,它允许偏见被进一步利用。也许这种改变不值得。仅仅是为了娱乐。毕竟是歌唱比赛。

作为结束语,我认为值得一提的是,法官投票似乎更少偏见。它远非完美,但令人欣慰的是,专业人士比公众更客观。

鉴别野生蘑菇

原文:https://towardsdatascience.com/identifying-wild-mushrooms-what-to-forage-what-to-avoid-79242d14346c?source=collection_archive---------39-----------------------

吃什么,避免什么?Python 分类项目

来源:Pixabay

近年来,蘑菇作为一种超级食物越来越受欢迎,人们也越来越了解它对健康的巨大益处。蘑菇过去通常被视为传统食物,现在被广泛消费,并被认为具有治疗和保健功能。随着越来越多的人对此感兴趣,在野外寻找蘑菇的人数可能会增加,我想知道是否可以很容易地识别出可食用或有毒的蘑菇,以及这看起来像什么。

数据

该项目中使用的原始数据集来自 UCI 机器学习知识库。该数据集包括来自 23 种蘑菇的 8,124 个蘑菇样本的分类特征。

评估的目标变量是“可食用”或“有毒”的等级区分,并且从一开始就基本平衡。

目标变量,用 Seaborn 绘制。

解释变量涵盖了每个观察到的蘑菇结构的一系列描述性和视觉特征——例如,菌盖颜色、气味、环数和菌柄形状。我的数据集中最初有 21 个解释变量,都是分类变量。下面是 Seaborn 绘制的一些功能可视化(一键编码前):

我还利用 EDA 来可视化数据集的特性和类之间的关系。有明确的实例显示明显的分离:

建模

在通过 EDA 对我的数据集有了一些了解之后,我开始研究建模。应该注意的是,我的数据集从一开始就基本上是干净的——但是仍然有几个地方需要清理。为建模而预处理我的数据的主要领域有:

  • 所有二进制分类特征被编码为 0 和 1 值(包括目标)。
  • 由于所有值都相同,并且不会对模型产生影响,因此删除了面纱类型特征。
  • 一键编码应用于所有非二进制或序数/数字的特征。
  • 应用于数据集的训练/测试分割。

那么我运行了哪些模型呢?

我运行了基线虚拟分类器(预测多数类)、逻辑回归、KNN、决策树和随机森林分类器。我利用网格搜索来调整每个(不包括基线模型)的超参数。我的最佳评估者和他们的测试分数如下所示:

我的分类模型在数据集上的表现都非常好!这绝对让我感到惊讶…但我稍后会详细介绍这一点。

关于我的模型的一些想法——逻辑回归,它有 99%的分数通常是一个很好的选择。然而,鉴于该模型预测了一些假阴性(在这种情况下可能是致命的),我会说其他 3 个模型表现完美,因此更适合对蘑菇进行分类。

特征重要性和结论

由于我的模型表现得如此之好,我很清楚它们能够识别出对食用蘑菇和有毒蘑菇的分类有很大影响的特定特征。这正是我所希望的!

我从我的决策树分类器和随机森林分类器中探索了特征的重要性,并在下面绘制了前 10 个特征。有一些重叠和一些变化,如图所示…你也可以看到,气味 n,代表无,被两个模型选为最重要的。

随机森林分类器的特征重要性。

决策树分类器的特征重要性。

最后,几个简单的规则来鉴别毒蘑菇…

我能够利用从我的特性重要性分析和 EDA 中学到的东西,整理出一个简单的列表。也就是说,我不是专家,这个列表不应该在现实世界中应用——但是我能够得出一些结论,这些结论值得在这个项目中分享。

  1. 气味:如果蘑菇有气味,特别是气味不好闻,很可能有毒。

2。鳃大小:如果鳃很窄,很可能有毒。

3。孢子印颜色:白色、红色、‘巧克力’都有可能有毒。

4。淤青:如果蘑菇没有淤青,很可能有毒。

5。戒指上方的茎面:如果呈丝状,很可能有毒。

来源:Pixabay

最后的想法和下一步

为了扩大这个项目,也许选择一个“最终”模型,我想看看是否有类似的数据可用于未来的分析。通过这种方式,我可以进一步测试我的模型,也许还能发现一些在现实世界中最有效的方法。一些模型在我的数据集上表现完美,因此值得怀疑数据集是否受到损害,因此,在另一个数据集上测试我的模型可以提供进一步的验证。

此外,将我的结论与图像分类结合使用也是一个有价值的实验。

如果你对这个项目背后的代码感兴趣——查看我的 Github:https://Github . com/AlisonSalerno/Classification-model-project

IEEE-CIS 欺诈检测

原文:https://towardsdatascience.com/ieee-cis-fraud-detection-by-lightgbm-b8956a8e4b53?source=collection_archive---------39-----------------------

机器学习算法有助于确定哪些交易可能是欺诈性的。

布莱克·维斯在 Unsplash 上的照片

在这项工作中,我们将对在线交易是否欺诈进行分类。它是一个二进制目标,名为:isFraud。我们很多人都遇到过这样的情况,一笔交易未经我们的考虑就被取消了。有一个更好的算法,只取消欺诈交易,而不只是导致在商店里尴尬。虽然目前经常令人尴尬,但这个系统每年确实为消费者节省了数百万美元。

该数据集由 Vesta 的真实世界电子商务交易提供,包括从国家到收件人电子邮件域的广泛功能。利用这个数据集,我们将 Lightgbm 算法应用于一个具有挑战性的大型 e 级数据集。提高欺诈交易警告的有效性将为许多人省去误报的麻烦。如果您想了解 PySpark 的实现,请阅读下一篇文章。

但是我们如何分析这类问题呢?

数据

第一步是下载数据集。这里使用的训练集有两个部分。一个是 train _ transcation,另一个是 train_identity。

train_identity = pd.read_csv(‘../input/ieee-fraud-detection/train_identity.csv’)train_transaction = pd.read_csv(‘../input/ieee-fraud-detection/train_transaction.csv’)

我将在名为“TransactionID”的列上合并这两个数据帧。但并不是所有的交易都有相应的身份信息。

train_transaction_identity = train_transaction.merge(train_identity, on=’TransactionID’,how=’left’ )

数据集包含几个特征,下面我只提到其中的几个。

  • TransactionDT :给定参考日期时间的 timedelta(不是实际时间戳)
  • 交易金额:美元交易支付金额(部分为其他货币兑换)。
  • card1 — card6 :支付卡信息,如卡的类型。
  • 地址:地址

如果您想更好地了解特性,请查看数据源链接。

如下图所示,内存使用量超过 1.9+ GB。我们可以在不丢失任何数据的情况下减少内存使用。

train_transaction_identity.info()

首先,我发现了不同类型的特性,包括对象、浮点和整数。通过使用。在熊猫图书馆,你可以找到内存使用的大小。大部分被 float64 占据。我已经将这些列从 float64 更改为 float32。如您所见,内存使用量减少了近 50%。

数据探索

大多数交易不是欺诈,所以在这种情况下,我们有不平衡的数据。机器学习算法无法在不平衡的数据集上正常工作。下面写的一段代码显示只有 3.5%是欺诈性的。

它们是处理不平衡数据集的几种方法,如过采样和欠采样。好在 Lightgbm 可以帮你解决这个事情。默认情况下,模型认为数据集是平衡的。因此,在您的情况下,我们需要将参数更改为:

is_unbalance = True

通过这样做,“不平衡”模式使用目标值来自动调整与输入数据中的类别频率成反比的权重。

移除多余的功能

如果我们看每一列,我们可以看到,如果我们有很多丢失的值。

(np.sum(pd.isnull(train_transaction_identity)).sort_values(ascending=**False**)/len(train_transaction_identity))*100

下图显示,我们有大约 99%的缺失值的特征。这些列不会给我们的模型增加任何值。所以我们可以删除它们而不会丢失太多数据。

在所有特性中,我已经删除了丢失值超过 30%的列。下面写的代码是为了去掉这些不重要的特性。

分类特征

分类数据是只需要有限数量的可能值的数据。机器学习算法不能直接处理分类数据,要使用它们,必须先将类别转换成数字,然后才能对它们应用学习算法。

有几种技术可以应用,包括 OneHotEncoder,替换值。在这里,我使用 Pandas get_dummy 函数将分类变量转换为虚拟/指示变量。

train_dummy = pd.get_dummies(train_transaction_identity, drop_first=**True**)

处理缺失值

有几种方法可以处理缺失值,如插补、删除。默认情况下,Lightgbm 有一个选项来处理这个问题。它在分割查找过程中忽略丢失的值,然后将它们分配给损失减少最多的那一侧。如果你不想使用选项和应用其他技术,你将需要它的参数为:

use_missing=false

特征缩放

在创建机器学习模型之前的数据预处理期间,特征缩放是机器学习算法中最重要的步骤之一。大多数情况下,您的数据集将包含在量级、单位和范围方面差异很大的要素。但对于大多数机器学习来说,使用未缩放的特征会产生一个问题。

例如,线性回归等机器学习方法和使用梯度下降作为优化算法的神经网络需要对数据集进行缩放。当我们使用像 K-means 和 SVM 这样受特征范围影响最大的距离算法时,也会出现类似的问题。原因是他们使用数据点之间的距离来确定它们的相似性。

幸运的是,我们不需要担心它的功能扩展。基于树的算法对特征的规模相当不敏感。

模型评估

我用了 25%的数据进行验证,其余的用于训练。这里涉及到很多超参数。因此,你的工作就像一个建筑师,寻找最佳值,以最大限度地提高准确性。

有几种技术非常有用,包括 GridSearchCV 和 RandomizedSearchCV。

如您所见,这里涉及到许多参数,但如果您想了解每个参数是什么,请查看此链接。

结论

正如我们在下面可以看到的,我们已经获得了训练数据的 AUC 几乎为 98%,验证数据集的 AUC 为 94%。大约花了 5 分钟。您可以增加“增强迭代次数”以获得更好的训练/验证数据集 AUC。您可以考虑这一点,或者更改其他参数来权衡准确性和速度。

您将能够在 CPU 上运行 Lightgbm。为此,您只需设置以下参数“设备类型”:“GPU”

本文使用的所有代码都可以从我的 GitHub 中访问。我期待听到反馈或问题。

如果历史重演,傅立叶变换是一把钥匙

原文:https://towardsdatascience.com/if-history-repeats-itself-fourier-transform-is-a-key-a593ddfa246e?source=collection_archive---------52-----------------------

仅仅使用傅立叶变换就可以清理你的数据并预测新的数据吗?答案是肯定的,可能。

图片由乔恩·泰森https://unsplash.com/@jontyson拍摄

我的教授在高中时常说的一句话是“历史会重演”。这句话的意思显然与这样一个事实有关,即我们应该以史为鉴,从而能够不犯我们过去犯过的同样的错误。

现在我们来谈谈科学。如果你有一个时间序列,那么你就有(最好)很长一段时间的数据。让我们假设一下历史确实会重演。这将意味着,通过简单地复制信号,您将扩展您的数据,从而获得两倍长的数据集。我知道你在想什么,你是对的,我在愚弄你。事实上,我在这几行中主要提到的是 傅里叶变换 ,即每个周期信号都可以被视为正弦和余弦之和。获得每个频率的幅度和相位,就有了信号,可以很容易地扩展它。

我有一个好消息和一个坏消息要告诉你。坏消息是你不能假装你的数据是周期性的,除非你知道由于某种奇怪的原因它们确实是周期性的。好消息是,有时你的数据确实呈现半周期模式,在这种情况下,傅立叶变换值得一试。

我知道,我说了很多,让我们从实践开始。

设置:

已经使用的语言是 Python,具有已经使用的以下库:

数据集:

让我们以波兰电力负荷为例,看看 2008 年至 2016 年的数据:

这是原始数据

每一年的时间步长非常容易区分,如果我们把它缩小,每个月和每个星期也是如此。

很有周期性,是吧?

在这些情况下,傅立叶变换这样的简单方法可能是一种选择。事实上,它可以应用的想法是,我们的信号实际上是周期性的,但它似乎不是周期性的,因为噪声、一般线性趋势或其他不必要的影响使我们的信号不稳定。让我们继续前进!

春季大扫除:

该信号具有线性趋势,并且其平均值不为 0。这可能会干扰傅立叶频谱,通常我们不希望线性趋势被视为傅立叶频谱的“长频率成分”。使用神奇的 scipy 库,信号已被消除趋势和转移,以便将其平均值设置为 0。

线性增长的信号消失了。加上数据现在有 0 均值。

好了,我们准备好了。

培训/验证/测试:

借用机器学习术语,数据集分为三部分:

  • 训练集:应用傅立叶变换的地方(从 2008 年到 2014 年)
  • 验证集:最适合模型的地方(2015)
  • 测试集:其中揭示模型的优良性。(2016)

如果你是一个 ML 专家,请不要把这个术语看得太重,因为它和你所知道的不太相符。无意冒犯。名字就是名字。😃

算法:

当然,如果你天真地应用傅立叶变换,你不能期望得到好的结果,这就是为什么算法稍微(我希望)复杂一些。

Divide et impera(训练集)

傅立叶变换意味着数据是静止的,但生活是变化的,爱情故事也是结束的

这就是为什么训练集的每一年都必须单独进行。每一年都会给出它的傅立叶变换。

平均傅立叶变换(F)是通过每个傅立叶变换的和除以 7(在训练集上有 7 年)获得的。

消除干扰(验证集)

现在让我们考虑验证集信号(2015 年负载)。其思想是使用训练集的傅立叶变换,将其转换回来,并将重建的信号与验证集的信号进行比较。傅立叶逆变换当然是通过使用 numpy FFT 算法获得的。

问题是,由于 numpy FFT 算法非常出色,它能够非常好地再现信号,甚至可能太好了。事实上,我们希望噪声不在重构信号中。但是什么是真正的噪音呢?

你知道没人能回答这个问题,但是一个安全的警告是,误差(原始信号(即 2015 年负载)和重建信号之间的差异)必须最有可能与信号不相关。当然,另一方面,如果我们有一个 0 信号,它与原始信号不相关,但它没有预测能力。简而言之,这就是我们想要的模型:

  • 原始信号和重建信号之间可接受的低 RMSE:如果 RMSE 太高,预测就不起作用。
  • 误差与原始信号之间的低相关性:如果相关性太高,我们的模型会过度拟合数据,并且在测试期间会出现令人不愉快的意外。

为了做到这一点,我们调用一个名为 threshold 的魔法向导。阈值是 0 和 1 之间的某个值,将乘以训练集(F)的平均谱的最高值。所有小于 t * max(F)的频率都被设置为 0,然后信号被转换回原始空间,RMSE 和相关值都已经被计算出来。最佳阈值是具有最低 RMSE 和尽可能最低相关性的阈值。

测试预测(测试集)

这种经过滤波的傅立叶频谱已被用于预测 2016 年负荷的前 10 至 90 天,结果实际上令人惊讶。

该模型略微过拟合,但 RMSE 仍然低得可以接受,误差部分是由于统计误差波动,从 C 为< 0.60 这一事实可以看出。此外,预测实际上在一周的前几天非常好,而周末似乎更难赶上(伙计们,拜托,别喝太多了!)

结论:

许多数据科学挑战是时间序列挑战(例如全球气候报告、股票市场分析、太阳周期预测等。).当然,还有更强有力的方法来处理时间序列(RNN、阿玛、ARIMA、萨里玛等)。)并对它们进行预测。尽管如此,正如我希望我在这篇报道中所展示的那样,有时很好地利用简单的数学概念仍然可以产生非常好的结果。作为简单的数学概念,它们还能让你完全控制正在发生的事情,并且可以根据你自己的调查进行调整。

顺便说一句,我真的不知道历史是否会重演,但我确实认为我们应该以不同的形式、不同的心态和不同的精神重新生活一些时刻。正如马克·吐温曾经说过的:

“历史不会重演,但它经常押韵”

如果你喜欢这篇文章,你想知道更多关于机器学习的知识,或者你只是想问我一些你可以问的问题:

A.在 Linkedin 上关注我,我在那里发布我所有的故事
B .订阅我的 简讯 。这会让你了解新的故事,并给你机会发短信给我,让我收到你所有的更正或疑问。
C .成为 推荐会员 ,这样你就不会有任何“本月最大故事数”,你可以阅读我(以及数千名其他机器学习和数据科学顶级作家)写的任何关于最新可用技术的文章。

再见:)

如果让我重新开始学习数据科学,我会怎么做?

原文:https://towardsdatascience.com/if-i-had-to-start-learning-data-science-again-how-would-i-do-it-78a72b80fd93?source=collection_archive---------1-----------------------

几天前,我开始思考,如果我必须从头开始学习机器学习和数据科学,我会从哪里开始?有趣的是,我想象的道路与我开始时实际走的完全不同。

我知道我们都以不同的方式学习。有些人更喜欢视频,有些人只需要书就可以了,很多人需要付费才能感受到更多的压力。没关系,重要的是学习并享受它。

因此,从我自己的角度来说,如果我必须重新开始学习数据科学,我知道如何才能学得更好,所以我设计了这条道路。

正如你将会看到的,我最喜欢的学习方法是从简单到复杂逐渐进行。这意味着从实际例子开始,然后转向更抽象的概念。

Kaggle 微课

我知道从这里开始可能会很奇怪,许多人更愿意从最基础和数学视频开始,以充分理解每个 ML 模型背后发生的事情。但是从我的角度来看,从一些实际和具体的东西开始有助于对整个画面有一个更好的看法。

此外,这些微型课程每门大约需要 4 个小时才能完成,因此提前实现这些小目标会增加额外的动力。

Kaggle 微课:Python

如果你熟悉 Python,你可以跳过这一部分。在这里,您将学习基本的 Python 概念,这将帮助您开始学习数据科学。将会有很多关于 Python 的事情仍然是一个谜。但是随着我们的进步,你会在实践中学会的。

链接:https://www.kaggle.com/learn/python

价格:免费

Kaggle 微课:熊猫

Pandas 将为我们提供用 Python 操作数据的技能。我认为一个 4 小时的微型课程和实际例子足以让你对可以做的事情有一个概念。

链接:【https://www.kaggle.com/learn/pandas

价格:免费

Kaggle 微课:数据可视化

数据可视化可能是最被低估的技能之一,但却是最重要的技能之一。它将使您能够完全理解您将使用的数据。

链接:【https://www.kaggle.com/learn/data-visualization

价格:免费

Kaggle 微课:机器学习入门

这是激动人心的部分开始了。你将学习基本但非常重要的概念,以开始训练机器学习模型。这些概念对于理解它们是至关重要的。

链接:【https://www.kaggle.com/learn/intro-to-machine-learning】T2

免费

Kaggle 微课:中级机器学习

这是对前一个的补充,但这里您将第一次使用分类变量,并处理数据中的空字段。

链接:【https://www.kaggle.com/learn/intermediate-machine-learning】

价格:免费

让我们在这里停一会儿。应该清楚的是,这 5 个微型课程不会是一个线性的过程,你可能需要在它们之间来来回回地更新概念。当您在 Pandas one 中工作时,您可能需要返回 Python 课程以记住您所学的一些内容,或者进入 Pandas 文档以理解您在机器学习入门课程中看到的新功能。所有这些都很好,真正的学习将在这里发生。

现在,如果您意识到前 5 门课程将为您提供进行探索性数据分析(EDA)和创建基线模型的必要技能,以后您将能够对其进行改进。所以现在是时候从简单的卡格尔比赛开始,并把你学到的东西付诸实践了。

卡格尔游乐场竞赛:泰坦尼克号

在这里,你将把你在入门课程中学到的东西付诸实践。也许刚开始会有点吓人,但没关系这不是为了在排行榜上第一,这是为了学习。在本次竞赛中,您将了解这些类型问题的分类和相关指标,如精确度、召回率和准确度。

链接:https://www.kaggle.com/c/titanic

卡格尔游乐场竞赛:房价

在本次竞赛中,您将应用回归模型并了解相关指标,如 RMSE。

链接:https://www.kaggle.com/c/home-data-for-ml-course

到目前为止,您已经有了很多实践经验,并且您会觉得您可以解决很多问题,但是您可能还没有完全理解您所使用的每个分类和回归算法背后发生的事情。所以这就是我们必须研究我们所学内容的基础的地方。

许多课程都是从这里开始的,但至少在我从事过一些实际工作后,我能更好地吸收这些信息。

书:从零开始的数据科学

在这一点上,我们将暂时脱离 pandas、scikit-learn 和其他 Python 库,以实际的方式了解这些算法“背后”发生了什么。

这本书读起来非常友好,它提供了每个主题的 Python 示例,并且没有太多繁重的数学,这是这个阶段的基础。我们想要理解算法的原理,但是从实践的角度来看,我们不想因为阅读大量密集的数学符号而失去动力。

链接:亚马逊

价格:26 美元左右

如果你已经做到这一步,我会说你很有能力从事数据科学工作,并且理解解决方案背后的基本原则。因此,我在此邀请您继续参与更复杂的 Kaggle 竞赛,参与论坛并探索您在其他参与者解决方案中发现的新方法。

在线课程:吴恩达的机器学习

在这里,我们将看到许多我们已经学到的东西,但我们将看到该领域的一位领导者对此的解释,他的方法将更加数学化,因此这将是更好地理解我们的模型的一种方式。

**链接:【https://www.coursera.org/learn/machine-learning **

价格:无证书免费——有证书 79 美元

书:统计学习的要素

现在繁重的数学部分开始了。想象一下,如果我们从这里开始,这将一直是一条上坡路,我们可能会更容易放弃。

链接:亚马逊

价格:$60,在斯坦福页面有官方免费版本。

在线课程:吴恩达深度学习

到那时,你可能已经阅读了深度学习的相关内容,并尝试了一些模型。但在这里,我们将学习什么是神经网络的基础,它们如何工作,并学习实现和应用现有的不同架构。

链接:https://www.deeplearning.ai/deep-learning-specialization/

价格:49 美元/月

在这一点上,这很大程度上取决于你自己的兴趣,你可以专注于回归和时间序列问题,或者更深入地进行深度学习。

我想告诉你,我推出了一个数据科学问答游戏,通常会在面试中出现问题和答案。前往datasciencetrivia.com了解更多相关信息。

【santiviquez.com】原载于