8849是什么牌手机(TowardsDataScience 博客中文翻译 2019(七十六))TowardsDataScience 博客中文翻译 2019(七十六)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
原文:https://towardsdatascience.com/be-yourself-the-data-scientists-you-see-in-public-are-not-representative-9de29f3316bf?source=collection_archive———32———————–
Photo: Randy Au
嗨,是或想成为数据科学家的人!
想想你崇拜的任何一位数据科学家。他们是一家还是多家创业公司和基金会的创始人?他们有没有高级参谋总长之类的头衔和学位,FAANG 的博士学位?他们有上百万的推特粉丝和最好的帖子吗?他们写博客/时事通讯/写书的速度比你读的还快吗?他们的 Github 图表比你桌上的塑料植物更环保吗?他们的奖金比你的年薪还多吗?
你是不是看着自己,只是对自己坐的地方和他们“那边”的差距无语?我有重要的事情要对你说。
你不必和那些人一样。一点也不。他们不正常。在数据科学领域工作几乎不需要那么多。
虽然这些人绝对是令人敬畏的,有时可以成为灵感,但他们也站在运气、机会和生存偏见的不可知交叉点上。名声从定义上来说是罕见的。如果一群数据科学家像他们一样,哪怕只是一点点,他们也不会再引人注目了。我们会有不同的英雄。
作为数据科学家,我们应该是理解采样和隐藏在数据集中的隐藏偏见的专家。我们要做的就是拨开谷壳,获取知识的美味。但是由于人类的本性,把这种想法转向内心是非常困难的。
绝大多数从事数据工作的人并不是一直生活和呼吸着这些东西。他们有家庭要照顾,有非数据爱好要享受,有朋友要一起玩。他们不太喜欢编程,以至于在家里为了好玩而编程。他们不会强制跟踪 arXiv 阅读最新的机器学习论文。他们不会去巡回演讲,也不会经常去参加聚会。
但是,尽管没有做这些事情,这些人将为他们的组织提供有用的见解,设计健壮的系统,进行实验,并做重要的工作。只是悄悄地,不为世人所知。即使是独角兽也不会同时做所有这些事情!
就我自己而言,我半定期地写作,因为把事情写下来是一种宣泄。但我把大部分非工作时间都花在了做一顿美味的晚餐、修理我在家里打碎的东西和照顾孩子上。工作留在办公室,我的副业没有一个和数据有关。
虽然我们经常听说冒名顶替综合症,我们钦佩的人如何怀疑他们是否值得他们的钦佩,但我们很少听到在你认为自己是这个伟大社区的一部分之前,酒吧在哪里。
我在这里要说的是,门槛是低的,也应该是低的。如果你处理数据,你正在做数据科学范围内的事情。“数据科学家”的头衔仅仅是给那些符合某个招聘经理指定的任意一套技能和经验的人。变化太大,很不明智。只是噪音。
不要被所有你钦佩的人吓倒。他们高于你我这样的人,正是因为他们是令人敬畏的独角兽。
此外,看门的混蛋可以滚开。
祝大家节日愉快。
原文:https://towardsdatascience.com/beat-cache-invalidation-in-asp-net-core-using-kafka-and-debezium-65cd1d80554d?source=collection_archive———7———————–
在构建 web 应用程序时,我们大部分时间使用缓存来存储(昂贵的)数据库查询的结果。一段时间后,由于我们的底层数据库状态发生了变化,我们希望删除或替换缓存条目。一个被称为缓存失效的过程。问题是我们什么时候必须移除或替换缓存条目?答案是每当底层数据库记录发生变化时。但是数据可能会被我们无法控制的过程所改变。
如果我们可以订阅数据库记录发生的任何更改事件(插入、更新和删除),那么我们就可以成功地实时使相关的缓存条目无效。好消息是大多数数据库都会发布它们的插入、更新和移除事件。这项功能称为变更数据捕获(CDC)。
在本文中,我想向您展示我们如何使用 CDC 来订阅任何更改 MySQL 数据库记录的事件,并将每个事件作为单独的消息发布给 Apache Kafka。 Debezium 是一个让这一切成为可能的平台。然后,我们使用这些事件在 ASP.NET 核心中构建内存缓存。我们将看到如何基于我们的实时缓存构建我们的 REST API。
这类似于复制在数据库中的工作方式。在复制中,辅助副本订阅主副本上的任何事务(更改事件),并将该事务应用于自己的数据库记录,这样,辅助数据库状态最终将等同于主数据库状态。如图所示,我们将 Kafka 集群订阅为数据库的副本,并处理更改事件以构建我们的缓存:
这种方法不仅解决了缓存失效,还解决了其他问题,如竞争条件和缓存热启动,正如 Martin Kleppmann 在他的文章Turning the database inside-out中所描述的。
这篇文章的源代码可以在 GitHub 中找到。
- 。网络核心 2.2
- docker 和 docker-撰写
我们将使用 Docker 设置我们的 Apache Kafka 集群、MySQL 数据库和 Debezium 连接器(我们将很快讨论它)。首先,用以下内容创建一个文件:
my.cnf 文件启用 MySQL 的 CDC 特性。现在启动所有 docker 服务:
打开同一路径中的另一个终端,连接到 MySQL 容器并运行 MySQL CLI:
现在我们想在 MySQL 中创建一个数据库。运行下面的脚本来创建一个名为的数据库,一个名为的表,并在表中插入一个简单的记录:
现在,我们希望将 products 表中发生的所有更改都转移到 Kafka。为此,我们必须创建一个连接器。连接器是一个应用程序,负责将数据从数据库(或任何其他存储系统)移动到 Kafka 集群(反之亦然)。如果你不熟悉 Kafka connector,你可以阅读合流文档。这里我们想将 MySQL 变更事件转移到 Apache Kafka 集群。Debezium 是一个 Kafka 连接器,可以从 MySQL(和其他一些数据库)中读取所有变更事件,并将它们发布到 Kafka:
Debezium 公开了一个 REST API 来创建连接器。因此,要创建一个 Debezium 连接器,打开另一个终端并运行下面的脚本(大部分配置是不言自明的,但要了解更多信息,请阅读 Debezium MySQL 教程):
如果您收到,您的连接器已经成功创建。您还可以检查连接器的状态:
字段中的值表示您的连接器正在工作。现在让我们检查一下,任何数据库更改都将被同步到 Kafka。首先,连接到 Kafka 容器:
并查看主题列表:
主题存储表的变更事件。我们可以使用下面的脚本读取该主题中的消息(消息键由分隔):
要检查更改是否会(接近)实时同步,请在 MySQL 容器中添加另一条记录:
更改将立即显示在用户终端上:
更新“蓝帽子”记录:
发布更新事件:
删除 id 为 1 的记录:
具有空值的消息将被添加到主题:
空值表示记录被删除。让我们添加一个名为的列:
并更新产品记录:
您将会看到,即使是模式更改也会反映在消息中:
注意,一些 RDBMSs 如 SQL Server 不会自动反映 CDC 数据中的模式变化。但是 MySQL CDC 支持模式变更。
主题包含产品表的每次更改。为了构建我们的缓存,我们希望保留每条记录的最新值。为此,我们可以在名为的单独主题中保存每个产品 id 的最新值。我们还创建了一个名为缓存构建器的项目,它将读取主题中的每条消息,并将它们生成到 主题中。主题是一个压缩的主题,这意味着每个键(在本例中为产品 id)将只包含一条消息。你可以在 Cloudurable 和我最近的文章中阅读更多关于压缩主题的内容。
通过在 Kafka 容器中运行以下脚本,在 Kafka 中创建一个压缩主题:
为了从我们的应用程序连接到 Kafka broker,我们还需要将主机名添加到文件中(只需添加粗体行):
创建一个解决方案和 CacheBuilder 项目(你可以在 GitHub 中看到完整的代码):
并安装和 NuGet 包:
这里您可以看到 Program.cs 代码:
这是 ProductKey 类:
在 Program.cs 中,我们只是从主题中读取消息,提取产品 id 字段并创建另一条消息,然后将其发布到主题。现在运行 CacheBuilder 项目(在单独的终端中):
您可以在 Kafka 容器中查看该主题:
我们创建一个 Web API 项目,它将公开简单的 REST API 来获取产品的详细信息(从缓存中检索)。此外,该项目负责消费来自主题的缓存条目,并将它们存储在内存缓存中。运行以下脚本创建项目:
安装和包:
启用类中的内存缓存:
这允许我们使用 ,它用于在 ASP.NET 内核的内存中存储和检索缓存条目。为了填充这个缓存,我们需要一个类,负责消费来自主题的消息并更新我们的内存缓存:
还有类:
注意,我们有一个负责更新缓存的 Run 方法。该方法接收一个参数,该参数用于返回关于该主题的最后一条消息。如果它有 值并且我们在主题/分区的末尾,我们从方法返回。这在启动过程中非常有用,因为我们希望在处理任何 REST API 请求之前预热缓存。我们现在在应用程序初始化中使用:
如上所示,我们调用了两次方法。首先用于预热缓存,其次用于运行后台作业以连续读取主题并更新内存缓存。
最后,这是我们的控制器,它直接服务于来自缓存的请求:
现在运行 API 项目:
并检查您的 API:
让我们更改 MySQL 容器中 id 为 2 的产品的价格:
并再次请求您的 API:
如你所见,任何变化都会立即反映到我们的缓存中!
使用 CDC,我们可以将数据库的变化近乎实时地反映到 Kafka 中。然后,我们可以通过消费卡夫卡的信息来创建内存缓存。现在我想指出这种方法的一些优点和缺点。
优点:
- 减轻实现缓存中的 3 个问题:缓存失效、竞争条件和热启动性能。
- 将数据库更改实时同步到缓存。
- 由于顺序 IO,缓存预热速度更快(从 Kafka 主题中读取消息)。
缺点:
- 更复杂:您需要实现缓存构建器,使用 Debezium 连接器,为数据库启用 CDC,并从 Kafka 集群读取事件。
- 需要监控 Kafka,连接器和缓存生成器。
- 需要更多的知识:新开发人员必须学习更多的框架。
https://vlamihalcea . com/how-to-extract-change-data-events-from-MySQL-to-Kafka-using-debezium/
https://github . com/confluent Inc/demo-scene/blob/master/ksql-workshop/ksql-workshop . adoc
https://Martin . kleppmann . com/2015/03/04/turning-the-database-inside-out . https
原文:https://towardsdatascience.com/beating-state-of-the-art-by-tuning-baselines-74ec6ad2cd59?source=collection_archive———11———————–
你如何知道一个新的机器学习模型是否是对以前模型的改进?一种方法是将其与为相同任务开发的基线模型进行比较。但这回避了一个问题:你如何知道基线本身是否好?由 Rendle,Zhang & Koren 撰写的一份新的预印本“关于评估基线的难度:关于推荐系统的研究”表明,衡量一个基线模型对一个具体问题的效果并不像它初看起来那样简单。事实上,的作者仅仅通过调整基线并将它们与简单的、众所周知的方法结合起来,就能够在 Movielens 10M 基准 上击败当前最先进的的推荐。
Blue x’s are the results reported by authors for their newly-proposed method, black/grey triangles are the baselines those authors run… and red are the tuned baselines. Down is better and, as you can see, after additional turning (as outlined in the paper) the tuned baselines are the most down (i.e. best performing).
我们先退一步。我们目前如何评估模型?
如果你曾经参加过 Kaggle 竞赛,你可能已经知道它们是如何工作的:你被给予训练数据来建立一个模型,为一个特定的指标进行优化。然后,根据不同的数据集对您的模型以及其他所有人的模型进行评估,并根据目标指标进行排名。提交结束后,每个人的模型都会在第三个看不见的数据集上排名,表现最好的模型胜出!(当然,前提是他们遵守了特定比赛的规则。)
然而,对于机器学习的学术研究来说,事情有点不同。一般来说,研究人员使用特定任务的数据为该任务建立新的模型。一些例子:
- 使用 Netflix 奖项数据集的推荐系统
- 使用微软 COCO 数据集进行对象分割
- 使用 TIMIT 语料库进行语音识别
- 自然语言理解使用胶水基准
然后,他们将算法的性能与在同一数据集上运行的基线进行比较。如果这是一项已经存在一段时间的任务,通常会将你的系统与另一篇论文中报告的结果进行比较,但对于较新的任务,研究人员通常自己运行基线。
一个基准是一个包括数据集和评估性能的方法的任务。一个基线是一个众所周知的算法,可以应用于基准问题。
在研究中没有“获胜”的模式,但是提出一种新方法,然后证明它比以前建立的方法有所改进的论文往往会被发表。(对于研究人员来说,雇佣和晋升是基于发表论文的数量和质量,所以让你的论文发表是一件好事!)
这两个社区之间最大的不同可能是研究人员面临着关注新型模型的压力。如果一个老型号在 Kaggle 比赛中真的有效,竞争者没有理由不使用它…但是如果主要发现是“我们已经做了十年的东西实际上仍然非常好”,就很难让论文发表。
进行实验是困难的,需要大量的实验努力才能获得可靠的结果。(伦德尔等人,第 9 页)
重申一下:运行机器学习实验很难。Rendle 和合著者指出了调优可能出错的两个地方:
-
在调整超参数时,您很容易错过最佳时机。您的搜索空间的边界可能太靠近,或者在一个方向上移动得太远。您可能没有使用正确的搜索网格。你在小模型上得到的结果实际上可能不会放大。简而言之:很难很好地调优模型,而且很容易搞砸。
-
在预处理或学习过程中,你可能会遗漏一些小而重要的步骤。你打乱了你的训练数据吗?做 z 变换?你使用提前停车吗?所有这些选择都会影响你的模型结果。尤其是如果你试图复制别人的结果,这些步骤可能很难做对。(特别是如果它们没有被报告,并且原作者没有发布它们的代码!)
即使您做了所有您应该做的事情,并且有一个非常坚实的基线,基线算法可能会在额外的调整下表现得更好——特别是由非常熟悉该方法并且知道所有提示和技巧的人来调整。了解什么最适合特定的模式需要大量的试验和错误;这也是调整基线如此困难的部分原因。即使一篇论文的作者真的尽了最大努力来调整基线,有更多经验或稍微不同的方法的人可能会得到更好的结果。(有点像 Kaggle 比赛;与只使用过几次的人相比,非常熟悉 XGBoost 模型调优的人可能会得到更好的结果。)
而且,虽然在 Kaggle 式的竞争中有投入大量时间调优模型的动机,包括您的基线(如果它表现良好,您使用什么工具并不重要!),研究场所一般不会奖励花费大量时间调基线。事实上,如果调整显示基线优于你想出的方法,这实际上可能会让更难发表一篇描述你的新模型的论文。这类似于“文件抽屉问题”,研究人员不太可能报告负面结果。
Rendle 等人提出了两件事可以在这里有所帮助:标准化基准和激励机器学习社区投入时间调整这些基准。
“重新发明轮子”意味着重新做已经做过的工作。如果某个特定任务有一个已经很好调整过的既定基准,那么你应该与那个基准进行比较!(额外的好处是,如果您正在进行一项既定的任务,并且可以使用报告的结果而不是重新运行它们,那么您可以节省时间和计算。🤑)
这个有点棘手:要改变一个已建立的社区的激励结构或价值体系极其困难。作者指出,机器学习竞赛,无论是在像 Kaggle 这样的平台上,还是在研究社区内组织,都是这样做的一种方式。我还要补充一点,如果你评论机器学习的论文,既要考虑新颖性(这种方法是新的吗?)和效用(这篇论文对整个社区有好处吗?)写评论的时候。
仅仅因为最近提出了一种建模技术,并不意味着它一定会优于一种更老的方法(即使论文中的结果表明它可以)。调整模型需要时间和专业知识,但通过仔细调整,已建立的基线可以表现得非常好,甚至超过最先进的水平。依靠具有良好调整的基线的标准化基准可以帮助减少重复工作,还可以获得更可靠的结果。而且,如果您只是在为一个特定的项目寻找最佳方法,那么从更好理解的模型开始可能会更好。
如果你有兴趣阅读整篇文章,特别是关于不同推荐系统的基线调整的细节,你可以在 Arxiv 上查看。
原文:https://towardsdatascience.com/beating-the-dealer-with-simple-statistics-71b5e3701638?source=collection_archive———10———————–
Photo by Jaros?aw Kwocza?a on Unsplash
拉克杰克是在赌场玩的最简单的游戏之一。也是最容易学的游戏之一。目标很简单;在不超过的情况下,尽可能接近 21 的值。你要么打败庄家,要么输给庄家,要么和庄家打成平手。21 点的结果非常简单。然而,这些结果的权重完全取决于你,因为你可能在一手牌中输掉很多钱。没有人想输,而在 21 点中输钱会有多痛取决于你的赌注大小。为了提高赌场或赌场的赔率,21 点玩家开发了许多算牌策略来降低他们失败的几率。
算牌一开始可能显得很难,但实际上相当简单。算牌的概念包括给一副牌中的每张牌赋值,例如 +1 、 -1 或 0 。然后,将它们加在一起,这个总值就变成了计数。根据计数是高还是低,算牌者使用这个计数来确定是击中还是停留。存在许多不同的算牌策略,这些策略为每张牌实现不同的值。例如,一种策略可能会将 Ace 计为 -1 ,而另一种策略会将其计为 0 。除了卡的价值之外,这些策略之间还有很多不同之处,但我们无法涵盖所有这些。需要注意的是,这些算牌策略最多给玩家 0.5%的优势。对于 21 点游戏来说,这就是全部。
那么,如果我们想在我们的 21 点游戏中实施算牌策略呢?我们应该选择哪一个?嗯,我们可以做的一个选择是自己实施每个策略,去玩几次 21 点,然后记录结果。这种选择可能非常耗时,并且在实际显示策略的可能性和有效性时不准确。另一种选择可以是编码一个 21 点游戏,模拟该游戏,然后在期望的模拟次数后记录结果。为了确定最有效的算牌策略,我们将展示这个选项。
在这里注册一个中级会员,可以无限制地访问和支持像我这样的内容!在你的支持下,我赚了一小部分会费。谢谢!
让我们开始模拟 21 点的旅程,用 Python 编写全部代码。为了简洁起见,我们不会仔细检查每一行代码,但是代码的 Github 将在本文末尾提供。很有可能以前有人做过类似的事情,甚至可能做得更好,但不管怎样,让我们试一试。
首先,为了模拟一个 21 点游戏,我们需要编写一个 21 点游戏代码,其中包含所有必要的规则和规定。为了简单起见,我们将省略掉诸如分割、加倍 向下、投降等选项。让我们把玩家选项限制在击中或停留。此外,由于我们衡量的是赢与输,我们可以消除下注的需要。然而,在普通的 21 点游戏中,知道下注的大小是很重要的。
让我们首先构建几个函数来帮助我们的 21 点游戏正常运行:
Source: https://gist.github.com/marcosan93/c0d0b41748bb515d7110cd3efccc165f
每个功能都有一个运行游戏的重要目的。为了模拟一副扑克牌的创建,我们创建了函数,它结合了来“洗牌”我们创建的牌列表。发一张牌在中处理,它通过使用方法添加一张新牌,以模仿从一副牌中发一张牌。在玩家或庄家超过 21 时,功能会将 ace 的值从 11 重新分配到 1。这些可能是上面提到的最值得注意的功能,但这并不意味着游戏可以在没有其他功能的情况下运行。
Source: https://gist.github.com/marcosan93/7fc6f3c3a4de4ccc36d4405a0df8618c
如果玩家决定留在,此功能将向庄家发牌。这个功能遵循每个 21 点庄家的规则。它会一直交易,直到庄家达到 17 到 21 之间的值,或者直到庄家破产。它最终将庄家的手牌与玩家的手牌进行比较,以确定谁赢了。
接下来,为了在游戏中算牌,我们创建了一个熊猫数据框架,其中包含不同的算牌策略以及每张牌的具体值:
Source: https://gist.github.com/marcosan93/d2723710932b9d52b6c0dceda2a8dd96
在这段代码中,为了创建纸牌计数值的数据帧,我们导出了数据帧的一部分供以后使用。确保这个 pickle 文件与 21 点代码在同一个文件夹中,以便它能够正常运行。
然后,我们添加了算牌功能,以便在游戏运行时跟踪的计数:
Source: https://gist.github.com/marcosan93/ad0cb4b62f27749d06ec83d267e7fb31
这些函数跟踪整个游戏中每一轮 21 点的计数。跟踪运行计数,跟踪真实计数,这是玩家用来决定是否击中或停留。
现在我们已经准备好了所有的功能,我们可以运行 21 点。代码将允许玩家输入,所以我们可以尽情地玩游戏。请随意在您自己的终端或 IDE 中测试 21 点游戏。
这个游戏有两个版本:
- 二十一点不算牌
- 带算牌的二十一点
现在我们已经有了一个 21 点游戏的代码并准备好了,我们终于可以开始用不同的算牌策略模拟 21 点游戏 1000 次了。通过模拟各种不同的策略,我们可以缩小首选的算牌方法,以尽可能最好的方式使我们受益。然而,我们必须降低对每项战略的期望。我们重申,据报道,每个策略每轮都给玩家 0.5%的优势。不要期望每场比赛都赢 60%或更多。
现在让我们开始模拟。为了用我们的代码模拟 21 点游戏,我们将不得不修改我们以前的 21 点代码,以弥补玩家输入的不足。为了弥补这一点,我们将以条件的形式输入一些预编程的决策,这些决策将基于计数和其他一些类似于庄家的基本规则来做出决策。
Source: https://gist.github.com/marcosan93/550f4643980a0b696f2cf4bf5477f770
功能负责在击中或停留之间进行选择。这个函数可能需要一些调整,以更好地改善以后的结果。有了这个处理,我们可以继续模拟游戏。我们通过将玩 21 点游戏的函数输入一个循环来开始模拟,该循环将遍历一系列策略,然后用每种策略玩 1000 次游戏。我们记录了每场比赛的最后 10 轮,以捕捉每种策略的有效性,因为这些回合将有一个体面的计数,从中可以做出决定。
Source: https://gist.github.com/marcosan93/28f84b9ba591b78e95ee08fcb8a5e8d8
最后,我们模拟了超过 1000 场 21 点游戏,每一种不同的策略都列在熊猫数据框中。我们打乱了要模拟的策略的顺序,以进一步增加随机性。此外,我们在赢的游戏中加入了和棋,因为在 21 点中和棋不会导致只和庄家对弈时输钱。现在,我们只需要把模拟结果用图表表示出来。这可以通过使用 Matplotlib 以线形图格式绘制每个策略的结果来完成。
Source: https://gist.github.com/marcosan93/7185c6549128fc329337d027f4a3e16c
运行这段代码将得到下面的图形:
Probability results for each strategy
瞧啊。看起来大多数算牌策略都有相似的结果,但是它们似乎都比没有策略要好。我们为什么不再次进行模拟以确保:
看起来,无论在模拟中首先运行的是什么策略,在开始时都会产生非常不同的值。让我们再运行一次,试着平衡结果:
因此,我们的观察是正确的,我们假设无论哪种策略首先运行都会导致不稳定的不同值。但是每种策略的总体结果都非常相似。
如果您想改善或改变结果,那么您可能需要改变函数中的条件逻辑。
正如前面的图表所示,每种策略都能为经销商提供可观的优势。实施这些策略中的任何一个似乎都足以让你比赌场或赌场更有优势。在没有任何策略的情况下,也可以选择坚持一套严格的规则。这似乎也提供了一个体面的成功百分比,只要该战略是遵循没有偏差。
应该注意的是,我们不赞成赌博作为一种赚钱的方法。但是,算牌可以给你带来优势,你选择坚持哪种策略真的无关紧要。但是,要知道这些模拟是用基本的击中或停留决策完成的,其中一些策略实际上考虑了下注大小和其他因素。另外,请知道这些模拟和结果是用相对简单的 Python 方法和工具制作的。总而言之,祝那些决定使用这些策略的人好运!
在 Twitter 上关注我:@Marco_Santos
[## Marcos an 93/21 点 _ 模拟器
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/marcosan93/Blackjack_Simulator)
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
原文:https://towardsdatascience.com/beating-the-s-p500-using-machine-learning-c5d2f5a19211?source=collection_archive———6———————–
The “Fearless Girl” statue on Wall Street. Photo by Robert Bye on Unsplash.
标准普尔 500 指数是最受关注的市场指数之一,通常被用作整个美国股票市场的基准。虽然人们可以考虑投资一只复制标准普尔 500 指数的被动型基金,但许多人会转向基金经理,更喜欢投资主动型基金。不幸的是,越来越多的研究和数据表明,“跑赢市场”(跑赢基准)非常困难。你可以去这里和这里阅读更多关于这个主题的内容,伯顿·g·马尔基尔的这本优秀的书也值得推荐。这些研究的结论之一是,在截至 2018 年 12 月的 15 年期间,美国积极管理的股票基金中有 91.62 % 跑输了标准普尔 500 指数。
在这篇文章中,提出了一种基于机器学习的系统方法,它能够大大超过同期的标准普尔 500。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
用 Python 编写的机器学习算法旨在预测 S&P 1500 指数中哪些公司的月度表现可能优于标准普尔 500 指数。为此,实施了基于随机森林回归的算法,将 S&P 1500 指数所有成分的财务比率作为输入。本项目中使用了以下工作流程:
- 数据采集和准备
- 数据清理
- 特征选择
- 训练和回溯测试随机森林回归器
*请注意,本项目中使用的数据集来自专有来源(标准普尔和彭博),因此无法公布。因此,我们将跳过本文中的步骤 1。那些通过所需订阅访问数据集的人可以参考托管在以下 Github 项目上的完整笔记本: SP1500StockPicker 。
随机森林方法基于多个决策树。单个决策树是通过自顶向下的方法构建的,其中数据集遵循基于变量值的一系列布尔分裂,这些布尔分裂在每个节点产生最精确的分离。每个唯一的决策树都是在带有替换的训练集的不同样本上训练的(意味着样本被替换到更大的数据集中)。随机森林回归将多个决策树平均在一起以发出预测。这篇文章不会太深入这个技术的细节,但是在这些由普拉尚特古普塔和乔治赛夫撰写的优秀文章中可以找到更多关于随机森林方法的信息。
An example of a tree with 3 different splits.
以下代码是在 Jupyter 笔记本上用 Python 写的。JupyterHub 环境用于在计算服务器上托管代码。大多数数据操作都是使用 Pandas 和 NumPy 库完成的。机器学习算法基于广泛的 Scikit-learn 库。对于代码某些部分的并行化,使用了 Python 的多重处理包。最后,特征选择过程基于特征选择器包。
Python 的优点之一是大量的包和库是开源的,任何人都可以使用。利用现有工具的能力来创建创新的解决方案,可以快速高效地解决问题。
起始数据集由 86 个变量组成。下图简要介绍了前 5 个条目:
Head of the database.
下表显示了一些最重要的变量。其他变量都在 Github repo 的“variables.txt”文件中定义。
使用下面的 pandas 命令,我们可以看到每个变量有多少个缺失条目:
我们可以看到一些变量有大量的缺失条目,知道数据帧的总长度是 413 012 个条目。为了解决这个问题,采取了以下步骤来清理数据:
- 遗漏股票月度回报的行被删除,因为我们不能交易遗漏的回报。
- 超过 50%的行为空的变量被删除。
- 对于缺失的财务比率,我们使用来自 Scikit-learn 的 SimpleImputer 包,用整个数据库的变量平均值替换缺失值。这种方法非常懒惰,会给数据增加建模错误。更合适的方法是使用每种特定股票 n 个月的平均值。尽管如此,还是使用了惰性方法,下面的代码总结了这里列举的 3 个步骤。
采取了辅助步骤来完成清理过程,可以在本文结尾插入的完整笔记本中查找,或者在我的 Github 上托管。
使用了来自 WillKoehrsen 的包特征选择器。你可以在这里阅读他的文章,全面了解它的功能。
基本上,特征选择算法将有助于识别无意义的(低重要性)和共线的特征,以便从不必要的数据变量中修剪起始数据集。移除那些共线变量将减少来自没有贡献的条目的数据集,从而加快整体机器学习过程。当试图识别变量之间的非线性关系时,这种特征选择也将有助于提高算法的泛化能力。
使用 feature_selector 包识别高度相关的要素并打印出相关矩阵非常简单:
Correlation matrix for the different variables.
从上面的图中,我们可以看到一些特征具有高相关性(更红),并且通过该函数识别了相关性高于 0.975 的 5 个特征。
接下来,我们想要识别重要性为零的特征。这些特征将不用于分割决策树的任何节点,因此可以被移除以减少训练时间。feature_selector 包从 LightGBM 库中实现了一个渐变增强机器。该函数将对 10 次训练运行的特征重要性进行平均,以减少方差。
低重要性特征也可以用 feature_selector 包来标识。该方法使用来自零重要性特征选择的结果来识别不需要获得 99%的总重要性的特征。
现在,我们可以从上述 3 个步骤中移除所有选定的特征,以获得最终的数据框:
本节介绍的机器学习算法将预测整个月最有可能跑赢 S&P500 的股票。预测将在指定月份的第一天进行。我们还希望能够在不同时期对算法进行回溯测试,以验证模型的性能。我们将定义一个名为“rfstockpicker_backtest”的函数,它将包含以下条目:
该函数的第一部分获取决策日期并标识前一个月。然后,它会创建一个范围从上个月到 7 年前的训练集。选择这个持续时间是因为我们知道过去 33 个经济周期的平均持续时间是 56 个月。目前的扩张周期已经持续了 10 年。7 年的时间让我们可以为我们的每个训练集获得大约一个完整的经济周期。测试集将是我们希望发出预测的月份。我们将使用一个基本的迭代,一个月接一个月地回溯,以便进行几个月的回溯测试。在每次迭代中实例化我们的变量可以确保没有信息及时传播回来(详细信息请参见完整代码)。
在删除用于训练和测试的非必要数据后,该函数从 sklearn 库中实例化 aRandomForestRegressor 对象,并使用作为输入参数提供的树的数量(n_estimators)和可用进程(n_jobs)对其进行初始化。然后,该函数在训练集上训练算法,并在测试月对 SP1500 的每只股票发出预测。
函数的最后一部分返回各种要素的重要性,以供进一步分析。
例如,可以测试 2018 年 12 月的函数:
对“rfstockpicker_backtest”函数的调用将返回以下信息:
例如,假设每个月,决定买入跑赢指数几率最高的前 10 只股票。可以使用以下命令显示这些内容:
The 10 stocks with the highest probability of beating the SP500 for December 2018.
用相等的权重对这些回报率进行平均(算术平均)得出 2018 年 12 月的回报率为 2.09% ,相比之下,同期的 SP500 回报率为1.79%。
可以通过查看特征重要性来改进该模型:
虽然在该图中,许多特征被压缩在 x 轴上,但是仍然可以看出其中一些特征具有非常低的重要性。重要性低于 0.02 的要素可以使用以下命令移除:
这个新数据库允许我们增加 2018 年 12 月的月度回报率,回报率为 **3.57%,**提高了 +1.48%。
现在让我们从 2003 年 12 月到 2018 年 12 月,对我们的模型进行 15 年的回溯测试:
主迭代循环将于 2018 年 12 月开始,并在 12*15 或 180 个月的时间内回溯 1 个月,以覆盖整个回溯测试期。在 180 个月的测试期内,我们的模型获得了**+1421%**的复合回报,相比之下,实际 SP500 指数的复合回报为 +261 % 。因此,该模型在 15 年期间产生了+1160%的超额回报。
Growth of 1$ over the 15 year period.
为了简化项目,提出了三个主要假设:
- 前一个月买入的每只股票都被卖出,每个月测试 10 只新股票。因此,有可能一只股票在月末被卖出,然后第二天又被买入。
- 没有考虑交易成本,这将影响模型的复合回报。在测试的每个月中,有 10 只股票被买入,10 只股票被卖出。
- 没有考虑股息,这也将影响模型的复合回报。
代码中还可以实现许多改进。其他机器学习技术和神经网络将在以后的文章中探讨。敬请期待!
如果你有任何意见或问题,欢迎写在下面!我会尽我所能回答他们。这篇文章的代码可以从项目的 Github Repo 的 Jupyter 笔记本中获得。
感谢您的宝贵时间!
原文:https://towardsdatascience.com/beauty-of-kargers-algorithm-6de7e923874a?source=collection_archive———13———————–
你准备好分割切片了吗?让我们从网络开始。我们喜欢密集的网络,否则,即使只有一条边或一条线断开,网络的很大一部分也可能会瘫痪——这绝对不是我们想要的!网络中通常存在集群,即不均匀分布的段。当有效地处理这些片段或“簇”的分离时,我们寻找它们之间的边,使得边的数量最小。
Polygon Mesh
我们可以将同样的论点应用于其他领域,例如“图像分割”。如果你想把一幅图像分割成几个片段,最简单的方法是用低相似度,也就是最少的切割次数来断开链接。想象一个多边形网格。多边形网格是组成 3D 对象的顶点、边和面T3 的集合。断开低相似度的图片链接可以给你不同的图片。
还想到地下线路!这么多节点(站)和边(铁路)!如果你想把地铁系统一分为二,最少要断开多少条线路?
如你所见,有许多现实生活中的小问题。我们如何处理它们?传统算法是“最大流最小割”。它是确定性的,这意味着当我们应用这个算法时,我们 100%的时间都得到正确的最小割!没有失败概率!缺点是 100%的保证是有代价的:非常慢。运行时间最多为 O(顶点数*边数的平方,因此时间复杂度大约为 n 倍。
有许多聪明的算法,它们的运行时间非常快,为 O(n ),但在我看来,没有一个算法,即使是最优秀的算法,设计得像 Karger 的算法一样优雅,它在一个图形问题中使用“随机采样”!!
如果您熟悉快速排序算法,那么您已经知道随机抽样在排序和搜索中的有效性。90 年代初的一名博士生 David Karger 利用图问题中的随机性设计了最小割情形的随机收缩算法。作为一种蒙特卡罗算法,Krager 算法提供了一种具有一定(尽管很小)概率的解决方案,比最大流最小割算法快得多。
[Picturing contraction of edges](http://tcs.nju.edu.cn/wiki/index.php/高级算法 _(Fall_2019)/Min-Cut_and_Max-Cut)
假设我们有一个无向图 G = (V,E)。为了以尽可能少的切割将连通图 G 切割成两个连通子图,算法基本上使用了边的收缩。要实现它,应该把边两边的两个顶点拉在一起。
我们用伪代码实现算法如下:
现在问题来了:成功的概率有多大?
在具有 n 个顶点的图中,Karger 算法的单次运行给出成功概率为 1 / (n 选择 2)且运行时间为 O(n)的结果。不坏,但一个人需要幸运地在第一次运行中找到最小切割边缘。
做多跑可以增加成功的概率。如果我们运行卡格的算法 n 次,我们没有得到最小割的失败概率是 1/e .一个常数!不取决于顶点数!
但是,如果我们运行 Karger 的算法 n ln (n) 次,这被视为最优值,那么 P(失败)< = 1/n , P(成功)>= 1–1/n,这意味着随着你得到越来越大的图,Karger 的算法成功的概率变得越来越好!所以,在一个有 50 个节点的图中,如果我们运行算法 10000 次左右,成功的概率是 98%!!
如此高的 98%的成功率是有代价的。运行时间是 n(顶点数)和 m(边数)的多项式,相当慢:O(n·m)。
稍加改动的版本,Karger-Stein 算法,成功概率是原算法的两倍!!
Karger 算法的 Python 代码如下:
顺便说一下,如果你想了解更多一点,我建议你观看斯坦福算法的 youtube 视频。
原文:https://towardsdatascience.com/become-a-data-science-expert-1b8dccd71526?source=collection_archive———33———————–
成为数据科学家的方法是通过实施自己选择的明确指导方针,让自己成为领导者。这些指导方针的良好基础如下。
Plan, build a strategy, prioritize.
专注于一个领域不仅能提高你的智力,还能让你在更广阔的数据科学领域有更广阔的视野。
你应该尝试从一个单一的领域到更广阔的领域来培养你的技能。从 Python 开始,进入 Django、R、Java,学习一些你舒适区之外的东西。这样,你也能更好地掌握日常使用的技巧。都是练出来的。
不要只是玩模型来适应机器学习社区使用的数字模型,你还应该建立在社区已经完成的基础上。
如果您正在寻找公式来为您领域的变量建模,如果您知道社区中所有可用的公式,任务将变得容易得多。
在这个领域,要么建立在现有的数据源上,要么建立自己的数据集。
建立在已经存在很长时间的数据上,而不是建立你自己的数据集,将为你的模型提供适当的反馈,这将有助于模型的公式化。
关注数据科学的核心优势就是围绕核心问题解决问题。数据科学为您提供了独特的机会,将您所学的知识应用到现实世界的用例问题中。通过利用现有的数据,你将能够验证你的新知识。
记录你的成功也是必须的,因为你会经历艰难的失败并从中学习。
记录下你做过的事情和学到的东西。
这将有助于您在需要时复制您的工作。
此外,数据科学主要是关于我们所学方法的迭代开发。编码,再迭代,再编码。
你需要验证你所有的方法至少 3 次。
通过记录您的成功和失败,我们将能够回顾您的工作,并将其置于数据科学家社区的背景中。
要想在行业中可信,你至少需要像其他人一样做一些事情。
如果你发现数据科学市场竞争过于激烈,那么通过专注于卓越来提高你的标准,在高薪数据科学市场中一路向上。
这样你就可以从中获得成功,这也将激励其他数据科学家进行创新。
数据科学是一个节奏非常快的行业,每一步都面临着许多不同的挑战。这使得你的生活很容易停滞或落后。
这是因为你必须不断学习才能跟上竞争。
保持较高的学习速度也是在下一个职位中保持竞争优势的必要条件。这会帮助你吸引更好的工作,提升你的品牌。
想在数据科学领域找份工作吗?看看我的另一篇文字或者查一下这个数据科学书籍和课程清单。
Data Science Job
最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。
原文:https://towardsdatascience.com/becoming-a-data-ninja-three-steps-da3e1f3dc2d9?source=collection_archive———41———————–
Photo by Markus Spiske on Unsplash
数据科学是发展最快、薪酬最高的非管理类职业之一。例如,由 Burning Glass、IBM 和商业高等教育论坛进行的 2017 年研究发现,根据前 20 大都市地区的数据,数据科学家和数据工程师的预计五年增长率为 39%。客观地说,【2010 年至 2018 年间的年就业增长率为 1.4%。
这也是竞争最激烈、门槛最低的职业之一。你还能在其他什么高薪和受欢迎的工作中参加低成本的编码训练营,积累具体的技能,以便第二天在工作中应用?而且,训练营也不缺!
数据科学是年轻专业人士最好的工作之一,因为它允许你实践与不同行业的价值创造直接相关的各种技能。例如,你不仅可以学习如何收集和分析数据,还可以应用结果来推动战略决策,从而更好地为客户服务。您还将学习如何将这些结果传达给营销人员、经理等。
数据科学是年轻专业人士最好的工作之一,因为它允许你实践与不同行业的价值创造直接相关的各种技能。
从事这些工作的人也比他们的同行有更高的满意度和参与度。利用盖洛普 伟大工作示范调查 的新数据,我用数字技能来衡量工作满意度。工作满意度是十个具体工作维度的函数,从薪酬、福利到职业发展;数字技能是根据我和不列颠哥伦比亚大学的合著者 Giovanni Gallipoli 之前的工作来衡量的。
下图证明了工作满意度和数字技能之间的紧密联系。当你深入挖掘时,你会发现这种积极的联系是由几个特定的维度驱动的:对薪酬的满意度、对工作时间的控制、职业发展以及改变你认为错误的事情的能力。最后一项工作特征很能说明问题。我们经常发现自己想要对系统进行改进,而不是坚持现状。数据科学通常会为您提供做出改变的工具!
您必须知道如何处理和清理任何形状或大小的数据。有时数据是非结构化的。有时它会丢失很多值。而且,有时它包含复杂形式的测量误差,会破坏预测和因果推断。
最后一种类型尤其难以规避。举例来说,我记得曾参与收入动态面板研究(Panel Study of Income Dynamics),这是一个自 1967 年以来追踪个人的数据集。家庭调查数据的挑战之一是,受访者并不总是说实话,或者有时他们根本不知道问题的答案。如果有人问你去年工作了多少小时,你会怎么回答?问题是这个测量误差不是随机的:它可能与你试图预测的结果的其他特征相关。
无论数据有什么问题,你都必须找出如何清理它,使它对决策有用。这里有一篇关于清理数据的文章。
无论数据有什么问题,你都必须找出如何清理它,使它对决策有用。
评估哪种类型的评估者适合你的环境,并在给定的背景下仔细检查他们的假设。我们在数据科学中可能犯的最大错误之一是将复杂的算法(如随机森林)应用于不太适合它的情况。
我们在数据科学中可能犯的最大错误之一是将复杂的算法应用于并不特别适合它的情况。
例如,如果你试图理解一种新产品的推出会如何影响需求,并且你正在查看基于以前产品发布的历史数据,那么你可能对因果关系比对预测更感兴趣。如果是这样,那么你更关心是什么在驱动你右边变量的运动,而不是简单地得到一个高的 R 平方。数据科学和经济学的比较见。
请记住,您不仅仅局限于单一数据集:整个世界都是您的囊中之物。专注于单个数据集是如此容易——完善它并用变量进行各种排列。但是,数据科学的美妙之处在于它充满了创造力。有时候,连接数据集是你能做的最有成效的事情。
数据科学的美妙之处在于它充满了创造力。
例如,我即将发表在《法律与经济学杂志》上的一篇论文用盖洛普的美国每日民意测验量化了工作权(RTW)法对工人福利的影响。要回答这个问题,我只需将不同州通过这些环球旅行法的时间数据进行合并。在一个更复杂的例子中,我在发表的另一篇论文调查了金融危机期间房屋抵押贷款止赎对社区和社会福祉的影响,发现即使在没有被直接止赎的个人中,也存在有意义的影响,这些人只是生活在被止赎的人周围。
数据科学领域在不断变化。即使当你认为你知道的足够多的时候,也不要忘记继续学习更多。我在学习新技术和部署现有人力资本之间挣扎,但这是一场值得打的斗争。当我们认为自己无所不知的时候,我们就失去了创造更多价值的潜力。
克里斯特斯·a·马克里迪斯在斯坦福大学获得了管理学&工程学和经济学博士学位,并担任麻省理工学院斯隆数字经济倡议的数字研究员、哈佛大学肯尼迪政府网络安全倡议学院的非常驻研究员、贝勒大学宗教研究所的非常驻研究员以及盖洛普的高级顾问。
原文:https://towardsdatascience.com/becoming-a-data-scientist-when-dan-becker-pointed-out-i-had-it-all-wrong-86fb81397e8c?source=collection_archive———4———————–
在你的职业生涯中,你是否有过这样的时刻,当你认为自己走在正确的道路上,当你遵循一个稳定的计划,带领你到达你想要的地方,然后有人踢你的计划的坚果,并通过 A + B 告诉你你完全错了?
这就是 Dan Becker 博士、数据科学家和 Kaggle Learn 的负责人昨天在他为 Kaggle CareerCon 2019 举办的题为的网络研讨会上对我说的,“为什么数据科学技能培养可能会阻碍你(以及你应该做些什么)。”
获得普通工程学位后,我带着项目管理和编程方面的技能小心翼翼地进入了就业市场。我不确定自己是否真的想花时间设计一些长达数年的甘特图,于是决定冒险进入数字营销领域。为什么选择数字营销?因为当我意识到 Google AdWords(我知道,Google Ads now)是由整天盯着宽大的统计表格看并从中获得报酬组成的时候,我就爱上了(奇怪,我知道。各得其所!).
但是经过五年的数字营销,我意识到这不适合我。这件事不会让我对去工作感到头晕目眩。这不是我可以对那些可能要求也可能没有要求的人喋喋不休的话题。
所以我决定休息一下,开始一个数据科学 MOOC,看看它是否像我想象的那么有趣。剧透一下,的确如此。因此,我决定再接再厉,在法国最古老的工程学院获得数据科学入门课程的认证。
“我有一个计划……”
“好的。酷毙了。现在你是数据科学家了,赖。你的故事的重点是什么?”不完全是,你这位持怀疑态度的读者。尽管我已经拿到了证书,但我还是决定继续我的职业生涯,在一家咨询机构做数据分析师。它介于我的数字营销过去和我的数据科学未来之间。有道理。这是一条稳定的道路。该认证让我对数据科学项目和 Python 编程有了稳定的基本了解,因此我可以像这样与我的销售工程师:“Clara,我有一个 2 到 4 年的计划。我将继续在线学习 Python,同时通过成为一名数据分析师来获得数据项目方面的知识,当我对自己的 Python 技能足够自信时,我将成为一名数据科学家。”**
既然我已经说过了,我已经做了一点调整,将 2 到 4 年改为 1 到 2 年。但是,丹·贝克尔还是用世界上所有的仁慈粉碎了这个计划。
"在光谱上,有两个极端:短期的 Sal 和长期的 Lee . "
Dan 是这样解释的:进入数据科学有两种方法。
一方面,你有短期的 Sal,他们获得了找工作所需的知识,一头扎进去,然后在数据科学领域找到一份工作,边干边学。另一方面,你有一个长期的李,他不断学习,不断学习,最后得到了一份数据科学家的工作。没错,读者,就是我。而这也正是丹所说的应该是一条*【尚可】*的职业轨迹。
但让我们现实一点,萨尔更快地走上工作岗位,更快地获得实践经验(意味着李无法从教科书中获得的实用知识),并为自己赢得了该领域的网络,这是孤独的李在他的学习隐士生活中所没有得到的。这就是实际发生的情况:
此时,我正盯着网上研讨会,很烦。*“哦,丹,你怎么敢这样粉碎我的梦想!”*但丹想到了我们,可怜的李氏兄弟看着所有参加 Youtube 直播的 sal 在评论区用虚拟手指指着我们笑。他有一个建议,对你们中的一些人来说可能很简单,但对我思考我的方法有很大的影响。
“找到你的激情项目,为之努力,发表它,在推特上发布它.”
*“好的,坚持住,丹。到目前为止,我只是设法复制了一份预先准备好的泰坦尼克号生存分析,修补了一些分类算法,并为我的认证做了一个非常成功的文本挖掘项目。你真的认为我会把我的任何工作放在那里让顶尖的数据科学家屠杀吗?”*在这一点上,我坚信 Dan 能读懂别人的心思,因为他随后解释说,是的,第一个项目可能不好,但没关系,把它们放在那里可能会吸引一些建设性的反馈,从而使下一个项目变得更好。李就是这样变成萨尔的。
“很好,丹,很好。杰夫,是时候接受挑战了。”
Jeff,感谢你校对这篇文章,并作为我的李的 Sal。
对于这篇文章,我想将丹的回答添加到 LinkedIn 上的原始帖子中。再说一次,我非常钦佩洞察力。( Fangirling 多,赖?)
Kaggle 比赛是一种很好的学习方式。尤其是因为您可以尝试一个问题,然后看看您的方法与其他人相比如何(因为许多人将他们的工作发布在容易访问的“内核笔记本”中)。但我不认为这是一条通向投资组合项目的捷径,能让你获得第一份工作(我认为这对大多数人来说是真正的转折点)。原因如下:竞赛有许多熟练的参与者。你需要取得非常好的成绩才能引起雇主的注意,而且(重复地说)大多数人都在平均水平或平均水平以下。相反,我建议找一个你感兴趣的话题,做一些数据探索。搜索相关数据,探索它,直到你能写一篇关于它的好博文(最好是在聚会上展示)。它可能是关于新闻,你的一个爱好,无论什么。让你的项目可视化(可能通过图表),清晰地传达。见鬼,也许甚至头脑风暴一下你是否可以利用你的数字营销背景来帮助它获得更多的曝光率。但是我们的想法是做一些有创意的事情。这更有可能引起你的注意(我昨天提到的那个黄领巾把戏),更多的读者(或 meetup 与会者)会觉得它很有趣。
原文:https://towardsdatascience.com/becoming-a-level-3-0-data-scientist-52641ff73cb3?source=collection_archive———0———————–
公司正在招聘三个级别的数据科学家:初级、高级或首席。无论您是刚刚开始接触数据科学,还是希望转行,您都不可避免地会发现自己处于这些级别之一。
Photo by Kelly Sikkema on Unsplash
这篇文章旨在阐明每个数据科学职业水平范围之外的期望和内容。虽然公司可能有不同的职称,这篇文章提供了一个通用的基线。此外,这篇文章最后给出了一些实用的建议,告诉你如何为进入人工智能或当之无愧的晋升做好准备。
让我们升级吧。🎚
数据科学家应该具备三个领域的知识:统计、工程和商业。然而,并不期望你一开始就掌握所有这三个领域。在寻求入门级职位时,你应该重点关注哪些技能?随着职业生涯的发展,哪些技能变得越来越重要?
下图显示了从 1.0 到 3.0 的每个数据科学级别的市场预期。这些结果是基于我在该领域的个人经验以及与来自史丹福、、、阿克塞尔·施普林格和邢的专家和有影响力的人的交谈。为避免混淆,我们将这些职位称为 1.0 至 3.0 级。
下面我们就来详细分析一下这些岗位的期望值。
初级数据科学家的原型是一名年轻的毕业生。热门的研究领域包括计算机科学、数学或工程。初级数据科学家有 0-2 年的工作经验,熟悉用 Python 创建结构化数据集的原型。她参加过 kaggle 比赛,并拥有 GitHub 个人资料。
初级数据科学家可以为公司提供巨大的价值。他们刚刚参加完在线课程,可以立即提供帮助。他们通常是自学的,因为很少有大学提供数据科学学位,因此表现出巨大的承诺和好奇心。他们对自己选择的领域充满热情,渴望了解更多。初级数据科学家擅长构建解决方案的原型,但仍然缺乏对工程和业务思维的熟练程度。
初级数据科学家应该对机器学习有强烈的热情。你可以通过参与开源项目或 kaggle 挑战赛来展示你的热情。— Dat Tran ,Axel Springer AI 领衔
如果一家公司正在招聘初级数据科学家,通常数据科学团队已经到位。该公司随后寻求帮助,让更有经验的同事生活得更轻松。这包括快速测试新想法、调试和重构现有模型。你将作为陪练与团队讨论想法。你提出如何把事情做得更好的新想法。您对您的代码负责,不断努力提高代码质量和影响。你是一个优秀的团队成员,总是希望支持你的队友完成构建优秀数据产品的任务。
初级数据科学家没有设计复杂产品解决方案的经验。因此,她在一个团队工作,将数据科学模型投入生产。由于初级数据科学家刚刚加入公司,她并没有沉浸在公司的业务中。因此,预计她不会推出新产品来影响的基本商业方程式。但是,一直期待的是学习和提高自己技能的欲望。
我对初级数据科学家完成重要项目的能力感兴趣。所谓完成,我的意思是这个项目从头到尾都是由这个人完成的——或者在一个团队中完成的——并最终形成一个完全冲洗出来的产品。我发现这与数据科学家在工作中领导项目的能力相关。—Kian katanforosh,deeplearning.ai 创始成员,斯坦福 CS 讲师
如果你擅长做一名初级数据科学家,那么你在理解数据科学模型方面有很强的背景。你表现出永不满足的好奇心,想了解工程和公司的业务,以提高自己的技能。
下一关是什么样子的?接下来我们来了解一下资深数据科学家。
高级数据科学家已经担任初级数据科学家、软件工程师或完成博士学位。他在该领域拥有 3-5 年的相关经验,编写可重用的代码,并在云环境中构建弹性数据管道。
高级数据科学家应该能够构建数据科学问题。优秀的候选人从过去的数据科学经验中获得了深刻的见解。我还深入研究了他们编写产品代码的能力。—Kian katanforosh
公司更愿意雇用高级数据科学家,因为他们以合理的薪水提供巨大的价值。他们比初级数据科学家更有经验,因此省略了代价高昂的新手错误。他们也不像首席数据科学家那样昂贵,但仍有望在生产中交付数据科学模型。这是一个非常有趣的级别,已经超过了 1.0 级,但仍有增长到 3.0 级的空间。
这位资深数据科学家精通将数学模型投入生产的艺术。当首席数据科学家或业务经理分配任务时,高级数据科学家以构建良好架构的产品为荣。他避免模型中的逻辑缺陷,怀疑表现太好的系统,并以正确准备数据为荣。高级数据科学家指导初级数据科学家,并回答管理层的业务问题。
高级数据科学家不需要领导整个团队。高级数据科学家没有责任为新产品出谋划策,因为这些想法是由更有经验的同事和经理提出的。虽然高级数据科学家知道他们构建的产品的细节,但他们并不需要知道所有数据驱动产品的整体架构。与 1.0 级数据科学家相比,2.0 级数据科学家擅长统计,在工程方面也更胜一筹,但却偏离了 3.0 级数据科学家的无趣业务部分。
高级数据科学家必须能够将他们的代码投入生产(在数据工程师的支持下)。高年级学生应该能够独立完成交给他们的项目。— Sébastien Foucaud ,Xing 数据科学副总裁
高级数据科学家通过他们的模型产生的影响来衡量。他对统计模型的内部运作以及如何实现它们有很好的直觉。他正在更好地了解公司的业务,但预计还不会提供业务问题的解决方案。
Photo by Carl Raw on Unsplash
现在我们已经调查了 2.0 级,让我们看看最终的 3.0 级是什么样的。
首席数据科学家是数据科学团队中最有经验的成员。她拥有 5 年以上的经验,精通各种类型的数据科学模型。她知道将模型投入使用的最佳实践。她知道如何编写计算效率高的代码,并潜伏在周围寻找高影响力的商业项目。
除了她无可挑剔的工程技能和对所使用的科学模型的深刻理解之外,她还非常了解她所在公司的业务。她有利用数据科学影响业务基线的记录。
在编写一行代码之前,首席数据科学家需要很好地理解他们正在解决的业务问题。也就是说,他们需要有能力在实施之前验证想法。这种方法提高了数据科学项目的成功率。— 易贝人工智能产品负责人 Adnan Boz
首席数据科学家负责创建高影响力的数据科学项目。与利益相关者密切合作,她负责领导一个潜在的跨职能团队,为给定问题提供最佳解决方案。因此,她的领导技能从 1.0 级和 2.0 级开始发展。首席数据科学家充当不同部门产品经理的技术顾问。凭借她在主要数据科学领域的丰富经验和技能,她成为任何项目的宝贵资产。
在引导关于所需技能的讨论时,首席数据科学家不负责招募新的团队成员。尽管她了解自己公司的业务,并建议有影响力的新产品,但产品经理仍然负责市场的采用。她也领导团队,但职业发展决策仍由团队领导做出。
首席数据科学家应该独立于数据科学主管指导项目。人们期望这个人获得初步的领导技能,因此,这个人能够清晰地交流、善解人意、善于观察人是很重要的。— 达特兰
首席数据科学家已经看到了产品失败的原因,因此她成功地推动了新项目。她是产品讨论的重要贡献者,喜欢在公司开展数据科学教育。凭借其在交付有影响力的数据科学解决方案方面的经验,她是数据科学部门最有价值的资产。
Photo by Val Vesa on Unsplash
现在,您已经看到了一名数据科学家从 1.0 级到 2.0 级直至 3.0 级的不同期望,让我们看看您如何利用这些知识来推进您的职业生涯。
无论您是希望进入 1.0 级的数据科学职业游戏,还是希望进入更高的级别,都没有关系。采取以下步骤,开始你的下一次职业生涯。
首先,将您的技能与数据科学技能矩阵进行比较。你的统计技能有多扎实?你的工程技术有多好?你有多精通商业?
许多公司都有年度晋升周期来提升员工。脸书产品设计副总裁朱莉·卓建议,获得晋升的第一步是实现你的抱负,提升知名度。在晋升周期开始时表明,你希望向你的经理推进你的职业发展。询问您的经理,她对您当前的技能组合如何评级,以及您希望达到的下一个数据科学职业水平。
一旦你分析了你的技能并宣布了你对升职的渴望,是时候提升你的技能了。
Photo by Samuel Zeller on Unsplash
要不要打入 AI?然后对统计模型了如指掌,并学习如何用结构化数据集解决问题。你希望进入 3.0 级吗?确保你已经掌握了数学、工程和商业技能。有了这些要点,你就为和你的经理谈判升职做好了充分的准备。
浏览数据科学职业水平很有趣。请记住以下要点:
- 初级数据科学家拥有良好的统计技能
- 高级数据科学家擅长将模型投入生产
- 首席数据科学家知道如何创造商业价值
- 提升,评估你的技能,宣布你进步的愿望,努力提高你的技能
不同的数据科学职业级别之间存在细微差别。例如,Séb Foucaud 在初级数据科学家中寻找的是强大的工程技术,而不是数学技能。一些高级数据科学家可能会发现他们对构建可伸缩数据管道的热情,并转变为数据工程角色。一些首席数据科学家更喜欢发展技术专长,而其他人则乐于专注于业务技能。无论你走哪条职业道路,围绕数据科学专业知识的三个主要领域发展你的技能都会让你走得更远。
这篇文章是正在进行的教育数据科学家成为商业头脑系列的继续。该系列旨在帮助您完善您的整体数据科学技能。如果你喜欢这种形式,请在 LinkedIn 或 Medium 上关注我,了解最新文章。
Photo by Mirko Blicke on Unsplash
原文:https://towardsdatascience.com/becoming-a-self-taught-data-scientist-5563f546bb7b?source=collection_archive———4———————–
数据科学工作被认为是 21 世纪最性感的工作。这是一个大胆的说法,主要是因为我们现在是在 2019 年,所以谁知道就业市场在 50 年后会是什么样子。
Photo by Alex Radelich on Unsplash
然而,如果我们只看过去 15-20 年的职称,那就完全是另一回事了。请继续阅读本文,您将会发现一些进入数据科学领域的最令人惊奇的资源。你是否有其他领域的学位完全无关紧要。
不久前,我发表了一篇关于自学与获得数据科学学位的来龙去脉的文章:
[## 数据科学:自学与大学
哪个选项对你来说是正确的?让我们深入了解一些利弊。
towardsdatascience.com](/data-science-self-taught-vs-college-b5482b68849e)
那篇文章深入探讨了这两种选择,所以如果您对这个主题感兴趣,可以去看看。然而今天,我想进一步探索自学路线,为你提供一些惊人的入门资源。
这篇文章是写给谁的?
- 没有任何学位的人
- 那些前一段时间完成大学学业并希望转向数据科学的人
好了,我们不要再在介绍上浪费时间了,现在我们将进入正题。
好问题。简而言之,它的意思是,你没有在感兴趣的领域完成任何大学学位(让我们说数据科学),并且你正在感兴趣的领域工作(再次,数据科学),那么你被认为是感兴趣领域的自学者。
你仍然可以自由地完成在线课程和阅读书籍,但是你没有花几年时间在大学课桌后面接受正规教育。
好了,现在,当这个问题解决后,让我们深入了解成为一名自学成才的数据科学家的第一种方式。
如果符合以下条件,您将属于此类别:
- 你没有大学学位
- 你的数据和编程知识水平很低或者根本不存在
Photo by Annie Spratt on Unsplash
那么应该怎么做呢?这是一个很难回答的问题。开始时,你需要掌握基础知识,也就是数学和统计技能。是的,你需要学习如何编码,最好是用 Python 。
不久前,我写了一篇文章,列出了进入这个领域所需的每一个先决条件的我最喜欢的资源:
[## 终极数据科学必备学习清单
查看学习线性代数、微积分、统计、概率和编程的最佳位置。
towardsdatascience.com](/the-ultimate-data-science-prerequisite-learning-list-348ce89805f9)
我知道这很难,但没人说这很容易。花些时间了解基本情况。你不必手动进行大量的计算,一个坚实的视觉理解应该绰绰有余。
我不建议用手做大量的计算,原因之一是计算机很容易做到。对于计算机来说,困难的是将问题框定,并知道在哪些情况下该做什么(不,我不是在说条件语句)。这就是为什么数学和统计的可视化方法是一座金矿。
如果你花时间深入学习数学、统计和编程,我会说,你和几年前在大学里听过这些话题的人一样,都处于开始学习真正的数据科学的有利位置(数学大学的学生不包括在内)——因此大学毕业的人绝不比你强——至少在数据科学方面。
所以这是从 0 路线。现在,让我们在深入研究资源之前探索另一条路线。
转行可能会很艰难。你可能已经在一个领域工作了几年,并认为它不适合你。这很好。也许你厌倦了,也许这份工作不够激励人……原因不胜枚举,我不想讨论。
你想尽快做的是诚实地评估你的数学和统计技能。我说真的。承认你对 10 年前听过的话题生疏了并不丢人。
如果您对以下主题的理解没有 100%的把握:
- 线性代数
- 结石
- 可能性
- 统计数字
- 编程;编排
回头参考这篇文章,选择适合你需求的资源——无论是书籍还是在线课程。
好了,都盖好了吗? 您可以进行我个人的资源选择。
因此,无论出于何种原因,大学都不是一个选项,但你可以每天花一两个小时来探索数据科学世界。下一步将因人而异,这在很大程度上取决于你是一个书人还是一个视频人。我更喜欢看视频——我只是不想在 8 小时轮班后看书。
我将简单地从我个人最喜欢的开始——我第一次接触数据科学:
[## Python 用于数据科学和机器学习训练营
您准备好开始成为数据科学家的道路了吗!这门综合课程将成为你学习的指南…
www.udemy.com](https://www.udemy.com/course/python-for-data-science-and-machine-learning-bootcamp/)
何塞是一个了不起的教练。有一个对基本 Python 库的快速复习,很快你就会用 Pandas 和 Numpy 进行数据分析,用 Matplotlib 和 Seaborn 进行一些数据可视化。是的,你会做机器学习。不多,也不深入,但足以让你开始。
如果你更喜欢书,那么我推荐这本书:
它叫做 Python 数据科学手册 ,大约 550 页长,涵盖了与视频课程相同的概念——Numpy、 Pandas 、 Matplotlib 和Scikit-Learn——所有这些对数据科学都至关重要。
一旦你完成了基础,是时候深入机器学习了。我有两本很棒的书推荐,其中一本是免费的。让我们开始吧。
统计学习简介 很神奇,也是一本更深入学习机器学习的免费书籍。它有时有点数学化,但易于阅读。对于像机器学习这样广泛的领域来说,它在保持 400 页左右的内容简洁方面做得非常好。唯一的缺点是代码是用 R 写的,不是 Python。但是,嘿,试着把 R 代码“翻译”成 Python 代码,这肯定会是一个很好的练习。
我推荐的下一本书叫做 用 Scikit-Learn 和 Tensorflow 进行机器实践学习。如果我没记错的话,大约有 700 页,但是这是一本好书。你也将深入学习一些深度学习概念,你也将更深入地研究机器学习算法。
你不会因为选择一个或另一个而出错,它们都会很好地为你服务。
对于在线课程,我不得不推荐唯一的 Coursera 的机器学习课程,先生,如果你不懂也不用担心,吴恩达。已经 10 周多了,如果你的基础不稳固,很快就会变得艰难。但是,嘿,来自 12 万用户的 4.9 分的平均评分确实说明了一些问题。
[## 机器学习|课程
机器学习是让计算机在没有明确编程的情况下行动的科学。在过去的十年里…
www.coursera.org](https://www.coursera.org/learn/machine-learning)
这些实验不是用 Python 写的,甚至不是用 R 写的,这些实验是用 Matlab 的免费版本写的,叫做 Octave ,所以这是需要考虑的事情。
你已经浏览了书籍或课程(或两者都有),现在你想知道下一步该做什么。这将根据你的情况而有所不同,但理想情况下,你应该建立一个 GitHub 档案。
找到 5 个好的数据集,尽力而为。做广泛的分析,在 markdown 单元格中写下结论和思考过程,制作一个自述文件,你知道,全身心地投入其中。
这是必要的,原因有二:
- 你在练习新学到的技能
- 你在向潜在员工展示你产生高质量代码和结论的能力
关于阶梯,让潜在雇主看到你最好的工作很重要。你没有大学学位,至少没有相关的学位,所以你需要向他们展示你知道如何完成工作。GitHub 是一条路要走。
花一两个月的时间,做一些让你自豪的事情。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
原文:https://towardsdatascience.com/beginner-guide-to-machine-learning-pipeline-monitoring-aba2af444155?source=collection_archive———18———————–
许多公司正在使用 power machine learning 在应用程序的前端和后端提供预测、推荐或分类。来自 The Verge 的一份报告称,“最终,几乎所有东西都将在内部的某个地方拥有(机器学习)。”然而,将机器学习模型构建和部署到机器学习管道并不是开发周期的结束。机器学习模型需要随着时间的推移进行监控和调整,以确保模型不会遇到意想不到的问题,并且在性能上是有效的。下面的流程图很好地说明了机器学习模型的开发周期,以及性能监控如何融入其中,以及人在回路中如何将强化学习带回模型。一篇关于“什么是机器学习?”可以在这篇牛逼的文章上找到。
Source: http://towardsdatascience.com/not-yet-another-article-on-machine-learning-e67f8812ba86
机器学习模型的开发涉及许多步骤,每个步骤都需要不同的技能和知识来执行。本文将关注机器学习开发中一个较少讨论的领域,即机器学习流水线的性能监控。
机器学习管道监控可以分为两个部分:
- ETL 监控
- 分数监控
简而言之,ETL 监控关注的是进入模型之前的数据,而 Score 监控关注的是模型的输出。总之,数据科学家可以看到数据和他们的模型行为之间的相关性。这种理解对于确定需要改进的领域和检测管道中的故障至关重要。本文将关注 ETL 监控。
机器学习管道中要监控的第一个领域是特征提取过程,在此过程中,输入数据在输入到机器学习模型进行分类之前被转换为数字特征。然而,深度学习模型可能不会将特征提取作为一个独立的过程,如下图所示。为了不混淆观众,这一部分将只关注传统的机器学习模型,如随机森林,它将特征提取作为过程中的一个独立步骤。
Source: https://towardsdatascience.com/cnn-application-on-structured-data-automated-feature-extraction-8f2cd28d9a7e
当我们在数据进入模型之前查看数据时,ETL 监控并不是真正的性能监控,而是防止坏数据进入模型的保护措施。损坏的数据或不寻常的模式会扰乱模型,导致混乱的分类。换句话说,“垃圾进,垃圾出。”
一些数据科学项目从他们的内部操作中获取数据,这使得输入变得清晰、结构化和可解释。然而,机器学习项目通常应用于野生数据源,因为简单的基于规则的算法无法用于处理它们。例如,日志文件、用户生成的内容、第三方供应商和开放数据。这些公司对数据如何生成、何时可用以及模式会发生什么变化的控制力度较小。
使用外部数据源的风险在于,数据的模式或模式可能会在没有通知或团队意识到的情况下随时间而改变。例如,有人可能破坏开放的数据,内容生成的方法可能改变,或者供应商可能在没有通知下游用户的情况下改变数据的模式。上述原因可能会威胁到 ML 模型的性能,如果忽视太久,会产生严重的问题。
为了有效地监控 ETL 过程,防止关键数据问题影响模型及其性能;数据的完整性、一致性和可用性是选择 ETL 监控度量时需要考虑的三个方面。
有许多原因会危及数据的完整性。其中一些是:
- 数据管道中的错误
- 基础设施中的软件更新
- 数据源的日常维护
- 外部方对数据的破坏
- 数据源中数据模式的变化
通过创建全面的验证规则来捕捉和报告异常,可以监控数据的完整性。验证规则通常在探索性数据分析和模型训练期间制定。例如,可以使用的一些度量是缺失或看不见的特征的数量,或者未通过每个验证规则的数据点的比率。
即使数据科学家会将损坏的数据排除在模型之外,也必须监控数据问题的大小和严重性,以便衡量数据源的可靠性,并开发新的规则来持续验证数据完整性。
ETL 监控指标的第二个原则是数据的一致性。一致性非常重要,因为数据点可能会通过验证规则,但要素中的值可能会与模型的训练历史有很大不同。影响数据完整性的原因也会影响数据的一致性。但在用户生成数据的情况下,由于用户在平台上互动方式的转变,一致性的变化也可能有机地发生。
不一致的数据会影响 ML 模型的性能,因为它会改变为其训练模型的数据模式。下面的可视化说明了为什么数据的不一致性会破坏 ML 模型的性能。
为了监控一致性,可以导出数据的量、变化率或单个值,以便针对将被监控的指标进行汇总。然后,聚合值成为时间序列中的数据点,其中 X 轴是时间,Y 轴是用于聚合每个批次或时间窗口中的数据的测量值(取决于数据是以批次还是以流的形式出现)。
Time Series Data Example
有许多测量变量可用于表示数据的分布和偏斜度,如方差和百分位数。根据我的经验,我发现均值和标准差是最有效的度量组合。该组合配合使用效果最佳,因为平均值显示的是中心点,而标准偏差显示的是分布范围。下图显示了均值和标准差如何表示不同的分布。
Source: https://www.varsitytutors.com/hotmath/hotmath_help/topics/normal-distribution-of-data
让我们用一个真实的例子来解释一下。我们建立了一个 ML 模型,根据社会经济数据来预测人口的预期寿命。其中一个特征是收入,我们每年批量获取数据。因此,我们将找到人口收入的均值和标准差,并逐年进行比较,以分析收入分布的一致性。如果 2017 年的收入均值或标准差与 2018 年有很大不同,并且该模型是根据 2017 年的数据训练的,则表明模式已经改变,预测可能不如训练和测试时准确。用 2018 年的数据重新调整模型也是一个好主意,我将在未来的帖子中谈到这个话题。
可以说,数据的可用性是监控管道时要考虑的最重要的方面。当管道从团队无法控制的数据源(如第三方供应商或开放数据)获取数据时,这一点尤其重要。如果没有数据输入,ML 管道就像一条废弃的铁轨,建设管道的投资就会损失。
数据的可用性可能不会影响 ML 模型的精度,但它会影响 ML 管道的整体性能,因为没有数据输入(或延迟输入)就无法实现业务目标。可用于监控数据可用性的 KPI 示例如下:
- 每批数据之间的延迟时间
- 管道中没有数据的总分钟数、小时数或天数
- 数据交付落后于计划的次数
了解上述指标有助于数据科学团队确定需要改进的领域,并在数据不可用时得到通知。如果有多个数据源进入管道,这些指标将帮助团队了解每个数据源的可靠性,以便将问题或顾虑传达给正确的团队。
文章到此结束!我希望您现在知道如何监控数据的完整性、一致性和可用性,以及为什么它们对机器学习管道的性能至关重要。
我将在下一篇文章中继续发布机器学习管道监控的第二部分,也就是分数监控。您可以关注我,获取更多关于性能监控和数据可视化相关主题的文章。谢谢你读到这里,我希望你喜欢这篇文章!
原文:https://towardsdatascience.com/beginners-guide-data-types-and-their-measurement-scale-194033b86b6d?source=collection_archive———17———————–
数据有一个重要的故事要讲。他们依靠你给他们发言权。
在你给他们发言权之前,你必须理解不同的数据类型。根据数据的收集方式或结构,有不同的方法对数据进行分类。
基于数据收集:根据数据收集的方式,数据可以分为三种类型。
- 横截面数据:在一个特定的时间段内,在多个变量上捕捉到的任何数据点/值称为横截面数据。例如:员工的属性,如年龄、工资、级别、2019 年的团队。
- 时序数据:单个变量在多个周期内捕获的任何数据点/值称为时序数据。例如:每月、每季度、每年的智能手机销量。
- 面板数据:截面数据和时间序列数据的组合称为面板数据。不同时期不同国家的 GDP。
基于结构。对数据进行分类的另一个重要方法是基于数据的结构。它可以分为两种类型。
- 结构化数据:所有具有特定结构并能以表格形式(也称为矩阵)排列成行和列的数据点称为结构化数据。例如:用员工 id 安排的员工的工资。
- 非结构化数据:所有没有排列成任何表格格式的数据点都是非结构化数据。例如:电子邮件、视频、点击流数据等。
70%的可用数据是非结构化数据,在分析或构建任何分析模型时,必须将非结构化数据转换为结构化数据。
数据分析领域的大多数初学者面临的另一个问题是,即使结构化数据可用,如何处理它,如何使用它,如何测量它,以及如何从中推断出见解。
对于所有这些,测量尺度变得很重要。人们必须意识到,如果结构化数据可用,我们如何测量它们,以及如何根据测量来区分它们。
根据测量尺度,数据可以分为四个部分。
- 名义规模:所有定性的数据点都属于这个范畴。这些也被称为分类变量。婚姻状况(单身、已婚等。).不能对这些变量执行任何算术运算(加、减、乘或除)。
- 有序尺度:有序集合中的所有数据点都属于这个范畴。例如:1-5 分等级(5 分最高,1 分最低)。这里集合的顺序是固定的,但是不能执行算术运算,例如我们知道,等级 4 比等级 2 好,但是两个等级 2 不能等于等级 4。
- 区间尺度:从某个固定区间集合中取出的所有数据点。例如:温度(摄氏度),智商水平。在这样的变量中,可以执行加法或减法,但是除法没有意义。你可以说孟买比班加罗尔高 10 摄氏度,但你说孟买比班加罗尔热两倍是不对的,因此这里的比率没有意义。
- :所有本质上是定量的数据点都属于这一类。产品的销售,员工的工资等。在这里,所有的算术运算都可以执行,并且可以进行比较,因为 Ram 的收入是 Shyam 的两倍,因此比率是有意义的。
因此,通过查看数据,可以推断出哪种数据是可用的,如名义数据、序数数据等。这最终有助于数据分析师/科学家构建任何分析模型,以了解不同的变量,进行探索性数据分析,进行数据插补,并执行一次性编码。
它不仅在预测分析中变得重要,而且在描述分析中也很有帮助。如果没有关于数据类型的信息,就无法进行探索性数据分析。一旦你确定了数据的类型,然后进行大量的单变量和双变量分析、可视化和计算,如均值、众数、中位数等。可以从数据中推断洞察力。
原文:https://towardsdatascience.com/beginners-guide-to-bert-for-multi-classification-task-92f5445c2d7c?source=collection_archive———3———————–
Original Photo by David Pisnoy on Unsplash. It was later modified to include some inspiring quotes.
本文的目的是提供如何使用 BERT 进行多分类任务的分步指南。BERT(BI directionalEn coderRpresentations fromTtransformers),是 Google 提出的一种新的预训练语言表示方法,旨在解决广泛的自然语言处理任务。该模型基于无监督的深度双向系统,并在 2018 年首次向公众发布时成功实现了最先进的结果。如果你想了解更多,可以在下面的链接中找到学术论文。
本教程有 5 个部分:
- 设置和安装
- 数据集准备
- 培训模式
- 预言;预测;预告
- 结论
在本教程中,我将使用 Ubuntu 18.04 搭配单个 GeForce RTX 2080 Ti。就我个人而言,我不建议在没有 GPU 的情况下进行训练,因为基础模型太大了,训练时间非常长。
建议建立一个虚拟环境。如果你是第一次使用 Ubuntu,打开终端,将目录切换到你想要的位置。它将是您环境的根文件夹。运行以下命令安装 pip:
然后,运行以下命令安装 virtualenv 模块:
您现在可以创建自己的虚拟环境(用您喜欢的任何名称替换 bertenv):
如果你喜欢不使用 virtualenv 模块,还有一种方法可以创建虚拟环境,只需使用 python3
您应该已经创建了一个 bertenv 文件夹。查看以下链接了解更多信息。您可以使用以下命令激活虚拟环境:
从下面的链接克隆存储库。完成后,解压缩 zip 文件并将其放入您选择的目录中。你应该有一个 bert-master 文件夹。我把它放在虚拟环境文件夹旁边。因此,在根目录中,我有以下子文件夹:
- 贝尔坦夫
- 伯特-马斯特
BERT 只需要 tensorflow 模块。您必须安装等于或高于 1.11.0 的版本。确保您安装了 CPU 版本或 GPU 版本,但不是两者都安装。
你可以通过 pip 或者位于 bert-master 文件夹中的 requirement.txt 文件来安装。
我们将需要一个微调过程的基础模型。我将在本教程中使用 BERT-Base,Cased ( 12 层,768-hidden,12-heads,110M 参数)。如果你想试试 BERT-Large ( 24 层,1024 隐藏,16 头,340M 参数),确保你有足够的内存。12GB 的 GPU 不足以运行 BERT-Large。我个人会推荐你用 64GB 的 GPU 做 BERT-Large。在撰写本文时,BERT 背后的团队还发布了其他模型,如中文、多语言和全词屏蔽。请通过以下链接查看。下载完文件后,解压缩该文件,您应该得到以下文件:
- 三个 ckpt 文件
- vocab.txt
- 伯特配置文件
将它们放在模型文件夹中,并将其移动到 bert-master 文件夹中。请转到下一节数据集准备。
对于 BERT 来说,数据准备是非常复杂的,因为官方的 github 链接并没有包含太多需要什么样的数据。首先,有 4 个类可用于序列分类任务:
- Xnli(跨语言 nli)
- 多体裁自然语言推理
- 微软研究释义语料库
- 语言可接受性语料库
所有的类都是基于数据处理器类(参见第 177 行的run _ classifier . py文件),该类用于将数据提取到以下内容:
- guid :示例的唯一 id。
- text_a :字符串数据。第一个序列的未标记文本。对于单序列任务,只能指定此序列。
- text_b :(可选)字符串数据。第二个序列的未标记文本。必须为序列对任务指定 Only。
- 标签:字符串数据。示例的标签。这应该为训练和评估示例指定,而不是为测试示例指定。
换句话说,我们可以修改我们的数据集来模拟 4 个类之一的模式和格式,或者编写我们自己的类来扩展 DataProcessor 类以读取我们的数据。在本教程中,我将把数据集转换成可乐格式,因为它是所有格式中最简单的。其他数据集的例子可以在下面的链接(胶水版)中找到。
在 BERT 的原始版本中,run _ classifier . py基于从三个 tsv 文件中读取输入:
- train.tsv(无标题)
- dev.tsv(评估,无标题)
- test.tsv(头是必需的)
对于 train.tsv 和 dev.tsv ,你应该有以下格式(无表头):
- 列 1 :示例的 guid。它可以是任何唯一的标识符。
- 第 2 列:示例的标签。它是基于字符串的,可以是文本形式,而不仅仅是数字。为了简单起见,我在这里只使用数字。
- 第 3 列:第二个序列的未分词文本。必须为序列对任务指定 Only。因为我们正在进行单序列任务,所以这只是一个一次性的专栏。对于所有的行,我们都用“a”来填充它。
- 第 4 列:第一个序列的未分词文本。用示例的文本填充它。
对于 test.tsv ,你应该有如下格式(需要表头):
如果您有不同于上面给出的格式的数据,您可以使用 pandas 模块和 sklearn 模块轻松地转换它。通过 pip 安装模块(确保虚拟环境已激活):
如果您打算使用 train_test_split,也要安装 sklearn:
例如,如果我们有以下 csv 格式的训练数据集:
我们可以使用以下代码轻松加载数据集并将其转换为相应的格式(相应地修改路径):
粗体突出显示的部分意味着我们将根据 df_train 数据帧中的行数用字符串 a 填充列 alpha。shape[0]指的是行数,而 shape[1]指的是列数。
不要对 to_csv 函数调用感到惊讶,因为除了分隔符之外,tsv 和 csv 具有相似的格式。换句话说,我们只需要提供正确的制表符分隔符,它就会变成一个 tsv 文件(以粗体突出显示)。
下面是创建所有必需文件的完整工作代码片段(相应地修改路径)。
一旦你有了所有需要的文件,将数据集文件夹移动到 bert-master 文件夹。让我们继续下一部分来微调您的模型。
微调 BERT 模型最简单的方法是通过命令行(终端)运行 run_classifier.py。在此之前,我们需要根据我们的标签修改 python 文件。最初的版本是使用 0 和 1 作为标签的二进制分类。如果使用不同的标签进行多分类或二分类,需要更改 ColaProcessor 类的 get_labels() 函数(第 354 行,如果使用其他数据处理器类,请相应修改):
如果您遇到如下任何键错误,这意味着您的 get_labels 函数与您的数据集不匹配:
我们现在已经准备好接受训练了。如果您使用的是 NVIDIA GPU,您可以在终端中键入以下内容来检查状态和 CUDA 版本。
更改目录指向 bert-master 文件夹,确保数据集文件夹和 bert-master 文件夹中的所需文件。建议通过命令行运行培训,而不是使用 jupyter notebook,原因如下:
- 官方代码使用 2 个单位缩进,不同于笔记本默认的 4 个单位缩进。
- 内存问题和配置用于训练的 GPU 的额外代码。
在此之前,让我们探索一下可以针对培训流程进行微调的参数:
- data_dir :包含 train.tsv、dev.tsv、test.tsv 的输入目录。
- bert_config_file :预先训练好的 bert 模型对应的 config json 文件。这指定了模型架构。
- 任务名称:训练任务的名称。4 个选项可用(xnli、mrpc、mnli、cola)。
- vocab_file :训练 BERT 模型的词汇文件。
- output_dir :模型检查点将被写入的输出目录。
- init_checkpoint :初始检查点(通常来自预训练的 BERT 模型)。
- do_lower_case :输入的文本是否小写。对于无大小写应为 True,对于有大小写应为 False。
- max_seq_length :分词后最大总输入序列长度。长于此长度的序列将被截断,短于此长度的序列将被填充。默认值为 128。
- do_train :是否在 train.tsv 上运行训练。
- do_eval :是否在 dev.tsv 上运行评估
- do_predict :是否在 test.tsv 上以推理模式运行模型
- train_batch_size :训练的总批量。默认值为 32。
- eval_batch_size :评估的总批量。默认值为 8
- predict_batch_size :测试和预测的总批量。默认值为 8。
- learning _ rate:Adam 的初始学习率。默认为 5e-5。
- num_train_epochs :要执行的训练总次数。默认值为 3.0。
- 热身 _ 比例:从 0 到 1 进行线性学习率热身的训练比例。默认值为 0.1 表示 10%。
- save_checkpoints_steps :保存模型检查点的步数间隔。默认值为 1000。
- iterations_per_loop :每次估算器调用的步数间隔。默认值为 1000。
- 使用 _tpu :是否使用 tpu。
- tpu _ 姓名:云 TPU 用于训练。
- tpu 区:TPU 云所在的 GCE 区。
- gcp_project :启用云 TPU 的项目的项目名称
- 主 : TensorFlow 主 URL。
- 数量 _ TPU _ 核心数:仅当使用 _tpu 为真时使用。要使用的 TPU 核心总数。
不要被参数的数量所淹没,因为我们不会指定每个参数。
从官方文档中,它建议通过以下命令行调用将路径导出为变量(如果您使用的是 Windows 操作系统,请将导出替换为设置):
在本教程中,我将不导出路径,因为您仍然需要在命令行中指定它。只要确保你正确地组织了你的文件夹,你就可以开始了。要指定 GPU,您需要在 python 调用之前键入它(示例如下,不要运行它):
0 是指 GPU 的顺序。使用以下命令检查它:
在 bert-master 文件夹中,创建一个输出文件夹。我就把它叫做 bert_output 。确保在 bert-master 文件夹中有以下文件夹和文件:
- 数据集文件夹(包含 train.tsv,dev.tsv,test.tsv)
- 型号文件夹(包含 ckpt,vocab.txt,bert_config.json)
- bert_output 文件夹(空)
确保终端指向 bert-master 目录,并且虚拟环境已激活。根据您的偏好修改参数并运行它。我做了以下更改:
- 将 train_batch_size 减少到 2:如果你有足够的内存,可以随意增加。这影响了训练时间。越高,训练时间越短。
- 将的保存 _ 检查点 _ 步骤增加到 10000。我不想有这么多检查点,因为每个检查点模型都是原始大小的 3 倍。放心,这个脚本一次只保留 5 个模型。旧型号将被自动删除。强烈建议将其保持为 1000(默认值)。
- 将最大序列长度减少到 64。由于我的数据集 99%的长度不超过 64,将其设置得更高是多余的。根据数据集对此进行相应的修改。默认值为 128。(序列长度是指词块标记化后的字符长度,请考虑这一点)。
训练应该已经开始,显示跑步步数/秒。检查 bert_output 文件夹,您应该注意到以下内容:
- 三个 ckpt 文件(模型)
- tf _ 记录
- 检查点和事件文件(临时文件,可以在培训后安全地忽略和删除)
- graph.pbtxt
这可能需要几个小时到几天的时间,具体取决于您的数据集和配置。
培训完成后,您应该有一个 eval_results.txt 来指示您的模型的性能。
确定模型的最高步骤数。如果您对此不确定,请在文本编辑器中打开检查点,您应该会看到以下内容:
在这种情况下,最高步骤是 236962。我们现在可以用这个模型来预测结果。
为了进行预测,我们将使用相同的 run_classifier.py 。这一次,我们需要将 do_predict 指定为 True,并将 init_checkpoint 设置为我们拥有的最新模型 model.ckpt-236962(根据您拥有的最高步骤进行相应修改)。但是,您需要确保 max_seq_length 与您用于训练的相同。
一旦流程完成,您应该在 bert_output 文件夹中有一个 test_results.tsv(取决于您为 output_dir 指定的内容)。如果使用文本编辑器打开它,您应该会看到以下输出:
列的数量取决于标签的数量。每一列按照您为 get_labels()函数指定的顺序表示每个标签。该值代表预测的可能性。例如,模型预测第一个示例属于第 3 类,因为它具有最高的概率。
如果您想映射结果来计算精确度,可以使用以下代码(相应地修改):
idxmax 是一个函数,用于返回请求轴上第一次出现的最大值的索引。不包括 NA/null 值。在这种情况下,我们传递 1 作为轴来表示列而不是行。
在本教程中,我们已经学会了针对多分类任务微调 BERT。供您参考,BERT 可以用于其他自然语言处理任务,而不仅仅是分类。就我个人而言,我也测试了基于 BERT 的中文情感分析,结果出乎意料的好。请记住,非拉丁语言(如中文和朝鲜语)是字符标记化,而不是单词标记化。请随意在不同种类的数据集上尝试其他模型。感谢您的阅读,祝您有美好的一天。下篇再见!
- 优化和导出在线服务 BERT 模型的 3 种方法
- 【https://arxiv.org/abs/1810.04805
- https://github.com/google-research/bert
- https://gist . github . com/geo yi/d 9 fab 4 f 609 e 9 f 75941946 be 45000632 b
- https://gluebenchmark.com/tasks
- https://github . com/Google-research/Bert/blob/master/run _ classifier . py
- https://MC . ai/a-guide-to-simple-text-class ification-with-Bert/
- https://appliedmachinehlearning . blog/2019/03/04/stat-of-art-text-classification-using-Bert-model-predict-the-happy-hackere earth-challenge/
原文:https://towardsdatascience.com/beginners-guide-to-building-neural-networks-in-tensorflow-dab7a09b941d?source=collection_archive———12———————–
如果你正在阅读这篇文章,你可能已经对神经网络和张量流有所了解,但你可能会对与深度学习相关的各种术语感到有些畏惧,这些术语在许多技术介绍中往往被掩盖或无法解释。本文将通过深入演练 TensorFlow 2.0 的初学者教程来阐明其中的一些主题。
这个指南是基于 TensorFlow 2.0 初学者笔记本的,我推荐看一看它并在 Google Colab 中运行它(它只有 16 行代码!)来最大化你对这里所涵盖的材料的理解。
注意:鉴于这是一个初学者指南,这里表达的大多数观点应该有一个较低的入门门槛,但是对什么是神经网络有一些背景知识将是有帮助的。这篇文章提供了一个很好的概述,以防你想温习一下。
阅读本文后,您将对一些关键的概念性主题以及这些主题的 TensorFlow/Keras 实现有更好的理解(Keras 是一个基于 TensorFlow 构建的深度学习库)。
概念性:
- 神经网络层形状
- 激活功能(如 Relu 和 Softmax)
- 逻辑
- 拒绝传统社会的人
- 优化者
- 失败
- 纪元
张量流/Keras 函数:
- tf.keras.layers.Sequential()
- tf.keras.layers.Flatten()
- tf.keras.layers.Dense()
- 模型.编译()
- model.fit()
TensorFlow 2.0 初学者教程使用的数据是 MNIST 数据集,它被认为是一种“你好,世界!”用于神经网络和深度学习,并且可以直接从 Keras 下载。它是一个数据集,充满了从 0 到 9 的手绘数字,并有相应的标签来描述绘图应该描绘的数字。
Example observations from MNIST dataset [1]
使用这个数据集背后的想法是,我们希望能够训练一个模型,该模型能够学习哪种形状对应于数字 0-9,并随后能够正确标记它尚未训练过的图像。当将如下图所示的图像传递给模型时,这项任务变得更加复杂。有些人甚至会把这张图误认为是零,尽管它被标为八。
Example an ambiguous image from MNIST (index 3570 of training set)
在高层次上,初学者教程中构建的模型将训练图像作为输入,并尝试将这些图像分类为 0-9 之间的数字。如果它做出了不正确的预测,它将进行数学调整,以更好地预测类似的图像。一旦模型完成训练,它将在没有训练过的图像上进行测试,以获得模型表现如何的最终评估。
Basic structure of the neural net built in the beginner notebook
现在让我们深入探讨一下 TensorFlow 是如何实现这个基本的神经网络的。
在第一个单元格中完成一些设置后,笔记本开始使用其函数从 Keras 库中加载 MNIST 数据集,该函数返回两个元组,如代码所示。文档可以在这里找到。
当我们探究 TensorFlow 如何处理这些数据时,理解这些数据的实际情况会很有帮助。
查看这些结果,我们可以看到数据集中总共有 70k 个图像,60k 个训练和 10k 个测试。两个 28 表示每个图像是 28 像素乘 28 像素,并且图像被表示为填充有像素值的 28×28 阵列,如在下面的可视化中可以看到的。
Depiction of how each image is stored in the MNIST dataset
笔记本电脑准备数据的最后一步是将每个图像中的每个像素值转换为 0.0-1.0 之间的浮点数。这样做是为了帮助在为每幅图像生成预测时所涉及的数学比例。
也许这个笔记本最令人困惑的部分是创建模型结构的部分。
这个代码的目的是指定什么样的层将出现在我们的神经网络中。第一部分是调用。这个函数所做的就是开始创建层的线性(或“顺序”)排列。上述代码片段中的所有其他代码详细说明了模型中的层以及它们的排列方式。
下一行代码创建了我们网络的第一层。直观地说,我们希望能够使用图像中的所有信息来预测它是什么数字,因此输入层应该为图像中的每个像素提供一个节点。每个图像有 2828 =784 个值,因此创建了一个有 784 个节点的层,包含给定图像的每个像素值。如果我们有每个像素包含 3 个值(RGB 值)的彩色图像,那么将创建一个 2828*3 = 2352 个节点的层。
我们在模型中看到的另一种层是使用创建的,它创建了所谓的全连接或密集连接层。这可以与稀疏连接层进行比较,区别在于信息如何在相邻层的节点之间传递。
Comparison between dense and sparse connectivity (image from Amir Alavi’s blog)
您可以看到,在密集连接的层中,一层中的每个节点都连接到下一层中的每个节点,而在稀疏连接的层中,情况并非如此。因此所做的是创建一个完全连接到它前面的层的层。第一个参数(第一个实例中为 128)指定层中应该有多少个节点。隐藏层(不是输入或输出层的层)中的节点数量有些随意,但需要注意的一点是,输出层的节点数量等于模型试图预测的类的数量。在这种情况下,模型试图预测 10 个不同的数字,因此模型中的最后一层有 10 个节点。这是至关重要的,因为最终层的每个节点的输出将是给定图像是特定数字的概率。
为了理解这个片段中的其余代码,我们需要理解激活函数和 dropout。
激活功能
尽管神经网络的布局和结构很重要,但最好记住,在一天结束时,神经网络所做的是大量的数学运算。每个节点获取前一层中节点的值,并计算它们的加权和,产生一个称为 logit 的标量值。就像人类大脑中的神经元在受到某些输入的刺激时如何“激发”,我们必须指定网络中的每个节点(有时也称为神经元)在受到某些输入时如何“激发”。这就是激活函数的作用。它们取 logits,即上述加权和的结果,并根据正在使用的功能将它们转换为“激活”。
一个常见的激活函数,也是我们网络中第一个层使用的激活函数,称为“ReLU”,是整流线性单元的缩写。
ReLU activation function
ReLU 所做的是激活任何负逻辑 0(节点不触发),同时保持任何正逻辑不变(节点触发的强度与输入的强度成线性比例)。要了解更多关于 ReLU 的能力以及它为什么有用的信息,请查看本文。
另一个常见的激活函数,也是在的第二个实例中使用的函数,称为“softmax”。
Udacity Deep Learning slide on softmax
如上图所示,softmax 采用前一层激活的加权和计算出的逻辑值,并将它们转换为总和为 1.0 的概率。这使得它成为在我们的输出层中使用的一个非常有用的激活函数,因为它为图像是特定数字的可能性提供了易于解释的结果。
有许多其他的激活功能,决定使用哪一个通常是一个实验或启发式判断(或两者兼有)的问题。其他一些激活功能的概述可以在这里找到(如果你不理解为什么激活功能首先是必要的,我推荐你读一读)。
辍学
到目前为止,我们检查的代码片段中最后一个无法解释的部分是对的调用。dropout 的概念可以追溯到之前对层的连通性的讨论,并且与密集连接的层的一些缺点有关。密集连接层的一个缺点是,它可能导致计算非常昂贵的神经网络。随着每个节点向下一层中的每个其他节点发送信息,在每个节点中计算的加权和的复杂度随着每层中节点的数量而指数增加。另一个缺点是,随着如此多的信息从一层传递到另一层,模型可能会过度适应训练数据,最终影响性能。
这就是辍学的原因。Dropout 使得给定层中的一些节点不会将其信息传递给下一层。这有助于计算时间和过度拟合。所以在初学者笔记本中,两个层之间的调用使得第一个层中的每个节点有 0.2 的概率从下一层的激活计算中被丢弃。您可能已经意识到,这实际上使模型中的输出层成为了一个稀疏连接的层。
Srivastava, Nitish, et al. ”Dropout: a simple way to prevent neural networks from
overfitting”, JMLR 2014
既然我们已经理解了模型的所有组件,让我们利用函数,对我们的网络结构进行一次健全性检查。
在仔细检查了输出形状之后,一切看起来都很好,所以现在让我们继续编译、训练和运行模型吧!
现在我们已经指定了我们的神经网络的样子,下一步是告诉 Tensorflow 如何训练它。
编译模型
我们将在本节中检查的代码片段如下:
在一个预先构建的模型上调用函数,它指定了*损失函数、优化器和度量标准,*每一个都将被解释。这些是神经网络如何产生其最终预测的重要特征。
损失函数 在本指南的开头,提到了在一个高层次上,初学者笔记本中建立的模型将学习如何将某些图像分类为数字,它通过进行预测来做到这一点,查看其预测与正确答案的差距,然后更新自身以更好地预测这些类型的数字。损失函数是模型的一部分,用于量化预测与正确答案的差距。不同类型的模型需要不同类型的损失函数。例如,像这样一个问题的损失函数,其中我们的模型的输出是概率,必须与试图预测美元价格的模型的损失函数非常不同。这个特定模型的损失函数是“稀疏分类交叉熵”,这对于像这样的多类分类问题是很好的。在我们的例子中,如果模型预测一个图像只有很小的概率成为它的实际标签,这将导致很高的损失。
优化器
另一种表达训练一个模型实际意义的方式是,它寻求最小化损失。如果损失是预测与正确答案相差多远的度量,并且更高的损失意味着更不正确的预测,则寻求最小化损失是确定模型表现如何的可量化方式。如前所述,训练神经网络的一个关键部分是根据这些参数在图像分类中的有效性来修改网络节点的数学参数。在称为反向传播的过程中,神经网络使用称为梯度下降的数学工具来更新参数以改进模型。这些术语的细节在一定程度上超出了本指南的范围,但是为了理解初学者笔记本正在做什么,函数的优化器参数指定了一种使反向传播过程更快更有效的方法。“adam”优化器是一种常用的优化器,可以很好地解决这个问题。
指标
函数的最后一部分是指定在评估模型时应该使用的指标。准确性是一个有用的,但不完美的度量标准,用于衡量模型性能,它本身应该谨慎使用(关于为什么是这样以及其他一些潜在的度量标准,您可以看看这篇文章)。
最后是实际训练模型,使用 TensorFlow 2.0,这很容易做到。
这行代码非常直观,传递训练数据和该数据的正确标签。函数中的 epoch 参数是模型看到所有训练数据的次数。我们希望模型多次查看所有定型数据的原因是,在计算加权和以显著提高预测能力时,一次遍历可能不足以让模型充分更新其权重。
Results from training the model with 5 epochs
运行这段代码,您可以看到在每个时期,模型都遍历了训练集中的所有 60k 个图像。您还可以看到,随着每个时期,损失会减少,准确性会提高,这意味着该模型在每个时期对数字进行分类的能力会越来越强。
最后,使用,我们可以预测我们的测试集的类,看看我们的模型表现如何。
该图显示,尽管训练准确度随着我们训练的时期越多而不断上升,但验证准确度开始趋于平稳或下降,这表明我们可能不需要训练超过 5 个时期。
Confusion matrix for our neural net
为了更详细地评估模型的表现,我们可以构建一个混淆矩阵。从这个混淆矩阵中我们可以看出,我们的模型最难处理 9,并且容易将它们与 7、4 或 3 混淆。
恭喜你!您已经完成了 TensorFlow 2.0 初学者笔记本指南,现在对神经网络层、激活函数、逻辑、下降、优化、损失函数和损失以及纪元的形状有了更好的理解。您还熟悉了如何使用 TensorFlow/Keras 实现这些概念!对于更多的实践,我建议尝试本指南中讨论的不同参数,看看它们对模型性能有什么影响。快乐造型!
原文:https://towardsdatascience.com/beginners-guide-to-create-first-end-to-end-machine-learning-pipeline-in-pyspark-d3df25a08dfd?source=collection_archive———12———————–
Photo by AbsolutVision on Unsplash
当我意识到我的训练集包括每天超过 1000 万行时,我首先想到的是子采样。然而,当我开始二次采样时,我发现在这个过程中很难不产生任何偏差。这时候我想到了用 Spark 建立一个没有二次采样的模型。
我以为 spark 里不会有太多建模选择,Spark 机器学习包也不会像 sklearn 那么强大和用户友好。然而令我惊讶的是,我很容易就在 Spark 中找到了我需要的一切。我在mmlspark(micro fot 开发的 spark 开源包)里找到了我想用的模型 lightgbm 我从 spark MLlib 包中找到了非常详细的特性工程和管道函数。
然而,建立我的第一个端到端培训渠道并不容易。Spark 还没有像 Python 那样广泛用于机器学习,因此它的社区支持有时是有限的,有用的信息非常分散,并且没有好的初学者指南来帮助澄清常见的困惑。因此,在这篇文章中,我将列出一些基本概念,分享我在旅途中学到的经验,并列出一些我认为有用的资源。
Python 代码与函数: Python 代码与 Python 对象(列表、字典、pandas 数据类型、numpy 数据类型等)一起工作。)在 PySpark 中是可执行的,但是他们根本不会从 Spark 中受益(即分布式计算)。
Python 代码不能应用于 Spark 对象(RDD、Spark 数据集、Spark 数据帧等)。)虽然直接。如果需要,这样的代码可以变成 UDF(用户定义函数)应用于每一行 Spark 对象(就像中的)。这篇博客很好地解释了 UDF,还有来自这本数据手册的代码示例。
PySpark 代码及功能: PySpark 代码只能应用于 spark 对象。它们在应用于 Python 对象时不起作用。
python 和 PySpark 对象转换: 当 Python 对象足够小以适合驱动程序的内存时,可以将一些(但不是全部)Python 对象(例如熊猫数据帧)转换成 Spark 对象(例如 spark 数据帧),反之亦然。
起初让我非常困惑的是,当检查文档时,你会看到 MLlib 被用作机器学习库的名称,但所有的代码示例都是从导入的。事实上,spark.mllib 和 spark.ml 都是 spark 的机器学习库:spark.mllib 是与 RDD 一起工作的旧库,而 spark.ml 是围绕 spark 数据框架构建的新 API。根据 spark 的公告,位于 RDD 的 API 从 Spark 2.0.0 开始进入维护模式。这意味着不会有新的特性添加到中,在达到特性对等之后,基于 RDD 的 API 将被弃用;预计将在 Spark 3.0 中移除。简而言之,尽可能使用,不要使用。
spark 的机器学习库包含了很多业界广泛使用的算法,如广义线性模型、随机森林、梯度提升树等。支持算法的完整列表可以在这里找到。
还有开源库mmspark。它提供了 Spark 机器学习管道与微软认知工具包(CNTK)、LightGBM 和 OpenCV 的无缝集成。不幸的是,PySpark 不支持另一个非常流行的培训框架 xgboost。即使有 XGBoost4J-Spark 在 Spark 上集成了 xgboost frame,但是还没有开发出 Python API。
如前所述,从技术上来说,如果训练数据适合驱动程序内存,可以导入 python xgboost 或 lightgbm 模块,并在 PySpark 中的 pandas 数据帧上应用训练函数。然而,这种方法根本不会从 Spark 中受益(即训练将在单台机器上进行,而不是像没有 Spark 一样分布在多台机器上)。
令我惊讶的是,随机森林和梯度增强树的集合模型不能为 max_depth 参数取超过 30 的值。随着 max_depth 的增加,训练时间也呈指数增长。用我的训练集,训练一个 20 深度的随机森林需要 1 个小时,一个 30 深度的需要 8 个小时。在我看来,随机森林的浅树是一个问题,因为当训练数据很大时,深的个体树能够找到不同的“规则”,这种多样性应该有助于性能。
在训练期间为执行者分配足够的内存是很重要的,花时间调优核心数、执行者数和执行者内存也是值得的。我的一次训练运行在 10 分钟内完成,资源分配正确,而我第一次开始调优资源分配时需要 2 个小时。
大多数(如果不是全部的话)spark 模型都将由两列组成的数据框架(特征和标签)作为输入。特征列是所有串联的特征值的列表。 VecorAssembler 就是做这件事的函数,应该始终作为特征工程的最后一步。这里有一个在建模管道中使用它的例子。
当搜索你需要的东西时,谷歌当然是第一选择,但是我发现浏览 Spark 文档寻找功能也很有帮助。重要的是要参考正确的 Spark 版本(上面的链接是版本 2.4.3)。
Spark MLlib 文档已经有很多代码示例,但是我发现 Databrick 的用于机器学习的笔记本文档甚至更好。这个笔记本走过一个分类训练管道,这个笔记本演示参数调整和 mlflow 进行跟踪。创建这些笔记本是为了解释如何在数据块中使用各种 Spark MLlib 功能,但这些笔记本中展示的许多功能并不是专门针对数据块的。
Apache Spark 维基百科非常好地总结了重要的 Spark 模块。当我第一次阅读它的时候,我并没有得到太多的东西,但是在对 spark 有了一些了解之后,我逐渐喜欢上了这个页面,因为它提供了对 Apache Spark 非常好的全面介绍。
我也非常喜欢 DataBrick 的 Spark 介绍页面上的“Apache Spark 生态系统”部分。这和维基百科页面上的信息很像。阅读这两本书让我对 Spark 生态系统有了更深入的了解。
Spache Spark Ecosystem
与 python 相比,pyspark 的社区支持较少,尤其是在机器学习任务方面。除了 mmlspark,我也没有找到多少 pyspark 的开源开发。然而,谈到大数据,spark 是一个非常强大的工具:我能够在 Spark 中训练一个 lightgbm 模型,在 10 分钟内有大约 20 万行和大约 100 个特征。当然,运行时在很大程度上取决于模型参数,但是它展示了 Spark 的强大功能。
原文:https://towardsdatascience.com/beginners-guide-to-creating-an-svd-recommender-system-1fd7326d1f65?source=collection_archive———5———————–
Photo by freestocks on Unsplash
有没有登录网飞,看到他们建议你看重力如果你昨晚看了星际?或者在亚马逊上买了东西,看到他们向我们推荐我们可能感兴趣的产品?或者有没有想过在线广告公司是如何根据我们的浏览习惯向我们展示广告的?这一切都归结于一种叫做推荐系统的东西,它可以根据我们和其他人与产品的互动历史来预测我们可能感兴趣的东西。
正如我所承诺的,我们会做一个推荐系统。为了让你不要自我感觉不好,我们也会做一个很酷的。我们将使用 SVD(奇异向量分解)技术进行协同过滤;这比基本的基于内容的推荐系统高出一个档次。
协同过滤捕捉志同道合的用户的潜在兴趣模式,并使用相似用户的选择和偏好来建议新项目。
所以让我们开始吧。所以我们需要的东西列在下面。如果你正在阅读这篇文章,你很可能知道并且已经拥有了这些。
1.python >= 2.7
2。熊猫> = 0.17
3。numpy
4。scipy
对于不了解的人来说,熊猫、numpy 和 scipy 是 python 包。这些将使我们的生活变得容易。您可以使用 pip 从终端或命令提示符安装它们。如果你不知道怎么做,谷歌一下。例如,下面的命令安装 pandas 包。
我们肯定需要一个数据集来处理。我们将使用著名的 Movielens 数据集来制作我们的推荐系统。前往 http://grouplens.org/datasets/movielens/下载电影镜头 100k 数据集。
该数据集包含不同用户对不同电影的大约 100,000 个评级。让我们来探索数据集。创建一个新脚本exploration . py并添加以下代码块。注意:这里我们将使用单独的脚本,但是你也可以使用一个单独的 iPython 笔记本,这要方便得多。
这就对了。您将看到数据集中有 718 个用户和 8915 部电影。
我们可以在数据集上使用正常的随机训练测试分割。但是既然我们有可用的时间戳,让我们做一些更好的事情。让我们创建一个新的脚本 workspace.py 来完成我们所有的工作。在开头添加以下代码。
这样做的目的是,根据给出这些评级时的时间戳,我们对数据进行排序,以将最近的评级保持在底部,并从底部开始从每个用户中抽取 20%的评级作为测试集。因此,我们没有随机选择,而是将最近的评分作为测试集。从推荐者的目标是基于类似产品的历史评级来对未来未遇到的产品进行评级的意义上来说,这更合乎逻辑。
当前形式的数据集对我们没有用。为了将数据用于推荐引擎,我们需要将数据集转换成一种叫做效用矩阵的形式。我们在新的脚本中创建一个函数。将其命名为 recsys.py 。我们将使用这个脚本中的函数来处理我们的训练和测试集。
作为一个参数,我们传递一个字典,该字典存储我们也传递的数据集“数据”的每一列的键值对。从数据集中,我们将看到每个对应字段的列号或列名,键’T12 用户’’ T14]的列【T6]userId或列 0 ,列 movieId 或键 ’ *项’*和列
效用矩阵只不过是一个 2D 矩阵,其中一个轴属于用户,另一个轴属于项目(在这种情况下是电影)。所以矩阵的 (i,j) 位置的值将是用户 i 给电影 j 的评分。
让我们举一个例子来更清楚一点。假设我们有 5 个评级的数据集。
如果我们通过下面描述的函数传递这个数据集,它将返回一个这样的效用矩阵,以及 user_index 和 item_index 的辅助字典,如下所示。
现在来看看功能。
SVD 是奇异向量分解。它所做的是将一个矩阵分解成对应于每行和每列的特征向量的组成数组。我们再给 recsys.py 添加一个函数。它将从“ create_utility_matrix 和参数“ k ”获取输出,该参数是每个用户和电影将被分解成的特征的数量。
奇异值分解技术是由 Brandyn Webb 引入推荐系统领域的,在 Netflix 奖挑战赛期间,Brandyn Webb 以 【西蒙·芬克】 而闻名。这里我们不做 Funk 的 SVD 迭代版本,而是使用 numpy 的 SVD 实现所提供的任何东西。
回到 workspace.py 我们将使用上面的函数。我们将找出使用真实评级的测试集的预测评级的均方根误差。除了创建一个函数,我们还将创建一个列表来保存不同数量的特性,这将有助于我们将来进行分析。
对于 test_size = 0.2 ,RMSE 分数大约为 0.96
对于 100k 的电影来说,这是一个适中的分数。稍微调整一下,你也许能超过 0.945。但这取决于你。
如果你喜欢这篇文章,请告诉我!这里有三个链接供你参考:
- (SVD 的完整代码以及其他著名 RecSys 算法的实现)
- https://papers with code . com/sota/collaborative-filtering-on-movie lens-100k(关于 Movielens100k 的最新成果。这些在官方测试集上得到验证)
- https://sifter.org/~simon/journal/20061211.html(西蒙·芬克最著名的博客详述了他的奇异值分解方法)
原文:https://towardsdatascience.com/beginners-guide-to-jupyter-notebook-8bb85b85085?source=collection_archive———13———————–
Photo by Evgeni Tcherkasski on Unsplash
欢迎来到这个 Jupyter 笔记本初学者指南!在本教程中,我们将介绍使用 Jupyter Notebook 执行描述性统计的基础知识,重点是帮助刚接触编码的高中(或以上)学生。
Jupyter Notebook 是一个强大的数据科学工具,允许您创建和共享包含实时代码、等式、可视化和叙述性文本的文档。它是一个开源的 web 应用程序,支持 100 多种编程语言,包括在数据科学中广泛使用的流行语言 Python。
Jupyter Notebook 是一个开源的 web 应用程序,允许您创建和共享包含实时代码、公式、可视化和叙述性文本的文档。—来自项目 Jupyter
在本教程中,我们将使用 Python 来演示如何使用 Jupyter Notebook 进行描述性统计。如果您是 Python 新手,请不要担心!我们将提供所有必要的解释和示例来帮助您开始。在本教程结束时,您将对如何使用 Jupyter Notebook 有更好的理解,并在成为一名熟练的数据科学家的道路上前进。
这里可以看到的原图。
我制作了一个 Jupyer 幻灯片,你可以在这里下载。你需要安装 RISE 才能使用这个幻灯片。
我们要用 Python 库, Numpy , Pandas , Matplotlib 和 Seaborn 。Python 库是函数和方法的集合,允许您在不编写代码的情况下执行许多操作。
我们将安装 Anaconda。Anaconda 是 Python 数据科学的标准平台。Anaconda 将为我们安装所有必需的包。
从https://www.anaconda.com/distribution/,下载 3.7 版本并安装。
安装 Anaconda 之后,启动 Anaconda-Navigator。
新闻发布 Jupyter 笔记本。它将启动一个终端并打开一个浏览器。
要创建文件夹,请单击右上角的“新建”按钮。然后单击文件夹。
您需要将文件夹重命名为 Statistics。
创建一个名为 Data 的文件夹,我们将把所有数据存储在这个文件夹中。
在 Data 文件夹中,创建一个名为 mydata1.csv 的文本文件。
在浏览器中打开http://bit.ly/2M1yrW7。Command(或 windows 中的 ctrl)+A 选择全部,Command + C 复制。Command + V 将其粘贴到 mydata1.csv,Command + S 保存该文件。
在 Statistics 文件夹中,创建名为 Test by New > Python 3 的文件。
这就是全部的设置。让我们开始写一些代码。
[## Jupyter 用户的生产力提示
使用 Jupyter 笔记本和 JupyterLab 让您的工作流程更加高效
towardsdatascience.com](/stepping-into-intermediate-with-jupyter-f6647aeb1184)
按下切换键盘快捷键屏幕。你可以通过按??f.看到所有的命令。我经常使用下面的快捷键,如果你能记住它们会很有用。
Numpy 和 Pandas 是科学计算、数据科学和机器学习中使用最多的两个库。熊猫建在 Numpy 的上面。两者都提供相似的功能。Numpy 为多维数组提供了对象,Pandas 提供了内存中的 2D 表对象 DataFrame。
Python 提供了各种用于绘制数据的包。Seaborn 和 Matplotlib 是 Python 最强大的两个可视化库。
使用导入一个库。我们使用来内联显示图形。请在我们的测试文件中写入/复制以下内容。
键入以上内容后,按 SHIFT + RETURN。这将运行您编写的代码。如果你写对了,什么都不会发生。但是如果你拼错了,它会返回一个错误。请阅读错误的最后一行并解决问题。
你可以在网上找到很多资源。这是数据源的集合。CSV 文件是逗号分隔值文件,是最容易处理的文件。大多数数据源都提供了一个 CSV 文件。从列表中找出几个你感兴趣的数据。把它们下载到你的硬盘上。
我们将读取 CSV 文件并将数据存储在一个名为 df 的变量中。请在下一个单元格中写下以下内容。
请不要忘记按 SHIFT + RETURN。
我们将使用、、、、来查看我们的数据概览。
我们使用来打印我们数据的尺寸。打印数据的简明摘要。按 SHIFT + RETURN 运行程序。
它打印出(569,33)。
默认打印前 5 行数据。如果想返回前 10 行,使用。
默认打印最后 5 行数据。可以使用任意数字作为。
对于统计概览,打印平均值、标准差、最小值等。
首先,我们导入样本数据。、不适用、不适用和无数据。我们使用“isnull()”检查数据帧是否有任何空值。如果有任何空值,则按列输出。
请注意,NaN 将替换没有数据的数据项。
比较前两个表,?和 na 不被识别为空。因此,我们需要使用“na_values”来将它们识别为空值。这就要换 NAN 了。
[## 手把手的 Jupyter 笔记本黑客
您应该使用的技巧、提示和快捷方式
towardsdatascience.com](/hands-on-jupyter-notebook-hacks-f59f313df12b)
处理空值的一种方法是删除行或列。的默认值为。所以和输出同一个表。这将删除所有包含空值的行。
` axis=1 '将删除列中有 NaN 的列。
我们可以用列平均值来填充 NaN 值。下面在每一列中填入 NaN 及其列平均值。
你可以用中间值来填充。
或者任何你认为合适的值。
我们的数据在 col3 下面有一只猫、一只狗和一只狐狸。我们使用“get_dummies()”将分类变量转换为虚拟/指示变量。这将创建包含所有类别的列,并添加 0 或 1。
我们把这些假人和我们的数据连接起来。
我们不再需要 col3,所以我们放弃它。
[## 使用 Jupyter 笔记本进行版本控制
Jupytext 循序渐进指南
towardsdatascience.com](/version-control-with-jupyter-notebook-b9630bc5996e)
除非指定列,,,等。返回所有列的结果。这里我们将只打印。
作为练习,可以打印、吗?
让我们关注数据中的。我们设置了一个名为的变量。
我们找到的最大值、最小值和范围。
print 命令在括号内打印输出。三个打印一个小数位,将替换为最大、最小和范围。你可以在这篇文章中找到更多细节。
让我们找出平均值、中间值和众数。
的默认值为 0.5,与中值或 50%平铺相同。您可以指定百分位数,。
熊猫的默认画线图。可以用条形图、历史图、方框图、饼图等设置参数。
上图是的线图。
通过将加到上,可以绘制直方图。
通过在后添加也可以打印直方图。
您可以添加以使用 100 个直方图仓。
或显示了一个盒须图。
Matplotlib 有很大的灵活性。在这里,您可以更改异常值的颜色和符号,并一起显示三个方框图。
Matplotlib 的直方图有很大的灵活性。您可以添加不同的参数。
Seaborn 构建在 Matplotlib 之上,并引入了额外的绘图类型。这也让你的传统 Matplotlib 图看起来更漂亮。(来自 Quora )
通过 成为 会员,获得媒体上所有故事的访问权限。
https://blog.codewithshin.com/subscribe
[## 用 Jupyter 笔记本写作的 7 个基本技巧
第一篇数据科学文章指南
towardsdatascience.com](/7-essential-tips-for-writing-with-jupyter-notebook-60972a1a8901) [## 建模功能
从线性回归到逻辑回归
towardsdatascience.com](/modeling-functions-78704936477a)
[## Jupyter 的教与学
这本手册是为任何教育工作者教学的主题,包括数据分析或计算,以支持…
jupyter4edu.github.io](https://jupyter4edu.github.io/jupyter-edu-book/) [## Boxplot 演示- Matplotlib 3.1.1 文档
示例 boxplot 代码伪造了更多的数据,使得二维数组只有在所有列长度相同的情况下才有效。如果…
matplotlib.org](https://matplotlib.org/3.1.1/gallery/pyplots/boxplot_demo_pyplot.html#sphx-glr-gallery-pyplots-boxplot-demo-pyplot-py) [## Jupyter 的技巧和窍门
Jupyter 技巧和提示的集合
medium.com](https://medium.com/series/jupyter-hacks-and-tips-1b1a3a10bc79)