Python 中代码剖析的快速简易指南
编程;编排
使用线路分析器查找函数中的瓶颈
来源:unDraw.co
简介
作为一名数据科学家,你的大部分时间应该花在数据争论和/或训练机器学习模型等任务上。然而,您会发现,当您的代码似乎永远无法执行时,这种情况很快就会消失。出于这个原因,当您需要评估应用程序中的瓶颈并节省您的宝贵时间时,代码剖析就来了。我们今天文章的主角将是 line_profiler 包,我们将使用它来逐行剖析一个函数的运行时,这样我们就可以让您更接近代码效率天堂。开始侧写吧!
注意,对于本文,我将使用 python 笔记本(。ipynb ),因为我发现它们非常适合于实验,这使它们成为一个很好的代码剖析工具,因为您会频繁地对更高效的代码进行修改。
什么是代码剖析?
简而言之,代码分析是一种用于检测每个函数或代码行运行时间以及执行频率的方法。这是找到代码中的瓶颈,从而理解如何优化代码的重要一步。我们的方法本质上是定量的,因为它在代码的各个行上产生汇总统计。因此,它为您的代码的哪些部分需要进一步优化提供了可操作的见解。
如何分析一个函数
探索如何分析我们的代码的最好方法是用一个例子。假设我们有一个简单的函数,将磅转换为千克和克,如下所示:
def pounds_to_metric(pounds):
kilograms = pounds / 2.2
grams = kilograms * 1000
return 'The amount you entered is equal to {} kilograms and {} grams.'.format(int(kilograms), grams)
快速肮脏的方法:%timeit
如果我们想得到这个函数的估计运行时间,我们可以使用 IPython 的 timeit 神奇函数,它将给出总的执行时间。
%timeit pounds_to_metric(115)
跑得最慢的人比跑得最快的人多花了 11.57 倍的时间。这可能意味着正在缓存中间结果。1000000 次循环,最佳 5 次:每次循环 1.27 秒
从输出中,我们可以看到执行了多次运行和循环。% time 它多次运行示例代码,并提供对代码执行时间的估计,使其更准确地表示实际运行时间,而不仅仅依赖于一次迭代。输出中显示的平均值是考虑到多次运行中的每一次运行的运行时间的汇总。
严格的方法:线路剖面仪
因为%timeit 只对一行代码计时,所以当我们想要快速评估一个函数的运行时性能时,它就派上了用场。然而,不难看出为什么这不能很好地扩展到更大的代码块。因此,如果我们想知道函数中的每一行运行了多长时间,这就是 line profiler 包派上用场的地方。
因为这个包不是 Python 标准库的一部分,我们需要单独安装它。这可以通过 pip install 命令轻松完成。接下来,我们将它加载到会话中,如下所示。
%load_ext line_profiler
我们现在可以使用 line profiler 的神奇命令%lprun 来评估 pounds_to_metric 函数中特定代码行的运行时。首先,我们使用-f 标志来指定我们要分析的函数,后跟我们要分析的函数。注意,函数名的传递不带任何括号。最后,我们指定我们想要分析的确切函数调用,以及任何必需的参数。我会像之前一样用 115 作为磅数。
%lprun -f pounds_to_metric pounds_to_metric(115)
分析统计数据
运行前面一行代码会生成一个总结分析统计信息的表,如下所示。
作者图片
现在,让我们浏览一下汇总表的各个列!
首先,显示指定函数行号的列,随后是显示该行被执行次数的命中列。接下来,时间列显示了每一行执行所花费的总时间。该列使用一个特定的计时器单位,可以在输出的第一行中找到。这里,计时器单位使用科学记数法(1e-06)以微秒为单位列出。例如,我们可以看到第五行花了 12 个定时器单位,或者说,大约 13 微秒来运行。
此外, Per Hit 列给出了执行一行所花费的平均时间,通过将 time 列除以 Hits 列来计算。假设我们在这个函数中的所有点击都等于 1,那么 Time 和 Per Hit 列显示了类似的结果。 %这可以帮助我们检测在函数中占用最多时间的代码行。最后,在行内容列中显示每一行的源代码。很整洁,是吧?
结论
至此,我们总结了 Python 中代码剖析的快速简单指南。回想一下,我们讨论了如何使用 line-profiler 模块评估函数的性能,以及为什么这种方法比使用%timeit 更好。我希望这篇文章对你有用,欢迎在评论中提问。如果你喜欢这篇文章,一定要看看我在 Medium 上的其他文章。快乐剖析!
快速简单的晨间例行公事,开启富有成效的一周
如何在合适的时间开始你的周一早晨
汤姆·罗杰森在 Unsplash 上的照片
在我上一份工作开始的时候,我开始对几乎所有的事情做笔记。如果我脑子里突然冒出一个想法,我会把它写下来。如果我参加一个会议,我会把会议记录和行动项目一起带走。或者,如果我有一个回顾,我会每周记录我的工作,然后在会议前总结。两年后,我有了一个相当大的单词数字笔记本——各种各样的信息,包括完全有意义的完整句子或一些没有上下文的单词。笔记写得越多,就越难快速找到行动项目和成就。
造诣
我首先记录的是我的成就。实话实说吧;作为数据人员,我们一周内有太多事情要做。您可能经常会发现自己在理解业务目标、开发技术解决方案或深入特定主题以解决问题之间切换。随着这一切的进行,我们可能会迷失在细节中,错过我们工作的影响,这就是为什么我喜欢在周一停下来反思。
我上周完成了什么?我的工作对项目、业务或同事产生了什么影响?
后退一步,记录成就,这样在季度或年度评估时,你就有了一份精心策划的清单。这种反思有助于求职的另一个原因是。现在你已经有了一份清单,可以添加到你的 LinkedIn 或简历中,并在面试中讨论。
然而,谈论开发一个成就列表并不意味着一个句子串,比如“开发了一个运行 ETL 过程的脚本”相反,我使用星方法来发展我的清单。正如凯特·布加德在文章中所定义的,明星法是:
“情境:设定场景,给出你例子的必要细节。任务:描述在那种情况下你的职责是什么。
行动:准确解释你采取了哪些措施来解决这个问题。
结果:分享你的行动取得了哪些成果。”
用这个方法,让我们重新定义我们的成就。
- 情况 —您有一个数据集,在对其进行分析之前需要清理。
- 任务 —对于这个项目,你的任务是开发一个脚本来对提供的数据运行 ETL 过程。
- 动作 —为此,您利用 Python 从文本字段中提取数据,规范化信息,并将其上传到 CosmosDB。
- 结果 —最终,您的脚本加载 1TB 的数据,并在 8 小时内存储结果,从而使处理结果的运行速度提高了 4 倍。
既然我们已经考虑了我们成就,我们可以重写我们的陈述:
❌开发了一个脚本来运行 ETL 过程。
✅设计了一个 Python 脚本来运行 1 TB 数据的 ETL 过程,该过程将提取和规范化文本数据并上传到 Cosmos DB。在对数据进行分析之前,该脚本将处理结果的运行速度提高了 4 倍。
在我看来,我更喜欢简历和评论的第二种说法。该语句简要介绍了任务,同时也显示了结果。通过每周写一次这些类型的成就,你的工作已经为你完成了。当到了回顾的时候,你不必试图回忆过去几个月你做了什么。相反,你可以使用你的清单,突出你最自豪的成就。
我喜欢每周做一次的另一个原因是它让我看到我已经取得的进步。我可以回顾我前一周做了什么,看看哪些进展顺利,哪些进展不顺利。如果我需要在这个过程中做一些调整,我可以。
行动项目
除了记录成就,我还通过确定我需要做什么来开始我的一周。在我的上一个角色中,我会通过咨询 scrum board 和 backlog 来做这件事。以此为数字清单,我会决定下一步需要做什么,什么是优先事项。
开始我作为数据科学顾问的新角色时,我决定继续跟踪我的行动项目,但我需要适应这个过程。目前,我们有一个 scrum 板,但是它没有被同样的使用。相反,它关注高层次的目标。对我来说,这还不足以追踪我每周的进度。为了解决这个问题,我现在在物理待办事项清单便笺上列出所有行动项目。这些便笺刚好够大,可以抓住一两天的行动项目。在完成这些行动一周之后,你会发现自己有 2 到 3 张卡片,上面写着那一周你需要做的事情。
回顾过去一周的清单让我能够找出我的分析中哪些已经完成,哪些还没有完成。同样,我可以确定在一周开始时我需要关注什么。
当你开始新的一周时,以下是一些需要考虑的事情:
未完成的行动项目 —上周你有哪些任务没有完成,需要开始或继续?有时候,我无法完成一周清单上的所有事情。所以在下一节课开始时,我会检查这些项目。然后,我从列表中决定什么需要开始或继续。有时,根据我前一周得到的反馈,未完成的行动项目会被安排在以后。
反馈 —一旦这些被计划在以后或被添加到列表中,我接下来要检查的就是与反馈相关的行动项目。你在上周的工作中收到了哪些需要解决的反馈?你得到如何改进你的模型的建议了吗?有人给你一个新的数据集来研究吗?如果它是优先事项,那么我会把它添加到我的列表中。否则,我计划在未来的一周。
计划行动项目——最后,我查看计划项目,看看根据截止日期需要开始什么。需要启动哪些计划任务?有计划的任务有时看起来很容易列入清单,但如果我了解数据科学,情况可能不总是这样。有时,这些任务需要额外的时间来专注于研究、理解业务目标和实施。当你把这些计划好的任务添加到你的清单上时,确保你给自己足够的时间。
在一周的开始,你喜欢看什么,做什么?你有什么你觉得有帮助的惯例吗?
最后的想法
如果你像我一样经常记笔记,你可能会发现很难在其中快速找到行动项目和成就。在我一周的开始,我喜欢做两件事:( 1)在一个列表中记录我一周的成就,( 2)重写我一周的清单。
- 不要跟踪任务列表,而是创建一个你的成就列表以及相关的结果。找到一个适合你的方法。我使用星方法来发展我的清单。这个列表对简历、LinkedIn、面试以及季度或年度评估都很有帮助。
- 用一张需要完成的行动清单开始你的一周。组织你的想法,看看你需要做什么,完成什么。
本文包含附属链接。如果你想了解更多,可以看看我下面的其他文章!
机器学习模型中 AUC-ROC 的快速指南
比较分类模型有效性的简单且健壮的方法不应该由于太多不同的定义而变得复杂。
机器学习最常见的应用之一是将实体分为两个不同的、不重叠的类别。这些年来,人们已经设计出了几种方法,从非常简单的到更加复杂的到近乎于的黑箱。在处理几乎任何类型的模型时,一个常见的问题是如何比较不同方法的性能,或者不同的参数调整。幸运的是,在二元分类器的情况下,有一个简单的度量抓住了问题的本质:它是接收器操作特性的曲线(即积分)下的面积,因此缩写为 AUC-ROC 或简称为 ROC。
处理你的错误
为了便于讨论,假设一个 tiger vs cat 二元分类器将实体识别为属于真阳性 ( tiger ,接受)或真阴性 ( cat ,拒绝)情况。分类器给每个实体分配一个 0 到 1 之间的数字,如果该数字大于给定的阈值(比如 0.5),则该实体被接受,否则被拒绝。没有一个分类器是完美的,这意味着不到 100%的情况会被正确识别。大多数情况下,它会因为许多原因而误识别事物,特别是小的训练数据集大小和模型的内在限制。很多情况下,我们也在努力拒绝某种形式的“背景噪音”(这里:猫)。
传统上,分类错误分为两类,我在下文中将其称为假阴性 ( 即老虎被分类为猫)和假阳性 ( 即猫被识别为老虎)。不言而喻,将猫识别为老虎远没有将老虎识别为猫危险:这两种类型的错误通常不会被同等对待,并且根据问题的不同,分类器的参数被优化以最小化任何一种类型。
ROC 曲线
说了这么多,我们想找到一种简洁的方法来总结分类器的性能。直观地,人们很容易认识到,给定的模型位于参数空间中的一个折衷点,平衡了真阳性(TP)、假阳性(FP)、假阴性(FN)和真阴性(TN)的数量。一旦模型被训练,我们被允许改变的唯一参数是输出概率的阈值。因此,我们从 0 到 1 扫描这个数字,看看性能如何相应地变化。然而,4D 参数空间几乎是直观的!然而,事实证明这些数字中只有四分之二实际上是独立的,所以更容易将它们组合成其他东西来使用。长话短说,这是一个可能的组合:
真阳性率(TPR) = TP / (TP + FN) =识别信号的效率(εₛ)(也称回忆或灵敏度 )
假阳性率(FPR) = FP / (FP + TN) =低效率(ε_B)拒绝背景
ROC 曲线无非是 TPR 对 FPR,作为产出概率的函数来扫描。通常,它看起来有点像这样:
典型的接收器工作特性 (ROC)曲线示例。图片作者。
另类组合怎么样?当然,如果你看一看维基百科页面,你会发现关于敏感度、召回率、命中率,或真阳性率、特异性、选择性或真阴性率、精确度或阳性预测值、阴性预测值 脱落或假阳性率、假发现率、假遗漏率、流行阈值、威胁分值(TS)或关键成功指数(CSI)、准确度、平衡准确度、马修斯相关系数、福尔克斯-马洛指数、信息量或庄家 所有这些都是为了说明不同的背景可能需要不同的定义,但这些不一定像 TPR vs FPR 那样直观。
解释 ROC 曲线下的面积
假设我们有两个分类器 A 和 B 。他们的 ROC 曲线如下图所示。哪个性能更好?
两种不同模型的比较。图片作者。
在回答这个之前,我们想做一些考虑。两个分类器都具有在 0 和 1 之间的输出,但是通常两个分类器对于相同的 TFP 或 FPR 值将具有不同的阈值。因此,我们可能想要一个不依赖于阈值的度量,除非我们设计分类器来最小化 FP 或 FN 类型的误差。此外,我们想要一个归一化的数字,即可以直接在两者之间进行比较。如果我说分类器 A 的分数是 122,分类器 B 的分数是 72,那就不好说了……但是如果我们知道分数是在 0 和 1 之间归一化的,那么直接比较就很容易了。
具有这种特性的一个简单函数是——猜猜看?——曲线下的面积,,即积分。因为 FPR 和 TPR 都在 0 和 1 之间,所以面积不能小于 0,也不能大于 1。
由于一张图片胜过千言万语,下面这张图片展示了如何通过查看 AUC-ROC 来发现不同分类器的性能:
如何一眼看出哪个是最好的分类器的总结?图片作者。
在实践中,您可能最终会使用某个预定义库中的函数,比如来自 scikit-learn 的函数。该函数需要真实标签,以便将阈值扫描的结果与真实情况进行比较。
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
X, y = load_breast_cancer(return_X_y=True)
clf = LogisticRegression(solver="liblinear", random_state=0).fit(X, y)
roc_auc_score(y, clf.predict_proba(X)[:, 1])
0.99
这也适用于多类吗?的确是这样:只要画出一个类与其他类的对比图。
结论
计算接收器工作特性曲线下的面积是比较不同分类器有效性的最直观的工具。虽然有一些已知的限制,例如,当你想最小化某些类型的错误时,这可能是说服任何人分类器比随机选择答案做得更好的最有效的方法。需要注意的是,比较不同的分类器,特别是属于不同类别的分类器,通常需要更加仔细的思考,例如,训练决策树所需的数据集可能比训练深度神经网络所需的数据集小,但它们在某些特定边缘情况下的效率可能很微妙,仅通过查看单个数字(如 AUC-ROC)很难发现。
交叉熵损失函数快速指南
实践教程
多类别分类是机器学习中的常见问题。让我们深入研究一下最常用的损失函数的定义。
机器学习历来擅长的最突出的任务之一是将项目(例如图像、文档,声音)分类成不同的类别。特别是近年来,能够执行数学模型的硬件的进步,如卷积神经网络(CNNs)和递归神经网络 (RNNs,LSTMs),使得在性能上实现量子飞跃(有时字面意思)成为可能。然而,定义模型只是故事的一半。为了找到执行这一任务的最佳参数,还需要定义一个成本或损失函数,该函数捕捉我们想要优化的本质,并执行某种形式的梯度下降以达到一组合适的参数。
Jan Antonin Kolar 通过 Unsplash.com 拍摄的照片。
从多项式概率分布到交叉熵
首先,我们需要定义一个描述我们问题的统计框架。通常情况下,属于一个系统的每个项目(例如一只宠物的图片)可以被唯一地分配到 C ≥ 2 个可能的离散类别(例如猫、狗、金鱼)中的一个。对于每个训练示例 i ,我们都有一个基础事实标签( t_i )。此外,我们的模型输出一个由 C 个数字组成的向量,这个向量必须被解释为 j ∈ [1,…, C 是正确的类别的概率。总结一下:
- 每个观察都有离散的可能结果;
- 对于每个观察值,每个类别都有一个给定的发生概率( p 1、…、 p _ C ),使得p 1+…+p_C= 1,并且对于所有j**p _ j≥0;
- 有 N 个观测值,每个观测值都是相互独立的;
如果是这样的话,那么,你很幸运!每个可能的结果都由所谓的二项式概率分布来描述,每个独立试验类别 j 中的即是具有概率 p_j 的正确结果。当我们将试验扩展到C2 类时,相应的概率分布称为多项式。为了简单起见,忽略归一化因子,它看起来是这样的:
多项式概率分布的定义,直到一个归一化因子。图片作者。
正如优化问题中经常出现的情况,当算法在计算机中实现时,处理乘积的最大值可能会引起数值问题。相反,最好使用前面带负号的同一个函数的对数,在参数空间中搜索它的最小值。这通常被称为对数可能性。记住 log 函数的属性,该公式转化为:
多项式概率分布的对数似然,直到一个常数,它可以被重新吸收到优化问题的定义中。图片作者。
一些读者可能已经认识到这个功能:它通常被称为交叉熵,因为它与从信息论中已知的一个量相关,以编码一个人需要多少内存例如来传输一条消息。
简而言之,我们将优化我们的模型的参数,以最小化上面定义的交叉熵函数,其中输出对应于 p_j ,真实标签对应于 n_j 。值得注意的是,真正的标签通常由一个独热编码、即向量来表示,该向量的元素除了在对应于正类的索引处的元素之外都是 0。在我们的例子中,cat=(1,0,0)
、dog=(0,1,0)
和goldfish=(0,0,1)
。这意味着总和logP
减少到单个元素n_m log p_m
,其中 m 是正类的索引。
将模型输出转换成概率向量
一般来说,ML 模型的输出( logits )不能被解释为不同结果的概率,而是一组浮点数。如何解读这个元组就看我们自己了。如上所述,为了成为概率向量,p_ 1+…+p_C= 1 且 p_j ≥ 0 对于所有 j 。
在**二元分类的情况下,**用于将唯一输出数转换成概率的最常用函数是 sigmoid 函数,也称为逻辑曲线:
s 形函数的定义。图片作者。
s 形管“挤压”接近 0 的负值和+1 的正值:
范围从-10 到 10 的 Sigmoid 函数。图片由作者提供,用 Wolfram:Alpha 制作。
在多类的情况下,需要一个扩展 sigmoid 的函数,以便处理代表跨越 C 可能类的概率的向量。最常用的函数叫做 Softmax:
Softmax 函数的定义。图片作者。
可以看到,每个元素依赖于所有剩余的 N_C-1 元素的值。这很好,因为我们希望概率被标准化。事实上,由于指数函数的属性, softmax 强制所有元素为x _ I0,并且所有元素的总和为 1。这样,应用于逻辑的 softmax 的输出可以被解释为跨可能类别的概率向量。
然而,需要注意的一点是,指数函数可能会使大数字变得更大,以至于它们可能不再适合计算机的内存。幸运的是,有一个常用的技巧来避免这种情况。在我们只有三个类别的情况下,更容易看到它的作用。
Softmax 函数应用于具有三个元素的 logit 向量。
首先,我们确定向量的最大元素。假设是 x_3 。然后,我们将 logits 向量转换如下:
记住 e⁰=1,我们现在应用 softmax :
如果你不相信这个向量与没有减去 x_3 的向量相同,看看第三个元素:
因此,由于指数函数的一个属性,我们可以从 softmax 的计算中“移除”最大的元素,并可能避免内存问题。我觉得这个解决方案至少非常优雅!
这里有一个利用 NumPy 的快速 python 实现:
softmax 的 Python 实现,使用 NumPy 计算指数。
结论
我经常发现交叉熵的大多数解释令人困惑,因为他们把车放在了马的前面。事实上,我们可以从函数定义开始,然后让读者相信这是正确的,但是我更喜欢从头开始。
我希望这篇帖子澄清为什么我们在多类分类任务中需要这样的函数,为什么我们不能只在损失函数中使用模型输出。
决策树快速指南
很容易迷茫,只见树木不见森林。让我们仔细看看机器学习中的一些最常见的方法,以分析分类和回归任务的异构数据。
决策树是一种非常常见、直观且易于解释的数据分析方法,其目标是将实体分成不同的组(分类)或预测数量(回归)。DT 在处理异质的非标准化输入特征方面也很出色(例如分类的和连续的)。
有什么不喜欢的?
首先,一个简单的决策树 (DT)是一系列的二元决策,接受一组输入特征,并基于这些特征分割输入数据,其方式类似于流行的游戏,如 10 个问题或猜猜我是什么动物。二元问题/答案对的路径可以存储为图形或一组规则。
基本决策树的例子。图片作者。
可以创建具有多个最大可能节点的单个决策树,然后对其进行训练以优化目标函数。有许多常见的算法,如c 4.5(ID3 的继承者)和 CART (分类和回归树)。例如,在 CART 中,基尼指数%20of%20that%20class%20probability.)被用作成本函数来测量分裂样本的“纯度”,而 C4.5 利用信息熵来丰富任一类的叶子。所有算法都实现了一个停止条件,例如每个叶子中元素的最小数量(例如上图中的*【昆虫】)或者是否达到了节点的最大数量(例如上图中的*【鱼】和【蟹】)。在一个树被训练后,一个修剪程序通常被应用来减少节点的数量:更简单的树是优选的,因为它们不太可能过度拟合数据,并且可以说花费更少的时间来执行。**
虽然决策树简单且易于解释,但它们往往会过度拟合数据。然而,优势在于数量:boosting 和 ensemble 方法可以有效地克服这个问题。
****决策树顾名思义,是从一组简单的决策树中构建的,这些决策树被用作“弱”分类器。根据树的组合方式定义了不同的方法。
随机森林【RF’s】,这大概是最直观的,在分类中利用多数票或者在回归中平均。在这种情况下,每棵树输出*,例如类别索引(0 或 1)。最常见的答案作为最终结果。为了避免过度拟合,每个弱分类器在数据的子样本(具有替换)上被训练,并且仅利用输入特征的子集。这种双重欠采样过程简称为 自举聚合 或打包*。在不平衡数据集的情况下,应用类权重是一个常见的过程。有趣的是,随机森林也用于创建输入要素的稀疏矢量嵌入。的基本思想是对节点序列进行矢量化,并将它们保存在二进制元素的向量中。根据停止标准,向量的大小为n_estimators * max_nodes
或n_estimators * max_depth
。这种向量可以通过非常高效的线性分类器进行分析*,例如*(例如参见 scikit-learn 网站上的本教程)。
另一方面, 梯度提升树【GBDT】**为每个“弱分类器”【h(x)分配不同的非负权重 w ( 即一个相对重要性),最终判决为 w_i * h_i(x) 之和。 boosting 其实就是把很多顺序连接的弱学习者组合起来,达到更好的效果。在这种方法中,通过添加越来越好的树来提高每一步的分类精度,从而最小化目标函数。为此,第 i 第 F_i 在第 (i-1) 第树 F _(I-1)y—F _(I-1)的残差上被训练。权重序列(w1、w2、…、 w_N )结果是递减的,即每棵树都是泰勒级数展开中的一种高阶修正。有关更多详细信息,请参考 xgboost 库的文档,这可能是该算法最常见的实现。有趣的是,增强决策树在实验物理学中扮演着重要的角色,例如在欧洲核子研究中心对基本粒子属性的测量。
两种最流行的集成方法的视觉总结:随机森林(上)和梯度增强树(下)。图片作者。
在我们结束这场讨论之前,值得一提的是,自 2021 年 5 月下旬以来,谷歌的机器学习库 TensorFlow 也提供了一个决策森林和梯度提升的实现,被恰当地称为 TensorFlow 决策森林(TF-DF) 。按照网站上的例子和 Colab 笔记本,人们可以创建一个决策森林,并非常容易地适应熊猫数据框架,例如:
*# Install TensorFlow Decision Forests
!pip install tensorflow_decision_forests
# Load TensorFlow Decision Forests
import tensorflow_decision_forests as tfdf
# Load the training dataset using pandas
import pandas
train_df = pandas.read_csv("dataset.csv")
# Convert the pandas dataframe into a TensorFlow dataset
train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(train_df, label="category")
# Train the model
model = tfdf.keras.RandomForestModel()
model.fit(train_ds)*
有趣的是,该库还提供了一些可视化工具来检查模型,例如 tfdf.model_plotter.plot_model_in_colab(model, tree_idx=0)
。
SymPy 符号数学快速指南
了解如何在 Python 中操作数学表达式
米歇尔·玛特隆在 Unsplash 上的照片
您的旅程概述
1 —搭建舞台
无论你是大学的学生,还是从事数据科学的工作,都没有绕过数学的路。有人甚至会说,数据科学(简单地说)是应用数学/统计学的一种形式。在 Python 中,有很多处理数学数值的库,像 NumPy 、 SciPy 、 Scikit-Learn 和 Tensorflow 。然而,要明确地处理数学符号,只有一个竞争者:SymPy。
SymPy 在 Python 中代表符号数学,是一个处理数学的 Python 库。在 NumPy、Pandas 和 Matplotlib 等巨头中,它是 SciPy 生态系统的核心库之一。有了 SymPy,你可以操纵数学表达式。此外,你可以解决大学水平的数学问题,需要微分,积分和线性代数。
在这篇博文中,我将向您展示如何使用 SymPy 中的基础知识,以便您可以开始象征性地解决数学问题。我之前在 SymPy 上制作了一个视频系列,所以如果你是一个视觉学习者,也可以随意看看😃
**前提:**你应该大概知道 Python 的基础知识。除此之外,你不需要任何关于 SymPy 的经验😌
2 —安装 SymPy
SymPy 的开发者推荐通过 Anaconda 安装 SymPy。如果您使用的是 Anaconda,那么您应该已经安装了 SymPy。为了确保您拥有最新的版本,请在 Anaconda 提示符下运行以下命令:
conda update sympy
如果您没有使用 Anaconda,而是使用 PIP,那么您可以运行以下命令:
pip install sympy
对于安装 SymPy 的其他方式,请查看安装选项。
3 —创建交响乐符号
现在让我们从 SymPy 开始吧!SymPy 的基本对象是一个符号。要在 SymPy 中创建一个符号x
,您可以写:
# Import the package sympy with the alias sp
import sympy as sp# Create a symbol x
x = sp.symbols("x")
上面的代码创建了符号x
。SymPy 中的符号是用来模拟代表未知量的数学符号。因此,下面的计算就不足为奇了:
print(x + 3*x)
**Output:** 4*x
正如你从上面看到的,符号x
就像一个未知数。如果你想创建一个以上的符号,那么你可以这样写:
y, z = sp.symbols("y z")
这里你同时做了两个符号,y
和z
。现在,您可以随意加减乘除这些符号:
print((3*x + 2*y - 3*z)/x)
**Output:** (3*x + 2*y - 3*z)/x
在下一节中,我将向你展示如何用 SymPy 解方程🔥
**Pro 提示:**如果你看 SymPy 的文档,你有时会看到他们使用 import 语句
from sympy import *
。除了快速测试之外,这是一个坏主意(即使在这种情况下,我也要说它会养成坏习惯)。问题是这样做会覆盖其他包中的函数和类。所以我一直推荐写import sympy as sp
。
4 —解方程
现在让我们使用 SymPy 符号来解方程:假设你有一个二次多项式x**2 + 5*x + 6
。怎么能解方程x**2 + 5*x + 6 = 0
?我们大多数人对于如何手工操作都有一些模糊的记忆,但是你是如何让 SymPy 完成这项工作的呢?以下代码首先创建一个符号x
,然后创建问题中的等式,最后求解该等式:
import sympy as sp# Creating the symbol x
x = sp.symbols("x")# Creates the equation in question
equation = sp.Eq(x**2 + 5*x + 6, 0)# Solving the equation
solution = sp.solveset(equation, x)
让我们看看上面的代码创建的变量solution
:
print(type(solution))
**Output:** <class 'sympy.sets.sets.FiniteSet'>print(solution)
**Output:** FiniteSet(-3, -2)
如您所见,solution
变量为我们提供了方程x**2 + 5*x + 6 = 0
的两个解。SymPy 的 FiniteSet 类型是一个 iterable 类型,所以如果您愿意,您可以遍历它:
for num in solution:
print(num)**Output:**
-3
-2
如果您想从solution
变量中提取数字-3 和-2,您可以首先将solution
转换成一个列表,然后像往常一样进行索引:
# Turn solution into a list
solution_list = list(solution)# Access the individual solutions
print(solution_list[0])
**Output:** -3
我们刚刚完成了一个简单的二次多项式,如果你愿意的话,你可以用手算出来。但是,SymPy 解方程远比你我强(抱歉不抱歉)。自己尝试更难的东西,看看 SymPy 能承受多少😁
5 —有用的功能
关于 SymPy 的一个有趣的事情是它包含了有用的数学函数。这些函数可以开箱即用,您应该熟悉一些最常用的函数。
以下脚本使用 SymPy 中的函数创建了三个不同的方程:
import sympy as spx = sp.symbols("x")equation1 = sp.Eq(sp.cos(x) + 17*x, 0)equation2 = sp.Eq(sp.exp(x ** 2) - 5*sp.log(x), 0)equation3 = sp.Eq(sp.sinh(x) ** 2 + sp.cosh(x) ** 2, 0)
如果你仔细阅读上面的代码,你会发现
cos
(余弦函数)sin
(正弦函数)exp
(指数函数)sinh
(双曲正弦函数)cosh
(双曲余弦函数)
配备了这些函数,您可以例如使激活函数用于深度神经网络。例如,众所周知的 sigmoid 激活函数可以写成如下形式:
sigmoid = 1/(1 + sp.exp(-x))
如果要将值代入 sigmoid 函数,可以使用.subs()
方法。让我们试试这个:
print(sigmoid.subs(x, 2))
**Output:** 1/(exp(-2) + 1)
嗯。虽然从技术上来说是正确的,但是将该值作为浮点数会更好。为此,您可以使用函数sp.N()
(N 代表数字):
print(sp.N(sigmoid.subs(x, 2)))
**Output:** 0.880797077977882
照片由 Aziz Acharki 在 Unsplash 上拍摄
6 —您可以使用 SymPy 做的其他事情
与其详细地漫谈更多的话题,不如让我给你一个清单,你可以检查一下来提高你的交响乐技巧:
- 导数和积分: SymPy 可以做你在微积分入门课上学到的大部分事情(除了思考😅).您可以从检查 SymPy 中函数的微分开始。
- 矩阵和线性代数: SymPy 可以处理矩阵,从线性代数开始做基本运算。该语法有点类似于 NumPy 使用的语法,但也有区别。首先,请查看 Sympy 中的预科课程
- 简化: SymPy 足够聪明,可以自动对表达式进行一些简化。然而,如果你想对此有更好的控制,那么看看 SymPy 中的简化。
- 深入探究 SymPy: 在本质上,SymPy 使用一种基于树的结构来跟踪被称为表达式树的表达式。如果你想深入了解 SymPy 的内部工作原理,可以查看一下表达式树。
- 与 NumPy 的关系: NumPy 和 SymPy 都是可以处理数学的库。但是,它们根本不同!NumPy 用数字运算,而 SymPy 用符号表达式。这两种方法都有优点和缺点。幸运的是,有一种聪明的方法可以将 SymPy 表达式“导出”到 NumPy 数组。查看 SymPy 中的 lambdify 函数了解其工作原理。
7 —总结
如果你需要了解更多关于 SymPy 的信息,请查看 SymPy 的文档或我在 SymPy 上的视频系列。
**喜欢我写的?**查看我的博客文章类型提示、Python 中的下划线、 5 个很棒的 NumPy 函数和 5 个字典提示以获得更多 Python 内容。如果你对数据科学、编程或任何介于两者之间的东西感兴趣,那么请随意在 LinkedIn 上加我,并向✋问好
Python 流图快速入门
使用 altair 可视化库
杰夫·塞奇威克的图片来自 Unsplash
什么是流图?
河流图是堆叠面积图的变体,通过使用流动的有机形状来显示不同类别的数据随时间的变化,从而创造出美观的河流/溪流外观。与堆积面积图不同,堆积面积图在固定的直轴上绘制数据,而流图的值在变化的中心基线周围移动。
流图中的每个单独的流形状与其类别的值成比例。颜色既可以用来区分每个类别,也可以通过改变颜色深浅来显示每个类别的附加定量值。
流图非常适合于显示大量数据集,以便发现各种类别随时间变化的趋势和模式。
流图的缺点是类别可能会被大型数据集弄得杂乱无章,使它们难以阅读和理解。
因此,流图应该留给不打算破译或探索数据细节的读者。流图更适合给出更全面的概述。
更多关于流图的阅读,请查看以下链接:
https://www.data-to-viz.com/graph/streamgraph.html#:~:text=A Stream graph is a type of stacked area chart.&text=Contrary to a stacked area,a flowing and organic shape https://en.wikipedia.org/wiki/Streamgraph
用 Python 制作流图
对于这个例子,我们将使用 Altair,它是 python 中的一个图形库。Altair 是一个声明式统计可视化库,基于 Vega 和 Vega-Lite。源代码可以在 GitHub 上获得。
为了开始创建我们的流图,我们需要首先安装 Altair 和 vega_datasets 。
!pip install altair
!pip install vega_datasets
现在,让我们使用牛郎星和织女星数据集创建一个交互式流图来查看多个行业 10 年间的失业数据。
**import** **altair** **as** **alt**
**from** **vega_datasets** **import** data
source = data.unemployment_across_industries.url
alt.Chart(source).mark_area().encode(
alt.X('yearmonth(date):T',
axis=alt.Axis(format='%Y', domain=**False**, tickSize=0)
),
alt.Y('sum(count):Q', stack='center', axis=**None**),
alt.Color('series:N',
scale=alt.Scale(scheme='category20b')
)
).interactive()
使用上面的代码后,您应该能够看到类似这样的内容。
牛郎星流图
这里的流图允许我们快速解释数据中的比例变化。总的来说,我们可以看到 2008 年后所有行业的失业率都在上升。
结论
就是这样!现在前进,创建您自己的流图数据可视化。更多关于流图的资源和教程,请点击下面的链接。
https://www.r-graph-gallery.com/154-basic-interactive-streamgraph-2.html http://bl.ocks.org/mbostock/582915
有关系的
https://medium.com/geekculture/visualizing-human-motion-capture-data-with-d3-js-2acca2a49cff https://medium.com/new-health/visualizing-brain-waves-with-python-24847de94266
感谢您的阅读!!
ggplot2 快速介绍
理解图形的语法将如何帮助你用 ggplot2 构建任何图形
哈桑·阿尔马西在 Unsplash 上的照片
ggplot2 是 R 中广泛使用的图形库,也是 tidyverse 的一部分。tidyverse 是一个 R 包的集合,它们共享一个公共的设计哲学、语法和数据结构。例如,tidyverse 中的其他包是 dplyr 或 purrr。
图形的语法
ggplot2 建立在图形的语法之上。ggplot2 的开发者之一 Hadely Wickham 将语法描述为
“艺术或科学的基本原则或规则”。
因此,图形的语法是一种描述和创造大范围情节的方法。在 ggplot2 中,所有图都是使用图层创建的,其中每个图层都代表图形的一个组成部分。
在 ggplot2 的快速介绍中,您将了解“gg-plot”是如何构造和构建的。我确信一旦你理解了它的基本结构,你就可以在这些基础上构建未来的任何情节。因此,让我们深入研究,看看我们需要哪些层来使用 ggplot2 创建一个基本的绘图。
基础知识
ggplot2 中的每个图形至少使用以下三个组件构建:
- 数据以及数据点如何相互映射
- 一组几何对象也称为几何图形(表示数据点的视觉标记,如条、点或线)
- 一个坐标系
除了基本图层之外,ggplot2 还提供了许多其他图层,通过着色、缩放、分面或向数据添加统计变换来调整绘图。
ggplot2 的基础层。图片作者。
让我们建立我们的第一个情节,以更好地理解上面的解释。为此,我将利用 Kaggle 上的奥运数据集。开始打印前,请确保安装了库“ggplot2”。此外,我将到处使用 dplyr 库进行数据操作。
作为第一个例子,我们绘制了参加奥运会的运动员的身高(数据)的直方图(几何)。该图包括所有必要的组成部分:数据+几何+坐标系。
直方图显示参加奥运会运动员的身高分布。图片作者。
几何对象(geoms)
可用几何图形根据显示的变量的维度和类型而变化。例如,在我们的第一个图中,我们绘制了一个变量(高度),它是连续的。我强烈推荐打开 RStudio 的 ggplot2 备忘单,因为它提供了可用 geoms 的摘要。让我们绘制不同维度和不同类型的变量来了解一下:
左上:图 1 (1 个变量,连续),右上:图 2 (1 个变量,离散),左下:图 3 (2 个变量,都是连续的),右下:图 4 (2 个变量,一个连续,一个离散)。图片作者。
在不同的几何图形旁边,我们可以观察到另一件事:第二个图(1D,离散)显示一个图仍然显示,即使 coord_cartesian() 没有添加到代码中。第三个图(2D,两个都是连续的)显示,如果您想根据需要调整坐标系,则 coord_cartesian() 是强制的。在下文中,我将把我们的四个基本地块称为地块 1、地块 2、地块 3 和地块 4。
添加一些颜色和形状
在上面的例子中,所有的图形看起来都有点暗淡,可以用一些颜色或形状来改善。让我们通过调整美学属性让剧情变得更有趣。
美学属性可以用不同的方式来调整。 aes() 可以传递给 ggplot() 或特定层,如 geom 层。尤其是在处理一维数据时,这会对您的绘图产生影响。
顶行:对基本图 1 的调整。美学属性需要传递给几何层,以获得想要的结果。中间一排(左):调整到基本情节 3。添加了形状和颜色。底行和中间行(右):调整至图 4。图片作者。
在图 1 的调整二中,我们可以看到“绿色”被视为常量变量。这是因为 aes 的前两个参数(x,y…)被期望的变量。处理二维数据时,情况有所不同(参见图 4 的调整一和调整二)。在这里, aes() 可以无影响地传递给 ggplot() 或 geom 层。
统计变换
除了几何层,数据点还可以使用统计层映射到坐标系。此外,您可能需要对绘图数据进行统计转换,而不是使用原始数据(stat="identity ")。然后你可以将几何层的统计参数设置为“计数”或“汇总”。让我们在图中看到统计如何影响你的图表。
左图:用 stat_layer 计算运动员人数创建的图。右图:平均重量用作可变重量的统计转换。图片作者。
第一张图显示了每个奥运城市的运动员数量,按性别分类。与此相比,stat_plot2 使用转换“summary”按性别显示运动员的平均体重。
位置、标题、图例和网格
现在,您已经了解了 ggplot2 的基础知识。然而,额外的图层可以很容易地添加进去,并极大地影响你的绘图质量:标题、图例、位置或网格。使用 labs() 添加图层以调整绘图标题或轴标题,使用 theme() 或 scale_fill_discrete() 添加图例,或使用 facet_grid() 添加网格。
左图:每个奥运城市的性别比例,添加图层以调整标题、图例和条形图。右图:通过添加层来添加网格和标题,按季节显示运动员的身高和体重之间的相关性。
现在你已经有了在 **ggplot2、**中构建一个基本剧情所需的所有工具,在我看来,也有了构建任何更复杂剧情的要求。通过理解《T21》背后的哲学,并将每一次调整视为另一层,你已经成功了一半。密谋愉快!
资源
- https://rpubs.com/aelhabr/tidyverse-basics
- https://www.tandfonline.com/doi/abs/10.1198/jcgs.2009.07098
- https://cfss.uchicago.edu/notes/grammar-of-graphics/
- https://r studio . com/WP-content/uploads/2015/03/gg plot 2-cheat sheet . pdf
责任 AI 或 rAI 快速介绍
来源:starline 创建的背景向量—www.freepik.com
邀请你开始思考为商业开发一个负责任的人工智能的相关性
人工智能(AI)越来越多地支持我们生活、社会和业务中的关键决策。人工智能和其他决策技术的区别在于它“学习”。
随着人工智能更加深入我们的生活,它将继续变得更加自主,甚至可以在没有人类监督的情况下行动。
人工智能的实施需要精心管理,以避免对品牌和员工、个人以及整个社会的声誉造成无意但重大的损害。
在这种情况下,负责任的 AI 或 rAI 确保这些决策是安全、可靠、经过验证的,并以的方式进行解释。
负责任的人工智能是组织必须达到的基本标准,因为几乎普遍地,人工智能模型可以对某人的生活质量产生巨大影响。
rAI 开发的标准旨在使组织能够理解并执行四个既定的管理原则:、问责、透明,以及最后的责任**。**
探索负责任的人工智能的关键方面
一个很好的切入点是提出这样一个问题,即组织是否能够在智胜竞争的同时发现如何整合他们的文化和社会价值观,企业被推动快速前进,甚至比他们应该的速度更快,这种速度是有代价的?
当一个公司犯了一个错误,机器就会被追究责任。人工智能的一些领域将永远比其他领域更与我们的社会相关。
此外,公司需要展示人工智能是如何做出具体决定的,特别是在涉及金融服务和保险等高度监管的行业时。他们需要积极主动地证明他们的算法,清楚地传达他们的(学习)偏见政策,并对为什么做出决定提供清楚的解释,特别是当有问题时。
这里的建议很简单:对于受监管/高风险的用例,如信贷审批,始终考虑使用透明和可解释的算法,以使一线员工更容易理解和解释客户的决定。
为什么需要有一个负责任的人工智能?
负责任的人工智能是组织必须满足的关键标准,因为几乎普遍地,人工智能模型可以对某人的生活质量产生巨大影响。
人工智能模型的性能不应该是学术数据科学研究的主要焦点;这些模型必须首先是可解释的,其次是可预测的,并内置于负责任的人工智能标准中。
否则,模型会很快变得非常复杂,无法解释。
为了在高度自动化但意识越来越强的世界中取得成功,公司需要了解人工智能带来的挑战和潜在风险,并确保其在组织中的使用符合道德规范,符合监管要求,并得到良好治理的支持。
从治理的角度来看,道德人工智能意味着检查模型并识别其隐藏的偏见。
严格的开发过程,加上潜在资源的可见性,有助于确保分析模型符合伦理。必须持续监控潜在特征,以了解变化环境中的趋势。
这是“首次构建正确”的委婉说法。操作环境模型必须从一开始就设计好。构建高效模型的最佳方法是走上面描述的路线。这极大地降低了模型中的错误风险,从而降低了预期的业务价值,同时在分析过程中影响了客户。
负责任发展的框架。
一些重要的人工智能公司,如微软、IBM,以及许多咨询公司,如 Gartner、McKinsey 和其他公司,都在致力于定义和实现支持 rAI 实现的框架。
在我看来,一种有趣的方法是由普华永道在其“负责任的人工智能实用指南”报告中定义的,该报告由一套人工智能责任工具组成,旨在帮助公司专注于负责任的人工智能项目、开发和部署中需要解决的五个关键维度。
它们包括治理、道德、监管;解释和说明;稳健性和安全性;公正和正义。
该框架为技术决策制定、识别、结合环境和减轻道德风险提供了一个合理的个性化方法。
该工具包支持整个组织的人工智能评估和开发,使公司能够开发高质量、透明、道德、可解释和信任激励的应用程序。
负责任的人工智能路线图面临的挑战
在所有组织中实现负责任的人工智能标准的最大障碍是大多数董事会和首席执行官对分析及其对业务的影响(包括人工智能可能造成的损害)没有足够的理解。
此外,随着人工智能在所有部门的使用越来越多,政府监管即使不是不可避免的,也是非常可能的。董事会、高管和数据科学家不应该将监管视为惩罚或抑制创新,而是必须接受负责任的人工智能是一项有益和必要的要求。
结论
也有大量关于种族主义、性别歧视和侵犯与人工智能相关的隐私的新闻,因此,可以理解的是,领导者们担心确保在他们的业务中引入人工智能系统不会产生负面影响。
几乎可以肯定的是,最好的选择是不要完全停止使用人工智能——它的价值可能太大了,尽早使用人工智能可能对企业有利。
公司应该做的是确保负责任地开发和实施人工智能,注意确认实施结果是相同的,新的定制级别不会导致歧视,数据的获取和使用不会损害用户的隐私,以及他们的组织在人工智能系统的性能和解释模型如何工作的能力之间找到平衡。
公正、开放、同情和稳健必须是所有企业负责任的人工智能政策的四个关键支柱。
虽然组织不能慢下来,但需要团结在一套尊重客户的基本原则和可持续(可能有利可图)的长期成功愿景周围。
这将有助于在我们的社会中建立一个更加公平的人工智能环境。
还有一件事…
如果你想在学习之旅中走得更远,我为你准备了一份令人惊叹的清单,其中包含 60 多门关于人工智能、机器学习、深度学习和数据科学的培训课程,你现在就可以免费参加:
- 什么是预测分析,你今天如何使用它?
- 今天学习 AI、ML、数据科学的最佳免费课程。
- 60 多门课程,有评分,有总结(当然是 AI 做的)。
- 是我们所知的作品的终结吗?世界经济论坛《2020 年的就业前景》报告简析
如果你想继续发现新的资源并了解人工智能,在我的电子书(下方的链接)中,我正在分享关于人工智能、机器学习、深度学习、数据科学、商业智能、分析和其他方面的最佳文章、网站和免费在线培训课程,以帮助你开始学习和发展职业生涯。
此外,我刚刚在亚马逊上发布了其他有趣的电子书,我相信其中一些可能会让你感兴趣……让我们保持联系,关注我,让我们一起做吧。
- 人工智能、机器人技术和编码(给父母):模拟父母与数字孩子实用指南
- 终结者悖论:神经科学如何帮助我们理解移情和对人工智能的恐惧
- 人工智能从 A 到 Z:揭秘 AI 的本质概念
- 2020 年人工智能:写人工智能的一年
订阅我的每周时事通讯,保持更新
如果你对人工智能、机器学习、数据科学和自动驾驶汽车的话题感兴趣,以及这些创新将如何扰乱世界各地的每一个企业,这份时事通讯肯定会让你保持更新。
点击下面的链接订阅人工智能新闻!
在哪里可以了解更多关于媒体上负责任的人工智能的信息
**https://medium.com/@ronbodkin/responsible-ai-f33ab5e6672c https://medium.com/swlh/responsible-ai-how-we-do-we-build-systems-that-dont-discriminate-2592c896fb89 https://medium.com/@ODSC/responsible-ai-2020-expectations-for-the-year-ahead-d15eb8598b6f https://medium.com/ai-ml-at-symantec/responsible-ai-ml-privacy-bias-and-more-in-the-age-of-the-algorithm-36cb5ef68d9a
参考
- 负责任的 Ai-FICO。https://www.fico.com/blogs/what-responsible-ai
- 负责任的人工智能(AI)实用指南——https://www . PwC . com/GX/en/issues/data-and-analytics/Artificial-Intelligence/what-is-Responsible-AI/Responsible-AI-practical-guide . pdf
- 负责任的人工智能在我们快节奏的世界中的重要性…https://TB tech . co/the-importance-of-responsible-ai-in-our-fast-paced-world/
- https://towards data science . com/an-introduction-to-explable-artificial-intelligence-or-xai-f 7 EC 21 db 825 bf
你愿意支持我吗?
为了获得无限的故事,你也可以考虑 注册 成为中等会员,只需 5 美元。此外,如果您使用我的链接注册 ,我会收到一小笔佣金(无需额外费用)。
https://jairribeiro.medium.com/membership **
关于图及其下游任务的公式的快速注释
一些重要的任务包括:节点分类、链接预测、社区检测、图分类和三重分类
Robynne Hu 在 Unsplash 上的照片
G raph 数据结构已经被证明可以有效地捕获复杂的非欧几里得数据,如生物和社交网络(欧几里得数据是图像、文本或简单的数字数据)。
我们成功地使用图形作为输入来建立预测模型,并且将各种深度学习技术应用于图形,在某些情况下,增强了图形机器学习模型的性能。
那么,我们可以使用图形预测什么,以及如何从如此复杂的数据结构中构建预测模型呢?
在这篇文章中,我将解释一些与图相关的任务的公式,这些任务也称为图下游任务。这些任务的公式化通常发生在我们学习了图形实体的数字表示之后。
图及其不同类型
照片由 Alina Grubnyak 在 Unsplash 上拍摄
我们使用图形来模拟现实生活中的交互或网络,根据上下文,我们可以使用不同类型的图形结构,例如:
- 无向图:就像一个朋友的社交网络,节点代表个人,边代表他们的友谊。在这里,边没有定向的性质。
- 有向图:这里,我们观察边的有向性质。例如,Instagram 追随者的网络,其中节点是个人账户,边是追随者。比如,我追随埃隆·马斯克,但埃隆并没有追随我。这将向作为关系方向的边添加一个属性。
- 单关系图:这里所有的节点和边都代表一种属性,可以是友谊、互动等,本质上可以是有向的,也可以是无向的。
- 多关系图:这里,节点和边可以有不同的属性,一个简单的例子是代表不同类型朋友的社交网络,比如学校朋友、大学朋友等。知识图(目前非常流行)是多关系图的一个很好的例子。
注意:这不是一个详尽的列表。
通常,在图形机器学习中,第一步是使用一组称为低维嵌入或简单的图形实体的数字表示的数字来捕获网络信息。
现在,让我们来谈谈图下游的任务。
节点分类
图中的节点可以被标记,对于大型图来说,丢失一些标记是常有的事。节点分类被公式化为二元分类任务(在 2 种不同类型标签的情况下)或多类分类任务(> 2 个标签)。
这里,预测机器学习模型的输入特征是节点嵌入或简单的数字表示,例如像节点度、图着色数等图属性。
对于这个分类任务,您可以使用标准的机器学习算法或神经网络方法,如图形神经网络。
链接预测
这是图机器学习的重要任务之一。链接预测的任务是预测图中缺失的边或链接,以及预测预期的边(在动态图的情况下,边基于图的时间点消失和形成)。
在像蛋白质-蛋白质相互作用这样的生物网络背景下,使用标准的实验室实验,很难识别所有可能的蛋白质-蛋白质相互作用。因此,链接预测在这个领域变得至关重要。
根据图形的类型,链路预测可以用不同的方式表示:
- 作为二分类任务:对于二分类,我们需要两个标签,比如正标签和负标签。我们采用图中存在的边来创建正标签的实例,并且我们可以随机采样一些负边来创建负标签的实例。由于边由两个实体(两个节点)组成,我们对节点嵌入(对应于边)进行逐元素乘法,以获得每个实例(正或负)的一个特征向量。现在,这些特征和标签被用来建立预测模型。图形神经网络可用于解决作为二进制分类问题的链路预测问题。
- 计分基础法:思路很简单。我们使用评分函数来学习嵌入,使得我们在具有边缘的情况下得分较高,而在边缘不存在的情况下得分较低。给定分数的阈值,我们可以识别两个给定节点之间的预期边的可能性。在知识图链接预测的情况下,通常采用基于等级的评估方法。此外,知识图中的三元组可以被建模为头部预测(?,r,t)和尾部预测(h,r,)模特。这完全取决于使用链路预测任务构建的用例。
社区检测/图形聚类
这是一个无监督的聚类任务,目标是找到一组重要的具有相似属性的实体。有几种算法可以找到聚类,我们也可以使用机器学习技术来达到这个目的。
在生物蛋白质-蛋白质网络中,这种聚类也被称为复杂检测。我们确定了蛋白质复合物,它是一种重要的生物机器。
图形分类
给定一个较大的图,它可以包含属于某一类的一些较小的图簇。图分类是旨在预测较大图中较小集群/社区的标签或类别的任务。
这类任务的一个示例数据集是一组图表,如来自多特蒙德大学的蛋白质数据集。数据集中的每张图都有一个标签,标明它是酶还是非酶。总共有 1113 个图,每个图平均有 39 个节点和 73 条边。由于我们有 2 个标签,这是一个二元分类的任务。
三重分类
知识图中的实体被视为三元组。三重分类归结为二元分类任务,其中有两个标签,即阳性和阴性。正三元组是知识图的一部分,负三元组不是知识图的一部分。
一般来说,学习图形实体的高质量嵌入对于图形机器学习是必要的,显然,对于三分类任务也是如此。我们生成的嵌入应该能够获得比负三元组更高的正三元组分数。我们随后定义了一个阈值来区分正三元组和负三元组。
随着知识图不断增长,越来越多的三元组被添加到其中,可能存在质量差的数据被注入到数据库中的问题。不属于知识图的损坏的三元组可能被注入到知识图中,并且识别这种质量差的数据的一种方式是通过使用三元组分类。
图下游任务的使用更多地依赖于领域和为解决相应的领域问题而构建的用例。请记住,图是对复杂的现实生活场景进行建模的优秀工具,这些场景可能与空间、生物、电信、娱乐业(电影、歌曲推荐)等领域相关,每个领域都可能有数百个问题,并且可能使用图机器学习来解决这些问题。
如果你看到了这篇文章的这一部分,感谢你的阅读和关注。我希望你觉得这篇文章内容丰富,并且可以通过 LinkedIn 、 Twitter 或 GitHub 联系到我。
NVIDIA Jarvis 快速概述——对话式人工智能的端到端框架
NVIDIA Jarvis 框架简化了训练和部署对话式 AI 系统的过程,使构建具有自动语音识别、文本到语音转换和自然语言理解功能的应用程序变得更加容易
劳拉·穆西康斯基摄于佩克斯
介绍
在过去的几年里,人工智能技术的能力迅速提高。特别是自然语言处理(NLP ),由于 Transformer 体系结构及其衍生产品,已经取得了令人难以置信的进步。当前最先进的系统能够接近人类水平(或者在某些情况下超过人类水平!)在语言生成、文本分类、问答等多项语言任务中的表现。
类似地,当前的语音合成(文本到语音/TTS)模型可以生成与人类语音几乎没有区别的语音。另一方面,自动语音识别(ASR)通常在理解人类语音方面相当成功,即使考虑到嘈杂的背景和不同口音的说话者。可悲的是,我的手机仍然很难识别斯里兰卡的名字,但我真的不能责怪我的手机!然而,当我问路时,我可以相信它能认出我要去的地方的名字(是的,甚至在斯里兰卡!).
总的来说,组成对话式人工智能的不同组件(ASR、语言理解、语言生成和 TTS)已经发展到了这样一个阶段,即该技术不仅是可行的;这几乎是必须的。这可能是千禧一代的我在问,但我真的必须和某人交谈才能预约吗?🙄
特别是由于全球疫情,人类接触受到限制,更多自动化和更少繁琐任务的时机肯定已经成熟!
尽管这些技术取得了进步,但是在将它们用于现实世界时,仍然存在巨大的障碍。例如,训练深度学习模型,这是大多数对话式人工智能技术的基础,需要大量的计算和数据资源。虽然深度学习模型能够做出令人印象深刻的壮举,但构建和训练实现这种潜力的模型通常需要大量的技术专业知识。除此之外,即使您已经训练了您的模型,将它们投入生产并维护它们是另一个挑战,通常需要完全不同的技术专长。
NVIDIA Jarvis Framework 旨在解决所有这些问题,并作为构建对话式人工智能系统的端到端工具包。它为各种任务提供预训练模型,重新训练/微调这些模型的能力(转移学习工具包和/或尼莫),以及(自动)优化模型的轻松部署。
迁移学习,或在新任务/领域上微调预训练模型的能力,是深度学习模型(如 BERT)如此成功的重要原因。迁移学习工具包提供了一种方法,使用这种技术来为您的任务或领域调整预先训练的模型,并生成一个可以使用 Jarvis 直接部署的模型。令人印象深刻的是,您可以通过简单地编辑几个配置文件来完成所有这些,而无需编写任何实际的代码。对于那些想要开始使用对话式人工智能,但之前很少或没有训练和部署深度学习模型的经验的人来说,这应该特别有用。
我目前正在编写一份指南,使用 TLT 来微调一种新语言的 ASR 模型!ASR 对我来说是一个相对较新的领域,到目前为止这个过程如此顺利给我留下了深刻的印象。
接下来,让我们看看 Jarvis 框架支持的不同服务和任务。
贾维斯服务公司
Jarvis 目前支持的服务分为三类:
- 语音识别— Jasper,Quartznet
- 语音合成— TacoTron2,Waveglow
- 自然语言理解—威震天,伯特
NLU 服务包括几个高级和低级 API。
高层
- 命名实体识别
- 意图分类—域分类器和意图/槽标记器(对查询的意图进行分类,并检测意图的相关实体和槽)
- 问题回答
- 标点符号和大写
低级的
- 文本分类
- 令牌分类
所有这些服务都可以通过执行快速入门指南中给出的几个命令来轻松部署。最棒的是,服务是通过 Docker 部署的,所以你真正需要安装的只是 Docker(支持 NVIDIA GPUs)。
您不一定需要部署所有可用的服务。如果您只需要特定的服务并保持较小的资源占用,您可以选择想要部署的服务。
一旦部署完成,您就可以使用提供的 API(gRPC、Python 或命令行)与这些服务进行交互。这使得根据需要构建集成各种 Jarvis 服务的应用程序变得非常容易。
接下来呢?
默认情况下,Jarvis 使用预先训练好的模型,这意味着这些服务将开箱即用地适用于许多不同的用例。例如,您可以通过使用语音识别服务轻松构建一个基于语音的问题回答系统,以获取用户的查询(可能还有在其中寻找答案的文档的名称),使用问题回答服务提取答案,并使用语音合成服务大声读出答案。
虽然预先训练的模型很可能适用于一般情况,但您可以根据感兴趣领域的数据对模型进行微调,以获得最佳性能。例如,如果问答模型预期用于法律案例文件、医疗保健中的患者记录或学术界的研究论文,则可以通过使用相关领域的数据对模型进行微调来获得更好的性能。使用迁移学习工具包框架可以很容易地对模型进行微调,它可以生成一个与 Jarvis 兼容的模型,以便于部署。
总的来说,Jarvis 为您提供了很大的灵活性来更新/微调预训练的模型,以便在定制域上执行得更好,并且仍然能够使用相同的一致管道轻松地部署微调的模型。用于与不同服务交互的 API 也是一致且易于使用的,这使得将 Jarvis 集成到您自己的应用程序中的过程非常简单。
包扎
Jarvis 框架使得为对话式人工智能的各个方面部署最先进的模型成为可能,而不必担心设置不同框架和服务以及让它们相互配合的(通常令人沮丧的)细节。您还可以根据需要自由地微调这些模型,并轻松地将更新的模型部署为 Jarvis 服务。
不同的 Jarvis 服务可以通过 API 单独访问,这使得构建具有高质量 ASR、NLU 和 TTS 功能的定制应用程序变得简单。
总而言之,Jarvis 框架支持对话式 AI 系统的整个生命周期,从训练/微调模型到将它们部署为优化的、生产就绪的服务。这对于那些不太熟悉人工智能和深度学习,但对将对话式人工智能元素融入他们的应用程序感兴趣的应用程序开发人员来说尤其有用。另一方面,熟悉 AI 的研究人员不一定想处理部署他们的模型的后勤工作,他们肯定会欣赏 Jarvis 模型和服务的简单部署过程。
阿帕奇气流快速入门
Airflow 是一个用于创作、调度和监控工作流的平台。它本质上是一个运行在元数据数据库上的排队系统和一个运行任务的调度程序。工作流被写成有向无环图(Dag)。工作流和 DAG 可以互换。
什么是 Dag?
DAG 是您要运行的任务的集合,其组织方式说明了任务之间的依赖关系和关系。
下图显示了 DAG 是一个单向的非循环图,其中图中的每个节点都是一个任务,边定义了任务之间的依赖关系。在任何情况下,您都不应该能够从前向节点返回到已经执行的节点。
显示节点间非循环关系的图表。除非另有说明,所有图片均由作者提供。
DAG 可以被分解成越来越小的作业,并通过生成用代码编写的动态管道来赋予用户完全的控制权。气流 Dag 也是可扩展的和可伸缩的。Dag 功能强大,因为它们允许协作、可管理和可测试的工作流。额外的好处是 Airflow 是用 python 开发的,可以与任何 python API 接口。
并行运行的气流任务
上图显示了气流如何将任务分成分支,这样,如果一个分支失败,另一个分支仍有输出。此外,随着并行计算的出现,处理时间也减少了。由于每项任务都是独立的,因此失败的可能性总体上会降低。
任务是如何执行的?
- 操作符代表工作流中的单个任务,有助于执行您的任务(例如运行 python 函数)。
- 操作员决定当您的 dag 运行时实际要做什么。
- 任务在实例化时是一个操作符。这是工人努力的方向。
气流架构:
上图展示了气流工作流程的一般架构。
- 元数据 —是一个关系数据库,包含任务状态信息,例如消耗内存最多的前十个任务,它包含与当前运行的任务相关的所有数据以及历史数据。
- 调度器 —决定运行哪个任务、何时运行以及以什么顺序运行。
- Web 服务器 —本质上是一个与元数据对话的 flask 应用程序的 UI。
- 执行者 —在地面执行任务。执行器是一个消息队列进程,它计算出哪个工人将执行哪个任务。默认的是顺序执行器——它不能并行运行任务——这意味着它不能用于生产级代码。也可以使用本地执行器,它将运行任务,直到服务器上的所有资源都达到最大容量。这对于中等数量的 Dag 来说很好。这两者都用于单节点群集中,因此不能用于扩展。
- 多节点集群 —具有相同的组件,只有调度程序和 web 服务器放在同一个节点(主节点)中,工作程序放在单独的实例中。这种设置工作得很好,因为它允许通过添加更多的多节点集群来进行扩展(celery 是 python 这里选择的执行器)。
如果您不处理万亿字节的数据,那么最好将调度器、web 服务器和执行器一起放在主节点/集群中。缺点是这种单一集群方法在同一台机器上运行所有内容,因此如果您对 DAG/scheduler 进行了更改,那么您需要重新启动整个工作流,甚至是正在执行的任务。芹菜避免了这一点。
分布式气流架构
如果您确实用 celery 构建了一个分布式工作流,那么就需要一个排队系统组件(比如 Redis)。对于本地工作流,排队由系统处理。
任务的生命周期
- 排定程序会定期检查 DAG 文件夹,查看是否有任何需要运行的 DAGS。
- 如果发现任何 DAGS 等待执行,调度器为其创建图表,这是 DAG 的实时实例化。
- 调度程序将在元数据中将 DAG 状态更新为正在运行,任务将会执行。
- 然后,调度程序读取 DAG,并将任务按执行顺序以消息的形式放入排队系统。每个消息都包含像 DAG ID、任务 ID 和要执行的功能这样的信息。
- 此时,这些任务的状态会更改为“排队”。
- 然后,执行器开始执行任务,并向元数据发送任务的失败/成功消息。
- 当所有任务运行成功或失败时,调度程序最终更新图表的状态。
对创造性人工智能的一些伦理含义的快速思考
尼克·莫里森在 Unsplash 上拍摄的照片
人工智能正越来越多地应用于更具创造性的领域,引发了人们对知识产权保护的担忧。
免责声明:我不是律师,因此,这篇文章不应被用作法律建议,所以把它作为一个新兴技术和市场变化的经验丰富的观察者的个人意见。
最近,我开始分析一种趋势,这种趋势将人工智能带向一个更具“创造性”的空间,与人类的创造力相结合。
随着人工智能内容生成能力的提高,它开始更经常地应用于更多样化的领域,引发了人们对其内容如何作为知识产权受到保护的担忧。
让我们考虑一下所有依靠知识产权来创造和获取价值的行业和部门。这一系列包括软件、电子产品、消费品、药品、医疗设备、视频游戏、电影和电视、新闻和新闻媒体以及音乐。
这些行业的市场价值和单个参与者的利润与知识产权保护密切相关。
随着人工智能的贡献越来越大,而人类对所产生的价值的贡献越来越小,我们可以预计很快就会看到围绕知识产权是否受到保护的更明显的模糊性。
短期来看,政策环境似乎不会有太大变化。目前的趋势似乎是重申人类作为发明者和作者以及专利和版权办公室在保护人类创造力免受人工智能生成内容影响方面的作用。
照片由 Sam Moqadam 在 Unsplash 拍摄
人工智能辅助的内容与人工智能生成的内容
在人工智能辅助的努力中,人类正在做出创造性的贡献——通常是当前的艺术状态——人工智能将被视为一种工具,不需要被列为共同发明人,而那些团队成员将被列为发明人和作者。
但一个重要的问题不是人工智能能否成为生产者,而是人工智能的产出能否获得版权。
增强特定技能的人工智能通常不会有显著的不同。然而,当我们有更多的人工智能能力成为相关学术或企业角色的https://en.wikipedia.org/wiki/inventor或 作者 时,专利将会增加。希望人工智能辅助的和人工智能生成的输出之间有所区别。
如果我们开始想象特定人工智能生成的工作场景——人工智能在没有任何人类干预的情况下找到数据,训练自己,并“创造”特定的输出——我们可以想象它会如何对现有的知识产权规则施加压力。
在人工智能创造发明的情况下,我们将看到人类作为中间人,对发明创造提出可疑的主张,并在知识产权保护有效性的更大不确定性状态下运作。
我们会遇到一些奇怪的情况,人工智能的产出将大大超过人类能够创造的东西——不仅仅是像“额头的汗水这样的作品,而是真正的莎士比亚级别的小说——但在最严格的法律解释下,不值得知识产权保护。
这里提出了一个伦理困境…谁拥有权利和责任,例如,如果我们有一个仍在运行并自主产生发明的人工智能,但开发该人工智能的所有原始团队成员都死了?
在这种情况下,编辑或团队的公司将仍然拥有人工智能。尽管如此,其雇员在专利申请中对专利权的任何主张都是牵强附会的,不是吗?
还有一个问题是,如果没有杰出的人或公司控制这样的人工智能,谁来为自主人工智能从事有问题的行为承担责任,例如专利侵权。
在回答谁将被视为对人工智能系统编写的信息负责时,圣巴勃罗 CEU 大学传播学院教授、Idoia Ana Salazar garcía 确认经理将负责媒体事务。最终,这台机器会像另一名雇员一样,给记者提供报道角度的建议。
这就是为什么我们必须教育媒体经理和编辑,让他们知道算法的决定如何能够产生重大的社会影响。
当然,版权和专利是不同的情况。目前,美国只为人类创作的作品注册版权(即使考虑 AI 辅助)。与此同时,英国、印度、新西兰、南非和香港等其他国家已经建立了保护计算机生成作品的框架和先例,但作者仍需是人类。然而,著作权被分配给安排创作作品的人。
但是谁来保护 AI 的权利呢?
人工智能本身如何受到保护与它的输出如何受到保护是一个不同的问题。
人工智能的某些方面可以通过专利和版权得到保护。有些元素——比如数据集和算法——非常适合作为商业秘密。
随着人工智能变得越来越有价值,我们将看到窃取敏感人工智能技术的企图显著增加。反过来,人工智能公司将需要用网络安全解决方案和程序来捍卫它们皇冠上的宝石。
还有一个问题是,人工智能是否可以在音乐等受保护的内容上接受训练,这在法律中还没有完全解决。
虽然版权所有者通常持有衍生作品的权利,但如果经过训练的算法没有降低原创作品的价值,并且经过训练的人工智能的材料很少,那么使用受保护的数据来训练算法可能属于合理使用。
相比之下,如果人工智能出于比较的目的保留受保护材料的数据库(例如,用于监控的面部识别),这可能是不道德的使用,正如美国知识产权所有者协会(IPO)在 2020 年确认的那样。
一些国家正在探索在人工智能培训中使用版权材料的明确豁免——日本已经更新了法律。
结论
这个领域的可能性是无穷无尽的,而我们只是处在这场创造性革命的开端。
目前,没有任何即将出台的政策来抑制或影响人工智能著作权或专利局,只要它们符合当前法规设定的准则。
这意味着,在完全由人工智能产生的发明中,我们将在一个更大的不确定性状态下运作,在很长一段时间内,知识产权保护的有效性仍然是一个开放的问题:
谁拥有人工智能产生的发明的权利和责任?
还有一件事…
如果你想阅读更多关于创造性人工智能以及如何开始学习它的内容,你可能也想阅读以下文章:
****https://medium.com/towards-artificial-intelligence/an-overview-of-creative-ai-3fb2e6d2706b https://medium.com/towards-artificial-intelligence/a-simple-approach-to-define-human-and-artificial-intelligence-4d91087d16ff https://medium.com/dataseries/my-favorite-free-or-free-to-audit-courses-to-learn-ai-ml-and-data-science-f15f614a84e5
此外,我刚刚在亚马逊 上出版了一本新的电子书 ,今年我已经在着手出版一些其他的了……让我们保持联系,一起努力吧。
https://www.amazon.com/Jair-Ribeiro/e/B08RW788MS
参考
- 人工智能在数据新闻中的应用:什么是伦理…https://science media hub . eu/2019/10/08/the-use-of-ai-in-data-journalism-what-is-the-ethical-implications/
- 开发人员人工智能伦理指南。https://www . emerald . com/insight/content/doi/10.1108/JICES-12-2019-0138/full/html
- 探索最终用户许可协议。https://alexjohnlucas.com/type/eula
- 创造性人工智能概述—https://medium . com/forward-artificial-intelligence/an-Overview-of-Creative-AI-3 fb2 e6d 2706 b
- 人工智能,伦理和版权。https://hughstephensblog . net/2020/03/16/ai-ethics-and-copyright/
- 人工智能|塑造欧洲的数字未来。https://EC . Europa . eu/digital-single-market/en/artificial-intelligence
- 邪教委员会研究-人工…https://www . europal . Europa . eu/RegData/etudes/BRIE/2020/629220/IPOL _ BRI(2020)629220 _ en . pdf****
关于如何将您的 Streamlit 应用程序部署到 Heroku 的快速教程。
关于如何在 Heroku 上托管您的 Streamlit 应用程序的终极指南。
凯文·Ku 在 Unsplash 上的照片
欢迎学习如何将您的 Streamlit 应用程序部署到 Heroku 的分步教程。在过去的两周里,我一直在使用 Streamlit,它的功能给我留下了深刻的印象。它非常适合与全世界分享您的数据科学项目,因为它非常简单。在本教程中,我假设您已经完成了您的应用程序,并且处于部署项目的最后阶段。根据我过去两周的经验,您会认为您可以使用 Streamlit Sharing 立即部署您的项目。但是,您需要申请该功能,他们可能需要几天时间向您发送邀请。更糟糕的是,我甚至听说过这样的故事,人们等了一个星期才收到邀请,以利用 Streamlit 共享。如果你不能等待,你可以将你的应用程序部署到 Heroku 或其他主机上。在本指南中,我将只介绍如何将你的应用程序部署到 Heroku 和上。注意,如果你想将它托管在 AWS 或其他地方,下面的步骤将不起作用。
步骤 1:在本地运行您的 Streamlit 应用程序
第一步是确保您有一个 python 文件。如果您正在使用 Jupyter 笔记本,请确保将您的文件下载为. py 文件。如果你想用 Streamlit 在本地运行你的代码,然后把它推送到 Heroku,这是必要的。我已经创建了一个样本 Streamlit 应用程序,所以我们可以跟着这里。我的 python 脚本的名称是 app.py。要在本地运行代码,请使用命令行界面(CLI)转到保存脚本的目录。进入目录后,运行以下命令。
streamlit run app.py
你的浏览器会自动打开一个窗口,如下图所示。
作者图片
瞧,您已经在本地机器上运行了您的 Streamlit 应用程序。
步骤 2:创建 GitHub 存储库
下一步是为你的应用程序创建一个 GitHub repo。登录您的 GitHub 帐户,按照以下步骤操作:
作者图片
键入您的存储库名称,然后单击“创建存储库”
作者图片
现在,您已经创建了回购,是时候进行第一次提交并推动回购了。在您的终端中,移动到 app.py 所在的目录,并复制粘贴以下代码。
echo "# streamlit-to-heroku-tutorial" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/your_username/your_repo_name.git
git push -u origin master
我在上面的代码中初始化我的目录,添加一个 README.md 文件,一个带有你在上面看到的 URL 的远程源,并进行我的第一次推送。
步骤 3:创建 requirements.txt、setup.sh 和 Procfile。
下一步是至关重要的,你要确保你没有任何错别字或任何错误。否则,Heroku 将在您部署应用程序时运行错误。在继续之前,请确保您的目录中有 app.py 和 README.md 文件。
requirements.txt :创建一个 requirements.txt 文件(没有大写字母!)并将所有库添加到您在 python 脚本中使用的文件中。在我的 app.py 示例中,我只是导入了以下库:
import streamlit as st
因此,我在 requirements.txt 文件中添加了“ streamlit ”。Heroku 需要这个文件来知道它需要哪些库来运行您的应用程序。
setup.sh :下一个文件是 setup.sh 文件。这是一个 shell 文件,您需要在文件中添加以下 shell 命令。将下面的代码复制粘贴到文件中:
mkdir -p ~/.streamlit/echo "\
[server]\n\
headless = true\n\
port = $PORT\n\
enableCORS = false\n\
\n\
" > ~/.streamlit/config.toml
如果不添加此文件,当您将应用程序部署到 Heroku 时,将会收到一条错误消息。因此,请确保您创建这个应用程序,并按照我上面写的那样命名。没有大写字母!
Procfile :在您的目录中,创建一个文本文件,并将其命名为“Procfile”在该文件中,复制粘贴以下代码:
web: sh setup.sh && streamlit run app.py
“web”意味着它是一个 web 应用程序。一旦你在 Heroku 上运行这个应用程序,Procfile 就能很好地指定命令。我们指定上面创建的 shell 文件,然后调用 Streamlit 来运行 app.py。
一旦你创建了上面的文件,回顾这些步骤,确保你按照我上面的命名来命名这些文件。不用说,如果你的应用程序有更多的库,你需要在 requirements.txt 文件中列出它们。您要导入的任何库都需要在该文件中。
第三步:连接到 Heroku
一旦你创建了所有需要的文件,现在是时候设置你的应用程序,以便它可以与 Heroku 交互。
你要做的第一件事是确保你已经在你的机器上安装了 Heroku 并创建了一个免费帐户。请参见下面的链接创建一个帐户。
根据文档,Heroku CLI 需要 Git。因此,如果你没有 Heroku,点击下面的链接,你可以安装它。
https://devcenter.heroku.com/articles/heroku-cli
当您在机器上安装了 Heroku 并创建了一个帐户后,就该从终端登录您的 Heroku 帐户了。在您的终端中运行以下命令:
heroku login
终端返回以下行:
’ ’ heroku:按任意键打开浏览器登录或按 q 退出:‘’
只需点击任意键,你的浏览器就会自动打开。您应该看到以下内容:
作者图片
接下来,单击登录并输入您的凭据。之后,您将看到以下内容:
作者图片
如上图所说,你可以关闭窗口,返回 CLI。下一步是创建 Heroku 应用程序。键入以下命令:
heroku create sample_app22a
在这里,我正在创建一个名为“sample_app22a”的应用程序。如果不指定名称,它将创建一个随机编号的应用程序。因此,我建议为你的应用程序选择一个名字。最后一步是将我们的文件推送到 Heroku。由于 Heroku 使用的是 git,所以命令行会很容易理解。键入以下内容:
git push heroku master
一旦你执行了上面的命令,Heroku 需要几秒钟来安装所有的库并设置你的应用。您将在输出中看到一个 URL,这将是您的应用程序的 URL。请见下文,以供参考。
作者图片
我们没有收到错误消息,现在是时候检查应用程序了。点击下面的链接,你可以在 Heroku 上看到我们的 Streamlit 应用。
好了,伙计们。现在你的应用程序开始工作了,你想把你的改变也推送到你的回购中。
git add -A
git commit -m "Type in a message"
git push
最终意见:
我建议等到收到 Streamlit 共享邀请,这样你就可以利用那个特性,而不是把它部署到 Heroku。我自己创建了一个应用程序,我将在接下来的几天里写一写。当使用 Heroku 的时候,渲染时间对于一些情节来说会稍微长一点。然而,如果你没有时间并且需要尽快部署,Heroku 也会完成这项工作。
希望本文能让您更好地理解如何将您的 Streamlit 应用程序部署到 Heroku。如果你对这个话题有任何问题或有任何反馈,请告诉我。如果你喜欢这篇文章,如果你能在任何社交媒体平台上分享它,我将非常感激。我将在下一篇文章中向您介绍我用 Streamlit 创建的 Covid19-Dashboard web 应用程序及其共享功能。敬请关注!直到下一个 time️ ✌️
用 Python 构建应用程序的快速方法
编程;编排
用几行代码构建 MVP
HalGatewood.com在 Unsplash 上拍照
构建具有图形用户界面并执行复杂任务的 Python 应用程序可能看起来很困难。在最近发表的一篇文章中(见下面的链接),我提到了开始构建应用程序只需要 7 个 Python 库。
本文将用几行代码向您展示如何构建一个简单的翻译应用程序。我只使用两个 Python 库:requests 和 ipywidgets。
基础
我选择编写一个翻译器应用程序作为示例,向您展示用 Python 构建应用程序是多么容易。这个应用程序获得一个英语文本,并显示其西班牙语翻译。非常简单明了。
为此,我们需要应用程序中的两个部分。第一部分是执行翻译的后端,第二部分是与用户交互的前端或图形用户界面(GUI )(获取输入文本并显示输出文本)。
对于后端,我使用 Azure 翻译 API。如果你不熟悉 API(应用编程接口)的概念,我试着用一种毫不费力的方式来解释。API 是一种向服务提供商(通常是服务器)请求服务(例如翻译)的方式(即协议)。例如,您可以使用 Google Maps API 来获取两个位置之间的行驶距离。想象一下,如果 Google Maps API 不存在,那么您应该编写自己的代码来计算基于道路数据库的行驶距离。简单地说,API 阻止你重新发明轮子。有时候第三方 API 是免费的,但是大多数时候,你必须支付一点点费用(特别是如果你经常使用它们的话)。出于本文的目的,我们使用 Microsoft Azure Translator API,它是免费的,可以有限地使用。如果您没有 Azure 帐户,请阅读下一部分;否则可以跳过。
如何创建免费的 Azure 帐户
如果你没有 Azure 帐户,你可以注册一个免费的。按照以下链接中的说明进行操作。它很简单,让你可以免费使用数十种令人敬畏的 API 和服务。
https://docs.microsoft.com/en-us/learn/modules/create-an-azure-account/
创建一个免费的 Azure 账户后,你需要给你的账户添加 Azure Translator API。还是那句话,洒脱。您需要遵循以下链接中的步骤。
https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-how-to-signup
如果你做的一切都正确,你必须有一个 API 密匙(即认证密匙)。密钥只是一个字符串,让你可以使用 Azure Translator API。您需要将它放入您的 Python 程序中(下一节)。记住,永远不要和任何人(包括你的用户)分享你的 API 密匙。
A)部分 API
现在你已经有了 Azure Translator 的 API 密匙(恭喜你!),让我们看看如何通过 Python 与 API 对话。
使用 API 的最流行的 Python 库之一是“请求”您可以使用安装它
pip install requests
或者
conda install -c anaconda requests
以下 Python 函数获取文本,并向 Azure Translator API 发送请求。
在继续之前,我必须告诉你一个重要的观点(尤其是对初学者)。事实是:
每个 API 都有一组请求服务的规则。使用谷歌地图 API 不同于 Azure Translator API。要使用 API,您必须阅读文档。
让我们回到我们的代码…
在代码中,您必须输入您的 API 键(参见API_KEY
)并指定您的 API 区域(参见API_REGION
)。requests.post
向 Azure Translator API 发送 POST 请求。要发送请求,需要传递 URL 地址、参数、头和主体。URL 地址是一个 web 地址,Azure 服务器会持续监控该地址是否有任何即将到来的请求。一旦服务器看到您的请求,首先,它检查您在头部的凭证。如果您的凭证有效,它会查看您的参数以了解您的请求。例如,在这种情况下,我请求将 3.0 版的翻译程序从英语(即en
)翻译成西班牙语(即es
)。如果参数有效,那么 API 服务器获取主体(即本例中的 JSON 对象)并处理我的请求。最后,requests.post
返回给我一个 JSON 对象,我将其命名为response
。
你可以用一个简单的例子来检验这个函数。在代码末尾添加以下几行,然后运行它。
if __name__ == '__main__':
print(azure_translate('Hello world.'))
您必须看到这样的输出。
[{'translations': [{'text': 'Hola mundo.', 'to': 'es'}]}]
这是响应您的请求的 JSON(或 Python 字典)对象。如果仔细观察,您会看到翻译以及一些附加信息,如翻译的语言(即西班牙语或es
)。
同样,这里所说的一切都是基于文档的,在阅读文档之后,您必须能够使用任何 API。如果你不读它,你永远不知道如何与一个 API 通信,以及应该用什么数据结构传递什么参数。
B)部分图形用户界面
现在您已经准备好了后端,是时候构建前端了。正如我之前提到的( link ),ipywidgets 和 Jupyter 笔记本是为浏览器构建简单用户界面的良好组合。
对于我的简单应用程序,我只需要用户界面中的一些元素。这些要素是:
- 显示应用程序名称的标题(装饰性功能)。
- 用于输入英文文本的文本区小工具。
- 点击后请求翻译的按钮。
- 打印西班牙语译文的空白区域。
Ipywidgets 有一组小部件来创建不同种类的用户界面和仪表板。对于这个应用程序,我将使用一个用于标题的HTML
小部件、一个用于输入文本的Textarea
小部件、一个用于请求翻译的Button
小部件和一个用于打印结果的Output
小部件。然后我用一个VBox
小部件将它们垂直对齐放入一个容器中。
唯一的技巧是当用户点击翻译按钮时如何请求翻译服务。在点击事件时定义这个动作很简单。为此,我定义了一个函数,并将其传递给按钮的on_click
方法。当用户点击翻译按钮时,指定的函数将运行并向 Azure Translator API 发送请求。简单吧?
下面的代码显示了应用程序的前端部分。
最终产品
现在,是时候把所有东西放在一个 Jupyter 笔记本文件中了。将这两部分放入 Jupyter 笔记本文件并保存(例如 Translator_API.ipynb)。
图片由作者提供。
由于 Ipywidgets 与 Chrome 配合得非常好,所以请检查您的默认浏览器是否是 Chrome。将默认浏览器设置为 Chrome 后,打开终端,通过 Voila 运行 Jupyter 笔记本代码。
voila Translator_API.ipynb
几秒钟后,您一定会看到您的应用程序在浏览器中自动打开。像我在这里做的那样测试一下。
图片由作者提供。
瞧啊。!!!!只需几个步骤,您就完成了简单的翻译应用程序。您可以通过使用 ipyvuetify 来改善您的 GUI 外观,这是一个充满现代外观小部件的库。你也可以使用 ngrok 和其他人分享你的 MVP(最小可行产品)(详情阅读下面的文章)。
摘要
用 Python 构建应用程序既简单又快速。您可以使用 API 来避免重新发明轮子并构建您的后端。您还可以使用简单的库,如 ipywidgets 或 ipyvuetify,为您的应用程序构建一个简单的 GUI。在本文中,我向您展示了如何用几行代码构建一个简单的翻译应用程序。同样的方法可以应用于更复杂的 MVP 应用程序。
机器学习数据质量监控快速入门
行业笔记
作者图片
数据正迅速成为我们当前技术的生命线,使公司能够为客户构建、衡量和改善新体验。今天,这不仅仅局限于尖端技术;相反,收集和利用数据在许多商业领域变得非常普遍。
现在,随着机器学习的兴起使新的客户体验成为可能,对数据的重新依赖正在出现。在 ML 驱动的系统的新环境中,构建和维护高质量的数据源变得前所未有的重要。今天的 ML 系统需要大量的数据才能良好运行,处理如此大量的数据给采用这些技术的公司带来了真正的问题。
在今天的实践中,一个模型的好坏往往取决于它所训练的数据。**数据质量在模型被训练后并没有停止变得重要,而是在模型被部署到生产中时仍然重要。**模型预测的质量在很大程度上取决于支持模型功能的数据源的质量。在这篇文章中,我将解释为什么您的团队应该密切关注您的数据质量以及对您的模型最终性能的影响。
我们所说的数据质量是指什么?
数据质量是一个宽泛的术语,可以涵盖数据中的各种问题。首先,让我们定义一下这篇文章中我们不会谈论的内容。在这篇文章中,我们不打算关注“缓慢出血”故障,例如数据随时间的逐渐漂移。如果你有兴趣了解这个极其重要的话题,你可以看看我们早期的一些作品,在这些作品中,我们围绕这个进行了更深入的。
那还剩下什么?嗯,这大体上留下了数据管道中硬故障的概念。为了更深入地挖掘,让我们打破分类数据流和数字数据流的概念。
分类数据
分类数据就像它听起来的那样,是一系列类别,比如某人拥有的宠物类型:狗、猫、鸟、猪?等等。
基数变化
首先,分类数据流可能出错的地方是类别分布的突然变化。更极端地说,假设你的模型预测为你的宠物用品店买哪种宠物食品,开始看到数据说人们现在只养猫。这可能会导致你的模型只购买猫粮,而你所有养狗的潜在客户将不得不去街上的宠物用品店。
作者图片
数据类型不匹配
除了分类数据中基数的突然变化之外,数据流还可能开始返回对该类别无效的值。很简单,这是您的数据流中的一个错误,并且违反了您在数据和模型之间建立的契约。发生这种情况有多种原因:您的数据源不可靠、您的数据处理代码出错、一些下游模式更改等等。在这一点上,无论从您的模型中产生什么都是未定义的行为,您需要确保保护自己免受类型不匹配的影响,就像在分类数据流中一样。
缺失数据
从业者遇到的一个令人难以置信的常见场景是丢失数据的问题。随着用于计算现代 ML 模型的大特征向量的数据流数量的增加,这些值中的一些将为零的可能性比以往任何时候都高。那么你能做些什么呢?
您肯定可以做的一件事是,在培训环境中举手放弃该行,或者在生产环境中在应用程序中抛出一个错误。虽然这将帮助您避免这个问题,但它可能不是最实用的。如果您有数百、数千或数万个数据流用于为您的模型计算一个特征向量,那么丢失其中一个数据流的可能性非常高!
接下来,我们将讨论如何填充这个缺失值,通常称为插补。对于分类数据,您可以选择历史上在您的数据中看到的最常见的类别,或者您可以使用现有的值来预测这个丢失的值可能是什么。
数据
数字数据流也是不言自明的。数字数据是用数字表示的数据,例如银行帐户中的金额,或者室外的温度(华氏或摄氏)。
超出范围违规
首先,数字数据流可能出错的地方是越界。例如,如果年龄是模型的一个输入,而您希望年龄在 0-120 之间,但突然收到一个 300 多的值,这将被视为超出范围。
类型不匹配
类型不匹配也会影响数字数据。对于一个特定的数据流,如果你期望得到一个温度读数,你可能会得到一个分类数据点,你必须适当地处理它。默认行为可能是将这个分类值转换为一个数字,尽管现在有效,但已经完全失去了它的语义,现在是数据中的一个错误,难以跟踪。
缺失数据
对于数字数据,您有更多的插补选项,例如对该特定值采用平均值、中值或其他一些分布度量。这个问题的解决方案的复杂性完全取决于您的应用程序场景,但是要知道这里没有完美的解决方案。
当今监控数据质量面临的挑战
既然我们已经对您可能遇到的数据质量问题有了更好的了解,现在让我们简单地探讨一下从业者在试图跟踪他们的数据质量时遇到的一些常见挑战。
在我们开始之前,重要的是要注意,这不同于数据可观测性的广义产品空间。数据可观测性工具主要关注于监控表和数据仓库的质量,而 ML 可观测性主要关注于监控模型的输入和输出。这些模型是一致发展的,特性被增加和改变,因此模型的数据质量监控必须能够与模型的模式一起发展。
需要监控的数据太多
对于许多当前的 ML 实践者来说,这些天来许多模型依赖大量的特性来执行它们的任务并不奇怪。根据统计学习理论的最新进展,一个经验法则表明,一个模型可以有效地学习训练集中每 100 个样本的大约一个特征。随着训练集的规模激增到数亿甚至数十亿,特征向量长度在数万或数十万的模型并不罕见。
这将我们引向从业者今天面临的一个主要挑战。为了支持这些难以置信的大特征向量,团队已经将越来越大的数据流投入到特征生成中。编写代码来监控每个数据流的质量从根本上来说是站不住脚的,而现实情况是,随着团队实验改进模型,这种数据模式将不可避免地经常发生变化。
最终,没有人愿意坐在那里手动配置阈值、基线,并为输入模型的每个数据流设置自定义数据监控系统。添加一个特性、删除一个特性、改变它的计算方式是很常见的,在 ML 开发循环中增加更多的工作只会减慢你和你的团队的速度。
现在怎么办?
既然我们已经了解了当前在监控和修复数据质量问题方面的一些挑战,我们能做些什么呢?首先,团队需要开始跟踪他们的数据质量如何影响他们模型的最终性能。
利用历史信息
最终,模型的性能才是我们所关心的,很有可能某些数据的质量比其他数据的质量更有价值。为了避免为每个数据流手动创建基线和阈值,团队需要从训练集或历史生产数据中查看数据的历史。
作者图片
一旦确定了这些历史分布,您的监控系统就可以更好地了解应该将数值流中的异常值视为什么,并在分类流严重偏离其历史分布时生成警报。从这些分布中,可以创建智能基线和阈值来平衡这些警报的“嘈杂”程度或可能触发的程度,从而为模型团队提供平衡风险与回报的能力。
除了为所有数据流设置自动警报系统之外,您的数据质量监控系统还应该允许您执行类型检查,以防止模型中的下游错误,并避免潜在的类型转换问题。
使用模型性能爬山
最后,通过跟踪您的模型的最终性能,您的监控系统还应允许您测试不同的数据插补方法,并为您提供这种新插补策略的性能影响。这使您确信您所做的选择会对模型的最终性能产生积极的影响。
随着机器学习的快速发展并进入我们最重要的产品和服务,支持这些体验的工具已经落后了。现代数据质量监控系统的这些核心特征将控制带回给了 ML 工程师,并消除了大量的猜测,不幸的是,这些猜测已经在生产机器学习的艺术中蔓延得非常深了
联系我们
如果这个博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们其他的博客和 ML 监控上的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此处找到我们的空缺职位!
实时计算机图形学中的随机漫步
GLSL 的照明、纹理和位移映射
图一。一个遥远的场景(2021) | Sean Zhai |用 ShaderToy 创作
数学建模
计算机图形学从数学上定义形状开始。建模球体和立方体可以很容易地解决,但是定义真实世界的对象是具有挑战性的。著名的 3D 茶壶模型是由犹他大学的 Martin Newell 于 1975 年创建的,由于在计算机图形学的早期只有非常有限的模型可用,所以它在许多研究论文中被提及。
建模的另一种方法是用多边形网格来逼近形状;结合 3D 数字化仪和扫描仪,高分辨率多边形模型被广泛使用,但往往需要较长的渲染时间。1995 年第一部 CG 故事片玩具总动员上映,需要 80 万机时。
硬件的进步极大地改善了这种情况,尤其是现代的 GPU 使得实时计算机图形成为现实。但即使在今天,多边形模型仍然需要高度优化,游戏引擎经常使用低多边形模型。用数学定义形状仍然有明显优势。
用光描绘现实
光线被记录为图像中像素的颜色。现代图形处理器的奇迹使得实时制作惊人的图形成为可能,与图形处理器接口的语言是 OpenGL 着色语言(GLSL)。使用 GLSL,我们定义如何渲染像素的颜色;其余的是自动执行的,并且是并行完成的。
我们有完全的自由以任何方式设置场景,但是,遵循现实世界的原则是有帮助的。作为人类,我们的情感经常与和过去经历有相似之处的事物产生共鸣。甚至在构建一个抽象的构图时,我们往往需要一定的熟悉度。
图二。灯光的维度|翟的影像创作
通过观察,我们知道光在表面上的反射是由表面的法线决定的,漫射光对方向不敏感。使用 GLSL,一种简单有效的数字照明方式通常被配置为遵循 3 点工作室照明。根据经验,主光的亮度大约是补光的 10 倍。
在技术术语中,计算机图形照明或多或少取决于双向反射分布函数(BRDF),它描述了光线在撞击表面时如何表现的理论。
纹理、UV 贴图和长方体贴图
图三。特雷西·里斯秀 2008 |图片来源:commons.wikimedia.org
为了创造更真实的外观,最直接的想法是引入一张图片。如果我们想在数字世界中创作岩石时,有一张岩石的照片可以使用,这将使生活变得更容易。一个迫在眉睫的问题是,图像如何包裹物体的表面,当形状复杂时,这可能相当复杂。典型的解决方案在计算机图形学中称为 uv 映射,其中 u 和 v 是定义纹理的坐标。这非常类似于时装业使用织物的方式,这本身就是一门艺术,让不同表面交汇处的图案看起来很漂亮。
下图展示了一种叫做“盒子贴图”的技术。这是米奇·普拉特在皮克斯制作 RenderMan 时发明的。基本思想是从围绕物体的一个假想立方体投射纹理,纹理根据相对于 x、y 或 z 轴的方向混合。
图 4。纹理映射演示| Sean Zhai |使用 ShaderToy 创建
以下是 GLSL 代码中boxmap
的功能,由 Inigo Quilez 在 ShaderToy 开发。
// "p" point being textured
// "n" surface normal at "p"
// "k" controls the sharpness of the blending in the transitions areas
// "s" texture sampler
vec4 boxmap( in sampler2D s, in vec3 p, in vec3 n, in float k )
{
// texture along x, y, z axis
vec4 x = texture( s, p.yz );
vec4 y = texture( s, p.zx );
vec4 z = texture( s, p.xy );
// blend factors
vec3 w = pow( abs(n), vec3(k) ); // blend and return
return (x*w.x + y*w.y + z*w.z) / (w.x + w.y + w.z);
}
噪音,逼真的触感
噪声和随机的区别在于,噪声不是随机的。噪声,即使看起来不规则,也需要产生可重复的结果。为了在计算机图形中有用,噪声函数需要创建平滑和渐进的变化。柏林噪音是为电影《创》(1982)开发的,以增加真实感。该算法具有突破性,因为它可以在没有大量数据集或昂贵计算的情况下创建丰富而细致的图像,并激发了其他噪声的发展,如 voronoi、worly 和单纯形噪声。计算机图形学再也不会回到没有噪声功能的日子了。
Perlin Noise 的发展使计算机图形艺术家能够更好地在电影行业的视觉效果中表现自然现象的复杂性。
— 1997 年奥斯卡颁奖典礼
图五。Bloodie 写了一首颂歌| Rebecca Xu,Sean Zhai(使用柏林噪音场创建的生成动画,在处理中编程)
分形噪声和自相似性
几乎所有自然界常见的模式都是粗糙的。它们有着极其不规则和支离破碎的方面——不仅比欧几里得的奇妙的古代几何学更加精细,而且复杂得多。几个世纪以来,测量粗糙度的想法只是一个空想。这是我毕生致力于的梦想之一。—伯努瓦·曼德尔布罗
分数布朗运动有时被描述为“随机行走过程”。Mandelbrot 揭示了 fBm 最重要的特征,即自相似性。为了说明这一点,Mandelbrot 展示了可以在自然界的许多地方观察到的自相似性,例如花椰菜的结构,其中植物的一部分与整体具有相同的结构。
图六。伯努瓦·曼德尔布罗的 TED 演讲
为了实时看到这一点,让我们在 GLSL 实现 fBM。下面是一个例子。复杂性是通过添加用于操纵采样纹理的噪声迭代而逐渐建立的;每次采样频率增加一倍,其幅度减小一半。通过这样做,自相似性得以保持。
// code by ig at shadertoy.comfloat noise1f( sampler2D tex, in vec2 x )
{
return texture(tex,(x+0.5)/64.0).x;
}float fbm1f( sampler2D tex, in vec2 x )
{
float f = 0.0;
f += 0.5000*noise1f(tex,x); x*=2.01;
f += 0.2500*noise1f(tex,x); x*=2.01;
f += 0.1250*noise1f(tex,x); x*=2.01;
f += 0.0625*noise1f(tex,x);
f = 2.0*f-0.9375;
return f;
}
对于偶然发现 ShaderToy 的人来说,随机改变着色器中的参数以获得不同的外观是很有吸引力的,但如果不理解基本原理,可能很难掌握构造着色器的艺术,并且当出现伪像时会令人沮丧。
位移映射
噪波也可以用来改变对象的实际形状,这通常称为置换贴图。将 fBm 噪波作为位移贴图添加到图 4 中,我创建了图 1 的标题图像。源代码可以在下面找到。
形象很简单,希望还是营造出一种偏僻大气的感觉。我想分享一些笔记,而使这一点。
- 构图:一般你的主要对象不要在死点;相机目标位置
ta
在 x 轴上轻微移动。 - “建筑结构”的建模是用两个球体连接在一起完成的,减去一个球体来创建凹面形状(可以很容易地在图 4 中看到)。)
- 触摸位移图可以完全改变图像的情绪(比较图 4)。和图 1。).
你可以访问 ShaderToy 查看实时版本。
https://www.shadertoy.com/view/flBGzK
收场白
有可能你做过在画布上画线的图形编程,基本上可以解释为“画家的模型”。GLSL 提供的是更强大的东西。可以实时体验,可以印象更深刻。尝试使用 ShaderToy 或另一个 GLSL 合成工具。干杯!
在 R 中提高数据辩论技巧的一个非常简单的方法
当我找工作时,我有很多空闲时间。加上 COVID,嗯,我有很多空闲时间。有一天,我对自己说,鉴于 dplyr 1.0.0+ 相对较新的更新和我个人的理念,你可以总是练习基本技能,我可以用dplyr
进行一点练习。我的第一个想法是谷歌“dplyr 练习题”,但如果你现在这么做,你会发现一堆教程网站都有非常基本的dplyr
问题。对于 R 的中级和高级用户来说,这可能不是我们想要的。然后,我接下来的想法是“做一个个人项目”。无数的文章和人们都推荐把它作为学习和练习 r 的一种方式。是的,我喜欢个人项目,但有时你也在寻找那种快速的锻炼,你知道吗?有时候,你并不真的想花很长时间去构思一个项目,你只是想快速地做一些演示。
但是后来,我突然想到。哪里有一个地方可以让人们发布对他们来说显然不直观的问题,而其他人可以发布解决方案?
对,那个地方就是栈溢出。
我创建了一个帐户(我一直使用堆栈溢出来查找自己问题的答案,但我从未想过创建一个帐户来回答别人的问题),并设置我的过滤器来选择性地查看dplyr
问题:
第一步
第二步
在“以下标记”中键入 r 和 dplyr
游戏计划
现在我已经确定了这个资源,我如何以及你如何开始使用它?
把它当成一次锻炼。
告诉自己每天至少尝试解决 5 个问题。当你点击“应用过滤器”按钮时,你会得到一个问题列表。你可以通过“最新”来查找可能还没有答案的问题。请记住,这些问题会有一系列的困难。通常情况下,你会遇到来自 R 新手的问题,所以这些问题会有相当简单的解决方案。
如果您想要带有“答案”的问题,将“过滤依据”框留空。如果你想解决没有公开答案的问题,按“没有答案”过滤。
注意,不一定要贴你的答案;你可以试着用你自己的 RStudio 编码出答案。
投资
也就是说,你可以试着公开发布你的解决方案。栈溢出有一个游戏的很多方面;您可以获得声望点数和徽章。如果你真的在努力提高你的技能,你可以张贴你的答案,如果它是好的,它可能会被接受为解决方案或被社区投票。你也可以通过过滤有赏金的问题来尝试解决更难的问题(如果你对赏金问题的回答被接受,你可以获得大量信誉点)。
最后,我认为这是一个很好的练习资源,如果你想快速练习,不需要花太多时间。您正在练习解决一个小问题的数据争论技巧。有时候你会想出一个好的解决方案;有时候其他人会想出更好的办法。无论哪种方式,你都可以从全球 R 社区学习。最后但同样重要的是,你要回馈社会。你在帮助那些可能刚刚开始学习 R 的人;记住你曾经是那些人的一员!
让我们用 AI 做饭:如何使用 Telegram 编写食谱推荐机器人
动手教程,菜谱电报机器人
用 python Telegram API 和深度学习模型编码的推荐引擎。给你的冰箱拍张照,等待最佳食谱。
为什么你应该读这篇文章:
如果你对计算技术感兴趣,并且想学习更多关于识别引擎、推荐引擎和 telegram API 的知识,这篇文章是为你准备的。
我们将一步一步地一起构建一个迷你应用程序,它可以根据您厨房中现有的食材提供定制的食谱。为了更进一步,我们将添加一个识别引擎,它可以根据你发送给机器人的图像识别水果和蔬菜。你可能会问,为什么?仅仅是因为好玩又轻松!
我们还将使用 Telegram API,因为它提供了一个为小项目创建工作前端的绝佳机会。除此之外,如果您将 Python 用于您的后端活动,您可以使用多个包装器来利用它们的 API 的许多不同选项。我还发现,如果你想开发简单的物联网解决方案,这是一个方便的工具。
我希望这篇文章能启发你去做其他很酷的项目。如果您有任何问题或想分享您的项目,不要犹豫,直接联系我或留下评论。
我们将如何进行?
- 应用程序概述。
- 在本地机器上部署。
- 一点机器学习的代码。
- 结论。
应用程序快速浏览:
有时一张图片(或者,在这种情况下,一段视频)胜过千言万语。这就是为什么这个 GIF 在这里向你展示这个机器人的主要功能和它是如何工作的。
根据你厨房里的食材,机器人可以从各种烹饪风格(意大利、希腊、日本等)中选择一套食谱。).
作者 Gif
自己试试吧!在您的本地机器上部署 bot 以充分享受这种体验。玩得开心!
提示:我用 gfycat 创建了 GIF。他们提出了奇妙的功能和可能性。不要犹豫,点击 这里 试试吧!
在您的本地计算机上尝试(一步一步):
首先,你需要用 Telegram 应用程序创建一个机器人。然后,您将能够在本地计算机上部署应用程序。
生成电报机器人:
你可以快速浏览一下这个帖子来创建一个带有令牌的电报机器人!然后在创建你的机器人后,你就可以访问它的令牌了!这个你自己留着吧。因为如果有人发现它,他们可以对你的机器人做任何他们想做的事情(安全总比抱歉好)。
在本地部署它:
如果你熟悉 GitHub,你会在下面的 GitHub 页面上看到关于机器人部署的所有信息。
如果您在本地机器上安装了 Docker,只需在终端上运行下面的命令行:
docker run -e token=Your_token tylerdurden1291/telegram-bot-recipes:mainimage
机器学习:
我们现在将更深入地研究这个项目,我将它分成了四个部分:
- 我们如何使用 Doc2Vec 模型和预测菜肴的分类器进行推荐?
- 基于深度学习的图像识别。
- 为前端设置电报机器人。
- 得益于 docker 的快速部署。
如何做推荐?
在过去的六年中,最有用的技术之一是自然语言处理(NLP)。在这个领域,研究人员的目标是通过不同的过程来打破语言的深层结构和它们的秘密。让我们用三个要点来总结一下。
- 标记化:这个过程将输入文本转换成机器可以理解的格式。总而言之,文本被转换成一系列由数字组成的向量。
- 特征工程/建模:由于文本现在是机器可以理解的,我们现在可以提取一些知识来执行某项任务。我们称之为特征工程,因为我们从输入中提取特征。它也被称为建模,因为这些特征提取器通常是统计模型。
- **任务:**在 NLP 中,很多任务都可以由一个模型来执行。从简单的任务,如分类,到更复杂的任务,如问答。在我们的小项目中,我们将为菜肴预测执行分类任务,并进行相似性匹配以找到最佳食谱。
建议类型:
当我们讨论建议时,主题是相当模糊的。根据目的不同,存在许多不同类型的建议。例如,网飞或亚马逊会根据你正在观看的内容和其他客户之间的相似性进行推荐。在我们的例子中,我们希望根据您已经拥有的食材和食谱中的项目列表之间的相似性来做出推荐。
一个好的建议是一套食谱,分享你已经拥有的和食谱中的相同成分。基于规则的解决方案是可能的,但是它将产生相当大的编程开销。因此,我选择使用著名的 Doc2Vec 模型。是 Word2Vec 在句子层面的概括。因此,我们可以计算句子相似度,而不是单词相似度。
为了增强用户体验,您可以在对数百万个食谱训练您的 Doc2Vec 之前添加一个模型。 Uber Eats 和 Deliveroo 提议在点菜前选择菜式。使用正确的数据集和简单的模型,我们可以快速实现相同的功能。经过深入研究,我发现了一个包含食物类型的食谱数据集(例如:意大利、墨西哥、法国、中国等。).因此,在第一步中,使用逻辑回归分类器在完整的食谱数据集上预测食物的种类。在第二步中,针对每种类型的烹饪训练 Doc2vec。有了这个管道,我们可以确信我们的模型将只为特定的食物类型提供食谱!
如果您想了解关于该模型的更多信息,我强烈建议您查看以下链接:
数据集:
对于项目的这一部分,我们需要两个不同的数据源。
- 第一个数据集使用每个配方的配料集合来训练 Doc2Vec 模型。想到的数据集是 recipes 1M ,但是在写这篇文章的时候他们的网站已经关闭了。但是我发现了另一个非常相似的,叫做食谱盒。
- 第二个数据集用于训练模型,根据一组配料预测菜肴的类型。多亏了 Kaggle 的订阅者,食谱配料数据集正在正确地完成这项工作。
一点编码:
在符号化过程中,我使用了一个简单的管道,将文本符号化并寻找单词的词根。被称为停用词的无用词也被删除以减少噪音。
作者代码
我使用特征工程仅仅是为了预测菜肴类型。TF-IDF 在逻辑回归模型预测菜肴种类之前嵌入输入文本。
作者代码
为了计算食谱中的配料之间的相似性,我们将使用著名的 Doc2Vec 模型。这个模型只需要一个记号化的过程,因为它本身就是在提取特征!注意, Gensim 库允许我们用一个简单的命令预测未知文本的相似性匹配。
作者代码
再进一步:加入基于深度学习的图像识别。
图像识别现在是机器学习中一项众所周知的任务,深度学习模型已经被证明是这项任务的最佳和最可靠的。但是深度学习框架需要巨大的计算能力。因此,迁移学习技术通过使用预先训练的模型而不是从头开始训练新的模型来节省大量时间和开销。
数据集:
存在许多用于图像识别的数据集。我选择了以下数据集,为食物识别量身定制: GroceryStoreDataset 有很多不同环境下多角度拍摄的水果蔬菜照片。这使得它成为目前最好的可用数据集。
一点编码:
由于我正在使用深度学习模型,我需要 GPU 资源,感谢谷歌,我们可以通过 Colab 笔记本轻松访问。因此,我分享了我用来训练 Keras 上的预训练模型的 Resnet 模型的笔记本。
https://drive.google.com/file/d/1A4g5NcBPVu6wpIUgKa4ZuqNoZiO01Q5q/view?usp=sharing
当模型完全训练好时,这里是在应用程序中对单个图像进行预测的代码。
作者代码
如何为前端设置电报机器人:
存在许多 API,知道如何使用它们是一项有用的技能。Telegram 多年来一直在开发其 API,并且做得非常出色!这个 API 最酷的一点是它的包装器数量,这将简化您的生活。在这个项目中,我使用了 python-telegram-bot 包,它被证明是可用的包装器中最容易使用的一个。
编码:
要启动这个包装器,首先,您需要使用 pip 命令安装它。
pip install python-telegram-bot
在查看我的代码之前,我强烈建议您专注于理解 ConversationHandler 模式。在他们的示例文件夹中,您将找到可以轻松在本地实现的可用代码和模式。将 python 文件与其对话模式进行比较,而不仅仅是阅读代码行,节省了我几个小时的时间。
如你所见,第一层处理主要按钮和发送给机器人的文本或照片。第二层用于两种不同的交互:
- 当一个图像被发送到机器人,它被处理,它被传递到一个附加函数,一个回调函数能够检索用户触摸的项目。
- 当你点击获取食谱按钮时,情况也是如此。在文章开头的 GIF 中可以看到,点击这个按钮后会要求你选择想要烹饪的美食。需要第二个回调函数来检索用户选择的信息。
注意每个最终层是如何返回主菜单的!
作者代码
如何用 D ocker: 快速部署 App
Docker 是一个你可能已经听说过的开源软件。它使用其操作系统创建容器,以避免在其他机器上部署解决方案时出现软件依赖性问题。我鼓励你学习 Docker,因为如果你从事计算工程,你将会使用它或者其他类似的软件。对于这个项目,我创建了一个镜像,如果你安装了 docker 而不是使用 GitHub,你可以在本地机器上运行这个镜像。如果你是 Docker 新手,我鼓励你去看下面的视频!
命令:
我不会给你一个 docker 课程,并鼓励你去理解什么是容器。但你唯一需要知道的是以下内容。运行容器意味着在你的设备上运行一个新的操作系统。为了构建这个新的操作系统,docker 使用了映像。这篇文章将介绍我是如何为这个项目创建图像以及如何运行它的。
Dockerfile 是您运行以生成图像的文件。因此,它由一个源映像(通常是 Linux OS 容器)和一些命令组成。这些命令将允许我们下载包,设置环境变量,并定义容器启动时将运行的命令。
Dockerfile 文件:
# Base by image from python3.7 source image on amd64
FROM python:3.7# Create a argument variable to call when the image is started
ENV token token_init# copy the requirement within the image before importing the whole code and pip install everything
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt# Import the whole code in the image and change the working directory accordingly
COPY . /app
WORKDIR /app# Run the setup to import models and datasets
RUN bash setup.sh# Create models and the database
RUN python3.7 train_and_populate_recommendation_db.py# Define the command to run when the container will be started
CMD ["sh", "-c", "python3.7 app.py ${token}" ]
当然,您不需要在本地运行它,映像可以在 Docker Hub 上获得,您可以轻松地调用它,只需一个命令就可以运行项目。首先,在您的本地 AMD(例如,每个个人桌面都是 AMD,但 raspberry pi 不是)机器上下载 docker,并使用您的 bot 令牌运行以下命令:
docker run -e token=Your_token_gen_by_Fatherbot tylerdurden1291/telegram-bot-recipes:mainimage
结论:
这篇文章的动机是分享的想法。开源项目是避免伟大创意产生过程中瓶颈的最佳方式。因此,我决定分享我的代码,并感谢 Medium,在这篇文章中用我自己的话介绍这个项目。
简单来说,Telegram API 可以帮助你快速开发一些有用的 app,docker 会帮助你分享和部署你的解决方案,Python 有令人印象深刻的快速开发功能!
如果你喜欢这篇文章,别忘了鼓掌,如果你认为它很有趣,你可以查看我的 GitHub 页面。
关于数据科学和机器学习学位的红丸观点
意见
真相会让你自由
做机器学习需要学位吗?我已经很久没有在这场讨论中发表意见了。一个原因是因为我没有学位。见鬼,我就要拿到会计和商业文凭了——我迟到了 5 年,但迟到总比没有好,对吗?LOL。我把 2 便士藏在心里的另一个原因是,我无法有效地解释为什么我没有去。如果你当时问我,我的回答会是——“我没有去,因为我是环境的受害者。去了也没意义”。就这么简单。
现在,我已经设法把我的想法放在一起,用经验武装自己。如果我从未有过这样的经历,我有什么资格对教育是否重要发表意见?嗯,我每天都在做机器学习工作,没有学位,更好的是,没有巨额债务——我保证我没有任何恶意。
红色药丸还是蓝色药丸?
GIF 来源:https://giphy . com/gifs/Keanu-reeves-the-matrix-wachowskis-1 cnsm 9 zkhf 0m 4
因为你一直在滚动,我猜你想要红色药丸。
数据科学或机器学习学位并不是该领域职业生涯的先决条件。
抱歉。
听着,我明白。这件事很敏感也很主观。对于过去 3/4 年熬夜完成论文的读者来说,这当然是难以下咽的苦果。
我喜欢《百万富翁浪子》的作者 MJ DeMarco 对这个问题的描述。他认为,大学学位是由他所谓的剧本创造的超现实——我们可以认为剧本是卖给我们来维持秩序的虚假现实。
“‘大学学位’超现实是双管齐下的。首先,这是一种思想,即智力和财富需要大学学位,而不考虑成本,更重要的是,没有大学学位的生活永远会被就业不足和成绩不佳所强调”。
如果数据科学和机器学习像医学领域一样受到高度监管,那么我会说“绝对如此!学位是必须的。”。我们离高度管制的领域越远,学位就变得越不必要。互联网使这一切成为可能。不相信我?在你的谷歌搜索栏中键入“数据科学课程或“机器学习课程,看看你有多少选项可供选择。
互联网时代给了我们前所未有的获取信息的机会。大多数东西都可以在网上掌握,方法是找到该领域的主题专家,研究他们的作品,然后运用你所学到的东西。
学位通常是其他人的象征。因此,获得一个学位是有一些声望和价值的,但是如果有人能做一份质量非常好的工作,你会在乎他是否有学位吗?你拥有的汽车,你检查过组装它的人是否有学位吗?你脚上的鞋子,你检查过制造商是否有学位吗?
“大学超现实的第二个方面是,花一大笔钱在你热爱的任何领域获得学位,可以保证毕业后有一份工作等着你——而且你的学位让你有资格获得它。”— Mj DeMarco,无脚本
我的观点是,人们得到他们想要的东西。如果一家公司希望你加入他们的数据团队,因为他们已经看到了你的开源贡献,在这一点上你的学位是没有意义的。他们要行动了!
最后的想法
奇怪的是,我并不反对学位。我认为人们应该去做,如果那是他们想做的。我反对的是与学位相联系的错误观念,比如人们一旦完成任期就会有权利感。我不怪他们,他们被卖给了一个梦想——一个超现实,就像 MJ 德马科会说的那样。长话短说,学位并不能保证工作。
感谢阅读!
如果你喜欢这篇文章,请通过订阅我的免费 每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。
相关文章
https://medium.com/analytics-vidhya/courses-to-learn-data-science-in-2021-a52e64344e5c
对“张量流悲伤故事”的回复
马库斯·斯皮斯克在 Unsplash 上的照片
T 今天我读了 Zahar Chikishev 的《TensorFlow Sad Story 》,虽然我同意他的大部分观点,但我觉得这对 TensorFlow 本身有点不公平,因为它没有试图掩盖或理解 TensorFlow 为什么是现在这个样子,或者谷歌究竟为什么要做某些事情。自从 2019 年 9 月 TensorFlow 问世以来,我一直是 TensorFlow 的用户,并且感受到了 Zahar 在他的文章中描述的许多相同的痛苦,我开始起草一份回复。然而,正如你从这篇文章中看到的,我的评论失去了控制,所以我决定把它变成一个独立的部分。
需要澄清的是,我并不为 Google 或 TensorFlow 工作,但是,作为一名用户和系统工程师,我也许能够解释为什么 TF 是现在这个样子(我并不同意它的大部分内容,但是我猜它提供了一些视角)。
接下来,我或多或少地按照最初帖子的顺序讨论了每个主题,你可以在这里阅读:
https://medium.com/geekculture/tensorflow-sad-story-cf8e062d84ba
易于安装
事实上,安装 TensorFlow,特别是对于 Python 生态系统的新手来说,可能是一件痛苦的事情。我想谷歌不介意这一点有几个原因:
- 它免费提供实验室,这样你就可以从那里开始
- Anaconda 已经为您预打包了 TensorFlow 及其依赖项,如果您愿意自己安装的话
- 大多数(如果不是全部的话)云提供商将它与他们的 GPU 实例一起预打包
- 坦率地说,到目前为止,这种方法很有效。
此外,很大一部分痛苦来自于 Nvidia 无法发布一个能够跨不同小版本远程兼容的 CUDA SDK。当试图手动安装 TensorFlow 时,大多数人会犯的错误是找到编译 TensorFlow 二进制文件所依据的 CUDA 和 cuDNN 的确切版本。
插件包:
对于那些不知道的人来说,TensorFlow 项目有几个兄弟姐妹,即插件、概率、图形和甘,以及一些不太为人知的,如相似性、代理、和其他。您可以通过浏览 TensorFlow 的 GitHub 页面获得完整列表。
在最初的帖子中,作者抱怨插件包与主包是分开的,这似乎是不必要的,因为他总是两个都安装。虽然我发现了一个微小的麻烦——仅仅是 requirements.txt 文件中让 pip 吞食的另一行,但这是用户不总是理解公司基本原理的一个很好的例子。
TensorFlow 是一个庞然大物软件。它是巨大的,跨越数百万行代码、几种语言、几种设备等。此外,使用 TensorFlow 的所有产品的总和可能接近(或接近)数十亿美元。如果谷歌搞砸了,反弹将是巨大的。因此,将一个项目分割成更易管理的部分是有意义的,比如一个包含所有基本内容的核心包和几个更集中的项目。
在较小的子项目的一般好处中,我强调:(1)您可以按照自己的步调推进每个子项目,(2)它限制了糟糕的发布的影响,以及(3)它简化了对人们正在使用什么的跟踪。
然而,最重要的是能够包含你不确定是否会被主流采用的东西。例如,考虑优化器。我猜 90%的人只知道亚当或者从来懒得去尝试别人。我在 Addons 包上数了超过十个小说优化器。这些应该添加到核心包中吗?这些年来测试和维护的成本是多少?
作为深度学习,一个由上个月的研究推动的领域,我们永远无法知道什么将经得起时间的考验。
渴望是一场骗局:
急切执行是 TensorFlow 2 最令人期待的特性之一。它将为 TensorFlow 带来 PyTorch 式的开发体验,摆脱该死的“会话”基本原理是,eager 可以调试,但速度较慢,而 deferred(图形模式)更快,因为它编译代码,但不能直接调试。谷歌解释说,当训练他们的模型时,人们会使用渴望调试和切换图形模式。
《张量流悲伤的故事》的作者引用了:
TensorFlow 2.0 急切地执行(就像 Python 通常做的那样),在 2.0 中,图形和会话应该感觉像实现细节。
对于计算密集型模型,比如在 GPU 上进行 ResNet50 训练,急切执行性能堪比
[*tf.function*](https://www.tensorflow.org/api_docs/python/tf/function)
执行。但是对于计算量较少的模型来说,这种差距会变得更大,对于有大量小操作的模型来说,优化热代码路径还有很多工作要做。
第一个引用中提出的要点是大多数时候,您可以在两个之间无缝切换。第二段引文指出图模式受益于许多低成本操作和优化路径。这里的问题是,“多低的成本才算足够低?”。作者提到使用 ResNet-50 模型,并使用图形模式获得超过五倍的执行速度。如果我是猜测,批量太小,或者 GPU 是相当强大的。在这两种情况下,即使是 ResNet-50 操作也可以被称为低成本。
后来作者提到文档不鼓励使用渴望模式。的确,它本可以措辞得更好。默认情况下,急切模式是关闭的,因为这样更快。然而,如果你正在调试,你可以打开它,随心所欲地调试,然后关闭它。
具有讽刺意味的是,PyTorch 渴望模式默认情况下很快,而 TensorFlow 很慢。事实上,PyTorch 提供了一个混合解决方案,将 Torch 代码 JIT 化为图形模式,以提高性能。我猜如果 PyTorch 团队认为有必要实现一个 JIT 编译器…
数据 API:
我完全同意 tf.data.Dataset 很乱,我不会说我大部分时间都喜欢它。
这个 API 之所以这么烂,是因为它伪装的非常 TF1 化(而且所有 TF1 的东西都很烂)。data API 被设计成跟踪你的代码到 C++调用中,所以当你用 Python 写代码时,它被跟踪到一个图形模式表示,并在 CPU C++后端运行。
基本原理是性能:虽然 Python 苦于不可并行化(参见全局解释器锁 (GIL)),但 C++代码可以在所有可用的 CPU 线程上自由运行,因此可以更快地处理数据集,从而让 GPU 保持忙碌。缺点是生成的代码无法调试(毕竟是图形模式),运行任何外部 Python 代码都有极其痛苦的语法和性能。
只有图形模式是 TF1 的事情,希望它将成为整个图书馆的过去。与此同时, TensorFlow 2.5 增加了对 tf.data.Dataset 的实验性热切支持,这是一个开始。
API 复制:
TensorFlow 确实具有大量重复的功能。起初这很可怕,但实际上并不是问题。这些大部分都是帮助人们从 TF1 移植代码的遗留操作。如果谷歌放弃所有 1.x 的东西,他们永远不会让人们更新。
一个例子是 TF 1.x 如何拥有自己的操作(比如卷积),然后公开一个更高级的 API (slim)。在此之后,他们开始整合类似 Keras 的语法(tf.layers),这导致采用 Keras 本身作为其主要后端(tf.keras)。所以,现在,他们不得不处理所有这些遗留代码。希望他们会在 TensorFlow 3.0 版本中剥离大部分内容,或者更好的是, JAX 会取代生态系统。
在实践中,您只需关心 tf.nn 模块(类似于 PyTorch)和 tf.keras 包(高级 API ),它隐藏了许多样板文件和形状/尺寸计算。这两个 tf.keras 是主要的 API,而 tf.nn 用于实现定制的东西。
草率开发:
都是真的。句号。
特别是 ImageDataGenerator,它是 Keras 中最流行的数据扩充方法,在我看来,它一直是一个失去控制的样本代码,并开始在生产中使用。
最后一点,虽然我确实认为谷歌可以做得更好,但我知道 TensorFlow 是第一个为大规模模型设计的开源深度学习包之一,因此完全关注速度。在这方面,承认当时的情况是值得注意的。首先,神经网络几十年来一直是个笑话;它们速度慢,难以训练,并且不能提供有意义的好处。人工智能社区对决策树和支持向量机更感兴趣。
随着 CUDA 或在 GPU 上编程非图形的东西,事情开始发生变化。Nvidia 在 2007 年发布了第一个公开版本的 CUDA。当时,它主要是实验性的技术,有一些有趣的用例,但是使用它太痛苦了,而且工具很糟糕(现在仍然是,IMHO)。因此,它的大部分采用来自不同的来源和图形社区本身。直到 2012 年 9 月 30 日,CUDA(和神经网络)才有了改变人生的突破:AlexNet。
使用 CUDA 训练的卷积神经网络赢得 ImageNet 比赛并不是 AlexNet 的唯一壮举;它也成功做到了这一点,准确率提高了 10 个百分点以上。它引起了人们的注意。问题是:所有可用的神经网络工具充其量都是实验性和学术性的。此外,使用 CUDA 虽然并不完全新颖,但绝对不是主流。比赛开始了。
从 AlexNet 到 TensorFlow 首次公开发布,整整用了 3 年 1 个月 11 天。换句话说,对于谷歌大脑团队来说,要将他们在神经网络上的一切重新规划成某种东西,他们可以复制突破性的结果,做进一步的最先进的研究,并向公众开放。
在谷歌大脑团队的论文标题中快速搜索“深度”一词,我们从 2000 年到 2011 年总共有 3 篇论文。在那个时候,人们对“深度学习”或“深度神经网络”没有那么多兴趣。2012 年发布次数变为 3 次,2013 年变为 9 次,2014 年变为 10 次,2015 年 TensorFlow 发布时(准确的说是 2015 年 11 月 11 日)变为 20 次。
从那时起,没有一年没有一些突破性的变化或新奇。试图暴露深度学习的最新水平是一场猫捉老鼠的游戏。PyTorch 是在 TensorFlow 之后一年左右发布的,而变形金刚是在那之后一年提出的。在 2018 年,2019 年和 2020 年,我们分别有 GPT-1,-2 和-3,嘿,我们在 2021 年,GPT-4 的谣言正在流传!
我在这里的观点是,深度学习是一种不断发展的技术,因此,工具总是滞后的。因此,下一个将总是更闪亮,或者至少不会过时。
每个计算机架构师都是赌徒。谷歌工程师打赌性能将主导市场,并为此设计了 TensorFlow,赢得了最大的市场份额。脸书工程师赌上了灵活性,这在学术界获得了回报,但在行业采用方面却落后了。Keras 的创造者 Franç ois Chollet 将赌注押在了易用性上。
谁是对的?可能没有,因为世界正在转向大规模分布式的基于注意力的模型。谁会想到呢?上述工具都不适合这种情况。难怪会看到新的竞争者在函数式编程上下赌注。
尽管如此,我们看到 PyTorch 增加了图形模式,TensorFlow 拥有渴望的功能,并且两者今天都有类似 Keras 的 API。而且,都是互相学习。
长话短说,TensorFlow 有它自己的问题,但是,就像任何其他库一样,其他一些库将会出现并成为它应该成为的样子,其他一些库也会取代它。变化是软件的美妙之处。
有人知道 Java Servlets 吗?
暂时就这些了。如果您对本文有任何问题,请随时发表评论或与我联系。
如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。
感谢阅读:)
崛起的浪潮——尼日利亚的数据科学和机器学习
利用 Kaggle 的年度调查,探索人们对 DS 话题越来越浓厚的兴趣
** * 您可以在这里 ***** 找到该项目的代码https://www.kaggle.com/sootersaalu/a-rising-tide-ds-and-ml-in-nigeria
虽然软件开发仍然是该国的首选编程工作,但数据科学在尼日利亚的受欢迎程度近年来不断增加,因为许多尼日利亚人发现自己被其潜力所吸引,并在该领域获得了收益。
然而,仍有许多工作要做,因为数据科学研究中的现代工具和新改进明显未得到充分利用,这是由于缺乏知识或害怕风险,数据科学对尼日利亚市场的影响没有达到应有的广泛程度,也没有达到持续生成的数据的内在力量得到利用后的广泛程度。
然而,随着对科学感兴趣的个人和企业数量的增加,有很多值得期待的事情——五年谷歌数据科学趋势——迎合尼日利亚培训需求的计划数量也在增加。像尼日利亚数据科学、哈莫耶和 Utiva 这样的公司投入时间和资源来教育年轻和年老的尼日利亚人先进的分析、数据科学和人工智能工具和方法,预测涨潮是一个安全的赌注。
在这份报告中,我们将看看 Kaggle 的年度数据科学和机器学习调查,首先探索尼日利亚人的信息;他们的编程工具“堆栈”,他们在那里学习、消费内容,以及他们的公司在与世界其他地方的信息进行比较时对数据科学的利用。
见解
- 年轻人:我们的参与者大多不到 40 岁,尼日利亚的样本甚至更年轻。
- 学生来了!:我们学生比例高;学士大多数是硕士,尼日利亚的样本大多数是学士。
- **有教养,有教养!:总体而言,尼日利亚拥有超过 50%的学士学位,在传统的大学教育(学士、硕士、博士)方面,该国在世界上遥遥领先。
- 随着经验的增加,比例下降:我们的调查中有更多的编码和机器学习初学者,他们的线性下降是可视化的。
- 你上大学就是为了这个?!与世界其他地区相比,尼日利亚人从大学学习数据科学的比例要低得多。
- **数据科学期刊很无聊,Twitter 线程在哪里?:在我们的尼日利亚样本中,当消费数据科学内容时,期刊、Reddit 和播客最不受欢迎
- 谁是他们当中最伟大的短跑运动员?:对于部署/共享工具,更多的尼日利亚人更喜欢 Streamlit,而不是 Shiny 或 Plotly Dash,这种偏好在世界其他地方正好相反
- 机器学习方法利用不足:很大比例的尼日利亚企业根本不使用机器学习,很少有模型投入生产。
首先,我们看看从 2017 年到现在参与调查的人数
调查对象的趋势
尼日利亚人越来越多地出现在 Kaggle 调查中,就比例排名而言,他们在 2017 年占据第 39 位,而在 2020 年,他们占据第 8 位,其人数(476)本可以使他们在 2017 年获得第 6 位。
与整个世界其他地区相比,尼日利亚受访者的增长没有下降,因为尼日利亚人的数量在最近达到顶峰,是 2017 年尼日利亚参与者数量的 6 倍以上。
参与者的人口统计数据
为了更好地了解参与调查的不同个体,我们需要调查他们的相似性以及如何将他们作为一个整体来描述。
年龄组
在这里,我们绘制了分布图,以探索 Kaggle 调查中尼日利亚和世界其他地区的年龄组,以便于样本之间的比较和分析。
年龄分布比较
如果这项调查具有代表性的话,整个 Kaggle 的人口严重偏向年轻人,80%或更多的受访者年龄在 40 岁以下。
在尼日利亚的样本中尤其如此,因为他们中的大多数人年龄在 35 岁以下,22 岁至 24 岁的人比任何其他年龄组的人都多,这与世界其他地区不同,世界其他地区 25 岁至 29 岁年龄组的人比例最高。
退一步说,尼日利亚以其年轻的人口而闻名,2 亿多人口中超过 90%的人年龄在 55 岁以下
性别
增强受歧视性别的权能和消除性别差距是一项社会需求,所有善意的个人都应努力缓解这一需求。在这里,我们来看看调查中的性别分布。
📍 “非二进制”、“我更喜欢自我透露”和“我宁愿不说”由于比例较低被归入“其他” 📍
性别分布比较
正如可以预料或预测的那样,在 Kaggle 的调查中,男女比例严重失衡,男性在这一领域占据明显优势。这种优势可以说是“STEM”世界和更大的社会性别差距问题的代表。
由于尼日利亚男性的比例(82.4%)高于世界其他地区的男性(78.7%),这个问题再次出现,这在很大程度上证明了在科技计划、科技领域的女性、数据科学领域的女性(如这个数字探索者项目)以及针对尼日利亚女性和其他代表性不足的性别的类似项目中,女性的比例更低。
职业
除了年龄和性别变量之外,职业分析对于了解尼日利亚 Kaggle 人口和钻取平台上参与的细分市场也很重要。
职业比较
作为一个整体,相当大的“Kaggler”人口,确定为学生,这是 Kaggle 最大使用案例的一个秘密高峰,有许多学习计划建议开设 ka ggle 帐户并参与内容,但是,它也可能代表每年进入数据科学的年轻新人的数量,进一步的分析可能是有帮助的。
对于两个样本;在尼日利亚和世界其他地方,排名前六的职位依次是“学生”、“数据科学家”、“数据分析师”、“软件工程师”、“目前未就业”和“其他”(未列出的数据或非数据职位)。
Kaggle 可以被描述为一个数据科学社区,有数据集、竞赛、笔记本和面向数据科学的课程,因此,我们可以说,这里可视化的所有职业都对数据科学感兴趣或从中受益。考虑到这一点,尼日利亚软件工程师的比例为 5.7%,而世界其他地区的比例几乎是 10.3%的两倍,这可能表明尼日利亚软件工程师对数据科学的兴趣较低,或者数据任务之间的分歧较大,这值得以后关注。
尼日利亚数据科学家的比例较高,而其他列出的数据科学角色的比例较低,这代表了数据科学领域尚未解决劳动力和工作角色的最佳分配问题,让个人单独从事端到端数据科学项目。值得注意的是,本次调查中第二大部分尼日利亚人认为目前失业,这是环境或行业的一个令人担忧的迹象。
文化程度
要在数据科学领域取得成功,需要大量的领域知识,以及对需要什么工具、为什么需要它们以及它们的应用的理解。这个领域的大部分工作描述包括教育要求,大多数时候是计算机科学或统计领域的研究生学位。
虽然对于自学者来说,已经经历过该过程的个人的流行例子是一种鼓励,但数据科学领域仍然需要大量的教育基础。
截图【谷歌搜索尼日利亚数据科学职位列表】
截图【数据科学工作确实求职】
教育水平比较
尼日利亚受访者被认为拥有学士学位的比例较高,其次是硕士学位,而世界其他地区的情况正好相反,因为硕士学位毕业生是最大的群体。
总体而言,尼日利亚学士学位比例超过 50%,在传统大学教育(学士、硕士、博士)方面略胜世界其他国家。然而,当只考虑研究生学习时,这一领先优势就丧失了。
此外,高中毕业后没有接受过正规教育的人比例较低,这可能表明此类个人在数据科学领域学习/工作的机会低于平均水平,或者表明更有效的联邦学校计划,甚至是文化压力为什么尼日利亚人是美国受教育程度最高的(移民)群体
回到我们之前关于“学生”是 Kaggle 人群中很大一部分的观点。进一步将工作角色类别与各种教育水平联系起来将是有益的,以便深入学生群体,调查他们是哪个教育水平的学生,以及其他见解。
教育水平与职业(尼日利亚)
从绘制的热图中,我们可以看到,尼日利亚学士学位持有者的比例很高,在所有列出的工作岗位中,有 50%或更多的人拥有学士学位,只有少数例外。看看这些例外情况,DBA/数据库工程师职位只有一名尼日利亚受访者,但他们拥有硕士学位,数据工程师、研究科学家和统计学家职位的硕士学位都多于学士学位以及“其他”类别。
调查这一阴谋表明,尼日利亚学生 Kagglers 大多是在学校获得学士学位,让我们看看这是否是相同的世界其他地方。
教育水平与职业水平(世界其他地区)
如前所述,在世界其他地区,硕士学位的范围更广,他们在所有工作岗位上都占主导地位,除了失业者、软件工程师和学生,他们拥有更多学士学位,以及研究科学家角色,他们大多拥有博士学位(59%)。
比较两个地块和它们的人口,很大比例的研究科学家拥有研究生学位,突出了该角色的高等教育或技术基础。
有了对我们大多数 30 岁以下男性的更好了解,有很大比例的学士学位学生,尼日利亚样本,我们可以继续了解他们对数据科学的兴趣,他们使用了什么工具,他们在哪里学习和消费数据科学内容。
首先,我们探索他们在编码或编程和机器学习方面的经验。
多年的编码比较
由于两个样本都有相对年轻的个体,如前所述,这里的大多数 Kagglers 有 5 年或更少的编码经验就不足为奇了。
尼日利亚样本显示了从一年内开始编程的相对新手到拥有长达 10 年或更长经验的个人的几乎线性的递减过程,比较两个图,我们看到样本中没有尼日利亚个人拥有 20 年以上的经验。
ML 体验对比
机器学习是数据科学的重要组成部分,具有广泛的现实应用。对于我们的调查样本,很大比例的参与者在该主题上只有不到一年的经验。
虽然在百分比比例上存在差异,但在排名上几乎没有差异,因为再次出现了几乎线性的进展,从大部分初学者开始,随着经验的增加而减少。同样,尼日利亚的样本中没有 20 岁以上的人。
数据科学工具
随着对数据驱动的决策和创新需求的增长,数据科学和数据分析领域取得了很大进步。这推动了许多有助于丰富流程的工具的流行和重要性。然而,有很多个人偏好,公司也有使用哪些工具的标准。
在这里,我们来看看其中的一些偏好。
语言偏好比较
Python 的流行仍在继续,SQL 远远落后,这两种编程语言都是大多数数据相关角色使用的主要数据。JavaScript 排名可能指向我们的参与者,尤其是软件工程师的一些网络经验。在我们的世界其他地方的例子中,JavaScript 用户的比例较小,前三名分别是 Python、SQL 和 r。
ML 首选项比较
Scikit-learn 是我们在这两个示例中最受欢迎的框架。自 2007 年首次发布以来,机器学习库一直是数据科学中的一个重要组成部分,它具有初学者友好的方法和针对不同用例的广泛功能。谷歌的张量流在这两个样本中排名第二。比较这两个图,我们的第一个偏差是 Keras 的排名,Keras 经常被用作深度学习的张量流的伴侣。在尼日利亚的样本中,脸书的 PyTorch 并没有排在前五名。
工具首选项比较
尽管有一些软件包吹嘘自己的预测建模能力,但对于数据科学角色来说,用大多数语言编程在建模过程中提供了更大的灵活性。考虑到这一点,看到编程开发应用程序是两个样本中最受欢迎的分析工具就不足为奇了。像 Excel 这样的基本统计软件包通常是个人对“数据”的第一印象,在许多公司中,这些工具仍然是结构化数据的第一接触,随着数据空间的增长,该工具已经有了许多改进,使其能够保持竞争优势。
基于云的软件仍然需要一些改进来迎合大众的口味,尤其是在尼日利亚。尽管大数据的主要吸引力在于更容易管理,但它们满足了尚未普遍实现的需求。
数据科学学习和内容消费
在这里,我们调查参与者如何学习和获取数据科学领域的最新信息。
学习偏好比较
当查看数据科学学习发生的学习平台时,我们看到 Coursera 在两个样本中的比例都高于所有参与者,这可能是对他们在不同主题上的大型课程库以及免费“审核”大多数课程的能力的认可。Udemy 和 Kaggle learn 课程紧随其后,在两个示例中的顺序不同。
比较这两个图,在世界其他地区的样本中,大学课程在前 5 名的存在可能表明了以数据科学为目标的研究生课程的可用性,而尼日利亚的学位只能与统计、数学或计算机科学课程相邻。
内容偏好比较
我们的前 4 名排名在两个样本中相同,百分比相似,突出了这些平台在数据科学相关内容中的突出地位;Kaggle,Youtube,博客和 Twitter。
尼日利亚参与者发现关于数据科学的期刊出版物不如他们的同龄人有用,他们更喜欢时事通讯、Slack 社区和课程论坛。
公共平台首选项
数据科学空间可以是一个畅所欲言的空间,有许多“影响者”,但也有许多人每天分享他们的所作所为或所学。在这里,我们看一下公开分享工作以供他人查看的流行平台。
GitHub 和 Kaggle 在两个样本中都名列前三,GitHub 在编程/开发领域的突出地位对该领域的任何人来说都是显而易见的,因为即使没有允许高效团队合作的出色版本控制功能,它也是建立个人或开源项目组合的绝佳场所。
Kaggle 也是一个展示数据科学人才的好地方,因为公共竞赛或独特的数据集推动了大量人口寻求学习、竞争或建立他们的数据科学肌肉。有相当多的人,特别是在“世界其他地区”的样本中,由于工作限制、个人偏好或其他原因,没有公开分享他们的工作。
值得注意的是,更多的尼日利亚参与者选择了 Streamlit 而不是 Shiny 和 Plotly Dash 作为他们的网络应用程序 dashboarding 需求,这一决定在世界其他地方的样本中是相反的。此外,没有尼日利亚参与者使用过 NBViewer,这是一种将 Jupyter 笔记本(来自 GitHub 或其他地方)呈现为网页的工具,以便于共享或嵌入,这种用例与其他替代品相比有点小众,因为它在世界其他地方的百分比很低。
公司
在这里,我们看看我们的参与者工作过的公司的结构(这一部分是为那些在公司工作的人过滤的),以及他们如何整体上使用机器学习和数据科学。
公司规模比较
我们的大多数参与者,尤其是尼日利亚的参与者,都在员工不足 50 人的公司工作。
比较这些图,我们看到在世界其他地区样本中第二大比例是 10,000 或更多员工的最高选项。这要么是假设这样的公司比预期的更普遍,要么是样本的人口统计数据在很大程度上影响了比例。
DS 团队规模比较
公司数据科学团队规模的前两项让我们看到了公司对数据科学的利用程度。此处显示的大部分公司的数据科学团队少于 3 人,下一个百分比排名是完全没有专门的数据科学团队的公司。
这意味着该公司根本不使用机器学习或数据科学,或者任何数据科学任务都由不完全致力于执行数据科学的公司成员来完成或承担。
在下一个情节中我们会看到更多。
ML 利用率比较
更多的尼日利亚企业在看比例时不使用机器学习方法。对比图表,这两个样本将“探索机器学习方法”或“根本没有使用它们”作为“你的雇主将机器学习方法纳入他们的业务吗?”。
很少有公司已经在尼日利亚生产了模型,这凸显了机器学习方法的利用不足。
在 DS 服务上花费的金额
两个样本中没有为数据科学(机器学习或云服务)付费或从未付费的人的比例相似。尼日利亚的曲线是线性下降的,大多数人都是零美元,我们在尼日利亚样本中至少见过两次这种关系,两次都与参与者的经历有关,所以我们可以暂时假设这个问题是相关的。随着越来越多的人开始学习,还有改进的空间。
为了总结我们的分析,我们来看看一些与数据科学相关的任务,看看有多少人认为数据科学在他们的日常工作中很重要。
DS 工作任务比较
两个样本中的大多数人都执行数据分析来影响业务决策。在排名任务中,尼日利亚人发现建立数据基础设施比任何机器学习任务都重要。比较这两个图,为机器学习的新应用建立原型在尼日利亚人的排名中接近底部,而在世界其他地方的排名中则是第二。
在尼日利亚样本中,也有更高比例的人表示所列任务不是他们工作角色的重要组成部分,为了探究这一论断,有必要将我们的人口统计数据联系起来,尤其是关于参与者职业的数据。
工作任务及其职业的交叉表(尼日利亚)
可以看出,分析任务对于大多数与数据相关的工作角色都很重要。产品/项目经理工作对其他与数据相关的工作任务的需求最高。统计师和其他未列出的数据角色是表示列出的数据相关任务对他们的工作不重要的人中比例最高的一些,软件工程师是另一个值得注意的人。
工作任务及其职业的交叉选项卡(世界其他地区)
本例中的数据工程师和 DBA/数据库工程师花费了大量的时间来构建数据基础设施,这是他们工作的一个重要部分。
比较这两个图,认为所列任务在其工作中不重要的统计学家的比例明显减少,该样本中的大多数参与者通过分析来影响商业决策,我们可以假设,接受调查的尼日利亚统计学家没有多少理由致力于影响商业决策,这可能是由于在教育或研究部门的就业。
结论
尼日利亚人口众多,虽然这通常是一个弱点,但它也可以是一个优势,有了前人的启发,有了帮助年轻人和老年人提高与众多数据科学相关的数据分析师、商业分析师和数学家技能的计划的支持。随着对知识和经验的需求增加,Kaggle 平台上的人数将继续达到峰值。
对于数据科学方法的利用不足,“底线正在上升”,随着数据科学角色的更多空缺,需要了解它们给系统带来的影响,反之亦然,因为这是一个循环,将导致数据科学、其工具和原则的采用。
参考
- 尼日利亚数据科学的谷歌趋势,2015–2020。(2020).检索自https://trends.google.com/trends/explore?date=today%205-y&geo = NG&q = % 2Fm % 2f 0jt 3 _ Q3
- 中情局关于尼日利亚的实况报道。(2020).从 https://www.cia.gov/the-world-factbook/countries/nigeria/取回
- 谷歌搜索尼日利亚数据科学家的工作。(2021).检索自网站。作者截图。
- 确实搜索数据科学家的工作。(2021).从https://www.indeed.com/jobs?q=Data%20Scientist&vjk = D2 B1 AFB 5d 21692 a 2中检索。作者截图。
- 关于尼日利亚移民的 Quora 问题。(2020).检索自https://www . quora . com/Why-Nigerians 是美国受教育程度最高的群体。
感谢阅读!
热情的新手掌握数据科学的路线图
数据科学学习指南
帮助您掌握数据科学的有用提示和资源
由 Lukas Medvedevas 在 Unsplash 拍摄
简介
有这么多的路要走,数据科学新手可能会很快不知所措。你可能会发现自己不知道下一步应该做什么,或者应该从哪里开始。
在这篇文章中,我整理了一个路线图,为你提供一些指导。这是基于我过去几年的精通之旅(顺便说一句,它永远不会结束!).我已经把我的方法系统化了,想和你分享,希望能帮你避开我遇到的坑坑洼洼。
这是给谁的?
这篇文章是写给任何热衷于进入数据科学并掌握这门学科的人的。然而,我想补充一点小小的警告。如果是非技术出身,那就要更加努力了。关于它没有两种方法。许多技术人员认为他们多年来学到的东西都是理所当然的。你没有这种奢侈,但即使如此,你成为大师也是非常可能的。
这条路并不容易,但是从来没有这样一个技术领域如此容易被大众接触到,有如此多的资源可供自学。你需要的只是激情、纪律和计划。
学习哲学
根据我的经验,一条高效的精通之路是采取五管齐下的方法。
阅读、倾听、构建和交流。
📚阅读:在合适的时间读合适的书是避免变得不知所措的关键。不要直接跳进深水区,而是从浅水区慢慢地漂进去。你将开始喜欢阅读数据科学书籍,并积累一个图书馆来帮助你完成任何项目。
👂听着:对于任何难以实现的目标,你都需要一些灵感。对我来说,我听过的许多播客确实启发了我。你不会从播客中获得大量的技术细节,但你会成为一名更全面的数据科学家。在了解该领域当前问题的同时,您自然会掌握数据科学术语。
🔧🔨打造:弄脏自己的手。做项目…很多项目。失败,从错误中学习,获得反馈,适应。如果不弄脏自己的手,你将一事无成,所以不要害怕陷入项目中。通过应用我的知识,我学到了最多。
📢**沟通:**良好的沟通能力通常是普通数据科学家与伟大数据科学家的区别。找到一个听众,交流你学到的东西,无论是通过写作还是演讲。交流新想法是强化新想法的一个好方法。它会迫使你用自己的话重新编码你所学的信息。如果你能正确对待这件事,你将会一举两得:建立你的品牌,同时学习新的概念。
👨👩👧👦网络:最终,你希望掌握这个领域,这样你就能找到工作;网络是关键。加入讨论组,创建 LinkedIn 个人资料,参加活动。把自己放在舒适区之外,掌握数据科学的道路需要你在途中遇到一些人。
路标
你应该把这篇文章作为有用的数据科学资源和材料的链接库。我花时间为你组织这些课程,帮助你从新手成长为大师。没有捷径可走,但只要投入并遵循系统,我保证你会成为大师。
请记住,数据科学在不断发展,因此学习永无止境。路线图系统会向你灌输你需要的学习习惯。
⭐Bonus 提示
1)采取并联方式,避免串联操作。这是我给你的最好的建议。不要等到你已经巩固了所有的理论之后才开始你的第一个项目,阅读和构建同时进行。像这样工作,你会大大减少你的学习时间。
2)计划你的时间——制定一个学习时间表,并坚持下去。每天几个小时应该足够了。
作者图片:您的数据科学路线图
🙈新手
您刚刚开始您的数据科学之旅,因此夯实基础非常重要。你需要数据科学工具的工作知识,对统计学、数学和机器学习的理解。
在线课程
这些课程将为您提供开始有效使用数据科学工具所需的知识。所有课程免费学习。
Python —掌握所有 Python 基础知识,包括函数、循环、数据结构等等。Python 是解决数据科学问题的最佳工具之一,你会很高兴花时间学习它。如果你是计算机编程新手,不用担心,Python 被设计得很容易掌握。耐心和对学习的承诺是所需要的。
SQL —可以说是处理结构化数据的最重要的工具。有很多分析和机器学习是在结构化数据集上完成的。如果你想有所成就,就要熟悉 SQL。
Pandas——python 中处理结构化数据的另一个非常有用的工具。你会想要掌握这个。
机器学习 —在此获得如何识别和解决机器学习问题的基础知识。这门课程会给你足够的见识,让你开始解决自己的问题。
介绍性文本
我提供了免费在线资源和(非免费)书籍的混合体。不要因为一些书的价格而却步,把它们看作是对自己的投资,从长远来看会有回报的。
**统计:**坚实的统计基础将大有裨益。
如果你想阅读一些浅显但内容丰富的统计资料,可以从大卫·斯皮格尔哈特的《统计的艺术》开始。
这本书充满了应用统计学专家的实用见解。作为一名专业统计学家,大卫很好地吸引了读者的注意力。
数据科学&机器学习:
安德烈·布尔科夫 的百页机器学习书,是初学者的必备读物。安德烈不仅涵盖了 ML 所需的基本数学,他还简明扼要地概述了许多重要的机器学习模型。
福斯特教务长汤姆·福西特的《商业数据科学》是一本很好的初学者指南,可以帮助你从数据科学的角度来看待商业问题。商业问题通常是混乱的,在这本书里你会得到处理这些问题的实用技巧。
凯茜·奥尼尔 的《数学毁灭的武器》是一本围绕人工智能和伦理提出重要考虑的优秀书籍。它将把你的视野从人工智能扩展到它影响的社区。
电脑编程:
😃所有这些资源都是免费的!
Select Star SQL —一本优秀的交互式书籍,适合绝对的初学者,让他们充分了解 SQL 的强大功能。作者假设很少或没有编码或计算机编程经验。
用 Python 自动化枯燥的东西,作者 Al Sweigart——不是数据科学专用的,但仍然有用。我不推荐从头到尾阅读这篇文章,但是,它可以作为你在项目中想要完成的任务的参考。
播客
莱克斯·弗里德曼的人工智能播客——莱克斯深入探讨人工智能更具哲学意义的领域,启发观众进行更深入的思考。他招待过很多不可思议的客人,比如埃隆·马斯克和吴恩达。
凯西·科济尔科夫——凯西是谷歌决策情报主管。她制作了一些技术性的短片,希望向听众灌输良好的数据科学基础知识和最佳实践。
❤️If 你知道任何其他伟大的播客,请留下评论!
🤔中级****
在这个阶段,你应该对自己的能力更有信心。你可能会对 SQL、Python 有所了解,并有坚实的理论基础。你可以开始阅读一些更高级的文本,接触一些项目,寻找数据科学社区。
Kaggle 比赛
Kaggle 是数据科学家最好的免费学习资源之一。他们举办比赛,让你测试你的技能,并建立在你的机器学习知识。
这些比赛的伟大之处在于反馈的能力。你被排在其他参赛者的前面,这给了你一个掌握水平的概念。你也开始建立一个工作组合,向潜在雇主展示你的热情和承诺。
这里有三个我认为你应该尝试的竞赛
《泰坦尼克号》(入门级)——你的任务是预测泰坦尼克号上乘客生还的可能性。这确实是一个入门级的分类任务,非常适合第一个项目。享受其中的乐趣,不要害怕发布你的结果,你总是可以提高你的分数!
高级回归技术(中级) —给你一组房屋数据,你的任务是建立一个机器学习模型来预测它们的销售价格。这不是一项容易的任务,但是在数据清理和高级回归技术方面有一些有价值的经验。
作为对你的进一步指导,我写了一个关于这个问题 的 解决方案,看看你是否能在我的基础上有所改进。
高级(数字识别器) —这是计算机视觉中的一个任务。你将需要建立一个数字识别器使用 MNIST 手写数字数据集。我发现这个任务真的帮助我理解了神经网络和深度学习的力量。
查看我在 计算机视觉 上做的项目,寻求指导。
中间文本
中间文本比介绍性文本更详细一些。他们专注于为您提供一个代码库,帮助您在完成项目时制定自己的解决方案。这些是你的数据科学手册。
用 Scikit-Learn,Keras & TensorFlow 作者 Aurelien Geron——我认为这无疑是你会买到的关于机器学习的最佳书籍之一。这里有许多实用的编码示例,将有助于您的数据科学项目和竞赛。帮你自己一个忙,买一本或者借一本这本书。
深度学习用 Python 作者 Francois Chollet——由深度学习用 Python 中的框架 Keras 的创建者编写。您将获得构建自己的深度学习解决方案所需的理论介绍和实践知识。
社区
在这个阶段,我强烈建议你找一个数据科学社区,并加入其中。加入一个社区是扩展你人际网络的好方法。
⚡️ 专业提示 : Meetup 是一种寻找数据科学社区和网络的绝佳方式。 开户,自己探索。
我定期参加 数据科学的艺术家 见面会 ups。这是一个由全球数据科学爱好者组成的令人惊叹的社区。你会发现来自不同背景的人有很多见解可以分享。
他们有休闲频道、播客、脸书和 LinkedIn 页面,你可以加入并关注。看看他们!
🎓主人****
如果你坚持下去,你至少会了解自己两件事。你比你最初认为的更有能力,而且你真的对数据科学充满热情。
精通不同于其他两个阶段。这是一个持续的过程,需要终生致力于学习。我将尝试给你一个旅程的起点。
✏️Write 博客帖子
学习的最好方法之一是通过教别人。一旦你有了一些项目,为什么不开始写作来帮助别人呢?它将通过要求你在一个主题上构建你的思想,并迫使你弥补知识缺乏的空白,来强化你的知识。
有许多媒体上的出版物你可以申请写作。不要害羞,把自己放出来。如果你真的很好,你甚至可以赚点钱。
⭐ 专业书籍
这里是我们要深入的地方,这些书不适合胆小的人(从这里开始只限爱好者)。
你在寻找精通,这些是你会回来反复参考的书。你将利用这些来寻找最困难问题的答案。
深度学习——伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔 。这是该领域一些顶级研究人员撰写的深度学习书籍中的精华。它有大量的数学证明来指导你理解任何深度学习算法下发生的事情。
这本书的伟大之处在于它可以在网上免费获得!
罗恩·科哈维、黛安·唐&徐亚 可信的在线控制实验——实验是数据科学中不被重视的一部分。在商业环境中设计可信的实验并不是一项容易培养的技能。在线实验的所有错综复杂之处都由作者在本书中提出,他们是该领域的世界领先专家。
💁可选** : 谷歌云平台上的数据科学——作者 Valliappa Lakshmanan 。云计算平台极大地简化了构建端到端机器学习解决方案的过程,将数据科学家和数据工程师的角色结合在一起。见我关于这个的文章**
通过掌握一些云技能,你或许可以为自己开辟一片天地。这是可选的,因为不是所有的组织都使用谷歌的云平台,有些使用微软 azure 或 AWS。无论您选择什么平台,了解云计算,它会一直存在。
💰自主项目
这就是你的创造力发挥的地方。在这个阶段,你应该开始看到别人可能看不到的数据机会。
例如,也许有一个工作过程可以通过机器学习来自动化。开始吧,做一个原型,然后把它推销给你的老板。自我指导项目的美妙之处在于,你从头到尾做每一件事,从构思问题到创造解决方案。支持自己,完成它!
🔥开源代码库
创建一个 GitHub 帐户,并开始在 GitHub 存储库中存储您的所有项目。GitHub 不仅有助于协作和版本控制,它还充当了您希望在后续项目中再次访问的代码的存储库。
⚡️:这是展示你作品组合的好方法。
📈研究论文
这个领域是不断发展的,你可能会发现你的问题的解决方案在你读过的书中没有涉及到,因为你正在研究一些前沿的东西。这就是研究论文派上用场的地方。它们的生产速度通常比书籍快,并且涵盖了该领域的最新技术。这是真正为非常先进的。
最后的想法
就个人而言,我对这个领域研究得越多,我就越有激情。会有一些你感到不知所措的黑暗时期,但是记住那些是你成长最多的时期。
成为这个领域的一部分是如此值得的原因之一是它需要很多艰苦的工作。当你看到自己手中掌握着解决问题和设计解决方案的力量时,你会感激自己坚持了下来。
🌈记住这个路线图,回头看看这篇文章,给后面的人留下反馈和建议。我很想听听你从新手到高手的旅程进展如何。
❤️Thank 你!