如何使您的分类器安全
一个关于基于统计距离度量的机器学习/深度学习分类器的准确度估计的故事(SafeML 和 safe dl)——第一部分。
来自[https://github.com/ISorokos/SafeML]的 SafeML 标志
目录
- 简介
- SafeML 创意
- 统计距离
- 结论
- 参考文献
- 相关 GitHub 项目
- 相关中等岗位
1.介绍
如今,人工智能(AI)正在迅速发展,其应用涵盖了许多不同的学科。在这种快速增长的同时,对人工智能安全的担忧也在上升。对于人类生命、环境、金钱和隐私面临风险的安全关键系统,AI 安全不容忽视。(Amodei 等人,2016 年)已经讨论了认证该领域中运行的现代机器学习系统的不同现有问题。如下图所示,安全问题可分为五类,包括 A)安全探索,B)对分布转移的稳健性,C)避免负面副作用,D)避免“奖励黑客”和“电线接头”,E)可扩展的监督。
人工智能安全的五个主要类别
这个故事的主题可以被认为是人工智能安全中的“对分布变化的鲁棒性”问题。基于下图,我们将要解释的 SafeML 方法包括安全机器学习(SafeML)和安全深度学习(SafeDL)。
左:人工智能(AI) vs 机器学习(ML) vs 深度学习(DL)。右图:安全人工智能(SafeAI) vs .安全机器学习(SafeML) vs .深度学习(SafeDL)。
存在不同的现有方法来增加 ML 算法的安全性和鲁棒性。一些论文研究了分类器中结果的不确定性评估,而另一些论文则关注于提高对不确定性的鲁棒性。例如,下图显示了神经网络的 ETH 鲁棒性分析器(ERAN ),它对输入“8”使用可能的扰动,并试图创建一个抽象所有可能输出的形状。如果创建的形状违反了定义的边界,并且无法验证结果。否则,输出将得到保证。有关更多详细信息,请查看(Gehr,t .等人,2018 年和 Balunovic,m .等人,2019 年)。
神经网络的 ETH 鲁棒性分析器(ERAN)[https://github.com/eth-sri/eran
在第 2 节中,简单讨论了 SafeML 的思想,第 3 节通过一些 python 例子来说明统计差异度量的应用。第 5 节提供了一个简短的结论。一些相关的 medium 帖子和 Github 项目在故事的结尾有所暗示。
2.安全理念
SafeML 的想法是由(Aslansefat 等人,2020-b)提出的,目标是在没有可用标签时以某种方式监控分类器的决策。
下图展示了 SafeML 理念的流程图。在这个流程图中,有两个主要部分,包括培训阶段和应用阶段。
SafeML 流程图(Aslansefat 等人 2020-b)
a)训练阶段是一个离线过程,在该过程中,将使用可信或认证的数据集来训练智能算法,该算法可以是机器学习或深度学习算法。因此,将使用可信数据集来训练分类器,并且将使用现有 KPI(例如,ROC、准确性和 Kappa)来测量其性能。同时,每类的统计参数和分布将被估计和存储以用于比较(例如,平均值、方差值和经验累积分布函数(ECDFs))。
b)应用阶段是一个在线程序,其中实时和未标记的数据将被输入系统。例如,考虑一个已经被训练来检测不同安全攻击的安全攻击检测器,它应该过滤攻击者 IP。因此,在应用阶段,经过训练的分类器应该区分正常的网络流量和安全攻击(分类任务)。应用阶段的一个重要且关键的问题是数据没有任何标签。因此,不能保证分类器能够像训练阶段一样准确地运行。
在应用阶段,将根据分类器决策(未经认证)分离缓冲数据,并将存储每个类别的统计参数,以便与训练阶段的数据进行比较。使用将在下一节中解释的统计距离测量,将比较训练阶段和应用阶段中每个类的要素之间的距离。如果计算的距离和预期置信度(由专家定义)的差异非常低,则分类器结果及其准确性是可信的(系统是自主行动的),如果差异很低,则系统可以要求更多数据并重新评估以确定距离。在较大差异的情况下,分类器结果和准确性不再有效,并且系统应该使用替代方法或通知人工代理(在该示例中,系统将要求负责的安全代理手动检查网络流量并做出决定)。
SafeML 在安全入侵检测中的应用(如 CICIDS2017 数据集)
机器学习和深度学习在各种疾病的早期检测或诊断方面有无数的应用。例如,(Scudellari,S. (2020))写道“医院部署人工智能工具,在胸部扫描中检测新冠肺炎”。这种人工智能工具可以完全自主进行检测或诊断吗?他们安全吗?我们对他们安全的定义是什么?人们相信 SafeML 或类似的方法可能是这些问题的答案。下图说明了 SafeML 在医疗诊断中的应用(例如,使用肺部扫描的新冠肺炎诊断)。
SafeML 在医疗诊断中的应用(例如使用肺部扫描进行新冠肺炎诊断)
另一个例子可以是自动驾驶汽车或自动驾驶车辆中的交通标志检测器,它使用机器学习或深度学习来检测交通标志并生成所需的动作。下面的框图显示了如何在这个案例研究中使用 SafeML。这也可用于自主排系统(Kabir,s .等人(2020))。
SafeML 在自动驾驶汽车中的应用(如交通标志检测)freepik 创建的汽车矢量—【www.freepik.com
上述每一个应用程序都将使用 SafeML 实现,在我们接下来的文章(第二部分、第三部分和第四部分)中会有一些著名的案例研究。
3.统计距离及其在精度估计中的潜在应用
阈值线可以被认为是分类器的最简单版本。考虑下图;在这个简单的分类器中,阈值线(Xtp)以下的任何点将被认为是第 1 类,阈值线以上的任何点将被认为是第 2 类。假设我们知道时间 0 到 20 之间的点为 1 类,其他点为 2 类。从这个简单的例子中可以看出,x 和 v 点被错误分类。
假设信号和 Xtp 的简单阈值(Aslansefat 等人,2020-a)
如果我们估计每一类的概率密度函数(如下图),那么误差的概率可以计算为:
使用 1-P(误差)可以容易地获得分类器精度。在这个简单的分类器中,两个概率密度函数合并的区域导致误差。
第一类和第二类概率密度函数
Fukunaga ,K. (1990)表明,可以使用基于概率密度函数(PDF)的距离(如 Bhattacharyya 距离)来计算上限误差。基于 PDF 的距离测量通常依赖于均值和方差距离,如下图所示。然而,一些现有的先进方法也可以比较不同 pdf 的形状。
基于概率密度函数的距离度量
下图显示了四种众所周知的基于 PDF 的距离测量方法。
一些著名的基于 PDF 的距离测量
3.1 基于 Chernoff 和 Bhattacharyya 的上限误差
下面提供了基于切尔诺夫方法的上限误差概率估计的 python 示例。在这个代码中,如果考虑“s = 0.5”,那么它将是 Bhattacharyya 上界误差估计。
可以证明,误差概率与累积分布函数(CDF)之间的距离相关(Aslansefat,k .等人 2020-b)。一些著名的基于 CDF 的距离度量可以列举如下:
一些著名的基于 CDF 的距离度量
有时使用特征的经验累积分布函数(ECDF)会更容易。基于 ECDF 的距离测量的 Python 示例如下。
3.2 Kolmogorov-Smirnov 距离
假设我们有一个包含两个类和一个要素的数据集。下图显示了等级 1(蓝色)和等级 2(红色)的要素的 ECDF。Kolmogorov-Smirnov 简单地找到两个 ECDFs 之间的最大退出距离。
Kolmogorov-Smirnov 距离度量图
例如,您可以检查 Kolmogorov-Smirnov 距离测量的以下 python 代码:
3.3 柯伊伯距离
柯伊伯距离与柯尔莫哥洛夫-斯米尔诺夫距离具有相似的功能。然而,这种方法考虑了如下所示的两个最大距离;a)当蓝色 ECDF 的值大于红色 ECDF 的值时,b)当红色 ECDF 的值大于蓝色 ECDF 的值时。柯伊伯距离可以通过两个最大值相加得到。
柯伊伯距离度量插图
python 中的柯伊伯距离测量示例如下。
3.4 克莱姆-冯米塞斯距离
ECDF 是由许多小步骤形成的。考虑两个台阶在相同间隔内的绝对差作为高度。如果我们计算所有台阶的所有计算高度值的总和,那么我们就有了克莱姆-冯米塞斯距离。
克莱姆-冯米塞斯距离测量插图
您可以按如下方式检查 Cramer-Von Mises 距离的示例 python 代码:
3.5 安德森-达令距离
安德森-达林距离类似于克莱姆-冯米塞斯距离。唯一的区别是安德森-达林通过标准偏差(SD)对身高值进行标准化。请查看以下安德森-达令距离的 python 示例。
3.6 瓦瑟斯坦距离
Wasserstein 距离已经用于许多应用中。例如,它已被用作生成对抗性神经网络(GANs)中的损失函数(Gulrajani,I. 2017)。Wasserstein 距离我们考虑所有台阶的高度值和宽度值。当我们认为幂等于 1 时,这种方法以某种方式测量两个 ECDFs 之间的面积。当功率因数为 1 时,瓦瑟斯坦距离等于推土机距离。
Wasserstein 距离测量插图
您可以查看以下 Wasserstein 距离的 python 示例。
以上 python 代码在 Google Colab 上也有。如果使用 R 编程,建议使用二样本库。上面的 Python 代码是从这个库中改写的。对于 MATLAB 用户,推荐一组基于 ECDF 的距离测量函数。
要查看 SafeML idea 的一些示例和案例研究,请查看下面的 GitHub 项目:
https://github.com/ISorokos/SafeML
关于 SafeML 的更多细节可以在我们最近的论文[arXiv][research gate][DeepAI][paper with code]中找到。
4.结论
在这个故事中,人工智能安全的主题已经简要介绍,SafeML 的思想已经解释了一些可能的应用。一些著名的基于 ECDF 的距离测量算法都提供了简单的 python 示例。在我们接下来的故事中,上述 SafeML 的应用将提供代码实现。上述每一种基于 ECDF 的方法都适用于某一类系统。因此,系统的特征和基于 ECDF 的距离测量之间的关系将在接下来的故事中讨论。
SafeML 仍处于早期开发阶段,旨在将其扩展到处理时间序列数据、预测和回归算法(即 Schulam,p .等人(2019))和领域适应(即 Shen,j .等人(2018))。使用 SafeML 作为可解释的 AI 也是可能的,这将在后面讨论。应该提到的是,在“人工智能安全”研究的同时,还有一些其他研究工作专注于人工智能在改善安全模型方面的应用(Gheraibia,y .等人(2019))。
参考
Amodei,d .,Olah,c .,Steinhardt,j .,Christiano,p .,Schulman,j .,和 Mané,D. (2016)。人工智能安全的具体问题。 arXiv 预印本arXiv:1606.06565。
k .阿斯兰塞法特,Gogani,M. B .,Kabir,s .,Shoorehdeli,M. A .,和亚尔,M. (2020-a)。基于半马尔可夫过程的可变门限报警系统性能评估与设计。 ISA 事务, 97 ,282–295。https://doi.org/10.1016/j.isatra.2019.08.015
阿斯兰塞法特,k .,索罗科斯,I .,怀汀,d .,科拉加里,R. T .,帕帕多普洛斯,Y. (2020-b)。SafeML:通过统计差异度量对机器学习分类器进行安全监控。 arXiv 预印本arXiv:2005.13166。
Balunovic,m .,Baader,m .,Singh,g .,Gehr,t .,& Vechev,M. (2019 年)。证明神经网络的几何鲁棒性。在神经信息处理系统进展(第 15287-15297 页)链接。
Gehr,m . Mirman,d . drach sler-Cohen,t . tsan kov,p . Chaudhuri,s .,& Vechev,M. (2018 年 5 月)。Ai2:具有抽象解释的神经网络的安全性和鲁棒性认证。在 IEEE 安全和隐私研讨会(SP) (第 3-18 页)。https://doi.org/10.1109/SP.2018.00058
Gulrajani,I .,Ahmed,f .,Arjovsky,m .,Dumoulin,v .,和库维尔,A. C. (2017)。改进了瓦瑟斯坦·甘斯的训练。在神经信息处理系统进展(第 5767–5777 页)[ 链接。
Gheraibia,y .,Kabir,s .,Aslansefat,k .,Sorokos,I .,和 Papadopoulos,Y. (2019)。安全+人工智能:使用人工智能更新安全模型的新方法。 IEEE 访问, 7 ,135855–135869。https://doi.org/10.1109/ACCESS.2019.2941566
Kabir,s .,Sorokos,I .,Aslansefat,k .,Papadopoulos,y .,Gheraibia,y .,Reich,j .,… & Wei,R. (2019,10 月)。开放适应系统的运行时安全分析概念。在基于模型的安全和评估国际研讨会(第 332–346 页)。斯普林格,查姆。https://doi.org/10.1007/978-3-030-32872-6_22
Scudellari,S. (2020)医院部署人工智能工具在胸部扫描中检测新冠肺炎, IEEE Spectrum 。
舒拉姆,p .和萨里亚,S. (2019 年)。你能相信这个预测吗?学习后审核逐点可靠性。 arXiv 预印本arXiv:1901.00403。
沈军,瞿,杨,张,魏,于(2018 年 4 月)。领域适应的 Wasserstein 远程引导表征学习。在第三十二届 AAAI 人工智能大会上 环节。
相关 GitHub 项目
SafeML 项目:这个故事里已经简要说明过的想法。
NN-可信性工具包项目:人工神经网络软件可信性工程工具箱。
confidential-NN 项目:基于神经网络的分类中经验置信度估计的工具箱。
SafeAI 项目:不同的工具箱,如 SRILab ETH Zürich 的 DiffAI 、 DL2 和 ERAN ,专注于健壮、安全和可解释的 AI。
相关中等职位
佩德罗·a·奥尔特加、维沙尔·迈尼和 DeepMind 安全团队
medium.com](https://medium.com/@deepmindsafetyresearch/building-safe-artificial-intelligence-52f5f75058f1) [## 人工智能安全——你如何防止敌对攻击?
与 IBM 研究人员 Pin-Yu 和 Sijia 就他们最近关于“修剪”和……
towardsdatascience.com](/ai-safety-how-do-you-prevent-adversarial-attacks-ede17480a24d) [## 人工智能安全、人工智能伦理和 AGI 辩论
Alayna Kennedy 在 TDS 播客上
towardsdatascience.com](/ai-safety-ai-ethics-and-the-agi-debate-d5ffaaca2c8c) [## Zen 和自动驾驶中机器学习的安全保证艺术
西蒙·伯顿博士
medium.com](https://medium.com/@AssuringAutonomy/zen-and-the-art-of-safety-assurance-for-machine-learning-in-autonomous-driving-77ebb4c0a302) [## AI“安全”vs“控制”vs“对准”
定义我所说的“人工智能安全”、“人工智能控制”和“价值一致”的含义
ai-alignment.com](https://ai-alignment.com/ai-safety-vs-control-vs-alignment-2a4b42a863cc)
确认
我要感谢 SafeML 项目的贡献者:
- 雅尼斯·帕帕多普洛斯教授(赫尔大学)
- Ioannis Sorokos 博士(弗劳恩霍夫实验软件工程研究所)
- Ramin Tavakoli Kolagari 博士(纽伦堡理工大学)
- 德克兰·怀汀(赫尔大学和 APD 通信)
未完待续…*
如何让你的数据科学项目脱颖而出
创建有效的自述文件
马库斯·温克勒在 Unsplash 上的照片
介绍
所以你创建了一些 dope 模块化代码,用很少的推理时间得到了一个极其精确的模型,你把你的代码推到了 Github 上——你坐在云端。
不幸的是,这是大多数开源项目的终点。在我告诉你为什么它如此不幸之前,让我解释一下什么是开源。
什么是开源?
开源是指人们可以修改和分享的东西,因为它的设计是公开的。当你将你的项目推送到 Github 上的公共库时,你已经为开源做出了贡献,现在任何人都可以检查、修改和增强你的代码。
人们做开源项目的动机各不相同。有些人可能想获得一些实际项目的工作经验,有些人只是喜欢编码,有些人想让世界变得更好,但有一点是正确的,不管开发人员背后的动机是什么。
人们必须知道如何参与你的项目!
不幸的是,当代码被推送到 Github 时,没有人知道如何参与你的项目,Github 知道这一点,所以他们提供了一个叫做 README 的东西,但没有得到充分利用。
如果人们不知道如何使用你的代码,那么在 Titanic 数据集上获得 101%的准确率毫无意义!
这个问题的解决方案很简单,但它会让你远远领先于许多其他人,这些人认为纯粹建立一个 3000 个模型的集合来挤出额外的 1%的准确性就足以让他们受到注意。
如何写自述文件…
我们已经确定,没有自述文件的项目是没有用的,因为它无法提供对已构建内容的深入了解——我们没有让尽可能多的人可以访问该项目。现在的问题是,我们如何写一个好的自述文件。
如果你和我一样,你没有写自述文件的原因是因为你不知道如何写。因此,我将向你展示我到底学到了什么…看看下面的指南:
是的,我知道很多!但接下来的部分很简单。数据科学中使用的 3 个流行框架是什么:
我已经链接了每个框架的 Github 概要文件,剩下你要做的就是访问每一个 Github 库并阅读它们的自述文件——就这么简单(记住,如果你不确定的话,有示例可以帮助你)!
现在你已经掌握了在自述文件上写什么,你会想要添加一些格式来给它额外的推动,所以下面我将链接到互联网上告诉你 Github 格式的最佳资源。
要创建标题,请在标题文本前添加一到六个#符号。你使用的#的数量将决定大小…
docs.github.com](https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax)
包裹
在很多情况下,建立一个更好的模型就足以让你受到关注,比如在 Kaggle 上。然而,许多人每天都在向 Github 发送大量的源代码,即使你有一些看起来很有趣的东西,如果没有自述文件,人们也不会知道如何浏览你的作品。你的工作是让参与你的项目的任务尽可能简单,这个简单的改变会让你的项目脱颖而出。
让我们继续 LinkedIn 上的对话…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
提高深度学习代码质量(第一部分)
构建开源时间序列深度学习框架的经验教训。
作者照片(在马基雅斯米的卡特勒海岸保护区徒步旅行时拍摄)
注意这大致是基于我二月份在波士顿数据科学会议小组 上做的一个 演示。你可以在这里找到 全幻灯片 。我还附上了一些最近的经历和见解,以及对我遇到的常见问题的回答。
背景
当我第一次开始我的河流预报研究时,我设想只用一个笔记本。然而,我很清楚,有效地跟踪实验和优化超参数将在任何河流模型的成功中发挥至关重要的作用;特别是,我想预测美国超过 9000 条河流的流量。这让我走上了开发 flow forecast 的轨道,它现在是一个多用途的时间序列深度学习框架。
再现性
机器学习(尤其是深度学习)最大的挑战之一是能够重现实验结果。其他几位已经谈到这个问题,所以我不会花太多时间详细讨论。要想更好地了解再现性为何如此重要,请参见乔尔·格鲁的演讲和幻灯片。TLDR:为了建立在先前的研究基础上,我们首先需要确保它是有效的。类似地,为了部署模型,我们必须能够容易地找到最佳“一个”的工件
我的第一个建议是不要使用 Jupyter 笔记本或 Colab(至少不要全部使用)。Jupyter Notebooks 和 Colab 非常适合快速构建模型或利用现有的代码库(我将在稍后讨论)进行实验,但不适合构建模型或其他功能。
写出高质量的代码
- 编写单元测试(最好是在编写代码的时候)
我发现测试驱动开发在机器学习领域非常有效。人们问我的第一件事是,我如何为一个我不知道其输出是什么的模型编写测试?基本上,您的单元测试应该属于以下四个类别之一:
(a)测试您的模型返回的表示的大小是否正确。
这可能是最简单的测试之一。有了这个,你就可以简单地看到形状是否正确。尽管这看起来微不足道,但我多次看到人们弄乱了他们模型的维度,然后想知道为什么它不收敛。
(b)测试您的模型针对您指定的参数正确初始化,并且正确的参数是可训练的
另一个相对简单的单元测试是确保模型按照你期望的方式初始化,并且正确的参数是可训练的。
©测试定制损失函数和训练循环的逻辑:
经常有人问我这是怎么做到的?我发现最好的方法是创建一个具有已知结果的虚拟模型来测试定制损失函数、指标和训练循环的正确性。例如,您可以创建一个只返回 0 的 PyTorch 模型。然后用它来编写一个单元测试,检查损失和训练循环是否正确。
(d)测试数据预处理/加载程序的逻辑
另一个要涵盖的主要内容是确保您的数据加载器以您期望的格式输出数据,并处理有问题的值。数据质量问题是机器学习的一个大问题,因此确保您的数据加载器经过正确测试非常重要。例如,您应该编写测试来检查 NaN/Null 值是否被填充或者行是否被删除。
最后,我推荐使用工具 CodeCov 和 Codefactor。它们对于自动确定您的代码测试覆盖率非常有用。
2。利用端到端代码覆盖的集成测试
进行单元测试是好的,但是确保代码以端到端的方式正确运行也很重要。例如,有时我发现一个模型的单元测试运行,却发现我将配置文件传递给模型的方式不起作用。因此,我现在为我添加到存储库中的每个新模型添加集成测试。集成测试还可以演示如何使用您的模型。例如,我用于我的集成测试的配置文件,我经常作为我的完整参数扫描的主干。
3。利用类型提示和文档字符串:
同时拥有类型提示和文档字符串大大增加了可读性;尤其是在传递张量的时候。当我写代码的时候,我经常不得不回头看文档串来记住我的张量是什么形状。没有它们,我必须手动打印形状。这浪费了大量时间,并可能增加您后来忘记移除的垃圾。
4。创建良好的文档
我发现为机器学习项目创建文档的最佳时间是在我写代码的时候,甚至是之前。经常设计 ML 模型的架构设计,以及它们如何与现有的类接口,在实现代码时节省了我大量的时间,并且迫使我批判性地思考我所做的 ML 决策。此外,一旦实施完成,你已经有了一个良好的开端,告知你的同行/研究人员如何使用你的模型。
当然,您需要添加一些东西,比如您传递的参数及其类型的细节。对于文档,我通常在 Confluence (或者 GH Wiki 页面,如果没有的话)中记录更广泛的架构决策,而在 ReadTheDocs 中记录关于代码/参数的细节。我们将在第二部分讨论。拥有良好的初始文档也使得添加模型结果和解释设计工作的原因变得非常简单。
5。利用同行评审
同行评审是在运行实验之前确保代码正确的另一个关键步骤。很多时候,第二双眼睛可以帮助你避免各种各样的问题。这是不使用 Jupyter 笔记本的另一个好理由,因为检查笔记本的差异几乎是不可能的。
作为同行评审者,花时间一行一行地检查代码并在你不理解的地方进行评论也是很重要的。我经常看到审阅者只是快速批准所有的更改。
最近的一个例子:在为大 RNN 添加元数据时,我遇到了一个 bug。这部分代码确实进行了集成测试,但不幸的是,它缺乏全面的单元测试。结果,我做的几个实验,我以为使用了元数据,结果却没有。这个问题非常简单;在第 23 行,我在调用编码器时忘记包含元数据。
通过编写一个单元测试来检查元数据模型的参数在向前传递时是否被更新,或者通过一个测试来检查有和没有元数据的结果是否相等,这个问题可能已经被避免了。
在本系列的第二部分中,我将讨论如何让您的实验具有可重复性,因为您已经拥有了高质量且(大部分)无 bug 的代码。具体来说,我将关注诸如数据版本化、记录实验结果和跟踪参数之类的事情。因此
相关文章和资源:
如何通过情感分析让你的 iOS 应用更智能
情感分析在 Swift 时尚客户评论中的应用
很长一段时间以来,我一直对数据分析感兴趣,以寻找改进移动应用程序的新方法。我最近花了一些时间来试验神经语言处理,这是一个与我日常工作相关的非常具体的用例,对顾客对时尚商品的评论进行情感分析。
语境
我从事时尚电商已经快四年了,对于任何电商来说,真正重要的是顾客评论。所以我在想,“如果我们可以预测客户的评论,这样我们就可以在他们提出要求之前帮助他们”。如果你看看亚马逊,或者应用商店的评论,想象一下如果你能减少所有的负面反馈。所以我更仔细地研究了一下,只花了几个小时就让它工作了。
比方说,我们有一个产品页面,客户可以在那里留下评论,作为一家企业,我想限制负面评论,但也帮助我的客户。从这个角度来看,我的想法很简单,如果客户输入否定的东西,我们会显示一个客户支持按钮。但是怎么知道是不是阴性呢?
嗯,这才是有趣的地方。我将使用一些基本的神经语言处理(NLP)算法对其进行情感分析。与 iOS 开发相比,这部分混合了更多数据分析知识和一点机器学习,但请相信我,苹果为我们做得非常简单。
资料组
首先,我需要一些数据来训练我的模型。足够幸运的是,我在 Kaggle 上找到了一个包含 2 万多条记录的女装评论数据集。这就足够开始了。它包括评级和评论,但不包括建议字段。
根据这些数据,我需要定义什么是“积极的”反馈和“消极的”反馈。我不是数据科学家,我没有太多这方面的背景,所以我只应用了一个简单的逻辑:如果客户对该项目的评分是 4 或 5(满分为 5),或者如果客户推荐了该项目,那么我会认为它是积极的。否则,它将是负的。我相信,我真的相信我也是这样做的:如果我向朋友推荐一项服务,或者如果我留下一个好的评价,它至少会是 4。
理想情况下,你也希望保持中立的评论,以保持平衡,但我暂时会保持简单。
从那时起,我将该规则应用于整个数据集。现在我们可以在 Swift 中训练我们的机器学习模型。
培训模式
通过 CoreML 和 CreateML,苹果让开发人员可以非常容易地基于预定义的计算模型创建新的机器学习模型。因为我对文本中的情感分析感兴趣,所以我将使用 MLTextClassifier。我很惊讶构建它的代码有多短。
培训模式
运行时,这将需要几分钟时间。与我之前在时尚图像分类器中的尝试相比,感觉要快得多。
Parsing JSON records from /Users/benoit/Desktop/clothing-review.json
Successfully parsed 23486 elements from the JSON file /Users/benoit/Desktop/clothing-review.json
Tokenizing data and extracting features
10% complete
20% complete
30% complete [...]
Iteration 19 training accuracy 0.993544
Iteration 20 training accuracy 0.993597
Iteration 21 training accuracy 0.993703
Iteration 22 training accuracy 0.993756
Finished MaxEnt training in 2.00 seconds
Trained model successfully saved at /Users/benoit/Desktop/FashionSentimentClassifier.mlmodel.
现在我的时尚情绪分析模型的第一个版本已经准备好了,我们来测试一下。还好,我在 Xcode 游乐场还能这么做。
Xcode 游乐场中的测试模型
从结果来看,工作似乎还不错,,这让我很震惊。
当然,我可以设法让假阳性使用更复杂和微妙的句子,例如双重否定,但对于我花在这上面的时间,我对第一个结果非常满意。
下一步是什么?
从这里,我可以将这个模型放入一个 iOS 应用程序,当用户在评论期间暂停输入时,我可以让设备对它进行快速情绪分析,并显示“呼叫客户支持”以防止他留下差评,同时帮助他改善整体用户体验。
我还可以对模型本身做进一步的工作,你拥有的数据越多,你花在调整模型上的时间越多,你就会得到更好的准确性。每个项目都不一样,我感觉每个模式都应该,适应你自己的问题。
结论从用户体验问题或者业务问题出发,我们找到了一种利用机器学习和简单的数据分析概念来改善用户体验的方法。如果这看起来与 iOS 的日常开发相去甚远,那么它的第一个版本的原型开发速度之快让我感到惊讶。显然,你的应用程序(和产品)越复杂,你需要提炼的数据就越多,并保持高精度。
目前,这个仅限于女装,但它让我想知道我们能走多远,以保持我们的 iOS 应用程序的 UX 非常清晰。
关于https://benoitpasquier.com可以阅读原文。
很长一段时间以来,我一直对数据分析感兴趣,以寻找改进移动应用程序的新方法。我已经…
benoitpasquier.com](https://benoitpasquier.com/2020/01/how-to-make-your-ios-app-smarter-with-sentiment-analysis/)
如何让你的求职变得更容易
关注团队结构
找工作有时感觉就像在我们不熟悉的黑暗房间里找蜡烛。我们没有完整的信息,每个公司都有不同的标准,不清楚这个职位在未来几年可能会把你带到哪里。这是事实,尤其是在数据科学领域,因为数据科学工作远未标准化。您的工作与另一位数据科学家的工作相比,有许多不同的层次和级别。
之前我谈到过你最终能在获得什么样的职位(内部/顾问数据科学家/自由职业者/等等)。)和职位的年资之差。但是还有另外一层:团队结构。
这听起来可能是一件微不足道的事情,但团队结构可以给你一些提示,告诉你什么类型的数据科学工作会被期待,以及你的职业发展方向。
了解不同的团队结构以及它们如何影响你的数据科学工作,也将使你更容易在公司之间做出选择。更不用说它会给你一个坚实的申请理由,所以当你被问到“为什么是我们公司?”你会有一些实质性的东西可以分享。
作为一名数据科学家,您可以选择的工作方式包括:
- 在一个致力于 AI、ML 或数据科学的部门/团队,与其他数据科学家、数据工程师、
- 在一个部门(比如营销,战略等。)作为数据科学家之一,
- 公司中唯一的数据科学家或顾问
根据这些职位的不同,你将承担不同程度的责任和创造性的工作量。
当涉及到他们的工作时,AI 或 DS 团队往往更自由。他们的目标是为公司的其他团队或最终用户开发相关的工具和技术。拥有人工智能团队的公司将部分精力投入研究并不罕见。这些公司了解人工智能的价值以及它可以给他们的工作领域带来什么,并了解创造性或基于研究的工作对于跟上世界上发生的事情和适应最新技术是必要的。这就是为什么,在这样的人工智能团队中,你更有可能做创造性的工作,追求新技术,应用最近发明的东西。这些团队的工作倾向于从开始到结束。你可能需要交付完整的产品。因此,可能需要多种技能。这些团队中的人倾向于在他们选择的领域有专攻和发展的自由,只要它与公司的目标一致。
如果你是一个部门中为数不多的数据科学家之一,你的工作更可能是一次性的快速任务,如创建分析,建立数据模型。这项工作有可能会被标准化,你会被期望定期做类似的事情。不太可能期望你构建独立的最先进的产品。像这样的团队倾向于希望他们的团队成员产生可靠的、低风险的解决方案。你将使用成熟的技术。可能会有足够的自由来做出自己的选择,因为你将是少数几个了解数据以及如何使用数据的人之一。随着你在这些团队中获得经验,你将有可能成为某个部门的专家(可能是市场营销、销售等。)并成为该领域的数据专家。
如果你是团队里唯一的数据科学家,那你创造产品的可能性就更小了。不过,你将会是任何与数据有关的事情的最佳人选。就责任而言,这是一个危险的地方,因为期望可能非常高。但是,如果你喜欢承担责任和负责事情,这可能是一个爆炸。这项工作可能会是快节奏的日常工作,因为会有来自公司不同部门的大量输入,你需要提供所需的数据支持。如果这家公司不是高科技或数据驱动的机构,你可能最终会使用非常陈旧的技术,而这些技术大多被技术更先进的公司所抛弃。尽管在这样的公司里,你可能更接近商业决策。你很可能会对商业决策产生更大的影响,你可能会成为公司最有价值的资产之一。你在这个职位上的未来可能会倾向于商业方面。
好了,这是对不同团队如何使用数据科学家以及基于团队类型的工作差异的一些观察。当然,不要忘记这些仅仅是观察,而不是坚如磐石的事实。我在这篇文章中谈论的一切都是基于我自己的经历和我迄今为止从我的播客嘉宾那里听到的。你可能会找到一家公司,在那里你是唯一的数据科学家,但你在做摇滚明星级别的研究。或者你可能会在一个数据科学专门团队中结束,那里还没有使用机器学习。不过,了解可能的团队结构会让你知道自己想要什么,不想要什么。你可以在面试中问一些更直接、更有针对性的问题。
所以现在是你决定的时候了,你是想使用最先进的工具,生产独立的产品,在快节奏的环境中建立模型还是帮助企业更快地发展?你不必做一个一成不变的决定,当然,决定会改变,梦想会发展成其他的梦想。但至少简单地定义你的目标会帮助你更有效地搜索,并激发你的信心。
👉对数据科学领域以及如何开始学习感到困惑? 免费参加数据科学入门迷你课程 !
如何使用 python 制作自己的带面部识别的 Instagram 滤镜
实践教程
图片由 teguhjati pras 拍摄;通过 Pixabay 获得知识共享许可
在过去的 10 年里,面部识别技术发展迅速,并迅速开发出多种用途。从实用的(解锁手机),到好玩的(Instagram 滤镜),再到有争议的(安全、监控和警务),我们的脸可以在许多方面被技术使用。好奇如何自己创造一些面部识别技术吗?脸书提供了 SparkAR 平台,为脸书和 Instagram 创建面部识别过滤器。 然而 ,我们可以很容易地使用 python 中的 OpenCV 包自己创建一个,因此我们可以在任何地方使用面部识别。
背景信息:计算机是如何“看见”的?
对计算机来说,图像只是一系列指示像素位置的数字。计算机程序员可以创建算法,教会计算机如何识别图像中的独特特征。有趣的是,计算机“看”到了类似于人类如何解决拼图游戏。考虑下图:
图片由比尔·塞拉克拍摄;通过 Flickr 获得知识共享许可
三叶草的拼图块很容易放置,因为它们有不同的形状,逻辑上只能放在一个地方。边缘件还具有明显的扁平特征,限制了它可能到达的位置,只有沿着边缘的一组可能性。剩下的碎片可能真的在任何地方。这个过程被称为特征图像提取,其中用户识别图像的特征以帮助他们构建整体图像。计算机可以通过像素数据的趋势来模仿这种思路。数据科学家使用机器学习算法来教计算机如何识别这些日益复杂的趋势。对于面部识别,首先识别眼睛(面部最显著的特征之一),然后使用模板绘制面部的其余特征。
第一步:在照片中寻找面孔
现在我们知道了计算机视觉的基本原理,我们可以开始构建过滤器了。首先,让我们在静态图片中找到人脸和眼睛。首先在您的计算机上安装,然后将 OpenCV (一个用于图像处理的开源 python 包)导入到 py 文件中。OpenCV 中的所有图像结构都可以与 NumPy 数组相互转换,因此导入 NumPy 也很有用。一旦你安装了 OpenCV,你应该可以访问。包含面部识别和其他图像处理算法的 xml 文件。在本教程中,我们将使用一种叫做哈尔级联的算法来处理人脸和眼睛。如果你找不到这些文件所在的目录。xml 文件是,我建议快速文件搜索“haarcascade”。一旦找到存储 Haar 级联的目录的路径,调用 CascadeClassifier 并通过它传递路径:
太好了,现在我们设置好了,我们可以加载图像并寻找人脸。请注意,哈尔级联和许多面部识别算法要求图像是灰度的。所以,在加载图像后,将其转换为灰度,然后使用 face_cascade 来检测人脸。得到脸部后,在它周围画一个矩形,在脸部区域搜索眼睛。然后在每只眼睛周围画矩形。
通过程序输出传递来自 Unsplash 的库存图像:
照片由 Gustavo Alves 在 Unsplash 上拍摄;由作者修改
酷!效果很好!请注意,有时 Haar Cascade 无法正确识别人脸和眼睛,特别是如果有人没有完全面对相机,有时它会认为嘴角和鼻子是眼睛。如果发生这种情况,对于本教程,我建议使用另一张照片。否则,您将需要自己创建一个完整的其他算法,而不是使用 OpenCV 的 Haar Cascade。
步骤 2:创建你的图像过滤器
对于我的过滤器示例,我将使用女巫帽,因为本周末是万圣节。编辑上面的代码,我们可以在图片中读取一个女巫的帽子和我们的库存照片。因为我们要把帽子放在库存照片的上面,所以我们必须得到放置帽子的坐标。我们还必须弄清楚我们实际上想要使用女巫图像的哪些部分。我们可以通过使用 cv2.threshold()和 cv2.bitwise_not()方法来确定我们希望保留女巫图像的哪一部分,不保留哪一部分(这称为遮罩)。
然后,对于每一张脸,我们必须把女巫的帽子放在哪里。使用面部的高度和宽度确定面部区域边界的坐标。然后调整女巫图像(或您选择的任何滤镜)的大小以适合面部区域,并选择适当的坐标来放置它。你可能不得不摆弄这些坐标,以获得你选择的图像降落在正确的地点。在我的女巫示例中,我必须上移过滤器/女巫图像,如下面的 witch_y1 所示,因为帽子的边缘应该落在人的前额上。如果我没有这样做,帽子图像将被准确地放置在脸部区域。一定要检查你的滤镜图像是否超出了主图像的框架。最后,使用遮罩来雕刻出放置滤镜的地方。
在我们的股票图像上运行这个新脚本:
古斯塔沃·阿尔维斯在 Unsplash 上的照片;由作者修改
我们已经成功构建了静态图像的面部识别过滤器!
步骤 3:应用到实时视频源
到目前为止,我们已经识别了静态照片中的人脸,并在它们上面放置了过滤图像。最后,我们需要用活动图像来做这件事。代码和以前一样,但是这次我们让 OpenCV 访问我们计算机的摄像头,而不是静态图像。我们还需要在 while 循环中包装我们在前面两步中使用的 faces 循环,以保持它在我们提供的每一帧直播视频中查找人脸。用户可以按字母“q”退出程序。
步骤 4:屏幕截图或屏幕录制
在这一点上,最简单的方法就是使用我们电脑内置的屏幕捕捉或屏幕记录来保存我们摄像头过滤后的视频。
Mitchell Krieger 创建的 GIF
或者,如果你想用代码做任何事情,或者对捕获或记录有更多的控制,你可以使用 PIL 或 PyAutoGUI 通过代码捕获你的屏幕。
对我的原创剧本好奇吗?签出 这个 GitHub 库
如何让您的 Python 代码更具功能性
以及为什么这会使您的代码更加健壮、可测试和可维护
Python 很棒。以下是让它变得更好的方法。大卫·克洛德在 Unsplash 上的照片
近年来,函数式编程越来越受欢迎。它不仅非常适合像数据分析和机器学习这样的任务。这也是一种使代码更容易测试和维护的强大方法。
趋势显而易见:尽管它们仍处于小众位置,但像 Elm 和 Haskell 这样的纯函数式语言正在获得关注。有些功能性的语言,如 Scala 和 Rust ,正在起飞。像 C++、Python 这样的流行语言也在它们的清单中加入越来越多的函数式编程。
如果你已经习惯了面向对象的代码,那么写函数式程序一开始看起来会很吓人。好消息是,您可以很好地混合使用函数式代码和面向对象代码。函数式编程的一些调整通常足以获得一些好处。所以让我们开始吧!
从 Python 到 Haskell,这种趋势不会很快消失
towardsdatascience.com](/why-developers-are-falling-in-love-with-functional-programming-13514df4048e)
纯函数
非函数式编程的讨厌之处在于函数可能会有副作用。也就是说,它们利用了不一定出现在函数声明中的变量。
考虑这个简单的例子,我们将两个数字相加:
b = 3
def add_ab(a):
return a + b
add_ab(5)
全局变量b
没有出现在add_ab
的声明中,所以如果你想调试它,你必须检查一下b
是否被使用了。听起来很简单,但是对于更大的程序来说可能会很乏味。我们可以很容易地解决这个问题,只要诚实地说出我们在函数中放入了什么:
def add_ab_functional(a, b):
return a + b
add_ab_functional(5, 3)
这只是一个愚蠢的小例子。但是对于更大的程序,你会注意到当你不需要担心副作用时,理解和调试代码会容易得多。
高阶函数
在函数式编程中,可以嵌套函数:要么设计一个以另一个函数作为参数的函数,要么编写一个返回另一个函数的函数。
作为一个采用另一个函数的函数的例子,假设您有一个数字数组,并且您想要计算该数组的正弦、余弦和指数。理论上,你可以这样写(numpy
是一个数学的 Python 包):
import numpy as np*# make a list of numbers as input values for functions*
numbers_list = np.arange(0, 2*np.pi, np.pi/10).tolist()*# calculate sine* def do_sin(numbers):
return np.sin(numbers)
sin_list = do_sin(numbers_list)*# calculate cosine* def do_cos(numbers):
return np.cos(numbers)
cos_list = do_cos(numbers_list)*# calculate exponential* def do_exp(numbers):
return np.exp(numbers)
exp_list = do_exp(numbers_list)
这很好也很简单,但是用完全相同的结构写三个不同的函数有点烦人。相反,我们可以编写一个函数,像这样使用其他函数:
import numpy as np*# make a list of numbers as input values for functions*
numbers_list = np.arange(0, 2*np.pi, np.pi/10).tolist()*# calculate with some function* def do_calc(numbers, function):
return function(numbers)*# calculate sin, cos, and exp*
new_sin_list = do_calc(numbers_list, np.sin)
new_cos_list = do_calc(numbers_list, np.cos)
new_exp_list = do_calc(numbers_list, np.exp)
这不仅更加简洁易读。它也更容易扩展,因为您只需要为一个新的function
添加一行,而不是上面例子中的三行。
函数式编程的一个关键概念是将函数嵌套在一起。照片由this engineering RAEng在 Unsplash
还可以把函数中函数的概念倒过来:不仅可以让一个函数把另一个函数作为自变量;你也可以让它返回一个参数。
假设您有一个数字数组,您需要将数组的每个元素递增 2:
def add2(numbers):
incremented_nums = []
for n in numbers:
incremented_nums.append(n + 2)
return incremented_numsprint(add2([23, 88])) *# returns [25, 90]*
如果你想增加一个数组的元素,当然,你可以复制粘贴这个函数并用这个增量替换2
。但是有一个更优雅的解决方案:我们可以编写一个函数,它接受任何增量,并返回另一个函数来执行add2
所做的事情,但是针对任何增量。
def add_num(increment):
def add_inc(numbers):
incremented_nums = []
for n in numbers:
incremented_nums.append(n + increment)
return incremented_nums
return add_incadd5_25 = add_num(5.25)
print(add5_25([23.37,88.93])) *# returns [28.62, 94.18]*
使用这个例程,每个新函数只需要一行来定义,而不是五行。像接受函数的函数一样,返回函数的函数更容易调试:如果你在add_num
中有一个错误,你只需要修复它。你不需要回去修改add2
和其他任何你用同样方式定义的函数。项目越大,回报就越多。
注意,尽管add_num
是以函数式风格编写的,但它并不纯粹是函数式的。它有一个副作用,numbers
,这使它成为一个不纯的函数。但是没关系:你不需要成为一种编程范式的奴隶;相反,你可以充分利用这两者来最大化你的生产力。
装饰者可以让你的代码更加优雅。费尔南多·埃尔南德斯在 Unsplash 上拍摄的照片
装修工
当然,你可以将上面的两种方法结合起来,编写一个函数,它不仅接受一个函数作为参数,还返回一个函数。考虑这段代码,我们从上面扩展了add_num
函数:
def add_num(message):
def add_inc(increment, numbers):
message()
incremented_nums = []
for n in numbers:
incremented_nums.append(n + increment)
return incremented_nums
return add_incdef message1():
print("Doing something...")**message1 = add_num(message1)** print(message1(5, [28,93]))*# Doing something...
# [33, 98]*
与上面示例的一个不同之处在于,您可以定制屏幕上输出的消息。例如,在一个更大的程序中,你可以扩展它来考虑不同的错误信息。
线条message1 = add_num(message1)
是魔法发生的地方:名字message1
现在指向add_num
的内层,即add_inc
。这叫装饰。
另一个区别是参数increment
被向下推了;这只是让下一步更容易处理。
我们可以用@
语法让装饰更加漂亮(其中的def add_num
部分保持不变):
**@add_num** def message1():
print("Doing something...")print(message1(5, [28,93]))
实际上,这只是编写装饰的一种更加简洁的方式。注意,使用 decorator并不意味着你的代码是有效的。更确切地说,装饰者受到函数式编程的启发,就像嵌套函数一样。上面的例子并不纯粹是函数式的,因为它包含了两个副作用,但是它仍然受到了函数式编程的启发。
了解如何使用 Python 中的 lambda、map、filter 和 reduce 函数来转换数据结构。
towardsdatascience.com](/elements-of-functional-programming-in-python-1b295ea5bbe0)
生成器表达式和列表理解
列表理解和生成器表达式是 Python 从纯函数式编程语言 Haskell 复制的概念。考虑下面的例子,我们试图计算几个平方数:
numbers = [0, 1, 2, 3, 4]
square_numbers = []for x in range(5):
square_numbers.append(x**2)square_numbers *# [0, 1, 4, 9, 16]*
这很笨拙,因为我们需要定义两个数组并编写一个for
循环。一个更简洁优雅的方法是用列表理解来做这件事:
square_numbers = [x**2 for x in range(5)]
square_numbers *# [0, 1, 4, 9, 16]*
通过添加一个if
条件,您可以只选择特定的元素。例如,假设我们只想要偶数的平方数:
even_square_numbers = [x**2 for x in range(5)
if x%2 == 0]
even_square_numbers *# [0, 4, 16]*
列表理解将列表的所有值存储在内存中。这对小对象来说很好,但是如果你处理大的列表,它们会让你的程序变得很慢。这就是生成器表达式发挥作用的地方:
lots_of_square_numbers = (x**2 for x in range(10000))
lots_of_square_numbers *# <generator object <genexpr> at 0x1027c5c50>*
生成器表达式不会立即计算对象。这就是为什么如果你试图调用它们,你只会看到一个有趣的表达式(输出的确切形式取决于你的操作系统)。但是,它们使它们以后可以访问。您可以像这样调用生成器表达式的元素:
next(lots_of_square_numbers) # 0
next(lots_of_square_numbers) # 1
next(lots_of_square_numbers) # 4
...
或者,您可以创建生成器表达式中前几个元素的列表,如下所示:
[next(lots_of_square_numbers) for x in range(10)]
*# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]*
与其他技巧一样,这不会自动使您的代码变得纯粹实用。这只是从函数式编程中借用的一个概念,在许多情况下都很有用。
Lambda 表达式可能是常规函数定义的一个很好的替代品。图片由 NESA 制作在 Unsplash 上拍摄
小函数和 lambda 表达式
如果想写一个小函数,这样写也没什么不好:
def add_ab(a, b):
return a + b
然而,你也可以用一个lambda
式的表达:
add_ab2 = lambda a, b: a + b
它的长度几乎是一样的,一旦你习惯了它的语法,就很容易读懂。用不用真的看个人口味了。但是正如我们将在下面看到的,它在某些情况下非常方便。
如上所述,使用lambda
-表达式不一定会使你的代码功能化,即使它们是函数式编程的一个关键思想。
内置 Python 函数
地图()
函数map()
主要返回生成器表达式。这是一个简单的例子:
numbers = [0, 1, 2, 3, 4]
squared_numbers_map = list(map(lambda x: x**2, numbers))print(squared_numbers_map)
*# [0, 1, 4, 9, 16]*
正如你前面看到的,你可以用列表理解做同样的事情。然而,当您使用map()
函数时,有时您的代码会更具可读性。
过滤器()
这类似于使用if
子句的列表理解,例如:
squared_numbers_map_even = list(filter(lambda x: x%2 == 0, squared_numbers_map))print(squared_numbers_map_even)
*# [0, 4, 16]*
你也可以像这样嵌套map()
和filter()
:
squared_numbers_map_even_new = list(filter(lambda x: x%2 == 0, list(map(lambda x: x**2, numbers))))print(squared_numbers_map_even_new)
*# [0, 4, 16]*
枚举()
如果你在遍历一个列表,并且需要跟踪索引,enumerate()
是一个不错的选择:
for num in enumerate(squared_numbers_map_even):
print(num)
*# (0, 0)
# (1, 4)
# (2, 16)*
zip()
如果需要从两个列表中创建元组,可以使用zip()
:
list(zip(['a', 'b', 'c'], (1, 2, 3)))
*# [('a', 1), ('b', 2), ('c', 3)]*
因为zip()
像生成器表达式一样只返回可迭代的对象,所以list()
包含在这个表达式中。
functools 模块
有时候你会有一个函数,它有几个参数,但是你需要修改几个参数。考虑这个简单的例子:
import functoolsdef add_lots_of_numbers(a, b, c, d):
return a + b + c + dadd_a_and_b_27 = functools.partial(add_lots_of_numbers, c=18, d=9)
add_a_and_b_27(1,2) *# 30*
在这个模块中,除了functools.partial()
之外,还有几个功能,但这是迄今为止最重要的一个。和以前一样,partial()
并不总是导致函数式代码,但是它是从函数式编程中借用来的一个简洁的概念。
让你的软件更快、更易读和更易维护并不需要这么难
towardsdatascience.com](/the-ultimate-guide-to-writing-better-python-code-1362a1209e5a)
几个简单的小技巧就能帮上大忙
当你开始编码的时候,你可能听说过很多关于面向对象编程的东西,而不是关于函数式编程的。这确实有道理,因为面向对象编程非常有用。
但是最近几年,我们遇到了越来越多的问题,当你掌握一些函数式编程的技巧时,这些问题就更容易解决了。
你不需要马上学习像 Elm 或者 Haskell 这样的函数式编程语言。相反,您可以提取它们最有用的方面,并直接在 Python 代码中使用它们。
一旦你知道了窍门,你会发现到处都有机会使用它们。编码快乐!
如何管理一名初级数据科学家
让你和你的团队保持快乐和高效的个人思考
你是否曾经希望你能克隆一个自己?信息永远不会在翻译中丢失,你会确切地知道你的直线报告能够做什么工作,他们会觉得你的笑话很好笑。
弗兰克·麦肯纳在 Unsplash 上拍摄的照片
但是我们不能这样做,尽管我对自己的看法有些夸大,但这并不是特别可取的。相反,当团队拥有多样化的背景和思维时,他们工作得最好。另外,知道你的经理可能也有同样的想法也是一种有益的谦虚练习。
因此,在这个没有克隆的世界里,你需要在初级数据科学家开始实地工作时,迎接管理他们所带来的挑战和回报。
一点点判断,大量的尝试和错误,让我停下来思考和反思那些对我有效的事情,以及那些失败的事情。
冒着听起来像是一篇自助文章的诱饵的风险,我挑选了 6 个关键点,作为一名经理,我会记住它们。
本文主要是为管理团队中更多初级成员的数据科学家(或高级)而写的,但希望对每个人都有帮助。
让我们来看看我的 6 个观察。
一对又一对
配对是软件工程师之间的一种常见技术,两个工程师使用双显示器或共享屏幕来处理相同的代码。通常,一个人是领航员,指导工作并编写代码,而另一个人是导航员,沿途进行观察或提出建议,在适当的时候也可以直接编写代码。
照片由阿米尔-阿巴斯·阿卜杜拉里在 Unsplash 上拍摄
结对的美妙之处在于你可以互相学习,发现你自己不会发现的错误,并且作为一个集体写出更高质量的代码。
感觉配对在数据科学中变得越来越普遍,因为软件工程的界限越来越模糊。结对在整个团队中产生了巨大的成果,尤其是对初级成员而言。
如果您正在向他们介绍新的或令人畏惧的东西,结对是一个很好的机会,在移交控制权之前,您可以作为试点开始您的项目,在实践中演示代码,以便您的团队成员可以在实践中学习,您可以在他们旁边提供指导。
这可能是你已经不太正式做的事情,但我发现如果你在某个时间预订并说…
让我们两人一组,一起写这个
…而不是简单地事后审查一些代码,或者在没有帮助他们开始的情况下向他们抛出一个新话题。
试一试,找到适合你们两个人的动力,确保你在日历上留出适当的时间,让你们不受干扰地富有成效地配对。
选择你的战斗
随着开始结对越来越多,我也注意到自己说的越来越多。虽然沟通是关键,但开始吹毛求疵并纠正任何作品直到它看起来完全像你写的一样是很容易的。
这种模式让我思考(担心),所以我拿出了我给我的直线报告的最后 5 条书面反馈。重读我的信息后,我很快意识到其中大部分源于个人偏好。本质上,我是说我不会用一种特殊的方式写代码,或者我会用我的风格展示一些幻灯片。
而不是问“这份工作和我自己的相比如何?”,我应该问唯一重要的问题,“这项工作是否达到了我们设定的目标?”。
例如,我有什么资格说这个代码…
df.rename(columns={“old_name”: “new_name”}, inplace=True)
…比这更好…
df = df.rename(columns={“old_name”: “new_name”})
实际上,我列出了数据科学的一些方面,这些方面是我认为普遍良好的实践,并希望我的团队遵循。如果我对一个不在清单上的主题提供反馈,它就像一个有用的电击,因为如果它不是必须的,那么它可能就没那么重要了。
当涉及到反馈和评审工作时的优先级。图片由作者提供。
什么会出现在你的清单上?你可能会发现,放下不太重要的东西会让你的评审更有效率,也不太可能让你的团队感到被反馈轰炸了。
在职和脱产学习
数据科学是一个广阔而动态的领域,不可能与所有的进步保持同步,也不应该指望你能跟上。
尽管如此,无论你是数据科学通才、ML 工程师还是研究人员,一个不可回避的事实是,你需要了解你的洋葱并拥有一定的技术技能。
蒂姆·莫斯霍尔德在 Unsplash 上的照片
冒名顶替综合征可能会袭击团队的任何成员,不仅仅是初级成员,但初级数据科学家应该得到足够的耐心和支持,特别是要稳步掌握这个角色。比以前的经验更重要的是他们学习交易的意愿、热情和好奇心。
明确你的团队可以花一些时间专注于可能对他们有益的新技能,例如每月一个星期五专门用于培训。
一定程度的学习也必须发生在工作之外。分享教程、为团队订阅时事通讯、参加聚会以及经营日志俱乐部都是鼓励持续学习的好方法。这也是一个有用的酸性测试;如果你的团队没有以某种形式致力于个人发展,警钟应该敲响了。
定义进展
这是我团队中一名成员的坦率反馈。在我们每周一次的谈话中,他们说…
我不确定我在公司的发展方向,也不知道我需要做些什么才能进步
不是一个好地方,也不是一个好经理。但是他们是绝对正确的,我们从来没有真正坐下来讨论过车队的发展会是什么样子。
林赛·亨伍德在 Unsplash 上拍摄的照片
这个反馈作为一个有用的唤醒电话来执行两个动作。
- 创建一个文档,表达初级数据科学家的职责和特点,以及下一步的发展方向。这不需要太多的规定,但它有助于透明地显示他们应该以什么为目标。
- 询问他们在这个角色中最开心的是什么。他们什么时候感到最自豪?如果可以选择,他们最想做什么类型的工作?了解某人是个人贡献者还是将自己视为未来的团队领导者,意味着你可以相应地调整他们的进展。
你对团队内部的发展有清晰的规划吗?你应该为你自己和你的初级数据科学家创建一个透明的描述,说明你的期望,以及他们需要展示什么来证明一个令人信服的晋升案例。
来自数据科学家的关怀和喂养的职业阶梯示例。https://or eilly-ds-report . S3 . Amazon AWS . com/Care _ and _ Feeding _ of _ Data _ scientists . pdf
寻找合适的机会
如上所述,团队成员应该有一定的自由来表达他们想成为什么类型的数据科学家,以及他们觉得自己的专长是什么。
尽管如此,您仍然需要一个了解交付数据科学项目的完整端到端流程的团队。拥有一个不知道如何将他们的模型投入生产的机器学习专家或者一个不能与利益相关者互动的强大的编码员是没有用的。
如果你已经定义了进展的样子,下一步就是确保你准备好帮助你的团队到达那里。
我发现一起坐下来,为数据科学家应该具备的不同技能以及他们在每个领域的暴露程度创建一个记分卡是一个有用的练习。
这个练习不是关于优势,而是关于他们是否有机会获得他们需要的技能。这样做是双赢的,因为他们将有一个明确的发展计划,而你也将因此拥有一个更全面的团队。
例如,您的生产线报告可能会说…
- “在过去的几个月里,我一直埋头于 SQL 代码和摄取管道,我想回到一些机器学习上来”。
- “我做过很多模型,但总是有人接手并为我在生产中部署它。”
创建记分卡可以让你直接听到他们关心的问题或发展需求,然后提出解决盲点的计划。
这是记分卡的一个高级示例。这个练习可以是你想要的任何形式,但是你们应该一起做。
记分卡示例。图片由作者提供。
OKR 的
你是数据科学家。你喜欢测量东西。在为你管理的人设定目标时,你应该运用这种思维。
关于 SMART 目标、 OKRs 、 BHAGS 以及任何你能想到的其他缩写词的文章数不胜数。可以说,目标应该是相关的、雄心勃勃的、可衡量的。
数据科学家通常是一群充满激情的人,我们可能会因为想要学习最新和最伟大的框架或寻找使用深度学习的机会而分心。但我们不是在泡沫中工作,最终,我们的雇主会期待一些有价值的东西回来。
因此,在个人发展目标之外,指定一个与商业成果相关联的目标是有意义的。
比方说,你的公司每月都要发邮件来吸引新客户,收到邮件的人中有 10%会成为客户。
数据科学团队被要求提高其绩效,这对初级数据科学家来说是一个完美的项目。在开始工作之前,你可以设定这个目标和可衡量的结果…
目标:提高邮件活动的转化率
关键 结果:预测谁应该成为目标的一个模型
似乎是个不错的起点。我们有一个项目要做,做这个项目的人需要交付一个模型是有意义的。但是这个模型发生了什么,它是如何投入使用的,我们如何知道这项工作是否成功?
也许关键结果的下一次迭代会是…
关键结果:一个预测谁应该是 60%召回目标的模型
我们离成功越来越近了,但它依赖于像召回这样的统计测量,而不是影响业务 KPI 的东西。
如果你强迫自己从商业角度思考,你可以和 CRM 和财务团队谈谈,了解什么是有意义的改进。也许他们会告诉你转换率必须从 10%增加到 15%,以证明更新他们的工作流程和将你的模型合并到产品中的额外工作是合理的。
太好了。接下来,你必须考虑如何测量,以及实验会是什么样子。如果你得到了你无法衡量的东西,你还应该继续努力吗,因为你永远不知道它是否值得?
这个关键结果感觉比较扎实…
关键结果:使用数据科学模型与现有方法进行活动的 A/B 测试,证明通过使用该模型,转化率至少提高了 15%
你无法控制的事情总会发生。你可能交付了世界上最好的模型,但是利益相关者没有以正确的方式使用它。在这些情况下,至少你开始时有了正确的意图,并且可以在你的评估中考虑减轻因素。
首先从一个有商业头脑的目标开始,并考虑你想要进行的实验来验证你的工作,你的团队将开始变得对你和你的公司更有价值。
那是一个包裹
就像生活中的所有事情一样,当涉及到数据科学和管理时,还有很多东西需要学习,但我希望这 6 条建议中的一些可以帮助你一路走来。
- 配对
- 定义你必须拥有的东西,放下个人喜好
- 重视日常工作之外的学习
- 传达从初级晋升到高级所需的特质
- 为工作的不同元素创建记分卡
- 设定商业目标
祝你和你的团队好运!
当你在这里的时候
请随意查看我的其他文章:
如何管理与 ESB 替代方案的数据集成
了解如何在几分钟内设置 N8N 并实施工作流程
在我们开始讨厌独石之后的一秒钟,集成已经在我们的必备清单上占据了一席之地。如今,在现实世界的应用程序中,不可避免地会出现多个系统相互通信的情况。就像人类一样,交流是非常困难的。你可能会失去连接,在某一方有计划外的改变,错误可能会在任何地方发生。这就是为什么交流太重要了,没有工具是不行的。手工制作的解决方案以噩梦告终。企业模式建议我们将 ESB 解决方案添加到我们的架构中,但是在许多场景中这可能很昂贵。在本文中,我们将学习如何使用免费且简单的工具 n8n 解决最常见的集成问题。
图片来自 geralt 的 pixabay
什么是 ESB
一条企业服务总线 ( ESB )就是数据高速公路。它不仅将数据从 A 分发到 B,还创建了一个基于 API 的公共集成层(面向服务的架构,SOA,面向旧时尚定义爱好者)。在这种体系结构中,多个软件只使用一条总线来通知本地变化和数据变化。简单地说,在这个架构中,您不必集成多个系统,只需集成一个系统:ESB。将变更传播给可能对该信息感兴趣的其他参与者的将是 ESB 本身。所有这些过程对你来说都是透明的。这就把系统间的网状通信问题变成了星型拓扑。对于那些没有多点集成经验的人来说,这意味着您将减少集成成本和维护。您将降低成本,因为所有的集成都将支持相同的格式和标准。您将减少维护成本,因为由其他系统引起的所有更改都将被 ESB 吸收(希望由有效管理这些问题的专业团队来完成)。许多现代 ESB 维护流入管道的信息的副本。这意味着一个包含公司所有战略信息(黄金记录)的数据库,可以由使用结构化 API 协议(如 GraphQL)的各方使用。
这里总结了 ESB 的职责:
- 在系统间发送消息
- 监控、记录和控制此消息流,包括错误报告
- 提供一个稳定的 API 架构,可以被所有系统集成
- 使所有格式符合标准
- 对事件进行排队,保持性能,出错时动作的可重复性。
- 可选功能,如在本地存储数据以作为 MDM 或内部工作流来转换信息
N8N 是什么?
N8N 不完全是 ESB,更像是一个工作流自动化工具。在官方网站上,它将自己定义为领先的点对点集成云解决方案 Zapier 的免费内部替代方案。
这样的解决方案不是 ESB,因为基本上,它提供了一个网状集成网络。当你把 A 和 B,C 和 D 直接连接起来时,就会发生这种情况,这很自然。理论上,这样做,您会失去 ESB 的大部分好处,就像所有数据都在其中流动的真正总线一样。
无论如何,即使通信仍然是点对点的,只要在同一个平台上管理它,就可以通过简单的用户界面完全控制所有的集成。
N8N 的关键特性是什么?
- 免费您可以在您的内部数据中心或云中免费运行 n8n。无论你的公司规模或整合数量。
- 易于扩展您可以使用市场上的连接器,也可以自己创建连接器。
- 你的数据会留在身边你可以在本地运行。这是安全的、高效的、高性能的,并且避免了像向云开放 VPN 或在内部安装代理以允许云工具进入您的 l an 这样的痛苦。
最常见的场景是什么?
- 循环作业您可以处理像“每 Y 小时运行 X”或“每天将数据从 X 移动到 Y”这样的用例
- 同步数据您可以从源和目标创建移动数据,使它们保持一致。您可以有任何种类的源或目的地,比如 API、RDBMS、NoSQL 和文件。
- 对事件做出反应所有的工作流都可以通过一个 API 调用来启动。这让我们可以管理类似“当用户在 Y 应用程序中执行 X 操作时,也执行该操作”的场景我们需要的唯一部分是调用 Y 应用程序上的 API。
如何设置 N8N
N8N 的设置非常简单。我跳过了每次手动安装,因为我是 docker 爱好者,但如果你愿意,你可以使用传统的安装过程。如果你是一个 docker 爱好者,或者不太害怕容器,你可以使用下面的 docker-compose 文件并运行“docker-compose up”命令
version: '2'services:
n8n:
ports:
- "5678:5678"
image: n8nio/n8n
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=admin
- DB_TYPE=mongodb
- DB_MONGODB_CONNECTION_URL=mongodb://root:password@mongo:27017/n8n?authSource=adminmongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=password
- MONGO_INITDB_DATABASE=n8n
ports:
- 38017:27017mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: mysql
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
这个 docker-compose 创建了一个链接在一起 8N 实例和一个 MongoDB 数据库。对于生产用途,您将需要像往常一样持久化数据和管理备份,但是对于快速启动来说就足够了。compose 还包含一个 MySQL 实例,我们将使用它进行测试。
配置您的第一个工作流
我们要配置的第一个工作流是一个简单的作业,它从 web 服务中读取数据并将其转储到数据库中。
首先,我们需要创建一个工作流。我们可以轻松设置步骤:
- 下载数据
- 如果不存在,则创建目标表
- 转换数据
- 将数据保存到目标目的地
所有这些步骤都将由 UI 来管理,不用写一行代码,真好!
该示例是手动触发的(点击或调度),以尽可能简单地维护该工作流,但也可以通过 API 调用来激活。
数据传输的工作流程
下载数据
我使用了一个生成随机数据的 Mockaroo API。数据将类似于:
curl -H "X-API-Key: XXXXX" [https://my.api.mockaroo.com/test.json](https://my.api.mockaroo.com/test.json)[{ "id": 1, "first_name": "Atlante", "last_name": "Hick", "email": "ahick0@blog.com", "gender": "Female", "ip_address": "64.230.69.253" }, { "id": 2, "first_name": "Kaitlynn", "last_name": "Klaes", "email": "kklaes1@hexun.com", "gender": "Female", "ip_address": "247.25.175.87" },...]
这个步骤被配置为指向 API,传递身份验证头,并获取数据。请注意,使用不同的配置,我们也可以处理所有其他 HTTP 操作。
HTTP 请求步骤预览中 API 的结果
如果不存在,则创建数据表
这一步可以通过运行一个简单的查询语句来轻松管理。为了连接到数据库,我们需要设置连接字符串(在本例中,是我们的本地 MySQL 数据库)。
创建数据库连接的这一步
创建目标表的步骤(如果不存在)
转换数据
因为我们只有一个 json 输出,所以我们需要将数据分成行。基本上,n8n 中的下一步是对每个输入元素执行的。将直接输出传递给 insert 语句将导致对整个有效负载只执行一次。这不是预期的行为。在这一步中,我使用了一个 javascript 块来转换数组中的有效负载,并将其作为输出。这将导致每行执行一次下一步。
这一步将数据从 json 数组转换成行。
插入语句
insert 语句非常简单。只要映射字段,所有的工作就完成了。这将对每一行执行一次,在数据库上转换一组 insert 中的输入行。
这一步是插入,json 在插入中被转换
如果我要做一个 insert 或 update 语句会怎么样?
在这个例子中,我们将行插入到表中。这是测试该工具的一个很好的例子,但是在现实世界中,我们需要 upsert(更新或插入)数据。实际上,该工具本身并不允许这样做。无论如何,检查行是否存在,然后插入或更新一般都很昂贵。为了不浪费时间地完成这个目标,我们可以使用两种模式:
- 使用原生 MySQL 语句 INSERT 或 UPDATE。这仅对 MYSQL 有效,并且需要一个定制的 SQL 语句。
- 使用分段表。您可以创建一个临时表来保存数据。这个操作很快,因为插入是更快的操作。然后,作为最后一步,您可以添加一个 SQL 合并,将真实表与临时表同步
带什么回家
ESB 是企业架构中的一个重要组成部分,但是:
- 没有它我不能出去。你愿意不穿衣服走出家门吗?不能。因此,不要在没有 it 的情况下设计公司基础架构。另一种选择是点对点集成,这就是问题所在。我们必须为处理所有遗留架构花费大量精力(时间&金钱),所以请为新设计做出正确的选择。
- **它不能手工制作。**这不仅是一个不重新发明轮子的问题,而且是一个事实,即从零开始(当然是在有限的时间和预算内)创建像商业系统一样的系统是不可能的。
- 工作流自动化不是 ESB,但总比没有好。 ESB 解决方案并不便宜。商业工具齐全但成本高。如果您预算不足,可以选择手动或通过 ETL 来管理数据流。工作流自动化工具呢?像 Zapier 或 N8N 这样的产品性能好,性价比高。
如何管理人工智能的风险
面向未来的现代方法,来自英国数据保护局
来源: Mixkit
前提 :本文意在作为‘活’文档。这意味着当我们有来自监管机构的更新时,我将增加审查跟进(我有时间…)。
22.09.20 更新 :几周前,监管机构发布了关于该主题的最终指导意见。除了一些小的调整(特别是关于人工智能、安全性、合成数据和透明度的潜在“偏见”)和额外的术语表,该文件几乎与之前的草案相同。
在 AI 公司工作,基本上有两种潜在的团队类型。这些可以概括为:
1)“我们已经采取了所有安全措施来保护我们的机器学习系统及其数据”,以及
2)“有了所有新的指导方针和程序,我们需要做一些事情,但我们不知道具体做什么或如何做”。
来源: Mixkit
如今,这两种方法都是可以理解的。随着我们看到的关于人工智能和数据保护的不同论文,很难判断最好的做法是什么。
我们应该等待更明确的规则,还是继续前进?
*【更新】*今天,我将总结 ICO(英国数据保护局)的最新指南及其关于管理人工智能培训和部署的实用建议,以及一些关于相关风险的进一步建议。
我保证,我会尽量避免任何形式的法律术语,但请记住,数据保护领域的基本知识将有助于理解这些内容。
如果您想立即跳到可执行任务的章节,您可以跳到最新章节( [+1】)。那么,我们该怎么办?’)。
好,我们开始吧。
1.DPIA 是基本支柱
ICO 以特别关注数据保护影响评估(DPIA)的实施而闻名,这是人工智能系统处理个人数据时所需的。
ICO 规定,将所涉及的数据主体的所有风险降低到零是“不现实的”(事实上法律并不要求这样做)。相反,最主要的一点是在可行的最大程度上识别和减轻风险。
现在,我们有几种工具可以实现这一点。
关于人工智能领域,DPIA 的实施应具体解决并提供:
- 可能影响过程公平性的任何相关变化或与系统相关的误差范围的解释(见第 3 节)。详情);
- 人工智能系统作出的所有决定的记录;
- 过程中任何人类参与的程度,其影响(换句话说,是否有意义)以及人工智能系统产生的输出的可能覆盖;
- 需要考虑或做出的任何权衡(例如,在隐私权和其他竞争权利之间;统计准确性、透明度、商业秘密和商业知识产权方面)。
尽管如此,ICO 指出,在两个独立的评估中描述所有不同的方面可能是有用的:为 ML/IT 专家和工程师提供的全面的技术描述,以及更通用和易读的概述,其中包含有关输入、输出和所涉及的个人数据逻辑的所有关键信息。
来源:作者
2.你在人工智能项目中的角色是什么?
假设您与一家公司合作,该公司提供具有处理和存储功能的专用云计算环境,以及一套用于机器学习的通用工具。您可能需要定义想要使用的数据和模型、关键的模型参数,以及评估、测试和更新这些模型的过程。
在这种情况下,很容易看出你的供应商是一个“加工者”(他们代表你行事,根据你的指示,只决定非必要的细节),而你是一个“控制者”(你对项目的最终结果有完全的控制权,你最终负责加工)。
但是,如果您的供应商将这些数据用于其他目的(例如,改进他们的培训系统),会发生什么情况呢?
在这种情况下,他们立即成为此类处理的控制者,这需要与您就您的数据的披露和进一步处理达成另一份具体协议。
当考虑到一些公司向其客户提供实时人工智能预测和分类服务时,该框架可能会变得更加不清楚。
它们是控制器、处理器还是联合控制器?这取决于部署的每个阶段。我认为信息图在这种情况下会有所帮助。
3.让我们试着做到(统计上的)准确
在人工智能中,“准确性”的衡量标准强调了人工智能系统猜测正确答案的频率。这些答案通常包括个人数据作为可能的预测或推断。简单干净。
也就是说,ICO 补充说,该系统在统计上越准确,处理过程就越有可能对相关数据主体公平。
这就是为什么应该在持续的基础上评估系统的统计准确性,重点关注精确度(即被确定为阳性的病例的百分比实际上是阳性的)和召回率(所有被确定为阳性的病例的百分比)。
4.法律基础
另一个要考虑的方面是为人工智能项目收集和处理个人数据的适当法律基础。抛开同意、法律义务、重大利益和执行公共任务(这在大多数现有活动中似乎难以申请)不谈,我们能否依赖合同的履行和企业的合法利益?
答案是肯定的。
该指南阐明,人工智能可能是向相关个人交付合同服务或在合同前阶段提供支持(例如,人工智能衍生的服务报价)所必需的。
在这种情况下,“履行合同”是使用系统(交付阶段)的最佳理由,但它可能不是前一阶段(人工智能系统的培训/开发)的最佳选择。
因此,“合法利益”似乎是最合适的法律基础来训练你的人工智能模型,但不要忘记实施你的合法影响评估来平衡所有涉及的变量。
请记住:即使您有处理个人数据的适当法律依据,仅仅一些数据可能有用的可能性本身并不足以让组织证明处理这些数据对于构建模型是必要的(稍后将详细介绍数据最小化)。
5.针对歧视和偏见的措施
实施人工智能最常见的抑制因素是它可能产生的歧视形式,特别是当我们有不平衡的训练数据或只是过去歧视的眩光时。该指南建议的一些措施是:
- 训练单独的模型;
- 反分类;
- 结果/错误奇偶校验;和
- 同等校准。
我不会深入讨论这些方面,因为我们可以花几天时间来讨论与每个方面相关的困难。关于这个主题的精彩论文可以在这里找到。
*【更新】*该指南还强调,每项衡量标准也应保持平衡,因为它们会对人工智能系统性能的统计准确性产生影响。
6.安全性和数据最小化
(注:这一小段比较有技术含量。我试图尽可能地简化,但对于这些方面的大部分,你需要一个强大的人工智能相关的技术知识。)
在人工智能中,安全性值得大多数企业关注。
如果你认为工程团队通常使用第三方框架和代码库是为了创建、维护和开发人工智能系统,那么你就会明白每个人工智能公司都可能存在的潜在风险。幸运的是,社区已经在致力于减少这些算法及其开源包背后的潜在漏洞,但我们仍处于这种方法的初级阶段。(更多技术细节此处)。
在这个问题上,ICO 描述了每家公司可能面临的一些具体风险。特别是:
- ‘模型反演’:如果攻击者已经获得了训练数据,他们可以从 AI 模型中推断出进一步的个人信息(更多细节在此和在此);
- “成员推断”:攻击者能够推断出特定个体是否存在于 ML 模型的训练数据中的风险。在这种情况下,他们不需要了解任何关于所涉及的数据主体的额外个人数据;
- “对抗性示例”:不是适当的数据保护风险,但这些示例可能被故意修改,以至于它们被错误分类,从而对 IT 系统构成风险。在这种情况下,值得注意的是,这可能被视为违反了网络和信息系统指令( NIS 指令)。
抛开适用于开发工作的维护代码和管理安全风险的标准要求,ICO 基本上建议,“系统中的数据越少,就越安全”(数据最小化原则)。
为了实现这一目标,指南探讨了可以实施的不同措施,包括:
- 特征选择,通过从训练系统中移除所有不相关的属性(技术细节此处);
- 记录和记载个人数据从一个位置到另一个位置的所有传输和存储,包括第三方系统;
- 差分隐私,以便了解和评估在培训系统中增加干扰或“噪音”的潜在影响(更多技术细节此处);
- 联合学习,允许多方根据自己的数据训练模型(“本地”模型)。然后,您可以将识别出的一些模式(称为“梯度”)组合成一个更准确的“全局”模型,而不必彼此共享任何训练数据(更多详细信息此处);
- 在从源中提取和共享训练数据之前,对其进行去识别;
- 直接在生成查询的设备上的本地推断,该设备已经收集并存储了每个数据主体的个人数据(而不是在云服务器上);
- 隐私保护查询方法(更多详情此处);
- *【更新】*使用合成数据,与真人无关,而是人工生成的(更多详情此处)。
7.快完成了:如何管理数据主题请求?
出于几个原因,用户请求(“数据主体请求”或“DSRs”)似乎是新技术最复杂的方面之一。
例如:
- 通常,训练数据只包括与预测相关的信息,而不包括联系方式的详细信息。然而,即使数据已经通过某种技术过程进行了转换,训练数据仍可能被认为是个人数据。
- 即使没有直接收集,也可以从采用的模型中推断出更多的个人数据。
在这种情况下,简单地访问他们的个人数据可能会很麻烦,有时,您也无法识别培训数据中的个人。
此外,可移植性请求可能是最难解决的一个问题,尤其是当数据以机器可读的形式大量转换时。原始数据可以提供,但是,ICO 指出,如果这种转换很重要,则产生的数据可能不再被视为由数据主体“提供”,因此不再受可移植性请求的约束
(尽管它仍然是个人数据,所以可以是不同请求的焦点,例如访问权限)
另一方面,可能的擦除或纠正请求可能是可管理的,并且应该对所构建的模型有较小的影响。
然后,该指南强调,在自动决策的情况下,个人请求人工干预的流程应该简单且方便用户(例如,带有链接或清晰信息的网页,允许个人联系可以参与进来的工作人员)。
这里的关键点是透明度:制定一个隐私政策,用常见和可理解的术语解释人工智能系统的整体结构,其目的和从中做出的决定。这可以极大地帮助建立用户的信任,并且(希望)减少收到的请求数量。
有人说‘黑盒’?
是的,这是真的,对于非常复杂的系统来说,可能很难理解系统的逻辑,也很难解释它们是如何工作的。此外,一些方法可能会意外泄露有关人工智能模型的敏感专有信息,并有助于暴露外部参与者的隐私攻击。解释指南可以帮助你。
[+1].那么,我们该怎么办?
如果你一直关注我的文章,并且同意我的观点,你可能会想知道你现在可以采取什么行动。
为了给你一个答案,我创建了一个人工智能数据保护清单,它完整地追溯了 ICO 官方文件,可以作为你在人工智能团队中识别和控制风险的路线图。
这是团队合作,不是一个人的项目!
你的同事对上述每一步的看法可能是简化流程的关键,也是最终结果的关键。支持性的组织文化是基础。
简单地
*【更新】*该指南还阐明,它将不断努力为这一新兴领域提供更多支持,并在未来几年内发布适当的“工具包”和新的“云竞争指南”。
尽管如此,该文件已经提供了 ICO 的相关建议,并说明了减轻人工智能风险所需的关键步骤,以及可以立即采取的步骤。
PS:
你想多读点吗?下面你可以找到更多关于这个主题的论文:
欧盟委员会- 人工智能白皮书
隐私论坛的未来- 警告标志
AEPD - 嵌入人工智能处理的 RGPD 符合性|简介
ICO - 大数据、人工智能、机器学习和数据保护
ICO 和艾伦图灵研究所- 项目解释
如何管理你的专业人工智能实践
在世界舞台上竞争时的考虑
企业和政府正慢慢开始在其组织内建立真正的数据科学部门,扩展离散团队的工作。(这是一份过时但仍然适用的普华永道报告。)这在很大程度上是由于关于职能部门化的现代管理理论(是的,这是一个真实的词),它将关键的组织活动分成专门的团队。
数据科学恰好变得与职能 IT 团队或适当的人力资源部门一样对组织有价值。从应用数据科学中出现的专业行业正在慢慢地在组织部门之间分离,类似于会计和 IT,以及提供战略和实施服务的咨询。如果我们将数据科学团队的未来与这两个特定部门进行比较,我们可以很好地了解该行业在几年后的样子。
例如,在这些部门中通常有程序团队(簿记和 IT 支持)、管理团队(会计和 IT 主管)和战略团队(CFO 和 CTO)。这非常类似于数据输入专家、数据科学家和机器学习工程师,以及首席数据官。
因此,如果你试图提供人工智能/人工智能咨询服务,你应该如何定位你的专业实践?这里有一个简单的回顾和一些关于提高你的公司的专业性的建议,或者更好地构建你的人工智能团队以实现最大的客户价值交付。
从能力到战略产品
就像这两个部门有外部审计师和安全评估公司一样,现在市场上也有提供方向指导和建议的战略咨询需求。下一步建什么比怎么建更重要,这意味着 AI 咨询正在从技能型向指导型转变。(以下是 2020 年企业 AI 采用情况的奥赖利报告。)
这种从战术到战略的转变是可以从客户那里获得高层次价值的地方,但只有当你有能力从知识、经验和智慧中提供建议时才是有效的。您过去是否实施过类似的解决方案?即使数据不同,您是否有可以探索的可靠的解决方案模式?战斗伤痕和经验教训呢?所有这些都会在客户对话中出现。
如今,创办并运营一家成功的人工智能咨询公司需要什么?好吧,要称自己为人工智能咨询公司,现在真的只需要一个自封的头衔。然而,要成为一家 值得信赖的 和 合法的 咨询公司,你需要建立可信度和正当理由,让人们相信你有他们的人工智能需求。这就是营销定位的由来。
三个朋友:专业知识、经验和效率
让我们在这里进行一次思考练习:如果你没有经营一家人工智能商店,而是仅仅经营一家通用咨询公司,你将如何经营你的商店?你如何将你的服务打包成可重复的过程?
在《管理专业服务公司》一书中,David Maister 提到了专业服务公司倾向于依赖的三种主要营销策略:专业知识、经验和效率。这些策略非常适用于人工智能咨询,并可能揭示出大男孩们偶然(或有意)的误导。
专长
专家说“我们很熟练。我们有能力。我们有血统。”这是人工智能商店的主要途径。你为什么不展示你员工中的博士名单呢?
仅仅依靠专业知识的问题是,你不能把你的专利和出版物强加给一份工作声明。你必须向潜在客户展示你能解决他们的问题。实用性胜过优雅。通过强调你的研究的特殊性和对你的客户的明确定义的问题的证明,你将能够展示候选的解决方案,因此移动到合同。
体验
另一方面,经验说“我们已经看到了一切。我们有战斗的伤疤,所以你不必。我们有故事。”(这是大型或老牌公司的主要类别。)
在人工智能咨询领域,经验是一把双刃剑。是的,人们依靠你来推荐早期原型的解决方案架构和关键模型选择,但是在 devops 的世界里事情变化很快,在 AI 的世界里变化更快。是什么让你 10 年前的经历在今天仍然适用?
在客户端,您必须专注于您熟知的常量。KPI。交货时间表。维护和支持条款。客户参与的坚实基础需要成为你的面包和黄油。如果问题被很好地定义,许多解决方案选项都是有效的,并且可以进行实验。
专业精神会让你越过终点线。
效率
最后,效率意味着:“我们可以优化。我们可以精简。我们可以调整。我们可以以更低的价格生产。”
当一个系统已经在生产中,或者当一个客户至少有一个实现的基线时,效率通常就来了。至少,效率公司倾向于需要客户提供的强大的护栏来在给定的约定中取得成功。我们通常看到这些团队执行更多的数据整合工作(获取、清理和预处理)和其他明确界定范围的活动(UI/UX、数据仓库和网络搜集)。
如果你是一个效率团队,就做一件事,并做到最好。
选择您的方法
这些不同的关注领域适用于客户参与的不同时间点。你不会把效率作为构思和原型制作的主要动力,就像你不会仅仅依靠专业知识来完成基本的 ETL 工作一样。每种方法都有它的位置和时间。
你想在一个非常嘈杂的市场环境中了解自己的独特产品。找一个接近荒岛的地方,把它变成你自己的,然后成长为另一个。
进入巨人队
为了比较你可能与现任者的情况,让我们看看人工智能咨询营销的流行模型。
品牌力量
已经成立的大型咨询公司决定推出或收购一个新的人工智能咨询团队,并在上面打上他们的巨大品牌。这是一种试图假装既专业又高效的体验。在现实中,人工智能咨询是如此年轻,以至于没有人能真正声称他们已经“做了”多年。
(注:如果你是这些大事务所之一,请告诉你的审计分支机构去看看我们的姐妹公司audit map . ai,因为没有人喜欢阅读成千上万的内部审计报告。)
专业平台提供商
这是一个明确的专业信号。这是 AWS、Azure、IBM 和 Google 为个人和组织提供大量 API 和解决方案的地方。
你需要和世界上一些最大的公司竞争吗?嗯,你很幸运!这些公司的动机绝不是专业服务——他们不想提供这些服务,但他们不得不提供。事实上,他们有广泛的合作伙伴计划(如 APN 和合作伙伴世界)的唯一目的是卸载专业服务。他们通过持续消耗他们的资源和 API 来赚钱,而不是通过咨询。
你可能需要经历向这些渠道中的每一个申请的折磨,但是你会带着合法的徽章从另一端出来。
基于产品的咨询
这是一种混合模式,在这种模式下,一个专注的小型团队开始构建一个解决方案,并仍在努力寻找适合市场的产品,将在他们的产品试图服务的同一领域提供咨询服务。
如果你试图在提高产品市场适应性的同时创造收入(仅供参考,这是种子投资者的最佳选择),这是确保你打造一款可靠产品的可靠方法。
然而,如果咨询是你通过这个渠道获得收入的唯一来源,那么你的服务就真的和你的产品一样好。这可能是一场很难赢的比赛。
我们是如何做到的
当我们创办我们的公司时,人工智能咨询公司还是一片没有法律的荒地,充斥着魔法和城市传说。从那时起,人们就希望客户表现出高度的专业性,这与其他咨询行业类似。
如果你是一个小团队,我可以给你一些希望:
- 首先,每一家大型咨询公司通常都是由较小的组织组成的网络,而不是一个庞大的单一机构。所以,你实际上不是在和德勤竞争。你的竞争对手是多伦多的小型 OMNIA 团队,他们的办公室上面刚好有一个大大的 D。
- 第二,这些团队通过提供大量辅助服务来赚钱,其中一些服务是不必要的臃肿。(老实说,这正是我们提高参与度的方式。)当你竞标项目时,这通过提供一台精简、吝啬的人工智能机器给你带来了优势。
就如何定位您的服务而言,我们注意到我们有三种主要的接洽形式。
问题到想法
这就是你的经典咨询服务的用武之地。可行性研究、头脑风暴会议和人工智能路线图都是有效的可交付成果。这种参与背后的前提是,即使在客户可以采取下一步之前,他们也需要知道下一步应该朝哪个方向走。
这种类型的销售有点困难,因为客户有效地获得了一份报告,而这不是管理团队承诺的性感,性感的人工智能。
我们通过提供候选项目的推荐列表,在这种类型的参与中取得了很大的成功。这些项目中的每一个都是根据已知的风险、时间表、资源需求、成本以及您在参与之前应该知道的任何其他内容进行评估的。这种清晰很难获得。
从想法到原型
我可以毫无疑问地说,这是迄今为止我们拥有的最有趣的参与方式。
每个项目都是目标驱动的,分为数据科学、机器学习工程和部署。这是最著名的人工智能咨询方法,客户定义一个问题,顾问或团队建立一个解决问题的方案。
然而,如果你是专业的,很多时候很多研究需要提前进行,甚至在签署工作说明书之前。准备好投资研究以达成销售。
从原型到生产
人工智能咨询经常被遗忘的一点是,最终的模型需要驻留在不在你的笔记本电脑上的某个地方。
如果您为客户端构建一个模型,那么有一些部署就绪性问题是您在实验室中不会考虑的。一百万并发用户的延迟是多少?边缘案例呢?保安?存储?自动模式转换?
人工智能咨询的这一方面需要 devops、ML 工程和业务理解的融合,因为在你推出产品之前需要做出一些设计决策——因为一旦产品上线,你就无法进行硬重置。
混合策略、架构和实施
我们开始让自己出名的地方是我们将人工智能与客户的基本商业案例联系起来的能力。我们已经执行了一些艰难的项目(正如我们的clutch.co 简介可以证明的),但我们的成功很大程度上是因为我们能够帮助我们的客户完成解决方案的长期战略部署。我们走后谁将拥有这个项目?他们应该如何降低成本?
没有人会赢得一场比赛
重要的是要记住,在任何拥挤的市场都会有商品化。
我和 Dan 每周都会收到多次关于东欧、亚太甚至南美新数据科学团队的电子邮件。他们的价格极具竞争力,我们无法在通用产品上击败他们。但这只有在客户寻找通用产品时才有效。
重要的是要记住,在人工智能咨询的世界里,人工智能不是一个编码程序,而是对更美好明天的承诺。如果你能说你客户的语言,你就有优势让他们看到一个更好的明天。所以他们会不断回到你身边。
咨询愉快!
马特。
如果您对本文或我们的 AI 咨询框架有其他问题,欢迎通过LinkedIn或通过email联系。
你可能喜欢的其他文章
如何像老板一样在 Python 中操纵日期和时间
常用的日期时间函数及示例
伊莲娜·科伊切娃在 Unsplash 上的照片
使用 Python 时,我们都有试图弄清楚如何“操纵”日期和时间的时刻。
这是我创建的一个备忘单,涵盖了 Python 中最常用的日期时间相关函数。如果你想要一些简单但实用的例子,看看吧!
我们将涵盖以下所有 7 个热门话题:
- 不同格式的今天的日期和时间
- 字符串到日期的转换
- 日期时间计算的差异
- 日期时间加/减某段时间
- 日期时间比较
- 时区设置
- Unix 时间戳/纪元时间计算
不同格式的今天的日期和时间
让我们从最基本的开始热身。下面是打印当前年、月、日、小时、分钟、秒和毫秒的代码。
**In:** from datetime import datetime d = datetime.now() #today's datetime
d**Out:**datetime.datetime(2019, 12, 22, 13, 14, 18, 193898)
这是非常有用的信息,但我们通常只需要其中的一部分。我们可以打印下面不同的部分。
**In:** print(d.weekday()) #day of week - Monday is 0 and Sunday is 6
print(d.year)
print(d.month)
print(d.day)
print(d.hour)
print(d.minute)
print(d.second)**Out:** 6
2019
12
22
13
14
18
此外,可能需要某些日期/时间格式。我们可以使用下面的列表来定制不同的日期格式。这也可以被认为是将日期转换为字符串的一种方式。完整的名单可以在这里找到。
**In:** print(d.strftime("%A %d/%m/%Y")) # date to string**Out:** Sunday 22/12/2019
字符串到日期的转换
下面的示例显示了两个被转换为日期格式的流行字符串:
**In:** date_string = '2016-02-01 12:00PM'
print(datetime.strptime(date_string, '%Y-%m-%d %I:%M%p'))**Out:** 2016-02-01 12:00:00**In:** date_string = '02/01/2016'
d2 = datetime.strptime(date_string, '%m/%d/%Y')
print(d2)**Out:** 2016-02-01 00:00:00
日期时间计算的差异
下面的示例打印天数的差异(例如今天和 2016 年 2 月 1 日):
**In:** from datetime import timedelta d = datetime.now()
date_string = '2/01/2016'
d2 = datetime.strptime(date_string, '%m/%d/%Y')
print(d - d2)**Out:** 1420 days, 13:18:27.386763
我们也可以只打印两个日期时间的差异,以天、周或年为单位,等等。
**In:** date_diff = (d - d2)/timedelta(days=1)
print('date_diff = {} days'.format(date_diff))**Out:** date_diff = 1420.5544836430902 days**In: ** date_diff = (d - d2)/timedelta(weeks=1)
print('date_diff = {} weeks'.format(date_diff))**Out:** date_diff = 202.93635480615575 weeks**In:** date_diff = (d - d2)/timedelta(days=365)
print('date_diff = {} years'.format(date_diff))**Out:** date_diff = 3.8919300921728497 years
日期时间加上/减去某一段时间
让我们按秒、分、小时、天、周或年的不同时间间隔做一些“时间旅行”:
**In:** print(d + timedelta(seconds=1)) # today + one second print(d + timedelta(minutes=1)) # today + one minute print(d + timedelta(hours=1)) # today + one hour print(d + timedelta(days=1)) # today + one day print(d + timedelta(weeks=1)) # today + one week print(d + timedelta(days=1)*365) # today + one year **Out:** 2019-12-22 13:18:28.386763
2019-12-22 13:19:27.386763
2019-12-22 14:18:27.386763
2019-12-23 13:18:27.386763
2019-12-29 13:18:27.386763
2020-12-21 13:18:27.386763
日期时间比较
日期之间的比较用通常的比较符号很简单:
**In:** print(d < (d2 +(timedelta(days=365*6)))) # d is no more than 6 years (assume each year has 365 days) after d2?
print(d > (d2 +(timedelta(weeks=52*6)))) # d is more than 6 years (assume each year has 52 weeks) after d2?
print(d != d2) # d2 is not the same date as d?
print(d == d2) # d2 is the same date as d?**Out:** True
False
True
False
时区设置
我们还可以比较不同时区的时间,比如多伦多和上海:
**In:** import pytz
timezone = pytz.timezone("America/Toronto")
dtz = timezone.localize(d)
print(dtz.tzinfo)
print(dtz)**Out:** America/Toronto
2019-12-22 13:18:27.386763-05:00**In:** shanghai_dt = dtz.astimezone(pytz.timezone("Asia/Shanghai"))
print(shanghai_dt)**Out:** 2019-12-23 02:18:27.386763+08:00**In: ** (dtz - shanghai_dt)/timedelta(days=1) # same datetimes**Out:** 0.0
如果您对不同时区的完整列表感兴趣。使用下面的代码将打印它们:
**In:** for tz in pytz.all_timezones:
print(tz)**Out:** Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa *(Only showing the first three as examples)*
Unix 时间戳/纪元时间计算
Unix 时间戳通常用于操作系统中的文件。通常它们也会出现在数据集中。
首先,我们可以获得当前的 Unix 时间戳:
**In:** from datetime import timezone dt_now = datetime.now(timezone.utc)
print(dt_now)
print(dt_now.tzinfo)
print(dt_now.timestamp()) # the unix timestamp.**Out:** 2019-12-22 18:21:28.681380+00:00
UTC
1577038888.68138
此外,我们可以将 Unix 时间戳转换为日期时间格式:
**In:** utc_timestamp = 1377050861.206272
unix_ts_dt = datetime.fromtimestamp(utc_timestamp, timezone.utc) print(unix_ts_dt)
print(unix_ts_dt.astimezone(pytz.timezone("America/Toronto")))
print(unix_ts_dt.astimezone(pytz.timezone("Asia/Shanghai")))**Out:** 2013-08-21 02:07:41.206272+00:00
2013-08-20 22:07:41.206272-04:00
2013-08-21 10:07:41.206272+08:00
更多数据科学相关文章来自 Lianne 和 Justin:
为企业 Windows 环境量身定制
towardsdatascience.com](/how-to-visualize-a-decision-tree-in-5-steps-19781b28ffe2) [## 根据模拟,30 岁退休需要多少钱
很多人年纪轻轻就有辞掉工作的梦想,活在世上没有经济上的牵挂。怎么…
towardsdatascience.com](/how-much-do-you-need-to-retire-at-age-30-based-on-simulation-424fa9e0922b) [## 买彩票的最佳时机是什么时候?
根据理性(或统计)分析
towardsdatascience.com](/when-is-the-best-time-to-buy-lottery-tickets-7735191b3c76)
如何操纵和可视化数据以进行比较分析 NBA 的关键时刻
使用 Python 和 Pandas 和 Plotly 对数据进行切片、分组和可视化,以获得新的见解(代码和数据在我的 GitLab repo 中)。
Jason Dent 在 Unsplash 上的原始照片
在这篇文章中,我演示了如何操作和可视化数据以获得比较性的洞察力。我从一个数据集开始分析,将对其进行分析以找到合适的分割,并找到与剩余数据进行比较的最佳子集。
实际上,这篇文章着眼于上个赛季的 NBA 数据,以了解接近,比赛后期的情况。有些人喜欢林格氏比尔·西蒙斯称之为“关键时刻”。
我们将使用数据来了解这些高风险时刻的更多信息。真正的关键时刻是什么时候?这期间的游戏玩法有什么不同吗?这里采用了什么样的策略?
和往常一样,本文的重点将是适用于您自己的领域和数据的数据分析,而不是特定于篮球的输出。
我们走吧。
在开始之前
数据和代码
我在我的 GitLab repo here (在 basketball_crunchtime 目录中)中包含了这方面的数据和代码,所以请随意下载并使用它/改进它。
包装
我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。
你需要pandas
和plotly
。用一个简单的pip install [PACKAGE_NAME]
安装每一个(在你的虚拟环境中)。
创建“关键时刻”数据
这里的假设很简单。在篮球运动中,有些情况会得到不同的对待,会得到球员和教练更多的努力和关注。让我们称之为“关键时刻”,看看数据是否显示出它与游戏其余部分之间的任何差异和模式。
我们的数据集包括 2018-19 赛季的详细数据。正如你可能想象的那样,在我可以过滤的数据中没有’ crunch time '特性。但根据我们的直觉,关键时刻数据与剩余时间有限且分数差异较小的时期相关似乎是合理的。
首先,我们将研究这些数据,看看选择关键时间子集的合理标准是什么。
在熊猫中创建新栏
现有数据集不包括剩余时间或得分差异的要素,但它包括这些要素的基础数据。
在 Pandas 中创建新列有多种方法,但我更喜欢使用.assign
方法,因为它返回一个全新的对象。这有助于避免操作错误对象的麻烦。
数据集特征包括period
,共 4 分钟,以及每个时间段的elapsed
时间(共 12 分钟)。period
数据是整数,elapsed
时间是字符串,所以我们想把它们转换成一致的时间单位。
Pandas
有一个timedelta
函数可以方便地将字符串转换为时间,而timedelta64
函数numpy
可以将时间转换为秒,所以将它们相加就可以得出游戏所用的总时间。
让我们也为当前得分差异创建一个新列:
shots_df = shots_df.assign(tot_time=(shots_df.period-1)*np.timedelta64(60*12, 's') + pd.to_timedelta(shots_df.elapsed, unit='s'))
shots_df = shots_df.assign(score_diff=abs(shots_df.home_score-shots_df.away_score))
以前max(shots_df.elapsed)
给‘0:12:00'
,现在max(shots_df.tot_time)
给Timedelta(‘0 days 00:48:00’)
。(我暂时排除了超时)
过滤数据
这些新列现在可以用来过滤我们的数据集。我们将使用它们来生成一些潜在的关键时间子集进行比较。
首先,我想看看镜头的分布是否会改变。在之前的一篇文章中,我们把球场分成了不同的区域,就像这样:
每个镜头都有一个特征编码,记录它来自这 7 个区域中的哪一个。
拍摄位置的改变可能和精度的改变一样有意义。实际上,情况可能更是如此,因为数据可能没有射击精度那么“嘈杂”。
因此,让我们捕捉这些区域的拍摄分布是否发生了变化,将每个区域的拍摄精度/频率等统计数据添加到我们的数据帧中。
为了评估各种时间和分数阈值的效果,我构建了一个具有各种时间和分数阈值的嵌套循环,并使用 pandas 根据循环中的这些值过滤数据帧:
for time_thresh in [12, 10, 8, 6, 4, 2]:
for score_thresh in [2, 4, 6, 8, 10]:
filt_shots_df = shots_df[
(shots_df.tot_time > np.timedelta64(60*(48-time_thresh), 's'))
& (shots_df.score_diff <= score_thresh)
]
每个统计数据也是作为与整体数据相比较的相对值被捕获的,因为我们希望在关键时刻捕获游戏的变化。
如果你不确定如何使用?groupby methods with dataframes,这里是文档。
这给了我们一个可行的数据框架进行比较,我们已经准备好开始研究我们的数据集。
可视化“关键时刻”数据
健全性检查—样本大小
每当我处理数据的子集时,我都希望警惕引入随机错误,或无意识的偏差,这可能会导致我得出错误的结论。
在这里,让我们快速看一下分布情况,以了解每场比赛在每个分数差异范围内花费了多少。
我们的数据库包含整个 NBA 赛季大约 217,000 张照片。粗略估计,每分钟包含 4500 个镜头。将这些绘制成直方图:
import plotly.express as px
fig = px.histogram(shots_df, x='score_diff', nbins=40, histnorm='probability density', range_y=[0, 0.09])
fig.update_layout(
title_text='Score differences in an NBA game',
paper_bgcolor="white",
plot_bgcolor="white",
xaxis_title_text='Score difference', # xaxis label
yaxis_title_text='Probability', # yaxis label
bargap=0.2, # gap between bars of adjacent location coordinates
)
fig.show()
同样,在最后的 6 分钟里:
即使在最后 6 分钟,NBA 比赛也有约 4.5%的比分在 1 分以内,约 10%在 3 分以内。
在超过 215,000 张照片的基础上,获得这些子集似乎是合理的,但这是值得关注的事情,特别是当子集是基于时间和分数导出的。
识别关键时刻
我们有两个感兴趣的变量,剩余游戏时间(time_thresh
)和得分差(score_thresh
)。我们还有拍摄区域的变量(zone_name
)。有三个变量要考虑,这对于气泡图来说是完美的,一个变量沿着 x 轴,另一个是颜色,第三个是支线剧情。
使用这段代码,我们创建了一个这样的气泡图:
fig = px.scatter(
summary_df, x='score_thresh', y='rel_shots_freq', color='time_thresh', size='filt_shots_freq',
facet_col='zone_name', hover_data=['filt_shots_taken'])
fig.show()
支线剧情/颜色系列可以像这样翻转,产生:
fig = px.scatter(
summary_df, x='time_thresh', y='rel_shots_freq', color='score_thresh', size='filt_shots_freq',
facet_col='zone_name', hover_data=['filt_shots_taken'])
fig.show()
这些图已经告诉我们很多。
他们告诉我们,在比赛后期,三分球投得比比赛其他时间多得多。这随着分数差距的增加而增加(即,团队冒更大的风险来追赶)。
现代分析指出,最好的投篮来自靠近篮筐和角落的 3s ,而这里的数据显示,这些投篮变得越来越难。据推测,这是由于防守投入了更多的努力,特别是在比赛的后期,当比分接近时(看看紫色的< 2 分比赛数据)。
仔细观察底部的情节也可以发现,在大多数次要情节中,大约在 8 分钟或 6 分钟处有一个拐点。这一点在第一个支线剧情(4 英尺以内)和第五个(短 3s)中表现得最为明显。
让我们来看看射击精度。它告诉我们一个相似的故事吗?
好像是这样的!随着得分差距的增加,在近距离投篮时,准确性往往会增加,而在远距离投篮时,准确性会降低。这可能是因为领先的球队对三分球保持警惕,以防止他们的对手迅速追上来,而落后的球队更经常从远距离射门。上图中显示的频率证实了这一点。
总的来说,这些支线剧情中的许多都表明在游戏还剩 6 分钟的时候发生了一些变化。这似乎是一个很好的门槛。
分数呢?当我们从越来越大的分数差距中观察数据时,虽然对数据的影响是渐进的,但我的观察是,分数在 2 分以内的情况下的数据点在大多数这些支线剧情中脱颖而出。(自己看看,如果你不同意,请告诉我。)
所以让我们采用关键时刻的定义,即剩余时间为 6 分钟或更少,得分在 2 分以内。
紧缩时间 vs 常规(平稳?)时间
既然我们已经为 crunch time 设置了参数,我们可以创建一个新列来区分这两个数据集。
shots_df = shots_df.assign(
crunchtime=(shots_df.tot_time > np.timedelta64(60*(48-6), 's'))
& (shots_df.score_diff <= 2))
crunch_df
包含 3886 个镜头,没什么可轻视的。(但我们可能不希望变得更小。)
让我们基于这个属性来比较两个数据集。现在,只需围绕crunchtime
变量的布尔值构建数据,即可轻松实现这一点:
for crunch_bool in [True, False]:
filt_shots_df = shots_df[shots_df.crunchtime == crunch_bool]
或全部:
结果很有意思。
虽然比赛很接近,但球队没有采取极端的策略(例如更多的三分球)。但是很明显,想要在 1 区、4 区和 5 区拍出理想的照片是很难的。或许我们应该看看相对于整体平均值的百分比:
很明显,防守队员的额外努力迫使球队在效率低的位置(2,3,6 和 7)投篮更多,而在好的位置(1,4 和 5)投篮更少。虽然这可能只是数据中的噪声,但下降来自已知的理想拍摄区域这一事实使我怀疑这一点。
看看拍摄的准确性,画面变得更加有趣。
在比赛的最后 6 分钟,当比分接近时,在越过三分线之前,投篮命中率会全面下降,从而变得更加准确长距离。这令人困惑,但是有一些潜在的解释。
一个是选择偏差,在团队中最优秀的球员这个时候得到这些镜头。另一个是与博弈论相关的,因为防守可能会在某种程度上鼓励球队采取这些相对较低比例的投篮(在正常情况下)。
尽管如此,研究这些数据的团队会说,进行长时间的三分可能是一个令人惊讶的高价值命题。
为了总结这一点,让我们使用拍摄图表来更详细地查看数据。
在三分线内的几乎所有地方,投篮都变得越来越不准确,三分角球变得明显更加困难,这可能是因为防守增加了压力。
虽然我们预计这些数据可能会有点嘈杂,因为只有 3886 张照片,而不是超过 210,000 张),但这里反映了全面的下降。
出于这个原因,我不会对方向差异做过多解读。给定小样本量,左/右的差异可能只是噪声,而不是趋势的反映。
总结
我个人发现,尽管现在找到大型数据集相对容易,但它们并不总是包含允许我轻松地对数据进行切片、进行比较或从中得出结论的功能。
相反,我经常不得不从现有的数据中创建新的特征,并使用我的直觉来评估创建数据子集的适当截止点。
为此,我希望上面的例子对你有用,也可能有趣。
请下载数据和代码,玩一玩,用你自己的数据集构建类似的东西。我很想听听你的经历或评论!
如果你喜欢这个,比如说👋/在 twitter 上关注,或关注更新。我还写了这些关于篮球数据的文章,可能对本文有帮助,如果你以前没看过的话。
[## 如何用 Python 可视化数据中的隐藏关系 NBA 助攻分析
使用交互式快照、气泡图和桑基图操纵和可视化数据,使用 Plotly(代码和数据…
towardsdatascience.com](/how-to-visualize-hidden-relationships-in-data-with-python-analysing-nba-assists-e480de59db50) [## 用 Plotly 实现交互式篮球数据可视化
用 hexbin shot 图表分析体育数据,用 Plotly 和 Plotly Express 分析气泡图(源代码&我自己的数据…
towardsdatascience.com](/interactive-basketball-data-visualizations-with-plotly-8c6916aaa59e)
如何掌握 Python 命令行参数
使用命令行参数创建自己的 Python 脚本的简单指南
照片由émile Perron在 Unsplash 上拍摄
我相信我们大多数人都运行过这个命令行来执行您的 python 脚本。
$ python main.py
我们能不能在这个脚本中定义我们自己的论点?答案肯定是肯定的!
$ python main.py arg1 arg2
我们将使用 Pythonarg parse模块来配置命令行参数和选项。argparse 模块使得编写用户友好的 命令行界面 变得容易。该程序定义了它需要什么参数,并且 argparse 将计算出如何解析来自 sys.argv 的参数。当用户给程序无效的参数时, argparse 模块也会自动生成帮助和用法消息,并发出错误。
Argparse 入门
正在安装 Argparse
像往常一样,我们需要做的第一件事是安装这个 Python 模块。
conda install argparse
定义位置参数和可选参数
用这个脚本的描述用ArgumentParser
创建一个parser
对象。Positional Arguments
和Optional Arguments
用add_argument
函数定义。用help
添加了对该参数所做工作的简要描述。
位置自变量是需要包含在适当的位置或顺序中的自变量。
可选参数是用关键字和等号输入的关键字 参数,可选。
- 让我们尝试使用 help 参数
-h
运行这个脚本。
$ python employee.py -h
usage: employee.py [-h] [--address ADDRESS] name titleThis script is going to create an employee profile.positional arguments:
name Name of Employee
title Job Title of Employeeoptional arguments:
-h, --help show this help message and exit
--address ADDRESS Address of Employee
-h
和--help
在argparse
中默认定义。它将显示我们在脚本中定义的描述,以帮助用户使用脚本。
- 我们试着输入
name
和title
。
$ python employee.py Alex Manager
Name : Alex
Job Title : Manager
Address : None
由于缺少地址参数,在这个脚本中,NoneType
被传递给Address
。为了打印它,我们必须把它转换成字符串。
- 让我们只用
name
试试
$ python employee.py Alex
usage: employee.py [-h] [--address ADDRESS] name title
employee.py: error: the following arguments are required: title
因为 title 也是Positional Argument
,所以在这个脚本中是需要的。
- 这次我们用
name
、title
和address
试试。
$ python employee.py Alex Manager --address 123 Baker Street
usage: employee.py [-h] [--address ADDRESS] name title
employee.py: error: unrecognized arguments: Baker Street
因为123 Baker Street
包含空格,所以脚本会将Baker Street
视为其他参数。在这种情况下,我们需要双引号。
$ python employee.py Alex Manager --address "123 Baker Street"
Name : Alex
Job Title : Manager
Address : 123 Baker Street
name
和title
如果名称或标题不止一个单词,则需要双引号。
定义布尔参数
让我们将上述代码添加到现有的脚本中。我们将使用default=True
定义一个可选参数。意思是即使我们从来没有在这个参数中输入任何东西,默认情况下也等于True
。
这里使用type=strtobool
来确保输入被转换成布尔数据类型。否则,当脚本在输入中传递时,它将是字符串数据类型。如果我们需要一个整数参数,我们也可以将其定义为type=int
。
%(default)s)
在帮助中是检索参数中的默认值。这是为了确保描述不是硬编码的,并且随着缺省值的变化是灵活的。
- 让我们用
name
、title
和address
再试一次
$ python employee.py Alex Manager --address "123 Baker Street"
Name : Alex
Job Title : Manager
Address : 123 Baker Street
Alex is a full time employee.
默认情况下,isFullTime
是True
,所以如果我们不向isFullTime
输入任何参数,Alex 就是全职员工。
- 让我们用一个
False
输入试试。
$ python employee.py Alex Manager --address "123 Baker Street" --isFullTime False
Name : Alex
Job Title : Manager
Address : 123 Baker Street
Alex is not a full time employee.
行动。亚历克斯现在不是全职员工。
定义参数中的选择
我们还可以用choices
参数限制输入参数的可能值。这有助于防止用户输入无效值。例如,我们可以使用这个choices=[“Singapore”, “United States”, “Malaysia”]
将国家值限制为新加坡、美国和马来西亚。
- 让我们看看如果我们不在选项中输入国家值会发生什么。
$ python employee.py Alex Manager --country Japan
usage: employee.py [-h] [--address ADDRESS]
[--country {Singapore,United States,Malaysia}]
[--isFullTime ISFULLTIME]
name title
employee.py: error: argument --country: invalid choice: 'Japan' (choose from 'Singapore', 'United States', 'Malaysia')
我们将遇到一个无效选择的错误。这些选择在--help
总是可用的。
现在你已经学会了如何创建带有自定义参数的 Python 命令行。希望这篇文章对你有用。如果我犯了任何错误或错别字,请给我留言。
可以在我的 Github 中查看完整的脚本。干杯!
如果你喜欢读这篇文章,你可能也会喜欢这些:
轻松在 Python 2 和 Python 3 环境之间切换
towardsdatascience.com](/manage-your-python-virtual-environment-with-conda-a0d2934d5195) [## 使用 Python 访问您站点上的 Google 搜索控制台数据
谷歌搜索控制台(以前的谷歌网站管理员工具)是由谷歌提供的网络服务,帮助您监控和…
towardsdatascience.com](/access-google-search-console-data-on-your-site-by-using-python-3c8c8079d6f8)
你可以在 Medium 上找到我其他作品的链接,关注我 这里 。感谢阅读!
如何用 Python 找到最佳匹配
给定个人偏好,如何最大化总偏好?
方案
恭喜你!你是由 8 名优秀员工组成的新团队领导。你想把他们分成 4 组,分别负责 4 个不同的项目。作为一名有经验的领导者,你知道员工在和他们喜欢的人一起工作时效率最高。所以你想出了一个员工评级系统。等级从 1 到 10,10 分意味着员工真的喜欢另一个员工,1 分意味着雇主根本不想和另一个员工一起工作。进行调查后,您会得到以下结果:
因为雇员不能给自己评分,所以对角线元素为零。好消息是你知道每个雇主有多喜欢其他人。坏消息是你不知道如何搭配它们,这样每个人都会对他们的队友感到满意!作为一个热衷于数据的人,你知道一定有某种方法可以用数据来解决这个问题。你是对的。
这个问题可以通过数学编程轻松解决。虽然机器学习在从数据中学习和做出预测方面很棒,但它在做出最佳决策方面有局限性。当你的问题涉及多种约束并允许多种可能的解决方案时,只有数学规划有能力找到最佳解决方案。
让我们来看看如何用数学编程来匹配你的员工!
迪伦·吉利斯在 Unsplash 上的照片
纸浆优化
如果您不熟悉 PuLP,它是一个 python 库,使您能够解决优化问题。你可以在这里找到关于这个图书馆的纪录片。我将使用这个方便的包来制定和解决我们的问题。
安装软件包并定义问题
!pip install pulpfrom pulp import *prob = LpProblem("Matching Employees", LpMaximize)
在LpProblem
方法中,第一个参数是问题的名称,而第二个参数是你的目标(最大化或最小化)
因素
您需要匹配 8 名员工。NumPy 数组是简介中显示的 8 名员工的偏好矩阵。
变量
使用LpVariables
创建变量y
,这是一个决策变量,用于确定是否将员工 I 与员工 j 进行匹配
y = LpVariable.dicts("pair", [(i,j) for i in employees for j in employees] ,cat='Binary')
目标
最大化员工 I 和 j 之间的偏好得分
prob += lpSum([(c[i][j] + c[j][i]) * y[(i,j)] for i in employees for j in employees])
限制
for i in employees: prob += lpSum(y[(i,j)] for j in employees) <= 1 prob += lpSum(y[(j,i)] for j in employees) <= 1 prob += lpSum(y[(i,j)] + y[(j,i)] for j in employees) <= 1prob += lpSum(y[(i,j)] for i in employees for j in employees) == 4
解决问题
在定义了参数、变量、目标函数和约束条件之后,我们就可以用一行代码来解决问题了!
>>> prob.solve()
1
打印解决方案
print("Finish matching!\n")
for i in employees:
for j in employees:
if y[(i,j)].varValue == 1:
print('{} and {} with preference score {} and {}. Total score: {}'.format(names[i],names[j],c[i,j], c[j,i], c[i,j] +c[j,i]))
对结果的解释
在用这个结果匹配你的员工之前,我们先仔细看一下结果,看是否合理。请记住,目标是最大化一对中双方的偏好,而不仅仅是一个个体。
- 凯特将弗朗西斯科作为她的首选,弗朗西斯科也将凯特作为她的首选。所以他们绝对是很好的一对。
- 阿尔弗雷多把本作为他的首选。即使本不像弗朗西斯科那样喜欢阿尔弗雷多,但本仍然喜欢阿尔弗雷多(偏好得分为 7)。
- 乔治似乎不喜欢克里斯,但克里斯非常喜欢乔治。所以也许克里斯会让乔治更喜欢他,因为他们一起工作?
- 奥利维亚和 Thinh 之间的配对似乎不是奥利维亚想要的。她一点也不喜欢这件事!但是 Thinh 真的很喜欢 Olivia,所以也许他会热心帮助 Olivia;因此,这对整个团队都有好处?
你可以成为一个伟大的媒人
这个结果仍然有一些局限性:一些人没有把他们的队友作为他们的首选,甚至讨厌他们的队友。但总的来说,该算法很好地将它们分成对,以便最大化整个组的匹配分数。更好的是,您不需要处理做出最佳决策的难题,因为算法已经为您完成了!
这篇文章的笔记本可以在我的 Github 库中找到。如果你想知道如何将你的员工或朋友分组,我建议你创建一个偏好分数的小调查,并尝试这个算法。也许最大化偏好会创造一个高效的工作环境?
在Github repo中,您可以随意使用本文的代码。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
你创建了一个待办事项清单来提高效率,但最终却把时间浪费在了不重要的任务上。如果你能创造…
towardsdatascience.com](/maximize-your-productivity-with-python-6110004b45f7) [## 用 Python 选择要投资的股票
您计划在未来 3 年投资几只股票,每只股票的每一美元都有不同的预期回报…
towardsdatascience.com](/choose-stocks-to-invest-with-python-584892e3ad22) [## 用于机器学习的线性代数:求解线性方程组
代数是机器学习算法的底线机制
towardsdatascience.com](/linear-algebra-for-machine-learning-solve-a-system-of-linear-equations-3ec7e882e10f) [## 字典作为 If-Else 的替代
使用字典创建一个更清晰的 If-Else 函数代码
towardsdatascience.com](/dictionary-as-an-alternative-to-if-else-76fe57a1e4af) [## 当生活不给你喘息的机会,如何学习数据科学
我努力为数据科学贡献时间。但是发现新的策略使我能够提高我的学习速度和…
towardsdatascience.com](/how-to-learn-data-science-when-life-does-not-give-you-a-break-a26a6ea328fd)
如何用 R 来衡量股票投资组合的表现
利用印尼股市数据进行投资组合分析的案例研究
克里斯·利维拉尼在 Unsplash 上的照片
股票市场是人们安排买卖上市公司股票交易的地方
印尼被世界银行命名为东南亚最大的经济体*。作为世界上人口最多的四个国家之一,有超过 2 亿人生活在这个国家,印度尼西亚有着成为世界上最大的经济体之一的议价能力。印度尼西亚经济状况的良好前景使这个国家成为投资的最佳选择之一。*
印尼股市有 600 多家上市企业,在冠状病毒爆发前仍处于上升趋势。一些上市企业是国有企业,对于这个案例研究,我将只分析 17 家国有企业,它们是最新的 IDX-布朗 20 指数的成员。
用于分析的股票:
ANTM。JK,BBNI。JK BBRI。JK BBTN。JK,BJBR。JK BMRI。JK 艾尔莎。JK,JSMR。JK,KAEF。JK PGAS。JK PTBA。JK PTPP。JK SMGR。JK,TINS。JK,TLKM。JK,WIKA。JK,WSKT。女高中生
本案例研究的假设是:
- 股票在投资组合中的权重对每个企业都是一样的。
- 基于 2013 年 1 月 1 日至 2020 年 7 月 26 日的历史调整收盘价数据的分析。
- 无风险利率:4.5%
- 投资组合再平衡季刊
导入和准备股票数据
我们将使用 getSymbols() 函数从 quantmod 包中导入股票价格数据。 getSymbols() 函数是加载和管理来自各种来源的财务数据的特定函数,但是对于这个例子,我们将使用 Yahoo Finance 作为我们的数据源。
从 Yahoo Finance 导入股票价格数据
默认情况下,我们会将每个股票价格数据作为 xts 对象分配给它们的股票代码(例如:ANTM。JK 价格将存储在 ANTM。JK 变量作为 xts 对象)。为了便于分析,我们应该将所有这些独立的数据收集到一个 xts 对象中。
将单独的数据收集到单个 xts 对象中
图一。索引 xts 对象预览
投资组合分析
我们已经制作了一个投资组合,它作为单个 xts 对象存储在名为 Index 的变量中。我们存储在该变量中的数据仍然是每个交易日的收盘价格式,因为大多数投资组合分析方法需要通过回报数据来提供,我们必须在进入投资组合分析之前先计算其回报。
图二。回报计算公式
幸运的是,在 R 中我们不必每天手动计算每只股票的回报,我们只需要调用 return。calculate()函数,它将以 xts 对象格式返回输出。
因为没有人能预见未来,大多数股票市场投资者在决定买哪只股票之前依赖两件事,第一是基本面分析,第二是技术分析。基本面分析涉及到经济和金融数据的运用(如生产、消费、可支配收入等。)来预测未来的价格,而技术分析主要(通常是唯一)基于对价格数据本身模式的研究。本文将只涵盖一些可用的技术分析方法。
对于第一个分析,我们将尝试从年化回报的回报和风险的角度来看每只股票的表现,因为投资者有时希望看到他们的投资与其风险相比是否有良好的回报,而夏普比率是一个可以衡量这一切的伟大计算。较高的夏普比率意味着,与投资期间的风险相比,我们的投资回报丰厚。为了计算,我们假设印度尼西亚的无风险利率为每年 4.5%。
如何计算 R 中的年夏普比率
图三。投资组合中每只股票的夏普比率
年化是指我们每年重新计算一定时期的数字,例如 ANTM 回归。在 2013 年至 2020 年期间,JK 为-5.35%/年。我们的投资组合年化表现显示,不同股票之间存在差异。我们投资组合中表现最差的是 PGAS。JK 收益为负,期间波动太大,使得 PGAS。JK 夏普比率是其中最低的。我们投资组合中表现最好的是 BBRI。JK 显示最高的回报,最小的标准差和最高的夏普比率。
图 4。BBRI。JK 对 PGAS。JK 调整收盘价图表
如果我们比较我们投资组合中表现最好的股票和表现最差的股票的折线图,我们可以明显看出它们之间的差异。BBRI。JK 有更一致的运动,并且逐年稳步增加,与 PGAS 相反。JK 运动在波峰和波谷之间有一个巨大的跨度。
我们还可以使用 ggplot2 包中的标签图,大致了解我们的股票表现与无风险利率资产(4.5%年回报率)相比如何。
图五。股票表现与无风险利率资产
如果我们从大的方面来看,在此期间,10 家公司非常值得投资,这意味着如果我们投资这些股票,我们将比投资无风险资产获得更多。利用这个图,我们知道多样化在投资中是多么重要,我们的一些投资会有很高的回报,但其他投资正在失去它的价值。
现在,我们将开始将这些股票作为一个投资组合进行分析,如果我们从 2013 年到 2020 年 7 月以相同的比例持有所有这些股票,我们将看到其表现如何。
首先,我们将看看我们的投资组合日收益率分布。使用这个分布,我们将看到我们的投资组合给我们带来正回报的频率,以及它失去价值的频率。
图六。投资组合日收益分布
每日回报分布图显示我们的投资组合在某段时间平均正回报接近于零。它可以在一天内给出超过 10%的回报,但另一方面,它也可能在一天内损失超过 10%的价值。我们将使用时间序列每日回报图来证明这一点,并找出我们的投资组合何时损失如此之大,何时获得最高回报。
图七。时间序列每日回报图
从时间序列图中,我们可以明显地看到我们的大部分回报将在 5%的范围内,尽管有一些异常值,最近的一次是由于冠状病毒在 2020 年上半年的影响。
仅使用每日回报不足以显示我们的投资组合表现如何。幸运的是,有图表。R 中的 PerformanceSummary() 函数将产生投资组合累积回报、日回报和提款图作为其输出。
- 累积回报:显示我们从投资组合中获得多少回报的时间序列图。
- 每日回报:显示我们投资组合每日回报的时间序列图。
- 下降:时间序列图显示波峰和波谷之间的距离,以及需要多长时间才能恢复其值
***charts.PerformanceSummary**(Portfolio_Return, main = 'Portfolio Performance Summary')*
图八。投资组合表现摘要图表
*业绩摘要图表总结了我们在分析我们的投资组合在此期间的业绩时需要的所有信息。**从累积回报图来看,*我们知道我们的投资组合在 7 月 26 日之前仍将有超过 100%的回报,尽管一些股票的负回报和冠状病毒效应在很大程度上扰乱了世界上所有的股票市场活动。从每日回报图中,我们将获得关于哪个时期我们的投资组合回报波动如此之大的信息,利用这些信息,我们可以深入了解某个时期的重大事件如何扰乱股票市场交易,并制定未来是否会有任何其他重大事件的计划。从跌势图、中,我们可以了解我们的投资组合在跌势中表现如何,以及它能恢复多久,这样我们就可以有一个适当的策略,如果未来跌势发生,我们如何持有股票。
摘要
技术分析是利用历史模式和市场统计数据来预测股票价格的变动。本文讨论了如何使用 R-计算来提取模式,并深入了解我们的投资组合在特定时期的运动和表现。
对于未来的投资,我们可以将分析结果作为我们将要采取的每一个行动的基础。例如,我们可以将这种分析划分为一个更小的时间段,并根据形状比率修改我们的投资组合构成。
还有一种方法可以根据历史数据找到我们投资组合的最佳权重。希望它能在其他文章中讨论。
****注意:只要数据源中的数据可用,我们就可以为每只股票和每个时期重建本文中的每个代码。只是试着把它改成你的投资组合构成,看看你的投资组合在某个时期表现如何。
[1] Schwarger,Jack.D .,& Etzkorn,M. (2017),期货市场完全指南,第二版,John Wiley & Sons,Inc .,新泽西州霍博肯。
如何衡量您组织的数据成熟度
数据到人工智能成熟度量表
今天,大多数组织都在努力提高数据的使用(见我们最近的文章为什么你的人工智能项目会失败)。好消息是,使用数据来提高团队的能力并为员工创造更多价值非常简单(不需要在技术上进行巨额投资,也不需要雇佣大量新技术人员)。第一步是认识到你今天在通往人工智能成熟的旅程中所处的位置——这正是数据到人工智能剧本中的第一个工具向你展示的。
让我们看看数据到人工智能成熟之旅的五个阶段。
第一阶段:手动数据处理
我们不断听到销售管理人员讲述他们对手工数据处理的失望。销售人员正在创建他们自己的电子表格跟踪器,以跟踪他们的客户在做什么,以及他们的佣金或奖金是如何根据销售业绩形成的——这是一个对他们特别重要的数据点。这些销售人员也在处理业绩数据,并与他们的现场销售经理分享。
现场经理提取数据并分析销售代表的表现。因为他们还需要创建整个现场团队的绩效图,所以他们必须运行不同的报告(现场销售团队无权访问这些报告),汇总信息,然后创建 PowerPoint 演示文稿以“向上”发送给他们的区域经理。
区域经理也在做同样的事情。他们查看各个地区的表现,手动创建整个地区的数据和可视化摘要,然后发送给国家领导人。依此类推……在组织中一路向上。每个级别查看他们自己的表现(出于个人原因),然后创建一个文档来“向上”传递。
由于每个人都在创建一个独特的文档,这种手动方法缺乏一致性,导致大量时间浪费在探究具体数字是如何得出的以及验证准确性上,而不是理解数据想要告诉我们什么。
第二阶段:仪表盘死亡
数据共享挑战通常通过向链中的每个个体发送更多数据来解决。BI(商业智能)是企业中最常被误用的工具之一。难怪员工生产力的死亡呼喊是…
“如果我们可以将它加载到 BI 工具中,团队可以根据需要对其进行操作和深入研究,那么每个人都将获得相同的信息!”
不幸的是,现在组织中的每个人都需要成为分析师,才能了解他们的世界正在发生什么。这通常会鼓励影子 IT 和数据团队的创建(本地团队成员创建工具来回答他们团队在整体数据和 IT 责任链之外的许多特定问题)。
然后是神奇的“仪表板”。最初的设想是提供一个关于组织中正在发生的事情的简化视图(想想你汽车上的仪表板,上面有不到五个数据点),仪表板迅速成为每一个可能项目的垃圾场,通常类似于航天飞机的驾驶舱,有数百个刻度盘、读数和闪烁的灯。我们见过用户导航的网站仪表板,或者创建 100 多页的幻灯片,以涵盖讨论中的每一个可以想到的问题和场景。再一次,大量的时间被浪费在创建和浏览这些工具以试图找到答案上。
手动数据处理和神奇的仪表盘都掩盖了这个成熟阶段的一个核心问题:多个不一致的真相来源。相同的答案存在于不同的系统中,组织的每个部分在不同的地方寻找答案。当数据被处理时,数据的副本被分散开来,报告作者通常会抓住最容易访问的内容,因为通常只有关键的个人知道在哪里以及如何获得事实的来源。
这就把我们带回了关于报告中的数据来自哪里的争论,因为用于生成答案的业务逻辑并不明显。
第三阶段:数据讲述故事
随着组织的数字化发展,数据开始向他们的团队讲述故事。这通常始于工作重点是了解不同角色的员工成功完成工作实际需要哪些信息。这种关注简化了数据讨论,并使业务和 IT 合作为这些员工服务。
关注员工角色级别还揭示了回答最有价值的问题(我们的销售业绩如何,为什么?)需要查看和组合来自整个组织当前使用的多个系统的数据。为了防止这种情况给团队带来更多的信息过载,必须将汇总的数据分解为回答手头问题所特别需要的内容。
这种简化的、以角色为中心的方法允许将数据转化为员工的简略答案,在一个屏幕上提供他们需要的一切,以了解正在发生的事情并相应地做出更好的决策。此外,他们没有浪费时间点击无数的报告、工具和仪表板来显示所需的数据,并手动将其混合在一起。
成功实现以角色为中心的数据需要 IT 和业务部门密切合作,以了解角色的需求,并在正确的时间提供正确的答案。例如,了解各种角色的交集(即销售人员和现场销售经理)并确保有工具支持这些交互非常重要。这些工作直接影响数据在链上和链下的一致性,并确保交互的人面前有相同的信息,而不管每个角色的特定工具。
第四阶段:智能出现
随着来自数据的智能开始出现,组织开始看到真正的业务成果。随着员工学习工具,提高对数据的理解,变得更加舒适,创造价值的速度开始加快。随着您在设置警报和例外方面变得越来越老练,员工应该会感觉到主动信息提供了更多支持。然而,即使你的数据提供了更多的相关信息,好的跨职能开发团队仍然是至关重要的。
在这个成熟度级别,个性化的客户体验可以成为现实。您的数据已经足够成熟,可以更好地识别个人需求,并为您的员工提供必要的工具来提高客户服务水平。这并不意味着建立更多的呼叫中心规则和程序;这只是意味着您可以更密切地衡量独特的客户,员工也可以做出相应的反应。
与直觉相反,您的团队可能开始与客户和供应商员工共享更多数据,因为您的信息现在更加可靠。根据我们的经验,您组织中从未与客户交谈过的人将开始这样做,并且自然希望分享有价值的相关信息。
如果您确实发现您的员工正在共享更多的信息,请确保您的数据治理流程正在高效地工作。例如,拥有与客户和供应商共享数据的可行指南。这包括共享哪些数据、易于理解的限制以及如何共享数据的流程。
在这一阶段,仅限于少数关键用户的限制性传统数据访问(在第 2 阶段中描述)应该会消失,员工应该普遍对根据需要访问数据感到满意。员工可以自由地在数据范围内进行调查,从而得出新颖的解决方案。
最后,随着数据成熟度的提高,改进的业务成果应该更加有形和可衡量。虽然你可能刚刚开始机器学习和其他人工智能应用,但你的员工应该已经从你的数据中获得了重大价值。你的组织积累的价值应该很高——足以暂停你的机器学习工作,并简单地收获所有团队辛勤工作的好处。
第五阶段:组织转型
不管你在网上看什么,现阶段运营的机构很少。无论现在这个阶段有多么令人向往,它仍然是大多数企业的目标阶段。在这个阶段,机器学习是成熟的,你的数据是干净的,你的团队拥有广泛的数据科学技能。
您的员工使用数据代表彼此和客户开展工作。他们较少受到限制性规则和审批层级的约束,更有能力使用数据来“做正确的事情”。总的来说,组织的运作结构更加扁平化,治理的跨职能性比部门领导更强。
机器学习正在自动化低价值的重复性工作,员工能够专注于高价值的活动,特别是异常处理。他们使用算法对竞争性定价、服务、产品盈利能力、预测等进行更深入的分析。事实上,你对市场的新数据驱动观点正在改变游戏规则。
我们认为,这一阶段最困难的管理问题是使用算法来创建可能影响员工角色的新商业模式的压力。虽然这会威胁到员工,但改变从来都不容易。团队可能是多余的,不仅仅是因为被淘汰的低价值工作,而是因为你如何定价、开发产品以及如何与彼此、供应商和客户互动的变化。这些算法如何支持你的团队,并使他们能够接受新的挑战,这将是成功的关键,而不仅仅是将人们自动化出今天的流程。
下一步是什么?
确定您的组织在数据到人工智能成熟度曲线中的位置对于创建一个推动数据使用的计划至关重要。一旦你知道你的立场,你就可以采取行动。我们的数据到人工智能行动手册的下一步将涵盖在成熟阶段之间前进所需的内容,并保持您的数据成熟之旅向前发展。
亚历克斯·布拉顿和凯文·格林
关于作者:
亚历克斯·布拉顿作为 Lextech 的首席执行官兼首席极客,亚历克斯领导着一个创造员工体验的团队,为员工赋权并实现业务成果。他热衷于改善工作的未来,帮助组织从固定的工作场所过渡到任何地方工作。Alex 是《十亿美元应用》的作者,也是北伊利诺伊大学计算机科学的兼职教授。
lextech.com
凯文格林凯文是一名 3x 首席信息官,领导人工智能的早期工作,为数据团队带来新的工具和流程。凯文被评为 2019 年芝加哥首席信息官年度创新者。他是西北大学微软 IT 项目顾问委员会的主席。
laminargroup.com