TowardsDataScience 博客中文翻译 2021(六百三十一)
每一个将 ML 集成到其产品/平台中的数据驱动型组织都使用 ML 管道来简化其演进模型的开发和部署以及新数据的引入。简而言之,ML 管道是将 ML 模型从实验性的 Jupyter 笔记本(或 Google Colab)转移到生产中的健壮应用程序的一系列任务。项目越大,就越难建立处理规模的整个过程,这导致了一个新的工程学科叫做 MLOps。现在,这些任务是什么,以及可以使用什么工具来构建这些健壮的生
使用 Python 实现多重共线性
了解 Python 的特性如何帮助轻松处理这个 8 音节谜
照片由 Pexels 的 olia danilevich 拍摄
多重共线性对许多人来说可能是个谜。
在一些研究中,它被直接提出,而在另一些研究中,它被完全忽略,没有任何解释。
在这里,我将给出多重共线性的简要概述,并演示 Python 的包是如何让这个障碍变得如此容易克服的。
多重共线性
多重共线性描述的是研究中使用的独立变量之间表现出强烈关系的状态。
这在很多情况下会造成问题,因为你通常希望你的自变量是…独立的。
根据项目的目标和范围,识别和解决任何多重共线性的迹象可能是值得的。
检测多重共线性
自然,我们不能仅仅通过直觉简单地评估两个特征是否有显著的关系,尤其是当许多数据集拥有几十个特征时。
以下是用于检测多重共线性的两种常用评估指标。
1.相关系数
皮尔逊相关系数指标直接评估两个变量之间的关系强度。它的值介于-1 和 1 之间。
相关系数的大小表示关系的强度,较高的值对应于较强的关系。
通过计算预测要素对之间的相关系数,可以识别可能导致多重共线性的要素。
2.方差膨胀因子
测量多重共线性的第二个指标是方差膨胀因子(VIF)。VIF 直接测量整个模型的方差与仅包含相关要素的模型的方差之比。
通俗地说,它衡量一个要素的包含对模型中要素系数的总体方差的贡献程度。
VIF 为 1 表示该要素与任何其他要素都不相关。
通常,超过 5 或 10 的 VIF 值被认为太高。任何具有此类 VIF 值的要素都可能导致多重共线性。
多重共线性有关系吗?
来自 Pexels 的 Anna Shvets 的照片
这个问题是否值得考虑是值得决定的。
首先,多重共线性对模型的预测能力没有太大影响。你可能注意到了,很多机器学习任务都没有提到。
也就是说,多重共线性对于那些希望构建模型以更深入了解预测要素本质的人来说非常重要。
如果不检查多重共线性,它会提高系数估计的方差,从而导致更大的置信区间。这使得从任何后续分析中获得具有统计学意义的结果更加困难。
简而言之,多重共线性可能不会干扰模型性能,但会对用于构建模型的预测因子的解释产生负面影响。
个案研究
本演示将展示使用 Python 的包(即 pandas 和 statsmodels)来检测和解决多重共线性是多么容易。
在这个案例研究中,我们使用了一个提供汽车信息的数据集(无版权)。数据集可以在访问。
代码输出(由作者创建)
目标特征将是‘价格 _ 以千计’。
执行简单的数据清理程序(例如,从日期列中移除缺失值并提取年、月、日值)后,我们可以在预测值中搜索多重共线性的迹象。
计算相关系数
让我们从计算每对特征的相关系数值开始。
幸运的是,pandas 模块提供了 corr()函数,这使得这项任务变得很容易。
我们可以通过热图将导出的值可视化。
注意:在这种情况下,我们假设任何相关系数超过 0.80 的要素都可能导致多重共线性。
代码输出(由作者创建)
从热图中,我们可以发现以下两者之间的密切关系:
- 功率因数和马力
- 燃油效率和发动机尺寸
- 燃油效率和整备质量
- 燃料效率和燃料容量
但我们将何去何从?我们是否消除了所有这些特征来开发总体差异更小的模型?
答案是否定的。
任意删除特性会冒删除太多重要信息的风险,这对您构建可靠模型的努力是有害的。
计算 VIF
这是计算所有先前确定的要素的 VIF 值的机会。
statsmodels 包包含一个函数,可用于直接计算所有要素的 VIF 值。因为我们可能需要多次计算要素的 VIF,所以让我们创建一个名为“compute_vif”的函数来执行此任务。
注:在这种情况下,大于或等于 5 的 VIF 将被视为过大。
之后,我们可以应用这个函数来计算与其他变量高度相关的变量的 VIF 值。
代码输出(由作者创建)
如表中所示,“马力”、“功率性能系数”、“发动机尺寸”和“整备质量”的 VIF 值都超过 5。
同样,新手的错误是一次删除所有功能。通常,通过一次包含或删除一个特征来执行特征选择是最好的。这可确保将任何信息损失降至最低。
去除“马力”(即具有最高 VIF 的特征)后,我们再次计算 VIF 值。
代码输出(由作者创建)
接下来,删除“引擎大小”并再次计算 VIF 值。
代码输出(由作者创建)
既然方差膨胀因子都在可接受的范围内,那么衍生模型将更有可能产生具有统计显著性的结果。
对预测性能的影响
我之前说过多重共线性对模型的预测性能没有什么影响。
让我们通过创建两个线性回归模型来验证这一点。一个在没有任何特征选择的情况下被训练,一个在特征选择之后被训练。
两个模型都用均方误差度量进行评估。
代码输出(由作者创建)
如输出所示,均方误差值的差异极小,表明移除高度相关变量对模型性能的影响可以忽略不计。
对特征评估的影响
现在,让我们看看特征选择如何影响模型对预测者特征重要性的评估。
代码输出(由作者创建)
从表中可以看出,删除这两个特征会导致某些变量的特征重要性分数发生很大变化。
结论
照片由 Unsplash 上的 Prateek Katyal 拍摄
希望这篇综述已经澄清了您对多重共线性的任何疑问。
对于那些专门使用数据进行调查的人来说,理解这个概念很重要,因为它会对你的调查结果的可靠性产生重大影响。
令人欣慰的是,Python 的包使得规避多重共线性变得很容易。
我祝你在数据科学的努力中好运!
参考
- Bhatia,G. (2017)。汽车销售,第 1 版。2021 年 12 月 5 日从 https://www.kaggle.com/gagandeep16/car-sales.取回
利用提升建模瞄准正确的群体
建立一个提升模型,通过只瞄准有说服力的人来提高营销投资回报率
“我花在广告上的钱有一半都浪费了;问题是我不知道是哪一半。”
有很多例子表明,企业会采取行动试图影响客户的行为。这种营销行为的一些例子:
作者图片
然而,投入该行动的大部分预算最终都被浪费了。在本文中,我们将讨论这是为什么,以及如何在心态和方法上的简单改变可以帮助增加收入。
怎么会?当然是针对那些有说服力的人!谁是有说服力的,我们如何准确地锁定他们?请继续阅读,寻找答案。
提示:它包括建立一个提升模型!
当前现状
为了便于讨论,我们将重点关注为用户提供折扣以尝试让他们升级订阅的特定用例。我们讨论的方法比这更通用,适用于更广泛的问题,如客户流失管理、追加销售和交叉销售等。
业内解决此类问题的一个常见方法是建立一个预测模型来预测客户接受报价的倾向。这是一个很好的基础,但是我会告诉你为什么这还不够。
预测模型是如何使用的,有什么问题?
为了理解为什么预测模型是不够的,我们需要了解如何使用预测模型。通常,企业会构建一个模型来预测升级到高级订阅的倾向。然后,他们会根据模型按照升级倾向对所有客户进行排名,然后根据模型向排名前十分之一的客户提供折扣。
有什么问题?嗯,有几个。但最容易理解的问题是,这是对皈依者的说教。也就是说,你有很高的概率去瞄准那些无论如何都会升级的人。
潜在的问题是,这项活动的重点是那些很有可能接受这一提议的人。这是错误的重点。相反,企业应该关注那些升级倾向可以通过有针对性的优惠 得到提升的**!**
(更好的)机器学习解决方案
进入隆起建模。提升模型可以帮助企业瞄准正确的客户,减少浪费的广告。从提升建模中可以看出,客户分为四类:
- 确定的事情——不管有没有优惠,他们肯定会升级
- 失败原因 —它们不会升级
- 可说服的人——如果有优惠,他们会增加升级的机会
- 请勿打扰——他们讨厌各种形式的广告。这个群体也被称为睡狗。
作者图片
显然,人们应该把他们的营销努力集中在有说服力的东西上。但是,你如何识别可说服的人呢?我们可以使用数据科学来计算提升、 ,这是在收到报价的情况下升级倾向的增加。这种上升可以从历史数据中估算出来。使用升级价值并通过比较在收到优惠之前和之后升级订阅的倾向,可以将客户群划分为上述四个部分。
(更好的)机器学习方法的好处
提升模型允许将重点放在可说服的上,这将增加总收入,并降低一些营销成本。
采用提升建模通常代表着营销领域中任何机器学习努力的最高 ROI。从银行和电信行业的项目经验来看,根据具体的使用案例,应用提升模型已经导致收入增加 29%-59%,。
2 种隆起建模方法
有许多方法可以建立隆起模型。下面我们讨论两种简单的方法。
方法 1:两种模式方法
最简单的方法是使用传统的预测建模技术建立两个模型,即使用接受或不接受作为二元目标。诀窍是使用来自已经被广告的组的数据建立一个模型,并且使用来自还没有收到提议的组的数据建立另一个模型。实际上,你有一个治疗组和一个对照组。
你可以用这两个模型来计算每个顾客的购买概率,这样你就有了两个概率。一个概率是对客户何时被广告的估计,另一个概率是对他们何时没有被广告的估计。不同的是 隆起 。这是您可以用来将客户分成四组的分数。
一个客户的提升(得分差异)是积极的,有利于报价,被认为是可说服的。相比之下,负提价的客户被归类为请勿打扰。在这两个模型中得分都高的客户属于确定无疑的客户群,而在这两个模型中得分都低的客户属于失败原因客户群。
隆起建模的双模型方法(图片由作者提供)
方法 2:单一模型方法
与上面的双模型方法相比,单模型方法将对照组和治疗组的数据保存在一个数据集中。使用处理作为二进制标志特征(注意:不是目标标志,是*特征)*对数据拟合模型。当估计上升时,我们通过将处理设置为真和假并注意倾向预测中的差异来对相同的记录评分。根据方法 1 中建议的隆起进行分段。
使用这种方法,诸如逻辑回归之类的方法不太可能很好地工作,除非创建许多与其他特征的处理标志的交互项。然而,常见的基于树的方法(如 XGBoost)更适合这个问题,因为树结构避免了手动创建许多交互术语的需要。
隆起的一些数学方面
设 P1 是给定报价升级的概率,设 P2 是没有报价升级的概率。然后隆起 定义为 P1 — P2,范围为-1 到 1。在文献中,这有时被称为提升分数。
那么如何衡量一个抬升模型有多好呢?典型的措施是 QINI 和顶部十分位数隆起(加上十分位数隆起图)。
奇尼曲线类似于 GINI 曲线,常用于衡量二元预测模型的性能。然而,QINI 曲线也考虑了治疗组和对照组之间的人口差异。
需要注意的事项
在许多营销应用中,处于治疗组并不意味着接触广告是有效的。例如,提供在线广告并不意味着用户已经注意到了它。因此,根据应用程序的不同,你可能希望只保留那些为了建模目的而有效曝光过的人,也就是那些点击过广告的人。
另一个要考虑的因素是控制组的大小。你需要确保它足够大,能够进行统计测量。但你也需要确保不要在对照组(即无治疗组)留下太多顾客,因为如果活动有效,你会留下太多钱。
一个好的统计学家和数据科学家可以决定什么是足够大的样本。
来点技术!构建单模型提升的实用指南
我们将说明如何使用公开的 Criteo 在线广告数据集构建一个模型来执行提升建模。数据集可以从 Criteo AI 实验室下载,网址是:
Criteo 隆起预测数据集— Criteo AI 实验室 (Diemert 等人,2018 年)(1)
注:使用的数据集由 Criteo AI 实验室创建,并公开提供。Criteo是开源社区的公共机器学习数据集提供商。
挑战的前提是数据是从在线广告活动中收集的,他们将受众分为两组:
- 治疗组——向他们提供广告
- 控制组——不向他们提供广告
有十二个(匿名化的)特征,它们的名称从f0
到f11
不等。还有其他四列:
treatment
- 1/0 表示治疗组conversion
-是否发生转换visit
——是否有拜访发生exposure
-客户是否已有效接触到广告
我们将混合使用编程和 PI。交易所的人工智能&分析引擎进行建模。
一些数据准备
数据集中有 13,989,592 条记录。对数据集使用拼花格式有很多好处。其中最主要的是,默认情况下,Parquet 格式以压缩形式存储数据,这将 3gb 的 CSV 文件减少到大约 217MBs。这种大小的减少有助于避开数据上传的大小限制。
一旦将数据转换成 Parquet,就可以将它上传到 PI。交易所的平台,进行数据角力。
披露:我是 PI 的数据科学负责人。交换 。下一节是使用 PI 的快速演练。交易所的 AI &分析引擎 ,一个数据科学和机器学习平台,覆盖数据角力和模型建立步骤。请随意跟随下一节的步骤和截图,用一个 试用账号 的引擎。
人工智能和分析引擎上的数据争论
数据争论步骤:
- 创建目标—目标应该包含转换或访问。因为活动的目的是让用户访问促销网站或转化。
人工智能和分析引擎的屏幕截图
2.检查数据轮廓 —检查目标的分布
人工智能和分析引擎的屏幕截图
你可以看到目标的分布是不平衡的。下面是使用前 1000 行的计数。
3.过滤数据——因为 Criteo 数据集是关于在线广告的。让用户接触广告并不意味着广告是有效的。因此,我们希望在治疗组中已经有效暴露的用户上建立模型。
人工智能和分析引擎的屏幕截图
使用过滤行动作执行过滤。
4.采样数据——经过以上过滤后,对照组比治疗组多了多了很多记录。我们可以通过上述过滤后两组之间的比率对治疗组进行下采样。
人工智能和分析引擎的屏幕截图
我们现在可以最终确定数据,并使用数据集建立一个模型来预测target
。我们需要使用treatment
作为模型中的一个特征,因为为了计算提升,我们需要通过将treatment
分别设置为 1 和 0 来对记录进行两次评分。
这些数据现在可以用来构建模型了。
人工智能和分析引擎的屏幕截图
在 AI & Analytics 引擎上,只需选择创建一个新的应用程序,并选择target
作为目标列。在这一步中,训练-测试分割是为您处理的。
人工智能和分析引擎的屏幕截图
我们不希望使用conversion
或visit
或exposure
作为特征(原因很明显)。因此,让我们创建一个新的特性集来排除它们。
人工智能和分析引擎的屏幕截图
如上所述,除非您喜欢手动创建许多treatment
交互特性,否则您最好选择基于树的模型。我将选择使用 XGBoost 和 LightGBM 来构建模型。为了更加精确,我也将选择 XGBoost 的 GPU 版本。
人工智能和分析引擎的屏幕截图
让我们在模型性能比较屏幕中检查模型的性能。
对于具有高度不平衡目标的模型,我们应该使用 AUCROC 来评估模型性能,而不是使用准确性。
AUCROC 较高,为94.6–94.7。
然而,像 AUCROC 这样的模型度量对企业来说意义不大。我们应该将模型的性能与企业易于理解和采取行动的收入数字联系起来。为此,我们认识到在这种情况下推动成本和收入的两个方面。
为了便于讨论,让我们假设这些成本:
- 客户是否被有效曝光,曝光成本是 0.01 美元,因为提供在线广告相对便宜;
- 客户会转换或访问;让我们假设平均每个客户的转化或访问价值为 2 美元。
基于上述假设,我们可以构建以下成本/收入矩阵:
作者图片
根据上面的成本矩阵,我们可以写下每个客户的收入,其中 Prob (A | B)是给定 B 的概率,按照标准统计符号。
现在有两种选择,是否向客户做广告:
a.向客户做广告,成本/收入可以表示为:
- 让
P_c = Prob(convert or visit | Effective ad exposure) * ($2 - $0.01) + Prob(no convert nor visit | Effective ad exposure) * - $1
b.不要向客户做广告,成本/收入可以表示为:
- 让
P_n = Prob(convert or visit | not advertised to) * $2 + Prob(no convert or no visit | not advertised to) * $0
显然,如果 P_c > P_n 和 P_c > $0,我们应该选择向客户做广告。
注意有一个术语 *Prob(no convert or no visit | not advertised to) * $0*
意思是我们假设用户不转化就没有成本。然而,对于一些企业来说,客户可能会流失。客户流失的概率有时会受到用户是否被广告的影响。因此,企业通常会结合使用流失模型和提升模型来优化收入。但是,在此图中,我们将忽略变动的影响,因为本文的目的是说明提升建模。
我们可以计算P_c
和P_n.
我们需要计算这些概率
Prob(convert or visit | Effective ad exposure)
对于客户,通过将treatment
标志设置为 1,使用上述单模型提升模型;和Prob(no convert or visit | Effective ad exposure)
通过将treatment
标志设置为 0;
因此,我们需要对每个用户进行两次评分。
一旦你计算了概率,计算了每个客户的P_c
和P_n
,那么决定向谁做广告就很容易了。遗憾的是,我们无法使用该模型开展活动。但是,我们可以通过计算建模数据集中每个客户的max(P_n, P_c)
,将结果相加,并将其与P_n
之和进行比较,来估计模型的有效性。
通常情况下,我们通过计算 QINI 和十分位数图的上升并引用前十分位数的上升来评估模型。然而,我们还没有这样做,因为没有可以比较的基准。
根据我们的计算,我们发现,与没有营销活动相比,使用提升模型将导致收入大幅增长 46.4%。当然,里程可能会因企业的成本/收入矩阵而异。
使用人工智能和分析引擎构建电子商务业务的提升模型
使用 AI &分析引擎,我们将提升建模方法应用于一家电子商务企业,并设法将他们的广告活动收入提高了 47%以上。
该引擎确保以最少的努力遵循数据科学最佳实践。例如,我们将这种方法应用于公开可用的电子商务数据集,并实现了手动构建模型的8 倍性能(来源:Criteo upgrade 建模)。他们的性能是 0.01 QINI,我们在我们的平台上使用自动选择的模型实现了 0.08 QINI)。
这篇文章的研发,是由我和【ZJ】*的数据科学家 PI 研究员共同完成的。交换 。***
参考
- Diemert,e .、Betlei,a .、Renaudin,c .、& Massih-Reza,A. (2018)。隆起建模的大规模基准。2018 年 8 月 20 日在英国伦敦 KDD 举行的 AdKDD 和 TargetAd 研讨会上发表。ACM。
Apache Airflow 2.0 中的任务流 API 您应该使用它吗?
在重新设计气流数据管道之前,请三思
T askFlow API 是一个特性,它承诺了数据共享功能和一个简单的接口,用于在 Apache Airflow 2.0 中构建数据管道。它应该允许最终用户编写 Python 代码而不是气流代码。除了任务流之外,还有一个任务组功能,允许对数据管道的组件进行可视化分组。在回顾了那些特性之后,我不确定我是否应该把它们包括在新的气流版本的优缺点中。最后,我写了一篇完整的独立文章来解释为什么您应该批判性地思考您的数据工程问题,以及它们是否可以用这些抽象来解决。
**注意:**本文并不是对 TaskFlow 和 TaskGroup 特性的评论,而是在合适的用例中使用它们的指南。
目录
1。任务间共享数据的问题
2。气流 2.0 如何尝试解决任务间的数据共享问题
3。任务组
∘ 演示:结合任务流和任务组抽象
∘ 哇,看起来棒极了!我能用它做任何事情吗?
∘ 我对 TaskGroup
4 的固执己见的看法。任务流 API 的局限性
∘ 缺失包依赖管理
∘ XComs 本身就是一个局限
5 .讨论新气流的抽象概念
结论
1.任务间共享数据的问题是
设计数据管道时,我们需要在以下两者之间做出决定:
- 我们是否希望保持任务的原子性,即使用小的独立组件,
- 或者我们是否把它设计成一个单独的脚本。
然后,我们将使用一些工作流管理解决方案来安排这个数据管道。对于第一种方法,我们可能最终会编写一个包含几个单独任务的工作流,这些任务以最简单的形式定义如下:
作者图片
相比之下,使用第二种方法,我们最终将整个 ETL 视为一个单一的任务,可以通过将工作流作为 Bash 命令(理想情况下是在一个隔离的容器环境中)来调度:
python my_etl.py
您可能会注意到,使用第二种方法,您无法看到工作流的实际组件,如果它失败了,您不会立即知道问题的根本原因是什么,直到您更深入地研究日志。相比之下,要实现第一种方法,您必须能够以某种方式在任务之间传递数据,要么直接传递,要么将数据转储到某个临时位置,比如 S3。
到目前为止,Airflow 鼓励第二种方法,因为使用 XComs 在任务之间共享数据需要额外的工作。在TaskFlow
的帮助下,Airflow 2.0 提供了一个抽象出推和拉 XCom 值的特性,从而承诺以一种简单直观的方式在任务之间共享数据。让我们更仔细地看看。
2.Airflow 2.0 如何尝试解决任务间共享数据的问题
Airflow 2.0 提供了一个装饰器@task
,它在内部将任何 Python 函数转换成一个PythonOperator
。以这种方式创建的任务可以相互共享数据。如果你第一次听说这个功能,它似乎好得令人难以置信:
- 新的 Airflow 用户不再需要学习 Airflow 的特定运营商来构建他们的数据管道,
- 您最终可以将数据从一个任务传递到另一个任务,而不必编写任何繁琐的 XComs 逻辑。
然而,如果我们更仔细地观察这个特性,任务流抽象留下的问题比它回答的问题要多。
1。数据共享功能是如何工作的?
它利用了 XComs,即创建来在任务之间仅交换少量元数据的“交叉通信”抽象。这些数据被保存到一个没有 TTL(生存时间)或清理逻辑的关系数据库中。你可能认为这不应该是个问题,因为 Airflow 目前支持通过特定的后端类来指定定制的 XCom 后端(如 S3 或 GCS )。不过,对于 TaskFlow 的默认实现,您将所有返回值存储在元数据数据库中。
你或许可以想象,当一个没有经验的用户开始在任务间传递大对象,并很快达到数据库的存储容量时,甚至不知道他或她正在数据库中存储任何东西,因为TaskFlow
将它抽象掉了,这可能会适得其反。
总的来说,在数据库中存储 XComs 值本身没有任何问题,只要我们:
- 确保所有返回的对象都可以存储在关系数据库中(),也就是说,那些返回值是可序列化的,并且不超过数据类型限制。对于 Postgres,它是一个 1GB 的 BLOB ),
- 确保这样做的进程或用户是可信的(,即被授权将任意二进制大对象存储到数据库),
- 实现一些常规过程来自动删除旧条目,
- 监控数据库存储容量。
2。任何 Python 对象都可以作为返回值吗?
快速回答:不。默认情况下,只有 JSON 可序列化的对象可以与任务流语法一起使用。这意味着,如果您希望在任务之间传递 Pandas 数据帧,您需要为此使用适当的抽象。根据 Polidea [2],你可以通过在 XCom 后端类中实现一个serialize
和deserialize
方法来解决这个问题。坏处(写的时候):需要自己去实现。好处:一旦正确实现了这一点,您的任务流任务就有可能返回和共享您想要的任何 Python 对象,只要您的(反)序列化方法允许这样做。
3。你能把用任务流语法定义的任务和传统的气流操作符混合起来吗?
这似乎是可能的。您必须验证返回值,并注意如何定义任务的顺序,例如,通过任务流语法在彼此之间传递数据的任务可以通过共享函数调用的返回值来简单地定义它们的依赖关系,例如:
data = extract_task()
transformed_data = transform_task(data)
然后,为了将这些“装饰”任务与利用 Airflow 操作符的任务结合起来,我们可以使用set_upstream
命令。
下面的 DAG 演示了一个例子,在这个例子中,我们可以使用简单的(修饰的)函数以自然的“Pythonic 式”方式定义 ETL 逻辑,同时确保我们最终将数据加载到 S3。一旦完成,我们可以使用一个标准的气流操作符从 S3 到红移加载相同的数据。
作者图片
这是它在用户界面中的样子:
混合使用任务流和运算符语法定义的任务-按作者分类的图像
4。当您希望在任务流中使用特定的 Python 包时,或者如果您事先不知道在任务之间共享的数据的大小,会发生什么情况呢?
此时,我们达到了新引入功能的真正极限。如果 DAG“A”需要不同于 DAG“B”的 Python 包版本,会发生什么情况?或者,如果返回的 XCom 值不能被推入并写入数据库,会发生什么情况?如果您事先不知道您将在任务之间传递的数据是否适合数据库中的 1GB BLOB 对象,该怎么办?当前的实现在这些场景中似乎不太好。本文的最后一节讨论了这一点的含义。
3.任务组
除了 TaskFlow API 之外,Airflow 2.0 还提供了一种抽象,允许将一组任务视为 DAG 中的一个任务。TaskGroup 的实现是由许多数据工程师在使用子标记时遇到的低效和错误所激发的。
演示:将任务流与任务组抽象相结合
您可以将 TaskFlow 和 TaskGroup 抽象结合起来,以一种非常方便和简单的方式构建您的数据管道。要演示 TaskFlow 如何与 TaskGroup 结合,请看下面的 DAG 示例。
此工作流程的图形表示:
作者图片
TaskGroup 允许我们通过单击来展开和折叠任何任务组:
作者图片
哇,看起来太棒了!我能用它做任何事情吗?
没那么快。即使任务分组在用户界面上看起来很棒,也不一定是将所有相关的数据管道合并到一个“Monster-DAG”中的最佳想法,在这个“Monster-DAG”中,我们将所有内容合并在一起,并希望“collapse”按钮在各个子组件之间提供足够的隔离。
TaskGroup 仅提供任务的可视化分组。
许多数据工程师希望在他们的数据管道设计中实现关注点分离。例如,我们可能需要来自几个不同系统的各种数据源,以最终构建一个数据集市“销售”。这可能涉及来自各种营销 API、ERP 系统、商店系统等等的数据。我们不一定要将通向这个数据集市的所有(可能是数百个)步骤包含在一个数据管道中,因为这种单一的“怪物”管道方法可能会导致维护的混乱,并且不可能在需要时只运行单个子组件。
将与特定业务流程相关的数据管道视为乐高积木是有益的,这些积木是可以由不同的工程师分别编写和维护的独立组件,然后组合成一个主(父)数据管道,以便以正确的顺序触发独立的小组件,从而确保满足数据依赖性。
为什么这样的数据依赖很重要?在成功完成所有必需的临时区域步骤(原始数据)之前,您不想开始运行业务逻辑表的 ETL。如今,许多公司都面临着数据孤岛,从所有相关来源提取和接收单一用例的原始数据本身就可以被视为一个复杂的工作流。
我对任务组的看法
我不认为 TaskGroup 是一个最终的解决方案,它将使数据工程师停止考虑更好的方法来将他们的工作流彼此分离。它在用户界面上看起来很好,但是仅仅视觉上对任务进行分组并不能解决关于各个数据管道之间关注点分离的问题。如果您只想不按计划运行特定的任务组,该怎么办?Afaik,它不起作用—您必须运行整个 DAG。
气流 PMC 成员 Jarek Potiuk 推荐的一个解决方案是根据 DRY 原理构建单个组件,并在需要时将它们导入到几个 Dag 中。例如,如果您有一个导出 Google Ads 数据的任务,您可以构建它一次,并在两种情况下使用它:1)在一个独立的 DAG 中,以及 2)在一个“数据集市销售”DAG 中,Google Ads 是它的依赖项之一。这给了你避免代码重复的优势,并且能够独立地或者作为更大的数据管道的一部分触发这个 ETL。缺点是你是复制工作流逻辑。有了这个解决方案,您不再需要在一个地方保存关于特定任务执行的元数据。此外,如果这种重复的工作流逻辑没有遵循代码中的 DRY 原则,那么维护它会变得更具挑战性,从而带来更大的问题(如果在独立版本中更改了某些内容,而不是在更大的管道(如“数据集市”DAG )中进行更改,则会产生潜在的冲突)。
我在下面的文章中详细讨论了这个问题和可能的解决方案:
你可以在上面链接的文章的评论部分找到我和 Jarek Potiuk 的讨论。
4.任务流 API 的局限性
缺少包依赖关系管理
只有当每个人都同意在所有数据管道中永远使用相同的包版本时,任务流抽象才能工作。在我看来,这种天真的假设已经使 TaskFlow 尚未为任何严重的生产工作负载做好准备,因为它可能会鼓励不良的工程实践,并在以后需要在不破坏以前编写的数据管道的情况下升级某些包时增加做出更改的难度。
当然,有一些方法可以实现它,但是它们都需要做出重大的妥协。如果您真的想使用 TaskFlow,您的团队可能需要就将安装在气流环境中的特定包版本达成一致。然后,您必须坚持使用它们,以防止将来对环境的更改会破坏以前编写的工作流。
另一个解决方法是同意总是使用低级别的 Python 模块,而不是高级别的包。例如,不用用pandas
读取 CSV 文件,可以用本机csv
模块来完成,从而减少对外部包的依赖。
所有这些变通办法似乎都非常不切实际,如果不是不可能的话。如果在某个时候你需要某个包的升级版本,你将不得不使用DockerOperator
、PythonVirtualenvOperator
或KubernetesPodOperator
而不是任务流语法,因为任务流抽象只预期一条“快乐的路径”,其中所有的数据管道都有完全相同的需求,并且推送的 XComs 写入关系数据库总是成功的。但是在这一点上,你可能会问自己这样的抽象是否没有挫败工作流管理解决方案的目的。如果我们能保证一个快乐的路径,我们并不真的需要一个平台来管理工作流。
XComs 本身就是一种限制
另一个限制是 TaskFlow API 建立在 xcom 之上,xcom 不提供真正的数据共享功能,而是提供一个抽象,只在任务之间共享少量元数据。天文学家的客户培训主管马克·兰伯特一直在教成千上万的人如何使用气流,他说:
“Airflow 是一个编排器,而不是一个数据处理框架。如果你想通过气流处理千兆字节的数据,使用 Spark 及其带来的所有优化。”[4]
同样,GoDataDriven 的气流顾问在一本关于气流的书中写道:
" XComs 在任务之间添加了一个隐藏的依赖关系,因为拉取任务对推取所需值的任务有一个隐含的依赖关系。[……]当在不同的 Dag 或执行日期之间共享 XCom 值时,这些隐藏的依赖关系变得更加复杂,因此这也是不建议遵循的做法。”[5]
鉴于许多具有深入的气流专业知识的人说我们不应该使用气流来构建数据流(,即数据从一个任务传递到另一个任务的工作流),并且 XComs 不是实现这一点的推荐做法,为什么气流 2.0 发布了基于此的任务流 API ?只是为了迷惑用户,给他们提供一个只能解决部分问题的抽象,并且在幕后利用另一个底层的抽象,而这个抽象并不能可靠地解决问题?
5.关于新气流抽象的讨论
这可能不是真的,但我的印象是,TaskFlow 和 TaskGroup 特性似乎没有反映出最终用户的实际需求。不要误解我的意思,这两个抽象都是有用的,我很感激通过免费的开源平台获得它们。尽管如此,它们似乎只为许多数据工程师面临的问题提供了部分解决方案,例如工作流设计中关注点的分离、任务之间易于配置和可靠的数据共享、快速开发和本地测试数据工作流的能力,以及整个系统的依赖性解决方案和可维护性。
新的抽象可能意味着过早地转移到解决方案领域 ( 即,在完全理解问题领域 ( 理解最终用户及其需求)之前实现诸如任务流或任务组 ) 之类的特性。早在 2018 年 8 月,Bluecore Engineering 的开发人员就写了一篇著名的文章,其中他们强调了为什么他们在公司采用 Airflow 时遇到困难,以及什么可能有助于解决这些问题。
https://medium.com/bluecore-engineering/were-all-using-airflow-wrong-and-how-to-fix-it-a56f14cb0753
下面是这篇文章的一个简短引用:
这意味着每个工作流的所有 Python 包依赖项都需要安装在每个 Airflow Worker 上,以便成功执行操作。[…] Python 包冲突可能会阻止工作流在同一个 Airflow 实例上运行。
我对这篇文章的理解是:如果你想在没有麻烦的情况下使用 Airflow,那么只使用提供独立任务环境的操作符,比如PythonVirtualenvOperator
、DockerOperator
或KubernetesPodOperator
来防止依赖冲突。或者,只使用在外部系统中进行实际数据处理的气流操作符,如 Spark、Snowflake、BigQuery、Redshift 等。鉴于您的工作流可以在许多不同的服务器上执行,确保适当的依赖关系管理的最简单方法是将数据处理卸载到外部系统,或者将您的代码打包到一个独立的自包含环境中,如 docker 容器、pod 或虚拟环境(,这实际上意味着:忘记任务流,告别小的原子任务)。
尽管任务流和任务组抽象很有用,但它们似乎没有被彻底考虑。想象一下用户的困惑,比如我自己,不断被提醒:“不要在 Airflow 中的任务之间传递数据”,然后获得一个名称中确实有“flow”的功能,并且比以往任何时候都更容易直接在 Airflow 中进行实际的数据处理。
至于 TaskGroup 功能,Airflow 可能需要一个抽象,允许从另一个 DAG 触发 DAG,并等待其完成,然后继续下一个任务,而不依赖于任务之间匹配的开始日期来实现它。在这篇文章中,我分享了我是如何尝试在气流中构建这一点的。这可以提供一个分离的工作流设计,而不仅仅是可视化地折叠和展开单个组件。
结论
总而言之,最好的做法是使用合适的工具来完成工作。气流,在其核心,不提供一流的数据共享能力,而任务流 API 似乎是一种尝试,以绕过它没有架构重新设计。通过这篇文章,我想鼓励你批判性地思考你试图解决的数据工程问题并问问自己,Airflow 2.0 中的这些新抽象是否真的解决了你的需求。您最好将您的数据流转换保存在一个专门用于该目的的工具中,例如 Spark、Dask、ETL 工具或 dbt,然后如果您想对它们使用 Airflow,只使用它来调度和触发这些作业,并管理它们的执行状态、重试、日志记录、错误通知等。这样,你就使用了“合适的工作工具”,而 Airflow 只是一个调度器和指挥器。
似乎有了这些新特性,Airflow 试图成为一个通用的解决方案,代价是构建只能解决部分问题的抽象概念。
感谢您的阅读。如果这篇文章有用, 关注我 看我下一篇帖子。
我以前的一些关于气流的文章:
参考资料&附加资源
[1] 使用 astro CLI 开始指南—天文学家. io
[2] Airflow 2.0: DAG 创作重新设计 — Polidea
[3] 阿帕奇气流 2.0 来了
[4] 马克·兰伯特解释 XComs
构建可扩展 ML 管道的任务和工具列表
使用 TensorFlow extended、Apache beam、Kubeflow 和 GCP 将 Jupyter 笔记本中的研究实验转化为生产管道的艺术
由 TensorFlow Extended 支持的架构—图片由作者提供
- 是什么驱动了 Twitter 的机器学习,在我的时间线顶部显示最相关的推文?
- Spotify 如何扩展他们的 ML 平台来改进他们用户喜欢的功能,比如推荐和每周发现?
- 空客如何使用训练了超过 5 万亿个数据点的 LSTM 自动编码器模型检测实时遥测数据流中的异常?
这些问题耐人寻味,因为所有这些组织(以及类似的组织)都在构建最先进的 ML 系统方面做了出色的工作。所有这些案例的共同点是他们如何通过采用 TensorFlow Extended(TFX)作为其 ML 管道的核心来优化其 ML 基础设施。
构建 ML 管道是一项势不可挡的工作,需要以无缝的方式集成许多不同的组件。
Tl;dr 对于已经在大规模开发模型并想学习如何建立这种生产就绪管道的人,向下滚动到 公告 部分 。
对于不熟悉 ML 管道的人来说:
ML 管道简介
每一个将 ML 集成到其产品/平台中的数据驱动型组织都使用 ML 管道来简化其演进模型的开发和部署以及新数据的引入。
简而言之,ML 管道是将 ML 模型从实验性的 Jupyter 笔记本(或 Google Colab)转移到生产中的健壮应用程序的一系列任务。
项目越大,就越难建立处理规模的整个过程,这导致了一个新的工程学科叫做 MLOps。
现在,这些任务是什么,以及可以使用什么工具来构建这些健壮的生产就绪型管道,这将在下面的部分中进行解释。
数据摄取
有许多方法可以将数据摄取到机器学习管道中。可以使用本地磁盘或任何数据库中的数据。TFX 将摄取的数据记录转换为tf.Example
(在 TFRecord 文件中——用于存储二进制记录),供下游组件使用,这些二进制文件使我们处理大型数据集变得非常简单和快速。
主要任务:
- 连接到数据源、文件或云服务以高效地检索数据。
- 将数据集拆分为训练和测试子集。
- 使用 DVC 等工具对数据集进行跨越和版本控制(与创建者进行了交谈)。
此外,结构化数据集、文本数据集和图像数据集还需要专用的摄取方法。
使用的工具和技术:
- 利用扩展的 Tensorflow
- tf。例如,TFRecord —可以连接 Cloud 大查询、Cloud SQL 或 S3
- DVC 用于版本控制数据集。
- 可以上传任何类型的数据— CSV、图像、文本等。
数据有效性
使用 TFRecord/tf 的早期优势。比如 Tensorflow Data Validation(TFDV)的简单支持,这是谷歌从他们的 TFX 论文中开源的第一个组件。TFDV 允许我们的 ML 工程师在模型开发过程中更好地理解他们的数据,并轻松地检测常见的问题,如偏斜、错误的值或生产管道和服务中的太多空值。— Spotify Team
管道中的数据验证步骤会检查是否有任何异常,并强调任何失败。您可以通过 TFDV 运行新数据集,然后分别对其进行处理,从而创建新数据集。
TFX 提供了一个名为 TFDV 的库,可以帮助您进行数据验证。TFDV 接收 TFRecords(或 CSV 文件),然后允许您执行数据切片、数据比较、偏斜度检查和其他类型的分析。
您还可以在 Google PAIR 项目 Facets 上可视化验证结果。
主要任务:
- 检查数据集是否存在异常。
- 检查资料结构描述中是否有任何变更。
- 报告还强调了与培训数据相比,新数据统计数字的变化。
- TFDV 有助于比较多个数据集。
使用的工具:
TensorFlow 数据验证(TFDV)
特征变换
添加转换,如一热编码、标准化量化特征、重命名特征、批量预处理等。
TFX 提供了像 TFT(TensorFlow Transform)这样的库来对 TF 生态系统中的数据进行预处理。
TFT 处理数据并返回两个伪影:
- 以 TFRecord 格式转换培训和测试数据集。
- 导出的转换图。
主要任务:
- 处理要素名称、数据类型、缩放、编码、PCA、分时段、TFIDF 等。
- 使用 tf.Transform 处理数据。
- 正在写入预处理函数。
- 将步骤纳入 TFX 管道。
使用的工具:
- tf。改变
模式培训
在管道中训练模型有一个重要的好处,那就是通过将所有转换步骤和模型训练导出为一个图来消除任何错误源。
主要任务:
- 跟踪整个模型开发和实验过程。—使用 TFX 管道实现流程自动化。
- 调整管道中的超参数。
- 不仅节省了训练好的模型权重,而且节省了数据处理步骤并保持了一致性。
使用的工具:
- Sklearn / tf。keras/xboost
- TFX 管道
模型评估—分析和验证
TensorFlow Model Analysis(TFMA)有助于可视化模型的性能、公平性(假设工具)、获取数据中不同组的指标、与先前部署的模型进行比较,以及调整管道本身中的超参数。
主要任务:
- 定义从一开始设定的关键绩效指标衍生的许多指标。
- 使用 Tensorflow 模型分析获得详细的性能指标(TFMA)
- 检查模型公平指标。
使用的工具:
- TensorFLow 模型分析(TFMA) — tf。ModelAnalysis
- 什么样的 IF 工具
TensorFlow 和谷歌云人工智能平台
TensorFlow serving 提供了一种通过模型服务器部署模型的简单而一致的方法。除此之外,还可以使用 web UI 在 AI 平台上配置模型终结点。
主要任务:
- 模型部署的三种方式:模型服务器、用户浏览器或在边缘设备上。确定适用于您的应用程序的最佳选项。
- 设置 tensorflow 服务以实现模型的一致部署。
- 选择适合你的沟通方式:REST 还是 gRPC。
- 选择云提供商。
- 使用 TFX 管道进行部署。
使用的工具和技术:
- Tensorflow 服务
- 休息
- gRPC
- GCP/ AWS
管道业务流程
管道协调器是上述组件的基础。业务流程工具检查一个任务/组件何时已完成,知道何时触发工作流的下一个任务,安排管道运行,等等。
主要任务:
- 通过设置支持上述所有组件的管道编排器,实现 ML 管道的自动化。
- 选择要运行管道的工具。
- 通过编写配置 python 代码来协调管道。设置并执行。
使用的工具和技术:
- Apache Beam>Apache air flow>Kubeflow——按照复杂程度和可访问重要功能的顺序排列。
✨公告—基于队列的课程,内容是构建生产就绪型 ML Pipelines✨
哈罗。我正在考虑开设一门为期 3 周的课程,内容是关于构建 ML 生产管道。我将从一个 beta 群体开始,这样我就可以完善材料。测试版将是 800 美元,这是一个重大的折扣比最终价格。
我(和我的团队)将现场授课,分享我们学到的关于使用谷歌的 TensorFlow Extended、Apache Airflow、Kubeflow 和 T2 的谷歌云平台等工具构建强大的 ML 管道的一切。这是一个技术栈,为诸如 #Spotify 、 #Airbnb 和 #twitter 等应用提供支持。
如果您有兴趣加入,请填写这张表格:
目标:
目标是加速你早期的 ML 工程生涯。
价值
学完这门课程,你会成为一名更自信、更有韧性的 ML 工程师。这是我希望在投身 ML 工程时就有的课程。
您将学到的内容:
我们将一起解开将笔记本电脑模型转移到生产环境所需的 ML 管道的每个单独组件(如信息图所示)。
你将通过做项目来学习。
材料和教学:
- 研讨会促进主动学习和动手操作,而不是被动的讲座。
- 与同龄人一起学习——Zoom 分组讨论小组、积极参与的 slack 社区和小组项目。
- 一门应用课程,提供学习指南、抽认卡和 ama。
谁应该报名
本课程是为那些已经在大规模训练 ML 模型,现在希望学习构建完整 ML 管道的人而设计的。对于转变为更具实践性的工程角色的数据科学家或新的 ML 工程师<2 years into their career.
Hit me up!
My DMs are open for queries. Also, if you found this useful and would love to see more of it, connect with me on Twitter 或 LinkedIn 。此外,请订阅我的频道了解更多关于数据科学的内容。
您可以订阅我的每周数据科学简讯,我会将说明性教程、实用项目想法和实时培训课程直接发送到您的收件箱。
https://dswharshit.substack.com/
数据中的同义反复
数据科学
为什么数据≠分析
当我研究精准医疗中的一些数据应用时,我在“从大数据到精准医疗”的一篇文章中发现了一个有趣的说法,这篇文章发表在医学前沿上。该文章指出:
“然而,‘大数据’不再意味着它曾经的意义。该术语已经扩展,现在不仅指大量数据,还指我们分析和解释这些数据的能力不断增强。诸如“数据分析”和“数据科学”之类的同义反复已经出现,用来描述随着可用信息量越来越大而采用的方法。1
图片由 Dhruv Weaver 在 Unsplash 上提供
我们或许应该从理解什么是重言式开始。根据情况有几个定义,但它们都有一个循环推理的元素,或者通过它们的逻辑形式为真。这可能意味着用不同的语言说同样的事情,或者创造“定义上正确”或在所有可能的情况下都正确的论点。
一些例子可能会有所帮助…
- “贬值”→“贬值”的意思是“减少价值”,所以我们最初的表述是“减少价值”。所以我们在用不同的词说同样的事情。
- “就是这样”→根据定义,这是真的。
- X=Y 或 X ≠Y →这在所有可能的解释中都成立。
- “GPS 系统”→ G.P.S .代表全球定位系统,所以我们不需要在“GPS”后面加上“系统”。
所以,让我们试着从上面理解作者的论点。
我试着解释一下:“因为‘大数据’有了新的定义,不仅反映了可用数据的规模,还反映了分析数据的能力,所以‘数据分析’这个术语现在是一个同义反复。分析已经封装在‘数据’中,所以‘分析’是重复的。”
然而,我不知道我是否同意大数据的定义已经改变为包括分析。作为一个语义问题,作者没有说“大数据科学”是一个同义反复,而是笼统地说“数据科学”。
这是我的看法。数据本身是被动的、惰性的,等待分析后传递信息。分析正在进行。我们通过分析从数据中综合知识。我不同意作者的观点,即“大数据”包括没有数据科学家积极探索和理解的分析。
这真的重要吗?大概不会。我正在剖析本文引言中的一句话,但我认为这是讨论数据科学中一个更有趣问题的一种有趣方式。
随着数据量呈指数级增长,我们已经被淹没在使用人工智能、数据科学、autoML 等解决每个问题的新解决方案中。我觉得很容易高枕无忧,以为一旦有了足够的数据,就可以轻松解决 X 问题,忘记那个数据≠分析。我们需要在我们的追求中保持活跃,并记住数据本身并不意味着理解。
同义反复偏差
让我们讨论一个更普遍的问题,即数据中的重言式。当我们使用与目标特征高度相关或完全相关的数据特征来预测目标特征时,就会出现同义反复偏差**。例如,如果我们希望根据某个客户的购买历史来预测该客户相对于其他客户的百分比。因此,一个挥金如土的人将处于高百分位数,因为他们,例如,花了超过 78%的顾客。**
也许我们有在商店花费的时间、购物的天数、购买的物品数、花费的总数、购买的最大数量等等。我们没有太多的时间,所以我们只是把所有的东西都扔进一个模型,然后嘣,我们得到了非常高的精度。任务完成了吗?不完全是…
你能发现同义反复的偏见吗?我们使用了一个可以完美预测百分位数的特性,因为这是百分位数的基础!百分比基本上只是所有客户的 total _ spend 排名,因此当然在模型中包含 total _ spend 将完美地预测百分比。
这在几个方面都是欺骗,主要是我们在预测中欺骗,因为我们已经有了所有的信息,但我们也欺骗了自己对数据的更深入的理解!通过将这种多重共线性包括在我们完美预测目标的特征中,我们可能会错过频繁购物者花费更多的钱,错过大多数顾客只在商店逗留几分钟的时间,或者错过最大的购买量与总花费无关的情况。
结论
我处理了两个不同的例子,其中重言式的概念很重要。首先,在高层次上,我们应该警惕“一旦我们收集了足够的数据”,就有人向我们许诺难以置信的复杂问题的所有答案。数据本身存储信息,但如果没有集中的探索和分析,它不是一个解决方案。人类的聪明才智很难被“一刀切”的解决方案所取代。
第二,谨防同义反复的偏见。如果我们有与目标特性直接相关的特性,当你的结果看起来好得不真实时,不要惊讶!始终测试多重共线性并测试特定的假设,以充分利用您的数据。
连接
我一直在寻找连接和探索其他项目!你可以在 GitHub 或 LinkedIn 上关注我,并在媒体上查看我的其他故事。我也有一个推特!
来源
【1】t . hul sen,S. Jamuar,A. Moody 等[从大数据到精准医疗](http://[X] N. Name, Title (Year), Source) (2019),《医学前沿》6:34。
杠杆式浓缩咖啡机的分类
咖啡数据科学
按功能对机器进行分组
自从我在我婆婆的地下室偶然发现一个杠杆机器,我就爱上了它。我们在密室里找东西,我无意中发现了拉·帕沃尼。她把它给了我,我把它清理干净了。然而,我仍然没有升级我的研磨机来真正欣赏它。我一点也不知道,仅仅几个星期后,我又得到了另一台杠杆式咖啡机和我咖啡生活中的最爱,金快车。
我在一次房产拍卖中买了 Kim Express,我并不完全明白这台机器有多稀有。从那以后的几年里,我买了 La Peppina,意大利的 Enrico(Italian style),Flair,Kompresso,还有几台 Kim Express 机器。
杠杆式咖啡机与其他浓缩咖啡机不同,因为用户可以通过杠杆直接控制流速。这是基本的概念,但是它们已经有了很大的发展。
一旦水泵机器变得可用且成本低廉,杠杆式机器就不再流行了。杠杆机器仍然提供控制,这比同样口径的泵机要贵得多,但它们需要更多关注细节。
分组杠杆机器
我研究了一些其他可用的机器。虽然有很多关于旧机器的资料可以阅读,特别是弗朗西斯科·切卡雷利,但我还没有看到这些机器根据它们的相似性和差异性进行分类或归类。根据我自己对我的机器的经验,我知道它们都有夸克,我想创建一个分类法来帮助理解哪些机器的功能彼此最相似。
我用弗朗西斯科的清单加上一些不在清单上的机器做了这个图表。此图表中的所有机器都是该组中机器的示例。通常还有很多我没有包括在内。我的目的是展示他们的主要区别。
所有图片由作者提供
定义
工具
杠杆机器可以用手或弹簧驱动。在弹簧驱动杠杆的情况下,你握住手柄来减缓杠杆的运动。两者都需要动作,但是弹簧杠杆可以被拉动和释放,而手动杠杆必须被持续推动:
手柄:水流直接与向下推动手柄相联系。
弹簧杠杆:水流与向下推动杠杆成反比。
在没有锅炉的类别中,一个例子(Aram)使用旋转螺钉来施加压力,另一个例子(Kompresso)使用手来推动柱塞。这两种方法仍然在人和射击时的流速之间有直接的联系,这就是为什么我仍然会把它们放在杠杆机器的类别中。
左图:拉帕沃尼,手动杠杆机器的一个例子。右图:Kim Express,弹簧杠杆机器的一个例子。
锅炉
有三个锅炉选项,可以选择水温 PID 控制。高端杠杆机器配有 PID 控制器,以保持一定的水温:
左:封闭式锅炉,中:开放式锅炉(盖子未密封),右:无锅炉
La Peppina 特别有趣,因为虽然它是一个杠杆机器,但它的功能与泵式浓缩咖啡机交叉,因为你必须泵几次杠杆。一旦圆盘被水加压,你仍然可以用控制杆控制水流。
温度控制
这里只有带水温控制的杠杆机。我可能已经忘记了一些,因为这些只是例子,而不是详尽的清单。
我真的很喜欢阅读这么多杠杆机器。许多 50 年代和 60 年代的作品看起来像是拉·帕沃尼或拉·佩皮纳的翻版。我喜欢各种各样的机器,我喜欢尝试不同的杠杆机器,因为它让我更好地了解我最喜欢的机器。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我中。
我的进一步阅读:
tdGraphEmbed:时态动态图级嵌入
思想和理论
用 NLP 方法表示时态图序列
在这篇文章中,我将分享 tdGraphEmbed ,这是一种利用图表中的时间信息来创建每个图表时间步长的图表级表示的方法。该模型和方法已在 CIKM2020 中发布和展示。
首先,什么是时态动态图?
时间动态图是拓扑随时间演化的图,在不同的时间快照之间添加和删除节点和边。
一个时间动态图的例子。红色边和紫色节点由不同的时间步长共享,而其他节点和边可能共享也可能不共享。
将这些图嵌入到图级表示中的动机是什么?
将整个图嵌入到时间域中的单个嵌入中的新颖任务还没有被提出。这种对整个图结构进行编码的嵌入可以有益于几个任务,包括图分类、图聚类、图可视化,并且主要是:(1) 时间图相似性- 给定一个图快照,我们希望识别出过去与其最相似的图结构。例如,考虑一个以前犯过罪的犯罪组织。我们希望通过比较新模式和以往犯罪模式来预测该组织的网络是否正在为下一次犯罪做准备。(2) 时间异常检测和趋势分析- 时间图领域中的一个被充分研究的领域,旨在随时间识别图结构中的异常。例如,在特定时间点因非政治事件而成为病毒的社交网络活动,或者改变了组织结构(成员替换其角色)的公司网络,都可以被识别为异常。
我们论文背后的主要思想是学习时态图序列中每个时间步的图表示。
主要思想:将每个图形时间步长转换成矢量表示
尽管有其他众所周知的方法,我们的重点是整个图形表示,而不是节点表示。
符号
对于我们的任务,我们假设一个时间动态图是一个有序序列的𝑇图快照:𝐺={𝐺1,𝐺2,…,𝐺𝑇}.每个图形快照被定义为𝐺𝑡=(𝑉𝑡,𝐸𝑡,其中𝑉𝑡和𝐸𝑡分别是𝐺𝑡的顶点(节点)和边。每个图形快照为某些可配置的δ𝑡.在时间间隔[𝑡−δ𝑡,𝑡]内的图形状态建模
例如,脸书友谊网络可以被表示为具有每日粒度的时间图,其中每一天表示当天形成的友谊连接。
设𝑉是出现在𝐺.的所有顶点的集合因此,组成𝐺𝑡的顶点子集𝑉𝑡可以定义为𝑉𝑡⊆𝑉.每个时间步长中的顶点数量可以(并且很可能)不同于先前的迭代,这意味着 that|𝑉𝑡|≠|𝑉𝑡+1|.我们的目标是学习一个映射函数,它将图𝐺𝑡嵌入到𝑑-dimensional 空间中。嵌入应该包括节点随时间的演变和图的结构。此外,具有相似节点、边和拓扑的图应该以比其他图更接近彼此的方式嵌入。
tdGraphEmbed
我们建议 tdGraphEmbed 将时间戳𝑡处的整个图嵌入到单个向量𝐺𝑡.中为了实现不同大小和时间动态的图形的无监督嵌入,我们使用了受自然语言处理(NLP)领域启发的技术。
直观来说,类比 NLP,一个节点可以被认为是一个单词(node2vec 类比),而整个图可以被认为是一个文档。
我们的方法主要分两步:
1。将图形转换为文件
由于自然语言处理技术天生被设计用来嵌入不同大小的对象(即文档),我们假设通过将每个图建模为一个句子序列,我们将能够对图实现同样的效果。我们选择使用随机漫步来模拟图表的句子。
在每个时间戳𝑡,tdGraphEmbed 从图中的每个节点执行长度为𝐿的𝛾随机行走。
Graph2Document :时态动态图变成文档。每行代表一个使用随机漫步生成的句子。𝑡时间的随机行走次数是|𝑉𝑡|乘以𝛾.l 表示随机漫步的长度。
将一组图表转换为一组文档的代码示例:
对该设置的修改可以是在时间步长上执行随机遍历,直到当前图形时间戳:
**时态随机漫步概念。**红色虚线代表连续时间步长之间的边。在为 graphGt+1 创建句子时,我们使用前面时间步长之间的边。因此,我们可以创建随机漫步[G,H,F,H]和[D,A,E,B]。
我们可以使用直到当前时间 t 的节点和边来表示图句子,而不是仅使用时间 t 的节点和边。
为了对当前时间 t 和先前时间步节点连接之间经过的时间进行加权,我们将给边一个新的权重,考虑到该时间间隔。在先前的时间步骤中,边的新权重为:*w′= w log(1+1/∏t)。*其中,*w′*是新的权重, w 是以前的权重,∏t是时间 t 和边缘原始时间之间经过的时间。我们可以使用时间间隔的不同衰减函数。通过使用直到当前时间的所有时间信息,这种随机行走中的时间性建模将有助于当前图形表示。
2.使用 Doc2Vec 进行文档嵌入
我们共同学习节点嵌入𝑣以及整个图嵌入𝐺𝑡.直观地说,不是像 node2vec 在静态上下文中执行的那样,仅使用邻居节点来预测随机行走中的下一个节点,而是我们用附加的特征向量𝐺𝑡来扩展 CBOW 模型,这些向量对于每个图快照是唯一的,与 Doc2Vec 相同。虽然节点的邻居向量表示节点的社区,但是𝐺𝑡图向量旨在表示在时间𝑡.的整个图的概念
学习图形向量框架。该图的时间索引(𝑡)与上下文节点(h、f 和 I)连接,并在预测节点 d 时充当全局上下文
我们将根节点𝑣𝑖∈𝑉𝑡附近的节点定义为上下文节点:𝑁𝑠(𝑣𝑡𝑖)={𝑣𝑡𝑖−𝜔、…,𝑣𝑡𝑖+𝜔}.上下文节点是固定长度的,并且通过随机行走从滑动窗口𝜔采样。
然后优化变成预测节点嵌入,给定节点在图的时间𝑡和向量𝐺𝑡.的随机行走中的上下文我们的目标是最大化每个节点𝑖:的以下等式
图的时间索引可以被认为是另一个节点,它充当图的全局上下文的存储器。该全局上下文与窗口内节点的本地上下文相结合。
注意,这是贯穿所有时间快照的全局优化过程,即,该过程使得能够学习节点 V 的嵌入,通过图𝐺的演变捕获它们出现的所有上下文,同时学习每个快照𝐺𝑡.的图向量由于该模型在所有时间快照中执行随机行走,所以它允许随着时间的推移通过节点的增加和减少来建模图形,并且不像静态节点嵌入技术那样需要固定数量的节点来建模。我们的方法的另一个优点是,它是无监督的,并且不需要任何特定于任务的信息用于它的表示学习过程。因此,生成的图形嵌入是通用的,可以用于各种任务。
结果
我们将 tdGraphEmbed 与不同数据集上的各种静态和时间基线进行了比较。我们在两个主要任务上评估了我们的方法:图相似度和异常和趋势检测。
任务 1:相似性排序
为了评估 tdGraphEmbed 生成的图级嵌入如何捕获图的相似性,我们在图相似性排序任务上评估了我们的方法。我们利用图与图的邻近度中常用的基本事实相似性——最大公共子图(MCS)。我们在每种方法生成的图的向量之间使用余弦相似性度量。我们使用四种方法来测试排名性能:斯皮尔曼的排名相关系数(𝜌),肯德尔的排名相关系数(𝜏),Precision 为 10 (p@10),精确度为 20 (p@20)。
每个方法的两个 Reddit 数据集的相似性排序任务的结果。每项措施的最高分被突出显示
我们的三个数据集(安然、脸书和 Slashdot)的相似性排序任务的结果。突出显示每个测量的最佳分数
上表中的结果表明,我们的方法在使用 MCS 捕获图形到图形的接近度方面优于其他基线。
任务 2:异常和趋势检测
因为我们处理时态图嵌入,所以我们希望发现网络中的时态异常。我们将时间图中的异常定义为时间点,其中图的变化是结构性的,并且比平均规模大。这些变化可以由多个节点改变社区、节点的增加/减少、新边的增加/移除等引起。我们将 defineδ𝐺@𝑡视为两个连续时间步长𝑡−1and 𝑡.之间图的嵌入表示的变化直观地,高于预定阈值的δ𝐺@𝑡值可以用于指示异常的存在。我们使用代表时间步长𝑡−1 和𝑡.的图形的两个向量之间的余弦相似性进行 defineδ𝐺@𝑡我们使用精度为 5 (p@5)、精度为 10 (p@10)、召回率为 5 (r@5)和召回率为 10 (r@10)来评估关于基本事实的前 5/10 异常。
Reddit 数据集的异常检测任务和趋势分析的结果。每种方法的δ𝐺@𝑡和谷歌趋势之间的斯皮尔曼相关性用𝑠.表示
此外,我们使用图嵌入来发现进化网络中的趋势。为了标记这些趋势,我们使用一个外部来源— Google trends ,一个追踪搜索查询流行度的流行工具。我们计算谷歌趋势和我们的嵌入趋势之间的相关性,δ𝐺@𝑡向量使用斯皮尔曼相关测量(𝑠).
如左图所示,我们的方法与谷歌趋势和异常时间高度相关。
δ𝐺@𝑡随时间推移的 tdGraphEmbed(蓝色,实线)与谷歌趋势(橙色,虚线);红点是地面真实异常。异常是子编辑“权力的游戏”数据集中剧集的播出日期。
δ𝐺@𝑡随时间推移的 tdGraphEmbed(蓝色,实线)与谷歌趋势(橙色,虚线);红点是地面真实异常。异常是 subreddit‘Formula 1’数据集中的比赛日期。
嵌入可视化
可视化二维空间上的嵌入是评估节点嵌入方法的一种流行方式。我们希望展示这个任务在图级中也是有意义的,并且可以用于图的聚类。我们使用 TSNE 对我们的 128 维图形向量进行二维可视化,其中每个样本代表不同的时间粒度。一个关于“时间的游戏”数据集的例子表明,异常日(红色)和连续日(蓝色圆圈中的例子)在二维空间中彼此接近,表明我们的嵌入方法保持了每个时间步相对于其他类似时间步的特征。值得注意的是,异常时间一起位于图的中间,强调它们中的每一个都靠近同一周中的日子以及其他异常日,因为连续的日子共享相同的节点,但是异常日共享相同的全局结构。
《权力的游戏》子数据集的 tdGraphEmbed graphs 矢量的 TSNE 可视化;异常时间以红色显示,每个点上的数字表示按日期排序的样本的索引。
最后的话
(1) tdGraphEmbed,是一种针对整个时态图的无监督嵌入技术。我们共同学习图的时态快照表示以及节点表示。通过输入图形的时间索引作为对上下文节点的初始输入,提供整个图形快照表示。
(2)我们创建了一个动态表示,它能够模拟不同数量的节点和边。我们的方法是无监督的,并且不需要训练数据来创建嵌入,并且可以用于额外的任务。
(3)在真实数据集上进行的评估表明,tdGraphEmbed-在图的相似性排序和检测时间异常和趋势方面优于许多最先进的方法。
**感谢您的阅读!**请随意使用这项工作,并继续在该领域的研究。
丁山论文
**代号:**https://github.com/moranbel/tdGraphEmbed
2021 年自学数据科学:数学和线性代数
机器学习的有用课程和资源
准备好进入数据科学领域了吗?安德里亚·格拉迪隆在 Unsplash 上的照片
最近,我从化学工程专业毕业,得到了我的第一份工作,在一家科技公司担任数据分析师。从那以后,当我和我学校的学生谈论这一举动时,许多人表达了同样的兴趣和同样的问题…
“你是如何从工程转向数据科学的?”
这正是我问自己的问题——我该如何行动?一年多前,同样的想法促使我开始追求数据科学家的技能。其中,数学是数据科学家的关键技能之一。
但首先,让我们了解一下…
什么是数据科学?
这是一个非常模糊的问题。对我来说,我最认同的定义是这样的—
多学科交叉的数据科学。作者插图。
数据科学是一个跨学科的领域,它使用从数学、计算机科学和领域知识中提取的技术和理论。[1]
好吧,那我怎么学数据科学?
在这一系列的博客文章中,我将重点介绍我在这个过程中参加的一些课程,以及它们的优缺点。通过这些,我希望能帮助那些和我一样的人规划他们在数据科学方面的自学之旅。这些员额是:
- 第 1 部分—使用 SQL、Python 和 R 进行数据处理
- 第二部分——数学:线性代数(你来了!)
- 第三部分——概率和统计
- 第 4 部分—计算机科学基础(即将推出)
- 第 5 部分—机器学习(在此阅读!)
在这篇文章中,我将强调我是如何学习数据科学所需的**线性代数的。**具体来说,我将强调
- 什么是线性代数
- 如何学习线性代数
- 为什么它对数据科学家很重要
线性代数:它是什么
线性代数是数学的一个分支,涉及线性方程及其表示和矩阵。
在 2 维中,它可以采用一个无伤大雅的普通直线公式 y=mx+b 的形式。在更高维中,使用线性代数的工具箱,线性代数变得更具挑战性。
线性代数的研究通常包括向量、矩阵和
向量和空间
向量是表示有方向的量的一种方式。
例如,如果一艘船以每小时 5 英里的速度向东北方向移动,我们可以将船的速度矢量表示为西北方向的一个 5 单位长的矢量。
n 维向量存在于,你猜对了,n 维空间。例如,船可以被简化成存在于二维空间中的物体——南北维度和东西维度。
在过去的一个小时里,我们可以想象船向北移动了 3 英里,向东移动了 4 英里,这样它在东北方向上以每小时 5 英里的速度移动。然后我们可以想象船的速度矢量为 x = [3,4]。
开始学习线性代数,我们需要开始了解向量的性质是什么(线性相关或独立),我们可以用它们做什么(点积和叉积),以及它们存在的空间的性质(子空间)。
矩阵变换
如果我们把几个向量组合在一起,就得到一个矩阵。矩阵可以解释为向量的变换,如缩放、旋转或旋转。假设我们希望船只在相同方向上以两倍的速度行驶(由新矢量 y 表示),我们将使用矩阵 A 将船只的速度矢量缩放两倍,公式为:
y = A x
每个矩阵都有自己的属性。最重要的属性之一是特征向量,它是在应用变换后方向不变的向量。另一个重要的性质是特征值,即变换后相同向量长度的变化。
这个特征向量在主题的高级处理中非常有用,形成了包括主成分分析和奇异值分解在内的许多技术的基础。
线性代数:在哪里可以学到它
让我们面对现实吧。线性代数是一门很难的学科。所以,在这里我提供了一个人已经拥有的不同层次的数学知识的线性代数资源。
对数学很陌生?从简单的资源开始。已经知道大部分了?用富有挑战性的课程给自己一个挑战。
**基础:**R *中 Datacamp 的数据科学线性代数
这个简短的课程提供了线性代数的介绍——包括代码!这是适合一个学习者的,他希望在学习线性代数入门的同时提高 R 语言的熟练程度。
难度等级:★
时间承诺:4-6 小时
费用:介绍性章节免费;下一章需要订阅。
基础: 3Blue1Brown 的线性代数精髓
这个 YouTube 系列是开始学习线性代数的必备资源。它提供了线性代数的直观介绍,无需求助于数学术语。简明直观,这一系列为下面的中级/高级课程准备学习者。
难度等级:★★
时间承诺:大约 4-6 小时
费用:免费
中级:可汗学院的线性代数系列
YouTube 上 3Blue1Brown 的作者教的,可汗学院上的线性代数系列是我爱上可汗学院的原因之一。这很容易理解。按照 3Blue1Brown 的风格,这个系列通过引人入胜的视觉效果提供了线性代数的直觉。
虽然这个系列很吸引人,但它并没有为学习者提供在学习概念后练习技能的练习。此外,它没有深入讨论更高级的概念,如 LU 分解、对称矩阵、奇异值分解等。
难度等级:★★
时间承诺:大约 15-20 小时
费用:免费
**中级—高级:**帝国理工学院的机器学习线性代数
比可汗学院的视频讲座更高级的是帝国理工学院的线性代数课程。除了可汗学院涵盖的所有概念之外,这门课程还粗略介绍了可汗学院遗漏的主题。
在介绍矩阵变换等更高级的运算之前,先用向量和矩阵的概念让学习者热身。它还提供了对线性代数的直观理解。
此外,编程作业是用 python 编写的,并且广泛使用了 numpy 包。对于想提高 numpy 熟练度的人来说,这是一个极好的练习。
难度等级:★★★
时间承诺:约 19 小时
费用:免费,或 49 美元获取作业、测验和证书。
进阶: GeorgiaTechX 的线性代数系列*
上面的中级系列一般不提供更高级概念的深入处理。如果你渴望更严谨的数学,你可能会考虑 GeorgiaTech 的线性代数 4 部分系列。
这个 4 部分的系列与乔治亚技术学院的校园数学 1554 有相同的教学大纲——所以你知道你得到了乔治亚技术学院的严格要求!
在 Greg Mayer 教授的指导下,这个系列全面地介绍了线性代数中的不同主题。这些包括向量,矩阵,行列式,对角化,对称矩阵,奇异值分解,等等。
GeorgiaTechX 的系列为那些想要炫耀他们的线性代数知识的人赢得了 cookie points,每个证书 199 美元。
难度等级:★★★★
时间承诺:每个零件 3 周。总共 12 周。
费用:免费,认证费 199 美元。
**进阶:**麻省理工的 18.06 线性代数系列
18.06 由数学领域最受尊敬的教授之一吉尔伯特·斯特朗教授讲授。这门课被许多人吹捧为真正学习者的实际线性代数课。上完这门课后,我发现这些评论并不令人惊讶,因为他的课很吸引人,概念深刻,不用说也很有挑战性。
麻省理工学院的 18.06 可以在麻省理工学院的开放式课程中免费获得,其中也包含了视频讲座、作业、测验和考试。
不幸的是,完成这门课并不能为你赢得任何证书。为此,你可能想使用 GeorgiaTechX 的系列或帝国理工学院的 Coursera 类以上。或者,你可以用线性代数来实现你自己的项目
难度等级:★★★★
时间承诺:总共 12 周。
费用:绝对免费,无任何附加条件。
线性代数:为什么它对数据科学和机器学习很重要
作为一个数学密集型领域,数据科学应用线性代数技术来有效地转换和操作数据集。
特别是,数据科学家将线性代数用于向量化代码和降维等应用。
矢量化代码
*线性代数有助于生成比非矢量化代码更有效的矢量化代码。*这是因为矢量化代码一步即可产生结果,而非矢量化代码通常使用多个步骤和循环来获得相同的答案。
由 Karo Kujanpaa 在 Unsplash 拍摄的照片
例如,我们希望找到根据一只蟋蟀的鸣叫次数找出温度(是的,你没看错,是蟋蟀。)
将温度与啁啾数量联系起来的方程
T = 50+[(N — 40)/4]
T =温度
N =每分钟鸣叫次数
假设我们收集了几个关于每分钟鸣叫次数的数据点——45、50、55、58。我们如何找到温度?
我们可以把 45,50,55,58 代入方程 T = 50+[(N — 40)/4]。这需要 4 个步骤:
t = 50+[(45–40)/4]= 51.25
t = 50+[(50–40)/4]= 52.5
t = 50+[(55–40)/4]= 53.75
t = 50+[(58–40)/4]= 54.5
…我一个人打这个就烦。
想象一下,如果我们有 1000 个数据点需要处理。你不会想要进行 1000 次替换,因为那是非常低效的。
线性代数通过允许我们以矩阵形式表示方程 T = 50+[(N-40)/4]并一步完成计算,提供了一种替代方法。
多么优雅的操作。现在,即使我们有数百万个数据点,我们也能一步找出所有的输出。
numpy 是 python 用于操作数组的包,利用矢量化运算来实现更优化的数学运算。这就是为什么 numpy 比 for 循环快得多!
降维:主成分分析
如果你的数据集是一只大象,PCA 会把一只巨大的大象缩小成一只更小的…有点像。克里斯·库里在 Unsplash 上的照片
线性代数对数据科学家如此重要的另一个原因是它在使用一种称为主成分分析(PCA)的技术进行降维方面的应用。
降维是用于机器学习的数据集预处理中的一个重要步骤。对于大型数据集,即具有大量特征/维度的数据集,尤其如此。有时,这些特征中的许多可能彼此高度相关。
简单来说,给定一个有 n 个特征的大数据集,PCA 识别出一组新的 m 维(其中 m ≤ n)来描述同一个数据集,信息损失尽可能小。
通过对大数据集进行降维,我们提高了机器学习算法的速度效率。这是因为该算法在进行一次预测之前只需要查看较少的特征。
机器学习中的线性代数
线性代数是实现机器学习优化的重要工具。
当训练机器学习算法时,我们实际上是在寻找损失函数的最小值。现代机器学习使用梯度法下降来这样做,这是一种基于函数的陡度慢慢走向损失函数最小值的方法。用梯度下降法,我们不会找到精确的最小值,但会找到一个足够接近的地方。
另一方面,如果系统是线性的,线性代数提供了闭合形式的公式来寻找损失函数的最小值。这意味着我们可以用线性代数找到精确的最小值。
两者各有利弊,但对于深入理解机器学习算法的优化来说,两者同样重要。
结论
学习这些资源让我对数据科学更有信心,因为它们为我学习其他机器学习和数据科学概念提供了很好的基础。
祝你的学习之旅一切顺利!如有任何建议或问题,请随时通过 LinkedIn 联系我。
https://www.linkedin.com/in/travistang [## Travis Tang -数据分析师- Gojek
www.linkedin.com](https://www.linkedin.com/in/travistang)
你可能也会喜欢…
放弃
带星号的链接是附属链接。您可以使用会员链接注册该课程,无需支付额外费用。
教神经网络玩牌
实践教程
我是如何训练一个神经网络在不需要人工输入的情况下玩一个纸牌游戏的
我选择了一个我在成长过程中喜欢玩的纸牌游戏,我的目标是开发一个可以在没有人类互动的情况下自学的系统,并达到一个足以击败我父亲的模型。
图片作者,来源于英文图案扑克牌副(公共领域)作者 Dmitry Fomin 和桌面纹理 ( CC BY 3.0 License )作者 ScooterboyEx221
这种游戏在奥地利和巴伐利亚州被称为“陈苏 Grünober”或“Grasobern”。我这里就叫“黑桃皇后”吧,省去了德国牌的介绍。我选择这个游戏是因为难度刚刚好,所以它很容易学习,但它仍然有一些曲折,使它变得有趣。
该项目的成果是一款 Android 应用,你可以在其中与基于人工智能的对手进行难度可调的游戏。
怎么玩
黑桃皇后是一种与红心有关的纸牌游戏。该游戏供 4 名玩家玩,使用一副 32 张牌。有四种花色:红心、方块、黑桃和梅花。每种花色按降序排列有以下等级:王牌、国王、王后、杰克、10、9、8 和 7。
每个玩家收到 8 张牌。第一个玩家将一张牌面朝上的牌放在桌子上,以此领先。其他玩家每人拿着一张牌,顺时针方向。如果可能的话,他们必须遵循第一张牌的花色。如果不可能,他们可以打任何牌。打出与第一张牌匹配的花色最高牌的玩家赢得该墩牌。赢家拿走牌,将它们面朝下放在一堆牌上,然后开始下一墩牌。
目标是避免赢得包含黑桃皇后的墩,并避免赢得最后墩。所以正常的策略是早早弃用高价值卡。但作为一个额外的转折,游戏也可以通过赢得所有的技巧来赢得,这需要一个完全不同的策略。决定使用所有的技巧通常是在游戏进行到一半时动态做出的。它不需要被宣布,并且经常给其他玩家带来惊喜。
更详细的解释,包括一些策略,可以在这里找到。
得分
点的分布使得所有点的总和为零:
- 赢了所有把戏的玩家得到+3 点,所有其他人得到-1 点。
- 拥有黑桃皇后和的玩家赢了最后一墩牌(但不是所有墩牌)得到-3 分,所有其他人得到+1 分。
- 否则,用黑桃皇后赢这一墩牌的玩家获得-1 点,赢最后一墩牌的玩家获得-1 点,其他两位玩家各获得+1 点。
训练模型
我的目标是建立一个无需人类干预就能自我学习的系统。我首先用 Python 实现了游戏的框架,其中四个模拟玩家可以相互对战。最初,由于缺乏训练有素的模型,玩家从规则允许的选项中随机选择卡片。
每局 8 轮,但最后一轮,只剩一张牌,真的没得选了。对于每场比赛,我能够收集 28 种情况和移动的信息(7 轮* 4 名球员)。
定义输入和输出向量
输入向量需要足够详细地描述游戏的当前情况。为了公平起见,只能使用当前玩家可用的信息。然而,玩家可以算牌。
我选择了总共有 115 个元素的表示:
- 正在进行的回合数(8)
- 活动玩家手中的牌(32)
- 桌上的牌(32)
- 其他玩家手中所有牌的组合(32)
- 第一套玩法(4)
- 当前玩家的顺序;相当于表(4)中的卡片数量
- 旗帜:目前玩家还没有赢过任何牌(1)
- 旗帜:目前玩家已经赢了所有的墩牌(1)
- 旗帜:当前玩家用黑桃皇后(1)赢了这一墩牌
括号中的数字表示用于编码每个分量的元素数量。一切都是用-1
或1
一次性编码的。例如,在第二轮中,轮数将被编码为[-1, 1, -1, -1, -1, -1, -1, -1]
。如果某些东西未知或不适用,则使用零(例如,在出牌之前打出的第一套花色)。
输出向量仅仅是卡的一个热编码,可以处理 32 个元素。其思想是,经过推理,在输出向量中具有最高值的合法可玩的牌是最好的牌。
培训用数据
正如我上面指出的,每个模拟游戏产生 28 行训练数据,每个玩家 7 行。游戏结束后,每个玩家得到一个分数,可以是-3 分,-1 分,+1 分,或者+3 分。每一行由描述游戏情况的输入向量和输出向量组成。输出向量用零填充,除了代表被打出的牌的元素被设置为玩家在游戏结束时得到的分数。
例如,由最终获得-3 分的玩家生成的数据可能如下所示:
Round Input Vector Output Vector
1 [1,-1,-1,-1,-1,-1,-1,-1...] [0,0,0,0,0,-3,0,0,0,0,0...]
2 [-1,1,-1,-1,-1,-1,-1,-1...] [0,0,0,0,0,0,0,0,0,-3,0...]
3 [-1,-1,1,-1,-1,-1,-1,-1...] [0,-3,0,0,0,0,0,0,0,0,0...]
...
在这个例子中,玩家在第一轮打出了由元素 6 代表的牌,在第二轮打出了元素 10,在第三轮打出了元素 2。
使用这种方法,模型应该知道在给定的情况下玩这些牌是一个坏主意,因为它们最终导致了负的分数。
然而,需要一个更细致的方法,因为当输掉一场比赛时,并不是所有的回合都是造成失败的原因。举个例子:一个玩家在第 3 回合用黑桃皇后赢了这一墩,但之后避免了赢最后一墩。在这种情况下,只有第 1 轮到第 3 轮导致了负得分,而其他几轮实际上是好的,因为它们阻止了更糟糕的结果。
损失函数
当在训练期间使用标准均方误差作为损失函数时,存在一个问题。
考虑这个输出向量:[0,-3,0,0,0,0,0,0,0,0,0...]
。
这个模型将会知道出 2 号牌是不好的,但是它也会知道出任何其他的牌都会产生一个中性的结果。事实上,我们不知道如果玩家在相同的情况下使用其他的牌会发生什么。
因此,输出向量中的零不应用于训练,因为它们指示没有数据,而不是目标值为零。因此,我使用了下面的自定义损失函数,确保反向传播只发生在非零元素上:
def squared_error_masked(y_true, y_pred):
""" Squared error of elements where y_true is not 0 """
err = y_pred - (K.cast(y_true, y_pred.dtype) * scale_factor)
return K.sum(K.square(err) * K.cast(K.not_equal(y_true, 0),
y_pred.dtype), axis=-1)
网络结构
神经网络的确切结构并不重要。我用这种结构和类似的结构取得了很好的效果:
layers = [ # input_shape=(115,)
[(384,'elu')],
[(384,'elu')],
[(256,'elu')],
[(128,'elu')],
[(32,'tanh')]
]
模型的评估
为了评估一个模型,我让它在模拟游戏中与随机的玩家竞争,或者与由不同模型控制的玩家竞争(通常每个模型有两个玩家)。经过几千场比赛后,我比较两组玩家的平均分数,以确定哪一组玩得更好,差距有多大。
迭代训练
事实证明,仅使用随机游戏中的训练数据并不会产生一个玩得很好的模型。例如,当每个人都随机出牌时,一个玩家赢所有的牌是不太可能的。因此,模型并不知道如何以这种方式取胜。
最好使用迭代方法,其中初始训练回合仅使用随机数据,但下一组训练数据是通过让结果模型与自身或随机玩家进行比赛来产生的。
算法
- 从随机游戏中生成训练数据。
- 使用该数据训练新模型。
- 对照当前最佳模型评估新模型。如果新模型更好,那么保存它以替换最好的模型。
- 在一定数量的迭代之后或者如果一段时间没有任何改进,就退出。
- 从当前模型与自身对抗的游戏中生成新的训练数据。
- 继续使用新生成的数据训练当前模型几个时期。
- 转到步骤 3。
每次的数据集都是基于 100 万场比赛(2800 万条记录)。如果内存使用不是问题,那么在步骤 4 中添加新的训练数据而不是替换现有数据也是有意义的。
结果
下图显示了当与先前训练的参考模型(每个模型有两个玩家)竞争时,训练模型的性能如何随着每次迭代而进步。作为参考,我使用了应用程序中当前部署的模型。
迭代训练期间的绩效进展(图片由作者提供)
比较在算法的步骤 5 中生成附加训练数据的不同方法:
- 随机:来自游戏中玩家随机移动的数据。
- 人工智能:来自游戏的数据,在这些游戏中,模型与自己对抗。
- 混合:来自游戏的数据,其中模型与随机玩家(两个 AI 玩家和两个随机玩家)进行游戏。
很明显,从玩得聪明的游戏中产生数据的方法会产生更好的结果。
赢得所有墩牌的游戏的百分比也明显更高。它显示了一个有趣的进展,在第二轮后达到峰值,然后下降。
一个可能的解释是:在第一轮后,模型知道正常的策略,即尽早丢弃高价值的牌。这种玩法实际上更容易赢得所有的墩牌,因为在游戏的后期,可以用来阻止玩家赢得所有墩牌的高价值牌不再有效。在随后的迭代中,模型会进行调整,从而降低赢得所有技巧的尝试实际成功的可能性。
张量流性能
在模拟游戏以评估模型或生成训练数据时,有必要一次在一个游戏情境中调用张量流模型。TensorFlow 针对同时处理大型数据集进行了优化,当用于单个数据记录时会产生大量开销。事实证明,通过将模型转换为 TensorFlow Lite,可以大幅提高速度。
另请参见:“使用 TensorFlow Lite 加速预测”。
调整难度级别
在应用程序中,我实现了五个难度设置:
- 非常好:模型运行时无需修改。人工智能玩家可以算牌,这是通过提供“其他玩家手中所有牌的组合”作为输入向量的一部分来实现的。
- 好:算牌有限。黑桃花色的牌仍然被完全计数,但是所有其他的牌被模拟不完全记忆计数。我通过将“其他玩家手中所有牌的组合”的适当元素减半来实现这一点,以便它们对结果的影响更小。
- 平均:不算卡。“其他玩家手中所有牌的组合”的所有元素都被设置为零。
- 差:没有算牌和引入误差。在确定最佳合法移动之前,噪声被添加到输出向量中。
- 很差:没有算牌,引入更多错误。增加了更多的噪声。
下面的图表显示了难度级别的比较。两个难度不同的玩家在平均设置上与两个玩家竞争。显示前几名选手的平均得分。
难度级别对比(图片由作者提供)
结论
对人类的测试正在进行。如果你想看看你如何比较,你可以在这里获得游戏:Google Play 上的黑桃皇后(免费且无广告)。就我父亲而言——他在和非常高水平的对手比赛时会遇到麻烦。但他可以在好的水平上击败他们,并最终在数百场比赛后获得积极的分数。
教人工智能斐波那契数列
数学
使用回归模型构建斐波纳契数列的下一个值。完整的代码可在我的回购。
在本文中,我将在斐波那契数列的几个样本上训练一个机器学习模型,然后使用该模型来估计缺失的斐波那契数列。
实际上,问题很简单。斐波纳契数列中的每一个数字都是通过将前面两个数字相加得到的。序列中的前两个数字是 0 和 1。
训练集
为了训练我的模型,我只需要一些样本。如果我必须使用 5 或 5000 个样本,结果将是相同的。让我解释一下:
#training sample for my model
fibonacci = pd.DataFrame([[1, 1, 2],
[2, 1, 3],
[3, 2, 5],
[5, 3, 8],
[8, 5, 13]
])
我所做的是隔离斐波纳契数列的每一次迭代,产生两个变量(特征)和一个变量(标签),必须使用特征进行预测。通过绘制数据集,我可以看到三维空间中的点。即使它们看起来不是沿着一条直线(看看 A、B 和 C),它们都位于同一个超平面上:f(x,y)=x+y。
数据很清楚。我可以简单地使用三维线性回归模型。机器学习模型将学习的,本质上,只是对数字求和。因为训练集上的每个数字都可以在这个超平面中找到,这意味着模型将使用相同的超平面来预测未来值。例如,通过输入 f(8,13),超平面的输出将是 21,这是两个特征的和,以此类推,后面的每个数字都是如此。
编写代码
#predicting fibonacci sequence with linear regression
import pandas as pdfibonacci = pd.DataFrame([[1, 1, 2],
[2, 1, 3],
[3, 2, 5],
[5, 3, 8],
[8, 5, 13]
])fibonacci.columns = [0, 1, 2]
fibonacci.iloc[0]
fibonacci
数据集的熊猫表示
训练模型
给定样本,我将使用一个简单的回归模型。我将使用的库是 sklearn。通过使用**。fit()** 方法 I 将输入特征(列[0,1])和标签(列[2])。
import numpy as np
from sklearn.linear_model import LinearRegressionreg = LinearRegression().fit(fibonacci[[0, 1]], fibonacci[2])
reg.score(fibonacci[[0, 1]], fibonacci[2])
既然模型已经完成,就可以进行预测了。考虑到模型的简单性和数学确定性,我跳过了验证步骤。正如您将看到的,该模型将能够准确无误地预测斐波纳契数列中的下一个数字。
#given any 2 numbers, the model will return their sum as properly learned from the training data
def pred(x):
return reg.predict(np.array([x]))
再现斐波那契数列
我将从序列的前两个数开始,然后估计第三个数。
list1 = [0, 1]
我将通过无限地使用下一个估计数作为预测值来重复迭代。
for k in range(25):
#the np results of prediction for 1+1 may be 1.999999: transformed into an int, it becomes one. I am using rint to round it to the closest numpy int, then converting it into an int
list1.append(int(np.rint(pred([list1[k], list1[k+1]]))))
print(list1)
使用上面的代码,我要求模型输出斐波纳契数列中接下来的 25 个数字。完美的执行力!!!
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393]
斐波纳契数列的图形
教导人工智能用合成数据对时间序列模式进行分类
如何建立和训练人工智能模型来识别时间序列数据中的各种常见异常模式
我们想要实现什么?
我们想训练一个人工智能代理或模型来做这样的事情,
图片来源:作者使用此 Pixabay 图片制作(免费使用)
差异、异常、移位
更具体地说,我们希望训练一个人工智能代理(或模型)来识别/分类时间序列数据,
- 低/中/高方差
- 异常频率(少量或大量异常)
- 异常标度(是异常远离正常或接近)
- 时间序列数据的正或负偏移(存在一些异常)
但是,我们不想把事情复杂化
然而,我们不想为此做大量的特征工程或学习复杂的时间序列算法(如 ARIMA)和属性(如季节性、平稳性)。
我们只是想将我们的时间序列数据(带有适当的标签)输入到某种受监督的“学习”机器中,该机器可以学习这些类别(高或低方差、太少或太多异常等)。)来自原始数据。
一个有用的 Python 库
我们为什么不利用 Python 库,它可以自动为我们做这种分类,我们所要做的就是使用标准的 Numpy/Pandas 格式将数据放入其中?
如果这个库拥有我们最喜欢的 Scikit-learn 包的外观和感觉就更好了!
我们在美丽库— tslearn 中发现了这样的特征。简单来说就是一个 Python 包,为时间序列的分析提供机器学习工具。这个包建立在(并因此依赖于)scikit-learn
、numpy
和scipy
库之上。
图片来源: tslearn 文档
为什么(以及如何)合成数据?
正如我在这篇文章中所写的—“合成数据集是一个以编程方式生成的数据存储库。所以,它没有被任何现实生活中的调查或实验所收集。因此,它的主要目的是足够灵活和丰富,以帮助 ML 从业者用各种分类、回归和聚类算法进行引人入胜的实验。
…然后扩展了本文中的论点—“合成时间序列也不例外—它帮助数据科学家试验各种算法方法,并为现实生活中的部署做准备,而这些部署方式仅使用真实数据集是不可能的。”
基本上,我们想要合成具有异常和其他模式的时间序列数据,自动标记它们,并将它们馈送给tslearn
算法,以便向我们的 AI 代理教授这些模式。
特别是,如果我们想要使用基于深度学习的分类器(如tslearn
所提供的),那么我们可能需要涵盖所有可能变化的大量数据,这在现实生活中可能不容易获得。这就是合成数据派上用场的地方。
那就去冒险吧!
向人工智能代理传授时间序列模式
演示笔记本可以在我的 Github repo 这里找到 。将时间序列数据转换成适合通过tslearn
模型进行训练的格式的过程相当简单,并在笔记本中进行了说明。这里,我们主要以各类分类结果为例进行说明。
数据中的高或低方差?
我处理大量工业数据,例如,大量传感器正在从机器、工厂、操作员和业务流程中创建永无止境的数字数据流。
检测时序数据流是否具有高或低的方差对于下游的许多过程决策可能是至关重要的。所以,我们从那里开始。
流程很简单,
- 使用
SyntheticTS
模块生成合成数据(在我的文章中讨论过,可以在这里找到) - 生成相应的类标签以匹配这些 Numpy/Pandas 数据序列(注意基于领域知识注入的标签自动生成
- 将合成系列数据转换为
tslearn
时间序列对象(数组) - 将它们存储在训练数据集中
- 从
tslearn
将训练数据输入合适的时间序列分类器。我们选择了TimeSeriesMLPClassifier
方法,它建立在我们熟悉的 Scikit-learn 的多层感知器方法之上,本质上实现了一个完全连接的深度学习网络。
合成数据训练流程来源:完全由作者编写
TimeSeriesMLPClassifier
拥有标准 Scikit-learn MLP 分类器的所有功能,
- 隐藏层大小和神经元数量
- 激活功能
- 求解器/优化器(例如“Adam”)
- 学习率
- 批量
- 容忍
- 动量设置
- 提前停止标准
基本上,我们希望合成带有异常和其他模式的时间序列数据,自动标记它们,并将其馈送给
tslearn
算法,以便向我们的 AI 代理教授这些模式。
为了简洁起见,在笔记本中,我没有显示训练/测试分割,但这必须作为实际应用程序的标准数据科学工作流实践来完成。
我们可以在训练后绘制标准损耗曲线,并进行各种超参数调整,以实现一流的性能。
然而,展示深度学习分类器调整并不是本文的目标。我们更愿意关注最终的结果,即它做出了什么样的分类决定。
以下是一些随机测试结果。
标签生成—手动还是自动?
这篇文章的全部目的是表明,人们可以通过合成数据避免人工标记。
我用随机变化或偏移生成了数百个合成时间序列来训练分类器。因为它们是以编程方式生成的,所以也可以自动标记。
一旦你在实际的笔记本中看到生成代码,这一点就清楚了。这是方差训练的想法。
异常—数据比例高还是低?
识别异常是不够的。在大多数现实生活中,你还必须确定它们的频率和发生模式。
这是因为工业数据分析系统通常负责在数据流中检测到足够多的异常时发出警报。因此,要决定是否发出警报,他们需要很好地了解异常计数是否代表正常数据的重要部分。
你不想引起太多的假警报,对吧?这将有损人工智能驱动系统的声誉。
因此,我们经历了同样的过程,训练一个关于时间序列数据中异常部分的人工智能模型。这是随机测试结果,
异常现象——它们的规模有多大?
在许多情况下,我们还对将输入数据归类为高/中/低异常感兴趣。对于工业数据分析,该特征可以给出机器状态或过程异常的指示。
我们遵循与上面相同的训练过程并获得这些结果,
数据漂移或转移—在哪里以及如何漂移或转移?
工业数据分析中的另一个经典操作是检测来自机器的传入传感器数据的漂移/偏移。可能有很多原因,
- 机器可能正在老化,
- 在没有适当记录的情况下突然改变工艺配方/设置,
- 一个小的子组件可能会随着时间的推移而退化
底线是,人工智能驱动的系统应该能够识别这些类别——至少根据正或负偏移及其发生点,即偏移是在流程生命周期的早期还是晚期开始的。
识别异常是不够的。在大多数现实生活中,你还必须确定它们的频率和发生模式。这是因为工业数据分析系统通常负责在数据流中检测到足够多的异常时发出警报
在这种情况下,我们将班次的位置(整个时间段中的早或晚)添加到混合中。所以,我们有下面的类来训练数据,
- 早期正移位
- 后期正移
- 早期负移
- 晚期负移
由于复杂性的增加,我们需要生成比之前实验更多的合成数据。这是结果,
摘要
对于许多精彩的用例来说,时间序列分类是一个非常有趣的话题。在这篇文章中,我们展示了如何使用合成数据,我们可以训练 AI 模型(具有几个完全连接的层的深度学习网络)来模拟工业过程或传感器流的一维时间序列数据。
特别是,我们将重点放在向人工智能模型传授各种异常属性和数据漂移模式,因为这些分类是机器退化的非常重要的指标。简而言之,它们构成了工业 4.0 或智能制造领域中所谓 预测分析 的基石。
我们希望人工智能驱动的预测分析的合成数据的使用在未来将会显著增长。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而无需您支付额外费用 。
https://medium.com/@tirthajyoti/membership
教人工智能玩超级马里奥游戏——遗传算法
用遗传算法控制超级马里奥大陆——用代码
照片由 @claudiolcastro 在 Unsplash 拍摄
这是教人工智能在 GameBoy 上玩超级马里奥的系列文章的第一篇,在这里我将向你展示如何开发一个遗传算法人工智能来用 Python 玩超级马里奥。(文末我的 GitHub 链接上的完整代码)
超级马里奥之地是由任天堂创造的平台游戏,它讲述了一个关于马里奥的故事,一个勇敢的水管工住在蘑菇王国的土地上,他的角色是从恶棍浏览器的手中拯救公主。
下面的 GIF 展示了控制 GBA 超级马里奥世界 1–1 第一部分的遗传算法。在下一节中,我将解释如何自己编写这个算法。
图片作者:超级马里奥陆地 AI——第 30 代
环境
我们旅程的第一步是 Python 和 Game Boy 模拟器之间的集成。对于这一个,我找到了一个很好的 Python 库,叫做 PyBoy。
https://github.com/Baekalfen/PyBoy
按照 PyBoy 的指示,我能够将超级马里奥陆地游戏集成到 Python 中,并开发所有的控制交互。为了创建环境的第一个工作版本,你必须创建一个“init”函数来定义所有的初始变量,如马里奥的寿命、剩余时间、世界等级等等。在这之后,你必须创建一个函数来在游戏结束时重置游戏,并创建一个“step”函数来允许 AI 代理与游戏交互并在游戏上执行操作。
在创建了允许任何人工智能程序与游戏互动并实际玩游戏的环境之后,让我们选择一种算法并开发 AI 代理。
遗传学方法
遗传模型是基于算法的,这些算法使用生物进化的概念来优化它们的行为。
在生物学中,进化是指一个物种在几代人的时间里发生的特征变化,它依赖于自然选择的过程[1]你的 Genome.org(来源 )
照片由 @nci 在 Unsplash 拍摄
生物进化理论的基础是所有物种都是相关的,并随着时间的推移而逐渐变化。该理论指出,群体中的遗传变异会影响物种的物理特征(表型),其中一些特征可能会使个体比其他个体具有优势。”【1】你的 Genome.org(来源 ) 。
这些身体上的优势可以通过父母延续给后代。这种应用于人工智能的理论创造了自我学习代理,它们每一代都在进化,并探索环境以最大化结果。
想法很简单,对于每一个代,我们创造一些物种,并执行 交叉 和 突变 来优化和发展基因,然后执行一个 选择 最后选出最好的物种。
产生
世代是一组物种,每个物种都具有通过突变和交叉产生的特定特征,这些特征是从其父母那里继承的。
将这一概念应用于人工智能,每个物种在第一代出生时都有一套动作,然后根据其适应性选择最佳物种,以延续到下一代。然后,下一代物种经历一个基于上一代的交叉过程来创造后代,并变异以产生可变性。这个过程迭代地继续,直到最后一代。
选择
算法的选择部分是基于查尔斯·达尔文的自然进化理论。
“具有最适合其环境的特征的个体更有可能生存下来,找到食物,躲避捕食者,并抵抗疾病。这些个体更有可能繁衍后代,并将他们的基因传递给他们的孩子。不适应环境的个体不太可能生存和繁殖。因此,他们的基因不太可能遗传给下一代。结果,那些最适合其环境的个体生存了下来,只要有足够的时间,这个物种就会逐渐进化。”[1]你的 Genome.org(来源)
将这一概念应用于 AI,当我们前进到下一代时,我们只选择最适合的个体来“生存”,并将他们的“基因”复制到未来。
交叉
在生殖周期中,当父母将基因传递给下一代时,他们的基因会发生交叉。交叉过程从亲代 1 取一半基因,从亲代 2 取另一半基因,为下一代生成基因。
变化
突变是部分基因随机改变的过程。
这些变化可能只是不影响运动的微小变化,也可能导致全新的特征,彻底改变物种的行为。对于人工智能,我们通过在模型生成过程中随机改变代理动作来执行变异。
健康
遗传算法最重要的变量之一是适应度。
健康是一个变量,它表明了我们希望为我们的环境带来的最大化。适应度公式的微小变化可以导致代理行为的巨大变化。
对于超级马里奥土地,我们希望马里奥向前走,杀死敌人,以完成阶段。因此,当马里奥向前移动或杀死一个敌人时,我们开发一个正值,并且我们对每一秒应用一个折扣,以鼓励马里奥快速向前移动。
实验和结果
在对模拟环境进行编程并实施遗传算法之后,我们可以开始运行模拟并评估模型性能。
出于研究目的,我运行了一个有 30 代和 5 个物种的模型来玩第 1-1 阶段的超级马里奥大陆。以下是第一代的结果:
图片作者:超级马里奥陆地 AI——第一代
马里奥能够向前走,但在第一个障碍中失败了,一个简单的古姆巴。让我们看看代理是否能在一些基因进化后表现得更好…
30 代之后我们注意到了巨大的进化!人工智能代理发现的一些惊人的动作是杀死一些 Goombas 和跳过小管道和高块。看到人工智能可以用动态编程做什么真是太棒了。
图片作者:超级马里奥陆地 AI——第 30 代
我们可以通过下面的基准图表来跟踪这一发展。在图表的第一部分,是每一代的平均适应度(红线)和最大适应度(蓝线),我们可以清楚地看到随着一代的发展,平均适应度和最大适应度的增长趋势。
第二部分显示了每个交互的适应度,我们可以看到每代内部的变化,这是探索旅程的一部分,以及每代最大适应度的增加。
图片作者:超级马里奥陆地 AI——30 代基准
如果您想实现这个解决方案或了解更多关于遗传算法的信息,您可以在下面的链接中找到我的 GitHub repo 上的完整 python 代码:
*https://github.com/octavio-santiago/Super-Mario-Land-AI
非常感谢您的阅读!如有任何问题或建议,请通过 LinkedIn 联系我:https://www.linkedin.com/in/octavio-b-santiago/
参考
[1]你的基因组,美国,2021 年 7 月访问,<https://www.yourgenome.org/facts/what-is-evolution>
更多阅读
教机器阅读电影评论:思考可解释性
语言领域知识如何为洞察力的特征选择提供信息的例子。
照片由 h heyerlein 在 Unsplash 上拍摄
是什么让一篇影评是负面的还是正面的?我的意思是,显然一部真正的电影(《哦,嗨,马克》)会产生一些明显的批评性评论,但作为人类,我们如何阅读评论并理解评论者的总体看法?这是机器学习(ML)中的一个重要问题,部分原因是提高 ML 的性能可能取决于更好地理解我们人类如何做像阅读评论这样的事情。现在,准确地将电影评论分为赞成/反对是非常简单的(现有的方法已经大约 99%准确)。尽管如此,教机器更像人类一样阅读可能意味着以更大的粒度对电影评论进行分类,或者可能让我们转向能够理解复杂、更高风险事物(如公司道德声明或在线阴谋论)的机器。
注意:很多 ML 中的人不认为我们需要理解像阅读这样的人类任务的“如何”。他们认为我们需要更好的算法,更多/更好的计算能力,以及(最重要的)更多的数据。不管怎样,我仍然对回答“如何”这样的问题感兴趣,部分原因是因为我是一名科学家:我想要有助于解决问题的洞察力。但部分原因是因为我是科学家:我只想知道事物是如何运作的。
像“stinker”这样的词是我们如何阅读评论的第一个线索:这些词不依赖于上下文,但总是有好/坏的意思。这个意思(语义)直接关系到对消极或积极的评价,所以如果有人使用了很多明显的积极词汇(“美好的”、“快乐的”、“喜悦的”),这是一个很好的线索,表明我们正在阅读一篇积极的评论。我们可以使用一种“古老而优秀”的 ML 算法来看到这一点:随机森林(RF)分类器。RF 分类器在这里很好,因为除了通常表现良好之外,它还可以输出特征重要性:它使用了数据的什么特征来学习预测(无论什么)?
用文字理解影评
我们可以从使用单词(语言的词汇层次)作为我们的 RF 分类器开始。在第一次尝试中,我们将根据每篇电影评论的术语频率对逆文档频率进行评分,即 TF-IDF 。本质上,这意味着训练分类器,教它寻找在一些文档中频繁出现,但在其他文档中不频繁出现的术语。如果你想想传统报纸的版面,这很容易理解:像“那么”或“也”这样的词将会在报纸的每篇文章中出现。但是,像“金融”、“市场”、“利率”和“经济”这样的词虽然在一些文章(即商业部分)中频繁出现,但在其他部分中相对不常见。
当我们输入我们的训练数据 ( 来自数千条 IMDb 评论的文本),被人类读者标记为“负面”或“正面”,然后分解成单词/单词对进入我们的射频分类器,机器在计算如何区分负面评论和正面评论方面做得非常好:
使用 TF-IDF 分数的随机森林(i 作者的图像)
你可以从左到右穿过对角线阅读上面的混淆矩阵:约 86.5%正确预测负面评价,约 84.4%准确预测正面评价。然后,为了了解模型如何进行预测,我们可以输出要素重要性列表:
TF-IDF RF 分类器的特征重要性(i 由作者创建)
这没什么好惊讶的:像“差”、“最差”和“糟糕”这样的词对于识别负面评价很重要,而相应的“好”、“优秀”和“最好”这样的词对于正面评价很重要。有两个特性稍有不同:“just”(一个限定词)和“bigram”浪费时间(一个价值判断?).但总的来说,前 20 个权重最高的特征并不特别有洞察力。
部分原因可能是重要性值有多低(基本上是一个介于 0 和 1 之间的值,表示该特征对模型的平均贡献百分比)。例如,单个最重要的特征(“坏的”)具有微不足道的 0.0146 重要性值。这可能是为什么除了简单的好/坏之外,功能重要性列表没有非常明显的模式的一个线索:可能有太多不同的词影响评论的观点,没有一个词有很大的权重。在成千上万的文字中很难看出一种模式。也许我们需要更稀疏的东西来获得洞察力。
语言立场:语言移动的分类
如果我们不使用单词和单词对,而是使用单词的类别作为我们的特征,会怎么样呢?卡耐基梅隆大学的大卫·考夫和 T4·石崎在他们的 DocuScope 项目中提出了一个有用的语言立场分类法。DocuScope 建立在一个源自功能语言学和修辞学的专家词典上,涵盖了许多词的类别,例如确定性/不确定性、情感、文化价值观、社会关系等。这些是我们在说话/写作中采用的各种语言姿态。虽然字典中有数百万个单词和短语,但立场类别相对较少(这里使用的版本中有 119 个)。因此,我们可以使用 DocuScope 来计算任何立场类别在我们的文档中出现的次数,而不是将数千个单词传递给 RF 分类器:X%负面单词,Y%抽象概念,Z%争论/否认,等等。当我们将这些向量传递给 RF 分类器时(本质上是每个评论的 119 个姿态值的列表),一个有趣的权衡发生了。
模型准确性与可解释性
使用立场类别(语言的词典学级别)作为特征并不能提高基于单词的模型的性能:
使用姿态向量的随机森林(作者制作的 i 图像)
再次从左向右对角阅读,基于立场的模型预测正面评论的准确率约为 80%,预测负面评论的准确率约为 73%。所以从纯性能的角度来看,使用站姿有损性能。但是洞察力是一个非常不同的故事:
特征对于姿态 RF 分类器的重要性(i 作者的图像)
两个最重要的特征是老朋友——通常是负面和正面的词——这并不奇怪。但是现在它们是一个更强的信号:单个单词“坏”解释了大约 1.5%的特征重要性,立场类别“消极”解释了 9%。
从那里开始变得更有趣了。接下来会出现两种价值观,一种是关于积极的价值观,一种是关于消极的价值观,两者都在公共领域。这些词指的是社会公益(如和平、正义)和社会弊病(如腐败、贫困),比简单的好/坏两极更复杂。事实证明,积极的评论包括谈论“我们作为一个物种的进步”,或以比烂片更“有教育意义”和“更有效的方式”处理重要主题。相反,蹩脚的电影《越界》以“无端的暴力”为标志,在情节上“缺乏想象力,难以置信,令人费解”。因此,除了简单的极性,文化价值观也是教会机器更复杂地阅读更多内容的一部分。反对论点 langauge(“DenyDisclaim”上文)也很重要。例如,在负面评论中,你可能会说,如果你“没有”读过这本书,你可能会喜欢这部电影,但“不幸的是,情况并非如此。”
基于立场的模型告诉我们,理解电影评论最大程度上取决于围绕积极/消极、公共价值、反对意见、抽象概念和社会身份的语言移动(上面列表中的“个人属性”)。其中的一些(积极/消极)我们可能已经猜到了(尽管有经验上的证实和量化是很好的),但其他部分我们可能没有猜到。这是人类可以做的许多事情的一个例子——讽刺,说服——但是很难分析。要做到这一点,我们可能会受益于一种独特的阅读视角:机器阅读。
对同一件事的不同看法
因为计算机和人类阅读方式不同,所以可以高度互补。人类在大量上下文中阅读,引入外部知识,使文本数据的含义更加丰富和精确。但我们也很慢,而没有上下文的计算机阅读却以超人的规模/速度阅读。还有,人类阅读的精准性是串行的:我们一次读一件事,看不到整体。而机器可以鸟瞰大型文本数据集。在许多方面,机器可以补充人类阅读。
斯坦福大学文学实验室的研究人员对比了人类和机器的阅读,使用了识别写作类型的类比,就好像它们是建筑物一样。人类可以使用主题(黑暗的秘密,不断增加的恐惧)来识别哥特式小说这样的流派,就像人们可以使用建筑元素(基座,光滑的表面)来识别新古典主义这样的建筑流派一样。而计算机可以使用字数统计(词汇层面的特征)和 DocuScope 的立场类别(词汇语法特征)来识别相同类型的哥特式小说。这有点像用砂浆中的沙粒(文字)或砖块类型(姿态)来识别建筑。当然,并不是说人类不用文字或者站姿来阅读。相反,我们在没有明确看到更大的图案的情况下使用它们,就像我们识别像装饰艺术这样的图案,而不能轻易地背诵图案的微观特征一样。
我真的很喜欢给机器额外的数据种类/表示来帮助它们更好地阅读的想法。反过来,能够看到引擎盖下,理解机器如何利用这些额外的表示来阅读文本数据,因为它可以扩展人类的知识,可能比电影评论更重要。
不管你叫它英式足球还是橄榄球,人工智能可能正在帮助你的球队
从 2020 年欧洲杯到各国联赛,用人工智能锻造足球冠军
托马斯·塞勒在 Unsplash 上的照片
足球狂热伴随着我们;人们虔诚地追随他们喜爱的球队,啜饮各种不健康的饮料,嚼着一卡车美味的小吃。电视台用各种各样的分析轰炸我们,告诉我们在各种国际比赛中发生了什么,让我们知道看到我们最喜欢的球队举起渴望已久的奖杯的几率。但你有没有问过自己,人工智能(AI)在这一切中有没有任何作用?
当然,我们知道其中的一些技术,比如球门线技术(GLT)和视频助理裁判(VAR)。这些系统帮助裁判在比赛中做出正确的决定。GLT 检查球是否越过了球门线,而瓦尔审查主裁判的决定。但是在幕后,俱乐部正在使用其他系统,很少有人意识到这一点。别忘了足球是一项耗资数百万欧元的运动。人体是用来演奏音乐的主要机器。因此,使用人工智能技术来优化机器是有意义的。
第一个突出的用途是提高运动员的单项成绩。为了做到这一点,俱乐部通常依赖步态分析等。这种分析是对人类运动的系统研究,使用仪器来测量身体运动、力学和肌肉的活动。通过这种方法,他们可以判断运动员是否正确地跑步,确定他是否有任何弱点,并提出进一步改进的方法。典型的步态分析系统需要一个昂贵的实验室,配备大约 16 个摄像头,仔细监控个人的运动。除了不是每个人都能使用这样一个系统之外,它还涉及到大量的时间和精力。但人工智能技术的最新进展使得将这些系统集成到移动设备成为可能,从而允许教练直接从球场上执行自动化步态分析,并毫无延迟地获得初始指示。
Izuddin Helmi Adnan 在 Unsplash 上拍摄的照片
但是,足球不是个人运动,团队合作很关键。正因为如此,第二个明显的用途是在回顾过去的比赛。这种分析有两个显著的好处:优化团队和识别对手的缺陷。通过跟踪过去比赛中的每一名队员,人工智能可以提取重要的统计数据,如成功传球、拦截、接球、犯规、踢球准确性、进球、速度、疲劳等等。系统绘制群体动态并突出显示。然后,它分析这些信息并确定最关键的因素,从而帮助教练在团队环境中为任何球员确定最佳策略。人工智能也处理对方球队的视频,但这一次,它的角色颠倒了。与其说是为了优化,不如说是为了利用对手的弱点。这个信息将允许教练重组他的队伍,利用对手的缺点为自己服务。
理论上,这样的系统听起来很棒。但是比赛中会发生什么呢?我们都知道足球是一个现场动态的游戏。即使球队试图利用对手的弱点,另一名教练也可能意识到这一点,并做出调整来抵消这种失误。再一次,人工智能开始发挥作用。
该系统不仅是一个在比赛前处理数据的分析过程。它也是一个在线教练监控现场比赛。因此,对手球队中发生的变化可以被实时识别,并向主教练提出对策。这个分析也适用于他的团队。此外,我们都意识到人工智能比任何人都快。它存储了每个球员的大量信息,从他的第一场比赛到他最近的一场比赛。该系统可以意识到球员是表现良好还是表现不佳。通过使用所有这些信息,人工智能可以在其数字大脑中进行几场虚拟比赛。它可以窥视未来,并试图确定最成功的战略。一旦它对这个计划有足够的信心,它就可以向主教练提出建议,供他考虑。
当然,我们必须记住,这不是一门精确的科学。过去有过 AI 在足球上惨败的例子。就在一年前,一个苏格兰人工智能系统被设计成在一场直播足球比赛中跟踪球,不断被边裁的光头弄糊涂,反复认为这是球。比赛结束后,他们很快解决了这个问题,但事实是,艾并不是一贯正确的。
本质上,并不能保证人工智能的预测会变成现实。但是考虑到人工智能可以访问的巨大信息库,这种系统中内置的逻辑以及它拥有的相当大的处理能力,它很可能是下一个最好的选择。可以肯定的是,赔率将有利于那些早期使用人工智能的俱乐部。很快,这些改进将会把足球带到一个新的高度,这在几十年前是闻所未闻的。
如果你喜欢这篇文章并想联系我,请通过🖊️ 媒体联系我,🐦推特,🔗领英,📷 Instagram ,😊脸书或者🌐网站
https://medium.com/dataseries/managing-pain-through-distraction-c51e73d49205
Alexiei Dingli 教授是马耳他大学的人工智能教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并成为马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。
关于科技创业公司的神话
加入科技(人工智能)创业公司之前,我希望知道的 3 件事
TL;我应该加入一家科技创业公司吗?根据我从一家大公司到一家初创公司再回来的经历,我总结了一些我认为不应该做的事情。
我交替使用“科技创业”和“人工智能创业”。
我难过;我动心了;我很平静。
在过去的两周里,大约有七封标题为“再见,我的朋友和同事”的电子邮件潜入了我的收件箱。事实上,我把我的朋友送到了他们的下一个章节。他们中的大多数人即将加入不同行业的创业公司,但他们都有一个共同的使命:改变世界,建立酷 sh*t,并实现增长。
看看我接下来几周的日历,我和同事们一起喝了大约五次虚拟咖啡,他们想知道更多关于我离开大型咨询公司并在一家人工智能初创公司工作的经历。他们有不同的兴趣和抱负,但我认为他们都有一个共同的问题:我应该留在这家大公司,还是加入(或创办)一家科技初创公司?
直到现在我才真正反思我的旅程。看着我即将到来的聊天,我至少应该做好准备,尽量提供帮助,并提供一些他们无法简单谷歌的东西。
答案显然是“视情况而定”。我想分享一些我自己在多伦多一家初创公司从成长到退出阶段(被卖给一家大公司)工作的经历,以及与初创公司生态系统中的朋友和同行的交流。以下是帮助您了解背景的附加背景:
- 我大部分时间都花在了售前、集成和产品管理上
- 我在 B2B 技术、销售、产品开发和支持方面的经验对 B2C 创业公司来说是不同的
- 我们构建数据和人工智能产品,并为公司(B2B)和开发者(B2C)提供服务
- 我从一家大型咨询公司离职(又回到了这家公司),所以我更倾向于面向客户的工作和业务。但是我也喜欢作为一名训练有素的计算机工程师的技术工作。
我希望知道的三件事
人们从不同的行业加入或开始创业,但许多人都有一套共同的期望。很多期望都是媒体或创始人(有意无意)虚假宣传的神话。我会告诉你真相。如果你准备好面对这些现实,请加入或创办一家科技创业公司,让世界变得更美好。🚀
神话 1:“我可以解决有趣的问题,并开发出很酷的产品。”不,你需要解决不性感的问题来赚足够的钱来生存。从战术上来说,你的产品需要不酷——换句话说,功能性、稳定性和可扩展性——才能获得 IT 部门的认可。
持续的年度经常性收入(ARR) 是 B2B 科技创业公司最重要的指标。拥有梦想和抱负很重要;赚足够的钱来实现梦想是基础。为了让客户持续支付可观的金额,你必须帮助他们解决真实的、痛苦的、反复出现的问题。这些问题通常是“无聊”的运营问题(例如,减少错误、降低数据存储成本、减少做某事的时间)和监管要求,如隐私、合同和财务控制。
如果你有一个很酷的产品,客户可能会一次性付款作为概念证明,这样他们就可以展示创新(并出于税收目的用完研发预算)。但这并不是一个能让初创公司获得“独角兽地位”并登上《华尔街日报》头版的一致的 ARR。因此,要获得 ARR,您可能必须解决一些“无聊”的东西,并构建一些“不酷”的东西最终,你需要让 IT 部门相信,你的解决方案可以很好地集成,不会搞乱他们的核心流程和系统(通常是枯燥和陈旧的)。最后,你可能会拿到你的第一张支票,并有可能赚更多。
但是,好消息是,你可以(也应该)用包装在一个不酷的包装中的创新方法更好地解决一个无聊的问题——事实上,这就是许多优秀的创业公司如何找到一个适合市场的产品,并与现有公司区分开来。
你应该可以接受的事情: 花时间解决一些无聊的问题,这些问题与花哨的公司网站上宣传的不同。
误区二:“ARR 给了我翅膀,我可以在自动驾驶仪上高飞。”不,你需要燃料来保持飞行并看着你要去的地方。现实世界有许多移动的障碍物。
这意味着,你不可能只造一件东西,卖一次,然后永远靠现金飞得很高(这只存在于 MBA 教科书中)。在现实中,你需要花很多时间和客户在一起,了解他们独特的需求,并据此定制你的产品;你需要提供及时和持续的支持,因为东西总是会坏掉,需要更新;你需要与客户保持联系,以确保你提供的产品明年仍有价值,不会被其他产品取代。最后,明年你可能会得到一张支票。
当你与初创企业创始人或招聘经理交谈时,评估他们对专业服务和客户支持团队的意识和承诺。每个人都喜欢另一家初创公司凭借其神奇的技术产品获得独角兽地位的故事,但不要低估维持 ARR 的成本和努力(这也意味着你的工作保障)。
你应该接受的: 花时间支持客户,而不是不断开发新产品功能。
误解 3:“我可以更快地完成工作。”不,销售和产品开发都将比你预期的要长得多。
作为一个新领域中不知名的初创公司,教育市场和建立客户信心需要时间。作为一家在旧领域提供新解决方案的未知初创公司,说服客户从现有解决方案转向你未经测试的产品需要时间。
如果您跟踪每年的发布数量,并与一个更小更粗糙的团队一起工作,产品开发一开始会感觉很快和敏捷。然而,一个新产品需要经历许多(许多)版本才能达到质量和稳定性,保证一致的 ARR。此外,随着团队的成长和接受来自客户的反馈,团队将不得不经历额外的发布,这是由于返工和支点。
时间变慢了。你可能希望事情能更快完成。伟大的事情不是一夜之间变出来的,而是通过精湛的工艺和深思熟虑的、专注的、持续的努力。
你应该容忍的事情: 耐心地忍受在大公司工作时可能会遇到的挫折。
你准备好迎接挑战了吗?我坚信每个人在职业生涯中都应该尝试一次。我希望这篇文章能帮助你做出明智的决定,做好准备,更重要的是,帮助创业公司避免加深误解和陷入同样的陷阱。每个人都将受益于更多成功的创业公司,它们创造就业机会,让我们的生活更幸福,让我们的世界更适合居住。
喜欢读什么? 跟我上 中 ,LinkedIn,以及Twitter。查看我的《 用机器学习影响 》指南。它帮助数据科学家更好地解决问题、设计和交流。
对于具有数据科学背景并正在寻找退出机会的人来说,我的一些文章可能会有所帮助:
让你在科技领域永不沉没的技能
特隆赫姆峡湾的景色——改变了的日常生活的一部分。作者照片。
我想把这个作品扩展成一个系列——教程 视频 。如果你有兴趣,请 订阅 到我的 简讯 保持联系。
可能没有其他领域像技术一样变化如此之快、如此之快。工具和解决方案往往在不到十年的时间里就过时了,而且报告的热门技能列表几乎每个季度都会更新。
数据科学是一个技术角色像超新星一样爆炸的例子。十年前(本文写作时)还不存在。这似乎是由于大量数据随时可用的结果,这些数据充当了大量等待启动的预煮算法的燃料。
作为一个领域,它邀请了几乎所有人:想要进行“实验”的软件开发人员,(前)厌倦实验室的物理学家,想要将他们的知识付诸行动的统计学家,等等。然而,随着这种令人难以置信的创新速度,如果这个角色在未来十年被淘汰,或者至少被其他东西取代,我不会感到惊讶。毕竟,尽管众所周知超新星很亮,但它会很快消失。
在这篇文章中,我想和你分享我列出的技术技能,我相信这些技能会让你在任何工程学科中永不沉没。作为一名技术人员,在过去的十年里,他的职业生涯经历了两次转折,我被迫放弃和重新学习许多东西。尽管如此,我参与的项目和与我一起工作的人让我意识到存在三种重要的技能,它们是可以转移的,有助于让你成为一个出色的问题解决者。
数学
其中第一个就是简单的数学。然而,这很容易出错,这与纯数学很少直接应用于解决问题的事实有关。坦率地说,我不记得上一次我被要求解决一些方程来修复一个 bug 或让一些东西工作是什么时候了。然而,99%的高年级数学似乎都是关于解方程的。可能跟学校怎么教数学有关?不幸的是,解方程的思维模式使得数学变得无关紧要和不适用。
事实上,数学远不止这些!这是一门教你抽象思维的科学。无论你是否使用它,它都不是关于解方程,而是关于写方程。数学试图告诉你的是,你如何理解你的问题,并帮助你找到一个正确的公式。它是领域建模最纯粹的形式,因为它不附属于任何特定的领域。你探索得越多,你就越了解某些类别的问题以及解决这些问题的可能方法。
这种对数学的视角,给了我无数次的帮助。尽管我已经多年没有计算积分,而且我总是不得不“查找资料”,但从光子传感器设计跳到嵌入式软件,然后跳到电子商务业务中的数据科学是可能的(尽管不是毫无痛苦)。我相信,如果你也采取类似的观点,并允许自己在数学方面变得更强,你将享受更多的职业自由。
跟着错误走
下一项技能与广为宣传的所谓分析技能密切相关。不幸的是,“分析技能”是这些天的流行语,因为每个人都对数据着迷,而你用数据做什么呢?你分析他们。然而,许多分析师不会修理他们的电脑。
同样,这并不像看起来那么简单。在很多地方,熟悉 excel,看剧情就足以成就一番事业。如果你有好奇心,有探索精神,并能得出有创造性的结论,那就太好了!不过,我这里不是讨论态度或者软技能。
我遇到的最值得尊敬的解决问题的人是那些将分析和技术娴熟结合起来的人。这些人拥有巨大的能力,可以将任何问题分解成小块,然后一点一点地检查,修复任何故障。我的朋友称之为“跟随一个错误”,这需要把一个复杂的系统想象成一些小系统的组合。像任何技能一样,它需要耐心和经验,但它几乎违背了当今的普遍趋势,即仅在单一技术(最好是受欢迎的技术)中成为全明星。他们看到了所有的技术,并做好了在任何级别或任何领域工作的准备。
这是否意味着你必须掌握整个技术体系?当然不是!然而,拥有解决依赖性的能力是非常有用的。无论是软件还是硬件,在更基本的层面上理解事物是如何工作的,有助于你在脑海中勾勒出一幅画面。正是创造这种图景的过程,让你从成千上万简历上写着“酷科技 X”的人中脱颖而出。
综合
综合几乎和分析一样,但方向相反。虽然综合也需要创建一个心智模型的能力,但与分析不同,它侧重于将各个部分整合在一起。
合成动作的一个例子是设计一个计算机程序。在这个过程中,更重要的是各个部分如何连接,而不是各个部分本身。同样,我遇到的最熟练的程序员更多地把编程语言和框架看作是一种便利。他们更注重选择或设计零件,使它们的组合最符合逻辑。类似地,硬件设计人员会考虑功能、价格、耐用性、可用性以及最后但并非最不重要的— 接口来采购支持整个画面的组件。
我知道对于那些相信成功在于数据科学的人来说,这可能是个坏消息,数据科学就是“知道”正确的工具。事实是,如果你学会如何从概念上设计一个系统,即使是在抽象的层面上,然后填充模块,你的职业生涯会好得多。因此,要学会设计系统。哪怕是简单的!专注于寻找最直观的界面。
最后的想法
如你所见,我向你展示的技能是高度通用的。他们几乎就像告诉一个空手道拳手专注于平衡和呼吸,而不是练习致命的双踢。
抽象地思考,理解基础知识,设计界面…这些东西从来不会出现在任何工作机会上…
尽管如此,即使你得到了那份工作,你认为你能坚持多久?你认为这项技术能持续多久?有一天你可能会发现没有可行的 Python 或 JavaScript 包来解决你的问题。或者也许你选择改变你的职业?
用最好的机器学习模型,(目前)不可能预测明天会发生什么。但是如果你正在读这篇文章,你很有可能已经走上了工程学的道路。这是一条伟大的道路,但你认为你会不沉吗?
顺便说一句,我认为写非技术技能也是一个好主意。下面是链接:https://towards data science . com/non-tech-skills-that-make-you-sink-in-tech-a 55467 c 702 ea。谢谢大家!
数据科学经理的技术任务。
如何在做管理者的同时不丧失自己的专业技能?
TLDR;你可以成为一名数据科学经理,但仍然可以自己完成工作。
对你来说,转变角色成为一名经理是一个重大的决定。在天生好奇心的驱使下,你不想停止学习新技能,当然,你也不想失去你作为个人贡献者开发的技能。我还假设你有很强的主人翁意识,但是,你不希望一行一行地写代码,对你的团队进行微观管理。在这篇文章中,我提出了一些想法,以帮助你作为一名经理保持更新和积极从事数据科学。
我的技术技能如何帮助我的团队?
作为一名经理,你应该面对过无数的错误和缺陷,从你的经验中,你能够找到创造性的解决方案来节省团队的时间并扩展他们的视野。数据科学世界每天都在变化,如果您能成为贵公司观察外部数据科学世界的眼睛,每个人都会欣赏这一点,尤其是您的团队成员。
还有,有很多任务没人有时间做但是这对团队合作很重要。总的来说,随着分析领域最近受到越来越多的关注,数据科学团队中有许多未填补的空白,这些空白需要在团队中创造新的工作来填补,例如,数据科学家几年前必须做大量的数据工程工作,直到该职位被许多公司定义和采用。您可能需要填补其中的一个空白,成为一个项目中的业务分析师、数据架构师或产品所有者。
你能帮上什么忙?
- **探索新技术:**推荐完成任务的新方法是优秀管理者的品质之一。如果做得正确,它显示了创造力和深厚的技术知识,这是赢得你的团队和利益相关者的尊重最容易的事情之一。这也是一件有趣的事情,有助于你不断更新和学习。
- **解决团队挑战。**了解团队面临的挑战并自己解决这些挑战有助于你掌握团队的工作,因为这有助于你理解细节,而无需自己编写完整的代码。你没有时间自己解决每一个问题,但是专注于主要的挑战并开始制定长期的解决方案是非常好的。
- 探索其他团队在做什么。了解您组织内外的其他数据科学团队在做什么。不要爱上你的想法,也不要爱上你团队的想法。阅读技术博客,提出问题,或者联系你的老队友。这可以是双赢的局面;看看他们正面临什么问题,也许你已经有了解决方案,并询问你的挑战的可能解决方案。
- **组织工作:**当每个人都埋头编码时,有许多工具可以帮助组织工作,但没有人会有时间去探索、维护和确保团队中的每个人都在使用它们。版本控制是许多例子中的一个,团队项目应该是什么样子,更新回购的过程是什么…等等。
- 确保可扩展性&可靠性:没有人喜欢缓慢和不稳定的解决方案,作为一名经理,你喜欢增加对你的团队构建的解决方案的采用,这在没有构建高质量的解决方案的情况下是无法实现的,你的角色是主动预测你的团队构建的解决方案可能会面临什么问题。
- 自动化手动任务:你可以从数据中学到的东西是无限的,但我们团队的带宽是有限的。您应该能够通过为幻灯片或仪表板创建模板,或者通过创建供您的团队使用的代码和包,来识别哪些应该自动化:内部:。**外部:**在可能自动化的情况下,通过自动化任务,如用于仪表板、查询数据和生成高级见解的自助服务工具
数据科学家的技术写作
行业笔记
一个由四个部分组成的公式,可以让你写足够的技术文章
作者的原创艺术
D 数据科学就像在一个新城镇开车:你可能会到达目的地,但解释你如何到达那里是另一回事。在花费数周或数月做了艰苦的技术工作后,数据科学项目的写作阶段可能会令人沮丧。你知道你做得很好——学到了一些很酷的东西!—但是这些文字有时会很慢才出现在页面上。
幸运的是,这是非常可解的。在与数据科学家共事的几年中,我设计了一组尖锐的问题,如果按顺序回答,基本上可以为你写一篇文章。我建议先单独回答每个问题,然后再将它们粘贴到最后的作品中。另外,你可以把每一部分的一个句子串起来,写一个简单的摘要。
风格注释:我们都想成为街区里最有口才的孩子。然而,就技术写作而言,与 elan 相比,其优势在于清晰性和有效性。在你陷入天赋之前,掌握说出你需要说的话的艺术。完全充分的技术写作本身就是一项巨大的成就。不管怎样,成为一个好作家就像变漂亮一样;如果你有有趣的事情要说,两者都会更有趣。
1.有什么问题?
在你工作的某个地方,你正在解决一个或多个问题。很多时候,东西贵了或者亏了。在其他情况下,一些事情是不方便的,低效的,或者让人生病的。隔离主要问题并描述规模、位置、受影响人群等。的问题。举个例子,
“上个季度纸杯蛋糕的销售额下降了,导致我们比目标少了 400 万美元。令人担忧的是,我们估计这些下降主要是由食用我们糕点产品的儿童造成的。这个问题主要出现在太平洋西北部,引发了人们对沉闷天气和低糖饮食的复合心理影响的关注。为了我们的业务和客户的利益,我们渴望解决这个紧迫的问题。”
2.我们对它了解多少?
使用这一部分给出手头主题的背景信息。这包括之前对主题所做的工作和读者应该了解的外围因素。别忘了引用你的资料来源!
历史上,销售额一直稳定在每季度 1000 万美元左右。整个冬天,我们看到了急剧下降到只有 600 万美元,这是自 90 年代末以来我们的竞争对手在一轮独特有效的广告宣传中从未出现过的情况。根据我们的客户调查,98%的客户家庭报告 18 岁以下的居民消费我们的纸杯蛋糕产品。对销售趋势的分析预测,如果这种下降趋势持续下去,到 2022 年,将没有孩子能吃到纸杯蛋糕。
3.我们在做什么?
这类似于方法部分。解释数据收集的过程,你是如何进行分析的,分析的结果,以及你打算解决的问题的解决方案。描述你工作的局限性,并详细说明未来的研究和下一步。
“客户调查由一组训练有素的调查方法学家通过电话进行,使用抽奖参与者提交的联系信息,并从国家数据库中对琐碎的废话进行三角测量。我们的大学实习生使用一个小型开源 Python 包为他的最终项目进行了时间序列分析。看似合理的是,分析一直进行到一些重要的东西出现。根据调查结果,我们将在华盛顿和俄勒冈州加大纸杯蛋糕产品的广告力度。”
4.为什么有人会在意?
如果你所说的内容与读者无关,那么前面三个部分都没有意义。因此,你在这一部分的工作就是准确地解释为什么你的解决方案、发现或创新对他们有用。自然地,有些作品除了最小众的观众之外,对所有人都无关紧要;你不需要说服每一个人,只要是你希望阅读的人。
“纸杯蛋糕是这个世界上仅存的美好源泉,为了我们的员工和顾客,我们应该传播这种快乐。”
这种方法可能不会让你获得诺贝尔文学奖,但是充分的技术写作是为了告诉读者他们应该了解你的作品。通过在他们提问之前回答他们的问题,你已经完成了一项了不起的工作,实现了你的目标:学习很酷的东西,并告诉人们。快乐写作!
https://nancyorgan.medium.com/build-a-career-thats-actually-yours-daba8380ff29
降维技术
使用降维来提高人工智能模型效率的指南
照片由甘特·拉博德拍摄
目前,我们正处于一场美妙革命的边缘:人工智能。除此之外,最近跨公司、组织和政府部门的大型数据集的“大爆炸”导致了数据挖掘技术的大量使用。那么,什么是数据挖掘呢?简单来说,就是在高维数据集(拥有数千列的数据集)中发现趋势和洞察的过程。一方面,高维数据集使组织能够解决复杂的现实问题,例如减少癌症患者的等待时间,预测与新冠肺炎相关的蛋白质结构,以及分析脑磁图扫描。然而,另一方面,大型数据集有时可能包含具有低质量数据的列,这会降低模型的性能-越多并不总是越好。
在低维空间中保留高维数据结构的一种方法是使用降维技术。那么,这样做有什么好处呢?答案是三重的:首先,由于误导性数据较少,它提高了模型精度;第二,该模型训练更快,因为它具有更少的维度;最后,它使得研究人员解释模型更加简单。主要有三种降维技术:( 1) 特征消除与提取,( 2 )线性代数,( 3) 流形。在本文的整个过程中,我们将研究一种在人工智能工作流中实现降维的策略,探索不同的降维技术,并完成一个降维示例。
如何最好地脱离其他:人工智能建模的新策略
对分析进行简单实验的时代已经结束,大多数组织都知道这一点。因此,公司应该将高级分析置于其组织的核心,提供建立有效、高效和成功的公司所需的信息和见解。此外,公司应该努力成为洞察力驱动的组织,支持有见识和有能力的员工。说起来容易,掌握起来难。
目前,大多数组织都运行大型业务和运营报告功能,在整个公司范围内提供传统的定期报告。然而,公司通常会面临一些挑战,例如维护数据质量、单一版本的事实和假设的一致性。因此,在尝试实现大规模人工智能功能之前,组织解决这些挑战至关重要。但是,从短期来看,他们可以考虑制作概念证明,以激发高级分析优势的高级利益相关方的兴趣,这将有助于首席数据官(CDO)争取更多资金来提高整个组织的数据素养和质量。
出于本文的目的,我们将假设您拥有可接受的数据质量来承担更复杂的分析技术。分析师应该采取三个关键阶段来建立一个人工智能模型,包括理解更大的图景,清理数据,以及部署模型。降维技术进入该过程的净化阶段。然而,请注意,分析师理解他们分析的目的是至关重要的;否则,他们可能会低效地使用他们的时间,或者更糟,产生一个不满足涉众需求的模型。
因此,为了生产、监控和维护一个生产就绪的模型,组织应该通过以下阶段工作:( 1 )产生一组用户故事,( 2 )收集数据,( 3 )验证数据,( 4 )考虑与部署您的模型相关的道德规范,( 5 )利用一系列维度缩减技术,( 6 )对数据建模,( 7
大多数降维技术属于三类之一:特征提取和消除、线性代数和流形
特征提取和消除
降维过程的第一个阶段是特征提取和消除,这是选择用于模型的列子集的过程。一些常见的特征提取和消除技术包括:
**缺失值比率。**缺少太多值的列不太可能为机器学习模型增加附加值。因此,当一列超过缺失值的给定阈值时,可以将其排除在训练集之外。
**低方差滤波器。**方差较小的列不太可能为机器学习模型增加太多价值。因此,当一列低于给定的方差阈值时,可以将其从训练集中排除。
**高相关滤波器。**例如,如果多列包含相似的趋势,那么只需将其中一列提供给机器学习算法就足够了。为了识别这些列,分析师可以使用皮尔逊的产品动量系数。
**随机森林。**消除特性的一种方法是使用随机森林技术,该技术针对目标属性创建一个决策树,然后利用使用情况统计来识别最具信息性的特性子集。
反特征消除。向后要素消除是一种自上而下的方法,从数据集中的所有要素开始,一次渐进地移除一个要素,直到算法达到最大容许误差。
前向特征构造。与后向特征消除技术不同,前向特征构造采用自下而上的方法,从一个特征开始,逐步添加下一个性能增加最多的特征。
线性代数方法
最著名的降维技术是实现线性变换的技术,例如:
主成分分析。PCA 是一种无监督的机器学习算法,它可以降低数据集的维度,同时尽可能多地保留信息。为此,该算法从现有的一组特征中创建新的一组特征。但是,请注意,为了避免具有较大值的特征在结果中占主导地位,所有变量都应该在相同的范围内。在 Python 的 scikit-learn 中,为了实现这一点,可以使用“StandardScaler”函数来确保所有变量都在相同的范围内。
线性判别分析(LDA)。 LDA 是一种监督技术,旨在尽可能多地保留因变量的判别能力。为此,首先,LDA 算法计算类之间的可分性;其次,计算每一类样本与均值之间的距离;最后,它在低维空间中产生数据集。
**奇异值合成。**奇异值分解从数据集中提取最重要的特征。这种方法特别受欢迎,因为它基于简单、可解释的线性代数模型。
多方面的
非线性降维的一种方法是流形学习。那么,什么是流形学习呢?简而言之,流形学习使用几何属性,将点投影到更低维度的空间,同时保留其结构。一些常见的流形学习技术包括:
Isomap 嵌入。 Isomaps 试图通过生成嵌入式数据集来保留数据集中的关系。为了实现这一点,isomaps 从生成邻域网络开始。接下来,它会估计所有成对点之间的测地线距离,即曲面上两点之间的最短路径。最后,利用测地距离矩阵的特征值分解,确定数据集的低维嵌入。
**局部线性嵌入(LLE)。**此外,像 isomaps 一样,LLE 试图通过生成嵌入式数据集来保留数据集中的关系。为此,首先,它找到这些点的 k-最近邻(kNN );第二,它将每个数据向量估计为其 kNN 的组合;最后,它创建低维向量来最好地再现这些权重。这种算法有两个好处:第一,与线性代数方法相比,LLE 能够检测更多的特征;第二,与其他算法相比,它更有效。
**t-分布随机邻居。**SNE 霸王龙对局部结构特别敏感。这种方法是最好的可视化方法之一,有助于理解数据集的理论属性。但是,请注意,这是计算开销最大的方法之一,在应用此技术之前,应该使用其他技术,如缺失值比率。此外,在应用此技术之前,应缩放所有要素。
没有一种降维技术能始终提供“最佳”结果。因此,数据分析师应该探索一系列选项和不同降维技术的组合,以便他们将模型移向最佳解决方案。
在这个工作示例中,我们将探索如何使用主成分分析(PCA)来降低数据集的维度,同时保留重要的特征
对于下面的例子,我们将使用众所周知的“Iris”数据集(见表 1),它是由 UCI 机器学习知识库提供的。这个数据集有来自三个不同物种的 150 种花。数据集有三个唯一的类:(1)Iris-setosa;(2)Iris-versi colour;还有( 3 )鸢尾-海滨鸢尾。它还有四个独特的特征:( 1 )萼片长度;( 2 )萼片宽度;( 3 )花瓣长度;和( 4 )花瓣宽度。为此,我们将使用 pandas 导入数据集,然后删除空白行(参见图 1)。
图 1:导入“Iris”数据集
完成后,您应该会看到下面的数据(见表 1)。
表 1:Iris 数据集的前五行
在这之后,我们将把前四个特性列分配给变量“X”(从左到右),然后我们将把类列(最右边的一列)分配给变量“y”(见图 2)。
图 2:分配 x 和 y 变量
数据集通常包含具有不同单位的不同特征的数值,如身高(m)和体重(kg)。然而,机器学习算法会额外强调体重特征而不是身高特征,因为体重值大于身高。但我们希望确保机器学习算法同等重视每一列。那么,我们该怎么做呢?一种方法是使用一种叫做标准化的技术来衡量这些特征。
因此,在本例中,我们将应用 scikit-learn 内置的“StandardScaler”函数,因此对每一列都给予同等的重视(参见图 3)。因此,标准化将确保每个特征的均值为零,标准差为一。
图 3:将标准缩放器应用于“Iris”数据集
然后,我们将导入、初始化 scikit-learn 中内置的 PCA 算法,并将其应用于我们之前定义的“X”变量(见图 4)。
图 4:将 PCA 应用于“Iris”数据集
现在,为了理解这些类是如何分布在这些特性中的,让我们制作一些直方图(参见图 5)。
图 5:按 iris 类绘制每个数字列的直方图
运行上面的代码(参见图 5)后,您应该会看到一系列类似于下图的图形(参见图 6)。
图 iris 类别的每个数字列的直方图
接下来,我们将调用 scikit-learn 的 PCA 函数,然后通过散点图可视化得到的主成分(见图 7)。
图 7:两个主要成分的散点图
最后,我们可以看到 PCA 算法已经有效且高效地将我们的三个独特类跨两个主成分进行了分组(参见图 8);这两个主成分分布最广。在下图中,我们可以看到三个不同的集群,它们现在的格式更适合人工智能算法处理。
图 8:两个主要成分的散点图
组织应确保降维包含在他们的人工智能工作流程中
在高级分析中,越多的数据自动被认为越好,我们重新发现了从数据集中删除离群值、低质量数据和缺失值的价值,以提高模型的准确性和训练时间。虽然没有降低数据集维度的灵丹妙药,但数据分析师应考虑采用和试验不同特征提取和消除、线性代数和流形技术的组合,以优化算法的功效。
文献学
Judy,R. (2019) 机器学习降维初学者指南。走向数据科学。可从:https://towards data science . com/dimensionalization-reduction-for-machine-learning-80 a 46 C2 ebb 7 e【2020 年 4 月 15 日访问】。
普雷纳,S. (2020) 降维方法。走向数据科学。可从:https://towards data science . com/dimensionality-reduction-approach-8547 c4c 44334【2020 年 4 月 15 日获取】。
Hinton,g .和 Maaten,L. (2008) 使用 t-SNE 可视化数据。多伦多大学。可从:http://www.cs.toronto.edu/~hinton/absps/tsne.pdf【2021 年 4 月 16 日获取】。
数据人。(2019)Python 的降维技术。走向数据科学。可从以下网址获得:https://towardsdatascience . com/dimension-reduction-techniques-with-python-f 36ca 7009 e5c【2021 年 4 月 16 日获取】。
Wattenberg 等人(2016) 如何有效使用 t-SNE。蒸馏。可从:https://distill.pub/2016/misread-tsne/【2021 年 4 月 16 日获取】。
数据人。(2019) 自动编码器异常检测变得简单。走向数据科学。可从以下网址获取:https://towards data science . com/anomaly-detection-with-auto encoder-B4 cdce 4866 a 6【2021 年 4 月 26 日获取】。
费弗曼等人*。* (2016) 检验流形假设。美国数学学会杂志。可查阅:http://www . MIT . edu/~ mitter/publications/121 _ Testing _ manifold . pdf【2021 年 4 月 16 日查阅】。
Belkin,m .和 Niyogi,P. (2013) 用于降维和数据表示的拉普拉斯特征映射。麻省理工学院。可从以下网址获取:http://www2 . IMM . dtu . dk/projects/manifold/Papers/laplacian . pdf【2021 年 4 月 16 日获取】。
Silipo,R. (2015) 数据降维的七种技术。KD 掘金。可从:https://www . kdnugges . com/2015/05/7-methods-data-dimensionality-reduction . html【2021 年 4 月 17 日访问】。
布朗利,J. (2020) *用 Python 实现六种降维算法。*机器学习精通。可从:https://machine learning mastery . com/dimensionally-reduction-algorithms-with-python/【2021 年 4 月 17 日访问】。
Scikit 学习(未标出)歧管学习。Scikit 学习。可从:https://scikit-learn.org/stable/modules/manifold.html【2021 年 4 月 17 日获取】。
Brems,M. (2017) 主成分分析一站式商店。可从以下网址获得:https://towardsdatascience . com/a-一站式主成分分析商店-5582 FB 7 E0 a9 c【2021 年 4 月 17 日获取】。
杜克大学。(n.d.) 线性回归模型。可从:http://people.duke.edu/~rnau/testing.htm【2021 年 4 月 17 日获取】。
主成分分析:直观解释。可从:https://setosa.io/ev/principal-component-analysis/【2021 年 4 月 17 日获取】。
Gormley,M. (2017) PCA +神经网络。可从以下网址获取:https://www . cs . CMU . edu/~ mgormley/courses/10601-s17/slides/lecture 18-PCA . pdf【2021 年 4 月 17 日获取】。
Mohamed,O. (2021) 民主在特征选择中的力量。可从以下网址获取:https://towards data science . com/the-power-of-democracy-in-feature-selection-DFB 75 f 970 b 6 e【2021 年 5 月 3 日获取】。
Palaniappan,V. (2021) 流形学习:背后的理论。可从以下网址获得:https://towards data science . com/manifold-learning-the theory-behind it-c 34299748 FEC【2021 年 5 月 3 日获取】。
为建模准备数据:特征工程、特征选择、降维(第二部分)。可从:https://towards data science . com/getting-data-ready-for-modeling-feature-engineering-feature-selection-dimension-reduction-39 DFA 267 b95a【2021 年 5 月 3 日访问】。
拉什卡,S. (2015) *三个简单步骤的主成分分析。*可从:https://sebastianraschka . com/Articles/2015 _ PCA _ in _ 3 _ steps . html【2021 年 5 月 3 日访问】。
机器学习中处理欠拟合和过拟合的技术
由 Unsplash 上的 Pietro Jeng 拍摄
在本文中,我将讨论各种可以用来处理过拟合和欠拟合的技术。我将简要讨论欠拟合和过拟合,然后讨论处理它们的技术。
介绍
在我之前的一篇文章中,我谈到了偏差-方差权衡。我们讨论了偏差-方差与模型复杂性的关系,以及欠拟合和过拟合的情况。如果您不理解这些术语,我鼓励您阅读这篇文章:
让我们快速回顾一下下图。
来源:线性回归的欠拟合、最佳拟合和过拟合[1]
欠拟合发生在模型有非常高的偏差,无法捕捉数据中的复杂模式的时候。这导致更高的训练和验证错误,因为模型不够复杂,不足以对底层数据进行分类。在上面的例子中,我们看到数据具有二阶关系,但是模型是线性模型,所以它不能
过度拟合则相反,因为模型过于复杂(或更高的模型),甚至会捕捉到数据中的噪声。因此,在这种情况下,人们将观察到非常低的测试误差值。然而,当它不能推广到验证集和测试集时。
我们希望找到模型在训练和验证误差值之间具有较小差距的最佳拟合情况。它应该比另外两种情况更好地概括。
如何处理不合身
- 在这种情况下,最佳策略是通过增加深度学习模型的参数数量或模型的阶数来增加模型的复杂性。拟合不足是由于模型比需要的简单。它无法捕捉数据中的模式。增加模型复杂度将导致训练性能的改善。如果我们使用足够大的模型,它甚至可以实现零训练误差,即模型将记住数据并遭受过拟合。目标是达到最佳的甜蜜点。
- 尝试为更多的纪元训练模型。确保损失在培训过程中逐渐减少。否则,很有可能是训练代码/逻辑本身存在某种 bug 或问题。
- 如果您没有在每个历元后重排数据,可能会损害模型性能。此时,确保您正在混洗数据是一个很好的检查。
如何处理过度拟合
与欠拟合相反,有几种技术可用于处理过拟合,人们可以尝试使用。让我们一个一个来看。
1。获得更多的训练数据:虽然获得更多的数据并不总是可行的,但是获得更多有代表性的数据是非常有帮助的。拥有更大的多样化数据集通常有助于提高模型性能。你可以得到一个更好的模型,它可能会更好地概括。这意味着模型在看不见的数据(真实测试集)上的性能会更好。
2。增强:如果你不能获得更多的数据,你可以尝试增强来增加数据的变化。扩充意味着通过类似于您在真实数据中可能预期的变化的转换来人为地修改您的现有数据。对于图像数据,【https://imgaug.readthedocs.io/en/latest/】的是一个非常全面的库,给你大量的增强方法。它允许你快速有效地组成强大的增强序列。我推荐以下两篇文章,供进一步阅读。Olga Chernytska 有一篇关于图像增强的详细文章,你应该考虑阅读一下。 Valentina Alto 在本文中很好地解释了如何在 Keras 中进行图像增强。
3。早期停止[2,3] :早期停止是一种正则化形式,以避免在用迭代方法训练学习者时过度拟合,例如梯度下降[2]。在训练神经网络时,我们迭代地使用来自训练数据的梯度,并试图使模型更好地逼近潜在的真实世界函数。从某种意义上说,这种方法可以让你停在最佳拟合点或其附近。从而防止过度适应训练集并减少泛化误差。为了决定何时停止,我们可以监控某些指标,如 loss、test_accuracy、val_accuracy,并根据满足的某些条件停止训练。
4。正则化 L1,L2 :正则化是一个附加项,它被添加到损失函数中,对大的网络参数权重施加惩罚,以减少过度拟合。L1 和 L2 正则化这两种广泛使用的技术。虽然它们惩罚大的权重,但是它们都以不同的方式实现正则化。
L1 正则化: L1 正则化将权重参数的 L1 范数的缩放版本添加到损失函数中。L1 正则化的等式为:
其中 Lreg =正则化损失,E(W) =误差项,λ是超参数,||W||₁是权重的 L1 范数
现在,即使误差项为零,只要权重不为零,我们仍将具有+ve 高 Lreg 值。由于优化问题的目标是最小化 Lreg,将重量设置为零将导致更低的损失。权重中的零越多意味着越稀疏。有可用的几何解释表明稀疏解更多。您可以观看/阅读以下视频/文章:
- https://www.youtube.com/watch?v=76B5cMEZA4Y
- 稀疏性和 L1 范数https://towardsdatascience . com/regulation-in-machine-learning-connecting-the-dots-c6e 030 BF addd
- https://developers . Google . com/machine-learning/crash-course/正则化稀疏性/L1-正则化
- 针对稀疏性的正则化:L₁正则化https://www . INF . ed . AC . uk/teaching/courses/mlpr/2016/notes/w10a _ sparsity _ and _ L1 . pdf
L2 正则化:我们将权重的平方 L2 范数添加到成本/损失/目标函数中。L2 正则化的等式如下:
其中 Lreg =规则化损失,E(W) =误差项,λ是称为规则化率的超参数,||W||₂是权重的 L2 范数
该方程的导数导致优化期间权重更新方程中的以下项:
其中η是学习率
我们看到旧的权重被(1-ξλ)缩放或者随着每次梯度更新而衰减。因此,L2 正则化导致更小的权重。因此,它有时也被称为重量衰减。要获得详细的解释,我强烈推荐你阅读谷歌机器学习速成班的这篇文章:简单的正则化:L₂正则化
Dropout [4] :这种技术的主要思想是在训练过程中从神经网络中随机丢弃单元。在以下论文中提出:辍学:防止神经网络过度拟合的简单方法(2014)Srivastava 等人在训练期间,随机辍学样本形成了大量不同的“稀疏”网络。通过从概率为 p (用于得到 1)的伯努利分布中提取来构建矩阵,从而实现丢失(即丢失概率为 1-p ),然后与隐藏层的输出进行逐元素乘法。下图显示了培训阶段的辍学情况。
来源:[4]
辍学确保没有一个神经元最终过度依赖其他神经元,而是学习一些有意义的东西。可以在卷积层、池层或全连接层之后应用 Dropout。
需要记住的另一件事是,由于在训练过程中,所有的神经元并不是一直都是活跃的,而是有一个概率 p,所以在推理过程中,权重需要与该值成比例。你可以在文章中读到更多关于缩放需求的内容: CS231n 卷积神经网络用于视觉识别
来源:[4]
DropConnect :这种技术就像把辍学带到了下一个层次。我们不是随机丢弃节点,而是随机丢弃权重。所以我们不是关掉一个节点的所有连接,而是切断某些随机连接。这意味着具有 DropConnect 的全连接层变成了稀疏连接层,其中在训练阶段随机选择连接[5]。对于 DropConnect 层,输出如下所示:
其中 r 是层的输出,v 是层的输入,W 是权重参数,M 是用于截断随机连接的掩码矩阵,这些随机连接是以概率 p 从伯努利分布中抽取的。掩码 M 的每个元素是在训练期间针对每个示例独立抽取的。作为这些随机连接丢弃的结果,我们获得了网络权重的动态稀疏性,从而减少了过度拟合。
参考
[1] Pinterest 图片
[2] 提前停车
[3]https://machine learning mastery . com/early-stopping-to-avoid-overtraining-neural-network-models/
[4] Nitish Srivastava、Geoffrey Hinton、Alex Krizhevsky、Ilya Sutskever 和 Ruslan Salakhutdinov。2014.辍学:防止神经网络过度拟合的简单方法。j .马赫。学习。第 15 号决议,第 1 段(2014 年 1 月),1929-1958 年。
更多推荐
所有评论(0)