TowardsDataScience 博客中文翻译 2019(四百八十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

人工智能对金融服务的影响越来越大:六个例子

原文:https://towardsdatascience.com/the-growing-impact-of-ai-in-financial-services-six-examples-da386c0301b2?source=collection_archive---------5-----------------------

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

这篇关于*AI in fin tech services的文章最初是为Django Stars 博客而写的。***

正如许多其他技术进步一样,人工智能从童话故事和小说书中走进了我们的生活(想想《绿野仙踪》中的铁皮人或《大都会》中的玛丽亚)。人们梦想机器能够解决问题,缓解 21 世纪快速增长的压力。

从人工智能这个术语出现至今不到 70 年,它已经成为最苛刻和快节奏行业不可或缺的一部分。具有前瞻性思维的执行经理和企业主积极探索人工智能在金融和其他领域的新用途,以获得市场竞争优势。

更多的时候,我们并没有意识到人工智能在我们的日常生活中涉及了多少。

今天的人工智能:它在哪里工作,为了什么

例如,在旅游行业,人工智能有助于优化销售和价格,以及防止欺诈交易。此外,当我们在网上浏览飞机或酒店预订网站计划下一个暑假时,人工智能使我们有可能为理想的日期、路线和费用提供个性化的建议。

** [## 旅游业中的机器学习和数据分析

克里斯托弗·哥伦布是历史上最著名的旅行家之一,他一生只进行了 4 次旅行。其中一个…

djangostars.com](https://djangostars.com/blog/benefits-of-the-use-of-machine-learning-and-ai-in-the-travel-industry/?utm_source=medium&utm_medium=towardsdatascience.com&utm_campaign=ai%20in%20fintech&utm_content=the%20traveling%20industry)

在交通运输行业,人工智能被积极用于开发自动停车和高级巡航控制功能,旨在使驾驶更轻松、更安全。专家认为,这里最大的突破就在眼前——自动驾驶汽车,或自动驾驶汽车,已经出现在道路上。

另一个使用人工智能的鲜明例子是教育,Coursera 或 Lynda 等开放在线课程(MOOC)每年都变得越来越受欢迎。随着人工智能在教育领域的兴起,这些都成为了可能。自动评分使任何能上网的人都可以自学在线课程——这对许多人的生活和职业来说都是一个关键点。

人工智能拯救生命,这不是比喻。从机器人手术到虚拟护理助理和病人监控,医生们利用人工智能为他们的病人提供最好的护理。图像分析和各种管理任务,如归档和制图,有助于降低昂贵的人工成本,并使医务人员有更多的时间与患者在一起。

人工智能在金融行业的崛起证明了它改变商业格局的速度有多快,即使是在传统的保守领域。这里只是人工智能在金融领域最受欢迎的一些例子。

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

1.人工智能和信贷决策

人工智能以更低的成本对潜在借款人进行更快、更准确的评估,并考虑更广泛的因素,从而做出更明智、有数据支持的决策。与传统信用评分系统相比,人工智能提供的信用评分基于更复杂和复杂的规则。它有助于贷款人区分高违约风险申请人和那些信用良好但缺乏广泛信用记录的人。

客观性是人工智能驱动机制的另一个好处。与人类不同,机器不可能有偏见。

数字银行和贷款发放应用程序使用机器学习算法来使用替代数据(例如,智能手机数据)来评估贷款资格并提供个性化选项。

美国的汽车贷款公司也报告了人工智能在满足他们需求方面的成功。例如,这份报告显示引进人工智能每年减少 23%的损失。

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

2.人工智能和风险管理

当谈到风险管理时,很难高估人工智能在金融服务中的影响。巨大的处理能力允许在短时间内处理大量数据,而认知计算有助于管理结构化和非结构化数据,这是一项需要人类花费太多时间才能完成的任务。算法分析风险案例的历史,并识别潜在未来问题的早期迹象。

在分析任何给定市场或环境的实时活动时,金融领域的人工智能是一个强大的盟友;它提供的准确预测和详细预测基于多个变量,对业务规划至关重要。

美国租赁公司 Crest Financial 在亚马逊网络服务平台上采用了人工智能,并立即看到风险分析方面的显著改进,没有传统数据科学方法相关的部署延迟。

您可能还喜欢:

[## 构建金融科技产品之前你需要考虑的问题

我喜欢金融的一点是,这个行业和时间一样古老——然而,很少有人敢进入它。幸运的是…

djangostars.com](https://djangostars.com/blog/what-you-need-to-consider-before-building-a-fintech-product/?utm_source=medium&utm_medium=towardsdatascience.com&utm_campaign=ai%20in%20fintech)

3.人工智能和欺诈预防

多年来,人工智能在打击金融欺诈方面一直非常成功——随着机器学习正在赶上罪犯,未来每年都在变得更加光明。

人工智能在防止信用卡欺诈方面尤其有效,近年来,由于电子商务和在线交易的增加,信用卡欺诈呈指数增长。欺诈检测系统分析客户的行为、位置和购买习惯,并在某些东西看起来不正常并与既定的消费模式相矛盾时触发安全机制。

银行还利用人工智能来揭示和防止另一种臭名昭著的金融犯罪:洗钱。机器可以识别可疑活动,并有助于降低调查涉嫌洗钱计划的成本。一项案例研究报告称调查工作量减少了 20%。

Plaid (与 CITI、高盛和美国运通等金融巨头合作)这样的聚合器对他们的欺诈检测能力引以为豪。其复杂的算法可以分析不同条件和变量下的相互作用,并建立多个实时更新的独特模式。格子作为一个小工具工作,连接银行和客户的应用程序,以确保安全的金融交易。

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

4.人工智能与交易

数据驱动的投资在过去 5 年中稳步增长,2018 年接近 1 万亿美元。也叫算法、量化或高频交易。

这种交易在全球股票市场迅速扩大,理由很充分:人工智能提供了多重重大好处。

智能交易系统监控结构化(数据库、电子表格等)。)和非结构化(社交媒体、新闻等。)数据所需的时间只是人们处理数据所需时间的一小部分。“时间就是金钱”这句话在交易中最真实:更快的处理意味着更快的决策,这反过来意味着更快的交易。

对股票表现的预测更加准确,因为算法可以根据过去的数据测试交易系统,并在投入使用前将验证过程提升到一个全新的水平。

人工智能根据特定投资者的短期和长期目标,为最强的投资组合提供建议;多家金融机构也信任人工智能来管理他们的整个投资组合。

商业新闻网站彭博最近推出了羊驼预测人工智能预测矩阵,这是一款面向人工智能投资者的价格预测应用。它将彭博提供的实时市场数据与先进的学习引擎相结合,以识别价格运动模式,从而进行高精度的市场预测。

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

5.人工智能和个性化银行

当涉及到探索新的方法来为个人用户提供额外的好处和舒适时,人工智能确实大放异彩。

在银行业,人工智能支持智能聊天机器人,为客户提供全面的自助解决方案,同时减少呼叫中心的工作量。由智能技术支持的语音控制虚拟助理,如亚马逊的 Alexa,也正在迅速获得牵引力,这并不奇怪:它们拥有自我教育功能,每天都变得更聪明,所以你应该期待这里的巨大进步。这两个工具都可以检查余额,安排付款,查找账户活动等等。

许多应用程序提供个性化的财务建议,并帮助个人实现他们的财务目标。这些智能系统跟踪收入、必要的经常性支出和消费习惯,并提出优化的计划和财务提示。

富国银行(Wells Fargo)、美国银行(Bank of America)和大通银行(Chase)等美国最大的银行已经推出了移动银行应用程序,为客户提供支付账单的提醒、计划支出,并以更简单、更简化的方式与银行互动,从获取信息到完成交易。

6.人工智能和过程自动化

当具有前瞻性思维的行业领导者希望削减运营成本和提高生产率时,他们会将目光投向机器人过程自动化。

智能字符识别使各种单调、耗时的任务自动化成为可能,这些任务过去需要数千个工作小时,并增加工资。支持人工智能的软件根据给定的参数验证数据并生成报告,审阅文档,并从表格(申请、协议等)中提取信息。).

采用机器人流程自动化处理高频率的重复性任务消除了人为错误的空间,并允许金融机构将工作人员的精力重新集中在需要人工参与的流程上。安永公司报告称这类任务的成本降低了 50%-70%,福布斯为“数字化转型的门户药物”。

一家领先的金融公司 JP Morgan Chase 已经成功地利用机器人流程自动化(RPA)执行了一段时间的任务,例如提取数据、遵守了解您的客户法规以及捕获文档。RPA 是摩根大通用来增强现金管理流程的五大新兴技术之一

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

对金融行业的人工智能未来有什么期待

对即将到来的人工智能在金融服务中的应用的预测是这些天的热门话题,但有一点是肯定的:人工智能正在迅速重塑金融业的商业格局。

人们对提高交易和账户安全性寄予厚望,特别是随着区块链和加密货币的普及。反过来,由于缺少中介,这可能会大大减少或消除交易费用。

各种数字助手和 app 都会因为认知计算而不断完善自己。这将极大地简化个人财务管理,因为智能机器将能够计划和执行短期和长期任务,从支付账单到准备报税。

随着自然语言处理的进步,以及从过去经验的不断扩大的数据池中学习更多,我们还可以期待看到使用复杂的自助虚拟现实系统的更好的客户服务。

更全面、更准确的“了解你的客户”报告和更彻底的尽职调查将带来更高水平的透明度,而现在这将耗费太多的人工时间。

结论

正如我们所看到的,人工智能在金融服务中的好处是多方面的,很难忽视。据福布斯报道,65%的高级财务管理人员预计人工智能在金融服务中的使用将带来积极的变化。

这就是说,截至 2018 年底,只有三分之一的公司采取措施将人工智能纳入公司流程。许多人仍然过于谨慎,担心这项工作需要时间和费用,而且在金融服务领域实施人工智能将面临挑战。

然而,一个人不能永远回避技术进步,从长远来看,现在不面对技术进步可能会付出更大的代价。

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

数据科学家和分析师在基因治疗中日益重要的作用

原文:https://towardsdatascience.com/the-growing-role-of-data-scientists-and-analysts-in-gene-therapy-9c5a04b63be4?source=collection_archive---------22-----------------------

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

Image via Rawpixel

几十年前,专门从事基因治疗和研究的人拥有强大的生物学背景就足够了。

现在,一种转变已经发生,扮演这一角色的个人需要同样舒适地在实验室工作或坐在电脑前。

数据科学有助于为患者选择最合适的治疗方法

免疫疗法包括增强免疫系统的干预措施,但一些现代方法结合了免疫疗法和基因疗法。在一个例子中,密歇根大学的一项研究表明,一种脑癌患者存活率很低,依赖于针对肿瘤的基因疗法和帮助对抗肿瘤的免疫疗法。

然而,免疫疗法会导致严重的副作用,并且应答率低,这意味着它并不适合每个患者。幸运的是,基因治疗的数据科学应用可以为患者的疾病创建基因突变谱并开发个性化治疗。然后,健康专家不太可能会推荐与免疫疗法或其他相关的无效治疗。

数据在临床试验招募中的作用

研究人员还对使用常规收集的数据(RCD)的潜力充满希望,例如包含在患者病历中的数据,以更好地确定临床试验的合适候选人和可能发挥最佳作用的治疗方法。众所周知,很难找到足够多的人参加临床试验,而基因治疗的规范加剧了这些挑战。

如果招募人员使用数据分析来缩小范围,并根据众多因素找到最有可能参与的人,他们可能会更成功地找到足够多符合标准的人,这样临床试验就会向前推进。

临床试验通常告诉研究人员如何集中他们的基因治疗努力,如果这些实验没有足够的参与者,它们就不会发生。依靠大数据工具可以增加找到愿意继续试验而不是退出的合适患者的机会。

大数据推进了人类基因组的研究

获得人类基因组的新发现曾经是一个极其耗时的过程。然而,多亏了大数据,科学家们可以了解到一些事情,如果没有这项技术,这些事情可能需要几个月或几年才能确定。

人类基因组有超过 20,000 个基因,每个基因有数百万个碱基对。科学家超越基因本身,发现它们如何相互作用。由此产生的大量信息意味着大数据是帮助遗传学家获得关于基因组的新发现的主要候选对象,进而促进基因治疗的进展。

在一项检查基因标记和基因表达之间联系的研究中,研究人员使用大数据分析工具将可能性从 9 亿缩小到 34 万

最新的基因治疗师是围绕数据成长起来的

基因治疗向更依赖数据分析的转变凸显了一些最新的基因治疗专家是如何习惯于使用数据的,甚至比他们的上级更习惯于使用数据。

他们自然会使用数据记录器来确保实验室或医院洁净室的环境条件符合最低标准,以满足合规性要求。

全世界有 160,000 台数据记录器在使用,数据分析师在评估与他们各自设施相关的信息方面发挥着重要作用。否则,研究人员可能不会注意到条件是否以可能损害患者安全的方式改变。

通过为学生提供结合生物学和信息处理的课程,如生物信息学,数据科学也正在改变基因疗法。这种演变表明,未来成功的遗传学家将至少对大数据有基本的熟悉。

大数据允许快速确定与疾病相关的基因组合

基因治疗的一个方面意味着评估患有已知疾病的人的遗传特征。然后,就有可能找出治疗这种疾病的最佳干预措施。

疾病会导致单个或多个基因突变。当使用传统方法时,发现与患者问题相关的所有基因组合非常耗时。

大数据平台,尤其是那些使用人工智能的平台,可以揭示最可能的组合,让研究人员在调查不同治疗方法的价值时节省时间。

基因治疗令人兴奋的未来

基因治疗传统上是一个昂贵而艰苦的过程,在为其他人提供实质性益处的同时,可能会给患者带来令人烦恼的副作用。

由于大数据平台和知道如何使用它们的人的影响,基因治疗的未来似乎格外有前途。

《卫报》食品食谱—主题建模

原文:https://towardsdatascience.com/the-guardian-recipes-part-2-lda-topic-modeling-51e5b13faefa?source=collection_archive---------39-----------------------

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

The Guardian Food Recipes by recipes from The Guardian

介绍

《卫报》的美食栏目邀请业余厨师探索无限的烹饪世界,接触新的食材和风味,学习烹饪技术或为庆祝盛宴寻找灵感。

在本系列的第一篇博文中,我告诉了你我对食物的热情和对数据科学的好奇。我向你展示了一些探索性数据分析,这些数据来自《卫报》最近 10 年每日发布的食谱。

本文的目的是参与主题建模。这种方法对于发现文档集合中出现的抽象“主题”非常有用。它允许快速理解一个长文本的含义,提取其关键字并对其内容进行分类。

你喜欢馅饼和果馅饼吗,你喜欢沙拉还是蛋糕,你喜欢鱼还是肉?到文章结束时,你就会知道该打电话给哪些《卫报》厨师专栏作家来为你的下一次晚宴做菜了!

如果你饿得等不到最后,你可能已经想看看这里的食谱*。*

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

The Guardian Food Recipes — Yotam Ottolenghi’s chilled cucumber and yoghurt soup (photo by Louise Hagger), Claire Thomson’s spiced filo pumpkin pie (photo by Jean Cazals), Meera Sodha’s mee goreng (photo by Louise Hagger), José Pizarro’s clams ‘a la plancha’ (photo by Martin Poole), Henry Harris’ roast partridge and spiced blackberries (Ola O Smit), Nigel Slater’s figs with pistachio biscuits (photo by Romas Foord)

数据和方法

在从《卫报》收集了 7361 篇食谱文章后,最早的一篇可以追溯到 2009 年 1 月 3 日,最近的一篇是 2019 年 6 月 16 日,我首先清理了 Python 笔记本中的文本数据。

执行主题建模需要一些预备步骤。这些步骤包括文本数据的格式化:标记化、停用词去除以及词条化。关于这些步骤的更多细节,请看来自苏珊李文章

不同的技术可以用来做主题建模。在这篇文章中,我选择使用潜在狄利克雷分配 (LDA)。为了更好地了解 LDA 是如何工作的,你可以阅读大卫·m·布雷和艾尔的原始研究论文。或者从费利克斯回复来一篇更容易理解的文章。Greg Rafferty 关于哈利波特的系列博客文章也是一个很好的资源。

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

Fiona Beckett’s Wine Selection for Seafood (photo by The Picture Pantry), Yotam Ottolenghi’s tomato with lime and cardamom yoghurt (photo by Louise Hagger), Vicky Bennison’s cappellacci with pumpkin, Jeremy Lee’s bloody mary (photo by Martin Poole), and Anna Jones’ roast peaches with vanilla and thyme.

食谱主题建模

下表和图表显示了 Gensim LDA 模型的结果。所采取的预处理步骤是:

  • 选择 LDA 模型。这里我用了 Gensim(变分贝叶斯采样)和 Mallet(吉布斯采样)。
  • 确定题目的数量。在可视化了主题数量的模型一致性分数之后,我决定用 24 个不同的主题来训练模型。Gensim 的最佳一致性分数为 0.48。
  • 根据模型输出的前 10 个关键词,为 24 个潜在主题中的每一个指定一个主题名称。
  • 计算一些对《卫报》食谱贡献最大的厨师的主导话题。

以下见解值得半信半疑!Gensim 和 Mallet 的 LDA 模型在大多数情况下都有成熟的果实,但也有一些酸味。因此,我选择只选择与柔软多汁的水果相匹配的食谱文章,而忽略另一篇。这意味着,在我收获的所有食谱中,大约有 20%被搁置一旁(在下表中,这个主题被归为“其他”)。

主题建模,主题名称

Mallet 模型的结果可以比作食谱的成分。食材是关键词,菜品是文档。

有些话题或者你喜欢的菜式很容易识别。例如,关键字“饮料、葡萄酒、鸡尾酒、玻璃杯……”可以很快与链接到饮料和鸡尾酒的食谱相关联,类似地,“鱼、贻贝、鲑鱼、鱼片……”无疑指的是包含鱼的食谱。对其他人来说,需要多一点解读!如何看待以下配对?它适合你的口味吗,或者你会推荐别的吗?

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

The table gives an overview of LDA Mallet Topic Modeling results. The Topic Weight shows the probability of a document having a particular topic, the Topic Name shows the name assigned to the Mallet topic keywords.

菜谱厨师的主要话题

在第一部分中,我看到了这些年来对《卫报》食谱贡献最大的厨师。虽然每个厨师都喜欢从汤到坚果的一切,但他们通常根据自己的菜肴类型脱颖而出。通过查看他们所有的食谱可以注意到这一点吗?好吧,通过给每个食谱分配它们的主导主题,这可能会给我们一块美味的蛋糕!

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

Tiko Tuskadze’s apple, fennel and beetroot borscht (photo by Jonathan West), Thomasina Miers’ prawn bun cha (photo by Louise Hagger), Ken Yamada’s wild mushroom ramen (photo by Louise Hagger), Chad Parkhill’s negroni, and Mary Berry’s milk chocolate cake (photo by Ola O Smit)

在对《卫报食谱》贡献最大的作者中,奈杰尔·斯莱特、托马斯娜·迈尔斯、约坦·奥托林吉或安娜·琼斯值得一提。他们之间的区别是什么?如果你喜欢晚餐吃鱼或肉,或者你喜欢一碗汤配一块馅饼,你应该看看谁的食谱?

乍一看,结果似乎有点鸡肋!大多数厨师的食谱都是关于蔬菜、配菜或汤的。但是再咬一口,一些香料会变得明显。

海洋或牧场的爱好者,你可能会被奈杰尔·斯莱特、安吉拉·哈特内特或休·费恩利·惠汀斯托尔的肉类和鱼类菜肴所吸引。世界爱好者,你最好去 will Yotam Ottolenghi、Thomasina Miers 或 Anna Jones,品尝他们的咖喱和亚洲菜肴。

为了激起你的食欲, Nigel 的秋季菜单是一套舒适的菜肴,有南瓜、甜菜根、菠菜糕点、牛肋排和覆盆子千层饼。然而,安娜·琼斯提出了一些冬季沙拉或令人垂涎的威尔士蛋糕

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

The doughnuts charts show the three most famous men and the three most famous women chefs contributing to The Guardian. The doughnuts illustrate the percentage of their recipes belonging to each of the different categories.

没有一点甜点,用餐者就不完整!丹·莱帕德费莉希蒂·柯尔特鲁比·坦多大概是《卫报》最甜的厨师了。他们食谱的分类清楚地表明,他们是糕点、蛋糕和饼干的大师!所以,如果你想成为下一届英国烘焙大赛的一员,你应该喜欢阅读这些作者的作品!

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

The doughnut charts show the three most famous chefs writing recipes for baking. The doughnuts illustrate the percentage of their recipes belonging to each of the different categories.

节日菜肴,异国情调的饭菜,或节日饮料是同样重要的其他膳食!雷切尔·罗迪、米拉·索达和亨利·丁布尔比对此了如指掌!如果你一直想去意大利,品尝传统的意大利面食,瑞秋·罗迪会告诉你一切。如果你更喜欢向东旅行,进入一个丰富多彩的辛辣世界,那么 Meera Sodha 将带你穿越咖喱、dal、mee goreng 和 bahn mi 的世界。如果你需要什么东西来让自己开心一点,那么亨利·丁布尔比可能有办法。

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

The doughnut charts show the classification of Rachel Roddy, Meera Sodha and Henry Dimbleby’s recipes. The doughnuts illustrate the percentage of their recipes belonging to each of the different categories.

结论

本文探讨了 2013 年 1 月至 2019 年 6 月《卫报》发表的 7361 份食物食谱的 LDA 主题建模。研究表明,LDA 主题建模是深入了解英国名厨食谱的有用工具。然而,它也显示了一些局限性:一些食谱不能用 LDA 分类。

这部分是因为一些食谱文章提供了完整的菜单、配菜、主菜和甜点。但这也是因为烹饪可以被认为是一个“话题”:剁碎、切片、切割、剥皮、加热都是用来制作令人垂涎的菜肴的技术。不知道它们是否适用于苹果、西红柿或一些土豆,仍然很难知道你最后会吃甜点还是沙拉!

如果你有兴趣看我的预处理步骤,我是如何挑选,清洗,切碎,调味并最终整理众多数据的,你可以在这里看看我的 GitHub 资源库!点击查看上的互动可视化!

感谢阅读!奥德

洗碗前!

我希望你喜欢这篇文章,如果你想留下任何意见,建议或想法,我真的很感激!所以,请随时伸出手来!

在下一篇博文中,我的目标是使用单词云,并可视化多年来、各个季节以及每位厨师使用的顶级食材。

我是 数据和植物科学家 垂直未来 ,先前在WBC SD。理学硕士。在城市分析和智能城市方面,来自 UCL 的 Bartlett 伦敦的 CASA 和 BSc。在食品科学中从 苏黎世联邦理工学院 。对城市、美食、健康充满热情通过TwitterLinkedIn联系。

作为营销领域的数据科学家,困难之处在于

原文:https://towardsdatascience.com/the-hard-things-about-being-a-data-scientist-in-marketing-b74365686b11?source=collection_archive---------19-----------------------

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

提示:不是代码。

大多数数据科学家的工作描述越来越多地要求技术技能,涵盖机器学习、编程、工具和统计知识等领域。候选人通过在简历中加载数据科学词汇中的每个已知术语来不断赶上这些要求,以提高匹配的机会,讽刺的是,这是由机器学习驱动的程序完成的。

在我作为这一行从业者的有限经验中,我发现最难完成的任务不是选择建模技术或编写适合模型的代码,也不是可视化所获得的结果。这是一套不同的能力,可以创造或破坏一个项目的成功机会。

那么,作为一名营销数据科学家,我所指的困难是什么?

构建业务问题

对于那些已经从事这一行业一段时间的人或者一般的开明人士来说,这可能听起来很明显。然而,很容易与企业主一起启动项目,而不会问这样的问题:

  • 假设是什么?
  • 最终的用例是什么?
  • 根据这一分析,我们可以提出什么建议?

品牌经理、策划人和战略家通常会提出具体要求。对他们来说,背景、业务目标和获得答案的关键路径可能是清楚的。也可能不是。在任何情况下,提取上下文、重复和捕获业务问题,并在整个项目执行过程中将其用作指南,是数据科学项目成功的最关键步骤。至少,它最大限度地减少了产生不相关内容的机会。最好的情况是,这样做极大地提高了工作的影响力。这就造成了“哦,谢谢,很高兴知道”和“这真是太棒了!我们在这里学习新事物”这种回答。

收集数据

新产生的数据科学家有时认为,用来建立模型的完美数据是一个 sql 查询,或者就存在于电离层中,可以使用 API 下载,或者是教授在必须上交作业之前通过电子邮件分享的东西。从数据质量的角度来看,营销和消费者洞察是分析师工作中最具挑战性的领域之一。我很确定当我说这些的时候,我有点自我伤害,但是我有很好的理由。

原因一:数据在哪里?

与受控研究项目和调查不同,数据管道的所有者通常不是营销职能中的数据用户。如果你幸运的话,你可能和他们坐得很近(像我一样),但仍然有不同的优先事项。如果你运气不好,你可能正在处理每月一次的整合数据——所以你一年可以得到一个品牌的 12 个数据点!祝你好运,带来令人敬畏的见解。如果你真的很不幸,你会听到一个浮动的神话,即你的项目的完美数据存在,但被深埋在客户端企业宇宙的一个被遗忘的部分(通常是第一方数据捕获者),并将需要 200 封电子邮件和大量的游说才能获得。不,我不是愤世嫉俗。当你加上这种领土意识、公司筒仓和人类对珍贵物品的占有欲,这个问题就变得非常现实。

原因 2:层次结构和分类法

营销用例需要将来自各种来源(第一方与第三方、实时与历史、调查与广告服务器等)的数据整合在一起,这些数据往往没有万能钥匙。营销世界中也没有通用的分类法,允许我们跨各种数据集进行连接——从部门到顶级类别到子类别,再到品牌变体和子品牌——每个数据供应商/内部团队都遵循不同的惯例,这些惯例并不明确适合需要将这些数据集结合在一起的用例。没有一个单一的类别、品牌及其产品等级的提供者,因此,没有一个关于如何比较两个事物的单一定义。两个品牌在性能指标上进行比较的背景只能与你作品的使用者达成一致。这是可以避免的,通过确保“什么是可比的?”被仔细记录。这意味着大量的项目组织工作和时间花费在重新聚集数据集以计算指标上。有时可能需要几天、几周甚至几个月。你唯一能做的就是从时间线的角度保持务实。这让我想到了作为一名数据科学家的下一个难题,尤其是在营销领域。

合适的时机和范围

我称之为“分析的流沙”。这又回到了完美与实用之间的冲突!试图产生与业务相关的见解,在充满压力的办公室环境中使用不太完美的数据集与时间赛跑,在这种环境中,数据科学家的声音通常是最低分贝的,这本身就是一项重大挑战。在这种情况下,运用判断力并与其他利益相关者沟通,以了解你需要将工作进行到何种程度才能产生影响,这一点至关重要。回到那句格言,合理的时间近似值比来得太晚的完美答案更有价值。有助于避免分析流沙的一些技巧:

  • 在追踪过程中,始终关注原始问题和用例,并根据获得答案所需的内容减少数据量
  • 定义项目的下钻结构,即基于每个分析阶段发现的决策树。虽然这听起来完全不需要动脑筋,但这是我们经常忽略的事情。结果是,过多的时间花在了探索线索和分支上,这并不能帮助我们更好地回答业务问题。一个简单的思维实验,大概是这样的:
  • (a)你希望在高层找到什么?(b)根据顶级调查结果,您应该深入了解什么?如果发现与假设不符会发生什么?(d)何时改变轨道或停止项目?
  • 如果不是在最开始,在最初的数据探索之后,根据与业务所有者讨论的范围,为分析准备一个框架演示或故事板。

当然,还有其他困难的事情,如选择正确的分析框架、模型和统计技术、参数调整、解释结果、编码过程中的挑战、使用无数的 API 和复杂的 SQL、对不适合内存的大型数据集进行缩放、输出的仪表板、制作可重用的代码、使用 linux 命令行等。等等。对于所有这些,有参考书、博客、公共 git repos、导师、ML APIs 和 bootcamps。但对于我之前提到的事情,经验、判断和优秀的管理者是关键。我对想在营销行业发展的数据科学家的建议是:不断更新编码和技术技能,但更重要的是,开始说营销语言,学会问正确的业务问题,练习在组织结构中工作,以识别和获得正确的数据。这些经常被忽视的技能在现在会更好地为我们服务,但更重要的是从长远来看。同意吗?

数据科学最难的部分?数据。

原文:https://towardsdatascience.com/the-hardest-part-of-data-science-data-1877a5cd30d7?source=collection_archive---------25-----------------------

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

Photo by Tim Gouw on Unsplash

数据科学不是,也从来不是关于模型的。

在过去的十年中,数据科学突破了所有的噪音,成为现代技术的支柱之一。现在,基于历史数据进行预测的能力推动了几乎所有新产品、商业计划和处于行业前沿的组织。

这些功能是随着预测模型(能够“拟合”(学习)历史数据的算法)的采用而引入的。因此,毫不奇怪,在选择和训练模型的过程的自动化、精简化和民主化方面已经投入了大量的工作。

从商业机器学习工具到开源库(像 Sklearn、Auto-Sklearn、TPOT 等。),前几年投入的工作使我们能够清楚地表明:

模特开始商品化

每个知道如何编写 Python 脚本的新手现在都可以训练一个模型。现在,每个拥有合适 Excel 插件的业务分析师都可以根据他们的财务数据训练一个回归模型。我,我自己,在学习 Python 的两个月内就能训练出一个成功的模型。

训练模型,尤其是复杂的模型(例如梯度增强树),在十年前可能是一个挑战,但自那以后发生了很多事情:

  • 成熟、高效且易于使用的开源建模库获得了巨大的吸引力(如 Sklearn、XGBoost、CatBoost 等)。)
  • 可用的计算能力显著提高
  • 像 Python 这样易于编写的语言开始占据主导地位
  • 大数据和云基础设施取得了进步
  • 围绕数据科学和机器学习的开放和可访问的知识和学习材料变得可用

训练一个复杂的模型现在只需要几行代码和很短的计算时间。

在我们继续之前,快速声明:在本文中,我将重点关注涉及表格和/或半结构化数据的经典数据科学问题。我的观点不适用于计算机视觉/音频用例。

数据科学的核心挑战

这与算法无关,而是要给它们提供正确的数据。

今天,当将数据科学应用于商业问题时,几乎没有人发明新的算法(同样,不一定适用于计算机视觉/音频和 NLP 用例)。十多年来,我们一直在使用相同的模型。梯度推进树(XGBoost)在上个世纪被引入,支持向量机在 20 世纪 60 年代被引入,线性回归……可能在公元前 1000 年左右。

数据科学与任何其他从新技术中产生并影响社会的职业没有什么不同。它继续发展,为复杂的问题和挑战打开了无尽的大门,一个比一个更令人兴奋。然而我们继续使用同样的模型。Kaggle 竞赛的获胜者通过使用 30 岁的模特来登上排行榜的榜首来证明这一点。如果 30 岁的模特正在赢得比赛,按理说这些模特不是“X 因素”的来源。

事实是,数据科学一直专注于试图从最新的算法中产生商业价值,以至于我们错过了最重要的部分:数据科学不是,也从来不是关于模型的。

假设大部分建模都是商品化和自动化的,那么构建一个强大而准确的预测系统的下一个挑战是什么?究竟是什么让一个模型成功?

将“数据”纳入数据科学

我们都听说过“垃圾进,垃圾出”这句话如果我试图训练一个模型,根据一个人名字中的字符数来预测信用违约,我可能会成功地让模型工作(训练和预测),但模型基本上是随机猜测的。

为了决定一个数据科学项目是否会成功,我们需要问的主要问题是并且永远是:我们是否有正确的数据来训练一个模型来解决我们试图解决的问题?

“正确的数据”可以分解为多个子问题:

  1. 我们是否有正确的数据属性,以便我们的模型可以推断出现实的模式和规则?
  2. 我们有足够的样本来训练模型吗?
  3. 在将数据输入算法之前,我们是否以正确的方式设计(整合、聚集、转换)了数据?

说到工程……斯坦福大学教授吴恩达准确地说:

“…应用机器学习基本上是特征工程。”

吴教授所说的“特征工程”是什么意思

由于该领域的争论,围绕不同术语的含义出现了一些混乱。我建议我们将特征工程分解成两个部分:

  • 特征生成:初始阶段,我们搜索数据以生成特征。我们汇总、应用业务逻辑,并将多个来源纳入每个样本的一个数字属性矩阵。
  • 特征标准化:归一化、缩放、插补和编码。我们对特征集进行转换,使其对模型更具“吸引力”。这些通常与模型相关。例如,虽然决策树可以很好地处理原始的、未缩放的数字特征,但线性模型通常需要正确的插补和缩放(例如,单位方差和零均值)。

我认为功能标准化正在走一条与模型相似的道路。与模型商品化的方式相同,功能标准化也可以商品化。就像 autoML 技术一样,您可以使用不同的标准化技术遍历不同的模型,直到您找到性能最佳的组合。与要生成的可能特征的搜索空间不同,标准化技术和不同模型的不同组合没有我们想象的那么大。

为了说明我的观点,下面是我用特征标准化技术自动选择模型的伪算法:

给出一系列可能的特征标准化方法,如缩放和插补方法(均值插补、单位方差缩放、PCA 等)

并给出了可能的模型列表(线性回归、SVM、有 100 棵决策树的 XGBoost、有 1000 棵决策树的 XGBoost……)

用随机预处理器和随机模型生成实验。

经过几次迭代后,选择最佳实验。

很明显,这并不像我提出的那么简单。参数空间大,组合数量应该有限——但这不是火箭科学。有很多工具在这方面做得很好(比如 Auto-Sklearn 或 TPOT)。随着计算能力变得越来越便宜和可用,这只会变得更容易。

然而,特征生成并不在同一个地方。

特征生成的艺术

今天,主流数据科学更多地采用艺术方法而不是科学方法来生成特征。它相信人类数据科学家会为功能想到正确的想法,找到正确的数据源,了解如何将它们集成在一起,了解聚合和转换数据的正确方法,并在最终的功能之间生成交互。

因此,我将有点粗鲁地把吴教授的说法改为:

“…应用机器学习基本上是特征生成。”

生成特征时没有通用准则可循的原因很明显:潜在相关数据源(组织内部和外部)的数量太大。你可以想出无限多的方法来生成特征。

如今,所有试图“自动化数据科学”的工具都将生成高价值特征和信号以馈入模型(和标准化技术)的任务留给了我们人类。鉴于我们不像机器那样擅长探索搜索空间,我们错过了很多东西。

有无数的数据可能与我们试图解决的每一个用例以及我们试图建立的模型都相关,但最大限度地发掘其潜力是不可行的。

当一家银行只根据一个人的历史交易记录建立信用违约模型时,他们做得好吗?如果那个人刚读完一个大概率找到高薪工作的学位怎么办?

当零售商根据历史销售和促销活动计划促销日历时,他们做得好吗?如果假期过后人们不介意支付更高的价格呢?

冒着在本文中使用太多术语的风险,重要的是要记住数据实际上是新的石油。然而,当我们审视数据科学工具和技术的当前状态时,我们经常会发现算法工具是从数据工具中分离出来的。我们在与模型相关的任务方面取得了很多进步,但仍有数量呈指数增长的数据在很大程度上被忽略。

自动化特征生成和数据发现

我相信,解决模型构建过程中的数据部分将为我们周围的企业和产品带来无尽的价值。如今,这是所有类型组织的主要瓶颈。

如果一家具有前瞻性思维的大型公司试图将数据科学扩展到不同的功能和用例,它很快就会发现,没有足够多的数据科学家能够通过不同的功能和数据源进行编码。如果一家公司希望获得相关的数据源来改进现有的模型,它可能会为测试一个新的数据源(假设、匹配和集成、聚合和生成特征)而不得不做的大量人工工作而感到头疼,这只是为了确定它是否确实改进了一个预测模型。如果一家公司没有无限量的数据,他们将需要越来越努力地寻找更好的数据,并产生高价值的功能。

所有这些障碍都可以通过在构建模型的上下文中自动执行探索数据源和生成要素的过程来解决。

现在,随着越来越多的自动化进入数据科学,我们都在问这个问题:这将取代数据科学家吗?号码

将业务问题转化为“数据问题”总是需要数据科学家,以了解什么是正确的预测,定义问题的搜索空间,防止数据泄漏,并测试结果以确保它们有意义并可用于生产以影响业务。

是时候开始关注数据科学的数据部分了。我们的模型需要它。

你在数据科学面试中被问到的最难的问题

原文:https://towardsdatascience.com/the-hardest-question-youve-been-asked-in-a-data-science-interview-f3eb16b889cb?source=collection_archive---------20-----------------------

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

我在 YC 的一家公司工作,该公司发展了一个有趣的内部松散的数据科学家团队。这是一个私人团体,但最近在 Twitter 上引起了一些关注,我们认为如果我们发布一些我们在那里的对话,可能会对有抱负的数据科学家有所帮助。推特同意,所以这就是我今天要做的。

我将发布的第一个对话以我们的一位同事向社区提出的一个问题开始:在数据科学面试中,你被问到的最难的问题是什么?

(我在下面改了提问者的名字,但一些参与者友好地同意分享他们的全名和他们在线个人资料的链接。)

潘苏珊问道:

你在数据科学面试中遇到的最难的问题是什么?

我来分享一下我的:**“你有几年的 X 语言经验?”**这个真的很难回答:我在学术界用了多少年算不算?我会计算我在业余爱好项目中使用它的年数吗?我是否计算过我在工作中使用它的年数,但仅仅是 15%的时间?

我曾经决定回答这个问题,问面试官:“你能详细说一下吗?”我想面试官认为我疯了。

希望听到你最困难的问题,也许我们可以分享如何回答这些问题的建议!

Ray Phan 的回答:

下面是我的:“如果你不得不选择一个对你来说最困难的技术问题,请解释它是什么,以及你是如何解决它的?”

这很难做到的原因是,随着你的前进,它会让你对问题敞开心扉。他们可以决定对你的方法的每一部分进行多深或多远的调查。事实上,这是我在采访别人时经常问的一个问题。你可以很快确定某人是否真的知道如何解决问题,或者他们是否依靠了别人的帮助。

有趣的是,这是埃隆·马斯克在采访中问的唯一一个问题。(来源:我在申请特斯拉的自动驾驶项目时,他亲自面试了我。)

苏珊:

感谢分享!用这个问题,你是在测试候选人解决问题的方法,还是他们对技术概念理解的深度,或者两者兼而有之?

:

两者的混合物。

我想看看他们在处理一个相对未知的问题时的能力,他们在整个过程中学到了什么技能和方法,以及他们解决问题的能力,以确定他们是否成功地解决了这个问题。

通过他们回答我的后续问题的方式,以及他们与我分享的关于他们如何解决问题的详细程度,我很好地了解了他们是否可以独立工作,是否可以在团队中工作(当他们向我解释概念时,我会进一步挖掘),以及我是否会在一天结束时信任那个人。

这就是为什么我说这个问题很难的原因,因为它在一个问题中告诉了我关于这个人资质的几乎所有信息。

:

我现在的问题是:我可以告诉你我曾经面临的最困难的问题是什么,但是我必须承认我当时做得很差。真的很差。我意识到这是我展示成长的一个潜在的地方,但我最终必须首先承认我最初失败了。

如果你要采访我,你会欣赏我的诚实吗?或者你会建议我选择我曾经面对过的第二难的问题,也许是一个我做得不那么糟糕的问题?

射线 :

我希望你向我承认这一点,并告诉我为什么。成长也是我寻求的东西,如果你从中学不到任何东西,那么我不会雇用你——如果谈话中断,我会跳到第二个问题!

狮子座 :

公平。谢谢大家!我当然需要练习这些面试问题。

射线 :

我对我的学员进行的部分指导正是这种提问方式。我通常将其分成 4 组面试,以确保学员做好准备。

(1)预筛选
(2)技术契合度←我上面提到的问题到这里
(3)商业敏锐度
(4)文化契合度

我试着问一些他们不会想到的问题——这也是为什么我向他们强调不要准备我的模拟面试。

但是没错,练习!你的导师很有希望做我刚才说的事情。

完整的对话比这个要长一点,它得到了几个其他的答案。但雷的是我最喜欢的,因为他给出的面试问题迫使你设定自己的难度。如果你挑了一个太容易的技术问题,你可能看起来很糟糕;但是如果你选择一个太难的,你可能会弄糟它的解决方案,而且看起来很糟糕!所以你必须选择你很有把握能解决的最难的问题——这是问题的关键。

有趣的是,这是埃隆·马斯克在采访中问的唯一一个问题。那是我不知道的事情。

我在考虑将来发布更多这样的无聊对话。因此,如果你有兴趣看到本次对话中的其他答案(或看到其他人的答案),请在 Twitter 上联系我并告诉我。如果你有任何问题,我的 DMs 是开放的。

人工神经网络背后的数学

原文:https://towardsdatascience.com/the-heart-of-artificial-neural-networks-26627e8c03ba?source=collection_archive---------9-----------------------

像大脑一样的神经元和像心脏一样的数学

就像大脑由数十亿个高度连接的神经元组成一样,神经网络中的一个基本操作单元是一个类似神经元的节点。它从其他节点获取输入,并将输出发送给其他节点。—费·

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

image by Anastasia Dulgier

由于语音识别、计算机视觉和文本处理方面的许多突破性成果,人工神经网络在机器学习研究和行业中产生了许多兴奋。

在这篇文章中,我将关注神经元的基本结构,神经元如何工作以及神经网络背后的数学。

感知器

具有输入层和输出层的简单人工神经元称为感知器。

这个神经元包含什么?

  1. 求和函数
  2. 激活功能

给感知器的输入由求和函数处理,然后由激活函数处理以获得期望的输出。

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

Perceptron

这是一个简单的感知器,但如果我们有许多输入和巨大的数据,一个感知器是不够的,对不对??我们必须继续增加神经元。这是基本的神经网络,有输入层,隐藏层,输出层。

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

Neural network

我们应该永远记住,神经网络只有一个输入层,输出层,但它可以有多个隐藏层。在上图中,我们可以看到样本神经网络有一个输入层、两个隐藏层和一个输出层。

作为神经网络的先决条件,让我们知道什么是激活函数和激活函数的类型。

激活功能

激活函数的主要目的是将神经元输入信号的加权和转换成输出信号。并且该输出信号被用作下一层的输入。

任何激活函数都应该是可微分的,因为我们使用反向传播机制来减少误差并相应地更新权重。

激活功能的类型

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

image Source

乙状结肠的

  1. 范围从 0 到 1。
  2. x 的小变化会导致 y 的大变化。
  3. 通常用于二进制分类的输出层。

双曲正切

  1. 范围在-1 和 1 之间。
  2. 输出值以零为中心。
  3. 通常用于隐藏层。

RELU(校正线性单位)

  1. 范围在 0 和最大值(x)之间。
  2. 与 sigmoid 和 tanh 函数相比,计算成本较低。
  3. 隐藏层的默认功能。
  4. 它会导致神经元死亡,这可以通过应用漏 RELU 函数来补偿。

到目前为止,我们已经学习了感知机和激活功能的先决条件。现在让我们深入研究神经网络(神经网络的核心)的工作原理。

神经网络的工作

神经网络基于两个原理工作

  1. 正向传播
  2. 反向传播

让我们借助一个例子来理解这些积木。这里我考虑的是单一的输入层,隐藏层,输出层,使理解清晰。

正向传播

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

  1. 考虑到我们有数据,并希望应用二元分类来获得所需的输出。
  2. 取一个具有 X1、X2 特征的样本,这些特征将在一组过程中被操作以预测结果。
  3. 每个特征与一个权重相关联,其中 X1,X2 作为特征,W1,W2 作为权重。这些被用作神经元的输入。
  4. 神经元执行这两种功能。a)求和 b)激活。
  5. 在求和过程中,所有特征都乘以它们的权重,然后对偏差求和。(Y=W1X1+W2X2+b)。
  6. 这个求和函数应用于激活函数。该神经元的输出乘以权重 W3,并作为输入提供给输出层。
  7. 同样的过程发生在每个神经元中,但我们改变了隐藏层神经元的激活函数,而不是输出层。

我们只是随机初始化权重,然后继续这个过程。有许多初始化权重的技术。但是,你可能会怀疑这些权重是如何更新的,对吗???这将使用反向传播来回答。

反向传播

让我们回到我们的微积分基础,我们将使用学生时代学到的链式法则来更新权重。

链式法则

链规则为我们提供了一种寻找复合函数导数的技术,组成复合函数的函数数量决定了需要多少个微分步骤。例如,如果复合函数 f ( x )被定义为

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

Chain rule

让我们将链式法则应用于单个神经元,

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

Chain Rule

在神经网络中,我们的主要目标是减少误差,为了使之成为可能,我们必须通过反向传播来更新所有的权重。我们需要找到权重的变化,以使误差最小。为此,我们计算 dE/dW1 和 dE/dW2。

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

Change in Weights

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

Backward Propagation

一旦你计算出与误差有关的重量变化,我们的下一步将是使用梯度下降程序更新重量。请点击查看关于梯度下降的更多详情。

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

New weights

对于所有样本,前向传播和后向传播将是连续的,直到误差达到最小值。

包扎

在这里,我们了解了什么是神经元,神经网络如何工作的基础知识。但是,这还不够,在更新权重时还存在许多问题,如神经元死亡、权重超出范围等。我将发表一篇新文章,讨论激活函数面临的挑战以及如何减少神经元以减少训练错误。

参考

链式法则,克里夫笔记,https://www . cliffs Notes . com/study-guides/calculus/calculus/the-derivative/chain-Rule

希望你喜欢它!!!敬请期待!!!请对任何疑问或建议发表评论!!!!

鸡尾酒的隐性成本

原文:https://towardsdatascience.com/the-hidden-cost-of-cocktails-8763340c7db7?source=collection_archive---------20-----------------------

鸡尾酒不仅仅是高端烈酒、新鲜果汁和异国情调的配料——时间和机会成本也很重要。

在以前的博客文章中,我已经讨论过在【Jupiter Disco】自动化我们一些日常工作流程的过程,特别是 解析我们的日常销售报告 产品组合报告 到 Google Sheets。此后,我在 Google Apps 脚本中添加了一个集成,将数据加载到位于 Google CloudSQL 实例中的 MySQL 数据库中,并通过Stitchbig query中复制。虽然数据管道和架构仍然是一项正在进行的工作,但在这一点上,我已经有足够的东西可以挖掘,并开始使用 SQL、Python 和统计数据挖掘一些见解。

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

关于酒吧

我想预先声明,酒吧是神奇的和必不可少的。它们是无脚本生活的最后堡垒之一,我这个正在进行的项目的目的是帮助我的酒吧和其他人在数字时代繁荣发展。技术既是颠覆性的,也是变革性的——如果我们能够将网飞和堡垒之夜消耗的一小部分技术带宽应用于我们的小实体空间,也许我们将有机会与这些晚期资本主义的庞然大物对抗,至少在我们都试图进入黑太阳之前是如此。

还有鸡尾酒

*“我可以在同样的时间内卖出 10 杯伏特加苏打水,利润却更高,为什么还要提供鸡尾酒呢?”*烦人的酒吧老板

恼人的酒吧老板当然在技术上是正确的,就像大多数经济学家对经济阴谋的理论是正确的一样。但是,酒吧,就像它们所在的经济一样,是由人建造、经营和消费的,而人们,在他们所有不可预测、有创造力和古怪的荣耀中,并不总是想要伏特加苏打,有时他们不知道他们想要什么,很多时候他们喝的其实并不重要,但他们确实喜欢在大块冰块上提供精心制作的鸡尾酒。只是不太甜。

鸡尾酒规则。真正伟大的鸡尾酒酒吧提供的菜单是异想天开的、怪诞的、复古的、创新的和永恒的——一种有形的、可消费的展示,如果欧格斯·兰斯莫斯被指定指挥《沙丘》,而 DJ 巴士替换服务负责音乐监督,《沙丘》( 2020)看起来会是什么样子。我不相信任何鸡尾酒已经突破到“真正的艺术”领域,但有些至少已经达到了沙丘(1984)的地位,这不是什么。因此,让我们深入研究这些数据,梳理出一些“可操作的见解”。

建立

这是 Jupiter Disco 年初至今的产品组合,第一张图表基于销售额:

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

Jupiter Disco Product Mix YTD — Sales

因此,在一个高层次上,Jupiter Disco 年初至今的销售额中有 40.8%属于酒类,这代表了 highballs(前面提到的伏特加苏打、杜松子酒和威士忌姜汁饮料等)、shots 和直饮。另外 26.8%是鸡尾酒,包括经典鸡尾酒和家酿鸡尾酒,25.2%是啤酒,包括生啤酒和罐装啤酒。

根据销售量,产品组合看起来有点不同——注意,鸡尾酒占美元收入的百分比从 26.8%上升到占销售量的百分比 17.8%。

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

Jupiter Disco Product Mix YTD — Quantities

我们卖很多 5 美元的 Narragansetts。虽然 13 美元的鸡尾酒不多,但总的来说,我们的鸡尾酒收入略高于啤酒收入。

在我们继续之前:酒吧有许多不同的形式和格式。Jupiter Disco 是一个 1000 平方英尺的鸡尾酒吧/舞蹈俱乐部,周末通常会达到其有限的常设允许容量。这是一种完全不同于只有座位的鸡尾酒吧的形式,鸡尾酒吧本身也是一种完全不同于“提供真正美味鸡尾酒的社区酒吧”的形式。我们都是不同的,所以你的里程可能会有所不同。

问题

那么经营一家裹着夜店的鸡尾酒吧有什么影响呢?首先,我们必须花更多的钱来维护我们的音响系统:

但另一个原因是,我们在高音量环境下提供合适的鸡尾酒,而这些鸡尾酒需要时间来调制。我们能量化那段时间的成本吗?

编码时间到了

在查询我们的数据库并做了一些清理后,我的数据帧如下所示:

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

所以每一行代表每天每种产品的数量和总销售额。该数据集有 12,341 行(实际上是 2019 年年初至今),我可以使用df.pivot_table().apply()方法将这些行聚合并转换为百分比,添加一个包含星期几的列,合并为“鸡尾酒”和“非鸡尾酒”,并过滤数据帧,只显示周末:

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

此时,我会将其与包含每日净销售额的数据框架合并,并准备好一个完整的数据框架,包含总共 84 行(2019 年的每周五和周六晚上)。

为了为下一步分析做好准备,让我们来看看一年中鸡尾酒总量百分比的平均值、标准差、范围和四分位数:

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

因此,在周末,我们的平均鸡尾酒百分比为 16.0%,您会注意到这略低于整体(包括全天)的 17.8%。

相关

让我们看看鸡尾酒和非鸡尾酒百分比与净销售额之间的相关性:

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

这很有趣。看起来我们的鸡尾酒百分比与净销售额呈负相关,相关系数为-0.38。对此的一种解释是,当我们在周末销售鸡尾酒与非鸡尾酒的比例较高时,我们的销售额会较低。虽然相关性并不意味着因果关系,事实上我们客观地知道鸡尾酒比罐装啤酒需要更长的时间来制作,我们可以怀疑鸡尾酒的价格溢价是否没有完全捕捉到制作一杯鸡尾酒所需时间的机会成本。

我们的周六比周五更忙,这种关系甚至比周五更牢固:

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

让我们计划周末:

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

Net Sales on the Y-Axis, Cocktails as a Percentage of Total by Quantity on the X-Axis

-0.38 不是一个很强的相关性,但它是中等程度的,并且在上面的散点图中可以看出这种模式。我们还可以看看一年来的关系:

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

Net Sales (Blue) versus Cocktails Percentage of Total by Quantity (Red)

很明显,我遮住了左边的 Y 轴,因为这篇文章的目的不是在互联网上大肆宣传 Jupiter Disco 的销售,希望你们都明白。

统计显著性

为了尝试量化影响,我将该数据集分为两个样本集:(1)低鸡尾酒百分比,代表低于中值鸡尾酒百分比 15.9%的 50%的数据,以及(2)高鸡尾酒百分比,代表上述数据的 50%。

查看每个样本集的统计数据,低鸡尾酒百分比组的平均销售额比整体平均值高 5.3%,高鸡尾酒百分比组的平均销售额比整体平均值低 5.3%,根据我们销售的鸡尾酒百分比,这似乎是一个相当大的波动。

有统计学意义吗?

在我们进行测试之前,让我们把问题恰当地组织起来。我们的无效假设是,高比例的鸡尾酒不会对销售产生负面影响。我们的另一个假设是,高比例的鸡尾酒确实对销售有负面影响。让我们将显著性水平设置为 0.05,并进行 t 检验,以评估我们是否可以拒绝或无法拒绝我们的零假设。

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

因此,p 值为 0.01,看起来这两个平均值之间的差异确实具有统计学意义,我们可以拒绝零假设。

现在该怎么办

量化运行鸡尾酒计划的成本是困难的。数据中无疑有很多噪音。人群会发生变化,一个晚上的总人数会随着时间的推移而变化,而且会有员工流动。鸡尾酒本身也会改变。

但看起来这个数据中确实有一点信号,这意味着鸡尾酒价格溢价并没有完全捕捉到生产时间的机会成本(这里的机会成本是调酒师可能出售伏特加苏打水的时间)。如果我们不想提价(我们确实不想),这意味着我们必须重新审视制作鸡尾酒的构建和流程,看看我们是否可以节省一些时间,让它们更快地出来。

从高层次上来说,我希望这篇文章能帮助你理解鸡尾酒比高杯酒更贵的原因之一。不仅仅是杯子里的成分。花在搅拌鸡尾酒上的每一分钟都不是花在倒啤酒和饮料上的时间,在繁忙的夜晚,这些时间会累积起来。这还是在我们开始考虑每种鸡尾酒的研发成本、培训时间以及所有其他进入其真实成本的因素之前,无论是否明确说明。

希望你喜欢。

写作分析的隐藏宝石

原文:https://towardsdatascience.com/the-hidden-gems-of-writing-analytics-6db78fad5a51?source=collection_archive---------29-----------------------

我对有志成为数据初学者的建议

这是我在谷歌工作、吸引被动收入、激励数据初级人员以及更多事情的黄金入场券

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

Source: Unsplash

4 年前,也就是 2015 年,我成为新加坡管理大学(Singapore Management University)首批参加分析专业化考试的学生之一。

尽管最初有大量学生涌入尝试这些专业,但许多商科学生发现它们很难,于是辍学了。他们是突然面临编码和分析思维困难的商科学生。由于课程仍然很新,帮助他们弥补学习差距的支持数量很少。

因此,作为一名分析爱好者,我发现了一个我可以做出贡献的差距。

“我如何帮助我的下级(具有商业背景)更好地学习数据分析?”

我认为这将是我学习的一个很好的机会,同时也能帮助我的学生学习分析。

写作和教学是最重要的

我是如何开始的:构建价值投资工具

我意识到,许多苦苦挣扎的学生转而学习金融和股票分析,因为他们希望在知名公司工作。因此,我决定我的第一个目标是构建对他们重要的分析应用程序。在当地投资俱乐部的帮助下,我开发了一个分析工具来快速提取和处理相关的财务比率

构建和教授重要的解决方案

随着它变得成功,我进一步教我的低年级学生更多的学习用例。对于运营管理的学生,我教他们线性和整数优化(LP & IP) 。对于市场营销专业的学生,我教他们 Twitter 情绪和社交媒体分析

结果是成功的;我收到了我的学弟的笔记,他用我的代码来开发 Twitter 情绪仪表板。然后,我产生了足够的兴趣,促成了一个非正式的社区,供商科学生学习分析。我在 Github 上预订了小自习室来方便我的项目。

在 Youtube 上教授分析

很快,我有了一个为 SMU 商业情报和分析俱乐部(BIA) 起草课程的计划。我开始在 Youtube 上教学,这让我可以推广我的频道并大规模地回顾我的教学。几个月后,我的通道被用作 SMU·BIA 教授他们学生的创世课程。

“帮助我的学生更好地学习数据分析”…等等

半年之内,我在媒体上发表了 30 多篇关于我的侧面分析项目的博客,并获得了 800 多名关注者。这证明了许多潜力为需要指导的有抱负的数据科学家增加了价值。

编写数据分析背后隐藏的 5 颗宝石

我想和你分享写分析如何通过 5 个隐藏的宝石帮助我成长为一名有能力的数据科学家:职业、灵感、收入、可信度和价值。

职业:它让我进入谷歌

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

Inviting Singapore Institute of Management (SIM) Society of Mathematical Sciences Org Comm to Google

正如你从我最近的文章中所知道的,我被谷歌挖走了。谷歌是拥有最聪明员工的顶级公司之一。怎么可能 Google HR 猎头我?难道他们不应该已经有很多非常合格的申请者求着走进他们的大门吗?

答案很有意思,因为我恰好是特例之一。在谷歌,有两种常规的招聘方式:推荐和直接申请。我两样都没做,反而被猎头挖走了。

那么我是怎么被猎头挖走的呢?

我的 HR 告诉了我一个简单的答案:我是 LinkedIn 的顶级推荐。

我很惊讶,因为我从来没有定期更新我的 LinkedIn。有很多数据科学家和机器学习工程师把他们的 Linkedin 个人资料装饰得比我好。那么我为什么要做置顶推荐呢?

在深入研究了 Linkedin 的数据之后,我意识到我的关于数据科学的文章在我的 Linkedin 上吸引了大量的流量。你们中的许多人与我联系,询问数据分析方面的建议。因此,你是我进入谷歌的事实!谢谢大家!

同样,我鼓励你分享你的知识。它会让你以你永远无法预见的方式获得更好的机会。

灵感:它给了我学习数据科学的意义

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

Source: unsplash

“你是世界之光。建在山上的城镇是无法隐藏的。人们也不会点灯放在碗下。取而代之的是,他们把它放在灯架上,它给房子里的每个人都带来了光亮。你们的光也当这样照在人前,叫他们看见你们的好行为,便将荣耀归给你们在天上的父。——马太福音 5:14–16

我真的很喜欢看到学弟学妹的成长。我喜欢学习和教育他人。最重要的是。我喜欢给我的后辈梦想。我总是邀请他们去 Google office 吃午饭,和他们分享我的经历。我很高兴了解并收到反馈,我所做的对他们很重要。我们在世上的时间是有限的,所以我决定尽我所能成为世上的盐和光,来荣耀我们在天上的父。

这成了我花很多时间自我教育的动力来源。尽可能多的学习,教育别人,成了我的灵感。尽管我有很多不完美之处,但我很高兴分享我在学习和成为一名更好的数据科学家方面的努力。我学的越多,我教的就越多。我教的越多,学到的越多。

同样,我希望你能找到学习分析的主要原因,并与世界分享。这将成为你继续深入分析世界的灵感

收入:它给了我学习的自主权

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

Source: Unsplash

在《走向数据科学》写作也给了我一笔不错的收入。最初,当我第一次成为媒体合伙人作家时,我很高兴一个月能收到 10 美元。但是现在,随着我的粉丝越来越多,我每写一篇好文章就能赚 300 美元。

这证明了写作的复合收益是公司环境所不具备的。今天,我通过 Google Home 和 Medium 应用程序将我的文章推广给了成千上万的观众。在 6 个月内,我看到我每月的写作收入呈指数增长。

此外,在媒介上写作的最大好处是你可以得到美元报酬。我来自一个货币疲软的国家(印度卢比和新加坡元),我从我的中等收入中获得足够的金额。

这打开了许多可能性的大门。你会更少地依赖你目前全职工作的收入,反而会更擅长你所做的事情。

可信度:它让我找到更好的学习和教学机会

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

My Analytics Journey sharing at National University of Singapore (NUS)

写作给了我说话和学习的机会。顶尖大学、公司和分析聚会邀请我分享我对某些主题的想法。

写文章给了我的听众一个可信的平台来检验我的意识形态和思想。这让他们确信我的想法与他们的目标一致。

同样,写作也让我对我工作的公司更有价值。我在很多活动中都代表过 Visa 和 Google。这种可信度也让我可以向 Visa 和谷歌申请教育补助,在 omsc 攻读硕士学位。

同样,我想鼓励你开始教授数据分析。这将有助于你在未来提升自己的声誉,成为一名更有意义、知识更丰富的数据科学家。

价值:找到你写作和教学的声音

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

The joy of growing with SMU BIA Club

我还记得当我在大学的时候,SMU·BIA 真的很小。为了重振俱乐部,我和我的朋友预订了小房间,录制了 Youtube 视频,为我们的低年级学生教授简单的课程。很快到了现在,组委会已经发展到 20 人,他们的每一次活动都有人出席。SMU·BIA 给我上了一课,我一直很感激:即使我的知识和时间有限,我也能帮助别人。

我很高兴我的作品做到了这一点。你们中的许多人在 Linkedin 上与我联系,分享我的作品如何为你们的生活增添价值的故事。

我找到了自己的声音,你也可以。

结论:开始写你的故事

“你拥有发生在你身上的一切。说出你的故事。如果人们希望你热情地写他们,他们应该表现得更好。”安妮·拉莫特的《一只鸟接一只鸟》

如果你害怕开始,那么请记住安妮·拉莫特的这句话。我个人建议看这本书,有更好的心态去写自己的想法。

虽然在你的机器学习知识中保持聪明和技术是好的,但在你的发现中加入一些个人色彩也是有益的。毕竟你的故事是属于你的。好好分享一下:)

作为一名作家,另一个艰难的时刻是当你面对拒绝的恐惧时——T2,骗子综合症。但是你可以慢慢克服这些障碍,从小事做起,一只鸟一只鸟地写你的文章*。*

开始写吧,希望你会有收获:

  1. 职业:写下你的想法,为更好的机会做准备。
  2. **启发:**找出你为什么学习分析学,站得高。
  3. **收入:**拓展机会写出世人看重的东西。
  4. **可信度:**为你设立基金会,检验你的意识形态。
  5. **价值:**找到自己的声音,写作启发。

索利·德奥·格洛丽亚

最后…

我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。

请在下面的评论提出建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。

谢谢大家,编码快乐:)

关于作者

Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验

Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。

他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。

文森特还在 10 日至 8 日开放了他的一对一导师服务,指导你如何在谷歌、Visa 或其他大型科技公司获得你梦想中的数据科学家/工程师工作。如果你正在寻找良师益友,请在此 与他预约。

最后,请通过 LinkedIn Medium Youtube 频道 联系文森特

实时数据流应用程序隐藏的特性

原文:https://towardsdatascience.com/the-hidden-peculiarities-of-realtime-data-streaming-applications-23b6484d2307?source=collection_archive---------20-----------------------

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

Photo by Lysander Yuen on Unsplash

随着开源框架(如 Apache Flink、Apache Spark、Apache Storm)和云框架(如 Google Dataflow)的不断增加,创建实时数据处理作业变得非常容易。API 定义良好,Map-Reduce 等标准概念在所有框架中都遵循几乎相似的语义。

然而,直到今天,在实时数据处理领域起步的开发人员还在为这个领域的一些特性而奋斗。因此,他们不知不觉地创建了一个路径,导致应用程序中相当常见的错误。

让我们来看看在设计实时应用程序时可能需要克服的一些奇怪的概念。

事件时间

数据源生成数据的时间戳称为事件时间,而应用程序处理数据的时间戳称为处理时间。不区分这些时间戳是实时数据流应用程序中最常见陷阱的原因。

下面就来细说一下。

由于几个问题,例如代理中的高 GC 或导致背压的过多数据,数据队列容易延迟。我将用(E,P)表示一个事件,其中 E 是事件时间戳(HH:MM:SS 格式),P 是处理时间戳。在理想世界中,E==P,但这不会发生在任何地方。

让我们假设我们收到以下数据

('05:00:00', '05:00:02'), ('05:00:01', '05:00:03'),      ('05:00:01', '05:00:03'), ('05:00:01', '05:00:05'),
('05:00:02', '05:00:05'), ('05:00:02', '05:00:05')

现在让我们假设有一个程序计算每秒收到的事件数。根据事件时间,程序返回

[05:00:00, 05:00:01) = 1
[05:00:01, 05:00:02) = 3
[05:00:02, 05:00:03) = 2

但是,根据处理时间,输出是

[05:00:00, 05:00:01) = 0
[05:00:01, 05:00:02) = 0
[05:00:02, 05:00:03) = 1
[05:00:03, 05:00:04) = 2
[05:00:04, 05:00:05) = 0
[05:00:05, 05:00:06) = 3

如你所见,这两者是完全不同的结果。

数据流中不寻常的延迟

大多数实时数据应用程序都使用分布式队列中的数据,如 Apache Kafka、RabbitMQ、Pub/Sub 等。队列中的数据由其他服务生成,如来自消费者应用程序的点击流或来自数据库的日志。

问题队列容易受到延迟的影响。生成的事件甚至可以在几十毫秒内到达您的作业,或者在最坏的情况下可能需要一个多小时(极端背压)。数据可能会由于以下原因而延迟—

  • 卡夫卡的高负荷
  • 生产者在其服务器中缓冲数据
  • 由于应用程序中的反压力,消耗速度较慢

不假设数据会有延迟是一个陷阱。开发人员应该始终拥有测量数据延迟的工具。例如,在卡夫卡中,你应该检查一下偏移滞后。

您还应该监控作业中的背压和延迟(即事件时间和处理时间之间的差异)。没有这些将导致意外的数据丢失,例如 10 分钟。时间窗口可以显示为无数据,窗口为 10 分钟。之后的值是期望值的两倍。

连接

在批处理数据处理系统中,连接两个数据集相对来说比较简单。在流式世界中,情况变得有点麻烦。

//The dataset is in the format (timestamp, key, value)//Datasteam 1
(05:00:00, A, value A), (05:00:01, B, value B),
(05:00:04, C, value C), (05:00:04, D, value D)//Datastream 2
(05:00:00, A, value A'), (05:00:02, B, value B'), 
(05:00:00, C, value C')

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

Both data streams represented on a single time scale

我们现在在它们的键上连接两个数据流。为了简单起见,我们将做一个内部连接。

键 A —两个值 A &值 A’同时到达。因此,我们可以很容易地将它们组合成一个函数并输出结果

键 B—B 值比 B 值早 1 秒。因此,我们需要在数据流 1 上等待至少 1 秒钟,以使连接工作。因此,你需要考虑以下几点-

  • 你会把这一秒钟的数据存储在哪里?
  • 如果这 1 秒钟不是固定的延迟,而是不规则地变化,在最坏的情况下上升到 10 分钟,那该怎么办?

C 键—C 值比 C 值晚 4 秒到达。这与之前的情况相同,但现在数据流 1 和 2 都有不规则的延迟,没有固定的模式来确定哪个流将给出值 1。

键 D —值 D 到达,但没有观察到值 D’。考虑以下情况-

  • 你要等多久才能得到 d `?
  • 如果值 d '可以在从至少 5 秒到接近 1 小时的任何时间出现呢?
  • 如果这是一个外部连接,并且您必须决定何时单独发出值 D,该怎么办?
  • 如果在前一种情况下,在发出值 D 1 分钟后,值 D `到达,会怎样?

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

Join in a streaming application

以上所有问题的答案将取决于您的使用案例。重要的是考虑所有这些问题,而不是忽视流媒体系统的复杂性。

配置

在标准微服务中,配置存在于作业内部或数据库中。在数据流应用程序中也可以这样做。但是,在使用这种方法之前,您需要考虑以下几点。

您访问配置的频率是多少?

如果需要为每个事件访问配置,并且事件的数量很多(超过一百万 RPM),那么您也可以尝试其他方法。一种是将配置存储在作业状态中。这可以在 Flink 和 Spark 中使用有状态处理来完成。可以使用文件阅读器或 Kafka 中的另一个流在状态中填充配置。

在流式世界中,对每个事件进行 DB 调用会降低应用程序的速度并导致背压。选择是要么使用快速数据库,要么通过在应用程序中存储状态来消除网络调用。

你的配置有多大?

如果配置非常大,您应该只使用应用程序内状态,如果配置可以跨多个服务器拆分,例如,配置为每个用户保存一些阈值。这种配置可以根据用户 id 键在几台机器上进行分割。这有助于减少每台服务器的存储量。

如果配置不能跨节点拆分,则首选 DB。否则,所有数据将需要被路由到包含配置的单个服务器,然后再次重新分发。在这个场景中,唯一包含配置的服务器充当了瓶颈。

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

Config present in a single server leading to a bottleneck

设计实时数据流应用程序似乎很容易,但开发人员会犯很多类似上面提到的错误,特别是如果他们来自微服务领域。

重要的部分是理解数据流的基础,以及如何处理单个数据流,然后转到处理多个连接、实时配置更新等的复杂应用程序。

这个领域最重要的书籍之一是
设计数据密集型应用程序:可靠、可伸缩和可维护系统背后的伟大思想

联系我 领英 脸书 或如有任何疑问,请发邮件至kharekartik@gmail.com

人工智能和大数据的隐藏风险

原文:https://towardsdatascience.com/the-hidden-risk-of-ai-and-big-data-3332d77dfa6?source=collection_archive---------13-----------------------

人工智能的最新进展是通过访问“大数据”和廉价的计算能力实现的。但是它会出错吗?

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

大数据突然无处不在。从稀缺和难以找到数据(和信息),我们现在有大量的数据。近年来,可用数据量呈指数级增长。反过来,由于记录数据的设备数量的巨大增长,以及所有这些设备之间通过物联网的连接,这也成为可能。每个人似乎都在收集、分析、从大数据中赚钱,并庆祝(或害怕)大数据的威力。通过结合现代计算的力量,它有望解决几乎任何问题——仅仅通过处理数字。

但是,大数据真的能兑现所有这些宣传吗?在某些情况下,是的,在其他情况下,也许不是。一方面,毫无疑问,大数据已经在某些领域产生了至关重要的影响。例如,几乎每一个成功的人工智能解决方案都涉及一些严肃的数字运算。

首先要注意的是,虽然 AI 目前非常擅长在大数据集内寻找模式和关系,但它仍然不是很智能(取决于你对智能的定义,但那是另一回事了!).处理这些数字可以有效地识别和发现我们数据中的微妙模式,但它不能直接告诉我们这些相关性中哪些实际上是有意义的。

相关性与因果关系

我们都知道(或者应该知道!)那个“关联并不意味着因果关系”。然而,人类的大脑天生就喜欢寻找模式,当我们看到倾斜在一起的线条和数据中明显的模式时,我们很难抗拒找出原因的冲动。

然而,从统计学角度来看,我们无法实现这一飞跃。《虚假相关性》 的作者泰勒·维根在他的网站上对此大做文章(我强烈推荐你去看看一些有趣的统计数据!)这种虚假关联的一些例子可以在下面的数字中找到,我收集了一些例子,表明冰淇淋显然正在造成许多糟糕的事情,从森林火灾到鲨鱼袭击和脊髓灰质炎爆发。

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

看看这些情节,有人可能会说我们可能早就应该禁止冰淇淋了。事实上,在 20 世纪 40 年代脊髓灰质炎的例子中,公共卫生专家建议人们停止食用冰淇淋作为“抗脊髓灰质炎饮食”的一部分。幸运的是,他们最终意识到小儿麻痹症的爆发和冰淇淋消费之间的关联仅仅是因为小儿麻痹症的爆发在夏季最为常见。

统计中,虚假关系或虚假相关是一种数学关系,其中两个或多个事件或变量与相关联,但 没有因果关系,这是由于巧合或某个第三个看不见的因素(称为“共同反应变量”、“混杂因素”或“潜伏变量”)的存在。这种“潜在变量”的一个例子可能是冰淇淋销售和鲨鱼攻击之间的表面相关性(我非常确信冰淇淋销售的增加不会导致鲨鱼攻击人)。但是,这两个数字背后有一个共同的联系,那就是温度。更高的温度导致更多的人去买冰淇淋,也导致更多的人去游泳。因此,这个“潜伏变量”实际上是表面相关性的原因。幸运的是,我们已经学会了区分相关性和因果性,我们仍然可以在炎热的夏天享受冰淇淋,而不用担心脊髓灰质炎的爆发和鲨鱼的袭击!

相关性的力量和极限

有了足够的数据,计算能力和统计算法模式就会被发现。但是这些模式有什么意义吗?并非所有都是如此,因为虚假模式很容易超过有意义的模式。当正确应用于正确的问题时,结合算法的大数据可能是一个非常有用的工具。然而,没有科学家认为你可以通过独自处理数据来解决问题,无论统计分析多么强大。你应该总是基于对你试图解决的问题的潜在理解来开始你的分析。

数据科学是科学的终结(或者是?)

2008 年 6 月,《连线》杂志前主编 C. Anderson 写了一篇颇具煽动性的文章,题为:“理论的终结:数据泛滥使科学方法过时”,他在文章中指出,“有了足够的数据,数字就能说话”。相关性取代了因果关系,即使没有一致的模型和统一的理论,科学也能进步。

这种方法的强度和通用性取决于数据量:数据越多,基于计算发现的相关性的方法就越强大和有效。我们可以简单地将数字输入强大的计算机,让统计算法自动发现有趣的模式和见解。

不幸的是,这种简化的分析方法有一些潜在的陷阱,这可以通过 John Poppelaars 在博客上找到的一个例子很好地说明:

假设我们想要为某个变量 y 创建一个预测模型。例如,这可能是一家公司的股票价格、在线广告的点击率或下周的天气。接下来,我们收集所有我们可以得到的数据,并将其放入一些统计程序中,以找到 y 的最佳可能预测模型。一个常见的程序是首先使用所有变量估计模型,筛选出不重要的变量(在某个预定义的显著性水平上不显著的变量),然后使用选定的变量子集重新估计模型,并重复此程序,直到找到显著的模型。很简单,不是吗?

然而安德森提出的分析方式有一些严重的缺陷。让我举例说明。按照上面的例子,我通过从 0 和 1 之间的均匀分布中抽取 100 个样本,为 Y 创建了一组数据点,所以它是随机噪声。接下来,我创建了一组 50 个解释变量 X(i ),从 0 到 1 之间的均匀分布中抽取 100 个样本。所以,所有 50 个解释变量也是随机噪声。我使用所有 X(i)变量来估计线性回归模型,以预测 y。由于没有任何相关(所有均匀分布和独立的变量),所以预计 R 的平方为零,但事实上并非如此。结果是 0.5。对于一个基于随机噪声的回归来说还不错!幸运的是,这个模型并不重要。不重要的变量被逐步剔除,模型被重新估计。重复这个过程,直到找到一个重要的模型。几个步骤后,发现一个显著模型,其调整后的 R 平方为 0.4,7 个变量的显著性水平至少为 99%。同样,我们正在回归随机噪声,其中绝对没有关系,但我们仍然找到了一个具有 7 个重要参数的重要模型。如果我们只是将数据输入统计算法去寻找模式,就会发生这种情况。”

数据集越大,噪音越强

最近的研究提供了证据,随着数据集变大,它们必须包含任意的相关性。这些相关性的出现仅仅是由于数据的大小,这表明许多相关性将是虚假的。不幸的是,太多的信息往往表现得像很少的信息。

在处理高维数据的应用程序中,这是一个主要问题。例如,假设您从一个工厂的数千个传感器中收集传感器数据,然后挖掘这些数据来优化性能。在这种情况下,你很容易被愚弄,根据虚幻的相关性而不是运营绩效的真实指标采取行动。这可能是一个非常坏的消息,无论是在经济上还是在工厂的安全运营方面。

添加数据与添加信息

作为数据科学家,我们可能经常声称,改善我们的人工智能模型的最佳解决方案是“添加更多数据”。然而,仅仅“添加更多数据”就能神奇地提高模型性能的想法可能并非如此。我们应该关注的是“增加更多的信息”。“添加数据”和“添加信息”之间的区别至关重要:添加更多的数据不等于添加更多的信息(至少是有用和正确的信息)。相反,通过盲目添加越来越多的数据,我们会遇到添加包含错误信息的数据的风险,从而降低我们模型的性能。随着对数据的大量访问以及处理数据的计算能力,考虑这一点变得越来越重要。

观点

那么,上述挑战会阻止您采用数据驱动的决策吗?不,远非如此。数据驱动的决策将会持续下去。它将变得越来越有价值,因为我们获得了更多关于如何最好地利用所有可用数据和信息来推动绩效的知识,即点击您的网站或优化工厂的运营。

然而,重要的是要意识到,它需要的不仅仅是硬件和大量的数据才能成功。大数据和计算能力是重要的组成部分,但不是全部的解决方案。相反,您应该理解连接数据的底层机制。数据不会自己说话,我们赋予数字它们的意义。数据的数量、种类或速度都无法改变这一点。

如果你有兴趣了解更多与人工智能/机器学习和数据科学相关的主题,你也可以看看我写的其他一些文章。你会发现他们都列在我的中型作者简介,,你可以在这里找到。

而且,如果你想成为一个媒体会员,免费访问平台上的所有资料,你也可以使用下面我的推荐链接。(注意:如果您使用此链接注册,我也会收到一部分会员费)

[## 通过我的推荐链接加入媒体- Vegard Flovik

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

medium.com](https://medium.com/@vflovik/membership)

更多来自 Vegard Flovik 媒体:

  1. 蒙特卡洛方法简介
  2. 从物理学到数据科学的转变
  3. 什么是图论,你为什么要关心它?
  4. 用于图像分类的深度迁移学习
  5. 构建一个能读懂你思想的人工智能
  6. 机器学习:从炒作到现实应用
  7. 如何使用机器学习进行异常检测和状态监控
  8. 如何(不)使用机器学习进行时间序列预测:避免陷阱
  9. 如何利用机器学习进行生产优化:利用数据提高绩效
  10. 如何给 AI 系统教物理?
  11. 我们能使用纳米级磁铁建立人工大脑网络吗?
  12. 供应链管理中的人工智能:利用数据推动运营绩效

来源:

Calude,C.S. & Longo,g .发现 Sci (2017) 22: 595:虚假相关性泛滥

blogs.crikey.com:大数据等于大问题吗?

朱塞佩·隆戈:大数据的数学使用和滥用

纽约时报:八(不,九!)大数据的问题

电线:理论的终结:数据洪流使科学方法过时

约翰·波普尔拉斯:数字真的能说明问题吗

人工智能研讨会——从宣传到现实应用

创建机器学习模型的高点、低点和平台

原文:https://towardsdatascience.com/the-highs-lows-and-plateaus-of-creating-a-machine-learning-model-970bf546ebf9?source=collection_archive---------31-----------------------

作为我在 Lambda School 的第二个单元的压轴戏周,我们的数据科学团队在 Kaggle 风格的比赛中相互竞争。

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

给定一个来自 DrivenData 的数据集,该数据集包含来自坦桑尼亚水利部的信息,我们被要求制作一个机器学习模型,该模型可以根据这项研究准确预测水泵的功能。

  • 目标:创建一个模型来预测坦桑尼亚油井的功能。
  • 子目标:获得 80 分以上的准确率,并击败我团队中的所有其他书呆子(我亲切地说书呆子,因为我肯定是其中之一。)

这是我第一次深入机器学习,我很兴奋能够开始。利用我在过去几周学到的东西,我知道我可以创建一个模型,它可以很好地对抗我的同学。我花了整整 4 天时间研究这些数据,用不同的方法和预测模型进行实验。我将带你经历一周中成功和失败的大起大落。

第一天 我们拿到数据,然后出发!我首先看了一下我试图预测的目标——水泵的状态。

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

如果我要建立一个初始模型来预测每个泵的功能,我将有 54%的正确率。

  • 功能性:0.543
  • 非功能性:0.384
  • 功能需求修复:0.072

54%的准确率是一个开始,但我知道我可以从这里提高。快速浏览数据后,我看到很多列都有非数字数据。在它可用之前,需要花时间去探索、清理和编码成数字数据。我想快速进步,所以我决定现在跳过这一步。我创建了一个仅使用数字列的线性回归模型,获得了 59%的准确率。

我对这些特征之间的相关性很好奇,所以我使用热图进行了更深入的研究。

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

我的目标特征“status_group”似乎与任何数字特征都没有很强的相关性。这让我想到了我的下一个任务:获取所有可用格式的分类数据,并将其添加到我的模型中。

到目前为止,我还没有花任何时间清理或处理这些数据中的空值。这是一个乏味的过程,但我确信我所做的工作将会改进我的模型。我花了第二天的大部分时间梳理每一列数据,找出处理空值的最佳方式,并了解对我的数据进行编码的不同方法。

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

我做了一些特征工程,并使用泵的建造日期和最近记录的年份创建了一个名为“泵的年龄”的类别。这变成了我最重要的特点之一。

经过一整天的清理、特征工程和编码,我重新运行了我的模型,并将我的准确度分数提高了…大约 6%。

第三天
好了,时间越来越有限,我开始怀疑我所做的那些乏味的工作是否有意义。我开始第三天使用梯度推进分类器。我从经验中知道,这种模式往往做得很好,尤其是在 Kaggle 比赛中。我对所有清理过的数据运行了一个简单的 xgboost 分类器。77%!令人尊敬的分数,我可以深呼吸,然后继续提高。

大约有 40 个特征用于训练我的模型,我想看看它们是否都对结果有贡献。我对我最近的模型进行了一个特性重要性测试,然后查看了前 15 个特性。

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

利用这些知识,我继续改进我的模型。我选择了 8 个我认为最重要的特性,然后运行另一个模型。78%

第四天这是我喜欢称之为迭代日的一天。我使用了我的 XGBClassifier,并调整了一些东西,直到没有其他东西可以尝试。我运行了大概 24 个模型,并改变了一个小项目,直到我耗尽了时间(和耐心)。)

  • 模型 1-8 特征,简单估算器,标准缩放器:78%
  • 模型 2-8 特征,简单估算器,无缩放器:78%
  • 模型 3-8 特征,简单估算器的调整参数,标准缩放器:78%
  • 模型 4-8 特征,简单估算器,鲁棒定标器:79%
  • 模型 5-9 特征,简单估算器,标准缩放器:79%

我一直在走。我最终突破了 80 分的准确率,但我不会详细说明我是如何做到这一点的。如果你想看看我这一周的工作,你可以看看我的 github 库中的代码。

我学到的东西

  • 简单(通常)更好
  • 领域知识是理解数据关系的重要部分。
  • 清理您的数据可以带来实质性的变化。
  • 如果你有时间,迭代可能是一种高效的方法。

68.2 95.4 99.7 统计学的历史

原文:https://towardsdatascience.com/the-history-of-68-2-95-4-99-7-in-statistics-82fdcef0a0ea?source=collection_archive---------14-----------------------

从德·莫维尔到高斯

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

Source: Wikipedia

如果你上过统计学课程,但仍然对它一无所知,或者听到你的书呆子朋友谈论这种东西,以下是你需要知道的。

这个规则有什么故事?

所谓的“经验法则”(同一事物,不同名称)可以追溯到 18 世纪。亚伯拉罕·德莫佛(1667–1754),一位法国数学家,他不像我们一样是个孩子,他过去常常把时间花在数学上,幸运的是,他实际上弄清楚了当前数学和统计学的一些主要概念。1738 年,他发表了一篇文章解释他的发现,指出随着事件发生次数的增加,二项式分布接近平滑曲线。这里有一个有趣的概念需要记住:

大错误比小错误更少见,也就是说,错误越大越不频繁,错误越小越频繁。

Source: Giphy

跟着我…

通过 Moivre(请带点法国口音),误差均匀地分布在算术平均值周围,形成一个对称的钟形,落在左右尾部。

另一位法国人皮埃尔·西蒙·拉普拉斯也喜欢数字。他开展了几项相关研究,但对我们的故事来说最重要的是的分析,描述了误差的分布。这种方法是估计有利情况的数量占可能情况总数的比例,它包括将任何函数的连续值视为另一个函数展开的系数。这导致了概率的正态分布,这就是所谓的拉普拉斯-高斯分布。更多关于拉普拉斯这里

阿德里安-玛丽·勒让德(也是……法语),应用拉普拉斯-高斯分布曲线引入最小二乘法

弗朗西斯·高尔顿,英国人,查尔斯·达尔文的表弟,在 1872 年引入了高斯曲线,讽刺的是高斯是以曲线命名的,尽管他既没有创造也没有命名。高斯完成了高尔顿的一半工作,发展了著名的正态分布定律来分析天文数据。

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

Standard normal distribution showing standard deviations.

德国人约翰·卡尔·弗里德里希·高斯被称为数学家中的王子,他的智商估计有 240。1823 年,高斯写下了关于可观测误差的理论。在《理论与行动》的第三部分,他介绍了著名的正态分布定律。

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

The Gaussian Curve formula

✅的理论史

让我们看看上述数学家所做的这些工作在现实世界中有什么影响。

简言之

  • 大约 68%的数值落在平均值的一个标准差σ ) )内。
  • 大约 95%的值落在平均值的两个标准偏差(±2 σ )内。
  • 几乎所有的值(约 99.7%)都在平均值的三个标准偏差范围内(±3 σ )。

何时使用该规则

每当我们被告知数据是正态分布时,就可以使用这个规则。如果一个问题提到正态或接近正态分布,你就会得到标准差;这几乎肯定意味着,你可以用这个规则来估计,你的分数有多少会落在一定数量的标准差内。

例子

特定磅数的面包重量平均为 1kg,平均值为 1kg,标准偏差为 0.1kg。假设重量遵循正态分布

  1. 低于平均值 2 个标准差的权重是多少?
  2. 平均值以上 1 个标准差的权重是多少?
  3. 中间的 68%的面包重多少?

答案:

  1. 2 标准差是 2 * 0.1 = 0.2 磅。因此,如果一条面包比平均值低 2 个标准差,那么它的重量是 1 千克——0.2 千克= 0.8 千克
  2. 1 标准偏差是 0.1 千克,所以一条高于平均值 1 标准偏差的面包重量为 1 千克+0.1 千克= 1.1 千克。
  3. 68 95 99.7 规则告诉我们,68%的权重应该在平均值两边的 1 个标准差以内。1 以上标准差(问题 2 答案中给出)为 1.1kg1 下面的标准偏差是 1 千克—0.1 千克是 0.9 千克。因此,68%的面包重量在 0.9 千克到 1.1 千克之间

结论

在过去的数百年中,许多重要的数学家对我们今天认为理所当然的事情做出了贡献。下次你看到高斯分布时,请记住高斯只是这个概念的一部分,尽管它有自己的名字。

人工智能伦理指南第 2 部分:人工智能是什么

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-ai-ethics-part-2-what-ai-is-c047df704a00?source=collection_archive---------17-----------------------

探索人工智能伦理问题的 3 集系列

放大

第一部分探讨了人工智能的伦理是什么和为什么,并将伦理景观分为四个领域——人工智能是什么,人工智能做什么,人工智能影响什么以及人工智能可以成为什么。在第 2 部分,我深入探讨了人工智能是什么的伦理问题。

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

Not this, Not this! (Top 6 Google Image Search Results for AI de-biased for authors’ search history)

放大

人工智能最常见的部署形式可以描述为一组数学函数(模型),给定一些输入(数据),学习某些东西并使用它来推断其他东西(做出预测)。换句话说,人工智能就是数据、模型和预测。这一领域的伦理探索涵盖了诸如模型预测中的偏差和结果的公平性(或缺乏公平性)等问题;以及通过问责制透明度解决这些问题的方法。

偏见和公平

所有的认知偏差都是人类与生俱来的,并影响我们如何做决定。以及我们建造的人工智能。凭借它如何学习它可以触发的失控反馈回路以及它的影响规模AI 可以放大人类的偏见。这是有后果的。有偏见的算法系统会导致不公平的结果、歧视和不公正。在规模上。

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

Algorithmic Systems Have Real World Consequences. (Image Credits Below)

理解人工智能中的偏见始于理解其来源,并确定哪些可以用技术来解决,哪些不能。偏差,如“一个模型不能足够准确地表示输入数据或基本事实”,是一个机器学习问题。偏见,就像“一个模型在其预测中反映了不适当的偏见”,不仅仅是一个机器学习问题。引用凯特·克劳福德的话,

“结构性偏见首先是社会问题,其次才是技术问题。”

认为我们可以仅仅通过技术来对抗我们社会结构中现存的偏见是鲁莽的。事实上,我们可以让它变得更糟,我们经常这样做。

数据是机器学习中偏见的一大来源,并在大众媒体中引起了极大的关注。我们现在都听说过“垃圾进垃圾出的口号。但是有偏见的数据只是故事的一部分。偏见也可以从其他来源渗透到机器的智能中;从人工智能研究人员(理解为人类)如何构建问题,到他们如何训练模型,再到系统如何部署,都是如此。即使有无偏的数据,一些机器学习模型实现准确性的过程也可能导致有偏见的结果。

让我们画画。(忍我一会儿,你就知道为什么了)。抓起一张纸,在上面撒上一些点。现在通过这些随机分布的点画一条线。点越分散,线条越弯曲。现在再补充几点。你的线不再适合所有的点!现在,你意识到你的线不可能在不损失未来通用性的情况下适合所有的点,所以你满足于“让我尽力而为”。你画一条尽可能接近尽可能多的点的线。你热爱数学,所以你用一个方程(或函数)来表示你的线,用另一个函数来表示这个“尽可能接近”的计算。恭喜你,你得到了一个机器学习模型!嗯,比真实的要简单几个数量级,但是你明白了。

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

Optimal Line vs Squiggly Line (Image: pythonmachinelearning.pro)

试图通过最小化“损失函数”来使一个数学函数适应数据点的随机分布,往往会模仿谚语“吱吱作响的轮子得到润滑油”。损失函数是对其对立面所代表的所有点的“尽可能接近”的计算,即直线距离它试图代表的点有多远。因此,通过最小化它,你成功地得到尽可能多的点。但是有一个副作用。声音最大的人损失最小。其中表示可以暗示“一个组的数据量”以及模型用来理解该组的“特征”。机器学习算法通过模式来理解数据,依赖于人类在数据背后识别的或通过发现它们来识别的“特征”。在这两种方法中,主导数据的“特征”成为算法的北极星。少数人,那些特征过于独特,无法产生足够强的信号被模型拾取的人,将在决策过程中被忽略。使用这种模式为所有人做决定会导致对某些人不公平的结果。

考虑一个例子。在来自世界各地的人脸上训练的面部情感识别模型。假设我们在年龄、性别、种族、民族等方面有足够的多样性。我们都直觉地知道,我们表达情绪的强度也与其他定性因素相关。我微笑的大小与文化上适合我的东西相关联,我与扳机的关系有多深,我对我的牙齿的感觉如何,我被批评笑得太大声的频率,我当时的精神状态等等。如果我们用这个模型来评估的学生在教室有多快乐,会发生什么?(猜一猜为什么有人会想这么做,没有奖励!一个数学函数能代表所有可能的幸福强度吗?这些考虑使用了可见的和可测量的特征,如微笑的大小,笑声的音量,眼睛睁得多大?人工智能研究人员可能会说可以。我还没被说服。

所以偏见有多种来源和多种形式。Harini Suresh 的博客提供了一个简单的框架来理解它们。我总结了她的 5 个偏差来源:历史偏差已经存在于数据中,而表示偏差和测量偏差是数据集创建方式的结果。评估聚集偏差是构建模型时所做选择的结果。

标签的选择、模型的选择、特征的选择、参数化或优化的内容,都是人工智能开发者(即人类)做出的一些选择,因此存在封装人类偏见和盲点的风险。

那么,摆脱偏见的方法是什么呢?对去偏置技术、数据失衡调整等的研究已经在进行中(详见本次演讲)。但这是在数据集偏差被识别出来之后。这需要严格的审计,正如 Timnit Gebru 等人在其论文“数据集数据表”中所建议的那样。类似于在电子工业和化学安全规范中发现的数据表可以帮助早期识别偏差,但除了数据集偏差,还需要跨学科的努力。让领域专家参与进来,建立多元化的跨学科团队是及早发现偏见的关键

虽然识别偏见是好事,并试图通过技术消除偏见是一个崇高的目标,但这还不够。

问责制和补救性

算法被部署在人类生活各个方面的决策系统中——我们如何看待自己,与谁互动,我们如何看待自己,我们如何看待 T2。我们如何被雇佣谁被解雇我们买什么我们能买什么我们住在哪里我们如何通勤我们看什么新闻,一直到谁被警察监视,谁没有。算法会产生不公平和歧视性的结果。把两者结合起来;不能低估让算法系统负起责任的必要性。

问责制促进信任。它提供了一条通往正义的道路,以确定和补救不公平或歧视性的结果。

问责可以通过人工审计、影响评估或通过政策或法规进行治理来实现。科技公司通常更喜欢自我监管,但即使是他们现在也认识到了外部干预的需要(T21)。通过"人在回路"的治理,即某些被确定为高风险的决定需要由人来审查,也被提议作为问责制的一种模式。

但是一旦造成损害会发生什么呢?受影响方是否有机会或途径来纠正负面影响?他们能得到应有的赔偿吗?他们甚至能确定造成的伤害吗?!到目前为止,我还没有看到任何正在使用的算法系统定义一个明确的补救流程,尽管 WEF 将补救确定为负责任的人工智能的一个支柱。但调查性新闻和研究团体,如 ProPublica算法正义联盟AI Now Institute 不知疲倦地识别不公平或歧视性的系统,并推动问责和行动,这是值得称赞的。在某些情况下,这种不公平的制度已经被撤销或修改。但是在其他许多地方,科技公司继续忽视人们的担忧,或者认为他们的责任仅限于提供使用指南。

透明度、可解释性和可解释性

围绕人工智能的许多伦理问题源于其固有的“黑箱”行为。这部分是因为公司不想分享让他们的模型成功的“秘方”,部分是因为机器学习中有太多的学习被锁定在大型复杂的数学运算中。但是当决定导致伤害时,公正的独立调查需要查明事实。但是谁来决定什么程度的事实是充分的呢?知道一个决定造成了伤害就够了吗?我们需要了解这个决定是如何做出的,由谁做出的吗?这些问题从不同角度探讨了机器学习系统的透明性。

算法通过多个“层”(多个数学运算)从输入数据中“学习”;逐步调整“权重”(ax+b 中的 a 和 b)以越来越接近数据中的模式。到目前为止,透明度是有限的,因为没有简单的方法来一层一层地“解释”正在“学习”的东西,或者“解释”所有这些学习是如何导致最终决策的。幸运的是,随着透明度成为研究焦点,这种情况正在改变。

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

What is a neural network looking for and how is it attributing what it sees? (Image: Building Blocks of Interpretability by Olah et al — I highly recommend playing with this interactive paper!)

可解释性研究主要集中在打开黑匣子。可解释性研究主要集中在理解决策上。

一些研究人员说,只有算法的输出需要是可辩护的,而其他人说这是不够的或太冒险。一些人认为算法应该解释它们自己。而很少有人从透明的角度完全否定可解释性及其需求。在我看来,对于所有公平和公正的事情,背景将决定一个算法系统需要有多可解释或可解释或透明;并且某种外部规章或商定的标准将必须确定和执行这一点。

这里还需要提到另一种透明度。组织透明度。科技公司对发布他们的人工智能研究有多开放,他们的人工智能动机和目标,他们如何在产品中使用人工智能,他们使用什么指标来跟踪其性能等;所有这些都很重要。

缩小,直到下一次旅行

构建人工智能很难。更难理解它与社会的相互作用。这么多的故事,这么多的研究,这么细微的差别。我几乎没有触及表面,但我希望这足以提高认识和引发反思。

参考资料和补充阅读

这是探索人工智能伦理的 3 部分系列的第 2 部分。 第一部分,此处可用 ,勾勒出问题的全貌。 第三部分,此处可用 ,看人工智能做什么和人工智能影响什么的伦理。

非常感谢 雷切尔·托马斯*卡蒂克·杜莱萨米 斯里拉姆·卡拉 对初稿的反馈。*

人工智能伦理指南第 3 部分:人工智能做什么及其影响

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-ai-ethics-part-3-what-ai-does-its-impact-c27b9106427a?source=collection_archive---------9-----------------------

探索人工智能伦理问题的 3 集系列

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

“I don’t know what I’m doing here, do you?” (Image by Rock’n Roll Monkey on Unsplash)

故事到此为止

在第一部分,我探索了人工智能的伦理是什么和为什么。第二部分看什么是人工智能的伦理。在第 3 部分,我以对人工智能做什么和人工智能影响什么的伦理的探索结束了这个系列。无论是安全还是公民权利,无论是对人类行为的影响还是恶意使用的风险,这些话题都有一个共同的主题——需要重新审视技术专家在处理他们所创造的东西的影响方面的作用;超越“避免伤害”和“尊重隐私”等宽泛的原则,建立因果关系,并确定我们独特的优势或劣势。

我很早就有一种感觉,第三部分将很难公正地作为一个不到 10 分钟的帖子。但是三部分刚刚好,超过 10 分钟太长;所以当我试图证明直觉是错的并且失败的时候,请耐心等待!让我们一起探索。

人工智能做什么

人工智能的能力将随着时间的推移而提高,人工智能应用将充斥我们的世界。这不一定是一件坏事,但它确实创造了一种迫切的需求,即评估 AI 做什么以及它如何影响人类;从我们的安全,到我们与机器人的互动,到我们的隐私和代理。

那么 AI 是做什么的?人工智能使用大量计算和一些规则来分析、识别、分类、预测、推荐,并在允许的情况下为我们做决定。做出能够永久改变人类生活进程的决定是一项巨大的责任。AI 准备好了吗?是吗?在缺乏内在道德偏见的情况下,人工智能系统可以用来帮助我们或伤害我们。我们如何确保人工智能不会造成或导致伤害?

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

Distilling the Harms of Automated Decision-Making (Future of Privacy Forum Report)

安全

人工智能中的安全可以理解为“人工智能必须不会导致事故,或者表现出非故意或有害的行为”。身体伤害是显而易见的,无人驾驶汽车的安全问题也是众所周知的。但是,如何在一个自治系统中建模并实现安全性呢?

在基于规则的系统中,给定的输入总是产生相同的结果,安全问题可以通过严格的测试和操作程序来解决。这种方法只适用于人工智能。

自主决策需要在不确定的情况下自动评估安全性,以便可预测地预防伤害。

让我们打开这个。人类不会在真空中做决定。我们的行动不仅由外部触发因素决定,还取决于我们的意图、规范、价值观和偏见。我们认为安全的东西也会随着时间和环境而变化。考虑在车流中穿梭,将某人紧急送往医院。你会做吗?我猜你说,看情况。

对于一个硬件-软件组合来说,要做出正确的调用,需要它能够响应出现的上下文,能够在其环境中对这种不确定性建模,并且**与什么是“正确的”**保持一致。与“正确的”目标保持一致,又名 价值-与 **、**保持一致是 AI 中安全的一个关键主题。问题是,自治系统如何追求与人类价值观一致的目标?更重要的是,鉴于人类可以持有相互冲突的价值观,系统与谁的价值观一致

网络安全和恶意使用

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

Building ethics into machines. Yes/No? Image credit: Iyad Rahwan

虽然人工智能越来越多地通过检测和防止入侵来实现网络安全,但它本身也容易受到游戏和恶意使用的影响。在一个数据驱动、高度网络化、永远在线的世界里,风险是巨大的。除了经典的威胁,人工智能系统还可以通过毒害输入数据或修改目标函数来造成伤害。

降低成本和提高音频/视频/图像/文本生成能力也推动了人工智能系统和社会工程的发展。当技术做技术的时候,谁来承担这种滥用的负担?由于担心被恶意使用,开放人工智能的决定不发布他们的文本生成模型 GPT-2,这引起了人工智能研究人员的强烈反应。通过推特,博客例如 1例如 2辩论很明显,确定“做正确的事情”是困难的,人工智能研究人员尚未在前进的道路上达成一致。与此同时,黑帽研究人员和坏演员没有这样的冲突,并继续有增无减。

隐私、控制和监视

沿着伤害和滥用技术的路线,是人工智能被重新利用的能力,甚至是有意设计的监视能力。构建这种工具的伦理考虑是什么?到底该不该建?让我们后退一步,理解为什么这很重要。

请人们描述隐私,你会得到多种定义。这是合理的,因为隐私是一种社会建构,随着时间的推移而演变,并受到文化规范的影响。虽然定义隐私很难,但识别侵犯隐私的行为却很直观。当你在机场被单独搜身时,你会觉得受到了侵犯。你没有什么可隐瞒的,但是你觉得被侵犯了!因为在许多定义的背后是人类最基本的东西——尊严和控制。

在所描述的案例中,你理解了违规行为并继续遵守,为了更大的利益(公共安全)放弃了隐私。我们一直都这样。现在考虑一个数字化、大数据、人工智能的世界,在这个世界里,侵犯隐私既不直接也不明显,放弃隐私的风险来自包装在便利和个性化中的礼物。个人的、私人的、安全的、开放的、同意的概念都变得混乱,不利于普通用户。正是在这一点上,技术专家占据优势,可以在保护隐私方面发挥作用。

以面部识别技术为例,这是迄今为止最致命的侵犯隐私的技术。CCTV、Snapchat/Instagram stories、脸书直播等看似无害的技术,都在推动一种文化,在这种文化中,记录他人感觉很正常。在有钱可赚的时候,企业继续推销“方便和个性化”的产品。自拍到签到拇指支付眨眼解锁DNA 祭祖游,都让收集和凝聚让你,你。同时,AI 可以进行面部分析、皮肤纹理分析、步态识别、语音识别和情感识别。所有 未经个人许可或合作 。把所有这些加起来,你会不成比例地强化国家/企业而非个人。虽然中国的监控制度听起来有些极端,但面部识别对执法和公共安全至关重要的观点却很普遍。尽管有许多偏见,美国也经常在执法中使用 T21 的面部识别,除了在科技之都。事实上“安全”的诱惑是如此强烈,基于人工智能的跟踪包括面部识别现在正被用在儿童身上,尽管误报对年轻人的心灵有害。作为技术人员,我们应该从哪里开始划分界限呢?

人与人工智能的互动

在我们有了谷歌主页几个月后,我 4 岁的孩子大声宣称“谷歌无所不知”。不用说,一个关于 Google Home 如何知道它知道什么以及它肯定不是一切的长对话接踵而至!令我沮丧的是,他看起来不太相信。人类的声音回应“嘿谷歌,我的纸杯蛋糕在哪里”,“嘿谷歌,你今天刷牙了吗”,“嘿谷歌,给我讲个笑话”对他这个年龄的孩子来说太真实了;而像机器、程序和训练这样的术语,我们应该叫它什么,人工的。

人工智能在我孩子的生活中扮演的角色好的或坏的是不可低估的。大多数父母使用技术,包括智能音箱,不知道它如何工作或何时不工作。但问题是,他们不应该知道。再次,考虑技术专家,效果和有利位置。

算法对我们精神和情感福祉的影响,无论是积极的还是消极的,也是令人担忧的原因。

我最近分享了一个故事某人被一个心理健康 app 通知救了;在其他案例中算法将某人推向自残;与此同时,依靠 Alexa 来对抗孤独、依靠毛茸茸的机器海豹来治疗、依靠玻璃管雕像来陪伴的例子也存在。

这种对人工智能的依赖将我们从本质上是社区的失败中拯救出来,在某些情况下是医疗保健的失败,这让我感到害怕和悲伤。

人工智能有什么影响

人工智能越来越多地影响着一切,但重要的是要突出二阶和三阶效应。不管是不是有意的,这些影响都是复杂的、多维的、大规模的。理解它们需要时间和专业知识,但意识到这一点是有价值的第一步,也是我的目标。

自动化、失业、劳动力趋势

围绕 AI 的新闻周期在“AI 将拯救我们”和“AI 将取代我们”之间交替。工厂工人被机器人取代的故事,人工智能创造了数百万个工作岗位的故事,以及 T4 人工智能中隐形劳动的危险的故事,都描绘了人工智能时代工作的未来。没关系,正如这份布鲁金斯报告建议的那样,“所有这些主要研究报告的重大劳动力中断的事实应该被认真对待”。

谈到人性,我是一个乐观主义者——我相信,只要我们愿意,我们可以战胜一切。人工智能引发的失业问题是,我们会做得足够快吗?那些风险最大的人会找到生存所需的手段和资源吗?仅仅生存就足够了吗?目标感、生产力和尊严呢?人工智能会给所有人提供这些还是仅仅给那些有足够特权去追求它的人?人工智能会加剧拥有者因拥有 T9 而拥有更多的恶性循环吗?

很明显,人工智能将打破劳动力的格局。人工智能伙伴关系布鲁金斯奥巴马白宫报告就谁将受到影响以及如何受到影响提供了有益的见解。但是,还不完全清楚这种变化会发生得多快,以及我们是否正在尽全力为此做准备。

民主和民权

“权力总会学习,强大的工具总会落入它的手中。”——Zeynep Tufecki,发表于麻省理工学院技术评论

无论是中国的大规模监控还是公共话语的系统性劫持,人工智能在强者手中的影响已经显而易见。虽然人工智能不是他们的唯一原因,但它推动强大力量的独特方式是人工智能研究人员必须应对的问题。

互联网,尤其是推动其发展的盈利性公司,造就了一种造假文化。假的人,假的对话:在 2013 年的某个时候,YouTube 上一半的人是冒充真人的机器人。一半。年复一年,只有不到 60%的网络流量来自人类。虽然 YouTube 和脸书等公司声称对其“平台”上的内容保持中立,但实际上它们最大化了消费,这导致一些内容比其他内容提供得更多。当机器人或不良行为者生成为病毒式传播定制的内容时,平台会满足他们的要求。这对我们如何消费和处理信息、谁掌握着我们的权力、我们信任谁以及我们如何行动意味着什么?Danah Boyd, Data & Society 的创始人说,这种对基于人工智能的推荐引擎的操纵导致了真相的破碎,并最终失去信任,失去社区。这种知情、信任的地方社区的丧失削弱了民主的力量。随着民主遭受打击,结构性偏见扩大,公民权利的自由行使不再是所有人都能一律享有的。

人与人之间的互动

人工智能如何重塑人类互动关系到我们个人和集体的福祉。早期迹象令人不安:性别化的人工智能促进了刻板印象和歧视,自然语言人工智能导致了礼貌的丧失以及当人工智能调解互动时信任度降低。这就引出了一个更基本的问题,即今天的狭义人工智能,以及在某一点上的 AGI,将如何影响我们去爱、去同情、去信任和归属的能力?

耶鲁大学教授尼古拉斯·克里斯塔基斯的一项实验表明,人类的群体动力可以通过引入类人机器人来改变。当自私的搭便车机器人加入群体时,一个合作以最大化集体回报的群体完全停止合作。对环境信任的减少改变了我们建立联系和合作的方式。

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

Humanity is Human Interdependency (image src: deposit photos)

尼古拉斯·克里斯塔基斯说:“随着人工智能渗透到我们的生活中,我们必须面对它可能会阻碍我们的情感,抑制深层的人类联系,让我们彼此之间的关系变得更少互惠,更浅,或更自恋。”这种阻碍也延伸到了道德上。正如肌肉不被使用会浪费肌肉一样,道德肌肉需要真实世界的互动来增强力量。那么,如果一个社会的典型决策是由隐藏在脱离其来源的数据背后的计算做出的,会发生什么?我们是否失去了感同身受的能力?我们对不公平变得不敏感了吗?我们能够经常练习道德判断以获得实践智慧吗?圣克拉拉大学的哲学教授香农·瓦勒,称之为道德去技能化(在这里详细阐述)。这种去技能化使得人类需要做出的一些决定变得更加困难,通常是在更关键和冲突的情况下(例如,作为陪审员)。

连续函数不连续人类

我需要提醒这里的读者,我正在以一种深刻反思的状态结束这个系列,前面的总结反映了这一点。从第一部分中对人工智能的伦理景观的调查开始,到第二部分中对人工智能是什么以及人工智能在第三部分中的作用和影响的深入探究,再到我对心理学、社会学、人类学和技术的阅读,我痛苦地意识到我们对人类和人性的理解是多么的不足。

也许,做人就是站在别人的立场上,理解他们所经历的事情的严重性,并尽你所能找到帮助他们的最佳方式。人性就是相信别人也会为你做同样的事。作为技术人员,我们制造产品,我们相信它们会帮助人们,我们定义衡量标准来表明它们确实有帮助,但是我们经常不能理解当它们没有帮助时的严重性。

为人类建造人工智能的伦理要求理解人类,以及他们所有的不连续性。这不是一个指标驱动的、有时限的、高回报、高增长的项目,但却非常有价值。

这是探索人工智能伦理的 3 部分系列的第 3 部分。 第一部 点击这里。 点击此处查看第二部分 。非常感谢 雷切尔·托马斯*卡蒂克·杜赖萨米 斯里拉姆·卡拉 对初稿的反馈。*

《搭车人特征提取指南》

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-feature-extraction-b4c157e96631?source=collection_archive---------5-----------------------

Kaggle 和日常工作的一些技巧和代码

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

好的特征是任何机器学习模型的支柱。

好的特性创建通常需要领域知识、创造力和大量时间。

在这篇文章中,我将谈论:

  • 特征创建的各种方法——自动和手动
  • 处理分类特征的不同方法
  • 经度和纬度特征
  • 一些骗人的把戏
  • 以及其他一些关于特征创建的想法。

TLDR;这个帖子是关于有用的 特征工程 方法和技巧,我学到了,最后经常使用。

1.使用特征工具自动创建特征:

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

Automation is the future

你读过 featuretools 吗?如果没有,那么你会很高兴。

特征工具是一个执行自动化特征工程的框架。它擅长将时态和关系数据集转换为机器学习的特征矩阵。

怎么会?让我们用一个玩具示例向您展示 featuretools 的强大功能。

假设我们的数据库中有三个表:客户、会话和事务。

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

Datasets and relationships

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

这是一个相当不错的玩具数据集,因为它有基于时间的列以及分类和数字列。

如果我们要在这些数据上创建特征,我们将需要使用 Pandas 进行大量的合并和聚合。

Featuretools 让我们变得如此轻松。尽管有一些事情,在我们的生活变得更容易之前,我们需要学习。

Featuretools 使用 entitysets。

你可以把一个 entityset 理解为一个数据帧的桶以及它们之间的关系。

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

Entityset = Bucket of dataframes and relationships

所以事不宜迟,让我们创建一个空的 entityset。我只是以顾客的身份给出了名字。您可以在这里使用任何名称。现在只是一个空桶。

# Create new entityset
es = ft.EntitySet(id = 'customers')

让我们添加我们的数据框架。添加数据帧的顺序并不重要。要将数据帧添加到现有的 entityset,我们需要执行以下操作。

# Create an entity from the customers dataframees = es.entity_from_dataframe(entity_id = 'customers', dataframe = customers_df, index = 'customer_id', time_index = 'join_date' ,variable_types = {"zip_code": ft.variable_types.ZIPCode})

我们在这里做了一些事情,将数据帧添加到空的 entityset 桶中。

  1. 提供了一个entity_id:这只是一个名字。把它当成客户。
  2. dataframe名称设置为 customers_df
  3. index:该参数将表中的主键作为输入
  4. time_index:时间索引被定义为第一次可以使用一行中的任何信息。对于客户来说,这是加入日期。对于交易,它将是交易时间。
  5. variable_types:用于指定某一特定变量是否必须进行不同的处理。在我们的 Dataframe 中,我们有一个zip_code变量,我们想区别对待它,所以我们使用它。这些是我们可以使用的不同变量类型:
[featuretools.variable_types.variable.Datetime,
 featuretools.variable_types.variable.Numeric,
 featuretools.variable_types.variable.Timedelta,
 featuretools.variable_types.variable.Categorical,
 featuretools.variable_types.variable.Text,
 featuretools.variable_types.variable.Ordinal,
 featuretools.variable_types.variable.Boolean,
 featuretools.variable_types.variable.LatLong,
 featuretools.variable_types.variable.ZIPCode,
 featuretools.variable_types.variable.IPAddress,
 featuretools.variable_types.variable.EmailAddress,
 featuretools.variable_types.variable.URL,
 featuretools.variable_types.variable.PhoneNumber,
 featuretools.variable_types.variable.DateOfBirth,
 featuretools.variable_types.variable.CountryCode,
 featuretools.variable_types.variable.SubRegionCode,
 featuretools.variable_types.variable.FilePath]

这就是我们的 entityset bucket 现在的样子。它只有一个数据帧。也没有关系

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

让我们添加所有的数据帧:

# adding the transactions_df
es = es.entity_from_dataframe(entity_id="transactions",
                                 dataframe=transactions_df,
                                 index="transaction_id",
                               time_index="transaction_time",
                               variable_types={"product_id": ft.variable_types.Categorical})# adding sessions_df
es = es.entity_from_dataframe(entity_id="sessions",
            dataframe=sessions_df,
            index="session_id", time_index = 'session_start')

这是我们的实体集桶现在的样子。

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

所有三个数据帧,但没有关系。我所说的关系是指我的 bucket 不知道 customers_df 和 session_df 中的 customer_id 是相同的列。

我们可以向我们的 entityset 提供以下信息:

# adding the customer_id relationship
cust_relationship = ft.Relationship(es["customers"]["customer_id"],
                       es["sessions"]["customer_id"])# Add the relationship to the entity set
es = es.add_relationship(cust_relationship)# adding the session_id relationship
sess_relationship = ft.Relationship(es["sessions"]["session_id"],
                       es["transactions"]["session_id"])# Add the relationship to the entity set
es = es.add_relationship(sess_relationship)

在此之后,我们的 entityset 看起来像:

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

我们可以看到数据集和关系。我们这里的大部分工作已经完成了。我们已经准备好做特色菜了。

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

Cooking is no different from feature engineering. Think of features as ingredients.

创建特征非常简单:

feature_matrix, feature_defs = ft.dfs(entityset=es, target_entity="customers",max_depth = 2)feature_matrix.head()

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

我们最终得到了 73 个新特性。 你可以从 *feature_defs.* 中看到特征名称,我们最终创建的一些特征是:

[<Feature: NUM_UNIQUE(sessions.device)>,
 <Feature: MODE(sessions.device)>,
 <Feature: SUM(transactions.amount)>,
 <Feature: STD(transactions.amount)>,
 <Feature: MAX(transactions.amount)>,
 <Feature: SKEW(transactions.amount)>,
 <Feature: DAY(join_date)>,
 <Feature: YEAR(join_date)>,
 <Feature: MONTH(join_date)>,
 <Feature: WEEKDAY(join_date)>,
 <Feature: SUM(sessions.STD(transactions.amount))>,
 <Feature: SUM(sessions.MAX(transactions.amount))>,
 <Feature: SUM(sessions.SKEW(transactions.amount))>,
 <Feature: SUM(sessions.MIN(transactions.amount))>,
 <Feature: SUM(sessions.MEAN(transactions.amount))>,
 <Feature: SUM(sessions.NUM_UNIQUE(transactions.product_id))>,
 <Feature: STD(sessions.SUM(transactions.amount))>,
 <Feature: STD(sessions.MAX(transactions.amount))>,
 <Feature: STD(sessions.SKEW(transactions.amount))>,
 <Feature: STD(sessions.MIN(transactions.amount))>,
 <Feature: STD(sessions.MEAN(transactions.amount))>,
 <Feature: STD(sessions.COUNT(transactions))>,
 <Feature: STD(sessions.NUM_UNIQUE(transactions.product_id))>]

可以得到类似于 金额的 std 之和(SUM(sessions.STD(transactions.amount))***)或者 金额的 std 之和(STD(sessions.SUM(transactions.amount)))***这就是max_depth参数在函数调用中的含义。在这里,我们将其指定为 2,以获得两个级别的聚合。

如果我们将 *max_depth* 改为 3,我们可以得到如下特征: MAX(sessions.NUM_UNIQUE(transactions.YEAR(transaction_time)))

试想一下,如果您必须编写代码来获得这些功能,您将需要花费多少时间。另外,需要注意的是,增加max_depth可能需要更长的时间。

2.处理分类特征:标签/二进制/散列和目标/均值编码

创建自动化功能有它的好处。但是如果一个简单的库可以完成我们所有的工作,为什么还需要我们这些数据科学家呢?

在这一节中,我将讨论如何处理分类特征。

一个热编码

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

One Hot Coffee

我们可以用 一个热编码 来编码我们的分类特征。因此,如果我们在一个类别中有 n 个级别,我们将获得 n-1 个特征。

在 sessions_df 表中,我们有一个名为device,的列,它包含三个级别——桌面、移动或平板。我们可以从这样的列中得到两列,使用:

pd.get_dummies(sessions_df['device'],drop_first=True)

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

这是谈论分类特征时想到的最自然的事情,并且在许多情况下都很有效。

普通编码

有时有一个与类别相关联的顺序。在这种情况下,我通常在 pandas 中使用一个简单的 map/apply 函数来创建一个新的序数列。

例如,如果我有一个包含三个温度级别的数据帧:高、中、低,我会将其编码为:

map_dict = {'low':0,'medium':1,'high':2}
def map_values(x):
    return map_dict[x]
df['Temperature_oe'] = df['Temperature'].apply(lambda x: map_values(x))

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

用这个我保存了低位的信息

LabelEncoder

We could also have used LabelEncoder 把我们的变量编码成数字。标签编码器主要做的是,它看到列中的第一个值,并将其转换为 0,下一个值转换为 1,依此类推。这种方法在树模型中工作得相当好,当分类变量中有很多级别时,我最终会使用它。 我们可以用这个作为:

from sklearn.preprocessing import LabelEncoder
# create a labelencoder object
le = LabelEncoder()
# fit and transform on the data
sessions_df['device_le'] = le.fit_transform(sessions_df['device'])
sessions_df.head()

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

二进制编码器

BinaryEncoder 是另一种可以用来编码分类变量的方法。如果一列中有许多级别,这是一个很好的方法。虽然我们可以使用一个热编码使用 1023 个列来编码具有 1024 个级别的列,但是使用二进制编码我们可以仅使用十个列来实现。

假设我们的 FIFA 19 球员数据中有一列包含所有俱乐部名称。该列有 652 个唯一值。一个热编码意味着创建 651 列,这意味着大量内存使用和大量稀疏列。

如果我们使用二进制编码器,我们将只需要 10 列作为 2⁹ <652 <2¹⁰.

We can binaryEncode this variable easily by using BinaryEncoder object from category_encoders:

from category_encoders.binary import BinaryEncoder
# create a Binaryencoder object
be = BinaryEncoder(cols = ['Club'])
# fit and transform on the data
players = be.fit_transform(players)

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

HashingEncoder

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

人们可以把散列编码器想象成一个黑盒函数,它把一个字符串转换成 0 到某个预先指定的值之间的一个数。

它不同于二进制编码,因为在二进制编码中,两个或多个俱乐部参数可能是 1,而在散列中只有一个值是 1。

我们可以使用哈希函数:

players = pd.read_csv("../input/fifa19/data.csv")from category_encoders.hashing import HashingEncoder
# create a HashingEncoder object
he = HashingEncoder(cols = ['Club'])
# fit and transform on the data
players = he.fit_transform(players)

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

必然会有冲突(两个俱乐部具有相同的编码。例如,尤文图斯和 PSG 有相同的编码)但有时这种技术工作得很好。

目标/均值编码

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

这是一个我发现在 Kaggle 比赛中非常有效的技巧。如果两个训练/测试都来自同一时间段(横截面)的同一数据集,我们可以对特征进行巧妙处理。

比如:泰坦尼克号知识挑战赛中,测试数据是从训练数据中随机抽取的。在这种情况下,我们可以使用不同分类变量的平均目标变量作为特征。

在 Titanic 中,我们可以在 PassengerClass 变量上创建一个目标编码特征。

我们在使用目标编码时必须小心,因为它可能会导致我们的模型过度拟合。 这样我们在使用的时候就使用了 k 倍目标编码。

然后,我们可以创建一个平均编码特征,如下所示:

targetc = KFoldTargetEncoderTrain('Pclass','Survived',n_fold=5)
new_train = targetc.fit_transform(train)new_train[['Pclass_Kfold_Target_Enc','Pclass']]

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

您可以看到,根据从中获取平均值的折叠,乘客类别 3 如何被编码为 0.261538 和 0.230570。

这个特性非常有用,因为它对类别的目标值进行了编码。仅看这个特征,我们可以说,与等级 3 相比,等级 1 中的乘客具有较高的幸存倾向。

3.一些骗人的把戏:

虽然不一定是特色创建技术,但您可能会发现一些有用的后处理技术。

测井损耗削波技术;

这是我在杰瑞米·霍华德的神经网络课上学到的。它基于一个基本的想法。

如果我们非常自信和错误,日志丢失会对我们不利。

因此,在分类问题的情况下,我们必须预测 Kaggle 中的概率,最好将我们的概率限制在 0.05-0.95 之间,这样我们就永远不会非常确定我们的预测。反过来,受到的惩罚也更少。可以通过简单的np.clip来完成

gzip 格式的 Kaggle 提交:

一小段代码将帮助你节省无数的上传时间。享受吧。

df.to_csv(‘submission.csv.gz’, index=False, compression=’gzip’)

4.使用纬度和经度功能:

这一部分将讨论如何很好地使用经纬度特性。

对于这个任务,我将使用操场竞赛的数据:纽约市出租车旅行持续时间

训练数据看起来像:

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

我在这里要写的大部分函数都是受 Beluga 写的 Kaggle 上的一个内核的启发。

在这个竞赛中,我们必须预测旅行持续时间。我们得到了许多功能,其中的纬度和经度的接送也有。我们创造了如下特色:

A.两个纬度之间的哈弗线距离:

给定经度和纬度,哈弗辛公式确定了球体上两点之间的大圆距离

def haversine_array(lat1, lng1, lat2, lng2): 
    lat1, lng1, lat2, lng2 = map(np.radians, (lat1, lng1, lat2, lng2)) 
    AVG_EARTH_RADIUS = 6371 # in km 
    lat = lat2 - lat1 
    lng = lng2 - lng1 
    d = np.sin(lat * 0.5) ** 2 + np.cos(lat1) * np.cos(lat2) *      np.sin(lng * 0.5) ** 2 
    h = 2 * AVG_EARTH_RADIUS * np.arcsin(np.sqrt(d)) 
    return h

然后,我们可以使用该函数:

train['haversine_distance'] = train.apply(lambda x: haversine_array(x['pickup_latitude'], x['pickup_longitude'], x['dropoff_latitude'], x['dropoff_longitude']),axis=1)

B.两个纬度之间的曼哈顿距离:

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

Manhattan Skyline

沿直角轴测量的两点之间的距离

def dummy_manhattan_distance(lat1, lng1, lat2, lng2): 
    a = haversine_array(lat1, lng1, lat1, lng2) 
    b = haversine_array(lat1, lng1, lat2, lng1) 
    return a + b

然后,我们可以使用该函数:

train['manhattan_distance'] = train.apply(lambda x: dummy_manhattan_distance(x['pickup_latitude'], x['pickup_longitude'], x['dropoff_latitude'], x['dropoff_longitude']),axis=1)

C.两个纬度之间的方位:

一个方位用来表示一点相对于另一个的方向。

def bearing_array(lat1, lng1, lat2, lng2): 
    AVG_EARTH_RADIUS = 6371 # in km 
    lng_delta_rad = np.radians(lng2 - lng1) 
    lat1, lng1, lat2, lng2 = map(np.radians, (lat1, lng1, lat2, lng2)) 
    y = np.sin(lng_delta_rad) * np.cos(lat2) 
    x = np.cos(lat1) * np.sin(lat2) - np.sin(lat1) * np.cos(lat2) * np.cos(lng_delta_rad) 
    return np.degrees(np.arctan2(y, x))

然后,我们可以使用该函数:

train['bearing'] = train.apply(lambda x: bearing_array(x['pickup_latitude'], x['pickup_longitude'], x['dropoff_latitude'], x['dropoff_longitude']),axis=1)

D.接送点之间的中心纬度和经度:

train.loc[:, 'center_latitude'] = (train['pickup_latitude'].values + train['dropoff_latitude'].values) / 2 
train.loc[:, 'center_longitude'] = (train['pickup_longitude'].values + train['dropoff_longitude'].values) / 2

这些是我们创建的新列:

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

5.自动编码器:

有时人们也使用自动编码器来创建自动特征。

什么是自动编码器?

编码器是深度学习函数,近似从 X 到 X 的映射,即输入=输出。他们首先将输入特征压缩成低维的表示,然后从该表示中重建输出。

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

我们可以使用这个表示向量作为我们模型的一个特征。

6.您可以对要素执行的一些常规操作:

  • 使用标准偏差进行标准化: 这是一种很好的方法,通常需要对线性模型、神经网络进行预处理
  • 基于日志的特征/目标: 使用基于日志的特征或基于日志的目标功能。如果使用假设要素呈正态分布的线性模型,对数变换可以使要素呈正态分布。在收入等扭曲变量的情况下,这也很方便。

或者在我们的例子中是旅行持续时间。下图是未进行对数变换的行程持续时间。

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

通过对数变换:

train['log_trip_duration'] = train['trip_duration'].apply(lambda x: np.log(1+x))

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

行程持续时间的对数变换偏差更小,因此对模型更有帮助。

7.一些基于直觉的附加功能:

日期时间特征:

人们可以基于领域知识和直觉创建附加的日期时间特征。例如,基于时间的特征,如“晚上”、“中午”、“晚上”、“上个月的购买量”、“上个星期的购买量”等。可以适用于特定的应用。

特定于领域的功能:

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

Style matters

假设您已经获得了一些购物车数据,并且想要对 TripType 进行分类。这正是沃尔玛招聘中的问题:Kaggle 上的旅行类型分类。

旅行类型的一些例子:客户可能进行一次小的每日晚餐旅行,一次每周大型杂货旅行,一次为即将到来的假期购买礼物的旅行,或者一次购买衣服的季节性旅行。

要解决这个问题,您可以考虑创建一个类似“时尚”的功能,通过将属于男性时尚、女性时尚、青少年时尚类别的项目数量相加来创建这个变量。

或者你可以创建一个类似“稀有” 的功能,它是通过根据我们拥有的数据将一些物品标记为稀有,然后计算购物车中这些稀有物品的数量来创建的。

这些功能可能有效,也可能无效。从我的观察来看,它们通常提供了很多价值。

感觉这就是塔吉特的《怀孕少女模特》的制作方式。 他们会有一个变量,保存一个怀孕少女可以购买的所有物品,并将它们放入一个分类算法中。

互动功能:

如果您有特征 A 和 B,您可以创建特征 A*B、A+B、A/B、A-B 等。

例如,要预测房子的价格,如果我们有两个特征长度和宽度,更好的办法是创建一个面积(长度 x 宽度)特征。

或者在某些情况下,一个比率可能比只有两个特征更有价值。示例:信用卡利用率比信用额度和已用额度变量更有价值。

结论

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

Creativity is vital!!!

这些只是我用来创建特征的一些方法。

但是说到 特色工程 肯定是没有限制的,限制你的只是你的想象力。

就这一点而言,我总是在考虑特征工程的同时记住我将使用什么模型。适用于随机森林的要素可能不适用于逻辑回归。

特征创建是反复试验的领域。在尝试之前,你无法知道什么样的转换有效,或者什么样的编码效果最好。永远是时间和效用的权衡。

有时,特征创建过程可能需要很长时间。在这种情况下,你可能想要并行化你的熊猫函数

虽然我已经尽力保持这篇文章尽可能详尽(这很可能是我在 medium 上最大的一篇文章),但我可能已经错过了一些有用的方法。请在评论中让我了解他们。

你可以找到这篇文章的所有代码,并在这个 Kaggle 内核中运行它

看一下 Google Cloud Specialization 上的高级机器学习。本课程将讨论模型的部署和生产。绝对推荐。

将来我也会写更多初学者友好的帖子。让我知道你对这个系列的看法。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

使用 Spark 处理大数据的指南

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-handle-big-data-using-spark-90b9be0fe89a?source=collection_archive---------4-----------------------

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

不仅仅是介绍

大数据已经成为数据工程的代名词。

但是数据工程和数据科学家之间的界限日益模糊。

此时此刻,我认为大数据必须是所有数据科学家的必备技能。

原因: 每天生成太多数据

这就把我们带到了 Spark

现在,大多数 Spark 文档虽然不错,但没有从数据科学家的角度进行解释。

所以我想尝试一下。

这篇文章的主题是——“如何让 Spark 发挥作用?”

这个帖子会很长。实际上我在媒体上最长的帖子,所以去买杯咖啡吧。

这一切是如何开始的?-MapReduce

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

假设你的任务是砍伐森林中的所有树木。也许在全球变暖的情况下,这不是一个好生意,但这符合我们的目的,我们只是在假设,所以我会继续。你有两个选择:

  • 让巴蒂斯塔带着电锯去做你的工作,让他一棵一棵地砍下每棵树。
  • 找 500 个有普通轴的普通人让他们在不同的树上工作。

你更喜欢哪个?

尽管有些人仍然会选择选项 1,但是对选项 2 的需求导致了 MapReduce 的出现。

用 Bigdata 的话来说,我们称 Batista 解决方案为纵向扩展***/纵向扩展*** ,即在单个 worker 中添加/填充大量 RAM 和硬盘。

第二种解决方案叫做水平缩放***/横向缩放*** 。就像你把许多普通的机器(内存较少)连接在一起,并行使用它们。

现在,垂直扩展比水平扩展有一定的优势:

  • **问题规模小就快:**想 2 棵树。巴蒂斯塔会用他的电锯干掉他们两个,而我们的两个家伙还在用斧子砍人。
  • 很容易理解。这是我们一贯的做事方式。我们通常以顺序模式思考问题,这就是我们整个计算机体系结构和设计的演变。

但是,水平缩放是

  • **更便宜:**得到 50 个正常家伙本身就比得到巴蒂斯塔这样的单身家伙便宜多了。除此之外,巴蒂斯塔需要大量的照顾和维护,以保持冷静,他非常敏感,即使是小东西,就像高容量内存的机器。
  • **问题规模大时速度更快:**现在想象 1000 棵树和 1000 个工人 vs 一个 Batista。通过横向扩展,如果我们面临一个非常大的问题,我们只需多雇佣 100 或 1000 名廉价工人。巴蒂斯塔就不是这样了。你必须增加内存,这意味着更多的冷却基础设施和更多的维护成本。

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

MapReduce 通过让我们使用 计算机集群 进行并行化,使得第二种选择成为可能。

现在,MapReduce 看起来像一个相当专业的术语。但是让我们打破它一点。MapReduce 由两个术语组成:

地图:

它基本上是应用/映射功能。我们将数据分成 n 个数据块,并将每个数据块发送给不同的工作器(映射器)。如果我们希望对数据行应用任何函数,我们的工作人员会这样做。

减少:

使用基于 groupby 键的函数来聚合数据。它基本上是一个团体。

当然,有很多事情在后台进行,以使系统按预期工作。

不要担心,如果你还不明白的话。继续读下去。在我将要提供的例子中,当我们自己使用 MapReduce 时,也许你就会明白了。

为什么是火花?

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

Because Pyspark

Hadoop 是第一个向我们介绍 MapReduce 编程范式的开源系统,Spark 是使它更快的系统,快得多(100 倍)。

Hadoop 中曾经有大量的数据移动,因为它曾经将中间结果写入文件系统。

这影响了你分析的速度。

Spark 给我们提供了一个内存模型,所以 Spark 在工作的时候不会对磁盘写太多。

简单地说,Spark 比 Hadoop 快,现在很多人都在用 Spark。

那么我们就不再多说,开始吧。

Spark 入门

安装 Spark 其实本身就很头疼。

由于我们想了解它是如何工作的,并真正使用它,我建议您在社区版中使用 Sparks on Databrickshereonline。别担心,这是免费的。

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

一旦您注册并登录,将出现以下屏幕。

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

你可以在这里开始一个新的笔记本。

选择 Python 笔记本,并为其命名。

一旦您启动一个新的笔记本并尝试执行任何命令,笔记本会询问您是否要启动一个新的集群。动手吧。

下一步将检查 sparkcontext 是否存在。要检查 sparkcontext 是否存在,只需运行以下命令:

sc

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

这意味着我们可以在笔记本上运行 Spark。

加载一些数据

下一步是上传一些我们将用来学习 Spark 的数据。只需点击主页选项卡上的“导入和浏览数据”。

在这篇文章的最后,我将使用多个数据集,但让我们从一些非常简单的开始。

让我们添加文件shakespeare.txt,你可以从这里下载。

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

您可以看到文件被加载到了/FileStore/tables/shakespeare.txt位置。

我们的第一个星火计划

我喜欢通过例子来学习,所以让我们完成分布式计算的“Hello World”:word count 程序。

# Distribute the data - Create a RDD 
lines = sc.textFile("/FileStore/tables/shakespeare.txt")# Create a list with all words, Create tuple (word,1), reduce by key i.e. the word
counts = (lines.flatMap(lambda x: x.split(' '))          
                  .map(lambda x: (x, 1))                 
                  .reduceByKey(lambda x,y : x + y))# get the output on local
output = counts.take(10)                                 
# print output
for (word, count) in output:                             
    print("%s: %i" % (word, count))

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

这是一个小例子,它计算文档中的字数,并打印出 10 个。

大部分工作在第二个命令中完成。

如果你还不能理解,请不要担心,因为我仍然需要告诉你让 Spark 工作的事情。

但是在我们进入 Spark 基础知识之前,让我们刷新一些 Python 基础知识。如果你使用过 Python 的函数式编程,理解 Spark 会变得容易得多。

对于那些没有使用过它的人,下面是一个简短的介绍。

Python 编程的函数式方法

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

1.地图

map用于将一个函数映射到一个数组或一个列表。假设您想对列表中的每个元素应用一些函数。

你可以通过简单地使用 for 循环来实现这一点,但是 python lambda 函数允许你在 python 中用一行代码来实现这一点。

my_list = [1,2,3,4,5,6,7,8,9,10]
# Lets say I want to square each term in my_list.
squared_list = map(lambda x:x**2,my_list)
print(list(squared_list))
------------------------------------------------------------
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

在上面的例子中,您可以将map看作一个带有两个参数的函数——一个函数和一个列表。

然后,它将该函数应用于列表中的每个元素。

lambda 允许你做的是写一个内联函数。在这里,**lambda x:x**2**部分定义了一个以 x 为输入并返回 x 的函数。

你也可以提供一个合适的函数来代替 lambda。例如:

def squared(x):
    return x**2my_list = [1,2,3,4,5,6,7,8,9,10]
# Lets say I want to square each term in my_list.
squared_list = map(squared,my_list)
print(list(squared_list))
------------------------------------------------------------
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

同样的结果,但是 lambda 表达式使得代码更紧凑,可读性更好。

2.过滤器

另一个广泛使用的功能是filter功能。这个函数有两个参数——一个条件和要过滤的列表。

如果你想使用某种条件过滤你的列表,你可以使用filter

my_list = [1,2,3,4,5,6,7,8,9,10]
# Lets say I want only the even numbers in my list.
filtered_list = filter(lambda x:x%2==0,my_list)
print(list(filtered_list))
---------------------------------------------------------------
[2, 4, 6, 8, 10]

3.减少

我要讲的下一个函数是 reduce 函数。这个功能将是 Spark 中的主力。

这个函数有两个参数——一个 reduce 函数有两个参数,还有一个要应用 reduce 函数的列表。

import functools
my_list = [1,2,3,4,5]
# Lets say I want to sum all elements in my list.
sum_list = functools.reduce(lambda x,y:x+y,my_list)
print(sum_list)

在 python2 中 reduce 曾经是 python 的一部分,现在我们不得不用reduce作为functools的一部分。

这里,lambda 函数接受两个值 x,y,并返回它们的和。直观上,您可以认为 reduce 函数的工作方式如下:

Reduce function first sends 1,2    ; the lambda function returns 3
Reduce function then sends 3,3     ; the lambda function returns 6
Reduce function then sends 6,4     ; the lambda function returns 10
Reduce function finally sends 10,5 ; the lambda function returns 15

我们在 reduce 中使用的 lambda 函数的一个条件是它必须是:

  • 交换的,即 a + b = b + a 和
  • 结合律即(a + b) + c == a + (b + c)。

在上面的例子中,我们使用了 sum,它既可交换又可结合。我们可以使用的其他函数:maxmin``*等。

再次走向火花

现在我们已经了解了 Python 函数式编程的基础,让我们再一次回到 Spark。

但首先,让我们深入了解一下 spark 的工作原理。火花实际上由两种东西组成,一个是司机,一个是工人。

工人通常做所有的工作,司机让他们做这些工作。

RDD

RDD(弹性分布式数据集)是一种并行化的数据结构,分布在工作节点上。它们是 Spark 编程的基本单元。

在我们的字数统计示例中,第一行

lines = sc.textFile("/FileStore/tables/shakespeare.txt")

我们取了一个文本文件,并把它分布在工作节点上,这样他们就可以并行地处理它。我们也可以使用函数sc.parallelize将列表并行化

例如:

data = [1,2,3,4,5,6,7,8,9,10]
new_rdd = sc.parallelize(data,4)
new_rdd
---------------------------------------------------------------
ParallelCollectionRDD[22] at parallelize at PythonRDD.scala:267

在 Spark 中,我们可以对 RDD 进行两种不同类型的操作:转换和操作。

  1. ****转换:从现有的 rdd 创建新的数据集
  2. ****动作:从 Spark 获得结果的机制

转型基础

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

让我们假设你已经得到了 RDD 形式的数据。

要重新报价,您的数据现在可供工作机访问。您现在想对数据进行一些转换。

你可能想要过滤,应用一些功能,等等。

在 Spark 中,这是使用转换函数来完成的。

Spark 提供了许多转换功能。这里 可以看到 的综合列表。我经常使用的一些主要工具有:

1.地图:

将给定函数应用于 RDD。

请注意,语法与 Python 略有不同,但它必须做同样的事情。现在还不要担心collect。现在,就把它想象成一个将 squared_rdd 中的数据收集回一个列表的函数。

data = [1,2,3,4,5,6,7,8,9,10]
rdd = sc.parallelize(data,4)
squared_rdd = rdd.map(lambda x:x**2)
squared_rdd.collect()
------------------------------------------------------
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2.过滤器:

这里也不奇怪。接受一个条件作为输入,只保留那些满足该条件的元素。

data = [1,2,3,4,5,6,7,8,9,10]
rdd = sc.parallelize(data,4)
filtered_rdd = rdd.filter(lambda x:x%2==0)
filtered_rdd.collect()
------------------------------------------------------
[2, 4, 6, 8, 10]

3.独特:

仅返回 RDD 中的不同元素。

data = [1,2,2,2,2,3,3,3,3,4,5,6,7,7,7,8,8,8,9,10]
rdd = sc.parallelize(data,4)
distinct_rdd = rdd.distinct()
distinct_rdd.collect()
------------------------------------------------------
[8, 4, 1, 5, 9, 2, 10, 6, 3, 7]

4.平面图:

类似于map,但是每个输入项可以映射到 0 个或多个输出项。

data = [1,2,3,4]
rdd = sc.parallelize(data,4)
flat_rdd = rdd.flatMap(lambda x:[x,x**3])
flat_rdd.collect()
------------------------------------------------------
[1, 1, 2, 8, 3, 27, 4, 64]

5.按键减少:

与 Hadoop MapReduce 中的 reduce 并行。

现在,如果 Spark 只处理列表,它就不能提供值。

在 Spark 中,有一个对 rdd 的概念,这使得它更加灵活。假设我们有一个数据,其中有一个产品、它的类别和它的售价。我们仍然可以并行处理数据。

data = [('Apple','Fruit',200),('Banana','Fruit',24),('Tomato','Fruit',56),('Potato','Vegetable',103),('Carrot','Vegetable',34)]
rdd = sc.parallelize(data,4)

现在我们的 RDDrdd拥有元组。

现在我们想找出我们从每个类别中获得的总收入。

为此,我们必须将我们的rdd转换成一个对 rdd,这样它就只包含键值对/元组。

category_price_rdd = rdd.map(lambda x: (x[1],x[2]))
category_price_rdd.collect()
-----------------------------------------------------------------
[(‘Fruit’, 200), (‘Fruit’, 24), (‘Fruit’, 56), (‘Vegetable’, 103), (‘Vegetable’, 34)]

这里我们使用了 map 函数来得到我们想要的格式。当使用文本文件时,形成的 RDD 有很多字符串。我们用map把它转换成我们想要的格式。

所以现在我们的category_price_rdd包含产品类别和产品销售价格。

现在,我们希望减少关键类别并对价格求和。我们可以通过以下方式做到这一点:

category_total_price_rdd = category_price_rdd.reduceByKey(lambda x,y:x+y)
category_total_price_rdd.collect()
---------------------------------------------------------[(‘Vegetable’, 137), (‘Fruit’, 280)]

6.按关键字分组:

类似于reduceByKey,但是没有减少,只是把所有的元素放在一个迭代器中。例如,如果我们希望将所有产品的类别和值作为关键字,我们将使用该函数。

让我们再次使用map来获得所需形式的数据。

data = [('Apple','Fruit',200),('Banana','Fruit',24),('Tomato','Fruit',56),('Potato','Vegetable',103),('Carrot','Vegetable',34)]
rdd = sc.parallelize(data,4)
category_product_rdd = rdd.map(lambda x: (x[1],x[0]))
category_product_rdd.collect()
------------------------------------------------------------
[('Fruit', 'Apple'),  ('Fruit', 'Banana'),  ('Fruit', 'Tomato'),  ('Vegetable', 'Potato'),  ('Vegetable', 'Carrot')]

然后我们使用groupByKey作为:

grouped_products_by_category_rdd = category_product_rdd.groupByKey()
findata = grouped_products_by_category_rdd.collect()
for data in findata:
    print(data[0],list(data[1]))
------------------------------------------------------------
Vegetable ['Potato', 'Carrot'] 
Fruit ['Apple', 'Banana', 'Tomato']

这里,groupByKey函数起作用了,它返回类别和该类别中的产品列表。

动作基础

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

你已经过滤了你的数据,映射了一些函数。完成你的计算。

现在,您希望在本地机器上获取数据,或者将数据保存到文件中,或者在 excel 或任何可视化工具中以一些图表的形式显示结果。

你需要为此采取行动。此处 提供了一个全面的行动列表

我倾向于使用的一些最常见的操作是:

1.收集:

这个动作我们已经用过很多次了。它获取整个 RDD,并将其返回到驱动程序。

2.减少:

使用 func 函数(接受两个参数并返回一个)聚合数据集的元素。该函数应该是可交换的和可结合的,这样它就可以被正确地并行计算。

rdd = sc.parallelize([1,2,3,4,5])
rdd.reduce(lambda x,y : x+y)
---------------------------------
15

3.拿走:

有时你需要查看你的 RDD 包含了什么,而不是获取内存中的所有元素。take返回 RDD 的前 n 个元素的列表。

rdd = sc.parallelize([1,2,3,4,5])
rdd.take(3)
---------------------------------
[1, 2, 3]

4.外卖:

takeOrdered使用自然顺序或自定义比较器返回 RDD 的前 n 个元素。

rdd = sc.parallelize([5,3,12,23])# descending order
rdd.takeOrdered(3,lambda s:-1*s)
----
[23, 12, 5]rdd = sc.parallelize([(5,23),(3,34),(12,344),(23,29)])# descending order
rdd.takeOrdered(3,lambda s:-1*s[1])
---
[(12, 344), (3, 34), (23, 29)]

我们终于学到了基础知识。让我们回到字数统计的例子

理解字数示例

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

现在我们有点理解 Spark 提供给我们的转换和动作。

现在理解 wordcount 程序应该不难。让我们一行一行地检查程序。

第一行创建了一个 RDD,并将其分发给工人。

lines = sc.textFile("/FileStore/tables/shakespeare.txt")

这个 RDD lines包含文件中的句子列表。您可以使用take查看 rdd 内容

lines.take(5)
--------------------------------------------
['The Project Gutenberg EBook of The Complete Works of William Shakespeare, by ',  'William Shakespeare',  '',  'This eBook is for the use of anyone anywhere at no cost and with',  'almost no restrictions whatsoever.  You may copy it, give it away or']

这个 RDD 的形式是:

['word1 word2 word3','word4 word3 word2']

下一行实际上是整个脚本中最重要的函数。

counts = (lines.flatMap(lambda x: x.split(' '))          
                  .map(lambda x: (x, 1))                 
                  .reduceByKey(lambda x,y : x + y))

它包含了我们对 RDD 线所做的一系列变换。首先,我们做一个flatmap转换。

flatmap转换将行作为输入,将单词作为输出。所以在flatmap变换之后,RDD 的形式是:

['word1','word2','word3','word4','word3','word2']

接下来,我们对flatmap输出进行map转换,将 RDD 转换为:

[('word1',1),('word2',1),('word3',1),('word4',1),('word3',1),('word2',1)]

最后,我们做一个reduceByKey转换,计算每个单词出现的次数。

之后 RDD 接近最终所需的形状。

[('word1',1),('word2',2),('word3',2),('word4',1)]

下一行是一个动作,它在本地获取生成的 RDD 的前 10 个元素。

output = counts.take(10)

这一行只是打印输出

for (word, count) in output:                 
    print("%s: %i" % (word, count))

这就是单词计数程序。希望你现在明白了。

到目前为止,我们讨论了 Wordcount 示例以及可以在 Spark 中使用的基本转换和操作。但我们在现实生活中不做字数统计。

我们必须解决更大、更复杂的问题。不要担心!无论我们现在学到了什么,都将让我们做得更好。

用实例点燃行动的火花

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

让我们用一个具体的例子来处理一些常见的转换。

我们将在 Movielens ml-100k.zip 数据集上工作,这是一个稳定的基准数据集。1000 个用户对 1700 部电影的 100,000 次评分。1998 年 4 月发布。

Movielens 数据集包含许多文件,但我们将只处理 3 个文件:

1) 用户:该文件名保存为“u.user”,该文件中的列有:

['user_id', 'age', 'sex', 'occupation', 'zip_code']

2) 评级:该文件名保存为“u.data”,该文件中的列有:

['user_id', 'movie_id', 'rating', 'unix_timestamp']

3) 电影:该文件名保存为“u.item”,该文件中的栏目有:

['movie_id', 'title', 'release_date', 'video_release_date', 'imdb_url', and 18 more columns.....]

让我们从使用 home 选项卡上的 Import and Explore Data 将这 3 个文件导入 spark 实例开始。

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

我们的业务合作伙伴现在找到我们,要求我们从这些数据中找出 25 个收视率最高的电影名称 。一部电影被评了多少次?

让我们将数据加载到不同的 rdd 中,看看数据包含什么。

userRDD = sc.textFile("/FileStore/tables/u.user") 
ratingRDD = sc.textFile("/FileStore/tables/u.data") 
movieRDD = sc.textFile("/FileStore/tables/u.item") 
print("userRDD:",userRDD.take(1))
print("ratingRDD:",ratingRDD.take(1))
print("movieRDD:",movieRDD.take(1))
-----------------------------------------------------------
userRDD: ['1|24|M|technician|85711'] 
ratingRDD: ['196\t242\t3\t881250949'] 
movieRDD: ['1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0']

我们注意到,要回答这个问题,我们需要使用ratingRDD。但是ratingRDD没有电影名。

所以我们必须用movie_id合并movieRDDratingRDD

我们如何在 Spark 中做到这一点?

下面是代码。我们还使用了新的转换leftOuterJoin。请务必阅读下面代码中的文档和注释。

OUTPUT:
--------------------------------------------------------------------RDD_movid_rating: [('242', '3'), ('302', '3'), ('377', '1'), ('51', '2')] 
RDD_movid_title: [('1', 'Toy Story (1995)'), ('2', 'GoldenEye (1995)')] 
rdd_movid_title_rating: [('1440', ('3', 'Above the Rim (1994)'))] rdd_title_rating: [('Above the Rim (1994)', 1), ('Above the Rim (1994)', 1)] 
rdd_title_ratingcnt: [('Mallrats (1995)', 54), ('Michael Collins (1996)', 92)] ##################################### 
25 most rated movies: [('Star Wars (1977)', 583), ('Contact (1997)', 509), ('Fargo (1996)', 508), ('Return of the Jedi (1983)', 507), ('Liar Liar (1997)', 485), ('English Patient, The (1996)', 481), ('Scream (1996)', 478), ('Toy Story (1995)', 452), ('Air Force One (1997)', 431), ('Independence Day (ID4) (1996)', 429), ('Raiders of the Lost Ark (1981)', 420), ('Godfather, The (1972)', 413), ('Pulp Fiction (1994)', 394), ('Twelve Monkeys (1995)', 392), ('Silence of the Lambs, The (1991)', 390), ('Jerry Maguire (1996)', 384), ('Chasing Amy (1997)', 379), ('Rock, The (1996)', 378), ('Empire Strikes Back, The (1980)', 367), ('Star Trek: First Contact (1996)', 365), ('Back to the Future (1985)', 350), ('Titanic (1997)', 350), ('Mission: Impossible (1996)', 344), ('Fugitive, The (1993)', 336), ('Indiana Jones and the Last Crusade (1989)', 331)] #####################################

《星球大战》是 Movielens 数据集中评分最高的电影。

现在我们可以使用下面的命令在一个命令中完成所有这些,但是代码现在有点乱。

我这样做是为了说明可以在 Spark 中使用链接函数,并且可以绕过变量创建过程。

让我们再做一次。为了练习:

现在,我们希望使用相同的数据集找到评分最高的 25 部电影。我们实际上只想要那些已经被评级至少 100 次的电影。

OUTPUT:
------------------------------------------------------------
rdd_title_ratingsum: [('Mallrats (1995)', 186), ('Michael Collins (1996)', 318)] 
rdd_title_ratingmean_rating_count: [('Mallrats (1995)', (3.4444444444444446, 54))] 
rdd_title_rating_rating_count_gt_100: [('Butch Cassidy and the Sundance Kid (1969)', (3.949074074074074, 216))]##################################### 
25 highly rated movies: [('Close Shave, A (1995)', (4.491071428571429, 112)), ("Schindler's List (1993)", (4.466442953020135, 298)), ('Wrong Trousers, The (1993)', (4.466101694915254, 118)), ('Casablanca (1942)', (4.45679012345679, 243)), ('Shawshank Redemption, The (1994)', (4.445229681978798, 283)), ('Rear Window (1954)', (4.3875598086124405, 209)), ('Usual Suspects, The (1995)', (4.385767790262173, 267)), ('Star Wars (1977)', (4.3584905660377355, 583)), ('12 Angry Men (1957)', (4.344, 125)), ('Citizen Kane (1941)', (4.292929292929293, 198)), ('To Kill a Mockingbird (1962)', (4.292237442922374, 219)), ("One Flew Over the Cuckoo's Nest (1975)", (4.291666666666667, 264)), ('Silence of the Lambs, The (1991)', (4.28974358974359, 390)), ('North by Northwest (1959)', (4.284916201117318, 179)), ('Godfather, The (1972)', (4.283292978208232, 413)), ('Secrets & Lies (1996)', (4.265432098765432, 162)), ('Good Will Hunting (1997)', (4.262626262626263, 198)), ('Manchurian Candidate, The (1962)', (4.259541984732825, 131)), ('Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb (1963)', (4.252577319587629, 194)), ('Raiders of the Lost Ark (1981)', (4.252380952380952, 420)), ('Vertigo (1958)', (4.251396648044692, 179)), ('Titanic (1997)', (4.2457142857142856, 350)), ('Lawrence of Arabia (1962)', (4.23121387283237, 173)), ('Maltese Falcon, The (1941)', (4.2101449275362315, 138)), ('Empire Strikes Back, The (1980)', (4.204359673024523, 367))] 
#####################################

到目前为止,我们一直在谈论 rdd,因为它们非常强大。

您也可以使用 rdd 来处理非关系数据库。

他们让你做很多用 SparkSQL 做不到的事情?

是的,你也可以在 Spark 中使用 SQL,这就是我现在要说的。

火花数据帧

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

Spark 为美国数据科学家提供了 DataFrame API 来处理关系数据。这是为喜欢冒险的人准备的文档。

请记住,在背景中,它仍然是所有的 rdd,这就是为什么这篇文章的开始部分侧重于 rdd。

我将从一些你使用 Spark 数据框需要的常用功能开始。会看起来很像熊猫,只是有一些语法上的变化。

1.读取文件

ratings = spark.read.load("/FileStore/tables/u.data",format="csv", sep="\t", inferSchema="true", header="false")

2.显示文件

我们有两种方法使用 Spark 数据帧显示文件。

ratings.show()

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

display(ratings)

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

我更喜欢display,因为它看起来更漂亮、更干净。

3.更改列名

功能性好。总是需要。别忘了单子前面的*

ratings = ratings.toDF(*['user_id', 'movie_id', 'rating', 'unix_timestamp'])display(ratings)

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

4.一些基本数据

print(ratings.count()) #Row Count
print(len(ratings.columns)) #Column Count
---------------------------------------------------------
100000
4

我们还可以使用以下方式查看数据帧统计数据:

display(ratings.describe())

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

5.选择几列

display(ratings.select('user_id','movie_id'))

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

6.过滤器

使用多个条件过滤数据帧:

display(ratings.filter((ratings.rating==5) & (ratings.user_id==253)))

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

7.分组依据

我们也可以对 spark 数据帧使用 groupby 函数。除了你需要导入pyspark.sql.functions之外,和熊猫组基本相同

**from** pyspark.sql **import** functions **as** F
display(ratings.groupBy("user_id").agg(F.count("user_id"),F.mean("rating")))

在这里,我们发现了每个 user_id 的评分计数和平均评分

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

8.分类

display(ratings.sort("user_id"))

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

我们也可以使用下面的F.desc函数进行降序排序。

# descending Sort
**from** pyspark.sql **import** functions **as** F
display(ratings.sort(F.desc("user_id")))

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

与 Spark 数据帧连接/合并

我找不到与 Spark 数据帧合并功能相当的 pandas,但是我们可以将 SQL 用于数据帧,因此我们可以使用 SQL 合并数据帧。

让我们试着对评级运行一些 SQL。

我们首先将评级 df 注册到一个临时表 ratings_table 中,我们可以在这个表中运行 sql 操作。

如您所见,SQL select 语句的结果又是一个 Spark 数据帧。

ratings.registerTempTable('ratings_table')
newDF = sqlContext.sql('select * from ratings_table where rating>4')
display(newDF)

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

现在,让我们再添加一个 Spark 数据帧,看看是否可以通过 SQL 查询使用 join:

#get one more dataframe to join
movies = spark.read.load("/FileStore/tables/u.item",format="csv", sep="|", inferSchema="true", header="false")# change column names
movies = movies.toDF(*["movie_id","movie_title","release_date","video_release_date","IMDb_URL","unknown","Action","Adventure","Animation ","Children","Comedy","Crime","Documentary","Drama","Fantasy","Film_Noir","Horror","Musical","Mystery","Romance","Sci_Fi","Thriller","War","Western"])display(movies)

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

现在,让我们尝试连接 movie_id 上的表,以获得 ratings 表中的电影名称。

movies.registerTempTable('movies_table')display(sqlContext.sql('select ratings_table.*,movies_table.movie_title from ratings_table left join movies_table on movies_table.movie_id = ratings_table.movie_id'))

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

让我们试着做我们之前在 RDDs 上做的事情。寻找收视率最高的 25 部电影:

mostrateddf = sqlContext.sql('select movie_id,movie_title, count(user_id) as num_ratings from (select ratings_table.*,movies_table.movie_title from ratings_table left join movies_table on movies_table.movie_id = ratings_table.movie_id)A group by movie_id,movie_title order by num_ratings desc ')display(mostrateddf)

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

并找到投票数超过 100 的最高评级的前 25 部电影:

highrateddf = sqlContext.sql('select movie_id,movie_title, avg(rating) as avg_rating,count(movie_id) as num_ratings from (select ratings_table.*,movies_table.movie_title from ratings_table left join movies_table on movies_table.movie_id = ratings_table.movie_id)A group by movie_id,movie_title having num_ratings>100 order by avg_rating desc ')display(highrateddf)

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

我在上面的查询中使用了 GROUP BY、HAVING 和 ORDER BY 子句以及别名。这表明你可以用sqlContext.sql做很多复杂的事情

关于显示的一个小注意事项

您也可以使用display命令显示笔记本中的图表。

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

选择 剧情选项可以看到更多选项。

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

从火花数据帧转换到 RDD 数据帧,反之亦然:

有时,您可能希望从 spark 数据框架转换到 RDD 数据框架,反之亦然,这样您就可以同时拥有两个世界的优势。

要从 DF 转换到 RDD,您只需执行以下操作:

highratedrdd =highrateddf.rdd
highratedrdd.take(2)

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

要从 RDD 转到数据帧:

from pyspark.sql import Row
# creating a RDD first
data = [('A',1),('B',2),('C',3),('D',4)]
rdd = sc.parallelize(data)# map the schema using Row.
rdd_new = rdd.map(lambda x: Row(key=x[0], value=int(x[1])))# Convert the rdd to Dataframe
rdd_as_df = sqlContext.createDataFrame(rdd_new)
display(rdd_as_df)

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

RDD 为您提供了 更多的控制 以时间和编码工作为代价。而 Dataframes 为您提供了 熟悉的编码 平台。现在你可以在这两者之间来回移动。

结论

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

这是一个很大的帖子,如果你完成了,恭喜你。

Spark 为我们提供了一个接口,我们可以在这个接口上对数据进行转换和操作。Spark 还提供了 Dataframe API 来简化数据科学家向大数据的过渡。

希望我已经很好地介绍了基础知识,足以激起您的兴趣,并帮助您开始使用 Spark。

你可以在GitHub库中找到所有的代码。

此外,如果你想了解更多关于 Spark 和 Spark DataFrames 的知识,我想在 Coursera 上调出这些关于大数据基础的优秀课程:HDFS、MapReduce 和 Spark RDD

我以后也会写更多这样的帖子。让我知道你对这个系列的看法。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值