1 年在现实世界中从事数据科学研究
到目前为止,我学到的最重要的经验是
好的,所以实际上是 14 个月,但它没有和“1 年”一样的环。我已经在一家名为英国新闻的公司工作了 14 个月。作为一名消费者和增长算法数据科学家,我现在即将在 Deliveroo 开始新的旅程,所以我认为现在是反思我在英国新闻工作期间所学到的东西的好时机。
老实说,我学到了很多东西。鉴于这是我在学术界之外的第一份工作,这句话可能是显而易见的。但令人惊讶的是(至少令我惊讶的是),我学到的最重要的东西并不是数据科学中的“硬技能”。相反,我发现我学到的最有价值的东西是“软技能”。我开始意识到,要想在像英国新闻这样的大公司中获得成功,不仅仅是在数据科学领域,你必须掌握软技能。
为了说明我认为这些软技能有多重要:
我真诚地相信,如果我在英国新闻工作时只具备 SQL、数据准备、线性回归和逻辑分类器的技能,只要我完全掌握了软技能,我就可以成为一名成功的数据科学家。—我
现在我知道这是一个巨大的声明,但即使你不同意我的观点,你可能会在阅读我的帖子后理解我的观点。
我们开始吧
1)沟通是关键
无论你的手艺有多好,能够与你周围的每个人交流是成功最重要的技能。沟通是与团队和利益相关者建立融洽关系的第一步。一旦你与相关人员建立了融洽的关系,管理期望、快速完成请求/帮助以及许多其他好处就容易多了。
事情不会总是一帆风顺。难免会出问题。我经历过的一个例子是,我们制作的分析仪表板没有显示某些文章的任何数据(这种情况比我们希望的更频繁)。当利益相关者在我们之前发现时,就会产生问题,因为他们认为我们不知道问题是什么。然而,在我们先发现并在利益相关者发现之前让他们知道的场合,他们从不生气。唯一的要求是我们让他们知道什么时候事情会正常工作。
这不仅仅适用于利益相关者。在数据技术团队中,我发现许多团队成员喜欢我以简单易懂的方式解释复杂的数据科学方法。这不仅仅是能够解释参数估计或随机森林分类器如何工作,还包括理解什么对其他成员是重要的。在谈论数据科学项目时,重要的是从业务问题入手推动项目。这可以让你把每个人带到和你一样的思考之旅。
如果我不能像以前那样很好地沟通,我就不会有在英国新闻的成功,我会确保在我的职业生涯中不断改进。
2)同理心对团队凝聚很重要
对于是什么让团队成功已经有了全面的研究。最重要的是这个概念 心理安全 。然而,另一个我觉得很重要的因素是同理心。
我记得在我的数据科学训练营中,有一整节课都是关于移情的。当时我并没有真正理解。但现在我觉得我能真正体会到它的重要性。
换位思考不仅能让你理解你的同事,还能回应他们的痛点。而正是这一点能让你成为更好的同事。
一个简单的例子是,有人不认同你是一名数据科学家,尽管你在一天结束时还有其他工作要完成,但一位同事还是要求你对一份冗长、无结构的 PDF 文档进行快速分析。这个人显然不理解分析的过程,为什么非结构化的 PDF 文档不一定是数据分析的最佳选择,他们也不尊重你必须做的其他工作。这种误解会导致团队中的摩擦。
团队中也有很多不同的方式会产生挫折。这篇文章的标题是:工程师不应该写 ETL:建立高功能数据科学部门的指南强调了数据科学家、数据工程师和基础设施工程师之间可能发生的一些挫折。例如,数据科学家编写了糟糕的代码,他们希望工程师能马上生产出来。我在英国新闻工作的时候见过(也做过)几次这样的事情。这是因为缺乏同理心和理解。
花些时间去了解你的同事。了解他们做什么,他们的痛点是什么。了解他们的经验水平。了解这些事情有助于你了解你的同事。当某些涉及他们的工作出现在你面前时,你可能会主动提供帮助。也许数据工程师可以和数据科学家坐下来,在数据科学家开始写之前,讨论什么是好的、可生产的代码。工程师还可以解释他们的过程和期限,以便他们为工作的完成设定现实的期望。当资深员工与初级员工一起工作时,这一点尤其有用。请注意,良好的沟通会产生共鸣。
3)感知和可测量的价值一样重要
我想大多数人会告诉你,如果你要开发一个产品,你需要定义一个衡量成功的标准。通常,这包括 A/B 测试,以确定新产品/功能的引入是否产生了积极的影响。
然而,尽管新闻英国的数据技术团队生产的大多数产品和算法没有经过这一过程,但这些产品仍然被认为是成功的。
这是因为这些产品正在推动公司内部的文化转变。人们对数据技术团队有着积极的看法,认为我们是一个可以创造产品来加速他们实现目标的团队。
当时我对这个还不够欣赏。当公司的高级成员被收买时,团队的生活就会轻松得多。例如,它使得获得资金更加容易。记住,你仍然要玩政治游戏。
其他重要经验
- 找到‘数据冠军’。这些是数据团队之外的人,他们是数据的强烈拥护者。他们将能够影响团队中的其他人,并成为您项目的产品所有者。
- 说话声音最大的人往往会成功。这可能只是拥有层层官僚机构和丰富政治的大公司所固有的东西,但感觉上最响亮的人物往往会在这些公司的职业阶梯上上升。
- 从最大声开始,你需要能够向爱斯基摩人卖冰。你不仅需要大声宣传你在做什么,还必须推销它。这就是你获得高管认同的方式。
- 每个好的机器学习项目都需要坚实的 EDA 和描述性分析。做“酷机器学习”模型是很有诱惑力的,它可以做出预测,让人们相信你是一个魔术师。然而,要充分利用数据,你必须理解它,这意味着探索它。你不会脱离标准分析。
- **持续监控的健壮代码对于代码库的长寿是必要的。**生产中会出现问题,但你可以通过建立强大的管道来缓解这一问题。此外,如果输出没有被连续监控,那么性能是一个谜。当原作者离开公司时,代码库被取代只是时间问题。
- 解决商业问题并不像提出解决方案那么简单。仅仅因为你提供了一个解决方案,并不意味着人们会听。你必须“聪明”地对待这件事,并且以相关人员会倾听的方式给出反馈。让相关人员在目标上保持一致,然后以他们认为共同负责的方式带领他们踏上解决方案之旅。Scott Shipp 在他的文章中对此做了很好的解释:“如何提出在工作中推动变革的问题”。在许多情况下,你自己想出的解决方案并不是最优的,所以听取他人的意见是有益的。但是认为人们和你看世界的方式一样是错误的。
在过去的一年里,我学到了很多更重要的东西,但我觉得这些是最重要的。
你怎么想呢?我错过了什么重要的课程吗?你不同意这些吗?欢迎在评论中继续讨论。感谢你阅读☺
简而言之,10 种常见的软件架构模式
想知道大型企业级系统是如何设计的吗?在主要的软件开发开始之前,我们必须选择一个合适的架构,它将为我们提供期望的功能和质量属性。因此,在将它们应用到我们的设计之前,我们应该理解不同的架构。
什么是架构模式?
根据维基百科,
一个架构模式是一个通用的、可重用的解决方案,用于解决给定环境下软件架构中常见的问题。架构模式类似于软件设计模式,但是范围更广。
在本文中,我将简要解释以下 10 种常见的架构模式及其用法和优缺点。
- 分层图案
- 客户机-服务器模式
- 主从模式
- 管道过滤器模式
- 经纪人模式
- 点对点模式
- 事件总线模式
- 模型-视图-控制器模式
- 黑板图案
- 口译员模式
1.分层模式
这种模式可以用来构建程序,这些程序可以分解成子任务组,每个子任务都处于特定的抽象层次。每一层都向上一层提供服务。
一般信息系统最常见的 4 层如下。
- 表示层(又称 UI 层)
- 应用层(又称服务层)
- 业务逻辑层(也称域层)
- 数据访问层(也称为持久层)
使用
- 一般桌面应用程序。
- 电子商务网络应用。
Layered pattern
2.客户机-服务器模式
这种模式由两方组成;一个服务器和多个客户端。服务器组件将向多个客户端组件提供服务。客户端向服务器请求服务,服务器向这些客户端提供相关服务。此外,服务器继续监听客户端请求。
使用
- 电子邮件、文档共享和银行业务等在线应用。
Client-server pattern
3.主从模式
这种模式由两方组成;主人和奴隶。主组件在相同的从组件之间分配工作,并根据从组件返回的结果计算最终结果。
使用
- 在数据库复制中,主数据库被视为权威来源,从属数据库与之同步。
- 计算机系统中连接到总线的外围设备(主驱动器和从驱动器)。
Master-slave pattern
4.管道过滤模式
这种模式可以用来构建产生和处理数据流的系统。每个处理步骤都包含在一个过滤器组件中。待处理的数据通过管道传递。这些管道可用于缓冲或同步目的。
使用
- 编译器。连续过滤器执行词法分析、解析、语义分析和代码生成。
- 生物信息学的工作流程。
Pipe-filter pattern
5.经纪人模式
这种模式用于构建具有解耦组件的分布式系统。这些组件可以通过远程服务调用相互交互。一个代理组件负责组件之间的通信协调。
服务器向代理发布它们的能力(服务和特征)。客户端向代理请求服务,然后代理将客户端从其注册中心重定向到合适的服务。
使用
Broker pattern
6.对等模式
在这种模式中,单个组件被称为对等体。对等体既可以作为客户端向其他对等体请求服务,也可以作为服务器向其他对等体提供服务。对等体可以充当客户端或服务器,或者两者兼而有之,并且它可以随时间动态地改变其角色。
使用
Peer-to-peer pattern
7.事件总线模式
该模式主要处理事件,有 4 个主要组成部分;事件源、事件监听器、通道和事件总线。源将消息发布到事件总线上的特定通道。听众订阅特定的频道。侦听器会被通知发布到它们之前订阅的通道的消息。
使用
- Android 开发
- 通知服务
Event-bus pattern
8.模型-视图-控制器模式
这种模式,也称为 MVC 模式,将交互式应用程序分为 3 个部分,
- 模型 —包含核心功能和数据
- 视图 —向用户显示信息(可定义多个视图)
- 控制器 —处理来自用户的输入
这样做是为了将信息的内部表示与向用户呈现信息以及用户接受信息的方式分开。它将组件解耦,并允许高效的代码重用。
使用
Model-view-controller pattern
9.黑板模式
这种模式对于不知道确定性解决策略的问题很有用。黑板模式由 3 个主要部分组成。
- 黑板 —包含来自解空间的对象的结构化全局存储器
- 知识源 —具有自身表示的专门模块
- 控制组件 —选择、配置和执行模块。
所有组件都可以访问黑板。组件可以产生添加到黑板上的新数据对象。组件在黑板上寻找特定类型的数据,并可能通过与现有知识源的模式匹配来找到这些数据。
使用
- 语音识别
- 车辆识别和跟踪
- 蛋白质结构鉴定
- 声纳信号解释。
Blackboard pattern
10。解释器模式
该模式用于设计一个组件,该组件解释用专用语言编写的程序。它主要规定了如何评估程序行,即用特定语言编写的句子或表达式。基本思想是为语言的每个符号创建一个类。
使用
- 数据库查询语言,如 SQL。
- 用于描述通信协议的语言。
Interpreter pattern
建筑模式的比较
下表总结了每种架构模式的优缺点。
Comparison of Architectural Patterns
希望这篇文章对你有用。我很想听听你的想法。😇
感谢阅读。😊
干杯!😃
参考
我在 2018 年探索的 10 个数据科学工具
Source: geralt (pixabay)
新的语言、库和服务
2018 年,我投入了大量时间学习和撰写关于数据科学方法和技术的文章。2018 年上半年,我写了一个关于创业公司数据科学的博客系列,我把它写成了一本书。下半年,我在 Zynga 开始了新的工作,学习了包括 PySpark 在内的许多新工具。这篇文章重点介绍了我在过去一年中探索的一些不同的图书馆和服务。
1。Bookdown 我使用 Bookdown 将我的博客系列的内容转化为可出版的格式和自行出版的书。这个包使数据科学家能够将 R Markdown 文档转换成多种格式,包括 PDF、epub 和 web 文档。大多数数据科学家可能已经在使用 markdown 了,因为它用于 Github 文档,这使得这个包非常适合放在您的工具箱中。支持许多不同的内核,这意味着这个库不仅限于 R 代码。我发现用 Bookdown 写一本书比用 Latex 容易得多,我的论文就是用 Latex 写的。
数据科学家写书有很多令人信服的理由。我想更好地理解新工具,而且…
towardsdatascience.com](/data-science-for-startups-blog-book-bf53f86ca4d5)
2。DataFlow 我在 GCP 最喜欢的工具之一是 Cloud DataFlow,它使数据科学家能够创作在自动扩展和完全托管的环境中运行的数据管道。在过去的一年里,我写了如何使用数据流来创作数据管道、生产模型和游戏模拟。这是一个适合许多与 Spark 相同用例的工具,但我发现它更适合在构建流应用程序时使用。
我正在进行的关于在创业公司建立数据科学学科的系列文章的第三部分。您可以找到所有……
towardsdatascience.com](/data-science-for-startups-data-pipelines-786f6746a59a)
3。在 Zynga,我们已经开始使用 Python 生态系统来标准化我们的分析工具。在 2018 年开始我的新角色之前,我对这种语言的接触有限,必须快速掌握新的编程语言。我写了我学习 Python 的动机以及我学习 PySpark 和深度学习等新技术的愿望。我还写了我学习新数据科学语言的方法。我还在学习关于 Python 的新东西,但是现在已经对这门语言有了相当好的掌握。
在不断变化的数据科学工具生态系统中,您经常会发现自己需要学习一门新语言,以便…
towardsdatascience.com](/learning-a-new-data-science-language-aa7656be730a)
4。AWS Lambda 过去一年我一直关注的趋势之一是让数据科学家能够将模型投入生产。实现这一目标的一种可扩展方式是使用 AWS Lambda 等工具,这使得数据科学家能够在云中部署模型。使用 Lambda,您可以指定一个函数,比如将一个预测模型应用到一组输入变量,AWS 负责部署该函数,并使其具有可伸缩性和容错性。我写了一篇展示使用 AWS Lambda 部署一个分类模型的文章。
我的创业数据科学系列的第二部分主要关注 Python。
towardsdatascience.com](/data-science-for-startups-model-services-2facf2dde81d)
5。Featuretools 深度学习的一大创新是能够从半结构化数据(如文本文档)中自动生成特征。结构化数据集的特征工程也取得了进展,例如 featuretools 库,它自动化了数据科学家在处理数据以建立预测模型时将执行的许多工作。使用此包,您可以定义数据集中不同表(实体)之间的关联,并且库会生成大量可应用于构建模型的要素。我展示了如何使用这种方法将 NHL 游戏分类为常规或季后赛。
使用 Python 和 FeatureTools 库预测哪些 NHL 比赛是季后赛。
towardsdatascience.com](/automated-feature-engineering-for-predictive-modeling-d8c9fa4e478b)
6。2018 年是我终于开始接触深度学习的一年。我最初使用 Keras 的 R 接口来构建深度学习模型,但后来过渡到 Python 来处理这个包。由于我大部分时间都在处理结构化数据集,我还没有发现多少深度学习是最佳方法的情况,但我发现使用定制损失函数的能力非常有用。我还写了关于使用 Java 通过数据流部署 Keras 模型的文章。
我正在进行的关于在创业公司建立数据科学学科的系列文章的第十部分,第一篇文章来自…
towardsdatascience.com](/data-science-for-startups-deep-learning-40d4d8af8009)
7。在学习 Python 之前,Jetty 是我用 Java 建立 web 服务的首选方法。Flask 是将 Python 函数公开为 web 调用的有用工具,对于构建微服务也很有用。我写了一篇关于使用 Flask 为深度学习分类器设置 web 端点的博文。在 GDC 2019 上,我们将展示 Zynga 如何使用 flask 和 gunicorn 来构建供内部使用的微服务。
这篇文章演示了如何使用 Keras 构建的深度学习模型来设置端点以服务于预测。它…
towardsdatascience.com](/deploying-keras-deep-learning-models-with-flask-5da4181436a2)
8。在过去的一年里,我在 PySpark 上做了越来越多的工作,因为它可以扩展到巨大的数据集,并且一旦你熟悉了 Python,就很容易接近它。如果你想开始,我写了一篇关于 PySpark 的简介,展示了如何开始运行一些常见的任务。在简介中,我展示了如何使用 Databricks community edition 来启动和运行 Spark 环境,但我也在博客中介绍了如何在 GCP 上使用 Dataproc 来建立 Spark 集群。
我的创业数据科学系列的第四部分现在关注 Python。
towardsdatascience.com](/data-science-for-startups-pyspark-1acf51e9d6ba)
9。熊猫 UDF 并不是所有的 Python 代码都可以直接在 PySpark 中应用,但是熊猫 UDF 使得在 Spark 中重用 Python 代码变得容易得多。通过 Pandas 用户定义函数(UDF ),您可以使用 Pandas 数据帧编写函数,并指定用于分割数据帧的分区键。结果是,一个大的 Spark 数据帧在集群中的节点之间进行分区,转换为您的函数所操作的 Pandas 数据帧,然后将结果组合回一个大的 Spark 数据帧。这意味着您可以在分布式模式下使用现有的 Python 代码。我在我的 PySpark 介绍帖子中提供了一个熊猫 UDF 的例子。我将在 2019 年 Spark 峰会上展示 Zynga 如何使用 Pandas UDFs 构建预测模型。
PySpark 是一种很棒的语言,可以进行大规模的探索性数据分析,构建机器学习管道,以及…
towardsdatascience.com](/a-brief-introduction-to-pyspark-ff4284701873)
10。开放数据集 为了写过去一年的数据科学,我不得不提供开放数据集的例子。我使用的一些数据集包括来自 Kaggle 、 BigQuery 和政府数据集的例子。
美国最近通过的税改法案引发了许多关于该国财富分配的问题…
medium.freecodecamp.org](https://medium.freecodecamp.org/clustering-the-top-1-asset-analysis-in-r-6c529b382b42)
2018 年是学习新数据科学技术的伟大一年,我很高兴在新的一年继续学习。2019 年,我很期待探索强化学习,火花流,以及半结构化数据集的深度学习。
本·韦伯是 Zynga 的首席数据科学家。我们正在招聘!
10 幅完美诠释日常生活的有趣图表
我们日常生活中的一些元素,几乎每个人都能很容易地联想到。有些很有趣,很有娱乐性,有些则完全令人沮丧。
为了让你的一周有一个好的开始,我们分享了 10 幅由 Visme 制作的有趣图表,它们完美地解释了日常生活。我们希望他们会给你一个开怀大笑!
1.狗和猫:它们有多想念你
每一个拥有这些宠物中任何一种的人都能体会到狗和猫在情感依恋水平上的差异。
到你的邮箱走一趟,狗会焦急地看着,以确保你没有被外星人绑架。另一方面,猫对人类的依赖程度稍低,人类生存的唯一目的就是为它们服务。
2.我女儿是如何打发时间的
青少年已经把狂看网飞带到了一个完全不同的水平。任何一个成功存活到两位数的孩子的父母都会立即理解维恩图所传达的信息。如果你剥夺了他们的机会,他们会立刻变得无聊、疲倦和/或饥饿。
3.自由职业者的理想日程与现实
Create infographics like this for free with Visme.
通往地狱的道路是由良好的意愿铺成的,尤其是对我们这些在家工作的自由职业者来说。完全控制你的时间表既美好又危险。尽管制定了最好的计划,每个人都有过 100%没有收获的一天。明天再试!
4.我应该喝咖啡吗?
“咖啡,是为冠军梦想加油的命脉!”如果迈克·迪特卡说这是真的,我们有什么理由不同意呢?有更复杂的流程图来解决这个问题,但在我们看来,这是一个简单的问题和简单的答案,总是导致喝更多的咖啡!
5.电视消费效率
有人会认为,在我们高度互联的数字世界里,打开电视,迅速找到值得观看的东西会容易得多。即使有线电视、卫星电视、网飞、Hulu 和许多其他流媒体服务上有数百个频道,在你试图找到一些东西观看的时候,它似乎仍然是一个电影荒原。
6.图形故障
有效的图表通常容易理解,并向受众传达感兴趣的信息。如果你试图创建有趣的图表更像是没有人理解的内部笑话,那么这个图表会引起你的共鸣。
7.iPhone 相对焦虑图
在这个世界上,每个人都认为有些活动和任务会产生焦虑和恐惧的时刻。12 月份逛商场或进入当地的车管所绝对是最重要的事情。
但是,没有充电器,看着你的 iPhone 电池寿命像沙漏中的沙子一样溜走,这就相当于在撒哈拉沙漠中耗尽了水。
8.你想去哪里吃饭?
这个话题在人们的生活中引起了更多的冲突,并且可能是大多数夫妻之间争吵的根源。做出错误的决定,你会后悔一辈子,或者至少,直到明天你面临同样的困境。
9.社交媒体类型的阴暗面
Create graphs like this for free with Visme.
我们知道社交媒体的一切都不是负面的,但你必须接受好的一面。想想脸书是如何开始的:大学男生在网上看女孩的照片并给她们打分。现在把这个数字乘以 12 亿人,你就会得到这个人格粪坑。
10.恶性循环
在冬天,在被窝里的头两分钟就像跳进一个冷水淋浴。从那以后,尝试用床单和毯子的正确组合来调节你的体温,以找到完美睡眠温度的难以捉摸的区域,似乎只是一种徒劳的练习。
太热时,把一条腿伸出被窝。把枕头翻过来。扔掉被子。10 分钟后再次冷醒,并重复令人作呕的动作。呃。
有什么好主意吗?
现在轮到你了。你对每个人都能理解的巧妙的图表有什么想法吗?在这里创建你自己的有趣的图表,并分享你的视觉效果,解释那些我们都在试图应对的日常、世俗的灾难。
10 种随机梯度下降优化算法+备忘单
Photo by Julian Zett on Unsplash
深度学习你应该知道的随机梯度下降优化算法
(我在我的博客 这里 里维护了一张包括 RAdam 在内的这些优化者的小抄。)
变更日志:【2022 年 1 月 5 日—2020 年 5 月 4 日
修正附录 2 中那达慕公式的错别字
2020 年 3 月 21 日—分别用 m 和 v 替换 V 和 S ,更新死链接,回顾学习率和梯度组件的概念,更新直觉
2019 年 10 月 6 日—改进
梯度下降是一种寻找函数最小值的优化方法。它通常用于深度学习模型中,通过反向传播来更新神经网络的权重。
在这篇文章中,我将总结流行的深度学习框架(如 TensorFlow,Keras,PyTorch)中使用的常见梯度下降优化算法。这篇文章的目的是使使用一致的命名法阅读和消化公式变得容易,因为没有很多这样的总结。在这篇文章的末尾有一张小抄供你参考。
(有关使用梯度下降优化器(如 SGD、momentum 和 Adam)的线性回归问题的演示,请单击此处的。)
随机梯度下降优化器是做什么的?
回想一下,标准随机梯度下降(SGD)通过用其梯度的因子(即 α ,学习率)减去当前权重来更新权重。
Eqn. 1: The terms in stochastic gradient descent
这个方程的变体通常被称为随机梯度下降优化器。它们的区别主要有三个方面:
- 调整“梯度分量”(【∂l/∂w】)
不是像在随机香草梯度下降中那样仅使用一个单一梯度来更新权重,而是采用多个梯度的集合**。具体来说,这些优化器使用梯度的指数移动平均值。 - 调整“学习率分量”(α),根据梯度的大小调整学习率,而不是保持恒定的学习率。
- (1)和(2) 适应梯度分量和学习率分量。
正如您将在后面看到的,这些优化器试图改进用于更新权重的信息量,主要是通过使用先前(和未来)的梯度,而不仅仅是当前可用的梯度。
下表总结了正在调整的“组件”:
Fig. 2: Gradient descent optimisers, the year in which the papers were published, and the components they act upon
内容
- 随机梯度下降
- 动力
- 阿达格拉德
- RMSprop
- 阿达德尔塔
- 困扰
- 圣经》和《古兰经》传统中)亚当(人类第一人的名字
- 阿达马克斯
- 那达慕
- 阿姆斯格勒
附录 1:备忘单
附录 2:直觉
附录 3:学习率调度器与随机梯度下降优化器
符号
- t — 时间步长
- w — 我们要更新的权重/参数,其中下标 t 索引时间步长 t 的权重。
- α — 学习率
- ∂l/∂w—l的梯度,最小化的损失函数,w.r.t .到 w
- 我还标准化了本文中使用的符号和希腊字母(因此可能与论文不同),以便我们可以在滚动时探索乐观主义者是如何“进化”的。
1.随机梯度下降
正如我们前面看到的,标准 SGD 使用当前梯度 ∂L/∂w 乘以某个称为学习率的因子 α来更新当前权重。
2.动力
带动量的梯度下降( Polyak,1964 )不是仅依赖于当前梯度来更新权重,而是用 m (“动量”)替换当前梯度,这是梯度的集合。该集合是当前和过去梯度的指数移动平均值(即,直到时间 t )。在这篇文章的后面,你会看到这个动量更新成为大多数优化者的渐变组件的标准更新。
在哪里
并且 m 被初始化为 0。
通用默认值:
- β = 0.9
论动量的起源 注意,许多文章引用动量法来发表由 、1999 年 。然而,名为 Sutskever 等人 的论文将经典动量归因于 Polyak 在 1964 年发表的更早的出版物,如上所述。(感谢 詹姆斯 指出这一点。)
3.阿达格拉德
自适应梯度或 AdaGrad ( Duchi 等人,2011 )通过将学习率除以 v 的平方根来作用于学习率分量,该平方根是当前和过去平方梯度的累积和(即,直到时间 t )。请注意,与 SGD 中一样,梯度分量保持不变。
在哪里
并且 v 被初始化为 0。
注意 ε 被加到分母上。Keras 称之为模糊因子*,一个小的浮点值,以确保我们永远不会遇到被零除的情况。*
默认值(来自 Keras ):
- α = 0.01
- ε = 10⁻⁷
4.RMSprop
均方根 prop 或 RMSprop ( Hinton 等人,2012 )是另一种试图提高 AdaGrad 的自适应学习速率。我们不像 AdaGrad 那样采用梯度平方的累积和,而是采用指数移动平均(再次!)的这些梯度。与 momentum 类似,我们将慢慢看到这个更新成为大多数优化器的学习率组件的标准更新。
在哪里
并且 v 初始化为 0。
默认值(来自 Keras ):
- α = 0.001
- β = 0.9(论文作者推荐)
- ε = 10⁻⁶
5.阿达德尔塔
像 RMSprop 一样,Adadelta ( 泽勒,2012 )也是 AdaGrad 的另一个改进,专注于学习率部分。Adadelta 可能是“自适应 delta”的简称,这里的 delta 指的是当前权重和新更新的权重之间的差值。
*Adadelta 和 RMSprop 之间的区别在于,Adadelta 通过用 *D、平方的指数移动平均值 deltas 来代替学习率参数,从而完全取消了学习率参数的使用。
在哪里
将 D 和 v 初始化为 0,并且
默认值(来自 Keras ):
- β = 0.95
- ε = 10⁻⁶
6.内斯特罗夫加速梯度(NAG)
在 Polyak 获得了他的势头(双关语😬),使用内斯特罗夫加速梯度进行了类似的更新( Sutskever 等人,2013 )。这次更新利用了 m ,我称之为投影梯度的指数移动平均。**
在哪里
并且 m 被初始化为 0。
第二个等式的最后一项是投影梯度。这个值可以通过使用先前的速度“向前一步”获得(公式。4).这意味着对于这个时间步骤 t ,我们必须在最终执行反向传播之前执行另一个正向传播。事情是这样的:
- 使用之前的速度将当前重量 w 更新为预计重量 w 。*
Eqn. 4
2.执行向前传播,但是使用这个投影权重。
*3。获得预计坡度 ∂L/∂w 。
4.相应地计算 V 和 w 。
通用默认值:
- β = 0.9
关于 NAG 的起源 注意,最初的内斯特罗夫加速梯度论文( 内斯特罗夫,1983 )并不是关于随机梯度下降的,也没有明确使用梯度下降方程。因此,更合适的参考是上面提到的 Sutskever 等人在 2013 年的出版物,该出版物描述了 NAG 在随机梯度下降中的应用。(再次感谢 HackerNews 上詹姆斯的 评论 指出了这一点。)
7.圣经》和《古兰经》传统中)亚当(人类第一人的名字
自适应矩估计,或 Adam ( Kingma & Ba,2014 ),就是动量和 RMSprop 的简单结合。它作用于
- 使用 m 的梯度分量,梯度的指数移动平均(如动量),以及
- 通过将学习率 α 除以 v 的平方根得到的学习率分量,即平方梯度的指数移动平均值(类似于 RMSprop 中的)。
在哪里
是偏差修正,和
将 m 和 v 初始化为 0。
作者建议的默认值:
- α = 0.001
- β ₁ = 0.9
- β ₂ = 0.999
- ε = 10⁻⁸
8.阿达马克斯
AdaMax ( Kingma & Ba,2015 )是由相同的作者使用无穷范数改编的亚当优化器(因此称为“Max”)。 m 是梯度的指数移动平均值,而 v 是过去 p 的指数移动平均值——梯度的范数,近似于最大值函数,如下所示。请参考他们的收敛性证明文件。
在哪里
是对 m 的偏差校正
将 m 和 v 初始化为 0。
作者建议的默认值:
- α = 0.002
- β ₁ = 0.9
- β ₂ = 0.999
9.那达慕
Nadam ( Dozat,2015 )是内斯特罗夫和亚当乐观者的缩写。然而,内斯特罗夫组件是比其原始实现更有效的修改。
首先,我想说明亚当乐观主义者也可以写成:
Eqn. 5: Weight update for Adam optimiser
那达慕使用内斯特罗夫提前一步更新梯度,将上面等式中之前的 m_hat 替换为当前的 m_hat :
在哪里
和
将 m 和 v 初始化为 0。
默认值(取自 Keras ):
- α = 0.002
- β ₁ = 0.9
- β ₂ = 0.999
- ε = 10⁻⁷
10.阿姆斯格勒
亚当的另一个变体是 AMSGrad ( Reddi 等人,2018 )。该变体重新访问 Adam 中的自适应学习率组件并对其进行更改,以确保当前的 v 始终大于前一时间步的 v 。**
在哪里
和
将 m 和 v 初始化为 0。
默认值(取自 Keras ):
- α = 0.001
- β ₁ = 0.9
- β ₂ = 0.999
- ε = 10⁻⁷
如果有什么不对的地方,或者这篇文章中有什么可以改进的地方,请联系我!✌🏼
附录 2:直觉
**
以上要点可在这里找到。用 QuickLaTeX 生成的图像。(感谢拉维指出那达慕更新中的错别字。)
附录 2:直觉
在这里,我想和你分享一些直觉,为什么梯度下降优化器对梯度分量使用指数移动平均,对学习率分量使用均方根。
为什么要取梯度的指数移动平均?
回想一下,我们需要更新权重,为此我们需要利用的某个值*。我们拥有的唯一值是当前的梯度,所以我们只使用这个信息来更新权重。*
但是只取当前的梯度值是不够的。我们希望我们的更新得到“更好的引导”这是通过使用先前关于梯度的信息来实现的。因此,让我们通过聚合当前渐变和过去渐变来包含以前的渐变。
聚合这些梯度的一种方法是对所有过去和当前梯度进行简单平均。但是等等,这意味着这些梯度的权重是相等的。这公平吗?也许吧。也许不是。
我们可以做的是采用指数移动平均,其中过去的梯度值被赋予比当前值更高的权重(重要性)。直观上,不考虑当前梯度的重要性将确保权重更新对当前梯度不敏感。
为什么要用平方梯度的指数平均值的根来除学习率?
调整学习率的目标是通过将学习率除以多个梯度的均方根来使优化器“更聪明”。所以让我们问自己这些问题:
- 为什么要走多重渐变?
- 为什么要分?
- 为什么要取平方梯度的指数移动平均的根?
前一节已经回答了第一个问题——除了当前梯度值,我们还想利用过去梯度的信息。
为了回答第二个问题,首先,考虑一个简单的情况,其中过去几次迭代的梯度的平均幅度为 0.01。由于该值接近于 0,这意味着我们一直在一个近似平坦的表面上(想象一段平坦的 3D 损失景观)。我们现在所在的地方,地球很平,所以我们很有信心在这个区域移动。事实上,我们想尽快离开这个区域,寻找一个向下的斜坡,这个斜坡可能会把我们带到一个全球性的最小值。(你可能会发现一些文章提到这有“加速”的效果。)因此,当梯度的幅度较小时,我们想要增加学习速率分量(学习得更快)。为了建立这种反比关系,我们取固定的学习速率 α 并除以梯度的平均幅度。这个适应的学习率(现在是一个大值)然后乘以梯度分量,给我们一个大的幅度的权重更新(不管是正的还是负的)。
直觉也适用于相反的情况。假设我们的梯度平均值很高,大约是 2.7。这意味着我们一直在陡坡上。我们希望谨慎行事,所以我们采取较小的步骤,这可以通过执行相同的划分来实现。
在最后一个问题中,我们采用指数移动平均线的原因在前面已经很明显了。我们取梯度的平方的原因很简单,当处理学习率分量时,我们关心的是它的大小。“抵消”这一点的自然选择是扎根。这背后可能有数学,但现在让我们用这种直觉来说服自己。
附录 3: 学习率调度器与随机梯度下降优化器
有些人可能会问——学习率调度器和随机梯度下降优化器之间有什么区别?这两者之间的主要区别在于,随机梯度下降优化器通过将学习率乘以一个因子来调整学习率分量,该因子是梯度的函数,而学习率调度器将学习率乘以一个因子,该因子是时间步长(或者甚至是常数)的函数。
参考
上面提到的每一个乐观主义者的论文
梯度下降优化算法概述 (ruder.io)
深度学习相关文章
逐行 Word2Vec 实现(关于单词嵌入)
感谢 【任杰】德里克 、威廉 Tjhi、陈凯、澄净、 詹姆斯 对本文的想法、建议和更正。
关注我上 推特 @remykarem 或者LinkedIn。你也可以通过 raimi.bkarim@gmail.com 联系我。欢迎访问我的网站remykarem . github . io。**
2017 年大数据分析的 10 大热门趋势
当我们谈到大数据分析的时候,首先要明白这个数据为什么这么大,分析它的实际需求是什么。
数据科学(DS)和大数据的主要目标通常是在非结构化数据流中找到模式和模板,以便简化数据,建立工作模板以供进一步分析或发现异常(如检测欺诈)。
据 Gartner 称,当数据流有三个大 V 时,它才被认为是真正的大数据:
- 容量—特定时间内流向系统的数据量
- 多样性—传入的数据类型的数量
- 速度—系统处理这些数据的速度
全球产生的数据量呈指数级增长,这导致了所谓的信息爆炸。随着数十种新疾病、智能手机类型、服装和汽车模型、家居用品等的出现,数据的种类也与日俱增。不断出现,不断寻找新的推广手段和营销渠道。不要忘记每天都有成百上千的模因和俚语出现。数据速度是要记住的第三件事。任何一天都会产生数 Pb 的数据,其中近 90%的数据永远不会被读取,更不用说加以利用了。
因此,如果企业希望利用其大数据存储来发掘和利用知识的金矿,分析是必不可少的。很长一段时间以来,人们试图分析这种数据流,但随着时间的推移,一些做法变得过时,而一些趋势变得热门。
以下是 2017 年最热门的 10 大数据分析趋势:
- 云存储容量
- 云计算能力
- 神经网络
- 具有分析功能的微服务
- 面向开发人员和数据分析师的改进界面(R 语言和 Jupyter 笔记本)
- 用于神经网络和构建 ML 模型的改进工具,以及它们的进一步培训(TensorFlow、MXNet、微软认知工具包 2.0、Scikit-learn)
- 深度学习定制工具
- 数据货币化
- 流式分析
- 非结构化数据分析
我们将在下面简要描述为什么这些要点都很重要。
云存储容量
随着公司运营的数据变得越来越大,存储数据的成本也变得相当高。由于建设和维护数据中心不是一般公司不愿意做的投资,从谷歌、亚马逊或 MS Azure 租赁这些资源是显而易见的解决方案。使用这些服务有助于解决大数据的量要求。
云计算能力
一旦你有足够的容量来存储数据,你就需要足够的计算能力来处理它,以便提供足够的速度来使数据真正有价值。截至目前,亚马逊和谷歌提供了一系列有助于构建高效云计算的服务,任何企业都可以使用它们来处理大数据(谷歌云、谷歌 API 等)。)
神经网络
借助深度学习和其他机器学习算法,神经网络可以擅长各种各样的任务,从对罐头厂的原始植被进行分类,到在大型轨道望远镜拍摄的照片上发现新的天体。神经网络可以分析传入的数据流,并根据预先配置的参数突出显示模式或异常。这有助于大大自动化分析,并为在非结构化数据流中找到有价值的信息提供了强大的工具。
具有分析功能的微服务
旨在提供精确分析的微服务在规模和功能上都在快速增长。有工具可以测量一切,检查正在进行的支出和可疑支出的警报,处理照片,自动删除背景或突出图片的重要部分等。还有无数其他在线微服务,如著名的谷歌翻译,最近突然停止了胡言乱语,并开始抛出相当精美的文本,因为大量添加了各种机器学习算法。然而,随着行业的成熟,用户希望开发人员将精力转移到更复杂的应用程序上,这些应用程序将使用各种机器学习模型来分析历史数据,并更好地注意到新接收的流数据中的模式。
改进的界面
如今,数据分析师或决策者面临的一个问题是缺乏方便的 GUI 来在分析本身之上工作。像 R 语言和 Jupyter Notebook 这样的工具有助于提供数据分析结果的方便表示。与 Excel 电子表格相反,R 语言脚本可以轻松地调整和重新运行,使它们成为通用和可靠的工具。Jupyter 是 Julia、Python 和 R 的首字母缩写,是笔记本内核的第一个目标。这些内核允许创建带有实时代码、数据可视化、等式和解释性文本的文档,从而提供了方便的 ML 开发环境。
用于神经网络和构建 ML 模型的改进工具
TensorFlow、MXNet、Microsoft Cognitive Toolkit 2.0 和 Scikit-learn 等工具有助于开发人员和数据分析师摆脱特定于算法的方法,例如:
相反,这些平台允许使用特定的方法解决特定的任务,例如:
- 使用 CNN 识别图片上的图像,
- 使用决策树评估金融机构客户的可信度和可靠性,
- 使用 LSTM 网络纠正文本中的文体和语法等。
总而言之,现在你不需要成为一名博士来获得神经网络,因为有大量有用的工具来构建专门的数据科学系统。例如,Tensorflow 是谷歌最近在翻译效率方面所有改进的背后支持者,并支撑着许多谷歌服务,有效地增加了它们的价值和业务影响。
深度学习定制工具
正如我们在最近关于深度学习的文章中解释的那样,虽然 AI 是机器学习、神经网络、机器智能和认知计算的总括术语,但它并不像我们预期的那样精确。截至目前,它仍然无法解释其行为的原因,做出道德选择或区分好与坏的行为。然而,在 2017 年,最大的价值将由定制的深度学习工具显示出来,这些工具基于对大型数据集重复应用的简单算法。是的,这些算法不会是万能的,但它们会在特定的任务中表现出色,在这些任务中,结果的一致性比潜在的洞察力重要得多。
数据货币化
预测性和规范性分析是帮助组织使用大数据工具最大限度地减少支出和盈利的方法。将分析结果作为服务出售,为客户传播和构建数据也可以成为一个有利可图的市场。
流式分析
实时流数据分析对于做出影响当前事件的决策至关重要。GPS 定位器使用这种逻辑来指示目的地。一个主要的好处是,来自其他用户的匿名数据流有助于避免路线创建过程中的瓶颈和交通堵塞。2017 年肯定会推出更多的流数据分析服务,因为它们的需求很高。
非结构化数据分析
数据可视化和机器学习算法的不断发展有助于不断提供新的和新类型的数据用于分析。对视频观看统计数据和社交媒体互动的分析是一座知识金矿,可以更好地个性化报价,并在更合适的时间显示更相关的广告,从而实现更好的转化。2017 年,此类服务将进一步发展壮大。
结论
总而言之,大数据分析如今正在蓬勃发展,并且没有放缓的迹象。而一些趋势,如每月商业智能报告、隔夜批量分析、以模型为中心的应用等。失去牵引力,新的热点趋势出现并获得流行。你对此有什么想法?我们是否错过了一些重要的东西或者包含了一些不太重要的东西?如果这篇文章有趣,请让我们知道并分享这个词!
设计网络安全技术系统的 10 个初步步骤
网络安全是一种思维方式,而不是必然的邪恶
我已经记不清有多少次我遇到过技术专家和程序员在开发系统中实现安全性时表现出完全懒散的态度。这种态度通常始于技术阶梯的最顶端,从首席执行官、首席技术官开始,一直向下延伸。传统观点似乎通常认为安全性只是实现一个密码系统。仅仅使用基本的安全措施在幕后进行的工作是如此频繁地进行并被认为是理所当然的,大多数人似乎认为这是实现起来最简单的事情之一。今天,我们依靠谷歌或脸书认证,再加上 Twilio 应用程序(或其他一些类似的服务)。再加上一个“https”证书,一切都完成了。对吗?
如果任何老板或程序员有这种想法,你就真的有麻烦了。这是非常错误的,这种思维过程是如此被误导,以至于它应该在一个对网络安全着迷(理所应当如此)的世界里拉响每一个警报。
这种误解,如果被程序员开发出来,对于他们正在开发的系统,当然还有他们的职业生涯,都是灾难性的。随着“后端”、“前端”和 NoSQL 系统的出现,这些系统必须与大量其他移动部件相互通信,安全必须成为一个主要问题。我说的“主要”是指它必然是每一个系统计划的一部分,而 从未被视为 是在系统完成或接近完成后才被构建到系统中的。采取将安全视为必须在以后阶段处理的邪恶的思维方式,必然会导致延迟、安全漏洞、网络入侵,并最终导致系统灾难。
重要的是要记住,今天许多系统都在处理健康、保险、银行和个人数据。这些系统不断被测试和升级,以防止不希望的访问,并具有网络安全层。然而,链中的弱点经常存在,有时甚至没有被考虑或注意到,直到一些未经授权的实体设法访问系统。
我将列出规划和创建安全系统的一些主要因素,而不是谈论它。让我重申一下。这些是在构建系统时要考虑和实现的主要因素。本文概述了许多(但肯定不是全部)需要安全规划的层次。它没有给出任何具体的代码或网络安全产品来帮助你。Auth2 层、JWT、加密方法和其他包装或通信技术不是本文的重点。相反,我的希望是训练你思考安全问题,理解需要解决的层次,然后在一致的基础上测试、更新和固定你所涉及的系统。
需要安全规划的系统组件:
一. 静态数据
答: 数据存储库 “数据存储库”只是一个花哨的术语,指的是保存数据的地方。在我的世界里,这将是 NoSQL 系统,但适用于 MySQL(及其变种)以及 NoSQL 系统。简而言之,“数据存储库”指的是等待访问的任何数据。当您处理 Redis、JSON(如果它用于保存数据而不是传输数据)和其他类似的数据存储库时,这变得更加复杂。这些系统中保存的所有信息都应被视为“静态数据”。
我们首先想到的应该是保护实际的存储库(我们还没有处理存储库中的数据)。让我举一个例子:
MongoDB 已经成为一个非常受欢迎的 NoSQL 数据存储库。在设置 MongoDB 安装时,有一个叫做“超级用户”的东西。但是,您需要实现这个用户。这是一个相当无痛的过程,不会超过几分钟。让 MongoDB 安装(或任何存储库)保持开放,而不定义各种用户访问,超级用户访问意味着您的数据存储库对任何 12 岁的黑客都是开放的。然而,根据我的经验,在专业公司,我经常会遇到这种情况。没有定义用户,没有创建密码,完全没有做任何事情来保护实际的存储库。即使你的系统在 AWS、Azure 或其他竞争对手的云系统上,或者即使它位于你办公室的服务器上,你也绝对必须保护你的数据存储库。无论是 MongoDB、Cassandra、Hadoop、Redis、MySQL 还是一个 JSON 文件。否则,你只是在公开邀请任何人访问你的数据。
第 1 点:始终保护您的存储库,至少要有用户密码访问。密码和连接字符串应该加密,但稍后会详细说明。
B. 存储库中的数据
静态数据,也指位于数据存储库中的实际数据。这些数据通常用于 CRUD(“创建、读取、更新、删除”)操作或分析。换句话说,在应该受到保护的数据存储库中,存放着真实的数据。这也被认为是“静态数据”,尽管许多人没有区分实际存储库和实际数据,这可能再次导致灾难性的结果。
再举一个相当简单的例子:
在您的 SQL 或 NoSQL 存储(甚至是 Redis 或 JSON 文件)中,您保存了关于 John Smith 的信息。假设有人设法突破了数据存储库层。一旦进入,每一条信息都是公开的,可供他们使用(比如:信用卡信息,或健康信息等。).如果不加密,这些静态数据就只会被窃取。
问题是如何防止这种情况发生?我可以听到程序员抱怨说“他要告诉我们加密库中的每一条信息”。嗯,是也不是。有时可能需要加密这些集合或数据表中的所有信息,尤其是所谓的“敏感”信息。敏感信息是您定义的敏感信息,有时是一种判断,有时只是一种常识。然而,你可以肯定的是,任何银行、健康、密码、保险信息都应该被认为是敏感的。其他信息可能不被视为敏感信息,不需要加密。然而,在 CRUD 例程中,在插入、更新和检索信息时,为所有信息创建一个合适的加密例程可能是需要考虑的事情。是的,它有时会使系统变慢几毫秒,并且您将被迫创建相当有趣的方式来运行查询,但是如果您在一个计划良好的算法中使用加密,延迟将是轻微的,并且肯定是值得的。当然,您将需要一种通过查询来访问您的信息的方式。是的,这需要额外的例程或函数调用以及系统范围的规划,但是值得安心。
要点 2:保护存储库中的实际数据是保护系统的一个重要方面。您选择加密哪些数据、如何加密以及需要解密时将调用什么方法,都取决于您的系统、其要求以及对数据敏感性本质的判断。
C. 纯文本数据文件
在后端系统中经常被忽略,是保存访问系统所需数据的各种数据文件。
例如,在 NodeJS 中,全局变量通常保存在这样的文件中。许多程序员都在使用优秀的 NPM 库,。env" (发音*“点 env"* )。不幸的是,这是一个纯文本文件(或者在某种上下文中可能是一个 JSON 文件)。尽管如此,它仍然是纯文本。在任何编辑器中打开它,你就可以阅读整个文件。这些全局变量通常用于控制对系统的访问,包括主要密码、连接参数等。都是你的系统所需要的。(正是由于这个原因,有些人不使用。env,而其他人则找到了更有创造性的方法来加密信息。)
几乎所有后端系统的全局变量都可以保存在服务器的操作系统中。但是,这意味着如果您有多台服务器,您必须在操作系统中设置每一台服务器(或者对您的主服务器进行镜像,并将该镜像复制到其他服务器)。您还可以在这个文本或 JSON 文件中嵌入加密信息,比如“pw1=encrypted password here ”,并让您的系统通过对解密例程的函数调用来解码这些信息。无论你选择了哪条路,都不要把这些信息保存在纯文本文件中。(记住 JSON key->values 也是纯文本。)
第三点:纯文本数据文件可能是你系统的致命弱点。这里简单的教训是,确保如果您使用纯文本文件来保存敏感数据,请决定某种类型的加密方法或混淆这些信息,使其不会被未经授权的来源轻易窃取和使用。
二。传输中的数据 术语“**传输中的数据”**是指通过线路向服务器、数据存储库发送并返回的所有数据。它还指服务器之间的数据传输。 通过 WiFi 或电缆发送到任何其他来源的任何数据都被视为“传输中的数据” 。这个概念足够简单。
用户打开 web 浏览器或手机,登录一个站点来接收或获取信息,沿着 CRUD 基线会发生某种类型的信息交换。发出信息请求并收到答复(即使“未授权”)。
当然,还有其他系统,比如聊天系统,其中传输中的数据是不变的。信息来回传递。即使它们没有保存在服务器上,或者在特定时间段后被删除,数据也必须从 A 点传输到 B 点,并且确实通过服务器传输。
这里的薄弱环节是数据在点与点之间移动的时候。如果没有加密,数据很容易被任何“窥探者”获取。这种类型的数据窥探和获取比你可能意识到的更频繁。看看 Telegram 和 WhatsApp 就知道了。Telegram 最初是一个完全安全的端到端系统。WhatsApp 也增加了端到端加密,以避免这种类型的入侵。
即使您忽略了对传输中的数据进行加密的需要,从而完全保护了静态数据的安全,您也在系统中留下了一个巨大的安全漏洞。这些数据,不管是什么路线,浏览器服务器;App 服务器;服务器服务器必须安全。(不要忘记,即使在聊天系统中,消息也是通过服务器转发给接收者的。)
第四点:保护传输中的数据非常重要。这包括必须从 A 点移动到 b 点的所有数据。如果您不保护这些数据,系统将非常容易受到攻击。
三。 HTTP,HTTPS&HTTP/2
【S】因素——近来,对于 HTTPS 的实现和使用有一种难以置信的误解,https 对从网络服务器到浏览器的信息进行加密。每当有人告诉我创建一个 https 网站,只是在服务器上从 http 转换成 https 的问题时,我都希望我有一美元。事实上,在传统的上一代 LAMP (Linux、Apache、MySQL、PHP/Python/Perl)设置中,只需要用有效的证书设置 Apache 服务器并转移到 https。您甚至可以自动重定向所有 http 请求来使用 https。随着 Let’s Encrypt 作为一个免费且非常容易使用的替代软件的出现,这变得更加容易和便宜。
然而,在这个时代,对于复杂的后端系统,系统的后端代码本身必须改变。例如,在 NodeJS 中,访问 http 服务器的代码(即使只使用 Express)将不同于访问 https 的代码。这适用于目前所有的后端。使用 http 启动一个代码库,并认为这只是添加一个“s”的问题,这是一种极端的过度简化,而且成本也很高。
如果您在开发服务器上使用 http,并认为这只是简单地向 Apache 服务器添加一个证书来创建 https,那么您可能会发现自己陷入了编码的地狱。(如果你的系统是新的,它肯定不会遵循传统的构建方式。它甚至可能不需要 Apache 服务器,这将导致对 https 模块的更多规划。)突然,在发布的前几天甚至前一天,当发现代码库不能处理 https 时,一切都乱套了。这种事我见得多了,都记不清了。
第五点:用 https 搭建一个安全的系统,应该在开发的最开始就做。认为扔在一个“证书”和添加一个“s”,肯定不会削减它。请记住,如果您在 VPC 或 NAT 网关或其他系统上有多台服务器,更新证书(尤其是加密)不会是一个自动的过程。所有这些都必须在将系统投入生产之前进行规划。
四。登录&密码 网上肯定有足够的关于登录&密码安全的信息。不幸的是,许多 web 开发人员认为对密码和登录信息使用简单的加密程序就足够了。正如我在开始时所说的,这不是一篇关于加密方法的文章。然而,有几个要点您确实需要在一开始就知道,如果仅仅是因为它们适用于任何登录过程的话。这些点会影响您遵循的静态数据和传输中数据过程。
显然,经过我们上面的解释,不加密存储密码或不加密通过线路发送密码只是一个不应该存在的安全漏洞。然而,即使加密的密码也不是真正的答案。有数以百万计的密码解密系统可供任何人使用。此外,众所周知,密码有时真的很容易猜测或找到。
此外,还有内部安全需要警惕(将在下面讨论)。由于本文篇幅有限,我不会在这里讨论所有的可能性和安全漏洞。当涉及到密码时,记住术语***【salt】***是很重要的,甚至是关键的。如果你不知道“加盐”是什么,我强烈建议你至少看一下维基百科的文章: Salt (cryptography)
我将引用维基百科的文章介绍,这样你就能理解“加盐”的基本原理。
在密码学中,salt 是随机数据,用作单向函数的附加输入,该单向函数“散列”数据、密码或密码短语。盐与现时的概念密切相关。salts 的主要功能是防御字典攻击或其散列等价物,即预先计算的彩虹表攻击。
盐是用来保护密码的。过去,密码是以明文形式存储在系统中的,但是随着时间的推移,开发出了额外的安全措施来保护用户的密码不被系统读取。盐是其中一种方法。
为每个密码随机生成一个新的 salt。在典型的设置中,salt 和密码(或其在密钥扩展后的版本)被连接在一起,并使用加密哈希函数进行处理,并且结果输出(而不是原始密码)与 salt 一起存储在数据库中。哈希允许以后进行身份验证,而无需在身份验证数据存储受损的情况下保留明文密码,因此不会冒风险。
因为盐不需要被人记住,所以它们可以使成功攻击所需的彩虹表的大小大得惊人,而不会给用户带来负担。由于 saltss 在每种情况下都是不同的,所以它们还通过使相同密码的所有 salt 散列实例互不相同来保护常用密码,或者在几个站点上使用相同密码的人。
参见维基百科:Salt(密码学)
第六点:总是使用“加盐”密码。不要将未加密的密码存储在数据存储库中,即使存储库本身已经受到保护。密码和其他敏感材料需要包含一个单向散列,使用“彩虹表”无法破解。当然,如果授权用户忘记了以前的密码,您将需要一个系统来让他们更改密码或创建新密码,因为“salt”方法是单向的,没有用于对信息加盐的原始密钥就无法解密(没有人,甚至是您,应该知道或拥有该密钥)。
V. Web &移动 显而易见,Web &移动访问也是安全流程的一部分。有了 JWT (JSON Web Tokens)和/或 AUTH 层,(PHP-Laravel 程序员将熟悉 Auth2 协议),一些人认为这就是所需要的。当然,这是一个很大的进步,但是正如你所看到的,这还不够。使用谷歌或脸书认证协议(或其他一些认证协议)是值得考虑的。然而,有些人不想使用这些登录的可能性。他们希望使用他们已经习惯的用户名-密码组合。如果你确实提供了这种可能性,那么试着按照上面和下面的建议去做。当然,对于移动和两步认证,通过手机或使用 Twilio 等服务,这变得相当简单,但需要在您的代码库中进行规划。
要点 7:无论你选择使用何种方法访问你的网站或应用程序,你都需要在你的代码库以及使用服务的成本中做好计划。你必须确保登录时输入的所有内容在整个过程中都是安全的。
六。Redis,JSON 和所有其他的
我是 Redis 的忠实粉丝。大多数情况下,它被用作键->值数据存储,尽管您可以在存储信息时变得更加复杂。由于电子存储器的速度以及使用 Redis 存储信息的简单性,许多系统都使用 Redis。幸运的是,Redis 在其存储库中为静态数据提供了加密,当然也为存储库本身提供了加密。(这里我强烈建议认真考虑使用"" Redis Labs"如果你打算使用 Redis。)
JSON 最常用于浏览器或 app 与后端之间的信息传递。然而,JSON 也用于保存静态信息。NodeJS 程序员将会习惯这个概念,特别是如果他们已经处理了 PM2 或其他类似的工具。JSON 还允许 NodeJS 尽可能快速地获取静态信息。
所有静态信息都被视为静态数据,应被视为可能的安全漏洞。 当您决定采用一个系统或添加另一个因素(如 Redis)时,您就需要开始考虑保护静态数据存储库中的任何信息。
第 8 点:当您选择将所有类型的数据存储库合并到您的系统中时,必须考虑它们。不要只将 NoSQL 或 SQL 数据存储视为数据存储库。如果您不加密这些数据并将其公开,那么您的系统就会留下一个巨大的安全漏洞。
七。 内部安全 最容易被忽视也是最敏感的领域之一就是所谓的“内部”安全。如果你想引人注目或者为了个人利益而“偷窃”,你可以称之为“商业间谍”。无论原因是什么,内部安全确实是一个值得关注的问题。显然,您的首席 DBA 将有权访问超级管理员密码。你的团队中还有一些其他人,出于发展的原因,自然会接触到所有这些信息。当然,大公司对于敏感信息的共享和发送有非常严格的惯例和规则。然而,在我们这个创业公司和首席执行官、首席技术官、首席运营官的&副总裁的世界里,他们没有经验,有时不知道发展是什么、为什么、如何发展,分享这些关键信息是在没有任何指导方针或监督的情况下完成的。
要点 9:在公司中,沟通总是至关重要的,当沟通不受监督时,比如在初创公司,沟通是通过各种系统进行的,比如电子邮件、WhatsApp、短信、Slack 等。不惜一切代价抵制通过任何电子邮件系统发送敏感信息,如密码和凭证。将“需要知道”保持在最低限度。你的首席运营官真的需要知道服务器的访问密码吗?你的前端程序员需要了解他们吗?保留一份谁有什么权限的详细列表。 作为额外的预防措施,尽快用密码和连接字符串构建文件,然后决定如何加密它。任何需要访问的人都会被一个经过验证的人添加到这个文件中,因此用户只知道他们自己的个人密码和登录程序。此外,在某种数据存储库中保存关于谁从内部访问了您的服务器的详细日志也是非常必要的。相信我,迟早你会需要回顾它们。
结论:
保持理智——你永远不会 100%安全。接受这个。让这成为你的咒语。无论你做了多少努力,总会有一些黑客试图进入你的系统并窃取数据。DDOS 攻击将一直存在。你的工作是确保你晚上睡觉时不会一直担心安全漏洞和马裤。小心点。了解您正在构建什么以及系统的所有活动部分,提前计划,不要将安全性留到最后一刻。这是一种心态。
第十点:保持理智。保持冷静。为你能想到的一切做好计划,了解你的系统和所有活动部件。不断寻找你忘记的一件小事。记住,保持理智&让安全成为一种心态!
作者简介:Ted Gross 担任 CTO 多年,擅长数据库技术、Node.js、PHP 和 OOP。他还发表了许多关于技术主题的文章,特别是关于大数据和混沌理论的文章(在专业期刊和在线@ 媒体 & LinkedIn )。他也是文学小说、儿童书籍和各种非小说类文章的作者。他的短篇小说集, 《古代故事,现代传说》 获得了极好的评价。
可以通过电子邮件联系到泰德:tedwgross@gmail.com;推特(@ tedw gross);LinkedIn;中等
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
实现企业大数据分析的 10 项关键技术
大数据分析技术是多种技术和处理方法的结合。使它们有效的是企业集体使用它们来获得战略管理和实施的相关结果。
尽管有投资热情和利用数据的力量来转变企业的雄心,但结果因成功而异。组织仍在努力打造被认为是“数据驱动”的文化。在报告开始这样一个项目的高管中,只有 40.2%的人报告说取得了成功。巨大的转变需要时间,尽管绝大多数公司渴望成为“数据驱动型”,但只有很少一部分公司实现了这一雄心。文化转变很少在一夜之间发生。
在大数据的演进过程中,大多数公司面临的挑战与技术无关。采用的最大障碍与文化挑战有关:组织一致性、抵制或缺乏理解,以及变更管理。
以下是为企业实现大数据的一些关键技术:
Ref — https://www.marutitech.com/big-data-analytics-will-play-important-role-businesses/
1)预测分析
作为企业规避决策风险的主要工具之一,预测分析可以帮助企业。通过处理大数据,预测分析硬件和软件解决方案可用于预测场景的发现、评估和部署。这些数据可以帮助公司为即将到来的事情做好准备,并通过分析和理解问题来帮助解决问题。
2) NoSQL 数据库
这些数据库用于跨可扩展数量的存储节点进行可靠、高效的数据管理。 NoSQL 数据库将数据存储为关系数据库表、JSON 文档或键值对。
3)知识发现工具
这些工具允许企业挖掘存储在多个来源上的大数据(结构化和非结构化)。这些源可以是不同的文件系统、API、DBMS 或类似的平台。有了搜索和知识发现工具,企业可以隔离和利用信息为自己谋利。
4)流分析
有时,一个组织需要处理的数据可能会以多种格式存储在多个平台上。流分析软件对于这种大数据的过滤、聚合和分析非常有用。流分析还允许连接到外部数据源,并将它们集成到应用程序流中。
5)内存中的数据结构
这项技术有助于在动态 RAM、闪存或固态存储驱动器等系统资源中分发大量数据。这进而实现了在连接的节点上对大数据的低延迟访问和处理。
6)分布式存储
作为应对独立节点故障和大数据源丢失或损坏的一种方式,分布式文件存储包含复制的数据。有时,数据还会被复制,以便在大型计算机网络上进行低延迟快速访问。这些通常是非关系数据库。
7)数据虚拟化
它使应用程序能够检索数据,而无需实施技术限制,如数据格式、数据的物理位置等。Apache Hadoop 和其他分布式数据存储使用数据虚拟化来实时或接近实时地访问存储在各种平台上的数据,这是最常用的大数据技术之一。
8)数据集成
对于大多数处理大数据的组织来说,一个关键的运营挑战是以对客户交付有用的方式处理 TB(或 Pb)数据。数据集成工具允许企业跨多个大数据解决方案(如 Amazon EMR、Apache Hive、Apache Pig、Apache Spark、Hadoop、MapReduce、MongoDB 和 Couchbase)简化数据。
9)数据预处理
这些软件解决方案用于将数据处理成一致的格式,并可用于进一步分析。数据准备工具通过格式化和清理非结构化数据集来加速数据共享过程。数据预处理的一个局限性是,它的所有任务都不能自动化,需要人工监督,这可能是乏味且耗时的。
10)数据质量
大数据处理的一个重要参数是数据质量。数据质量软件可以利用并行处理对大型数据集进行清理和丰富。这些软件被广泛用于从大数据处理中获得一致和可靠的输出。
总之、大数据已经被用于提高运营效率,根据最新的即时信息做出明智决策的能力正迅速成为主流标准。
毫无疑问,大数据将继续在全球许多不同行业发挥重要作用。它肯定能为一个商业组织创造奇迹。为了获得更多收益,对您的员工进行大数据管理培训非常重要。借助对大数据的适当管理,您的企业将变得更有生产力和效率。
参加谷歌人工智能挑战赛的 10 条经验
快,画!涂鸦识别挑战赛是由谷歌 AI 赞助、 Kaggle 主持的人工智能挑战赛。
我的团队在这次比赛中获得了第 46 名,而 1584 名选手和 1316 支队伍参加了这次比赛。以下是我想与大家分享的一些背景、见解和感受,以及我们是如何与金牌失之交臂的。
挑战概述
这个挑战的目的很简单,猜猜有人在画什么。不是你,你的电脑会猜。听起来很有趣,对吧?
换句话说,你的电脑是否足够智能来决定下面画的是什么?
Sample images from the quickdraw-dataset
有点简单化的定义?以下是官方描述:
你能多准确地识别涂鸦?
www.kaggle.com](https://www.kaggle.com/c/quickdraw-doodle-recognition)
听起来很有趣,对吧?挑战在这里:由于训练数据来自游戏本身,图纸可能不完整或可能与标签不符。您需要构建一个识别器,它可以有效地从这些有噪声的数据中学习,并在来自不同发行版的手动标记的测试集上表现良好。
你的任务是为现有的 Quick,Draw 建立一个更好的分类器!数据集。通过在这个数据集上推进模型,Kagglers 可以更广泛地改进模式识别解决方案。这将对手写识别及其在 OCR(光学字符识别)、ASR(自动语音识别)和 NLP(自然语言处理)等领域的强大应用产生直接影响。
✎队😭😴
首先,我真的要感谢我所有的队友,没有他们这是不可能的!
其次,让我们解释一下背景:我喜欢学习关于软件工程、科学、编程的新东西……人工智能/机器学习是我最近一年来的学习热情。在这个领域我还是个新手,但我发现它真的很吸引人。所以为了活出我的新激情,我在 Kaggle 上开始了另一个新的挑战(准确地说是第六次),那就是 快,画!涂鸦识别挑战 。到目前为止,我独自参加了所有的挑战,我觉得已经准备好加入一个团队,我在 Kaggle 论坛上发表了这篇文章,那时我在排行榜上大约是第 84 名。我从其他同样没有团队的 Kagglers 那里得到了一些答案,要么是通过论坛,要么是直接给我发消息让我加入团队。很难决定和谁组队,所以我和卡格勒建立了一个团队,和我当时在排行榜上的水平差不多。
这是最终的魔术队:
我们来自中国、法国和美国。
有一段时间,球队用了我的名字,但最终,我们搬到了“✎”😭😴".一个很好玩的队名,但我还是不知道怎么念,但至少让你想象到了我们的团队故事。
Lesson 1: Build a team with people having the same level as you in the competition. That way everyone feels comfortable working together.
在挑战中,我的队友们的敬业精神给我留下了深刻的印象。每次有任务出现(训练一个新模型,调查一个解决方案),他们都会站起来去做。
(深入)学习对我来说很关键
我是一个学习者,所以我决定这次比赛使用:新的硬件,新的人工智能框架和新技术。那很有趣!
我们不断前进,打开新的大门,做新的事情,因为我们很好奇,好奇心不断引领我们走上新的道路。华特·迪士尼
新硬件
在我之前参加的 Kaggle 比赛中,我家里没有具备计算能力的 GPU 可以使用,所以我通常使用免费的 Kaggle 内核或谷歌合作实验室。他们免费使用,提供一个旧的和缓慢的,但可靠的 K80 GPU,但他们是有限的时间。所以我决定是时候给我的电脑换一个全新的显卡,配一个像样的 GPU 了。我指的是一个 GPU,我可以用它来做有趣的新事物,比如深度学习。于是我的电脑迎来了一款 rtx 2080 ti ,NVIDIA 于 2018 年 9 月 27 日推出。给你一个思路,比赛从 2018 年 9 月 26 日开始,历时两个月。我不能让它更近一些。
[## NVIDIA GeForce RTX 2080 Ti 显卡
GeForce RTX 2080 Ti 领先其他卡几光年…
www.nvidia.com](https://www.nvidia.com/en-us/geforce/graphics-cards/rtx-2080-ti/)
由于数据集的规模(5000 万张图片),硬件在这场比赛中至关重要。这场竞赛的获胜者展示了他们拥有惊人的计算能力。
我可以告诉你,仅仅因为你无法使用 GPU 而无法尝试新算法是令人沮丧的。
Lesson 2: Choose wisely the competition you want to participate in based on your compute resources (local or cloud).
新的自定义二进制文件
硬件相当新,但随之而来的是一些问题。为了使用我的显卡的所有功能,我不得不使用 NVIDIA 的 CUDA 10,没有官方支持的机器学习框架,也没有预建的二进制文件。
首先,我必须用 Ubuntu 18.04 重新安装我的 Linux 电脑,因为 NVIDIA 驱动程序 410.72,CUDA 10.0,cuDNN 7.3.1 和 NCCL 2.3.5 只在这个 LTS(长期支持)版本的 Ubuntu 中受支持。
所以我不得不使用 CUDA 10 从源代码重新编译 Google 的 tensorflow 。这里的是解释如何做的教程。
面向所有人的开源机器学习框架
www.tensorflow.org](https://www.tensorflow.org/)
我还必须用 CUDA 10 从脸书和优步维护的源码 pytorch 中编译。
Python 中具有强 GPU 加速的张量和动态神经网络- pytorch/pytorch
github.com](https://github.com/pytorch/pytorch)
**注意:**为你的 CPU 架构编译软件(GCC -march 选项)可能会提供巨大的提升。在我的测试中,启用 tensorflow 中的 AVX2 将 CPU 计算时间除以 2。
Lesson 3: Optimize your software stack for the task. E.g. Recompile tensorflow from source, as the pre-built downloadable version is compiled for maximum CPU compatibility and not maximum performance.
新的深度学习框架
我已经使用了 keras 和 Google tensorflow ,keras 对初学者来说是一个很好的框架,Google tensorflow 非常强大,可以补充 Keras,也可以单独使用。这些都是非常有趣和成熟的框架。
Keras,Python 深度学习库。
keras.io](https://keras.io/)
所以我决定通过使用 fastai 1.0 库来尝试一些新的东西。它是在 pytorch 框架之上的一个高级库。所以我在这里看到了学习新事物的潜力。
fastai 深度学习库,加上课程和教程
github.com](https://github.com/fastai/fastai)
最后,我发现这个 fastai 库非常有趣,它提供了一个高级接口和一个简单的使用流程。但是由于该库相当新,(第一个 1.0 版本于 2018 年 10 月 16 日发布),所使用的版本(1.0.26)有许多怪癖(例如,如果 find_lr 没有在它之前运行,则无法执行预测),错误(当启用混合精度时,许多函数会抛出异常),并且文档有许多缺陷(如何在深度学习模型上定制头部)?).最重要的是, g 中的语义版本不受尊重,所以我警告你即使在补丁版本之间也会有代码兼容性问题(我为 1.0.26 编写的代码与 1.0.28 不兼容)。
但是,这个库内置了非常好的东西,比如 1cycle policy、学习率查找器和(部分)混合精度支持。当我写这篇文章的时候,几乎每天都有新的版本发布,所以进展也很快。
Lesson 4: Read the source Luke. You will learn how these libraries and frameworks work, especially if the documentation is incomplete.
最新最先进的技术
混合精度是我选择 rtx-2080-ti 而不是更便宜的 gtx-1080-ti 的关键因素之一。rtx-2080-ti 是 NVIDIA 第一款支持 16 位浮点(fp16)的非专业显卡。
你可能会问你一直跟我说的混合精度是什么?这是一组技巧,允许在深度神经网络中使用 16 位浮点而不是 32 位浮点,从而将内存减少两倍,并将计算吞吐量增加相同或更多倍。
关于混合精度的更精确定义,你可以参考 NVIDIA 开发者博客:
深度神经网络(DNNs)已经导致了许多领域的突破,包括图像处理和理解、语言建模、语言翻译、语音处理、游戏以及许多其他领域。为了实现这些结果,DNN 的复杂性一直在增加,这反过来增加了训练这些网络所需的计算资源。混合精度训练通过使用较低精度的算法来降低所需的资源,这具有以下优点。
减少所需的内存量。半精度浮点格式(FP16)使用 16 位,而单精度浮点格式(FP32)使用 32 位。降低所需的内存可以训练更大的模型或训练更大的迷你批次。
缩短训练或推理时间。执行时间可能对内存或运算带宽很敏感。半精度将访问的字节数减半,从而减少了在内存有限的层上花费的时间。与单精度相比,NVIDIA GPUs 提供高达 8 倍的半精度算术吞吐量,从而加速数学受限层。
由于 DNN 训练传统上依赖于 IEEE 单精度格式,本文的重点是半精度训练,同时保持单精度实现的网络精度[…]。这种技术被称为混合精度训练,因为它同时使用单精度和半精度表示。
NVIDIA 还提供了一个 6 分钟的视频,解释如何使用 tensorflow 实现它:
Lesson 5: Take full advantage of your hardware, use mixed-precision if your hardware is compatible.
我的工作要点
免责声明:我将只展示我为这次比赛写的一部分代码,我的队友绝对而不是对我糟糕和错误的代码负责。该代码的一部分灵感来自伟大的 Kaggler 在 ka ggle 内核和论坛中分享他们的见解和代码。我希望我没有忘记提到其中一个值得称赞的例子。
完整的源代码可以在我的 github 库上找到。
本部分可能包含一些技术术语。
SQLite 的使用
为此挑战提供了一个训练数据集。它包含 5000 万张图像,每张图像都有详细信息:图像属于哪个类别、唯一标识符(key_id)、绘图来自哪个国家(country)以及复制绘图的笔画点(drawing)。
挑战训练数据集以 CSV 文件的形式提供(正好 340 个文件),每个类别一个文件(一个文件用于飞机类别,另一个文件用于西瓜……)。当你想随机洗牌样本来训练一个深度学习模型时,这并不是最方便的。所以我必须把它们转换成更方便的方式。
首先,我去了 fastai 的通常和深度整合的做法;即每个样本有一个图像文件。但是使用这个解决方案,在如此大的数据集下,我面临另一个挑战:我的 Linux 文件系统没有配置为支持如此大量的索引节点(向文件系统添加了 5000 万个文件,因此创建了 5000 万个新的索引节点),结果文件系统在没有使用所有可用 GB 的情况下就满了。必须使用另一种解决方案。有许多文件格式可以包含数据( pickle 、 hdf5 、 dask 、CSV……)。经过一些实验,我想出了一个 SQLite 数据库方法。
该数据库是使用 Jupyter 笔记本生成的,可在 my github 上获得,并命名为1-concat-csvs-into-SQLite . ipynb*。*数据库中实现的数据结构非常简单:
- 用训练样本训练表
- 用测试样品测试表
- 类别表,每个可用类别用一个整数编码
Overview of the database structure
这种方法允许我将所有的训练和测试数据集保存在一个文件中。在我的各种实验中,我还注意到,与通常使用的每个样本一个图像文件相比,SQLite 方法具有额外的优势,可以减少 SSD 上的 I/O 数量。
第六课:不要害怕使用数据库。如果数据库服务器是多余的,那么考虑 SQLite。
如果你看我下面的代码,你可能会注意到我正在使用并行工作器将动态图像从一列笔画转换成一幅图像;这是通过使用全局锁来访问数据库实现的。我最初的意图是通过为每个 worker 提供一个 SQLite 文件对象来实现以只读模式访问数据库的并行 worker,但是在这样做之前,我首先尝试在单个 SQLite 对象上使用全局锁,它令人惊讶地立即给出了不错的结果(GPU 使用率为 98%),这就是为什么我甚至懒得改进它。
Lock in image generator callback
图像笔画
这个比赛的一个重要部分就是把一系列的笔画变成有用的东西。论坛中描述了两种主要方法。要么使用笔画作为可变大小的输入,为此可以使用递归神经网络 (RNN)(具有 LSTM 或 GRU 层),要么将它们转换为图像,为此我们可以使用卷积神经网络 (CNN)。我个人只探索了最新的。
将笔画编码成图像很简单,只需要在笔画点之间画线。但是为了给 CNN 提供尽可能多的信息,我们需要帮助他区分不同的笔画,例如使用不同的颜色。
为此,我从白鲸的内核中获得灵感,这是许多竞争对手的基准:
Beluga’s stroke to image function
但是我注意到这段代码有一些问题:
- 以 256x256 px 绘制图像,然后将其大小调整为 64x64 px 会占用大量 CPU 资源,并使图像模糊。
- 生成的图像仅在一个通道上。
- 这段代码没有正确处理图像边界,绘图的一小部分脱离了图像。
- 如果你想用更大的图像训练一个神经网络,那么应该明智地选择线宽来处理图像缩放。
Images generated, sample taken from Beluga’s kernel
进行了以下改进:
- 避免在图像外画线。
- 直接在最终空间计算线条位置,避免无用的图像大小调整。
- 添加一个小边界(2 像素),以便第一个卷积层(3x3)可以更容易地检测线条。
- 使用 3 个通道来编码颜色。选择调色板,使线条不会出现在每个图层上,但连续的笔画至少有一个共同的通道。
- 最初的笔画通常表示有助于识别物体的整体形状,而最近的笔画是简单的细节。因此笔画以相反的顺序绘制,这样最后的笔画不会与第一个笔画重叠。
- 线宽是一个独立于最终图像大小的超参数,它确保在较大的图像上进行更快的迁移学习。
**注意:**我没有对提供的速度或时间进行编码,这可能会增加 CNN 可以使用的更多信息。
My strokes to images code
Image generated
第 7 课:其他竞争对手共享的内核通常是很好的基线。从他们那里获得灵感,改进他们的工作,让你达到顶峰。
卷积神经网络模型
既然数据已经准备就绪,我必须选择使用哪种人工智能算法。使用卷积神经网络的深度学习是图像识别的最先进技术。很明显,我选择走那条路。
https://towardsdatascience.com/cousins-of-artificial-intelligence-dda4edc27b55
在这篇博客文章和共享源代码中,我将描述一个单一的深度学习模型,以避免无用的复杂性。所以我用的是 resnet-18 型号。这个模型是一个“浅层”深度学习模型,更深层的模型肯定会在这个数据集上给出更好的结果,例如 se-resnext-50 , xception 。我决定不在这里展示它们,因为它们需要更多的时间来训练,并且不会为这个快速展示的目的提供额外的价值。当然,我们的团队训练了更深层次的模型,以达到第 46 位。😄
这个 resnet-18 模型是从零开始训练的,没有任何预训练的权重(例如基于 imagenet )。我做出这个决定是基于这样一个事实,即拥有 5000 万张图像的数据集非常庞大,而 imagenet 图像(真实世界的图片)远远不是 10 秒钟绘制的草图。我这边的实证检验证实了这个假设。具有预先训练的权重的模型在第一个时期给出了好的结果,但是随着时期的增加,具有随机初始化的权重的“临时”模型的表现更好。我想,如果我在预训练和随机初始化的模型上运行更多的纪元,那么它们最终可能会给出相似的结果。但是对于分配的时间,“scratch”模式更好。
resnet-18 layers
展示的模型是一个普通的 torchvision 模型,但是有一个类似于原始的自定义头部,但是我用一个自适应的对应物( AdaptiveAvgPool2d )替换了最终的池层,以优雅地处理不同分辨率的图像。我还故意删除了 fastai 添加的自定义头,这对于预训练的模型很好,但对于随机初始化的权重模型(非预训练),我觉得没有必要。
fastai 文档明显缺少添加自定义项以及如何用自定义头替换它的信息。我是这样解决的:
Customized head for scratch resnet-18
第八课:选择模型是深度学习解决方案的关键部分。不要犹豫去适应它们。这通常是训练数据集大小、计算能力和时间之间的权衡。
Data-inception
该模型使用 128px 图像进行训练,然后使用 144px 图像进行微调。
结果
为了向您展示我们的 resnet-18 的表现,下面是我们应该猜测的第一批图像,以及我们的 resnet-18 认为最有可能的三个类别:
Sample results from our resnet-18
这款极其简单的 resnet-18 型号已经为您赢得了一枚铜牌(在排行榜上排名第 104 位左右)。
Private Leaderboard for our sample resnet-18
深度学习取得的超人类的成果,我还是很惊讶。我们的最终得分是 0.94493,这可以粗略地解释为我们的解决方案在 94.5%的时间里获得了正确的类别。这个结果是通过堆叠不同的模型得到的(kalili 是目前为止我们的模型大师)。
我们是如何错失金牌的
在比赛中,我注意到一个有趣的事实,我和我的队友们分享了这个事实:我们必须猜测的图像类别的数量是 340 x 330 的一个。这令人惊讶,因为有 340 个可能的类别。因此,我认为测试集可以是完美平衡的,它由每个类别大约 330 个图像组成。YIANG 通过提交一个将所有图像设置为单一类别的解决方案来探测 leaderbord,他得到的分数是 0.002,这意味着该探测类别有 224 到 336 张图像,这当然无法确定测试集是否平衡。这种平衡测试集的想法随后被遗忘,因为比赛即将结束。
比赛结束后,获胜者在 Kaggle 论坛上发布了对他们的解决方案的描述。他们描述了一种“秘方”,又名“щепотка табака”,这让他们在排行榜上额外上升了 0.7%。那个“秘制酱”是什么?他们利用了测试集是平衡的这一事实。当我读到这一点时,我告诉自己,我应该花更多的时间来尝试重新平衡解决方案。😢
在比赛结束后,卡利利确实试图重新平衡我们的最佳解决方案,他获得了 0.6%的额外提升,这(理论上)会让我们上升到第 9 名。根据卡格尔晋升系统,该职位可获得一枚金牌。
Private leaderboard results with and without re-balancing the solution
错过了获得我们第一枚金牌的机会让我很难过,特别是当你有获得金牌的想法而没有好好利用它的时候。无论如何,我们获得了银牌,这已经很酷了。
第九课:花时间探索想法。三思而后行,即使时间不多了,也不要仓促行事。
结论
举办这次比赛是一件非常愉快的事情,我真的很感激第一次加入一个团队。我写这篇博文是因为我通常期待获胜者在论坛上描述他们的解决方案,他们通常有一些巧妙的技巧可以借鉴。这是我学到的最后一课。
第十课:向最优秀的人学习,并与他人分享。把事情写下来,往往能理清自己的思路,也可能对别人有帮助。
感谢阅读!
你需要知道的 10 个机器学习算法
Photo: http://hpc-asia.com/wp-content/uploads/2016/02/equations.jpg
由于数据分析、大计算能力和云计算的发展,我们生活在一个革命性时代的开端。机器学习肯定会在那里发挥巨大作用,机器学习背后的大脑是基于算法的。本文涵盖了目前使用的 10 种最流行的机器学习算法。
这些算法可以分为三大类。
- **监督算法:**训练数据集有输入,也有期望输出。在训练期间,模型将调整其变量,以将输入映射到相应的输出。
- **无监督算法:**在这个类别中,没有目标结果。这些算法将对不同组的数据集进行聚类。
- **强化算法:**这些算法是在做决策时训练出来的。因此,基于这些决定,算法将基于输出的成功/错误来训练自己。最终凭经验算法将能够给出好的预测。
下面的算法将在这篇文章中讨论。
- 线性回归
- SVM(支持向量机)
- KNN(K-最近邻)
- 逻辑回归
- 决策图表
- k 均值
- 随机森林
- 朴素贝叶斯
- 降维算法
- 梯度推进算法
1.线性回归
线性回归算法将使用数据点找到最佳拟合线来模拟数据。一条线可以用方程来表示, y = m*x + c 其中 y 为因变量, x 为自变量。应用基本的微积分理论,使用给定的数据集找到 m和 c的值。
线性回归有两种类型:仅使用一个自变量的简单线性回归和定义多个自变量的多元线性回归。
“ scikit-learn ”是一个简单高效的工具,用于 python 中的机器学习。下面是使用 scikit-learn 实现线性回归。
2.SVM(支持向量机)
这属于分类型算法。该算法将使用直线来分隔数据点。选择这条线,使其距离两个类别中最近的数据点最远。
在上图中,红线是最好的线,因为它距离最近的点最远。基于这条线,数据点被分为 2 组。
3.KNN(K-最近邻)
这是一个简单的算法,用 k 个最近邻预测未知数据点。k 的值在这里是关于预测准确性的一个关键因素。它通过使用基本的距离函数(如欧几里德距离函数)计算距离来确定最近的距离。
然而,这种算法需要很高的计算能力,并且我们需要首先归一化数据,以使每个数据点都在相同的范围内
4.逻辑回归
逻辑回归用于预期有离散输出的情况,如某些事件的发生(例如预测是否会下雨)。通常,逻辑回归使用一些函数将值压缩到特定的范围。
Logistic function (https://qph.ec.quoracdn.net/main-qimg-05edc1873d0103e36064862a45566dba)
“Sigmoid”(逻辑函数)就是这样一种函数,它具有用于二元分类的“S”形曲线。它将值转换到 0,1 的范围内,这解释为发生某个事件的概率。
y = e^(b0+B1 * x)/(1+e^(b0+B1 * x))
上面是一个简单的逻辑回归方程,其中 b0,b1 是常数。同时将计算这些的训练值,使得预测值和实际值之间的误差变得最小。
5.决策图表
该算法基于群体的一些选定属性(独立变量)将群体分类为几个集合。通常,该算法用于解决分类问题。分类是通过使用一些技术来完成的,如基尼系数、卡方、熵等。
让我们考虑一群人,并使用决策树算法来识别谁喜欢拥有信用卡。例如,考虑人口的年龄和婚姻状况。如果年龄超过 30 岁或已婚,人们倾向于更多或更少地使用信用卡。
Simple Decision Tree
该决策树可以通过识别合适的属性来进一步扩展,以定义更多的类别。在这个例子中,如果一个人已婚并且超过 30 岁,他们更有可能拥有信用卡(100%偏好)。测试数据用于生成该决策树。
6.k 均值
这是一个无监督的算法,为聚类问题提供了一个解决方案。该算法遵循一个程序来形成包含同类数据点的聚类。
k 的值是算法的输入。在此基础上,算法选择 k 个质心。然后,指向一个质心的相邻数据点与其质心相结合,并创建一个聚类。稍后,在每个聚类内创建一个新的质心。然后,靠近新质心的数据点将再次组合以扩展聚类。这个过程一直持续到质心不变。
Cluster forming process
7.随机森林
如其名,Random forest 可以被识别为决策树的集合。每棵树试图估计一个分类,这被称为“投票”。理想情况下,我们考虑每棵树的每一张选票,并选择投票最多的分类。
https://www.kdnuggets.com/wp-content/uploads/rand-forest-1.jpg
8.朴素贝叶斯
该算法基于概率论中的“贝叶斯定理”。由于朴素贝叶斯只有在特征彼此独立的情况下才能应用,因为这是贝叶斯定理的要求。如果我们试图通过花瓣的长度和宽度来预测一种花的类型,我们可以使用朴素贝叶斯方法,因为这两个特征是独立的。
Bayes Equation
朴素贝叶斯算法也属于分类类型。当问题中存在多个类别时,通常使用这种算法。
9.降维算法
一些数据集可能包含许多变量,这可能导致非常难以处理。尤其是现在,由于存在足够多的资源,系统中的数据收集发生在非常详细的级别。在这种情况下,数据集可能包含成千上万的变量,其中大多数也可能是不必要的。
在这种情况下,几乎不可能找出对我们的预测影响最大的变量。在这种情况下使用降维算法。它利用随机森林、决策树等其他算法来识别最重要的变量。
10.梯度推进算法
梯度提升算法使用多个弱算法来创建更强大的精确算法。与使用单个估计器相比,使用多个估计器将创建一个更稳定和更健壮的算法。
有几种梯度增强算法。
- XGBoost —使用线性和树算法
- LightGBM —仅使用基于树的算法
梯度推进算法的特点是精度更高。此外,像 LightGBM 这样的算法也具有令人难以置信的高性能。
感谢阅读。
干杯!
关于数据科学、分析和大数据的 10 本必读书籍
Source: Flickr
作为分析专家,这是一个我们经常从高管层专家和分析新手那里听到的问题。
“分析领域的必读书目是什么?’
最好的分析类书籍不只是告诉你这个行业如何运作,而是帮助你有效地履行你的日常职责。他们不仅解释数据科学的细微差别或如何进行分析,还教你讲故事的艺术。
如果你想将自己定位为数字化转型的倡导者,这些书将向你展示如何解码数字化转型的艺术。它们还会让你成为一名更好的分析专家,不管你是新手还是已经在这个行业待了几十年。
以下是 BRIDGEi2i 根据亚马逊和 Goodreads 社区的读者评论和投票选出的十本最畅销的数据科学必读书籍。
阅读更多: 12 张令人捧腹的 gif 图一个数据科学家会完全认同
数据分析由 Anil Maheshwari 提供
谁应该读?
对数据科学知之甚少或一无所知的新手或实习生。
关于作者:作者 Anil Maheshwari 在管理实践的各个领域拥有超过 20 年的经验,包括业务开发、市场营销、全球品牌、社交媒体、项目管理、IT 咨询和培训。
作者 Anil Maheshwari 在管理实践的各个领域拥有超过 20 年的经验,包括业务开发、市场营销、全球品牌、社交媒体、项目管理、IT 咨询和培训。
为什么要读?
这本书提供了一个广泛和快速的旅游,所有的主要议题和考虑因素,人们可能会期望当谈到数据分析。这些问题、例子和练习有助于你深入理解这个主题。这本书易于理解,内容丰富。它通过具体的例子涵盖了所有重要的内容,并吸引读者加入数据分析领域。
读者在说什么?
一位读者在 Goodreads 上说
这是你想知道的关于商业智能和数据挖掘的一切。大量的项目符号表和你需要记住的知识清单。
用数据讲故事:商务人士数据可视化指南
谁应该阅读它?
希望像设计师一样思考并在数据可视化中利用设计概念的数据可视化专家。
关于作者:
Cole Nussbaumer Knaflic 用数据创作故事。她在 www.storytellingwithdata.com 的热门博客上写道。她的研讨会和演讲深受全球关注数据的个人、公司和慈善组织的追捧。
为什么要读?
如果你对创建或设计仪表板感兴趣,你应该认真阅读这本书。这本书告诉你如何讲述数据背后的故事。通过这本书,你会发现讲故事的力量,以及如何将数据作为仪表板设计中的关键元素。
在每一章中,作者简要地讨论了业务场景,然后将仪表板分成几个组成部分,分析哪些部分工作良好,哪些部分可以做得不同。这本书展示了如何超越传统的工具,并使用您的数据来创建一个引人入胜,信息丰富,引人注目的设计故事。
读者在说什么?
与自己的教导保持一致是一件可爱的事情。Cole Nussbaumer Knaflic 通过她的第一本书实现了这一点。她提倡可视化的清晰和简洁,她的书清晰、简洁、实用。如果您是可视化的初学者,或者如果您在日常工作中难以使用 Excel、Tableau、Qlik 等工具制作出好的图表,这是开始学习核心原则的好地方。
–Alberto Cairo,视觉新闻学骑士讲座教授,迈阿密大学可视化教授,功能艺术的作者
阅读更多: 用 R 编程可视化巴西旅游趋势
大到不容忽视:获奖作家 P. Simon 的大数据商业案例
谁应该读它?
希望了解大数据能为他们和他们的业务带来什么的高管。
关于作者:
菲尔·西蒙擅长翻译没有术语的技术信息。他曾在 EA、思科、捷步达康和网飞等公司做过主题演讲。
为什么要读?
这本书告诉你为什么大数据是企业的灵丹妙药。作者为希望利用和理解大数据技术优势的管理团队和组织阐明了没有术语的建议。这本书有大量的例子、案例研究和来自世界各地的大数据专家的引用,是首席执行官、企业主和行业领导者的必读之作。这本书可以给你的组织所需的动力,将数据转化为情报,将情报转化为行动计划。
读者在说什么?
随着越来越多的企业家、投资者和客户谈论大数据,越来越难理解这个短语的含义。Phil Simon 在定义大数据方面做得很好,并为大数据一词中通常包含的概念提供了清晰的商业案例。忽视这本书,后果自负。
–Brad Feld,铸造集团董事总经理兼作者,创业社区
Sebastian Tonkin,Caleb Whitmore & Justin Cutroni 利用谷歌分析进行绩效营销
谁应该阅读它?
希望通过分析提升营销绩效和品牌健康的 CMO。
关于作者:
Sebastian Tonkin 是一名企业家,曾是谷歌分析营销团队的成员。Caleb Whitmore 是一名资深的谷歌分析顾问,也是 Analytics Pros 的创始人,该公司致力于为谷歌分析用户提供支持。Justin Cutroni 是广受欢迎的博客 Analytics Talk 的作者,Google Analytics 研讨会的领导者,以及帮助公司了解如何从 Google Analytics 获得最大价值的顾问。
为什么要读?
作者解释了用谷歌分析实现数字营销目标的综合方法。他们从对绩效营销策略的广泛解释开始,逐渐变得准确,通过逐步分析、示例和应用进行总结。
这些章节包含了关于增加搜索广告收入、优化现有网站、改善渠道和活动、加强品牌健康等方面的深入示例和案例研究。这本书还强调了谷歌的面向转换的工具的关键主题,包括 AdWords,AdSense,谷歌趋势,网站管理员工具,和基于搜索的关键字工具。
读者在说什么?
它让我看到并最大限度地利用基于谷歌分析的整体营销。这不仅仅是为了如何使用谷歌分析,而是为了如何在谷歌分析时代建立在线营销策略。它有许多实用的建议和例子。
–Goodreads 上的方敏雅
你应该试试克里斯·高沃德的作品
谁应该阅读它?
寻求销售线索、转化优化和收入的战略家和变革推动者。
关于作者:
克里斯·高沃德是转换优化机构 WiderFunnel 的创始人兼首席执行官。他是公认的转化优化思想领袖,有一个很有影响力的博客(WiderFunnel.com/blog)。
你为什么要读它?
Chris Goward 解释了转换策略的“为什么”和“如何”。这本书带你创建一个销售或营销的优化策略,它可以用适当的分析工具支持你的业务目标,并产生质量测试的想法。它的特点是动手练习,案例研究,和一个全彩色插入加强关键战术。
读者在说什么?
你应该测试一下!提供了一个易于理解的测试框架,以及许多关于如何向特定目标优化的优秀想法。这是一个非常需要的、全面的测试方法。
–杰西·尼科尔斯,机构合作伙伴,谷歌分析
阅读更多: 某财富 50 强 IT 公司如何优化数字营销支出
Peter Guerra 和 Kirk Borne 的《数据科学成熟的十个标志》
谁应该读?
希望培养数据科学和大数据分析能力的数据科学和分析领导者。
关于作者:
Booz Allen Hamilton 首席数据科学家 Kirk Borne 博士在下一代分析和数据科学领域支持战略创新团队。他是乔治·梅森大学研究生(博士)计算科学和信息学项目的教授,并在 NASA 的合同中工作了 18 年,包括担任哈勃望远镜数据档案项目科学家。
Peter Guerra 是 Booz Allen Hamilton 战略创新小组的副总裁,共同领导数据科学团队。他的专长是高可用性、大规模分布式系统和高级分析,并负责领导多个高级分析和大数据计算项目。
为什么要读?
在拥抱数据科学的同时,您的组织为崛起做了多少准备?你如何识别你的组织是否有成熟的数据能力?你如何帮助你的分析团队磨练技能?
如果你是一个正在寻找这些问题的答案的数据科学领导者,你应该今天就抓住这本书。这本书有一个详细的报告,对数据科学成熟的十个标志进行了简要的讨论。它鼓励分析专业人员为组织成员提供对所有可用数据的访问权限,使用敏捷,并利用“数据操作”(用于数据产品开发的开发操作),通过公开或内部竞争帮助您的数据科学团队提高技能,并将数据科学人格化为一种做事方式,而不是一件要做的事情。
读者在说什么?
任何想要培养数据科学能力的数据科学领导者都应该阅读这本书,并在组织内发展成熟的分析文化和实践。
——美莎上 Goodreads
丹尼尔·卡内曼的《思考的快与慢》
谁应该阅读它?
希望学习人们如何做决策的概念的商业领袖和高级管理人员。
关于作者:
丹尼尔·卡内曼是普林斯顿大学心理学荣誉退休教授,普林斯顿大学伍德罗·威尔逊公共和国际事务学院心理学和公共事务荣誉退休教授。他因与阿莫斯·特沃斯基在决策方面的开创性工作而获得了 2002 年诺贝尔经济学奖。
为什么要读?
卡尼曼解释了大脑中的两个“系统”是如何做出决策的。“系统 1”是大脑快速、直观的一面。“系统 2”是大脑中较慢的、逻辑的和推理的部分。他用有趣的例子探索了我们如何以及为什么经常做出非理性决定的一般主题。他提供了实用而有启发性的见解,让我们了解如何在我们的商业和个人生活中做出选择,以及我们如何使用不同的技术来克服经常让我们陷入困境的理性故障。
读者在说什么?
绝技。。。卡尼曼的书是任何对人类行为或投资感兴趣的人的必读之作。他清楚地表明,虽然我们喜欢认为自己在决策中是理性的,但事实是我们受到许多偏见的影响。至少意识到它们会让你有更好的机会避免它们,或者至少减少它们。
–拉里·斯威德罗,哥伦比亚广播公司新闻
凯茜·奥尼尔的《摧毁数学的武器》
谁应该阅读它?
希望了解大数据驱动的数学模型的阴险一面的数据科学家和组织决策者。
关于作者:
Catherine Helen O’Neil 是美国数学家,是博客 mathbabe.org 和几本数据科学书籍的作者。她是哥伦比亚大学新闻研究生院 Tow 中心数据实践 Lede 项目的前主任,并被聘为约翰逊研究实验室的数据科学顾问。
为什么要读?
通过真实世界的例子和生动的故事,作者展示了大数据算法和数学模型如何越来越多地规范人们。所用的案例研究引人入胜、简洁有力。这本书对于想要理解已经获得商业控制权的无形算法的数据创业者来说是一张方便的地图。
对于那些好奇大数据如何帮助他们和他们的企业,或者它如何重塑他们周围的世界的人来说,数学毁灭武器是开始的地方。
读者在说什么?
清晰、惊人、有价值……[奥尼尔]的写作简洁而精确,因为她将自己的观点瞄准了外行观众。对于一本关于算法的书来说,这是一本引人注目的翻页读物。摧毁数学的武器应该是任何生活会受到大数据影响的人的必读书目,也就是说:每个人的必读书目。这是一个警钟——丛林和寂静的春天的新闻继承人。像那些书一样,它应该会改变美国社会的进程。
–阿斯彭时报
数学毁灭武器是硅谷支持者不会讲述的大数据故事…(它)简明扼要地揭露了在如何利用信息评估从信誉到警务策略等一切方面的缺陷。对于任何倾向于相信数据不会说谎的人来说,这是一本发人深省的读物。
–路透社
信息经济学:如何将信息货币化、管理和衡量为竞争优势的资产
谁应该读?
希望成功实现数据货币化并在数字经济中竞争的 CDO 和商业领袖。
关于作者:
道格·兰尼(Doug Laney)是 Gartner 首席数据官(CDO)研究和咨询业务副总裁兼杰出分析师。他是一位卓有成就的从业者,也是信息和分析策略领域公认的权威,并且两次获得 Gartner 年度思想领袖奖。Doug 专门研究数据货币化和估值、开放和联合数据、数据治理以及基于大数据的创新。
为什么要读?
《信息经济学》讲述了量化信息资产价值的方法和策略,以及将信息作为竞争优势来推动增长的策略。这本书为评估信息价值提供了有用的框架,并确定了试图最大化信息价值的公司所面临的众多挑战。Doug 提供了有趣而丰富的例子和详细的基础,CDO 可以在制定数据策略时加以考虑。
读者在说什么?
信息经济学是一项重要的工作,为一个新兴的研究领域和活动奠定了基础。大多数企业领导人似乎忘记了信息近乎无限的可复制性和可重用性,以及它的低存储和传输成本,加上高度的软件自动化,如何使它成为一种无与伦比的资源。这本书提供了评估信息价值的有用框架,确定了试图最大化信息价值的公司所面临的众多挑战,并且最有帮助的是,组织必须解决这些挑战以在新经济中蓬勃发展的方法。
–新南威尔士州政府首席数据科学家兼新南威尔士州数据分析中心首席执行官 Ian opper Mann
阅读更多: 建立一个分析学-第一组织
闪光男孩:迈克尔·刘易斯的华尔街反抗
谁应该读?
打算在显微镜下了解金融危机和高频交易的财务人员或投资者。
关于作者:
迈克尔·刘易斯出版了许多《纽约时报》上各种主题的畅销书。他最近的作品是《金钱球》、《大空头》和《回旋镖》,以全球金融危机为背景。他是《彭博观点》的专栏作家,也是《名利场》的特约撰稿人。
为什么要读?
闪电侠探讨高频交易现象及其复杂的腐败。迈克尔以他的叙述风格,深入解释了股票市场的机制。这本书包含引人入胜的故事和引人注目的人物。尽管这个主题很复杂,但大多数概念都解释得很清楚。这本书还精彩地解释了当前的环境及其对我们市场的潜在危害。
读者在说什么?
哇!太棒了。我喜欢它!娱乐性。
它有一个叫布拉德的家伙,他是我的英雄。这读起来像约翰·格里森姆的小说,但这是一个关于证券交易所、高频交易者和暗池的真实故事。作者非常擅长解释复杂的技术主题,并围绕这些主题讲述一个好故事。在书的中间,我对投资者的敲竹杠感到非常愤怒,我正在考虑写信。但是到了书的结尾,我就不必了。一些好事发生了。现在,各种政府机构正在调查书中描述的问题——SEC、FBI、CFTC、FINRA、纽约州总检察长和美国司法部长。
–珍·史都华在 Goodreads 上
完全迷人……照亮了通常在暗处做生意的华尔街的一部分。
—《纽约书评》
今天就去书店或在线订购书籍,让自己沉浸在数据世界中。但与此同时,如果您想了解分析行业的实际情况,请联系bridge i2i了解分析行业的细微差别。
原载于 2017 年 9 月 21 日bridgei2i.com。
用 R 编程的 10 个不太直观的地方
为什么数据科学要用 R
传统上,r 被认为是统计学家和某些学术研究者的首选计算语言,因为有大量可用的统计软件包和庞大的社区。可以说,R 的最大优势在于数据操作和统计分析任务的容易实现。此外,ggplot2 之类的包可以生成高质量的可视化效果,使数据分析和报告变得令人愉快,而没有其他脚本语言的陡峭的学习曲线。
也就是说,R 的行为也可能相当古怪。作为三藩市大学 MSDS 项目的一部分,我最近参加了一门关于 R 的探索性数据分析的课程,并以惨痛的代价学会了其中的一些怪癖。我在下面列出了十大怪癖,可能不是很直观。在分析数据和调试代码时,意识到这些怪癖可以节省大量的时间和挫折。
1)加载包时使用 require()和 library()
如上所述,R 的主要优点是有大量的包,可以很容易地检索并加载到活动的 R 会话中。 require() 和 library() 函数都允许我们将已安装的包加载到活动内存中,但是当加载有问题的包抛出异常时,它们的输出会有细微的差别。当 library() 抛出一个 错误 当包不可加载到活动内存时, require() 抛出一个 警告 并返回一个基于包可用性的逻辑响应。
> library(randomForest)
**Error** in library(randomForest) :
there is no package called ‘randomForest’
> b <- require(randomForest)
Loading required package: randomForest
**Warning message:**
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called ‘randomForest’
> print(b)
[1] **FALSE**
require() 通常可以作为条件检查,查看包是否存在并安装。
2)R 中的 NA 与 NULL
NA
和NULL
之间的差异可能是一个混淆点,因为人们可能会直觉地认为它们都表示缺失/未定义的值。然而,r 以不同的方式处理这两个保留字。NA
是一个长度为 1 的 逻辑常数,其中包含一个 缺失值 指示符,而NULL
表示 空对象。 通过下面的代码可以直观的解释上述语句:
> v <- c(1,2,3,NA)
> v
[1] 1 2 3 NA> w <- c(1,2,3,NULL)
> w
[1] 1 2 3
上面的代码帮助我们理解了NA
和NULL
之间的一个关键区别。NULL
是自身类型的对象,不能强制为任何其他类型。因此,当我们试图将它包含在矢量形式中时,它被忽略了。另一方面,NA
可以被强制为各种类型,如 NA_interger、NA_character 等。但是,如果我们创建一个列表(因为列表可以将不同的类型存储在一起),那么它们都可以作为一个元素包含在内。
> w <- list(1,2,3,NULL)
> w
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
NULL
3)使用浮点值的子设置和逻辑向量的循环
要访问向量/矩阵/数组中的特定值,我们可以使用索引值或逻辑向量进行子设置。值得注意的一点是,我们可以使用 floats 和 integer 来调用特定的值,如下所示:
> w <- c(1,2,3,4,5)
> w[3.5]
[1] 3
> w[-4.9]
[1] 1 2 3 5
我们可以清楚地看到,无论符号如何,在子设置时,指数的浮动部分被忽略。所以 3.5 给我们向量中的第 3 个元素,而 -4.9 忽略第 4 个元素。在使用逻辑向量进行子集设置时,另一件要注意的事情是向量长度。如果子集向量的长度较小,R 不会抛出错误,而是回收较小的向量,使其具有相同的长度。
> w <- c(1,2,3,4,5)
> x <- c(T,F)
> x
[1] TRUE FALSE
> w[x]
[1] 1 3 5
我们可以看到向量x
的长度为 2,向量w
的长度为 5。然而,当我们使用x
子集时,它被循环到 c(T,F,T,F,T) 并且我们在w
中得到所有的替代值。
4)列表中的类型保留与简化
列表能够将不同类型的数据存储在一起,这非常有用。类型保留和类型简化是两个有趣的概念,当我们试图使用([ ]
或[[ ]]
)提取列表元素时,它们就发挥作用了
> a <- list(1,2,3,c(4,5,6))
# a has 1,2,3 and c(4,5,6) as its elements
> a[1]
[[1]]
[1] 1
#Element one as list:Type preservation> a[4]
[[1]]
[1] 4 5 6
#Element 4 as list:Type preservation> a[[4]]
[1] 4 5 6
#Element 4 as vector, type simplification> a[[4]][1]
[1] 4
#First element of 4th element of a, type simplification> a[4][1]
[[1]]
[1] 4 5 6
#[] Outputs the whole vector as we did not simplify the data type to vector from list.
从上面的例子中,我们可以看到[]
有助于 T 类型保存,输出也是一个列表,类似于初始列表。另一方面,[[]]
对进行了类型简化,并给出了最简单的潜在数据类型。另外,当我们试图访问一个向量的元素时,[[]]
是很重要的,这个向量包含在一个列表中,如代码的最后一行所示。
5)访问矩阵中的列并使用 drop
矩阵运算在实现很多机器学习模型的矢量化和速度方面发挥了很大的作用。很多时候,我们需要对矩阵进行子集化,以访问矩阵中的特定列并执行某些操作。但是,当您尝试从矩阵中提取单个列时,会发生如下所示的奇怪情况:
> a <- matrix(c(1:9),ncol=3,nrow=3)
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> a[,1]
[1] 1 2 3
> class(a[,1])
[1] "integer"
#When you extract a single column, it is converted to a vector> a[,1,drop=F]
[,1]
[1,] 1
[2,] 2
[3,] 3
> class(a[,1,drop=F])
[1] "matrix"
# drop=F helps us retain the matrix form
当我们试图访问一个单独的列时,R 把它转换成向量形式。这有时可能是不必要的,因为您的下游代码可能会由于这种转换而受到影响(在 R 中从头实现 k- means 算法时学到了这一点)。为了避免这种情况,我们必须在访问单个列时使用drop=F
作为参数。
6)访问向量和列表中的越界元素
当我们试图访问一个越界的元素时,这是我们在 R 中能观察到的最不寻常的事情之一。看看下面的代码:
> a <- c(1:5)
> a
[1] 1 2 3 4 5
# a has 5 elements as shown above> a[7]
[1] NA
#When we try to access 7th element, we get NA instead of an error> b <- list(c(1,2,3,4))
> b
[[1]]
[1] 1 2 3 4
#b has 1 element which is a vector of 4 elements
> b[2]
[[1]]
NULL
#When we try to access 2nd element, we get NULL instead of an error
当我们从一个向量或列表中访问一个越界索引时,我们得到的不是一个错误,而是作为输出的NA
和NULL
,这可能会引起关注,有时会使测试/调试变得困难。
7) if {} else{} vs ifelse()
当我们有了一个向量并想要检查给定的条件时,if {} else{}
只对向量的第一个元素起作用,并给出一个警告。然而,如果我们想要访问向量中每个元素的条件,我们必须使用ifelse()
。它比较向量中的每个值并返回一个向量。假设,我们有一个包含 5 个元素的向量,我们想检查它们是偶数还是奇数
> a <- c(5:10)
> a
[1] 5 6 7 8 9 10
> if(a%%2==0){x <- "Even"} else{x <- "Odd"}
Warning message:
In if (a%%2 == 0) { :
the condition has length > 1 and only the first element will be used
> x
[1] "Odd"> y <- ifelse(a%%2,"Even","Odd")
> y
[1] "Even" "Odd" "Even" "Odd" "Even" "Odd"
我们可以看到if{} else{}
只比较了a
的第一个元素,而ifelse()
达到了要求的结果。
8)调用参数数量不足的函数
r 允许调用参数数量不足的函数,只要缺少的参数没有被调用。这是需要记住的非常重要的一点,并且不同于其他编程语言。如果我们明确地希望所有的参数都出现在函数调用中,我们可以在其他选项中使用force()
。
> f <- function(x,y){
print(x)}
> f(2)
[1] 2
#Function call works with one argument as y is not used.> f(2,3)
[1] 2
#Calling with both arguments> f()
Error in print(x) : argument "x" is missing, with no default
#Since x is called inside function and is missing, we get error#Explicitly checking for both x and y using force()
> f <- function(x,y){force(x,y); print(x)}
> f(2,3)
[1] 2
> f(2)
Error in force(y) : argument "y" is missing, with no default
force()
检查 x 和 y 是否都存在,当缺失时抛出错误。
9)功能屏蔽和使用:
很多时候,不同的包有相同名称但不同功能的函数。如果我们想使用特定包中的特定函数,我们可能需要特别指定它。在没有特定调用的情况下,最近加载的包中的函数会屏蔽所有其他同名函数。例如,库chron
和tseries
都以is.weekend()
为其功能。
library(chron)
library(tseries)
‘tseries’ version: 0.10-45
‘tseries’ is a package for time series analysis and computational finance.
See ‘library(help="tseries")’ for details.
Attaching package: ‘tseries’
**The following object is masked from ‘package:chron’:**
is.weekendis.weekend(x)
当我们调用is.weekend()
时,来自tseries
包的函数被使用,因为它是最近加载的包。如果我们特别想使用chron
,我们需要做以下事情:
chron::is.weekend(x)
::
帮助我们指定使用哪个包。::
也帮助我们不用加载包就可以使用一个函数。然而,每当我们想要使用这个包中的函数时,我们需要使用::
来专门调用这个函数。
10)调用函数时的参数匹配
调用函数时,参数按照以下顺序进行匹配:a)完全名称匹配
b)部分名称匹配
c)位置匹配
> f <- function(a1,b1,a2){
print(paste("a1:",a1,"b1:",b1,"c1:",a2))}> f(a1=2,b1=3,a2=5)
[1] "a1: 2 b1: 3 c1: 5"
#Example of Exact match, each argument has same name > f(b1=3,5,2)
[1] "a1: 5 b1: 3 c1: 2"
#Example of exact match and positional match. Since b1 is matched, 5 and 2 are assigned based on position> f(3,b=5,2)
[1] "a1: 3 b1: 5 c1: 2"
#Partial name match, b matches to b1\. Rest matched based on position > f(3,5,2)
[1] "a1: 3 b1: 5 c1: 2"
> f(3,5,a=2)
Error in f(3, 5, a = 2) : argument 3 matches multiple formal arguments
#Since a matches to both a1 and a2 we get error as R does not know where the value needs to be assigned.
结束注释:
r 为我们打开了一个无限可能的世界,它蓬勃发展的社区和生态系统使它成为一门值得学习的编程语言。我希望以上几点对任何使用 R 的人都有用,并帮助他们避免许多常见的错误。这篇博客文章是我在旧金山大学教授的探索性数据分析的几个要点。联系我,讨论/编辑任何具体问题。
**关于我:**研究生,旧金山大学数据科学硕士
领英:https://www . LinkedIn . com/in/jyoti-pra kash-maheswari-940 ab 766/
GitHub:https://github.com/jyotipmahes
参考
- Paul interva do 利用 R 进行探索性数据分析
智能代理设计的 10 个原则
我们正处于新一代更好、更复杂的智能代理的尖端。
智能代理正在个人生活和商业中迅速变得无处不在,这意味着它们是创新者机会和兴趣的重要领域。作为企业家、设计师、产品经理、开发者和投资者,我们应该退后一步,思考我们正在构建的东西背后的原则。现在是开始为我们想要如何设计和构建智能代理制定实践和原则的大好时机。作为这一思考过程的一部分,以下 10 条原则可以帮助管理智能代理的未来设计。
1.有用的
一个聪明的特工应该为他人服务。理想的智能代理以明确有用的方式帮助人类。一些代理可能会协助其他代理,或者是更大流程的一部分。但它们必须有用。
2.上下文感知的
一个智能代理应该理解上下文,包括时间、地点和许多其他信息。它应该尽可能多地了解世界,以便完成任务,在正确的时间提供正确的信息,并进行学习。
3.能够学习
随着时间的推移,智能代理应该变得更加智能。与人类、其他计算机系统和世界的每一次互动都是一次学习的机会。代理收集的一些信息将增加其知识库,一些信息将使其更好地发挥核心功能,如沟通和采取正确的行动。
4.适合的
一个智能代理应该能够改变以便应用它所学到的东西。适应性的一个方面涉及到对用户偏好的敏感。为了塑造代理的行为,代理可以学习许多偏好,包括通信偏好和隐私参数。
5.能够很好地沟通
一个聪明的特工应该追求最大的口才。它应该是直观的、不言自明的,并对与之通信的任何实体做出响应。它应该针对通信的上下文使用最有效的通信方法(例如文本、语音、图形和 API)。
6.积极主动的
一个聪明的代理人应该预见到其他人的需求。它应该将所学知识与环境相结合,以便能够采取主动行动。然而,只有当信息对接收者有用时,它才应该积极主动地进行沟通。
7.尊重隐私
智能代理应该尊重信息隐私。基于隐私要求,不同的信息可以与不同的方共享。它应该理解向所有不同方提供或接收所有不同类型信息的隐私参数。
8.诚实的
智能代理应该提供正确的信息。它不应该欺骗或做出无法兑现的承诺。
9.透明的
智能代理应该允许对影响他人的信息进行适当的访问。例如,它应该允许对视图设置、配置控制和影响人类的默认设置进行适当的访问。
10.无恶意的
一个聪明的特工不应该参与伤害他人。如果被请求的动作是有害的,它应该警告用户被请求的动作的后果。
我不认为每个智能代理都需要遵循所有这些原则。但是如果这些原则中有一条没有包含在设计中,那么这样做的原因应该是可以理解的。为了某个特定的目的而省略某件事比因为从未考虑过而忽略它要好。牢记这些原则将有助于开发人员构建健壮的未来智能代理,随着技术的进步和我们对其设计的改进,这些智能代理会不断改进。
原载于 2017 年 6 月 18 日【venturebeat.com】。
我是威尔,硅谷的一名技术高管和企业家。
跟我上多产:@ 会
每个有抱负的数据科学家需要知道的 10 件事
哈佛的一篇文章《数据科学家:21 世纪最性感的工作》首先引发了我对数据科学领域的兴趣。那时,我已经在管理咨询行业工作了 3.5 年,并在 MS Excel 中建立模型和开发项目方面建立了良好的声誉。读完那篇文章后,我意识到数据科学是我当时的角色和我一直渴望学习的编程(技术类的东西)之间的一个很好的交叉点。这种渴望来自于我在成长过程中对科技事物的强烈兴趣。多亏了我的父亲,我在各种各样的电脑包围中度过了我的性格形成期,即使在我长大的那个镇上它们并不那么主流。
读了那篇文章几个月后,我决定加入我工作的公司新成立的数据和分析团队。这个决定看起来很容易,但这不是传统的做法,因为我是作为一名资深人士加入这个团队的,在这个领域没有任何经验。因此,最初的几个月有点困难,但这促使我投入大量时间自学数据科学。
我采用了自学的方法,这种方法开始时很有趣,但后来变得既费时又有挑战性。我总结了 10 件事,我希望在一年前开始我的数据科学之旅时有人告诉我。
我敢肯定,肯定有人需要这个!
1.学习统计学:如果你曾经统计失败,现在是重新开始的好时机。如果对统计概念没有很好的理解,你就不会成为一名数据科学家。我知道这在某些时候会变得复杂,但现在,从基本的东西开始,并在此基础上继续建设。很有可能它没有你想象的那么难。如果你在一个非洲家庭长大,你可能熟悉下面这个短语。
《做官的人没有两个脑袋》
这里有一些我觉得有用的课程…
2.学习编程:很容易认为编程是火箭科学,尤其是当你没有技术背景的时候,但事实并非如此。有几门课程和几篇文章可以让你轻松入门。显然,不要指望从第一天就能生产出超级酷的东西;这永远不会发生。但是如果你坚持不懈,总有一天会的。r 还是 Python?好吧,我会让你来决定。
我发现数据营、代码学院和单飞学习对移动极有帮助。这些将帮助你开始。
其他有用的资源:
- 约瑟夫·阿德勒的《一言以蔽之》
- Garrett grole mund 和 Hadley Wickham 的《数据科学研究》
- Python 数据科学手册:使用数据的基本工具,作者 Jake VanderPlas
- Joel Grus 的《从零开始的数据科学:Python 的基本原则》
3.学习,学习,练习,练习,再练习:你需要花大量的时间来学习和练习。你可以从非常简单的东西开始,然后逐步积累。只要确保你花大量的时间学习和练习,最好是每天。这个领域非常广泛,技术性很强,所以有些地方你需要反复阅读。记住,你的学习永远不会结束,除非你去实践。把它看成一个迭代的过程。当你练习时,更多的问题出现,然后你被迫重新学习。通过阅读和实践,你肯定会学到很多东西。永远记住,数据科学是一个应用领域。
有用的资源:
- Bart BAE sens 著《大数据世界中的分析》
- 迪安·阿博特的应用预测分析
- 马克斯·库恩的应用预测建模
4.保持饥渴和好奇:好奇心不会杀死数据科学家;好奇只会害死猫。所以放轻松!作为一名数据科学家,你需要保持求知欲和好奇心。在数据科学中,有太多的概念需要学习,而且每天都有新的概念出现。你需要让自己跟上变化和趋势。阅读书籍、文章、解构代码,确保你的渴望永远不会消失。有时你可能正在阅读一篇文章,而这篇文章提供了四个不同的链接。在这一点上不要感到不知所措,只是保持饥饿。记住,这是工作带来的。
我发现对数据科学、分析 Vidhya 和 kdnuggets 非常有帮助。
5.为你的学习建立一些结构:数据科学中的自学概念听起来总是很酷,直到你进入其中并意识到它非常耗时且具有挑战性。数据科学涉及面很广,在浏览您需要学习的各个领域时很容易迷路。不要漫无目的地围绕数据科学中的各种主题闲逛,这一点非常重要,因为这样更难将这些点联系起来。你需要通过参加各种平台上的课程和加入学习路径来组织你的学习。你不需要倾家荡产来做到这一点。你可以先从免费的开始。
我发现以下内容很有帮助
6.加入一个社区/见一面或找一个导师:在数据科学领域,“团结起来,每个人都会取得更大的成就”这句话绝对是真理。在这个旅程中,你需要人。永远不要做独行侠。很有可能你会很快筋疲力尽,花费无尽的时间到达目的地。然而,有了导师和伙伴,你可以走得更远。不要把时间浪费在别人可以在一分钟内向你解释的事情上。有人可能已经做了你正在努力做的事情,所以不要重新发明轮子。
另一方面,当你还没有尽力的时候,不要急于寻求帮助。你可以从自己的错误和研究中吸取很多教训。
7.尽快参加比赛/竞赛:竞赛有助于加快学习过程。就像我常说的,从简单的事情开始。泰坦尼克号竞赛或Kaggle 上的房价预测竞赛都是很好的起点。看到自己在排行榜上升是一个很好的动力。它给你进步的感觉;至少直到你碰到玻璃天花板,发现很难提高你的模型的准确性。然后继续学习,因为你需要找到改进这个模型的方法。所以参加比赛,分享你的代码,让人们来评论。
8.现在是最好的时机:你可能想知道你是否一生都生活在岩石下,因为你刚刚发现数据科学,并且你已经阅读了几个关于已经在这个行业工作多年的人的故事。嗯,他们说种树的最佳时间是二十年前,下一个最佳时间是现在。从不迟到。不要抱怨你如何能在十亿年前开始数据科学。最重要的是,你开始了旅程,而且你正在弄脏你的手。为此你应该受到表扬。
9.坚持不懈,永不放弃:当事情变得艰难时,坚强的人会坚持下去。别自欺欺人了,数据科学不是儿戏。在某个时候会变得艰难。你需要保持专注,保持一致。庆祝这些小小的里程碑:学习你的第一个算法,你的第一个参赛作品等等。庆祝他们。
10.将第 1-9 点挂在墙上的大框架上,把手弄脏。永远记住你不是一个人,所以坐下来放松。这绝对会是一次快乐的旅程。
祝你好运:)
在数据科学会议上显得聪明的 10 个技巧
我最喜欢的帮助你成为智能数据科学专家的做法。
Adapted from Pexels using Chalk Brushes
显得聪明应该是每个数据科学家的首要任务。这是你职业生涯的动力,对吗?Sarah Cooper 关于如何在会议上显得聪明的建议是一个很好的开始,但是在数据科学家中取得成功完全是另外一回事。我们说的是给一屋子的博士和自学成才的天才留下深刻印象。但是不要害怕,用一些简单的技巧你可以欺骗任何人。
medium.com](https://medium.com/conquering-corporate-america/10-tricks-to-appear-smart-during-meetings-27b489a39d1a)
1.画一条钟形曲线
站起来画东西对你的个人曝光很有帮助。
正态分布可以在任何地方的所有数据中找到,所以没有比画钟形曲线更好的方式来展示你的统计技能了。最重要的是,画一必然会引发一场关于数据可能存在的其他假设的讨论。之后,正如库珀所说,你可以继续玩你的智能手机。
2.询问异常值
数据科学会议是关于以某种形式呈现的数据和数据可视化。而且数据总是有问题。因此,当会议期间出现沉默时,提问:“我们能回到有异常值的那张幻灯片吗?”。这是一次有保证的成功!
注意:如果你发现自己在演示的最后,一定要确保在你的数字中留下一些你可以很容易解释的异常值。很管用。
3.当你听到过度合身时,点头表示同意
当你在一场无聊的讨论中打瞌睡时,你听到单词过拟合,确保你表现出警觉,并朝着说话者的方向用力点头。过度拟合是万恶之源!所有有经验的数据科学家都学会了害怕它。承认这一事实不仅能让你立即变得聪明,而且当你们再次见面时,他们会记得在面对共同的敌人时你和他们站在一起。
你是否应该参加一个偶然的会议,会上有人问*“什么是过度配合?”*,只需将问题转给最初级的工程师进行澄清(他最近肯定上过数据科学课程)。这让你看起来更像一个领导。
4.询问商业价值
最终,你的分析或产品的商业价值是唯一重要的,对吗?但数据科学家只想解决有趣的谜题,制作酷图,显得聪明。所以这会让他们在疯狂的精神世界里奔跑!
5.建议一个随机算法
把这个算法列表背下来就行了,随便喊一个还没说的。你应该都试试。
- 线性回归(总是经典)
- 套索回归
- 随机森林
- 任何带有贝叶斯字样的东西
- 神经网络(或者快速谷歌一下最新炒作的,例如:胶囊网络)
- 主成分分析
- k-最近邻
随着您在数据科学会议和在线文章中提到的术语方面获得经验,您可以随意扩展这个列表。
6.扭曲使用的指标
当有人提到他们的方法有 10%的错误率时,立即接手并宣布这意味着我们找到了 90%的成功率!改成分数的分数也很棒。从 90%到 95%的成功率意味着错误率减少了 50%!人们会对微小的成就感觉良好,他们会因为你指出来而更加喜欢你。
你可以在《如何用统计学 撒谎》一书中进一步背熟所有方法。
7.提议“保持简单”
如果你不理解一个数字,最好把它变成一种资产。但别忘了把责任推到别处。暗示你公司的经理或客户可能不这么理解。如果演示者只是*【保持简单】*,图表会有很大的改善。
也可以随机说出*“少即是多”*,并参考爱德华·塔夫特。没有人真正读过他的书,但这让你看起来像一个真正的爱好者。
8.开个无聊的玩笑
有趣的人被认为更聪明。有趣的书呆子因此必须在聪明等级的顶端。会出什么问题呢?
9.组织数据黑客
最好的。会议。永远不会。你邀请所有聪明人到你的会议室。给他们你的数据和问题。然后他们用漂亮的脚本和图表为你解决这些问题。最后,你根据他们的贡献给他们打分。最后,他们甚至会感谢你所做的一切!
10.问深层次的问题,比如“为什么?”
Typical Data Science project flow
可能发生的最糟糕的事情是你的项目结束了,你不得不重新开始在新的项目中给新的人留下深刻印象。
那么,如何让车轮继续转动呢?借助众所周知的项目数据科学流程,您可以明确如何做到这一点。最好的办法是强迫所有人回到起点。问一些问题,比如“我们为什么要再做一次?”或者只是“为什么?”。不叫数据科学白叫;科学就是问永无止境的问题!
Matthijs Cox 是一名来自荷兰的高科技专业人士,专攻纳米技术和数据科学。他喜欢用第三人称谈论自己,玩他孩子的乐高,创造 美丽的图像 并设计可能接管世界的算法。以上其中一个他只是在开玩笑。
推进端到端数据科学项目的 10 种方式
从研究到生产:如何避免基本陷阱
与常规软件工程项目不同,人工智能/数据驱动的产品对大多数公司来说都是相当新的,从研究到生产的最佳方式仍然不清楚。在接下来的文章中,我们将介绍一些从将机器学习解决方案部署到几个 Checkpoint 的主要产品中获得的经验。
#1 在做任何事情之前,与管理层讨论评估指标
令人惊讶的是,我们通常会等到第一次结果出来后,才决定如何评价自己。在大多数情况下,你的主管或 QA 团队会选择一种完全不同的方式来评判你的工作。“他们不懂机器学习!”你会说,但是他们了解你的客户,他们是领域专家…
作为一名数据科学家,尤其是在非机器学习公司,需要清楚地解释你在做什么,并证明它为什么有效。这并不意味着将所有的技术细节转移到你的层级中,而是描述你如何改进当前的流程以及如何衡量它。这也包括了解公司如何运作,以及它的目标是什么。
不同的行业使用不同的关键绩效指标:广告技术人们喜欢点击率,在金融它将是投资回报或者在网络安全假阳性/阴性率。
只有在指标上达成一致,你才能开始你的项目。此外,你将能够校准你的模型来优化它,并向你的老板证明你确实在做一些事情。
#2 获得一个好的数据集(我知道你知道)
这听起来似乎是一个显而易见的观点,事实也的确如此。但是我们已经看到因为这一点损失了太多的时间。
如果你不能建立一个足够大的、相关的和无偏见的数据集,就不要开始一个数据科学项目。
如果你还没有访问数据集的权限,确保构建它不会太难/太贵。不要假设你的管理层会对你的初步结果感到惊讶,并投入大量资金来获得你应得的数据。大多数情况下,它们会被扔掉。
数据集需要代表实际的生产数据,并且只有当您拥有直接来自这个生产数据的一个重要的、可更新的测试集时,您才能检查它。
例如,对于一个分类问题,我们经常需要从不同的来源获取不同标签的数据*(例如:来自开源存储库的钓鱼邮件和来自贵公司的良性邮件)*。这是可以的,只要您可以在生产中对来自一个数据源的数据集检查您的模型,否则您有过度拟合您的数据源的风险。
#3 明智地在团队成员之间分配工作
在大型团队中工作时,最好允许贡献者独立。然而,你也希望个人的贡献能够彼此和谐地工作。对于机器学习项目的某些情况,通过使用以下方案可以相对容易地实现这一点:
单个数据科学家可以在“数据处理器 1”和“数据处理器 N”上并行工作。然后在组合功能集的子集上尝试不同的模型。
例如,假设我们想要构建一个检测钓鱼电子邮件的模型。例如,每封电子邮件以及作品可以分为内容(主题、正文)和附件。只要这个“内容”和“附件”预处理程序的输出是一致同意的格式,就可以很容易地将它们结合起来,并从中创建一个大矩阵。
#4 分离训练和预测
事情是这样的:在研究阶段,训练和预测几乎同时发生,通常在同一个笔记本中(如果你使用 sci-kit,那么训练者和预测者实际上是同一个对象),所以你没有真正分开用于完全不同任务的代码。然而,有一天到了你需要发布预测模型的时候,你意识到它实际上与训练代码耦合在一起,训练代码对你并不真正需要的东西有很多依赖性。
因此,一个好习惯是将预测/评估代码从训练代码中分离出来,你可以使用来自训练的预测代码,但不能反过来。
此外,由于预测算法通常非常简单,因此可以针对不同的环境用不同的语言来实现。
#5 数据预处理代码应该在任何地方运行
构建数据管道、预处理数据和清理数据是我们工作中最不光彩的部分,但有时大部分时间都花在这上面。
预处理代码通常很简单,不需要复杂的生态系统。
明智的做法是将预处理部分安装到需要较少资源的环境中*(例如:C 或 Go 而不是 Python)* 特别是当您需要在客户的机器上运行模型时。
在 Check Point 中,我们曾经不得不用有限的资源为操作系统和架构构建一个模型。该模型将 exe 文件的内容作为输入,并提供一个恶意得分。**我们使用 sci-kit 在 Python 中训练模型,但我们需要在 C 中进行预测。**为了避免编写两次代码,我们刚刚创建了一个 C 库,它能够将文件转换为矩阵,另一个库接受预测器并从矩阵中返回预测。训练代码在 Python 中导入这些 C 函数,然后运行训练。
#6 建立报告基础设施,以便每个人都能随时看到结果
即使在早期的模型创建阶段,最好是有一个自动的过程来重新评估你的模型,并且让评估的结果不仅被模型创建者看到,还被一些公平、公正、温和的评审者看到。这样我们一方面不会被诱惑去欺骗自己,但另一方面也不会被仇恨者彻底摧毁。
**你不应该自己做评论,因为你不想既当法官又当当事人!**事实上,这样做很容易在结果中引入偏差(例如,通过玩弄阈值),当您展示实际生产结果时,可能会让您的上级失望。
一个好的解决方案是在一个共享网站上显示结果,并就如何自动生成预测达成一致。
破折号 对于完全不懂网络的人来说可能是个不错的解决方案
#7 数据科学中的版本控制
数据科学中的项目版本化与常规软件开发中的项目版本化略有不同。实际上你的模型的新版本可以是代码的实际修改,也可以是你训练它的数据的变化。
例如,随着网络安全世界的不断变化,Check Point 经常重新训练我们的模型,以便包含更新的数据。每个再训练输出一个新的模型,这就产生了一个新的“次要版本”,它包括一个对它所训练的数据的引用。相反,我们经常想要添加新的特性,重写一些代码,等等。这些种类的变化涉及到生产中的新部署,它们可能会导致更大的问题并需要测试。正如你所猜测的,我们称这些版本为“主版本”,它们有自己的 git 分支。每个模型都通过其主要/次要版本来识别,这样我们可以根据我们刚刚发布的版本类型轻松地设置回退规则,并检测任何 bug 的来源。
#8 模型培训应该与数据库和存储无关
当处理大量数据时,不能将所有数据库都保存在内存中,训练代码需要能够从外部来源(文件系统或数据库)获取信息。
在我们的第一个项目中,我们是傻瓜,我们只是在矢量化步骤中插入了所有的数据库查询。但几个月后,我们决定改变数据库类型,并需要重写大量不相关的部分代码,以便实现这一点。然后我们被要求在不同的环境中运行我们的代码,有不同的数据库或者根本没有数据库。我们迷失了方向,在代码中添加了大量的“如果”来使它工作,这看起来很糟糕。
我们通过增加一点抽象解决了这个问题。
对单个样品或一批样品进行抽象。那将是你训练和预测的输入。这些抽象的实例将能够在不同的环境中运行。
#9 数据恢复和高速缓存
当我们基于存储在数据库中的数据创建一个模型,然后更新数据库并且不能再重现这个模型时,我们遇到了一些不幸的情况。
原始数据应该被保存**,这样训练就可以一直被复制**。不然老机型调试起来真的很难。
使用缓存来存储中间预处理结果以加快速度是一个好主意。然而,我们应该总是能够从原始数据中恢复缓存,而绝不仅仅依赖于缓存的结果。
做研究的时候,总是假设你会失败
首先,尽可能快地得到结果。请记住,你正在做的事情可以扔掉。变笨,即使这意味着你的代码看起来很糟糕或者不是一直在运行(你毕竟不仅仅是一个软件开发人员)。请记住,您总是从概念证明开始。
另一个要点是要有短期目标,你可以有远大的梦想,但仍要有务实的计划。你总是需要确保自己不断进步。
确保你能继续下去的最好也是最著名的方法之一是将你的结果与随机预测算法进行比较。
不管怎样,如果一切都失败了,你可以写一篇 10 分的文章。
作者是数据科学家 Check Point 软件技术有限公司 作者是Yuri Rapoport和Raphael Fettaya在 Avi Shua 的帮助下,以及Louis guth Mann。
带领你的老板踏上数据之旅的 10 种方式
Photo credit: Pexels
“人们听到的是统计,感受的却是故事。”福布斯 2016 年 3 月
“用你的数据讲述一个令人信服的故事有助于你有效地表达你的观点。”信息周刊,2016 年 5 月
我们的大脑喜欢好故事,你的老板也不例外。J.K .罗琳曾经写道,“我们最爱的故事确实永远活在我们心中”。这同样适用于数据。但是什么是数据故事呢?根据 LeAnna Kent 的说法, Elder Research 的数据科学家,“数据故事讲述将数据可视化与引导式叙述结合在一起。它将数据和图表与单词配对。它不仅描述了图表中可以看到的内容,还讲述了一个故事来引导观众完成分析过程。
作为数据科学家,我们需要能够施加影响,我们有分析和见解,可以发现机会并指导管理层的行动,但如果我们不能激励企业接受,我们强大的机器学习算法最终将在货架上积灰。
数据可视化是数据分析的核心,它以图片或图形格式呈现数据,使业务用户能够直观地使用信息,无需深厚的技术专业知识。
叙述是关键,它有助于向你的观众解释数据中发生了什么,以及为什么某个特定的见解很重要。叙述减少了歧义,将数据与背景联系起来。
因此,在这篇文章中,我们将探索结合可视化和叙述流的数据故事,并希望我们能够说服我们的老板根据我们的见解采取行动。我们开始吧!
- 可视化 :一起购买的产品
Source: Tableau public
叙述 :我司客户频繁一起购买上述产品。本周末我们将清仓大甩卖办公设备。让我们重新安排我们的促销方案,把纸张、活页夹产品和办公设备放在一起展示。
- 可视化 :销售和利润
Source: Tableau public
叙述 :我们应该停止给这个客户大折扣。让我们找到一个既能提供折扣又能赚钱的解决方案。
- 可视化 :销售预测
Source: Tableau public
叙述 :根据我们过去和现在的销售情况以及季节规律,我们可以这样预测 2016 年的销售情况。该模型确定 2016 年销售额有 95%的可能性在阴影区域内。如您所见,二月份通常是消费者和企业产品的淡季。我们要不要为这个月策划一次促销活动?
- 可视化 :利润和利润比例
Source: Tableau public
叙述 :宾夕法尼亚州的利润率下降,原因是机器的利润率为-134%。这需要立即解决。
- 可视化 :员工流动率
Source: R-bloggers
叙述 :销售代表的离职率最高,约为 40%,其次是实验室技术人员、人力资源、销售主管和研究科学家。值得调查的是,哪些本地化问题可能会导致组织内这些团队的高人员流动率。
- 可视化 :成长加班
Source: Slideshare
叙述 :协作和分析解决方案的增长速度超过了 ERP/CRM 和基础设施。他们可能是下一笔投资的好目标。
- 可视化 :客户流失
Source: DataScience+
另一方面,月租费低、合同期长、有在线安全服务、有家属或伙伴、用信用卡或银行转账付款的客户的流失率远低于平均水平。让我们开始制定一个防止客户流失的计划。
- 可视化 :无利可图的日子
Source: Tableau public
叙述 :我们无利可图的日子更容易发生在一年的前几个月(1 月到 3 月)。让我们想办法在这几个月向每位客户追加销售,让我们盈利。
- 可视化 :销售目标
Source: Power BI
叙述 :现在是 11 月,我们不太可能达到年度销售目标,尤其是在硬件/软件组件方面。让我们找出问题所在。
- 可视化 :执行摘要
Source: Big Book of Dashboards
叙述 :消费销售领先步伐 5%;这可能是由我们在多伦多新开的商店推动的。由于两名销售代表辞职,企业销售远远落后于预期。商品销售落后于预期 5%;考虑尽快更换两名销售代表,并将广告预算重新分配给商品,这样我们就可以在年底实现收入目标。
摘要
正如您所看到的,讲述数据故事是一项艰巨的工作,因为大多数时候我们并没有处理“令人信服的”数据。我们要么处理产品销售数据,要么处理消费者(或员工)行为数据。我们必须非常有创意,把我们的数据变成美丽的、有说服力的故事。让你的信息穿过所有混乱的最好方法是合并这两种强大的交流方式——数据可视化和叙述。
正如 e .布伦德尔在他的书《特写写作的艺术和技巧》中所说
“我们应该既是故事的讲述者,也是事实的提供者。当我们没有履行这一责任时,我们就不会被阅读。”
请记住,数据不会激励人,故事会。我们需要用一个能激发情感、激励行动的故事来概括我们的愿景。
最后,如果你不想被质疑你对公司的价值,告诉他们你的故事。