数据科学家的 13 份重要简讯:重制
你会想要这种数据科学和人工智能为重点的内容
Source: Unsplash
如果你和我一样,你会订阅时事通讯。很多时事通讯。就像,太多的时事通讯。我控制不住自己。如果做得好,时事通讯是一种很好的内容管理形式,可以帮助你用最少的努力向你传递有趣和有见地的信息。幸运的是,数据通讯也不例外。
在这篇文章中,我将概述为什么我认为时事通讯是数据科学持续发展的一个如此棒的工具。更重要的是,我会列出我一周中最期待的数据科学和人工智能时事通讯。
同样值得注意的是,这篇文章是由之前的一篇文章翻拍而来的。更具体地说,我增加了更多的时事通讯,用一个小广告详细阐述了每一篇,并清理了一些结构性的东西。
为什么是时事通讯?
回顾一下当我开始数据科学的时候,我做的第一件也是最有价值的事情之一就是寻找大量的数据简讯。这迫使我时刻关注不断变化的数据科学领域的最新消息。
它帮助我学习技巧和技术,向我介绍新的概念和学习资源,否则我不会知道,并在有网络机会、公开技术讲座和工作机会时通知我。最重要的是,它每周都会这样做。
在我们当前充斥着点击诱饵标题和假新闻的世界里,持续交付的内容监管是无价的。外面的信息量太大了。时事通讯通过为你区分信号和噪音来帮助解决这个问题。当别人乐意为你做的时候,为什么要花时间从成千上万的帖子中筛选出最好的呢?
下面收集的新闻通讯就是一个很好的例子。从数据科学到机器学习再到人工智能,这些内容策展人提供的链接可以作为一名数据科学家的持续发展的游戏规则改变者。
那么让我们进入列表,排名不分先后。
Source: Unsplash
名单
数据科学周刊
《数据科学周刊》绝对是粉丝的最爱,这是有原因的。该时事通讯始于 2013 年,自那以来已经连续出版了 276 期。它从一个编辑器选择部分开始,然后快速移动到列出一堆数据科学文章和视频。此外,它还包括一个职位空缺、教程和书籍的部分。每周四发送,这封信非常值得你花时间。查看最近一期的。
奥雷利数据通讯
你可能以这样或那样的方式听说过奥赖利媒体。就我个人而言,我的书桌上一直放着他们的藏书。他们还出版电子书,主持会议,并提供其他学习解决方案。他们专注于数据的时事通讯每周提供 10 个链接,从新闻到教程到白皮书。
数据药剂
Data Elixir 采用了类似的方法,将事情分解为广泛的每周新闻、见解、工具和技术、资源和数据可视化的集合。这份简讯发给 29,000 多名订户,每周二发送。查看最近的一期。
数据玛奇纳
《数据玛奇纳》是一份技术性更强的时事通讯,按技术细分链接,涉及从 R 到区块链到算法的主题。这里真的什么都有一点。我订阅免费版,每两周发送一次,但是如果你愿意的话,你可以付费每周接收一次时事通讯。看看最近的一期。
分析派
Mode 提供了许多企业数据解决方案,但他们每周还会发布一份相当不错的数据简报。他们主要关注社区中吸引他们眼球的文章,但也包括特色数据工作的部分。查看最近一期的。
机器学习
正如你可能已经猜到的,机器学习主要关注人工智能和人工智能新闻。我特别喜欢棒的和不棒的部分,如果你赶时间的话,它们会给出一些小新闻。其他人似乎也很喜欢它,因为该时事通讯拥有 40,000 多名订户。查看最近的一期。
数据科学综述
另一份已经发行了一段时间的时事通讯《数据科学综述》迄今已出版了 177 期,拥有超过 7000 名订户。这份时事通讯采用了更简洁的方法,每周提供 5 个左右的链接,每篇文章都有深刻的反思。查看最近的一期。
黑客新闻文摘
不是数据科学时事通讯本身,但仍然是一个有价值的资源。像大多数科技界人士一样,我喜欢黑客新闻。然而,我很难跟上它,直到我发现了这个。你可以根据每个帖子的投票数来决定发送给你的链接的频率和数量。
卡格尔通迅
这篇时事通讯包含了所有人最喜欢的机器学习竞赛网站 Kaggle 的最新博客文章、采访或新闻。它还包括社区中的链接、资源、聚会和职位空缺。我找不到这一个的订阅链接,非常肯定 Kaggle 自动订阅你当你做一个帐户。
每日更新
Stratechery 的每日更新与其他网站略有不同,因为它是付费的每日会员。这些报告不是传统的数据科学时事通讯,而是专注于技术战略思考。它会让你每月花费 10 美元左右,如果你按年付费的话会少一点。这是少数几个我乐意为书面内容付费的地方之一,媒介是另一个。网站上也有很多免费的文章。查看这篇文章和其他文章,感受一下。
导入 AI
进口人工智能严重依赖技术机器学习和人工智能资源,通常是白皮书和最近的研究成果。这些问题还包括大量的分析。即使这些都不是你喜欢的,也要确保阅读最后的科技故事部分,这是一个永远有趣的未来故事。查看最近的一期。
艾 中的野周
与 Import AI 类似,这份时事通讯涵盖了技术机器学习和 AI 教程、项目、研究论文和新闻。《人工智能中的狂野一周》虽然发布得有些零散,但它已经有超过 17000 名订阅者,如果这能说明它的内容的话。看看最近的一期。
数据是复数
Data Is Plural 每周发布一次,只关注你感兴趣的数据集,供你在下一个副业项目中探索或使用。还有一个非常棒的 Google doc 作为所有这些可追溯到 2015 年的数据集的存档。查看最近一期的。
TDS 每周精选
最后但同样重要的是,的数据科学团队每周和每月都会发布出版物上最受欢迎帖子的摘要。你可以通过接受 TDS 的信件来接收这些电子邮件,如果你去他们主页上的下拉菜单。查看最近一期。
包装
这就结束了我们的列表,至少现在是这样。我会留意更多有价值的数据科学时事通讯。请随意用我可能错过的其他必备数据简讯点亮评论区。
我知道这些简讯在我的数据科学家之旅中给了我巨大的帮助,并在今天继续帮助我成长和提高。我希望他们也能为你提供一些价值。
感谢阅读!请随意查看下面我的一些类似文章,并订阅我的时事通讯中的以接收任何新内容。
你可以在 Medium 上关注我更多类似的帖子,也可以在 Twitter 上找到我。更多关于我和我在做什么,请查看我的网站。
非数学家多臂 Bandit 问题的 13 种解决方案
非数学家(比如我)多臂 bandit 问题的简单解决方案。
GIF from this website
简介
问题很简单,我们有一个有 n 个手臂的老虎机。我们对哪只手臂可以拉的试验次数有限,我们也不知道哪只手臂会给我们最多的钱。
假设概率分布不随时间变化(意味着这是一个平稳问题)…
我们应该拉哪只胳膊?我们应该拉过去给我们最多奖励的那只手臂,还是应该探索,希望得到更好的手臂?
这个问题有多种解决方案,通常,人们衡量后悔是为了给每个解决方案排名。(遗憾==简单地说,我们因为没有拉最佳臂而得到的惩罚量。).因此,为了减少遗憾,我们只需拉起最有可能给我们奖励的手臂。
但我想看看额外的测量,具体来说,我还会考虑每个算法对每个臂的概率分布估计得有多好。(他们给我们奖励的概率)。在更小的范围内,我们只有 12 只手臂,在更大的范围内,我们有 1000 只手臂。
最后,这篇文章的目的是为非数学家(比如我)提供每个解决方案的简单实现。因此,理论保证和证明没有讨论,但我提供了不同的链接,为人们谁希望更深入地研究这个问题。
下面是我们将要比较的方法列表……
1)矢量化
2)贪婪
3)e-贪婪
4)衰变 e-贪婪
5)线性奖励不作为(追踪方法)
6)线性奖励惩罚(追踪方法)
7)置信上限
8)置信上限调谐
9)汤普森采样(贝塔分布)
10)汤普森采样(均匀分布)
11)神经网络
12)玻尔兹曼探索(Softmax)【12】
1.矢量化
请注意,这个方法实际上不是一个解决方案。多臂土匪问题背后的想法是如何在勘探和开发之间取得最佳平衡。
在这里,我们只是计算每只手臂能得到多少奖励,然后除以我们拉每只手臂的次数。(因此直接计算获得奖励的百分比。)
我只是想展示一个简单的方法来估计概率分布。
2. 贪婪
在这里,我们的策略是拉给我们最大回报的手臂。但是,最开始的问题是,我们不知道每个手臂的概率是如何分布的。
所以我决定通过从均匀分布初始化我们的估计分布来给出一些“信息性的”先验。(我猜这可能与“最佳初始化方案”有点关系,但这不是我的意图,在全零之前初始化我们也可以。).
3.贪婪的
类似的概念,贪婪的方法,但有一些概率ε,我们探索和选择一个随机土匪,而不是选择手臂,我们认为有最高的概率。
4.腐败贪婪
与 e-Greedy 方法的想法完全相同,但我们在这里慢慢降低ε。(我们探索的概率)。因此,随着时间的推移,这种方法将完全相同的贪婪方法。
5.线性奖励无为(追求法)
追踪方法背后的一般思想是保持对盗匪的明确策略,并使用经验方法更新它们。开始时,概率分布是统一初始化的(意味着每个手臂都有同等的机会被选中),但随着时间的推移,分布会发生变化。
因为对于追踪方法,估计值被归一化为和为 1,所以为了公平比较,重新调整可能是合适的。
6.线性奖励惩罚(追踪法)
线性奖励惩罚扩展了线性奖励不作为背后的思想,在某种程度上,如果我们没有得到奖励,我们也在惩罚手臂。
对于线性奖励惩罚和不作为,我的朋友迈克尔写了一篇更详细的博文。
7. 置信上限 1
简而言之,UCB 遵循一个简单的原则,即“乐观面对不确定性”。理解这个概念的另一种方式是更喜欢拉得不太频繁的那只手臂,因此我们对那只手臂不太确定。(更多信息请阅读这篇博文或观看这段视频。).
这种方法很有吸引力,因为它有强有力的理论保证。
8.置信上限 1 已调整
在他们提出 UCB1 的同一篇论文中,Auer,Cesa-Bianchi & Fisher 提出了 UCB1-Tuned 算法。有趣的是,这个算法给出了更好的经验结果,但是作者自己不能给出理论上的后悔界限。
9. 【汤普森抽样(贝塔分布)
这种方法是一种贝叶斯推理方法,在这种方法中,我们在每条臂上都有一组先验分布,当我们观察到我们从每条臂获得了多少奖励时,我们就更新我们的后验分布。
10.汤普森抽样(均匀分布)
请注意,这种方法纯粹是为了娱乐。均匀分布不是在伯努利分布到之前的共轭分布。我只是想尝试一下这种方法,总的来说,与贝塔分布相比,均匀分布倾向于探索更多。
11.神经网络
这种方法也是为了娱乐目的,它没有任何理论上的保证。看了这篇博文,很受启发。不同的是,我使用了 KL 散度作为目标函数,并使用了 Adam 优化器。
12. 【玻尔兹曼探索(Softmax)
Softmax 方法以与其平均奖励成比例的概率挑选每只手臂。因此,如果一只手臂给予较大的奖励,它被选中的概率就较高。
与这种方法相关的一个有趣的想法是,我们有一个控制探索程度的温度参数。
13.渐变强盗
梯度土匪使用梯度上升,以找到最佳的手臂拉。简而言之,我们有一个称为平均奖励的变量,它跟踪奖励的平均值,直到某个时间 t。如果我们拉的强盗给出的奖励高于平均值,我们就增加武器被选中的概率,反之亦然。
实验/讨论
执行两组实验
1)小:12 个强盗,20 集,每集 1000 次迭代
2)大:1000 个强盗,500 集,每集 1500 次迭代
小的
左图 →每种方法一段时间后的遗憾
右图 →每种方法一段时间后的累计奖励
当方法的后悔在对数时间内增长时,它被认为是对 bandit 问题的一种解决方案。从上面的图中,我们可以看到 UCB1 优化后的结果是最佳的。
然而,当我们查看地面真实概率分布之间的相关矩阵时,我们可以看到 e-greedy 和 softmax 策略具有一对一的相关性。(向量方法不被认为是一种解决方案。).
大的
从上面可以看到一个非常令人惊讶的结果,我们可以马上注意到简单的方法,如贪婪和衰减贪婪方法能够胜过更先进的解决方案。(取样方法要花很多时间。)
看到神经网络方法表现良好,我感到非常惊讶。
但是当涉及到估计 1000 个臂的概率分布时,我们可以看到 softmax 和 UCB1 方法给出了最精确的估计。
无论是在大型实验还是小型实验中,衰减贪婪方法似乎都是整体最优的解决方案。
交互代码
最后的话
这个简单的问题仍在研究中,因此,存在许多更先进的解决方案,如需进一步阅读,请阅读这篇博文。
从这篇论文中还可以看出,在传统的多臂 bandit 问题中,简单的策略(如 e-greedy 方法)可以胜过更先进的方法,并且在现实生活的临床试验中也能给出有竞争力的结果。
虽然理论上的保证非常重要,但令人惊讶的是,观察到其他更简单的方法也能得到更好的结果。
更多文章请访问我的网站。
参考
- (2019).Www-anw.cs.umass.edu。检索于 2019 年 1 月 13 日,来自http://www-anw . cs . umass . edu/~ barto/courses/cs 687/Chapter % 202 . pdf
- 翁,L. (2018)。多臂土匪问题及其解决方案。lilian Weng . github . io . 2019 年 1 月 13 日检索,来自https://lilian Weng . github . io/lil-log/2018/01/23/the-multi-armed-bandit-problem-and-its-solutions . html
- 用多臂 Bandit 进行强化学习。(2018).ITNEXT。检索于 2019 年 1 月 13 日,来自https://it next . io/reinforcement-learning-with-multi-arm-bandit-decf 442 e 02d 2
- 多臂 Bandit 强化学习(下)。(2018).ITNEXT。检索于 2019 年 1 月 13 日,来自https://it next . io/reinforcement-learning-with-multi-arm-bandit-part-2-831 a 43 f 22 a 47
- ankonzoid/LearningX。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/ankonzoid/learning x/blob/master/classic _ RL/MAB/mab . py
- 迈克尔·帕切科。(2019).Michaelpacheco.net。检索于 2019 年 1 月 13 日,来自https://www.michaelpacheco.net/blog/RL-multi-armed-bandit-2
- 迈克尔·帕切科。(2019).Michaelpacheco.net。检索于 2019 年 1 月 13 日,来自https://www.michaelpacheco.net/blog/RL-multi-armed-bandit-3
- 多武装匪徒。(2013).数据折纸。检索于 2019 年 1 月 13 日,来自https://data origami . net/blogs/nappin-folding/79031811-multi-armed-土匪
- 多臂土匪实现。(2019).peterroelants . github . io . 2019 年 1 月 13 日检索,来自https://peterroelants . github . io/posts/multi-armed-bandit-implementation/
- (2019).Cs.mcgill.ca 检索于 2019 年 1 月 13 日,来自https://www.cs.mcgill.ca/~vkules/bandits.pdf
- 用多臂 Bandit 进行强化学习。(2018).ITNEXT。检索于 2019 年 1 月 13 日,来自https://it next . io/reinforcement-learning-with-multi-arm-bandit-decf 442 e02d 2
- ankonzoid/LearningX。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/ankonzoid/learning x/tree/master/classical _ RL/MAB
- 迈克尔·帕切科。(2019).Michaelpacheco.net。检索于 2019 年 1 月 13 日,来自 https://www.michaelpacheco.net/blog/RL-multi-armed-bandit-3
- 试用编辑器 3.6 版(2019)。W3schools.com。检索于 2019 年 1 月 13 日,来自https://www.w3schools.com/html/tryit.asp?filename = try html _ lists _ intro
- bgalbraith/土匪。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/bgalbraith/bottoms/blob/master/bottoms/policy . py
- (2019).Www-anw.cs.umass.edu。检索于 2019 年 1 月 13 日,来自http://www-anw . cs . umass . edu/~ barto/courses/cs 687/Chapter % 202 . pdf
- bgalbraith/土匪。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/bgalbraith/bottoms/blob/master/bottoms/policy . py
- 脱落神经网络(带 ReLU)。(2019).要点。检索于 2019 年 1 月 14 日,来自https://gist.github.com/yusugomori/cf7bce19b8e16d57488a
- NumPy . minimum—NumPy 1.15 版手册。(2019).Docs.scipy.org。检索于 2019 年 1 月 14 日,来自https://docs . scipy . org/doc/numpy-1 . 15 . 1/reference/generated/numpy . minimum . html
- matplotlib.pyplot,h .,& P,B. (2011 年)。如何用 matplotlib.pyplot 改变图例大小.堆栈溢出?检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/7125009/how-to-change-legend-size-with-matplotlib-py plot
- seaborn . heat map-seaborn 0 . 9 . 0 文档。(2019).Seaborn.pydata.org。检索于 2019 年 1 月 14 日,来自https://seaborn.pydata.org/generated/seaborn.heatmap.html
- error,h .,& Cunningham,P. (2015)。热图 Seaborn fmt='d '错误。堆栈溢出。检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/31087613/heat-map-seaborn-fmt-d-error
- 皮奥特博士和洛杉矶大学(2017 年)。pivot 中 seaborn 热图的数据顺序。堆栈溢出。检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/43694368/data-order-in-seaborn-heat map-from-pivot
- 热图公司(2017 年)。自动调整 seaborn 热图中的字体大小。堆栈溢出。检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/33104322/auto-adjust-font-size-in-seaborn-heat map
- (2019).Homes.di.unimi.it 于 2019 年 1 月 14 日检索,来自https://homes.di.unimi.it/~cesabian/Pubblicazioni/ml-02.pdf
- 共轭先验。(2019).En.wikipedia.org。检索于 2019 年 1 月 14 日,来自https://en.wikipedia.org/wiki/Conjugate_prior
- 强盗算法。(2018).强盗算法。检索于 2019 年 1 月 14 日,来自http://banditalgs.com/
深度学习游戏的第 9 名解决方案/方法/旅程:计算机视觉黑客马拉松
由 Analytics Vidhya 主办
Photo by Vidar Nordli-Mathisen on Unsplash
问题陈述
船舶或船只探测在海事安全、渔业管理、海洋污染、国防和海事安全、防止海盗、非法移民等领域具有广泛的应用。
牢记这一点,政府海事和海岸警卫队机构正计划部署基于计算机视觉的自动化系统,以仅从测量船拍摄的图像中识别船舶类型。你被聘为顾问,为这个项目建立一个高效的模型。
需要检测的船只分为以下 5 类:
数据集描述
在训练中有 6252 幅图像,在测试数据中有 2680 幅图像。数据集中的船舶类别及其对应的代码如下-
Categories of ships and their corresponding codes
- 提供了三个文件,即 train.zip、test.csv 和 sample_submission.csv,其结构如下。
Variable Definition
- train.zip 包含对应于训练集和测试集的图像,以及 train.csv 中训练集图像的真实标签
评估指标
本次比赛的评估标准是加权 F1 分数。
公私分离
公共排行榜基于随机选择的 30%的测试图像,而私人排行榜将基于剩余的 70%的测试图像进行评估。
方法
我为这次黑客马拉松的准备工作在它被宣布为计算机视觉黑客马拉松的 3 周前就开始了。我想复习一下深度学习,特别是计算机视觉,所以我在网上搜索了最好的 DL 教程,无意中发现了一个金矿, fastai !
我花了整整 3 周的时间才完成了这 7 节长达 2 小时的课,在我上班的 2 小时通勤时间里,我试图零零碎碎地看着它们,中间的 2 个周末几乎没有练习。
黑客开始-1/3
黑客攻击的第一周是为了更深入地理解fastai
API 中的细微差别。
我从内置的resnet50
架构开始,用预先训练好的ImageNet
权重来训练一个模型,很快就要实验各种内置的resnet
和densenet
模型。在查看了fastai
中可用的各种模型架构的性能后,我决定使用内置的resnet152
和densenet161
架构来构建初始模型。
仔细查看 get_transform 函数后,将默认值改为get_transforms(max_lighting=0.4, max_zoom=1.2, max_warp=0.2, max_rotate=20, xtra_tfms=[flip_lr()]))
。我提交的作品从0.92977
到0.96650
不等。第一周结束时,我轻松进入了前 15 名。
黑客攻击加剧——2/3
在黑客生涯的第二周,我学到了很多,也收获了很多。我正在浏览 2018 年fastai
课程的讲义,了解了TTA, lr_find()
和learn.recorder.plot(suggestion=True)
功能以及渐进式图像大小调整技术,令人惊讶的是,这些在 2019 年版本的课程中没有涉及。使用这些新技巧,我可以获得一个最好的0.974822
分数的densenet161
模型。
我意识到我们可以使用这个伟大系列中预先训练好的模特,fastai
中的https://github.com/Cadene/pretrained-models.pytorch,并使用这个教程来了解fastai
模特的头部和身体结构。但是当我想使用模型架构,比如使用 Kaggle 内核的senet154, se_resnet152, polynet
时,我就用完了 GPU 内存。了解了learn.to_fp16()
技巧,但它在 Kaggle 内核的 Tesla K80 上没有用,因为它没有张量内核来利用混合精度训练。
我决定创建一个 GCP 账户,使用更快的具有张量核的 GPU Tesla V100,并遵循这个教程。处理 GPU 配额增加请求大约需要 3 个小时。我在混合精度训练的帮助下运行了senet154, se_resnet152
模型。
到现在为止,我有大约 17 个模特,我决定让她们合奏。由于 output category 列中有离散的类,所以我对所有的提交使用了一个简单的模式,mode(df, axis=1)[0]
给出了一个得分0.980409
,帮助我突破了 0.98 分。
到第二周结束时,我已经建立了一个 GCP 环境,可以更快地探索更大的模型,在公共 LB 上排名第八,但几乎已经没有主意了。
黑客高潮——3/3
在比赛的第三周也是最后一周的一个清新的周一早上,在我浏览黑客新闻和数据科学网站的日常工作中,我看到 ImageNet 数据集上有一个新的 SOTA 模型,即 **EfficientNet。**我很快搜索了 Pytorch 的实现,发现了这个惊人的 GitHub repo ,里面有 B0-B3 的预训练模型。我还发现了这篇文章关于英特尔场景分类挑战赛第一名获胜者的方法。
我可以很快意识到我错过了混合增强技术和消除混乱图像的技术,这对于参与者达到最高点非常有帮助。所以在我的代码中加入了这些变化,当我在fastai
文档页面上阅读mixup()
的时候,我了解到了ResizeMethod.SQUISH
的方法,它不是像224*224,
那样将图像居中裁剪成特定的大小,而是将整个图像压缩成所需的大小。然后修剪了训练集中大约 100 幅最容易混淆的图像,并通过添加valid_pct=0.1
来扩大训练集。
下面是我最后的 get_data 函数,
get_data.py
下面是fastai,
中的高效网络 B3 模型
model.py
我用这条代码管道运行了 B0、B1、B2 和 B3 模型,其中 B3 的一个最佳模型在公共 LB 上给出了0.981322
。取了这些模型给出的模式0.98224
。使用resnet152
和densenet161
运行此管道,并使用公共 LB 上给出0.979470
的最佳单 B3 模型来获取这些提交的模式。然后最终提交的让我在公众 LB 排名第五的是到目前为止的 3 个顶级提交的模式,给出的分数是0.988798
。
最终的提交严重超过了公共 LB,把我排在了私人 LB 的第 9 位。我提交的resnet152, densenet161
和efficientnet-b3
模式在私人 LB 上表现最好,本可以让我获得第四名。这里是链接到二等兵 LB。
Best Public and Best Private submissions
然而,这次黑客马拉松对我来说是一次非同寻常的经历。感谢团队 AV 举办了如此精彩的黑客马拉松。希望在 DataHack 峰会 2019 与大家见面。✌️
**更新:**使用 FastAI 训练 EfficientNet 的代码发布此处 。如果你觉得 Kaggle 内核有用,请投上一票。
感谢阅读!如果你喜欢这篇文章,请随时通过 LinkedIn 或 Twitter 联系我。
你应该知道的 15 个 Docker 命令
第 5 部分学会足够有用的 Docker
在这篇文章中,我们将看看你应该知道的 15 个 Docker CLI 命令。如果你还没有,看看这个系列的其余部分,关于 Docker 概念、生态系统、Docker 文件和保持你的图像苗条。在第 6 部分中,我们将使用 Docker 探索数据。我也有一系列关于 Kubernetes 的作品,所以请关注我,确保你不会错过有趣的内容!
大约有十亿个 Docker 命令(大约十亿个)。Docker 文档很广泛,但是当你刚刚开始的时候,会让人不知所措。在本文中,我将重点介绍运行 vanilla Docker 的关键命令。
Fruit theme
冒着让贯穿这些文章的食物隐喻线索走得太远的风险,让我们使用一个水果主题。蔬菜在关于减肥的文章中提供了营养。现在,当我们学习 Docker 命令时,美味的水果会给我们提供营养。
概观
回想一下,Docker 映像是由 Docker 文件+任何必要的依赖项组成的。还记得 Docker 容器是一个栩栩如生的 Docker 图像。要使用 Docker 命令,您首先需要知道您处理的是图像还是容器。
- 码头工人形象要么存在,要么不存在。
- Docker 容器要么存在,要么不存在。
- 现有的 Docker 容器要么正在运行,要么没有运行。
一旦你知道你在做什么,你就能找到合适的命令。
命令共性
以下是关于 Docker 命令需要了解的一些事情:
- Docker CLI 管理命令以
docker
开头,然后是一个空格,然后是管理类别,然后是一个空格,然后是命令。例如,docker container stop
停止一个容器。 - 引用特定容器或映像的命令需要该容器或映像的名称或 id。
例如,docker container run my_app
是构建和运行名为 my_app 的容器的命令。在整个示例中,我将使用名称my_container
来指代通用容器。同样的道理也适用于my_image
、my_tag
等。
我将单独提供这个命令,然后在适用的情况下提供公共标志。前面有两个破折号的旗子是旗子的全名。带有一个破折号的标志是完整标志名称的快捷方式。例如,-p
是--port
旗的简称。
Flags provide options to commands
我们的目标是帮助您记住这些命令和标志,并将本指南作为参考。本指南适用于 Linux 和 Docker 引擎版本 18.09.1 以及 API 版本 1.39 。
首先,我们将看看容器的命令,然后我们将看看图像的命令。卷将在下一篇文章中讨论。这里列出了 15 个需要知道的命令,外加 3 个额外的命令!
容器
使用docker container my_command
create
—从图像创建容器。
start
—启动现有容器。
run
—创建一个新的容器并启动它。
ls
—列出正在运行的容器。
inspect
—查看关于容器的大量信息。
logs
—打印日志。
stop
—优雅地停止运行容器。
kill
—突然停止容器中的主进程。
rm
—删除已停止的集装箱。
形象
使用docker image my_command
build
—建立形象。
push
—将映像推送到远程注册表。
ls
—列出图像。
history
—见中间图像信息。
inspect
—查看大量关于图像的信息,包括图层。
rm
—删除图像。
混杂的
docker version
—列出关于您的 Docker 客户端和服务器版本的信息。
docker login
—登录 Docker 注册表。
docker system prune
—删除所有未使用的容器、未使用的网络和悬挂图像。
容器
集装箱起点
术语创建、启动和运行在日常生活中都有相似的语义。但是每个都是创建和/或启动容器的单独的 Docker 命令。让我们先看看如何创建一个容器。
**docker container create my_repo/my_image:my_tag**
—从图像创建容器。
在本文的其余部分,我将把my_repo/my_image:my_tag
缩短为my_image
。
有很多可能的标志可以传递给create
。
**docker container create -a STDIN my_image**
-a
是--attach
的简称。将容器附加到 STDIN、STDOUT 或 STDERR。
现在我们已经创建了一个容器,让我们开始吧。
**docker container start my_container**
—启动现有容器。
请注意,可以通过容器的 ID 或容器的名称来引用容器。
**docker container start my_container**
Start
现在您已经知道了如何创建和启动容器,让我们转到可能是最常见的 Docker 命令。它将create
和start
合并成一个命令:run
。
**docker container run my_image**
— 创建一个新的容器并启动它。它也有很多选项。我们来看几个。
**docker container run -i -t -p 1000:8000 --rm my_image**
-i
是--interactive
的简称。即使未连接,也保持 STDIN 打开。
-t
是--tty
的简称。分配一个伪终端,它将您的终端与容器的标准输入和标准输出连接起来。
您需要指定-i
和-t
,然后通过终端外壳与容器交互。
-p
是--port
的简称。港口是与外界的接口。1000:8000
将 Docker 端口 8000 映射到机器上的端口 1000。如果你有一个向浏览器输出内容的应用程序,你可以将浏览器导航到localhost:1000
并查看它。
--rm
停止运行时自动删除容器。
再来看一些run
的例子。
**docker container run -it my_image my_command**
sh
是一个可以在运行时指定的命令。sh
将在您的容器内启动一个 shell 会话,您可以通过您的终端与之交互。对于高山图像,sh
比bash
更好,因为高山图像没有安装bash
。键入exit
结束交互式 shell 会话。
请注意,我们将-i
和-t
合并成了-it
。
**docker container run -d my_image**
-d
是--detach
的简称。在后台运行容器。允许您在容器运行时使用终端执行其他命令。
检查容器状态
如果您有正在运行的 Docker 容器,并想知道与哪个容器进行交互,那么您需要列出它们。
**docker container ls**
—列出正在运行的容器。还提供了有关容器的有用信息。
**docker container ls -a -s**
-a
是-all
的简称。列出所有容器(不仅仅是运行中的容器)。
-s
是--size
的简称。列出每个容器的尺寸。
**docker container inspect my_container**
—查看大量关于集装箱的信息。
**docker container logs my_container**
—打印集装箱日志。
Logs. Not sure how virtual logs are related. Maybe via reams of paper?
容器结尾
有时候你需要停止一个正在运行的容器。
**docker container stop my_container**
—正常停止一个或多个正在运行的容器。在关闭容器以完成任何进程之前,默认设置为 10 秒。
或者如果你不耐烦:
**docker container kill my_container**
—突然停止一个或多个正在运行的容器。就像拔掉电视插头一样。大多数情况下首选stop
。
d**ocker container kill $(docker ps -q)**
—杀死所有运行中的容器。
docker kill cockroach
然后,使用以下命令删除容器:
**docker container rm my_container**
—删除一个或多个容器。
**docker container rm $(docker ps -a -q)**
—删除所有未运行的容器。
这是 Docker 容器的八个基本命令。
概括地说,首先创建一个容器。然后,您启动容器。或者把那些步骤和docker run my_container
结合起来。然后,您的应用程序运行。耶!
然后,你用docker stop my_container
停止一个容器。最终你用docker rm my_container
删除容器。
现在,让我们转到神奇的容器生产模具称为图像。
形象
以下是使用 Docker 图像的七个命令。
显影图像
**docker image build -t my_repo/my_image:my_tag .**
—从位于指定路径或 URL 的 Docker 文件构建一个名为 my_image 的 Docker 映像。
-t
是 tag 的简称。告诉 docker 用提供的标签标记图像。在这种情况下我的 _ 标签。
命令末尾的.
(句号)告诉 Docker 根据当前工作目录下的 Dockerfile 构建镜像。
Build it
一旦你建立了一个映像,你想把它push
到一个远程注册表,这样它就可以被共享,并在需要的时候被下载。假设你想使用 Docker Hub ,进入你的浏览器并创建一个账户。它是免费的。😄
下一个命令不是图像命令,但是在这里看到它很有用,所以我会提到它。
**docker login**
—登录 Docker 注册表。出现提示时,输入您的用户名和密码。
Push
**docker image push my_repo/my_image:my_tag**
—将图像推送到注册表。
一旦你有了一些图像,你可能想要检查它们。
检查图像
Inspection time
**docker image ls**
—列出您的图片。也向您显示每个图像的大小。
**docker image history my_image**
—显示图像的中间图像及其大小和创建方式。
**docker image inspect my_image**
—显示图像的大量细节,包括构成图像的图层。
有时你需要清理你的图像。
移除图像
**docker image rm my_image**
—删除指定的图像。如果图像存储在远程存储库中,该图像在那里仍然可用。
**docker image rm $(docker images -a -q)**
—删除所有图像。小心这个!请注意,已经被推送到远程注册中心的图像将被保留——这是注册中心的好处之一。😃
现在你知道最基本的 Docker 图像相关命令。我们将在下一篇文章中讨论与数据相关的命令。
Commands are like fruit — nutritious and delicious. Err. Yeah. — Image by silviarita from Pixabay
混杂的
**docker version**
—列出关于您的 Docker 客户端和服务器版本的信息。
**docker login**
—登录 Docker 注册表。出现提示时,输入您的用户名和密码。
在下一篇文章中出现。推特和红迪网上的读者建议加入这个列表会很好。我同意,所以我在补充。
**docker system prune**
—删除所有未使用的容器、未使用的网络和悬挂图像。
**docker system prune -a --volumes**
-a
是--all
的简称。删除不用的图片,不只是悬空的。
--volumes
移除未使用的卷。我们将在下一篇文章中更多地讨论卷。
2019 年 2 月 7 日更新:管理命令
在 CLI 1.13 中,Docker 引入了经过逻辑分组和一致命名的管理命令名称。旧的命令仍然有效,但是新的命令使 Docker 更容易上手。这篇文章的原始版本列出了老名字。我已经更新了文章,根据读者的建议使用管理命令名。请注意,这一更改只引入了两个命令名的更改——在大多数情况下,这只是意味着在命令中添加了container
或image
。命令的映射是这里是。
包装
如果您刚刚开始使用 Docker,这是三个最重要的命令:
**docker container run my_image**
—创建一个新容器并启动它。你可能需要一些旗子。
**docker image build -t my_repo/my_image:my_tag .**
—建立形象。
**docker image push my_repo/my_image:my_tag**
—将图像推送到远程注册表。
以下是基本 Docker 命令的较大列表:
容器
使用docker container my_command
create
—从图像创建容器。
start
—启动现有的容器。
run
—创建一个新的容器并启动它。
ls
—列出正在运行的容器。
inspect
—查看一个容器的大量信息。
logs
—打印日志。
stop
—优雅地停止运行容器。
kill
—突然停止容器中的主进程。
rm
—删除停止的容器。
形象
使用docker image my_command
build
—建立形象。
push
—将映像推送到远程注册表。
ls
—列出图像。
history
—见中间图像信息。
inspect
—查看图像的大量信息,包括图层。
rm
—删除一幅图像。
混杂的
docker version
—列出关于您的 Docker 客户端和服务器版本的信息。
docker login
—登录一个 Docker 注册表。
docker system prune
—删除所有未使用的容器、未使用的网络和悬挂图像。
要在使用 Docker 时查看 CLI 参考,只需在命令行中输入命令docker
。你可以在这里看到 Docker 文档。
现在你真的可以用 Docker 构建东西了!正如我女儿可能会用表情符号说的:🍒 🥝 🍊 🍋 🍉 🍏 🍎 🍇。我想可以翻译成“酷!”所以去和 Docker 一起玩吧!
如果您错过了本系列的早期文章,请查看它们。这是第一个:
第 1 部分:概念景观
towardsdatascience.com](/learn-enough-docker-to-be-useful-b7ba70caeb4b)
在本系列的最后一篇文章中,我们将讨论 Docker 中的数据。跟着我,保证你不会错过!
我希望这篇文章对你有所帮助。如果你有,请在你最喜欢的社交媒体频道上给它一些爱。
我写关于数据科学、云计算和其他技术的东西。关注我,在这里阅读更多。
码头上!👏
构建神经网络的经验法则
在本文中,我们将获得一个构建初始神经网络的起点。我们将学习经验法则,例如隐藏层数、节点数、激活等。,并查看 TensorFlow 2 中的实现。
<了解深度学习,了解更多> >
Photo by Dewang Gupta on Unsplash
深度学习提供了各种各样的模型。有了它们,我们可以建立极其精确的预测模型。然而,由于设置参数种类繁多,要找到一个起点可能会令人望而生畏。
在本文中,我们将找到一个构建神经网络的起点,更具体地说是一个多层感知器的例子,但它的大部分是普遍适用的。
这里的想法是回顾经验法则来建立第一个神经网络模型。如果第一个模型的性能合理(最低可接受的精度),则对其进行调优和优化。否则,最好从问题、数据或不同的方法中寻找。
在下面,我们有,
- 构建神经网络的经验法则,以及
- 它们在 TensorFlow 2 中用于二进制分类的实现代码。
神经网络
神经网络随着 CNN、RNNs 等有了巨大的进步。随着时间的推移,每种疾病又发展出几种亚型。随着每一项发展,我们都成功地提高了我们的预测能力。
但与此同时,我们成功地让寻找模型构建的起点变得更加困难。
每个模型都有自己的天价索赔。周围有这么多广告牌,很容易分心。
在接下来的内容中,我们将通过使用一些经验法则来构建第一个模型。
经验法则
我们有各种各样的神经网络。其中,一个多层感知器就是深度学习的“hello world”。因此,当你学习或开发深度学习的新模型时,这是一个很好的起点。
以下是建造 MLP 的经验法则。然而,它们中的大多数在其他深度学习模型上是适用的。
- 层数:从两个隐藏层开始(不包括最后一层)。
- 中间层的节点数(大小):来自 2 的几何级数的数,如 4,8,16,32,…第一层应该是输入数据要素数量的一半左右。下一层的大小是上一层的一半。
- **用于分类的输出层的节点数(大小)😗*如果是二进制分类,则大小为 1。对于多类分类器,大小是类的数量。
- 回归输出层的大小:如果是单个响应,则大小为 1。对于多响应回归,大小是响应的数量。
- 中间层激活:使用
relu
激活。 - **输出层激活:**使用
sigmoid
进行二元分类,softmax
进行多类分类器,使用linear
进行回归。对于自动编码器,如果输入数据是连续的,最后一层应该是linear
,否则,对于二进制或多级分类输入应该是sigmoid
或softmax
。 - Dropout layers: 在除输入层(如果单独定义输入层)以外的每一层后添加 Dropout。将辍学率设置为 0.5 。辍学率> 0.5 是适得其反的。如果您认为 0.5 的比率会正则化太多的结点,则增加图层的大小,而不是将辍学率降低到 0.5 以下。我更喜欢不在输入层设置任何下降。但是如果你觉得必须这么做,把辍学率设为 0.2。
- 数据预处理:我假设您的预测值 X 是数值型的,并且您已经将任何分类列转换为 one-hot-encoding。在使用数据进行模型定型之前,请执行数据缩放。使用
sklearn.preprocessing
中的MinMaxScaler
。如果这样做效果不好,请将StandardScaler
放在同一个库中。回归中的 y 需要缩放。 - 分割数据至训练,有效,测试:使用
sklearn.model_selection
中的train_test_split
。参见下面的例子。 - **类别权重:**如果您有不平衡的数据,那么设置类别权重以平衡您的
model.fit
中的损失。对于二元分类器,权重应为:{ 0:1 的数量/数据大小,1:0 的数量/数据大小}。对于极度不平衡的数据(罕见事件),类权重可能不起作用。谨慎添加。 - 优化器:使用默认学习率的
adam
。 - **分类丢失:**对于二元分类使用
binary_crossentropy
。对于多类,如果标签是一个热编码,使用categorical_crossentropy
,否则如果标签是整数,使用sparse_categorical_crossentropy
。 - 回归损失:使用
mse
。 - **分类标准:**使用
accuracy
显示正确分类的百分比。对于不平衡数据,还包括tf.keras.metrics.Recall()
和tf.keras.metrics.FalsePositives()
。 - 回归度量:使用
tf.keras.metrics.RootMeanSquaredError()
。 - 历元:从 20 开始,查看模型训练是否显示损失减少和精度提高。如果 20 个时代没有最小的成功,继续前进。如果你取得了一些微小的成功,把 epoch 设为 100。
- 批量:从 2 的几何级数中选择批量。对于不平衡的数据集有更大的值,如 128,否则从 16 开始。
高级从业者的额外费用很少
- 振荡损耗:如果你在训练时遇到振荡损耗,那么就有收敛问题。尝试降低学习率和/或更改批量大小。
- 过采样和欠采样:如果数据不平衡,使用
[imblearn.over_sampling](https://imbalanced-learn.readthedocs.io/en/stable/api.html#module-imblearn.over_sampling)
中的SMOTE
。 - **曲线移动:**如果你必须进行移动预测,例如早期预测,使用曲线移动。下面显示了一个实现
curve_shift
。 - 自定义度量:不平衡二进制分类的一个重要度量是误报率。如下面的
class FalsePositiveRate()
实现所示,您可以构建这个以及类似的其他定制指标。 - 卢瑟激活 :
selu
激活被认为优于所有其他现有激活。我并不总是注意到这一点,但是如果你想使用selu
激活,那么就使用kernel_initializer=’lecun_normal’
和AlphaDropout
。在AlphaDropout
中使用速率为 0.1,AlphaDropout(0.1)
。示例实现如下所示。
TensorFlow 2 中的多层感知器(MLP)示例
我已经在我以前的文章中使用的纸张断裂数据集上实现了 MLP 神经网络(参见使用 Keras 中的自动编码器进行极端罕见事件分类)。
在这个实现中,我们将看到我们在上面的经验法则中提到的元素的例子。
实现在 TensorFlow 2 中完成。如果还没有迁移到 TensorFlow 2,我强烈推荐迁移到 tensor flow 2。它具有 Keras 的所有简单性和显著更好的计算效率。
按照分步指南安装 Tensorflow 2 进行安装。
在下文中,我并不试图找到最佳模式。想法是学习实现。为了简洁,没有跳过任何步骤。相反,这些步骤是冗长的,以帮助读者直接应用它们。
图书馆
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as snsimport pandas as pd
import numpy as np
from pylab import rcParamsfrom collections import Counterimport tensorflow as tffrom tensorflow.keras import optimizers
from tensorflow.keras.models import Model, load_model, Sequential
from tensorflow.keras.layers import Input, Dense, Dropout, AlphaDropout
from tensorflow.keras.callbacks import ModelCheckpoint, TensorBoardfrom sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_recall_curve
from sklearn.metrics import recall_score, classification_report, auc, roc_curve
from sklearn.metrics import precision_recall_fscore_support, f1_scorefrom numpy.random import seed
seed(1)SEED = 123 #used to help randomly select the data points
DATA_SPLIT_PCT = 0.2rcParams['figure.figsize'] = 8, 6
LABELS = ["Normal","Break"]
要测试您是否使用了正确的 TensorFlow 版本,请运行以下命令,
tf.__version__
读取和准备数据
在这里下载数据。
'''
Download data here:
[https://docs.google.com/forms/d/e/1FAIpQLSdyUk3lfDl7I5KYK_pw285LCApc-_RcoC0Tf9cnDnZ_TWzPAw/viewform](https://docs.google.com/forms/d/e/1FAIpQLSdyUk3lfDl7I5KYK_pw285LCApc-_RcoC0Tf9cnDnZ_TWzPAw/viewform)
'''
df = pd.read_csv("data/processminer-rare-event-mts - data.csv")
df.head(n=5) # visualize the data.
将分类列转换为一次性编码
hotencoding1 = pd.get_dummies(df['x28']) # Grade&Bwt
hotencoding1 = hotencoding1.add_prefix('grade_')
hotencoding2 = pd.get_dummies(df['x61']) # EventPress
hotencoding2 = hotencoding2.add_prefix('eventpress_')df=df.drop(['x28', 'x61'], axis=1)df=pd.concat([df, hotencoding1, hotencoding2], axis=1)
曲线移动
这是一个时间序列数据,其中我们必须提前预测事件(y = 1)。在此数据中,连续的行相隔 2 分钟。我们将把列y
中的标签移动 2 行,进行 4 分钟预测。
sign = lambda x: (1, -1)[x < 0]def curve_shift(df, shift_by):
'''
This function will shift the binary labels in a dataframe.
The curve shift will be with respect to the 1s.
For example, if shift is -2, the following process
will happen: if row n is labeled as 1, then
- Make row (n+shift_by):(n+shift_by-1) = 1.
- Remove row n.
i.e. the labels will be shifted up to 2 rows up.
Inputs:
df A pandas dataframe with a binary labeled column.
This labeled column should be named as 'y'.
shift_by An integer denoting the number of rows to shift.
Output
df A dataframe with the binary labels shifted by shift.
'''vector = df['y'].copy()
for s in range(abs(shift_by)):
tmp = vector.shift(sign(shift_by))
tmp = tmp.fillna(0)
vector += tmp
labelcol = 'y'
# Add vector to the df
df.insert(loc=0, column=labelcol+'tmp', value=vector)
# Remove the rows with labelcol == 1.
df = df.drop(df[df[labelcol] == 1].index)
# Drop labelcol and rename the tmp col as labelcol
df = df.drop(labelcol, axis=1)
df = df.rename(columns={labelcol+'tmp': labelcol})
# Make the labelcol binary
df.loc[df[labelcol] > 0, labelcol] = 1return df
上移两行,
df = curve_shift(df, shift_by = -2)
现在删除时间列。从这里开始就不需要了。
df = df.drop(['time'], axis=1)
将数据分为训练、有效和测试
df_train, df_test = train_test_split(df, test_size=DATA_SPLIT_PCT, random_state=SEED)
df_train, df_valid = train_test_split(df_train, test_size=DATA_SPLIT_PCT, random_state=SEED)
把 X 和 y 分开。
x_train = df_train.drop(['y'], axis=1)
y_train = df_train.y.valuesx_valid = df_valid.drop(['y'], axis=1)
y_valid = df_valid.y.valuesx_test = df_test.drop(['y'], axis=1)
y_test = df_test.y
数据缩放
scaler = MinMaxScaler().fit(x_train)
# *scaler = StandardScaler().fit(x_train)*
x_train_scaled = scaler.transform(x_train)
x_valid_scaled = scaler.transform(x_valid)
x_test_scaled = scaler.transform(x_test)
MLP 模型
自定义指标:false position verate()
我们将开发一个FalsePositiveRate()
指标,用于下面的每个模型。
class FalsePositiveRate(tf.keras.metrics.Metric):
def __init__(self, name='false_positive_rate', **kwargs):
super(FalsePositiveRate, self).__init__(name=name, **kwargs)
self.negatives = self.add_weight(name='negatives', initializer='zeros')
self.false_positives = self.add_weight(name='false_negatives', initializer='zeros')
def update_state(self, y_true, y_pred, sample_weight=None):
'''
Arguments:
y_true The actual y. Passed by default to Metric classes.
y_pred The predicted y. Passed by default to Metric classes.
'''
# Compute the number of negatives.
y_true = tf.cast(y_true, tf.bool)
negatives = tf.reduce_sum(tf.cast(tf.equal(y_true, False), self.dtype))
self.negatives.assign_add(negatives)
# Compute the number of false positives.
y_pred = tf.greater_equal(y_pred, 0.5) # Using default threshold of 0.5 to call a prediction as positive labeled.
false_positive_values = tf.logical_and(tf.equal(y_true, False), tf.equal(y_pred, True))
false_positive_values = tf.cast(false_positive_values, self.dtype)
if sample_weight is not None:
sample_weight = tf.cast(sample_weight, self.dtype)
sample_weight = tf.broadcast_weights(sample_weight, values)
values = tf.multiply(false_positive_values, sample_weight)
false_positives = tf.reduce_sum(false_positive_values)
self.false_positives.assign_add(false_positives)
def result(self):
return tf.divide(self.false_positives, self.negatives)
自定义性能绘图功能
我们将编写两个绘图函数来可视化损失进度和准确性度量。我们将在下面构建的模型中使用它们。
def plot_loss(model_history):
train_loss=[value for key, value in model_history.items() if 'loss' in key.lower()][0]
valid_loss=[value for key, value in model_history.items() if 'loss' in key.lower()][1]fig, ax1 = plt.subplots()color = 'tab:blue'
ax1.set_xlabel('Epoch')
ax1.set_ylabel('Loss', color=color)
ax1.plot(train_loss, '--', color=color, label='Train Loss')
ax1.plot(valid_loss, color=color, label='Valid Loss')
ax1.tick_params(axis='y', labelcolor=color)
plt.legend(loc='upper left')
plt.title('Model Loss')plt.show()def plot_model_recall_fpr(model_history):
train_recall=[value for key, value in model_history.items() if 'recall' in key.lower()][0]
valid_recall=[value for key, value in model_history.items() if 'recall' in key.lower()][1]train_fpr=[value for key, value in model_history.items() if 'false_positive_rate' in key.lower()][0]
valid_fpr=[value for key, value in model_history.items() if 'false_positive_rate' in key.lower()][1]fig, ax1 = plt.subplots()color = 'tab:red'
ax1.set_xlabel('Epoch')
ax1.set_ylabel('Recall', color=color)
ax1.set_ylim([-0.05,1.05])
ax1.plot(train_recall, '--', color=color, label='Train Recall')
ax1.plot(valid_recall, color=color, label='Valid Recall')
ax1.tick_params(axis='y', labelcolor=color)
plt.legend(loc='upper left')
plt.title('Model Recall and FPR')ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axiscolor = 'tab:blue'
ax2.set_ylabel('False Positive Rate', color=color) # we already handled the x-label with ax1
ax2.plot(train_fpr, '--', color=color, label='Train FPR')
ax2.plot(valid_fpr, color=color, label='Valid FPR')
ax2.tick_params(axis='y', labelcolor=color)
ax2.set_ylim([-0.05,1.05])fig.tight_layout() # otherwise the right y-label is slightly clipped
plt.legend(loc='upper right')
plt.show()
型号 1。基线。
n_features = x_train_scaled.shape[1]
mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dense(1, activation='sigmoid'))
mlp.summary()mlp.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
)history = mlp.fit(x=x_train_scaled,
y=y_train,
batch_size=128,
epochs=100,
validation_data=(x_valid_scaled, y_valid),
verbose=0).history
查看模型拟合损失和精确度(召回和 FPR)进度。
plot_loss(history)
plot_model_recall_fpr(history)
型号 2。等级权重。
根据经验法则定义类别权重。
class_weight = {0: sum(y_train == 1)/len(y_train), 1: sum(y_train == 0)/len(y_train)}
现在,我们将训练模型。
n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
)history = mlp.fit(x=x_train_scaled,
y=y_train,
batch_size=128,
epochs=100,
validation_data=(x_valid_scaled, y_valid),
class_weight=class_weight,
verbose=0).historyplot_loss(history)
plot_model_recall_fpr(history)
型号 3。退学正规化。
n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
)history = mlp.fit(x=x_train_scaled,
y=y_train,
batch_size=128,
epochs=100,
validation_data=(x_valid_scaled, y_valid),
class_weight=class_weight,
verbose=0).historyplot_loss(history)
plot_model_recall_fpr(history)
型号 4。过采样-欠采样
使用 SMOTE 重采样器。
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=212)
x_train_scaled_resampled, y_train_resampled = smote.fit_resample(x_train_scaled, y_train)
print('Resampled dataset shape %s' % Counter(y_train_resampled))
n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
)history = mlp.fit(x=x_train_scaled_resampled,
y=y_train_resampled,
batch_size=128,
epochs=100,
validation_data=(x_valid, y_valid),
class_weight=class_weight,
verbose=0).historyplot_loss(history)
plot_model_recall_fpr(history)
模型 5。卢瑟激活。
我们使用selu
激活,这种激活因其自规范化特性而流行起来。
注意:
- 我们用了一个
kernel_initializer=’lecun_normal’
, - 作为
AlphaDropout(0.1)
辍学。
n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, kernel_initializer='lecun_normal', activation='selu'))
mlp.add(AlphaDropout(0.1))
mlp.add(Dense(16, kernel_initializer='lecun_normal', activation='selu'))
mlp.add(AlphaDropout(0.1))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
)history = mlp.fit(x=x_train_scaled,
y=y_train,
batch_size=128,
epochs=100,
validation_data=(x_valid, y_valid),
class_weight=class_weight,
verbose=0).historyplot_loss(history)
plot_model_recall_fpr(history)
结论
- 凭借深度学习提供的所有预测建模能力,开始也可能会令人不知所措。
- 本文中的经验法则提供了构建初始神经网络的起点。
- 由此构建的模型应该进一步调整以提高性能。
- 如果用这些经验法则构建的模型性能没有一些最低性能。进一步调优可能不会带来太大的改善。尝试另一种方法。
- 本文展示了在 TensorFlow 2 中实现神经网络的步骤。
- 如果您没有 TensorFlow 2,建议迁移到它,因为它带来了(keras)实施的简易性和高性能。参见此处的说明,安装 Tensorflow 2 的分步指南。
阅读我的其他文章以获得更深入的学习理解、模型和实现 。
使用 Keras 中的自动编码器进行极端罕见事件分类。
构建正确的自动编码器——使用 PCA 原理进行调整和优化。第一部分。
构建正确的自动编码器——使用 PCA 原理进行调整和优化。第二部分。
19 个实体对应 104 种语言:NER 的新时代
世界数据科学界几乎没有人不同意 BERT 的发布是 NLP 领域最激动人心的事件。
对于那些还没有听说过的人来说:BERT 是一种基于 transformer 的技术,用于预处理上下文单词表示,能够在各种自然语言处理任务中实现最先进的结果。伯特论文被公认为最好的长篇论文👏计算语言学协会北美分会颁发的年度大奖。Google Research】发布了几个预训练的 BERT 模型,包括多语言、中文和英文的 BERT。
我们开发了DeepPavlov——一个对话式人工智能框架,包含了构建对话系统所需的所有组件。在 BERT 发布之后,我们惊讶于它可以解决的各种各样的任务。
我们决定将 BERT 集成到三个流行的 NLP 任务的解决方案中:文本分类,标记和问题回答。在本文中,我们将详细告诉你如何在 DeepPavlov 中使用基于 BERT 的命名实体识别(NER)。
NER 简介
命名实体识别 ( NER) 是自然语言处理中最常见的任务之一,我们可以把它表述为:
给定一个标记序列(单词,可能还有标点符号),为序列中的每个标记提供预定义标记集中的一个标记。
下面带标签的句子是我们的演示中 NER 的输出,其中蓝色代表人物标签,绿色代表位置,黄色代表地理位置,灰色代表日期时间。
DeepPavlov NER 模型支持 19 个标签:ORG(组织)、GPE(国家、城市、州)、LOC(位置)、EVENT(命名的飓风、战役、战争、体育赛事)、DATE、CARDINAL、MONEY、PERSON 等。迪普巴洛夫的 NER 模型在命令行中处理的句子如下所示。
>> Amtech , which also provides technical temporary employment services to aerospace , defense , computer and high - tech companies in the Southwest and Baltimore - Washington areas , said its final audited results are due in late November .
['B-ORG', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-LOC', 'O', 'B-GPE', 'O', 'B-GPE', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-DATE', 'I-DATE', 'O']
为了区分具有相同标签的相邻实体,使用生物标记方案,其中“B”表示实体的开始,“I”代表“内部”并且用于组成该实体的除第一个词之外的所有词,而“O”表示不存在实体。
NER 有各种各样的商业应用📈。例如,NER 可以通过从简历中提取重要信息来帮助人力资源部门评估简历。此外,NER 可用于识别客户请求中的相关实体,如产品规格、部门或公司分支机构的详细信息,以便对请求进行相应分类并转发给相关部门。
如何在 DeepPavlov 中使用基于 BERT 的 NER 模型
任何预先训练的模型都可以通过命令行界面(CLI)和 Python 进行推理。在使用该模型之前,请确保使用以下命令安装了所有必需的软件包:
python -m deeppavlov install ner_ontonotes_bert_multpython -m deeppavlov interact ner_ontonotes_bert_mult [-d]
其中 ner_ontonotes_bert_mult 表示配置文件的名称。
您可以通过 Python 代码与模型进行交互。
此外,DeepPavlov 包含一个基于 RuBERT 的模型,用于处理俄语数据。总的来说,基于 BERT 的模型比基于 bi-LSTM-CRF 的模型有实质性的改进。在这里,您可以看到基于英语和俄语的模型的性能。
The performance of the DeepPavlov’s NER models.
多语言零镜头传输
多语言 BERT 模型允许执行从一种语言到另一种语言的零转换。模型 ner_ontonotes_bert_mult 在 ontonotes 语料库(英语)上训练,该语料库在标记模式中具有 19 种类型。您可以在不同的语言上测试模型。
在德语、俄语、汉语和越南语的四个 NER 测试集上评估了多语言模型的性能。这些是转让的结果。
The performance of the Multilingual model while tested on four test sets
如何为 NER 配置 BERT
DeepPavlov NLP 管道在 config/faq 文件夹下的单独的配置文件中定义。配置文件由四个主要部分组成:数据集 _ 读取器、数据集 _ 迭代器、链接器和训练器。
所有基于 BERT 的模型的公共元素是配置文件的链接器部分中的 BERT 预处理器(在 ner 的情况下是 bert_ner_preprocessor 类)块。未处理的文本(即*“Alex goes to Atlanta”*)应该被传递到 bert_ner_preprocessor 用于标记化成子标记,用它们的索引编码子标记,并创建标记和段掩码。 tokens 参数本身包含一个语句记号列表( ['Alex ‘,’ goes ‘,’ to ‘,’ Atlanta ']【T11]), subword_tokens 是 tokens 带特殊记号( [‘[CLS]’,’ Alex ‘,’ goes ‘,’ to ‘,’ Atlanta ‘,’[SEP]'] 【T19)。 subword_tok_ids 包含记号 id, subword_masks 是一个列表,0 表示特殊记号,1 表示句子的记号([0 1 1 1 1 0】)。**
{
"class_name": "bert_ner_preprocessor",
"vocab_file": "{BERT_PATH}/vocab.txt",
"do_lower_case": false,
"max_seq_length": 512,
"max_subword_length": 15,
"token_maksing_prob": 0.0,
"in": ["x"],
"out": ["x_tokens", "x_subword_tokens",
"x_subword_tok_ids", "pred_subword_mask"]
}
所以,这就是我们想告诉你的关于我们多语言的伯特 NER 的一切。我们希望这是有帮助的,你会渴望使用迪普帕洛夫 NER 模型😃你可以在这里阅读更多关于他们的信息。也可以使用我们的演示来测试我们基于 BERT 的模型。别忘了 DeepPavlov 有一个论坛——只要在这里问我们任何关于框架和模型的问题,我们会尽快与您联系。敬请期待!
19 种在各种领域使用信息可视化的创新方法
当大量的数据以数字的形式出现在电子表格中时,在房间里听到呻吟声并不罕见。如果有大量的变量和时间框架,情况会更糟。
信息可视化可以带来巨大的不同。
将数字、百分比、统计、差异、比率和其他类型的无聊的数字数据转化为创造性的可视化数据,可以立即使任何信息看起来更有趣。
在本文中,您将找到一系列创造性的可视化信息,如图表、图表、图解、地图和其他用于您的下一个项目的想法。
1.流图
流图是堆积面积图的变体。
但是这些值不是沿着直轴,而是沿着中心线移动,该中心线随着值的形状而变化。它的目的是可视化不同类别的数据。
数值的不同形状和大小使图形看起来像一条流动的河流。注意每个值或溪流是如何用不同的颜色来使图表更容易阅读的。
上面的蓝色和蓝绿色流图显示了 iPad 发布后的一个周末。这一可视化结果发表在《哈佛商业评论》上,它很好地展示了推文中使用的每个词的价值,并更好地理解了用户的反应。
这种信息可视化的第二个例子是有史以来最大的流图之一。这是一个发表在《纽约时报》上的互动可视化。
这个流图中的数据是根据电影上映日期从票房收入中提取的。它是交互式的,所以用户可以点击哪怕是最小的溪流,看看它们代表什么。
何时使用流图
由于流图没有固定的 x 轴,过多的数据会使事情变得复杂。它们最适合有限的类别,因此重叠不会影响数据的可读性。
使用对比色或互补色,让图表看起来更漂亮。如果你能增加互动性,那就去做吧!这将使你的流图更加有趣和有效。
请记住,流图是用来可视化随时间变化的数据的。如果你经营一家电子商务公司,你可以使用流图来显示一种款式的服装在一年中特定时间的销售情况。
你可以使用像 Displayr 这样的工具来创建一个流图或者雇佣一个数据设计师。
2.桑基图
桑基图用于可视化定量流及其相互之间的比例。线条的粗细取决于流量的大小。
这些可以被视为箭头或线条,当它们穿过图表时,可以根据它们前进的方向分开或合在一起。
你可能认识这种风格的图表,因为它在你的谷歌分析中使用。Google Analytics Sankey 图直观地显示了访问者如何在你的网站中移动,以及他们停留在哪些页面上。
桑基图对于可视化用户、金钱或能量所走的路径非常有用。它可以被创建为一个大图或一组小图。
以下是桑基图的更多例子。
第一个是概念仪表板,使用 Sankey 图来可视化电子邮件驱动的导航。这个 Sankey 概念有不同的部分,指定不同的电子邮件流程。
点击此链接查看设计师如何解释读图的正确方法。如果您有一个 Tableau 帐户,您可以使用此工作簿创建自己的桑基图。
另一个交互式桑基图的例子是用来自【2018 年福布斯 NFL 估值的数据创建的。下面可以快速看一下。
何时使用桑基图
就像其他类型的信息可视化一样,如果有太多的数据需要显示,桑基图会非常混乱。知道你是否需要桑基图的最好方法是分析你的数据是关于一个过程还是价值流。
例如,它将用于可视化预算或利润如何再投资。您还可以选择使用 Sankey 图来可视化机场中的乘客活动数据。
创建 Sankey 图有几种不同的工具,Tableau 就是其中之一。但是您也可以尝试使用桑基图生成器为自己创建一个。
3.弦图
和弦图用于可视化不同组之间的相互关系。
组或实体的值组织在一个圆中,它们之间的关系用不同颜色的曲线创建和显示。
弦图有利于可视化大量数据,但是如果有太多的变量,就会在视觉上变得混乱。这可以通过使用交互性来最小化,交互性允许观众选择变量或区域,使所有其他变量或区域消失或设置在覆盖图后面。
上面的和弦图是我们最喜欢的艺术家之一 Nadieh Bremer 的例子。它可视化了一大群荷兰国民以及他们选择智能手机的相关数据。
连接曲线显示了从一个手机品牌到另一个品牌的变化,而小山则表示没有任何变化。点击此处查看和弦图如何工作以及她是如何创建这个和弦图的。
何时使用和弦图
和弦图通常看起来很漂亮,但对于不理解复杂数据可视化的人来说可能会感到困惑。只有当你能够解释它是如何工作的,以及你的观众如何阅读和理解它时,你才应该选择这种类型的信息可视化。
一如既往,使用交互性是实现这一点的好方法。对于上面的例子,Nadieh 围绕可视化创建了一个故事,以便观众可以更好地理解正在发生的事情。
如果你想让你的数据看起来很漂亮,就使用弦图。
请记住,这些图表是关于组或实体之间的相互关系。一组关于一段时间内某样东西是如何被使用的数据在弦图上是不起作用的。
4.等值区域图
choropleth 是与地图中的区域相关的数据的地理信息可视化。
choropleth 地图上显示的区域可以代表您想要的任何东西,如国家、县、城市或社区。这完全取决于需要可视化什么。
这些颜色被设置为相同色调或不同颜色的渐进性颜色强度。如果颜色太醒目或令人不快,数据将难以理解。
上面的 choropleth 地图是由 Mike Bostock 根据 2016 年美国的失业率数据制作的。颜色部分由每个州内的县定义。他只使用白线来分隔各州,这样就不会使可视化更加拥挤。
何时使用 choropleth 地图
当您需要可视化地理数据时,请使用 choropleth 地图。用于这种类型的信息可视化的最准确的数据类型应该是标准化的,而不是原始的。
例如,与其简单地用每个地区的人口数量,不如用每平方公里的人口密度来代表每个地区。
Choropleth 地图也最好与适用于所有地区的单一类型的值一起使用。如果使用不同的数据值,choropleth 可能不是最好的可视化方式。
您可以使用地图引擎用 Visme 制作一个 choropleth。
在 Visme 中,只需选择需要可视化的区域,插入数据并自定义颜色。您也可以从 Excel 或 Google 工作表导入数据,然后调整颜色和标签。
看看这个关于在 Visme 中制作交互式地图的视频。
或者使用本指南更好地了解如何创建令人惊叹的 choropleth 地图。
5.十六进制地图
六边形地图类似于 choropleth,但是这些区域在视觉上变成了六边形。目的是均衡区域的大小,这样就不会有区域看起来比其他区域更重要。
保持你正在观察的主要区域的原始形状是很重要的,这样观众才知道他们在看什么。
何时使用十六进制地图
使用 choropleth 的原因同样适用于使用十六进制映射。用于这种可视化的最佳数据集应该简单且没有变量。
每个区域应该只显示一个值,这将赋予它特定的颜色。
您可以将多种类型的值应用于地理区域,这意味着十六进制地图可以极大地丰富您的内容。
6.交互式多边形地图
地理数据信息可视化的另一种创新形式是交互式多边形地图。不同之处在于,这一个在每个区域可以有三个值。
它遵循六边形贴图的前提,在六边形贴图中,每个区域都是一个形状,并且大小都相同。不同之处在于形状是三维的,每条边代表一个值。
另一个区别是,所使用的值既不是百分比也不是标准化值,而是设置描述性的值,如上例所示。
上面的例子是由 David Velleca 创建的,是 Tableau 中的一个公共工作簿。他设计它来可视化每个州最常见的姓氏,使用前三个作为显示在形状两侧的值。
地图下方是一个条形图,显示地图中包含的所有姓氏。您可以使用他的工作簿创建交互式多边形地图来可视化您自己的数据。
何时使用交互式多边形地图
当您有大量的值,但希望显示每个地区的三个主要值时,可以使用这种信息可视化样式。
正如我们之前提到的,用于多边形地图的数据类型应该设置为描述性值,而不是整体的百分比。
例如,您可以使用“前三名”或“最少三名”这样的值增加交互性只会让阅读和理解地图变得更加愉快。
7.脊线图
Rigdeline 地块过去被称为“joyplots ”,因为它们类似于 1979 年 Joy Division 专辑《未知的快乐》中的插图。这个术语后来被改成了“山脊线地块”,因为 Joy Division 最初用他们的名字“T1”来指代它。
撇开音乐和纳粹历史不谈,脊线图是一种密度图。它的主要目的是显示一段时间内几个组的值的分布。
脊线中的“脊”重叠,从而产生脊线效果。用于这种可视化风格的最佳数据是在特定时期具有高值的数据。
上面的例子是一个山脊线图,显示了 2016 年内布拉斯加州林肯市的气温。根据数值变量而不是类别给脊着色。要查看更多具有其他颜色变化的脊线图,请单击下图旁边的链接。
何时使用脊线图
使用脊线图的最佳时机是希望数据易于阅读且视觉效果丰富的时候。
山脊线图是非常直观的图表,其目的并不完全独特。其他图表可以很好地显示相同的数据。山脊线的独特之处在于它看起来有多酷。
但要让它看起来像这样,数据必须以某种方式排序,这样最终结果乍一看是可以理解的。这是因为有些值隐藏在前面的脊后面。
在轴的特定部分需要有高值数据点,以便形成脊。如果数据变量少于六个,视觉效果就不会那么强烈。在这种情况下,最好选择另一种类型的密度图。
8.箱形图
箱线图是一种可视化数据分布和可变性的图表。箱线图有不同的部分,代表数据集的特定部分。这是一个箱线图的例子。
实际方框代表两个部分的四分位数范围。
两个四分位之间的线是中间值。中位数左边是第 25-50 百分位,右边是第 50-75 百分位。
从盒子中延伸出来的是触须,它将上下四分位数中的变量可视化。胡须边缘的线条是数据集的最小值和最大值。如果有任何异常值,它们将被标绘为最小值和最大值之外的点。
请记住,箱形图可以是水平的,也可以是垂直的。选择使用哪一个将取决于您需要可视化多少数据集。
何时使用箱线图
如果您必须可视化数据分布和可变性,箱线图是一个不错的选择。如果你想为一个统一的主题比较不同的数据集,它是完美的。
此外,箱线图以一种显示数据是对称还是偏斜的方式来可视化数据。它在以一种容易理解的方式显示异常值方面也做得很好。
9.交互式决策树
拥有大量信息的网站有时会让人不知所措。使用交互式决策树可以帮助你的访问者决定他们需要从你的内容中得到什么。
决策树基本上是一个流程图,但与其静态对应物略有不同。决策树的独特之处在于它是完全交互式和直观的。
下面是一个交互式决策树的例子。
上面的例子显示了 Viz 网站的数据中的交互决策树。Data to Viz 是一个关于数据可视化的在线百科全书,交互式决策树帮助用户为他们的项目选择正确的信息可视化。
何时使用交互式决策树
交互式决策树的最佳用途是让别人更容易浏览您的数据。这些数据需要用关键词和描述来索引。
例如,考虑一个关于一个国家不同地区的水健康的复杂实验室实验。结果和研究可以被索引,以便学生或读者可以根据水体或另一个值(如一种细菌)来浏览数据。
10.树形图
树形图是一种分层图表,用于显示不同类别中事物的值。这些值被可视化为较大矩形内的正方形和矩形。
最大值放在左上角,递减值按时钟方向显示,最小值放在右下角。
这是另一个更复杂的树形图设计的例子。
何时使用树形图
树状图是一种有用的信息可视化类型,可以包含在文章、博客帖子、年度报告和其他关于给定数据集的长篇出版物中。
正如你在上面的树状图中所看到的,它们与颜色搭配起来会更好。用像 Vizzlo 这样的树状图制作工具制作树状图很容易。
11.圆形包装
圆形包装可视化类似于树形图,因为它显示分层关系。
较大的圆圈包含较小但相关的值。在每一部分内,圆圈由大到小按顺时针螺旋排列。
圆圈的大小代表一个值,但可能发生的情况是,实际的数值无法从完整的可视化中辨别出来。圆形包装更像是一种解释性的层次可视化,而不仅仅是一种数字数据可视化。
上面的圆形包装示例显示了世界人口在 250 个国家的重新分配。它首先按洲,然后按地区,最后按国家来划分国家。
何时使用圆形包装可视化
当您需要演示一组具有强层次值的数据时,请使用圆形包装可视化。如果有大量的值需要可视化,那么让图表具有交互性是个不错的主意。圆圈的大小取决于数据的数值。
您可以使用 Visme 轻松创建圆形包装可视化。如果有必要,您还可以为其添加交互性,甚至一些音频旁白。以下是你如何做到这一点。
在编辑器中,简单地添加不同大小的圆形。然后,用特定的颜色对它们进行定制,并根据数据进行排列。你可能需要做一些数学计算来知道圆圈的确切大小。完成后,添加互动链接和悬停效果。
12.三维散点图
散点图是沿 y 轴和 x 轴显示相关数据的常用可视化工具。3D 散点图通过添加 z 轴更进一步。
如果点有颜色,那么另一个值也可以添加到数据中。这种类型的信息可视化最适合交互,因此您可以从不同的角度查看图表。
上面的例子是用人工智能工具创建的交互式 3D 散点图的屏幕截图。这个链接会带你去数据示例,你可以用它来制作你自己的数据示例。
何时使用三维散点图
3D 散点图最适用于包含大量变量的大量数据集。
请记住,与散点图一样,用于 3D 散点图的数据需要是相关数据。当数据有两个或三个以上的相关值时,使用三维散点图。
13.网络图
网络图有时被称为网络图,但我们不要把它与计算机功能图相混淆。网络图信息可视化的目的是借助节点和链接来显示事物之间的联系。
需要仔细计算节点和链接的数量。如果太多,图表将开始看起来像一个毛球,变得无法阅读。
像其他类型的可视化一样,这种方式在交互时效果最好。
上面的网络图是研究人员如何出现在其他研究人员的科学论文中的可视化。研究人员是节点,线是相互联系的纽带。
点击此处了解更多关于这个可视化项目的信息。
何时使用网络图
当您想要显示不同类别中的事物之间的联系以及这些类别如何相互联系时,请使用这种类型的信息可视化。
例如,您可以使用网络图来显示文学人物之间的联系,或者像迪士尼皮克斯世界中的人物那样更有趣的东西。
14.小提琴情节
小提琴图类似于箱线图,但可以更深入地理解变量的分布。在这种类型的数据可视化中,每个“小提琴”代表一个组或变量,小提琴的形状显示了该特定变量中数据点的密度。
这里有一个小提琴情节的例子。
上面的例子显示了小鸡体重和饲料类型之间的关系。你可以在这里找到更多关于小提琴的情节和这个特定的。
箱线图和小提琴图的主要区别在于,后者显示了更多的信息,例如几个组或变量的分布和排名。
何时使用小提琴情节
尽管小提琴图比箱线图显示更多的信息,但它并不常用。
当您处理非常大的数据集并需要可视化单个观察值和分布时,这种类型的信息可视化特别有用。
Violin 图可以垂直和水平形状创建,这取决于您的数据类型和数据集的大小。
15.实时跟踪器
实时可视化数据是为任何项目增添活力的好方法。任何类型的正在进行的数据都可以通过实时跟踪器可视化。
天气模式、空气质量、体育比分、列车时刻表延误和交通状况是一些可以使用实时跟踪器可视化的数据类型。
上面的例子是一个实时追踪器,显示了泰国曼谷市的空气质量和污染指数。每个住在曼谷的人都使用这个追踪器来查看他们那天是否真的需要外出,以及他们可能需要使用哪种类型的呼吸面罩。
在 177 分的一天,学校取消室外体育课,有呼吸问题的人被建议留在室内。
何时使用实时追踪器
实时追踪器非常适合为公众提供服务的实用应用和网站。它非常适合显示不断变化的数据,这些数据会影响决策和结果。
Visme 图形引擎有许多图表、图形和数据小部件,可以可视化实时数据。尝试一个,看看对你的项目有没有帮助。
您可以使用 Visme 编辑器中的任何数据图表创建实时信息可视化。只需从 Excel 或 Google 工作表中上传您的数据,并展示实时或现场数据。你可以把它用在图表上,甚至是地图上。
16.视觉年度报告
如果你的公司有一个强大的创意团队,那么你可能已经在发布可视化的年度报告了。但是,如果你每年都发布一大堆螺旋装订的电子表格和冗长乏味的文本,也许是时候改变一下了。
下面的视觉年度报告是由凤凰传媒为透明媒体设计的。
每年最好的视觉年度报告通常由创意人员和惊讶的客户在网上发布。有些甚至赢得了设计奖。现在,这是一个营销渠道,我敢打赌,你甚至没有想到!
上面的年度报告获得了一个通信设计红点奖。他们使用激光切割方法,重建了一个剧院舞台,将公司的愿景和价值观可视化。
制作自己的可视化年度报告
一份出色的可视化年度报告可以遵循一本书或一本电子书的经典格式。
使用 Visme,您可以创建许多不同种类的视觉丰富的图表和图形,以包括在您的年度报告中。尝试在有趣的形状作物和彩色字体中加入摄影。
在 Visme 中创建可视化年度报告不需要成为设计师。但是如果真的没有时间自己做,也可以请设计师或者设计机构帮你做。
Visme 有许多漂亮的年度报告模板,你可以为自己的公司定制。在演示文稿、信息图表和可打印文档之间进行选择。只需将您的内容插入到模板中,您就可以获得一份直观且富有创意的年度报告!
17.亲笔文件
2014 年,微软创建了一个交互式数字表格,其屏幕可以以 3D 形式显示数据。
它非常类似于全息投影的样子,但仍然显示在 2D 表面上。这种类型的可视化仍在增长,并将在未来几年继续增长。
从 2014 年的第一批全息桌子开始,微软现在有了 Hololens,这是一套 VR 护目镜,让用户以全息形式看到数据。
在下面的视频中,你已经看到了全息桌子的作用。如你所见,它适用于许多类型的数据,从地图到星球大战纪念品。
何时使用全息可视化
作为博物馆展览的一部分,全息摄影桌将是令人惊讶的,让参观者发现数据。关于科学、地理或医学的教育项目也可以使用这种类型的可视化。
对于小数据集或者如果你需要一篇文章的视觉效果,它可能不是合适的工具。这种类型的信息可视化绝对适用于大规模的情况。
18.虚拟现实
另一个将数据可视化的创新想法是使用虚拟现实。几乎每一种信息可视化都可以变成虚拟现实体验。
看看这个由 Ogilvy CommonHealth Worldwide 和 Patient Connect 合作创建的很酷的虚拟现实可视化患者数据。
何时使用虚拟现实可视化
在会议和研讨会上,虚拟现实仍然很受欢迎。不管你在哪个领域,给你的客人一副虚拟现实护目镜和一个指针,炫耀你的数据。
让他们发现你的信息,让他们惊叹这一切看起来有多神奇!
19.增强现实
增强现实是这些年来悄悄进入我们生活的东西之一。
虚拟现实和现实生活的混合,增强现实所做的是将你的周围环境和数字信息混合在一起。这可以通过特殊的 AR 护目镜实现。
这是一位艺术家对增强现实将如何发展的描绘。
有人试图让这成为一种趋势,比如几年前的谷歌眼镜。实际上,新的谷歌眼镜现在使用人工智能,并开始融入增强现实。
可视化和增强现实之间的联系是,可以显示用户正在查看的任何数据。想法和用途真的是无穷无尽的。从超市货架上展示的即时饮食信息到查看公交车时的交通和天气信息。
微软最近发布了 Hololens,这是一套看起来像巨大太阳镜的 AR 镜头,适用于需要一次显示大量数据的大企业,就像在工厂车间一样。
点击此处了解更多关于微软 Hololens 的信息。
我们迫不及待地想看到所有这些技术如何发展,这样我们就可以用它来创建更好的数据可视化!
何时使用增强现实可视化
随着增强现实越来越受欢迎,大多数大公司应该考虑将它纳入他们的剧目。由于几乎任何类型的数据都可以使用增强现实来显示,所以首先需要弄清楚可以创建什么来帮助消费者。
增强现实可视化是作为应用程序创建的,然后加载到 AR 镜头上。
例如,一个艺术画廊可以创建关于展出艺术品的增强现实可视化。显示的数据可以是历史性的、信息性的或娱乐性的。一幅名画可以展示艺术家的原始草图来展示创作过程。
你是如何使用信息可视化的?
信息可视化的使用是多种多样和创造性的。
有这么多不同的选择,很难做出选择。我们希望这篇文章已经帮助你看到了新的和创新的方法来可视化你的数据和信息。
上面的许多信息可视化想法都可以用 Visme 中的工具来创建。试试地图引擎、图形引擎或者直观数据小工具。可以免费报名!
我们错过了任何类型的创造性信息可视化吗?我们希望收到您的来信!请在下面的评论区告诉我们您的建议、反馈和问题。
19 岁的计算机视觉研究工程师——怎么做?
Not ML related, but fun stuff!
我从高中不及格到简历研究工程师的旅程!
我是谁?
当我在高中的时候,我是一个不及格的人。我的平均绩点刚刚超过 1.8,我无法专心学习一门学科,这让我的老师和学术顾问非常反感。三个学期的英语,两个学期的自然科学,两个学期的西班牙语,以及更多不足的分数将永远留在我的记录上。
在大二的最后一个学期,我发现自己对解决问题和数学有着特别的兴趣,在代数 2 中我获得了第一个 A,这让我的热情像滚雪球一样越滚越大。不必记忆各种琐事或花费数小时阅读,仍然能够理解我在课堂上学到的数学技术,这在我心中点燃了一股从未有过的火。
快进到我大三的开始,我重新发现了我一直以来最喜欢的游戏之一:《我的世界》。是的,那个《我的世界》。足以说,我把我的公平份额的时间;然而,真正引起我兴趣的是编程方面。在我来的时候,服务器开发社区已经很好地建立起来了,但至少在我迟到的时候,它是受欢迎的。我构建了几个小型服务器插件,在我经常光顾的论坛上引起了一些注意,我甚至为几个非常大的服务器做了一些(付费)工作,最终帮助并领导开发团队构建满足他们特定需求的核心插件。现在,我 19 岁,在家一家人工智能创业公司做计算机视觉研究工程师。
开辟成功之路
我提到我糟糕的学术表现和《我的世界》发展的原因是,1)即使是钻石也曾经是煤(这绝对是一个双关语),2)你能获得的任何经验对你在科技行业的成功都是必不可少的,无论是你在业余时间制作的游戏,你为了好玩制作的网络刮刀,甚至是《我的世界》mod。当然,除了上面列出的,我还做了大量与软件相关的事情(我已经成为业余爱好者/自由程序员大约 3 年了),但这些是最不为人知的。
我建议,如果你已经对某些特定的技术驾轻就熟,就对像 Upwork.com 这样的网站上的一些零工出价低一些,如果不是,你肯定应该学习一些。当我说技术时,我指的不仅仅是一种编程语言,我指的是某种特定的框架、库、API,任何对项目开发来说有些专门化和有用的东西。任何人都可以拿起 Python 或 JavaScript,说自己是软件开发人员,但学习 Angular(用于 web 开发)或 TensorFlow(用于机器学习)等特定应用程序需要一些勇气、天赋和动力。
即使你遇到一个职位名称含糊不清的“JavaScript 工程师”或“软件开发人员”,他们也很可能会欣赏一个拥有使用不同技术实际开发应用程序的经验的候选人,而不是一个只花时间在 CodeWars 或 CodeFights 上解决算法问题的人——这不会让我误解,是一种提高编程技能的惊人方法,但它缺乏实用性。
我熟悉的一个有用的框架是谷歌 Chrome 扩展开发 API 。我并不是因为觉得开发一个 Chrome 扩展会很酷而随意选择的,我这么做是因为我遇到了一个问题:为什么我不能用我的 Xbox 控制器在我的电脑上做更多有用的事情?
我四处搜索了一下,没有一款简单易用的软件可以从你的游戏控制器上给你的电脑添加远程功能。所以我做了一些研究,最终决定我想把这个功能整合到 Chrome 扩展中。所以我这么做了,在过去的 13 个月里(从写这篇文章开始),我一直是 Chrome 控制器的唯一开发者
链接现在是 404,因为 Chrome 控制器死了!它已从谷歌网上商店中删除。虽然源代码还是可以找到的,链接这里。—未来的戴尔兰:(
它是开源的,在 Google 网络商店上免费提供,拥有 3000 多名活跃用户。这个项目对我来说就像是精华,每次我和招聘人员或想测试我能力的人谈话时,我都会提到这个问题。
可以说,你应该有自己的 Chrome 控制器,这是你花了几个月时间开发的东西,有东西可以展示。坦率地说,没有招聘人员会关心你启动和放弃的 10 个项目,或者你的 FizzBuzz 实现。如果你真的想脱颖而出:打造一些你可以推销的东西,并投入其中,你可以自豪地向招聘人员宣布——至少可以说,你未来的自己会非常感激。
社区
我职业发展的另一个重大举措是成为志同道合者社区的一员,并为之做出贡献。《我的世界》是一个肯定,但是,它是非常中介。我有幸参与的最有影响力的项目是sharpes minds,这也让我很快找到了工作(成为我的导师仅 6 周)。它们是为有抱负的数据科学家、机器学习工程师、数据分析师等量身定制的导师计划。
我怎么强调都不为过 Edouard Harris (创始人之一)在与我合作时是多么的乐于助人和热情好客,甚至直接与我进行视频通话,并提供与我的特定子领域兴趣相关的完全精选的潜在导师。他让这个过程变得愉快且易于消化,最终让我向我即将成为导师的乔爸爸提交了一份建议书。
Joe 专攻信号处理,这是一个与机器学习有很多交叉的数学子领域。他给我回了信息,我们安排了一个电话,剩下的就是历史了!他看到了我身上的潜力,这是我所没有的,并真正促使我对自己的能力充满信心。我们曾计划从事与他的专业相关的各种项目,然而,爱德华和乔都催促我马上申请不同的公司。由于参与了招聘过程的双方,他们对如何优化我自己的营销有一些惊人的见解,我将这些直接归功于我今天的成就。
你的下一步
既然你已经听了我的故事,是时候去创造你自己的故事了。当人们谈到想进入软件行业时,我总是告诉他们,你 真的可以 。如果你瞄准软件开发的一个狭窄领域,无论是机器学习、web 开发、嵌入式系统等等,只要你充满激情、始终如一并设定目标,你将最终达到你的目标。然而,这并不意味着它会很容易。
坚持下去
已经有几个星期,我觉得我没有更接近我的目标,甚至我最亲密的家人都告诉我,我只是在浪费时间“玩游戏”和“在电脑上乱搞”,但只要你知道你要去哪里,并采取正确的步骤,这不是你是否会成功的问题,而是你何时会成功的问题。
给初级数据科学家的两个问题
source: https://pixabay.com/en/question-mark-pear-think-idea-2010012/
在我看来,雇佣一名数据科学家通常是一个困难的过程。有很多人来自各种不同的背景、学位水平和经验。不同的公司对“数据科学家”的要求大相径庭。除此之外,我们看到越来越多的人每天都在他们的 LinkedIn 个人资料中添加一个标语“数据科学家”。评估有经验的数据科学家的个人资料是否适合某项工作可能相对更容易,但我们如何评估初级/入门级数据科学家的个人资料呢?
在过去的几个月里,我采访了几个应届毕业生/证书项目毕业生/实习生候选人,花了一些时间思考这个问题。我觉得在面试过程中有两个重要的问题要问。这篇文章是关于这两个问题和我问它们的理由。
让我从给它们加标题开始。
- 解决同一问题的不同方法
- 广义理解或具体知识
解决同一问题的不同方法
我来一个匿名化的真实面试经历。我不得不面试一个拥有非常好的学术证书的候选人,并且在学生时代就有令人印象深刻的一系列项目。其中一个项目涉及使用强化学习来解决自然语言处理领域的一个问题 X。这是一场 Kaggle 竞赛(据我所知),候选人是 XXX 名参与者中的佼佼者。我觉得他们很好地解释了自己的所作所为。
这时,我问道——“如果有人告诉你不要使用强化学习,你会怎么做?”。候选人似乎对这个问题感到惊讶。经过一番沉思,他们说:“深度学习”。我问——“深度学习是什么?”。他们:“可能是 RNNs。”我:“好吧,假设我们已经决定不能使用深度学习。你能想到别的解决办法吗?”他们:(一脸茫然)。
在这种情况下,我们正在讨论的问题的一个流行算法(在教科书中也可以找到)使用正则表达式和简单的启发式算法!现在,有人可能会问,在这个时代问这个问题有什么意义?三个原因:
- 在行业项目中,建立一个快速的 MVP 或一个简单的解决方案,获得一些反馈并迭代它通常是有意义的。因此,考虑几个不同的选项来解决一个问题并评估哪一个可以快速构建是很有用的。
- 强化学习,或者深度学习,或者正则表达式,都只是解决问题的“方法”。不管问题如何,它们本身不应该是解决办法。
- 这也将告诉我候选人是否只是在他们的课程中遵循了强制性项目的描述,或者实际上理解并思考了解决问题的方法
所以,我的观点是:当我们开始的时候,不要停留在一个解决方案上,想想“还有什么其他的解决方法”是很有用的。这也是我们在现实工作中通常会做的事情。我们在给定的约束条件下寻找最优解。虽然对于一个刚刚起步的人来说,了解所有的事情是很困难的,但这也是常识的一部分。当有人突然问你一个替代方案时,你应该在面试中有答案。随着数据科学家的成长,这将非常有用。
广义理解还是具体知识
让我再举一个我的匿名采访经历。一个刚从大学毕业的候选人的简历上有一堆典型的项目——垃圾邮件分类、MNIST 数据集数字识别、情感分析等等。在其中一张照片上,这位候选人还声称自己是 Kaggle 排行榜上的前 10 名。虽然这令人印象深刻,但这与现实世界的项目场景相差甚远。那么,我该怎么办呢?
我没有对这些众所周知的数据集和项目的细节提出问题,而是稍微修改了一下我的“问题描述”。我向候选人提出了一些解决问题的问题,比如:“假设我经营一家网上企业,我经常收到客户发来的抱怨邮件。我只有三个客户支持部门:订单和账单,退货和退款,其他。我想要一个机器学习解决方案,将客户的电子邮件路由到这三个部门之一。”—如果有人了解他们在上面做的项目,他们会将此映射到一个分类问题,可能类似于垃圾邮件或情感分类。即使在初级阶段,看不到这种联系对我来说也是一个危险信号。
我对这个问题有两个观点:
- *如果你能展示的所有数据科学项目都是标准数据集和 kaggle 竞赛,这完全没问题(几个月前,我怀疑这是否有用,但我现在改变了看法)。但是,人们需要知道如何将这些知识推广到新的问题。*例如,如果您以前处理过一个文本分类问题,您需要能够识别另一个文本分类问题,并逐步完成解决它的一些步骤。
- 在这里,我的第二点与问题 1 相似。这告诉我候选人是否真正理解他们所做的,或者只是按照指示,或者按照在线教程。
总而言之,当申请数据科学工作时,入门级候选人需要考虑他们的项目,而不仅仅是他们所做的事情——寻找其他可能的解决方案,以及现实应用中类似问题的例子。
当然,这一切都是我个人的看法,并不一定能在天底下的每一次数据科学访谈中找到!
开发人员避免编写测试的两个原因
编写测试代表了软件开发中经常被忽视的几个阶段之一,尽管它可能是最重要的阶段之一。开发人员提到它,通常要么不舒服,不喜欢为他们的代码编写测试,要么有很多借口根本不编写测试。
Therac-25 放射治疗机中的一个软件错误导致五名患者在接受大剂量 X 射线照射后死亡。骑士资本在半小时内损失了 5 亿美元,原因是一个软件漏洞允许计算机在无人监管的情况下买卖数百万股股票。
这些和其他许多故事讲述了看似不重要的错误实际上如何导致如此多的悲剧灾难。
当我们知道有多少计算机程序正在广泛地成为我们生活的每一个领域的一部分,并且它们的安全性、稳定性和正确性在我们的生活中具有至关重要的意义时,问题就出现了:为什么开发人员仍然避免编写测试?
测试是一个开发领域,其中软件的特定功能根据设定的标准进行测量。可能有很多原因可以解释为什么不强调写作,尤其是在小项目中,但是我们会提到两个最常见的原因。
1.只是太花时间了
编写测试似乎比直接进入实现部分花费了太多的时间,尤其是当你应用测试驱动开发(TDD)的时候。这在短期内是正确的,但是如果我们考虑到你可能需要的时间来修复所有可能通过编写测试来避免的错误,那么编写测试实际上可以节省时间甚至金钱。
测试不能消除错误,但是可以极大地减少错误。它们甚至让您更有信心,因为您最近的更改和您必须做的重构不会破坏任何现有的功能。
您还节省了时间,并且保护了您现有的实现免受最近加入您的团队的没有经验的程序员的影响,仅仅因为他们的更改可能导致测试失败。当测试失败时,你就会意识到出了问题。
没有编程相关背景的项目经理,以及对可能突然出现的编程复杂性了解不多的项目经理,往往对他们团队中的开发人员有很高的期望。他们想要快速的实现和快速的生产就绪代码,并且认为推迟严格的截止日期是不合理的。
尽管这些情况可能会让你陷入在遵循最佳实践或经历快速且肮脏的模式之间的艰难境地,但你应该尝试一些无论如何都要坚持的专业原则。你应该尽最大努力让你的经理相信良好实践的重要性,以及从长远来看它们是如何带来回报的。如果他不服气,那么你可以考虑随时换个工作场所。
2.写测试的恐惧
毫不奇怪,软件开发人员将大部分工作时间花在阅读、写作或讨论如何通过代码解决问题上。因此,他们对它有着非常强烈的情感依恋,更愿意把它当作自己的宝贵财产。
他们相信自己已经有了足够的经验,能够不费力地应对各种可能的情况。然而,他们通常可能有内在的不安全感,这困扰着他们编写测试。他们很快将他们的代码更改推到主分支,因为他们想通过快速完成任务在经理面前看起来像一个有生产力的员工,现在担心编写测试实际上可能会暴露他们代码中的错误。他们害怕被暴露为不能写出无错误代码的普通 T2 程序员。
你不应该让这种自我意识命令你放弃编写测试。虽然你可能会觉得不舒服,不聪明,以及所有那些怕丢脸的混账感觉,但最终,你还是要为自己的工作负责。这是避免无数病毒的唯一方法,这些病毒可能会夺走数百万人的生命,并导致其他大规模的 havocs。
测试允许您快速地对代码进行大的修改,因为您确信一切都正常工作。当你习惯于为你的代码编写测试时,你通常能够更快地完成你的工作,因为当你看到红灯时,你会有即时的视觉反馈。因此,你也能写出更好的代码,感受到更少的压力,并最终得到提升,因为你正在做的工作带来了更多的价值。
编写测试并不意味着您必须编写两倍的代码。这通常意味着你只是在反复检查每件事情是否正常工作,而不是让客户发现边缘情况的错误。
你应该有勇气克服你对写测试的恐惧,改变你对这个非常重要的过程的情绪。你应该充满热情和活力,仅仅因为你正在遵循软件开发的一些最佳实践,并帮助你的团队构建稳定的项目。
腾出时间进行测试
可能有些项目不需要测试,但是在大多数情况下,测试是非常受欢迎的。
当你在编写好的测试时,你也在为你的代码准备好文档。
不要误解我的意思:有很多开发人员编写测试,仔细分析并确保他们覆盖了每一种边缘情况。这篇文章的目的是提高意识,并邀请更多的开发人员使用他们自己的测试工具。此外,我希望它能让项目经理们大开眼界,他们经常忽视推迟代码实现中人力不可能达到的最后期限的需要。
虽然编写测试可能不是避免每个软件错误出现的最终方法,但它仍然是增加拥有更稳定软件项目的机会的一个非常强大的方法。
感谢您抽出时间阅读。
请关注我的 推特
2 年后——创建她的+数据
2017 年 2 月,我创建了HER+Data——一个为女性或那些认为自己是女性并热爱数据的人服务的社区。我的目标是把从事数据工作或喜欢从事数据工作的女性聚集在一起——互相支持和促进,分享经验和知识,谈论数据。我渴望创造一个空间,让从事分析、数据科学和机器学习的女性能够建立真正有意义的联系,并相互激励。
这个社区已经发展到在都柏林有 600 名注册会员,在 T4 曼彻斯特有一个欣欣向荣的姐妹分会,由出色的 Rachael Ainsworth 组织。我们与都柏林一系列优秀的公司合作举办了 13 场精彩的活动,并与 36 位鼓舞人心的女性进行了交谈!
Our inspiring HER+Data Speakers to date — Note the title(s) above may not represent the current role/company for some of the speakers.
有人多次问我当初为什么创建这个社区,我对其他社区建设者有什么建议,特别是关于他们如何吸引更多女性参与者和演讲者参加他们的活动。
以下是我个人对这段旅程的一些反思!
#1 从任务开始
在外生活了 8 年后,我回到了爱尔兰,在都柏林,我注意到了科技领域的一个缺口。虽然有很多与数据相关的聚会,但很少有人关注女性,而那些关注女性的聚会都是围绕编码展开的。这就是她+数据的最初想法的来源。
我想创建一个专注于彼此分享经验和知识的社区。在我的职业生涯中,我一直抽出时间与他人联系、学习和分享经验,我总是惊讶于倾听他人如何解决问题和应对挑战的力量。
我还想创建一个社区,帮助解决数据科学行业面临的一些多样性挑战。作为技术领导者和数据团队的构建者,我非常关心多样性。研究一次又一次地表明,多元化的团队更具创新性,更聪明,他们最终导致更好的表现。然而,据估计,只有 15%-25%的数据科学家是女性。
分析、数据科学和机器学习正被用于推动战略业务决策、推动行动以及构建跨各种领域的创新产品和解决方案。然而,在绝大多数情况下,女性并没有发挥重要作用。我愿意帮助改变那个*。*
所以我的目标是创建一个社区,在那里从事数据工作的女性可以真正地相互联系和学习;一个真正支持和提升分析和数据科学领域女性的社区;一个有望鼓励更多女性从事数据相关职业的社区。
请注意,虽然 HER+Data 的核心目标是提升女性在数据科学和分析领域的地位,但我们也欢迎任何支持我们事业的人,无论性别或技术背景如何。
#2 选择一个包容的名字
当我第一次创建 HER+数据社区时,我称之为 XX+数据,其中“XX”是一个生物学参考。我选择这个名字是因为它短小精悍,而且我认为它听起来很巧妙。我没有意识到我无意中选择了一个没有完全包含所有女性的名字。
感谢社区和潜在成员的反馈,我意识到 XX+Data 是一个排斥跨性别的名字,对我们的跨性别盟友是一种伤害。虽然我们的核心使命是关注女性,但我希望它能包容所有女性,因此我们决定将社区更名为 HER+Data。
如果你正在考虑建立一个本地社区或聚会,你会想“名字有什么意义?”,答案是很多。名字很重要,如果你的核心目标是创造一个包容的空间,有一个包容的、代表你的事业的名字是很重要的。
#3 设定基调,让人们感到舒适
当我建立她的+数据时,我承诺会有很棒的内容、笑声和一屋子来自不同背景的数据女性。我希望我们的活动是有趣的、非正式的、受欢迎的和吸引人的。我希望人们真正期待这些活动,我希望他们回来。主要是我希望与会者感到舒适。
我们决定首先将重点放在由不同的演讲者分享他们鼓舞人心的职业故事的简短演讲上。我热衷于强调,进入数据相关职业有多种途径,通常是非线性的。
我们在 2017 年 5 月的第一次活动充满了兴奋、笑声和交谈。我们的演讲者组合——一些人处于职业生涯的早期,另一些人处于终身职位——似乎真的引起了共鸣,我们的演讲者分享的各种故事似乎真的触动了我们社区的神经。
在第一次活动和之后的每一次活动中,我都努力做一些事情来帮助设定基调,为每个人创造一个舒适的环境。
- 我欢迎大家。我自我介绍。我对别人有真正的兴趣。
- 我们倾向于提供饮料和小吃,所以像任何一个好的主人一样,给人们指出正确的方向,并鼓励人们自己动手是一个很好的起点!
- 我重复社区的核心使命和历史,以便参与者知道我们在努力做什么。
- 除了坚定的使命之外,我们还有一套行为准则来帮助阐明对社区成员的期望。网上有很多精彩的行为准则。我们使用一个改编自 Plone Foundation 并在知识共享署名-同样分享 3.0 非授权许可下授权的软件。这同样有助于为你的活动和社区定下基调。
- 我提醒与会者,如果他们有建议;愿意以任何方式贡献、主持或帮助;或者如果想在未来的聚会上发言,请联系我们或在活动结束后与我们交流。
- 最后,我试着做我自己,我试着展示我对社区的热情。如果你心不在焉,人们会看出来的。
#4 记住,这需要一支军队
第一次 HER+Data 活动上发生了两件事,都同样史诗!
(1)Rachael ains worth——当时是都柏林高级研究所的博士后研究员——参加了我们的启动仪式。她非常喜欢这个活动,所以她渴望参与其中。关键是她在几周内就搬到了曼彻斯特,在 Jodrell Bank 天体物理中心从事射电天文学的研究助理。雷切尔和我决定边喝咖啡边见面,把事情谈清楚。喝完那杯咖啡后,雷切尔主动提出在曼彻斯特领导并组织一个名为“她+数据”的姐妹分会。
Rachael 于 2017 年 9 月在曼彻斯特科学园举办了第一届 HER+Data MCR 活动。15 次聚会和近 600 名会员之后,曼彻斯特分会继续壮大。
我能说的就是谢谢你,雷切尔,你太棒了!
HER+Data MCR 1 Year Anniversary Event in Sep 2018 — hosted @intechnica — Rachael invited me to give a talk at the 1 year anniversary event 😃 Witnessing what she’s has built in Manchester and the impact she’s had on others was really inspiring!
(2)Martina Naughton——Zalando 的高级数据科学家和团队负责人——欣然同意在我们的 HER+Data 启动活动上做一次演讲,并很快同意与我共同领导和组织 HER+Data 都柏林社区!
我们坚持举办活动,每 1 或 2 个月举办一次,每次聚会通常会有 3 位新的演讲者。组织和协调这些活动需要时间和精力:寻找场地、赞助商和新的发言人、传播活动信息和发展社区。我一个人做所有这些会非常困难,而且我们会冒着缺乏多元化视角和技能的风险,以使社区和我们的活动取得成功。我非常幸运有像 Martina 这样的人在她的+数据上合作。非常感谢 Martina——你太棒了!
除了出色的联合组织者,我们还得到了主办和赞助我们活动的公司的大力支持,包括 Intercom、Zalando、Groupon、埃森哲、脸书、谷歌、Statestreet、微软和 Sky Ireland。Intercom 和 Zalando 实际上已经举办了多次活动!没有这样的公司,像 HER+Data 这样的社区是不可能的,所以非常感谢我们的盟友。
#5 寻找演讲者是一项挑战
后来有 36 位出色的女性演讲者,我希望我可以说这变得更容易了,但总的来说,我认为找到优秀的演讲者是她+数据中最具挑战性的部分之一。以下是我发现的一些有用的东西:
- 我亲自接触潜在的演讲者,与他们分享我们的使命,并告诉他们为什么我对让他们发言感兴趣。
- 我有明确的目标和期望。在我们的情况下,我们的会谈很短(10 分钟),我们的活动是非正式的,所以我强调这一点。在我们的活动开始之前,我会给所有的演讲者发一封电子邮件,给他们一组示例主题来帮助启发他们。
- 我利用每次聚会/活动提醒与会者,我一直在寻找发言人,如果有人愿意自愿,请来找我。我在每个事件的开始和结束时都会提到这一点。
- 我伸出手,依靠我的专业网络推荐潜在的演讲者。
- 我一定要感谢那些在活动前后都做志愿者的了不起的演讲者
- 我在社交媒体——Twitter 和 LinkedIn——上分享详细信息,以帮助宣传和提升那些友好地同意在我们的活动中发表演讲的演讲者。
#6 最后,会有高潮和低谷。
工作确实忙的时候。当我累了或者有压力的时候。当我蹒跚学步的孩子拒绝睡觉时。或者平衡一切感觉不可能的时候,我有时候会质疑她的+数据是不是我花时间去做的正确的事情。
但是后来我们有了另一个活动,我认识了更多了不起的女人。我可以联系、学习和分享。我看到熟悉的面孔回来参加另一个活动。我第一次见到新来的人,想知道会发生什么。对话开始了,嗡嗡声开始了,我准备好了!
我们收到了来自社区的积极反馈,这真的很有帮助——知道她的+数据促进了联系,帮助女性找到了自己的路,并鼓励更多女性追求或推动数据职业真的很有价值。
所以我的建议是——随遇而安:)
非常感谢所有帮助她实现+数据的人们。特别是我的协办单位 玛蒂娜 、HER+Data MCR 章节导语Rachael***、主办我们活动的优秀公司以及 36 位出色的演讲者!***
Karen 是 Intercom 的产品分析&数据科学总监,她领导着一个由产品分析师、数据科学家和数据工程师组成的团队,帮助设计、开发和衡量我们的产品是否成功。她的团队使用数据来推动战略决策,为产品路线图提供信息,并构建新的数据产品。在 Intercom 之前,Karen 在工业研究实验室(湾区的雅虎研究和巴塞罗那的 Telefonica 研究)工作了 8 年,在移动人机交互(HCI)、数据科学和应用机器学习的交叉领域进行了一系列科学研究。Karen 拥有 Dublin 大学(UCD)的计算机科学博士学位和 Blanchardstown 理工学院(ITB)的理学学士学位。她是 WiDS 都柏林大使兼HER+Data创始人。
2020 年的 20 个数据趋势
虽然我们无法预知未来,但我们可以根据趋势做出预测。阅读来自 20 位思想领袖的 2020 年关键数据趋势。
JT·科斯特曼 —全球网络犯罪疫情(每年 6T 美元)和不断扩大的数据隐私/保护立法字母汤将越来越多地要求数据科学家接受作为数据受托人的双重责任。随着网络攻击的数量、速度、多样性、病毒式和恶性程度无情地增加,人工智能解决方案将越来越成为弥补 180 万网络安全专业人员预计短缺的唯一方式,否则需要这些专业人员来打击日益复杂和坚定的对手——并让公司高管免于出庭。
Cassie Kozurkov —我们可以期待看到数据科学工具的改进,因为更多的用户体验设计师对作为用户的数据科学家感兴趣。随着相机不仅仅是捕捉记忆的一种方式,而是朝着用户与应用程序互动的更自然的方式发展,图像数据的重要性将会增加。我最喜欢的这种趋势的例子是谷歌镜头中的产品搜索和翻译。
本·洛里卡——强化学习(RL)开始在企业应用中崭露头角。RL 的工具变得越来越容易获得:恰当的例子是,RISELab 的 Ray 框架有一个 RL 库(RLlib ),在从业者和开发人员中很受欢迎。这开始转化为企业用例。JD.com、网飞、谷歌和脸书描述了他们是如何将强化学习整合到产品推荐系统中的。在商业过程优化和模拟中也有 RL 的早期应用,这两个领域都是 RL 在企业中有前途的领域。
Kirk Borne——2020 年,我们可以期待对三大趋势的强化关注:(1)自动化机器学习(AutoML)工具和培训,为公民数据科学家的多样化团队提供支持;(2)对数据监管活动(数据搜寻、收集、清理、标记、索引、联合、融合和编排)的重新投资,以推动企业规模的 ML 和 AI 培训、部署和持续运营;以及(3)组织内各级工作人员在数据和数字素养领域的再培训和技能提升工作。
伯纳德·马尔 :以下是我对 2020 年人工智能/数据科学的三大趋势:我认为 2020 年将是大数据、物联网和人工智能领域继续融合的一年,优化的人工智能芯片和 5G 将实现惊人的创新。这将意味着:人工智能即服务将使任何企业都能利用机器学习。
增强分析将使分析师和数据科学家今天所做的更多工作自动化。
人工智能将走向边缘,进入日常设备,这反过来将带来事物的智能。
Jordan Morrow —数据和分析的世界正在扩张,随着公司注意到数据素养的需求,2020 年的趋势将继续成为数据素养的一个关键方面:数据知情决策和决策科学。能够建立一个伟大的数据即,分析和读取数据是一回事,但它必须转化为明智的决策。基于数据的决策将是 2020 年的一个主要趋势,在决策科学中,我们将数据和人的因素结合在一起以创造成功。
Matt Dancho —展望 2020 年,有三件事很清楚—组织需要数据科学、云和应用。软件和数据科学正越走越近。这是由数据驱动决策民主化的业务需求驱动的。要跟上,我们(数据科学家)需要学习 ML + Cloud + Apps。
安德烈·布尔科夫——在“超越基准”方面,我预计语言建模神经网络模型 BERT 在 2019 年提高了 NLP 在几乎所有任务上的质量,在 2020 年将更加闪耀。今年,谷歌开始使用它作为相关性的主要信号之一——多年来最重要的更新。在技术方面,在我看来,关键趋势将是 PyTorch 在行业中的更广泛采用,对更快的神经网络训练方法的更多研究以及在便利的硬件上快速训练神经网络。
Andreas Kretz—2020 年,我们将见证许多数据科学项目的失败,因为公司正在努力将他们的证明概念转化为实际业务。
—2020 年,新的趋势将是向企业解释和传达 ML 模型。人们一直在谈论“数据翻译”的角色,而不是关注当前 DS/ML 从业者的职业发展,但这是一个真正的需求。很大比例的机器学习项目未能被采用,部分原因是缺乏对这些“黑箱”模型的商业理解。
本·泰勒: 2020 年将是 autoML 成为主流的一年,来自谷歌、亚马逊、数据机器人、H2O 和许多其他公司的竞争日益激烈,他们努力让自己的产品成为标准工具包的一部分。我们将看到的另一个趋势是数据集复杂性的增加,其中融合模型(结构化+非结构化数据)变得更加常见。我们还将看到围绕深度学习技术讲故事的改进,以及我们解释见解和学习主题的能力。
Carla Gentry :我的预测- > 2020 年是一些人最终会意识到的时候,机器学习是一个漫长而艰巨的旅程,需要大量的数据和持续的调整(最终是“设置好就忘了它”?)—2019 年最被炒作的是人工智能,为了在 2020 年取得成功,“黑匣子”的日子必须结束!可解释的人工智能是“人类人工智能”的一个重要组成部分。
法维奥瓦兹奎 :数据科学正在成为一个严肃的领域。我们将看到关于数据科学及其朋友的重要在线和离线教育的增加。希望我们会对我们所做的和我们如何做更有信心。语义技术、决策智能和知识数据科学将在未来几年成为我们的伴侣,因此我建议人们开始探索图形数据库、本体和知识表示系统。
黛博拉·贝雷比切兹 :数据科学繁琐而初级的步骤会被各种软件自动化;允许数据科学家从事数据驱动的决策制定的更复杂方面的工作。我认为我们正在经历一个不确定的时期,在世界范围内的经济和政治上,人们感到害怕,因为他们看到了很多变化,未来似乎不确定。大多数人,当他们想到人工智能时,他们实际上想到的是我们所说的人工通用智能(AGI),这是一种可以像人类一样执行任何认知功能的人工智能。这种技术还没有出现。远非如此。今天,在 IBM Watson、Siri、Alexa 和其他应用程序中,我们拥有的被称为狭义人工智能。AGI 和狭义人工智能的主要区别在于自主性和目标设定。也就是说,Siri 只有在有人问它问题的情况下才起作用;它不能自动询问天气。这并不意味着 AGI 将来不会在这里。我们必须接受世界在变化,但不要害怕。当然,当我们不能再依赖伴随我们成长的制度和规则时,害怕是很自然的——尤其是老一辈。但不要让恐惧引领你走向未来,让好奇心引领你走向未来!
莉莲皮尔森——就 2020 年人工智能趋势而言,有两个领域真正引起了我的注意。这些问题是:(1)随着面部识别技术的进步,人们和地方政府将更加努力地抵制侵犯他们隐私的行为。(2)随着 5G 的采用稳步增加,我们将看到 5G、物联网和人工智能之间的融合领域出现更多令人兴奋的举措。
Rachel Stuve——异常检测将是 2020 年的一个关键趋势。检测潜在的欺诈、客户流失、医疗索赔拒绝和采购重叠(仅举几例)是人工智能将用来帮助组织主动解决可能问题的一个领域。再加上独特的客户交付(即品牌化和差异化的用户体验),这将是人工智能在 2020 年产生影响的关键领域。
伊萨克·费伯博士——数据科学正在沉淀的过程中。就像一栋房子的地基已经建好。有两个主要的阵营;专注于业务的数据科学家和专注于开发人员的数据科学家。前者已经失去了一些对后者的关注,主要是由于深度学习和机器学习的宣传。我想今年这种情况会稍微稳定下来。深度学习有时会被认为是必要的,但不足以提供实际的商业价值。人工智能领域的杰出玩家将是解决无聊问题的人。不断增长的机器人过程自动化(RPA)行业可能会悄悄地获取大部分价值。很可能最初的几个 10 亿美元的人工智能公司会出现在 RPA 或者类似的领域。****
Vin Vashishta —深度学习将会遇到关于偏见的棘手问题。企业决策者和政府监管者都将关注细节,而不仅仅是承诺和去偏见化的言论。
凯文·陈(Kevin Tran)——我认为第四次工业革命即将到来。人工智能正在发展,谷歌已经声称量子优势。量子计算是当今计算机科学的惊人突破。如果这项技术成熟,它将使许多不可行的复杂计算变得可行,这意味着我们整个数字世界将被改变。与此类似的是从骑马升级到开车!
Kate strach Nyi——我们可以期待在 2020 年看到的是向自动化数据分析/数据科学任务的持续转变。数据科学家需要能够扩展和解决更多问题的工具。这种需求将导致跨越数据科学过程几个阶段的自动化工具的开发。例如,一些数据准备和清理任务是部分自动化;然而,由于公司的独特需求,它们很难完全自动化。自动化的其他候选包括特征工程、模型选择等等。
如果你在这篇文章中发现了价值,请与你的网络分享🙂
20 个流行的机器学习指标。第 1 部分:分类和回归评估指标
介绍评估分类、回归、排名、视觉、NLP 和深度学习模型的最重要指标。
注: 本帖分两部分。在第一部分(当前帖子)中,我将谈论 10 个广泛用于评估分类和回归模型的度量标准。在第二部分中,我将谈论用于评估排名、计算机视觉、NLP 和深度学习模型的 10 个指标。
介绍
在评估机器学习(ML)模型时,选择正确的指标至关重要。提出了各种度量来评估不同应用中的 ML 模型,我认为在这里提供流行度量的总结可能会有所帮助,以便更好地理解每个度量以及它们可以用于的应用。在一些应用程序中,查看单个指标可能无法提供您正在解决的问题的全貌,您可能希望使用本文中讨论的指标的子集来对您的模型进行具体评估。
在这里,我总结了 20 个用于评估机器学习模型的指标。我根据这些指标主要用于的 ML 模型/应用将它们分成不同的类别,并涵盖了在以下问题中使用的流行指标:
- 分类指标(准确度、精确度、召回率、F1 分数、ROC、AUC 等)
- 回归度量(MSE,MAE)
- 排名指标(MRR、DCG、NDCG)
- 统计指标(相关性)
- 计算机视觉指标(PSNR、SSIM、IoU)
- NLP 指标(困惑度,BLEU 评分)
- 深度学习相关指标(初始得分、Frechet 初始距离)
不需要提及的是,在一些应用程序中使用了各种其他度量(FDR、FOR、hit@k 等。),这里我就跳过了。
作为旁注,同样值得一提的是度量不同于损失函数。损失函数是显示模型性能的度量的函数,并且用于训练机器学习模型(使用某种优化),并且通常在模型的参数中是可微分的。另一方面,度量用于监控和测量模型的性能(在训练和测试期间),并且不需要可区分。然而,如果对于某些任务,性能度量是可微分的,那么它既可以用作损失函数(可能添加了一些正则化),也可以用作度量,例如 MSE。
这里讨论的一些指标可能非常琐碎,但是为了本文的完整性,我决定涵盖它们。因此,请随意跳过你熟悉的内容。没有任何进一步的原因,让我们开始我们的旅程。
分类相关指标
分类是各种工业应用中机器学习中最广泛使用的问题之一,从人脸识别、Youtube 视频分类、内容审核、医疗诊断到文本分类、Twitter 上的仇恨言论检测。
支持向量机(SVM)、逻辑回归、决策树、随机森林、XGboost、卷积神经网络、递归神经网络等模型是一些最流行的分类模型。
有各种各样的方法来评估一个分类模型,下面我将介绍一些最流行的方法。
1-混淆矩阵(不是一个指标,但知道它很重要!)
让我们首先确保我们知道分类问题中使用的基本术语,然后再详细了解每个指标。如果你已经熟悉这些术语,你可以跳过这一节。
分类性能中的一个关键概念是混淆矩阵(又名误差矩阵),它是模型预测与真实标签的表格可视化。混淆矩阵的每一行代表预测类中的实例,每一列代表实际类中的实例。
让我们用一个例子来说明这一点。让我们假设我们正在构建一个二元分类来将猫图像与非猫图像进行分类。假设我们的测试集有 1100 张图片(1000 张非猫图片,100 张猫图片),混淆矩阵如下。
Figure 1. A sample confusion matrix
- 在 100 张猫图片中,模型已经正确预测了其中的 90 张,并且错误分类了其中的 10 张。如果我们将“猫”类称为阳性,将非猫类称为阴性,那么预测为猫的 90 个样本被认为是真阳性,预测为非猫的 10 个样本是假阴性。
- 在 1000 张非猫图片中,模型已经正确分类了其中的 940 张,并且错误分类了其中的 60 张。940 个正确分类的样本称为真阴性,60 个称为假阳性。
如我们所见,该矩阵的对角线元素表示不同类别的正确预测,而非对角线元素表示错误分类的样本。
现在我们对混淆矩阵有了更好的理解,让我们进入实际的度量。
2-分类准确性
分类准确度也许是人们能想象到的最简单的度量,它被定义为正确预测的数量除以预测的总数,再乘以 100 T2。因此,在上述示例中,1100 个样本中的 1030 个被正确预测,导致分类准确度为:
分类准确率=(90+940)/(1000+100)= 1030/1100 = 93.6%
三精度
在许多情况下,分类精度并不是模型性能的良好指标。其中一种情况是当你的班级分布不平衡时(一个班级比其他班级更频繁)。在这种情况下,即使您将所有样本预测为最频繁的类,您也会获得很高的准确率,这根本没有意义(因为您的模型没有学习任何东西,只是将所有东西预测为顶级类)。例如,在我们上面的猫与非猫分类中,如果模型预测所有样本都是非猫,则结果将是 1000/1100= 90.9%。
因此,我们还需要查看特定于类的性能指标。精度是这样的度量之一,它被定义为:
精度=真 _ 正/(真 _ 正+假 _ 正)
上述示例中的 Cat 和非 Cat 类的精度可以计算如下:
Precision _ cat= #样本正确预测 cat/#样本预测 cat = 90/(90+60) = 60%
Precision _ NonCat = 940/950 = 98.9%
我们可以看到,与猫相比,该模型在预测非猫样本时具有更高的精度。这并不奇怪,因为 model 在训练中看到了更多非猫图像的例子,这使得它能够更好地对该类进行分类。
4-召回
召回是另一个重要的指标,它被定义为模型正确预测的一类样本的比例。更正式地说:
召回=真 _ 正/(真 _ 正+假 _ 负)
因此,对于我们上面的例子,猫和非猫类的召回率可以被发现为:
Recall_cat= 90/100= 90%
Recall _ NonCat = 940/1000 = 94%
5- F1 分数
根据应用的不同,您可能希望给予更高的召回或精度优先级。但是在许多应用中,召回率和精确度都很重要。因此,很自然会想到将这两者结合成一个单一指标的方法。一个结合了精确度和召回率的流行指标被称为 F1 分数,它是精确度和召回率的调和平均值,定义为:
F1-得分= 2 精度召回/(精度+召回)
因此,对于我们在图 1 中使用混淆矩阵的分类示例,F1 分数可以计算为:
F1 _ cat = 2 * 0.6 * 0.9/(0.6+0.9)= 72%
F-score 的通用版本定义如下。正如我们所看到的 F1-score 是 F_ℬ的特例,当时ℬ=为 1。
值得一提的是,在模型的精确度和召回率之间总是有一个权衡,如果你想让精确度太高,你最终会看到召回率下降,反之亦然。
6-敏感性和特异性
灵敏度和特异性是医学和生物学相关领域中最常用的另外两个流行指标,定义如下:
敏感度=召回率= TP/(TP+FN)
特异性=真阴性率= TN/(TN+FP)
7- ROC 曲线
绘制了接收器工作特性曲线,其显示了二元分类器的性能作为其截止阈值的函数。它本质上显示了不同阈值下的真阳性率(TPR)与假阳性率(FPR)的对比。再来解释一下。
许多分类模型是概率性的,即它们预测样本是猫的概率。然后,他们将输出概率与某个截止阈值进行比较,如果它大于该阈值,则他们预测其标签为 cat,否则为 non-cat。例如,您的模型可以预测 4 个样本图像的以下概率:【0.45,0.6,0.7,0.3】。然后根据下面的阈值,您将获得不同的标签:
截止值= 0.5:预测标签= 0,1,1,0
截止值= 0.2:预测标签= [1,1,1,1]
截止值= 0.8:预测标签= [0,0,0,0]
如你所见,通过改变阈值,我们将得到完全不同的标签。可以想象,这些场景中的每一个都会导致不同的精确度和召回率(以及 TPR、FPR)。
ROC 曲线基本上找出了各种阈值的 TPR 和 FPR,并绘制了 TPR 对 FPR 的曲线。图 2 显示了一个样本 ROC 曲线。
Figure 2. A sample ROC curve.
从这个例子中我们可以看出,阳性类别的截止阈值越低,越多的样本被预测为阳性类别,即更高的真阳性率(召回)和更高的假阳性率(对应于该曲线的右侧)。因此,在召回率可能有多高与我们希望限制错误的程度之间有一个权衡(FPR)。
ROC 曲线是一种流行的曲线,用于查看整体模型性能并为模型选择一个好的截止阈值。
8- AUC
曲线 (AUC)下的面积是二元分类器在所有可能的阈值上的性能的综合测量值(因此它是阈值不变的 ) 。
AUC 计算 ROC 曲线下的面积,因此它介于 0 和 1 之间。解释 AUC 的一种方法是将模型对随机正例的排序高于随机负例的概率。
Figure 3. The gray area in this ROC curve denotes the AUC.
在高层次上,模型的 AUC 越高越好。但有时独立于阈值的度量并不是您想要的,例如,您可能关心您的模型召回,并要求它高于 99%(尽管它有一个合理的精度或 FPR)。在这种情况下,您可能希望调整您的模型阈值,使其满足您对这些指标的最低要求(即使您的模型 AUC 不太高,您也可能不在乎)。
因此,为了决定如何评估您的分类模型性能,您可能希望很好地理解业务/问题需求以及低召回率与低精确度的影响,并决定优化什么指标。
从实践的角度来看,输出概率的分类模型优于单个标签输出,因为它提供了调整阈值的灵活性,从而满足您的最低召回率/精确度要求。然而,并不是所有的模型都提供这种很好的概率输出,例如,SVM 不提供简单的概率作为输出(虽然它提供了可用于调整决策的余量,但它不像具有输出概率那样直接和可解释)。
回归相关指标
回归模型是另一类机器学习和统计模型,用于预测连续的目标值。它们具有广泛的应用,从房价预测、电子商务定价系统、天气预报、股票市场预测到图像超分辨率、通过自动编码器的特征学习和图像压缩。
线性回归、随机森林、XGboost、卷积神经网络、递归神经网络等模型是一些最流行的回归模型。
用于评估这些模型的度量应该能够处理一组连续的值(具有无限的基数),因此与分类度量略有不同。
9 毫秒
“均方误差”可能是回归问题中最常用的度量标准。它实际上找到了预测值和实际值之间的平均平方误差。
假设我们有一个回归模型来预测西雅图地区的房价(用ŷᵢ来表示),假设我们有每栋房子的实际售价(用 yᵢ).来表示)则 MSE 可计算如下:
有时人们使用 RMSE 来得到一个以标度为目标值的度量,它本质上是 MSE 的平方根。
看看房价预测,RMSE 基本上显示了你的模型预测房价与目标值(房屋售价)的平均偏差。
10 月中旬
平均绝对误差(或平均绝对偏差)是另一个度量标准,用于计算预测值和目标值之间的平均绝对距离。MAE 定义如下:
众所周知,MAE 比 MSE 对异常值更稳健。主要原因是,在通过平方误差的 MSE 中,异常值(通常比其他样本具有更高的误差)在最终误差中得到更多的关注和支配,并影响模型参数。
同样值得一提的是,在 MSE 和 MAE 指标背后有一个很好的最大似然(MLE)解释。如果我们假设特征和目标之间的线性相关性,那么通过分别假设模型误差的高斯和拉普拉斯先验,MSE 和 MAE 对应于模型参数的 MLE。
内层比率指标:
还有另一个用于评估回归模型的指标,称为 inlier ratio,它实际上是预测误差小于某个界限的数据点的百分比。该指标主要用于 RANSAC⁴模型及其扩展(稳健估计模型家族)。
摘要
在这篇文章中,我们介绍了用于评估分类和回归模型性能的 10 个流行的 ML 指标。在这篇文章的下一部分,我们将介绍用于评估排名、统计、计算机视觉、NLP 和深度学习模型性能的 10 个更高级的指标。
参考
[1]伊恩·古德费勒,约舒阿·本吉奥和亚伦·库维尔。”**《深度学习》,**麻省理工出版社,2016 年。
[2] Christopher M. Bishop,《模式识别与机器学习》, springer,2006。
[3]杰罗姆·弗里德曼、特雷弗·哈斯蒂和罗伯特·蒂布拉尼。**《统计学习的要素》,**斯普林格统计丛书,2001。
[4] Tilo Strutz,“数据拟合和不确定性:加权最小二乘法的实用介绍及其他”, Vieweg 和 Teubner,2010 年。
在营销中实施数据科学的 20 种实用方法
在过去的十年中,由于万维网的广泛普及,在线信息消费急剧上升。据估计,目前有超过 60 亿台设备连接到互联网。每天都会产生大约 250 万 TB 的数据。到 2020 年,对于每一个人来说,每秒将会产生 1.7 MB 的数据。
对于营销人员来说,这些惊人的数据是一座金矿。如果能够对这些数据进行适当的处理和分析,它可以提供有价值的见解,营销人员可以利用这些见解来锁定目标客户。然而,解码大量数据是一项艰巨的任务。这就是数据科学可以提供巨大帮助的地方。
数据科学是一个从数据中提取有意义的信息并帮助营销人员识别正确见解的领域。这些洞察可以是各种营销方面的,如客户意图、体验、行为等,这将帮助他们有效地优化其营销策略并获得最大收益。
让我们来看看数据科学在营销中的 20 种实用方法:
1。营销预算优化
营销人员总是处于严格的预算之下。每个营销人员的主要目标是从分配的预算中获得最大的投资回报。实现这一点总是棘手且耗时的。事情并不总是按照计划进行,也没有实现有效的预算利用。
通过分析营销人员的支出和采购数据,数据科学家可以构建一个支出模型,帮助更好地利用预算。该模型可以帮助营销人员在地点、渠道、媒介和活动之间分配预算,以优化他们的关键指标。
2。向合适的受众营销
一般来说,营销活动分布广泛,与地点和受众无关。因此,营销人员很有可能超出预算。他们也可能无法实现任何目标和收入目标。
然而,如果他们使用数据科学来正确分析他们的数据,他们将能够了解哪些位置和人口统计数据给他们带来了最高的 ROI。
3。识别正确的通道
数据科学可用于确定哪些渠道给营销人员带来了足够的提升。使用时间序列模型,数据科学家可以比较和识别各种渠道中看到的提升类型。这可能是非常有益的,因为它准确地告诉营销人员哪个渠道和媒体正在提供适当的回报。
4。将营销策略与客户相匹配
为了从他们的营销策略中获得最大价值,营销人员需要将他们与正确的客户相匹配。为此,数据科学家可以创建一个客户终身价值模型,根据客户的行为对其进行细分。营销人员可以将该模型用于各种用例。他们可以向他们的最高价值客户发送推荐代码和返现优惠。他们可以对可能离开客户群的用户应用保留策略等等。
5。销售线索锁定
营销人员可以使用数据科学来锁定销售线索,并了解他们的在线行为和意图。通过查看历史数据,营销人员可以确定他们的业务需求以及过去一年中与他们相关的品牌类型。
6。高级线索评分
营销人员获得的每一条线索都不会转化为顾客。如果营销人员能够根据客户的兴趣准确地对其进行细分,将会提高销售部门的业绩,最终增加收入。
数据科学使营销人员能够创建预测性销售线索评分系统。这个系统是一个算法,能够计算转换的概率和分割你的线索列表。该列表可以分为以下几类:热切的客户、好奇的潜在客户和不感兴趣的客户。
7。客户角色和描述
在营销产品/服务时,营销人员着眼于创建客户角色。他们不断建立特定的目标潜在客户名单。有了数据科学,他们可以准确地决定哪些人物角色需要成为目标。他们可以计算出人物角色的数量以及创建客户群所需的特征种类。
8。内容策略创建
营销人员总是必须提供相关的有价值的内容来吸引他们的客户。数据科学可以帮助他们获取受众数据,这反过来又有助于为每位客户创造最佳内容。例如,如果客户通过谷歌搜索某个关键词,营销人员将知道在他们的内容中更多地使用该关键词。
8。情绪分析
营销人员可以利用数据科学进行情感分析。这意味着他们可以更好地了解客户的信念、观点和态度。他们还可以监控客户对营销活动的反应,以及他们是否参与了他们的业务。
9。产品开发
数据科学可以帮助营销人员收集、汇总和综合几种不同人群的产品数据。根据这些数据提供的见解,他们可以开发产品,并针对目标人群开展针对性很强的营销活动。
10。定价策略
数据科学可以帮助营销人员改进定价策略。通过关注单个客户偏好、他们过去的购买历史和经济形势等因素,营销人员可以准确地确定是什么推动了每个产品细分市场的价格和客户的购买意图。
11。客户沟通
通过正确分析数据,营销人员可以确定与潜在客户和客户沟通的正确时间。例如,他们可能能够理解客户阅读和回复电子邮件,但不太接受短信。这种洞察力可以帮助营销人员了解正确的沟通时间和渠道。
12。实时互动营销
数据科学可以产生关于实时事件的信息,并允许营销人员利用这些情况来锁定客户。例如,酒店公司的营销人员可以实时使用数据科学来确定航班延误的旅客。然后,他们可以通过将广告活动直接发送到他们的移动设备来锁定他们。
13。使用数据改善客户体验
提供丰富的客户体验一直是取得营销成功的重要因素。借助数据科学,营销人员可以收集用户行为模式,预测谁可能想要或需要特定产品。这使他们能够有效地营销,并为客户提供丰富的体验。
14。客户忠诚度
忠诚的顾客是那些帮助维持生意的人。它们比获得新客户更便宜。数据科学可以帮助营销人员改善对现有客户的营销,从而提高他们的忠诚度。例如,Target 利用数据科学,根据孕妇在怀孕前的购物情况,获得她们的个人资料。然后,该公司在这些客户怀孕期间向他们提供产品。就购买量和公司忠诚度而言,这一营销策略取得了巨大成功。
15。社交媒体营销
如今,客户在脸书、LinkedIn 和 Twitter 等社交媒体网站上非常活跃。营销人员可以使用数据科学来了解哪些潜在客户正在浏览他们的社交媒体页面,他们点击了哪些内容等等。有了这样的认识,他们可以制定一个合适的社交媒体参与策略。
16。社区分组
数据科学可用于针对特定的社交媒体群体获取客户反馈。这是通过帮助营销人员根据关键词频率确定最常讨论的话题来实现的。
17。超越文字云
为了分析社交对话,营销人员总是依赖于词云。然而,当有高水平的社会活动时,单词云是有用的。如果社交活动水平较低,营销人员通常会使用不相关的关键词。借助数据科学和自然语言处理算法,他们可以通过将单词用法置于上下文中并提供有意义的见解来超越单词云。
18。广告产品
营销人员可以使用数据科学来专门针对客户投放广告,并测量点击量和活动结果。它可以确保合适的人看到横幅广告,并提高被点击的机会。
19。电子邮件活动
数据科学可以用来计算哪些电子邮件吸引哪些客户。这些邮件多久被阅读一次,什么时候发出,什么样的内容能引起客户的共鸣,等等。这种洞察力使营销人员能够发送情境化的电子邮件活动,并为目标客户提供合适的优惠。
20。数字营销平台
数字营销平台因数据而繁荣。营销人员可以通过向这些平台提供精确的数据来获得更好的洞察力。数据科学可以通过提供正确的数据来改善数字营销平台,从而使营销人员能够确定他们必须做些什么来实现他们的营销目标。
书籍推荐:
“人工智能对你的业务意味着什么?阅读本书了解: 预测机器:人工智能的简单经济学**https://amzn.to/2UG063p”—哈尔·瓦里安,首席经济学家,谷歌人工智能。**
零到专家:
您还可以阅读以下书籍,了解更多关于将数据科学用于营销的信息:
1. 营销数据科学:https://amzn.to/2EkFLaJ
关于 2020 年软件发展趋势的 20 个预测
云、容器、编程、数据库、深度学习、软件架构、Web、App、批处理、流、数据湖、字节码、无代码
Photo by h heyerlein on Unsplash
再过几周,2019 年就要结束了,我们将迎来新的一年 2020 。对于软件开发行业来说,2019 年是伟大的一年,因为软件和数字化正在影响每个行业。这一趋势将持续下去,并将在 2020 年对世界产生更大的影响。
预测未来是困难的。预测软件开发的未来更加具有挑战性和风险性。我没有水晶球。但是我可以用我的人类学习来预测 2020 年的软件发展趋势。
我将预测软件开发最重要的栈:从云到字节码。
1.基础设施:条条大路通云
Photo by Patrick Tomasso on Unsplash
2019 年对于云厂商来说是很棒的一年。不仅初创公司在使用云,保守和关注安全的公司,如政府组织、医疗保健、采矿、银行、保险甚至五角大楼也在向云迁移。这一趋势将持续到 2020 年,各种规模和类型的公司都将迁移或至少计划迁移到云。 Gartner 最近发布了以下 2020 年的数据:
Source: Gartner
因此,如果你是一名决策者仍在考虑向云迁移,也许你应该重新考虑你的策略。如果你是个人开发者,还没有尝试过云计算,2020 年将是一个尝试的绝佳时机。大多数大型云提供商(亚马逊、微软、谷歌)都提供免费积分,让用户体验云计算。谷歌在这方面最为慷慨:它提供一年 300 美元的免费信用额度。
2.云:AWS 很棒,但其他人会赶上来的
作为第一家云提供商,亚马逊 AWS 统治了 2019 年。凭借最广泛的服务组合,亚马逊 AWS 也将在 2020 年继续占据统治地位。正如科纳仕公司公布的 2019 年第三季度数据:大型云提供商( AWS、Azure、GCP )占有 56%的市场份额,而 AWS 一家占有 32.6%的市场份额:
Source: Canalys
但其他云提供商也在积极计划缩小与 AWS 的差距。微软专门针对大型企业。最近,微软击败了亚马逊,从五角大楼获得了 100 亿美元的云项目“ JEDI ”。这笔交易可以提高 Azure 的声誉,并同样削弱 AWS 的装甲:
Source: Marketwatch
谷歌正在推动云本地计算基金会标准化云操作。谷歌的长期目标是让云迁移变得更容易,以便公司以后可以从 AWS 迁移到 GCP。 IBM 最近斥资 360 亿英镑收购了 RedHat ,以期在云市场占有一席之地:
Source: TechCrunch
2020 年将会看到更多的收购和合并。此外,许多初创公司会带来新的想法和创新,例如多云服务。在云供应商的激烈竞争中,公司只能从降低价格和更多创新中获利。
3.集装箱化:库伯内特斯将会更凉爽
在容器编排领域,曾经有过 Kubernetes、Docker Swarm、Mesos 之间的争斗。Kubernetes 已经成为这场斗争的明显赢家,并且变得更加强大。Cloud 是分布式系统,Kubernetes 是 it 操作系统(分布式 Linux )。在 kube con+CloudNativeCon North America 2019 中,有 12000 名与会者参加,与 2018 年的同一活动相比,增长了 50%。以下是 Kubecon + CloudNativeCon 在过去四年中的指数增长:
Source: CNCF/Linux Foundation
在不久的将来, Kubernetes 不会减速,只会在 2020 年变得更强。你可以在 2020 年将 Kubernetes 作为云原生运动的中坚力量。顺便提一下, Docker Enterprise 最近被出售给 Mirantis ,交易金额未披露:
Source: Migrantis
仅在几年前,它是所有关于 Docker,但现在它是所有关于 Kubernetes。Docker 在其全盛时期未能赚钱,几年后当该行业已经离开时,它试图赚钱。另一个例子是,在现代科技世界中,时间就是一切。
4.软件架构:微服务将成为主流
在软件架构范式中,向微服务架构的转变在 2019 年继续,如谷歌趋势所示:
Google Trends: Microservices
随着行业在 2020 年及以后向云发展,微服务架构将更加占据主导地位。微服务架构兴起的主要原因之一是它与云原生的快速软件开发完美契合。在之前的一篇博文中,我解释了微服务架构的基本原理及其优缺点:
[## 微服务架构:简要概述以及为什么您应该在下一个项目中使用它
微服务架构的背景以及微服务架构相对于整体架构的优势
towardsdatascience.com](/microservice-architecture-a-brief-overview-and-why-you-should-use-it-in-your-next-project-a17b6e19adfd)
我认为还会有一种回归单片软件架构的趋势,因为对于许多用例来说,微服务架构是多余的,设计微服务架构具有挑战性。设计微服务架构的最佳实践是什么?我之前在博客上写过一篇总结,可能会有帮助:
正确实施微服务架构的 10 个技巧
towardsdatascience.com](/effective-microservices-10-best-practices-c6e4ba0c6ee2)
5.编程(整体):Python 将吃掉世界
Photo by Sharon McCutcheon on Unsplash
无论是机器学习、数据分析、数据处理、Web 开发、企业软件开发还是拍摄黑洞 的 照片:Python 无处不在。
此外,流行编程语言排名网站 TIOBE 将 Python 列为继 Java 和 C 之后的第三大流行编程语言:
更有意思的是,2019 年 Python 的热度翻了一番(从 5%到 10%)。我知道 TIOBE 索引有很多限制和缺陷,但它是最广泛接受的编程语言排名。我写过一篇文章,列出了十大热门编程语言,Python 名列榜首:
针对求职者和新开发人员的顶级编程语言的深入分析和排名
medium.com](https://medium.com/@md.kamaruzzaman/top-10-in-demand-programming-languages-to-learn-in-2020-4462eb7d8d3e)
Python 的崛起将在 2020 年继续,它将缩小与 Java 和 c 的差距,另一种无所不在的编程语言 JavaScript 正面临下滑趋势(JavaScript 疲劳?).为什么 Python 会出现这样的热潮?它降低了编程的门槛,拥有优秀的社区,深受数据科学家和新一代开发人员的喜爱。
6.编程(企业):Java 和 JVM 将占统治地位
By 22Kartika — Java Island, Source: Wikipedia
如前一段的 TIOBE 索引所示,Java 仍然是这个星球上最占主导地位的编程语言,并将在 2020 年占据主导地位。Java 的运行时, JVM 是软件工程中最好的部分之一,为 Java 提供了坚实的基础。许多流行的语言如 Kotlin、Scala、Clojure、Groovy 都使用 JVM 作为它们的运行时。最近,Oracle 更改了 JVM 的许可证:
许可证的改变意味着所有使用 Java、Kotlin、Scala 或任何其他 JVM 语言的公司都将受到影响,需要支付巨额订阅费。幸运的是,有 OpenJDK 倡议,它仍将保持 JVM 免费。几家公司将为 JVM 提供企业支持:
Source: Java Code Geeks
由于它的大小和速度,JVM 语言并不适合今天的无服务器计算。甲骨文正在推动“ GraalVM ”计划,让 Java 变得灵活、快速,更好地适应无服务器世界。由于除了 Java 没有其他替代品能提供企业级的稳定性和信任,它将在 2020 年及以后继续统治。
7.Java 企业:春天来了
Source: spring.io
曾几何时,在企业软件开发中有一场 Spring 框架和 Java 企业版(JavaEE) 的巨大竞争。但是甲骨文在 JavaEE 中的**不活跃让它在竞争中轻而易举。这引发了“ 微概要 ”倡议的形成,并最终形成了JakartaEE其中 Oracle 开源了其 Java EE 源代码。**
当所有的政治和运动都围绕着 JavaEE 发生的时候, Spring Framework 凭借非常活跃的开发和对不断变化的环境(例如云原生支持)的快速反应赢得了 JVM Enterprise framework 大战。同样在 2020 年, Spring 框架将成为 JVM 生态系统中的头号框架。
两个非常有吸引力的项目正在开发中,它们将使 Java 变得更小更灵活,从而使 Java 成为无服务器计算的好选择。
一个框架是 Micronaut :
Source: Micronaut
另一个框架是 Quarkus:
Source: Quarkus
Micronaut 和 Quarkus 的目标都是使用 GraalVM ,并将在 2020 年吸引更多的 Java 社区。
8.编程:Rust,Swift,Kotlin,TypeScript 将会取得突破
在 2000 年,编程语言领域出现了停滞。大多数人认为不需要新的编程语言,因为 Java、C、C++、JavaScript 和 Python 已经满足了所有的需求。谷歌通过创造 Go 打开了新编程语言的大门。在过去的十年里,出现了许多有趣的编程语言,如 Rust、Swift、Kotlin、TypeScript 。这种发展的一个原因是现有的编程语言通常无法利用硬件的最新变化(例如多核、更快的网络、云)。另一个因素是现代语言特别关注开发人员人机工程学**,即更快更容易的开发。在 Stackoverflow 开发者调查中,大部分现代语言占据榜首位置( Rust 连续 4 年占据首位)😗*
Source: Stackoverflow
在另一篇博文中,我深入讨论了为什么值得学习 Rust、Go、Kotlin、TypeScript、Swift、Julia、Dart 等现代编程语言,以及它们如何为现有编程语言提供更好的替代方案:
Rust、Go、Kotlin、TypeScript、Swift、Dart、Julia 如何促进您的职业发展并提高您的软件开发技能
medium.com](https://medium.com/@md.kamaruzzaman/top-7-modern-programming-language-to-learn-now-156863bd1eec)
最近,微软宣布他们正在大力探索 Rust 编程,以开发如下所示的安全软件:
Source: Techbeacon
此外,亚马逊最近宣布他们正在赞助 Rust:
Source: Techbeacon
随着谷歌宣布在 Android 中正式支持 Kotlin,编程语言 Kotlin 也成为 Java 在 JVM 世界中的主要竞争对手:
Source: Android
Angular 支持将 TypeScript 作为主要的编程语言,而不是使用普通的 JavaScript。其他 JavaScript 框架,例如 React 和 Vue 也开始为 TypeScript 提供更多支持。
这种趋势将在 2020 年继续,许多其他可能正在深入研究新一代编程语言的大公司,如 Rust、Swift、TypeScript、Kotlin 将站出来公开宣布支持他们。
9.Web: JavaScript 将继续占据主导地位
Photo by Pankaj Patel on Unsplash
曾几何时, JavaScript 不是一种足够强大的编程语言,前端主要是使用后端框架开发的,如 JSF、Ruby on Rails、Django、Laravel 并从服务器呈现。自从《T4》在 2014 年上映后,情况就永远改变了。从那以后,出现了更多的 JavaScript Web 框架 **(Angular 2+,React,Vue.js,meteor . js)**JavaScript 是现在主流的 Web 开发框架。随着 JavaScript 框架的大量创新和微服务架构的兴起,JavaScript 框架将在 2020 年主导前端开发
10.JavaScript Web 框架:反应岩石
虽然是在 AngularJS 之后,但在过去十年里, React 对网络发展的影响最大,并且在与 Google+ 的斗争中拯救了脸书。React 为前端开发带来了一些新鲜和创新的想法,例如事件源、虚拟 Dom、单向数据绑定、基于组件的开发等等。它对社区的影响如此严重,以至于谷歌放弃了 AngularJS,并通过借鉴 React 的想法彻底重写了 Angular2+。React 是迄今为止最占优势和最稳定的 JavaScript Web 框架,如下图 NPM 下载统计所示:
Source: npm trends
最近,脸书宣布了 React-Fiber 项目,完全重写 React 核心算法,以获得更好的并发性和用户体验:
Source: Github
同样在 2020 年,React 应该成为你新项目的首选网络框架。在另一篇文章中,我对 JavaScript 前端框架进行了深入分析,React 成为第一名:
[## 2020 年前端开发的五大热门 JavaScript 框架
为前端开发人员、求职者和其他人提供的顶级 JavaScript 框架的深入分析和排名
medium.com](https://medium.com/@md.kamaruzzaman/top-5-in-demand-javascript-frameworks-for-front-end-development-in-2020-a59c4340d082)
其他前端 Web 框架比如 Angular (Angular2+) 和 Vue 呢?Angular 还是一个特别适合企业的可靠的 Web 开发框架。我确信谷歌将在未来几年大力投资 Angular。Vue 是另一个非常受欢迎的网络框架,由社区和几个中国大公司支持。如果你已经在用 Angular 或者 Vue,2020 年不需要迁移反应。
11.应用开发:面向企业的原生应用
Photo by Rodion Kutsaev on Unsplash
在移动应用程序开发方面,围绕混合应用程序开发或跨平台原生应用程序开发的宣传已经有所放缓。混合应用开发/跨平台原生应用开发给了更快的开发速度,因为你只需要一个团队,而不是两个。但是原生应用给了更好的用户体验和更好的性能。此外,在混合/跨平台应用程序开发中,应用程序总是需要调整以拥有高级功能。对于企业来说,原生应用程序开发仍然是首选的解决方案,这一趋势将在 2020 年继续。 Airbnb 发表了一篇详细的博文,解释了他们放弃领先的混合应用开发平台“React Native”的原因:
由于各种技术和组织问题,我们将日落反应原生和把我们所有的…
medium.com](https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a)
尽管脸书正在努力改进原生应用(React Native ),谷歌也在努力推进自己的应用开发平台(Flutter ),但它们主要适用于原型应用、概念验证应用、MVP 应用或特色应用,而原生应用开发将在 2020 年继续占据主导地位。
原生应用开发中一个有趣的事实是谷歌正在推广 Kotlin,而苹果正在推广 Swift 作为主要的编程语言,因为这些语言具有开发人员友好和现代化的特点。谷歌最近重申了对 Kotlin 的支持,这对 Kotlin 的采用者来说是个好消息:
Source: Phoronix
12.混合/跨平台应用程序开发:React Native
在许多用例中,混合/跨平台应用是一个实用的选择。在这个领域,有许多选择:已经存在的 Xamarin、Ionic 和更新的 React Native、Flutter。脸书基于非常成功和成熟的 Web 框架 React 建立了 React Native。像它的 Web 对应物一样, React Native 也是混合/跨平台应用程序开发中的主要框架,如下所示:
Source: Google Trends
由于 React Native 和 React 共享相同的基础,它们提供了高度的代码可重用性,并提供了选项:“编写一次,到处运行”。使用 React Native(或其他脸书框架)的另一个额外优势是脸书使用 React Native 开发自己的移动应用。谷歌在这个领域起步较晚,但去年凭借自己的跨平台原生应用框架获得了巨大的吸引力。Flutter 提供了更好的性能,但需要另一种尚未成为主流的编程语言 Dart 。考虑到 React 生态系统中发生的所有变化,React Native 也将在 2020 年继续在该领域占据主导地位。
13.API:安息吧
Image by S. Hermann & F. Richter from Pixabay
REST 就像是 API 领域中 800 磅的大猩猩。在基于 API 的服务间通信中,这是事实上最广泛使用的技术。在这个领域还有一些其他的选择。如果你已经仔细阅读了这篇文章,你可能已经猜对了:来自谷歌的 gRPC 和来自脸书的 GraphQL。
它们都是有趣的技术,但是提供不同的功能。谷歌已经开发了 gRPC ,作为远程过程调用技术(例如 SOAP)的再生,但是基于类固醇。它使用 Protobuf 而不是 JSON 作为消息格式。另一方面,脸书开发了 GraphQL 作为聚合层,以避免喋喋不休和频繁的 REST 调用。gRPC 和 GraphQL 都取得了成功,并在它们适合的地方表现出色。同样在 2020 年,REST 将成为最主要的 API,而 GraphQL 和 gRPC 将作为补充技术。
14.人工智能:Tensorflow 2.0 将占据主导地位
Image by Gerd Altmann from Pixabay
同样在深度学习/神经网络领域,谷歌和脸书是主要玩家。谷歌给了我们 TensorFlow ,它基于一个流行的深度学习框架**the no。**它迅速成为深度学习/神经网络计算的主库。谷歌甚至推出了一款特别设计的 GPU ( TPU )来加速张量流的计算。
脸书在深度学习领域并不落后,因为他们可能拥有最大的图像和视频集合。脸书发布了深度学习库 PyTorch ,它基于另一个流行的深度学习库 Torch 。这两个框架的工作方式有一个微妙的区别。 TensorFlow 使用静态图进行计算,而 PyTorch 使用动态图进行计算。使用动态图的优点是它可以动态地自我修正。此外,PyTorch 对 Python 更加友好,是数据科学中的主要编程语言。
随着 PyTorch 越来越受欢迎,谷歌在 2019 年 10 月发布了 TensorFlow 2.0 ,它使用了动态图形,对 Python 更加友好:
Source: TensorFlow
2020 年,TensorFlow 2 和 PyTorch 将并肩作战。考虑到 TensorFlow 更大的社区,我假设 TensorFlow 2 将成为深度学习的主导库。
15.数据库:SQL 至高无上,但分布式 SQL 将是圣杯
在 NoSQL 大肆宣传的日子里,许多人嘲笑 SQL 并指出它的局限性。许多帖子都在解释 NoSQL 如何变得更好,并将取代 SQL。但是宣传结束后,人们很快意识到这个世界离不开 SQL 数据库。以下是最受欢迎的数据库排名:
Source: DB Engines
从上图中我们可以看到, SQL 数据库保存了 t op 4 点。SQL 占主导地位的原因是它提供了可持续的跨国保证,这是业务应用程序最基本的需求。NoSQL 数据库提供水平扩展,但代价是损害了 ACID 保证。
网络规模的公司正在寻找“主数据库”,即像 SQL 数据库一样提供 ACID 保证,并像 NoSQL 数据库一样提供横向扩展的数据库。此时此刻,有两个解决方案部分满足了“主数据库”的要求:亚马逊的 Aurora 和谷歌的 Spanner。Aurora 提供了几乎所有的 SQL 特性,但没有水平写入扩展,而 Spanner 提供了水平写入扩展,但不支持许多 SQL 特性**。**
在 2020 年,这两个数据库将有望更加接近,或者其他人将提出一个“分布式 SQL ”。如果发生这种情况,他可能会获得图灵奖。
16.数据湖:MinIO 将崛起
Photo by Tom Gainor on Unsplash
如前所述,现代数据平台是复杂的。公司通常有 OLTP 数据库(SQL)来支持 ACID 事务,有 OLAP 数据库(NoSQL)用于分析目的。此外,企业还有其他类型的数据存储,例如用于搜索(Solr,弹性搜索)或计算(Apache Spark)的**。公司基于数据湖构建其**数据平台,即数据从 OLTP 数据库复制到数据湖。所有其他类型的数据应用程序(例如 OLAP、搜索)都使用数据湖作为它们的黄金来源。****
Hadoop 分布式文件系统(HDFS) 是事实上的数据湖,直到亚马逊推出对象存储 S3 。可扩展且廉价,S3 很快成为许多公司事实上的数据湖。唯一的问题是使用 S3 将数据平台与亚马逊 AWS 云紧密绑定。虽然微软 Azure 有 Blob 存储,谷歌有类似的对象存储,但它们与 AWS S3 不兼容。
一种新的笔源——S3 兼容的对象存储 MinIO——可能会拯救许多公司。MinIO 提供企业级支持,专为云原生环境打造,可提供云中性数据湖:
Source: MinIO
微软最近在 Azure Marketplace 中宣布了 MinIO,口号是:“为 Azure Blob 存储服务提供亚马逊 S3 API 兼容的数据访问”。如果谷歌 GCP 和其他公司也提供 MinIO,那么这可能是促进多云化的一大进步。
17.大数据计算:火花将继续闪耀
Image by Gerd Altmann from Pixabay
在现代,企业通常需要在他们的大规模数据集上运行一次计算,这需要分布式批处理作业**。Hadoop Map-Reduce 是第一个分布式批量计算平台。最近 Apache Spark 已经取代 Hadoop 成为批处理之王。Apache Spark 如何提供比 Hadoop 更好的性能?我之前写过一篇博文,对现代数据平台进行了深入分析:**
** [## 控制数据密集型(大数据+快速数据)框架的编程语言。
大数据框架概述
towardsdatascience.com](/programming-language-that-rules-the-data-intensive-big-data-fast-data-frameworks-6cd7d5f754b0)
Spark 专门针对 Hadoop Map-Reduce 的限制,即在每次代价高昂的操作后处理内存中的所有内容,而不是将数据保存在存储中。尽管 Spark 使用 CPU 和内存饥渴的 JVM 进行批处理,但它将在 2020 年及以后统治批处理框架。我希望有人能用 Rust、开发一个更高效的批处理框架,它可以取代 Spark 和节省公司的巨额云账单。
18.大数据流:面向未来的链接
Photo by Hendrik Cornelissen on Unsplash
几年前,实时流处理是不可能的。通常,像 Spark Streaming 这样的微批处理框架被用来给提供“近”实时流处理。然而, Apache Flink 通过提供实时流处理功能改变了这一局面。
直到 2019 年,Apache Flink 都无法获得足够的牵引力,因为它无法与 Spark 的营销竞争。2019 年 1 月,中国科技巨头阿里巴巴收购 Data Artisan(Apache Flink 背后的公司)后,情况发生了转变:
Source: TechCrunch
如果一家公司想在 2020 年及以后处理实时流处理**,Flink 应该是第一选择**。虽然 Flink 也和 Spark 一样,通过使用 CPU 饥渴的重量级 JVM,把一大笔云账单交给它的用户来承受。
19.字节码:WebAssembly 将被大量采用
Photo by Mārtiņš Zemlickis on Unsplash
我是从 JavaScript 的创造者布兰登·艾希的采访中得知 WebAssembly 的。现代 JavaScript(在 es5 之后)是一种优秀的编程语言。但是和其他语言一样,它也有局限性。JavaScript 的最大限制是速度慢,因为 JavaScript 引擎需要读取、解析和处理 JavaScript 文本“抽象语法树”。JavaScript 的另一个问题是单线程**,无法利用现代硬件(例如多核、GPU)。因此,许多计算密集型应用程序(如游戏、3d 图形)无法在浏览器上运行。**
几家公司(以 Mozilla 为首)开发了 WebAssembly,这是浏览器的低级字节码格式,可以在 Web 上运行任何支持的编程语言。web assembly MVP 发布,支持近金属编程语言(如 C++,Rust ):
Source: WebAssembly
WebAssembly 使游戏和 Autocad 等计算密集型应用程序能够在浏览器上运行。web assembly 的目标甚至更大,并且要在浏览器之外运行。WebAssembly 还提供固有的安全性和沙箱,因为它支持 Web。这也意味着 WebAssembly 可以用在以下“浏览器外的**”场景中:**
- 移动设备上的混合本地应用。
- ****无服务器计算没有冷启动问题(云)
- 不可信代码的服务器端计算( CDN )
在我的预测中,2020 年可能是 WebAssembly 的突破之年,许多大公司(包括 T2 的云供应商)和社区将会接受它。
20.编码:低编码/无编码将获得动力
Source: pixabay
快速的数字化和工业 4.0** 革命意味着软件开发商的供需缺口巨大。因此,许多人或公司因为缺乏开发人员而无法实现他们的想法。为了降低软件开发的门槛,人们试图用无代码(无代码)或最少代码(低代码)进行软件开发。这一努力被称为 LCNC(低代码无代码),并在 2019 年取得了一些成功:**
Source: no code
这个运动的目标是任何人都可以开发软件**,如果他/她有一个很酷的想法,没有编码经验。**
尽管我仍然对在生产中使用 LCNC 框架持怀疑态度,但是它们可以为其他框架奠定基础。像亚马逊,谷歌这样的公司可以在这个基础上建立一个坚实的产品(就像 AWS Lambda 在谷歌应用引擎的基础上蓬勃发展一样)。
值得一看的是 LCNC机芯,它将在 2020 年获得更大的牵引力。****
如果你觉得这很有帮助,请在你最喜欢的论坛(Twitter、脸书、LinkedIn)上分享。高度赞赏评论和建设性的批评。感谢阅读!**
结论:
现代软件开发是相当大的、复杂的和多样化的。我的预测清单绝不是包罗万象的。我只是试图预测我最不擅长的领域的趋势,我认为这些领域非常重要。此外,在许多情况下,决策的余地是最小的,我可能在 2020 年底被证明是错误的。此外,技术堆栈的选择总是取决于用例。因此,如果你想选择一个特定领域的技术堆栈,那么请做你自己的分析,不要从字面上理解我提到的要点。
我的目标是简要概述 2020 年的软件发展趋势。我希望你有一个成功和充满乐趣的 2020 年。
如果你觉得这很有帮助,请分享到你最喜欢的论坛 (Twitter,LinkedIn)。
如果你对软件发展趋势感兴趣,你也可以阅读以下文章:
针对求职者和新开发人员的顶级编程语言的深入分析和排名
medium.com](https://medium.com/@md.kamaruzzaman/top-10-in-demand-programming-languages-to-learn-in-2020-4462eb7d8d3e) [## 现在要学习的 7 种现代编程语言
Rust、Go、Kotlin、TypeScript、Swift、Dart、Julia 如何促进您的职业发展并提高您的软件开发技能
towardsdatascience.com](/top-7-modern-programming-language-to-learn-now-156863bd1eec) [## 2020 年前端开发的五大热门 JavaScript 框架
为前端开发人员、求职者和其他人提供的顶级 JavaScript 框架的深入分析和排名
medium.com](https://medium.com/javascript-in-plain-english/top-5-in-demand-javascript-frameworks-for-front-end-development-in-2020-a59c4340d082)******