关联规则与 Apriori 算法
原文:https://towardsdatascience.com/association-rules-with-apriori-algorithm-574593e35223
了解如何查找频繁项集并计算置信度和支持度
Apriori 算法试图从数据库的交易中学习关联规则,即逻辑关系。目标是找到频繁出现的项目集,例如数据库中频繁出现的产品。
关联规则搜索的一个例子
在日常生活中,我们经常会遇到可以在捆绑中买到更便宜的产品组合。例如,在许多快餐店里,主菜与配菜和饮料一起打折出售。这背后的原理总是一样的:经常一起购买的产品,如果直接捆绑购买,价格会更低。这不仅在快餐店流行。它现在也可以在超市和时尚网上商店找到,因为它使顾客购物更容易,并为卖家带来更高的销售额。
照片由 Unsplash 上的 CardMapr.nl 拍摄
为了能够找到这样的包,使用了 Apriori 算法。为此,搜索供应商的订单数据库,并尝试建立关联规则。在我们能够继续该算法的确切过程之前,我们必须澄清在这种情况下使用的几个术语。
术语解释
Apriori 算法使用了一些在我们的语言使用中并不常见的概念和规则。因此,在我们能够致力于算法的流程之前,我们在这里简要地解释最重要的几个。
什么是项目集?
一组元素称为一个项目集。包含 k 个元素的集合也称为 k-项集。项集必须至少由两个元素组成,并且可以表示购物过程中的购物车。例如,在超市购物的项目集包括面包、黄油、牛奶和鸡蛋。
支持和信心有什么关系?
在我们可以寻找频繁出现的包之前,我们需要度量特定项目集被一起购买的频率的指标。为此,我们使用信心和支持。
支持衡量产品的相对购买频率:
支持公式|来源:作者
另一方面,置信度度量对包含元素 A 和 B 的所有事务的支持,并将它们除以对 A 的支持:
信心公式|来源:作者
对于超市,这些比率的计算如下:
假设数据库总共包括 500 次购买。在 300 个案例中,购买包括一个巧克力棒。所以对巧克力的支持是:
支持巧克力|来源:作者
反过来,在购买巧克力的 100 次购买中,也购买了牛奶。因此,对牛奶和巧克力的信心源于:
自信牛奶和巧克力|来源:作者
这意味着 60%的交易都是购买巧克力。同样,在三分之一的“巧克力交易”中,牛奶也被购买。
什么是关联规则?
关联规则试图在达到给定支持度和置信度的两个或多个元素之间找到某种规律性。
什么是频繁项集?
频繁项目集是一组经常一起出现并达到预定义的支持度和置信度的项目。使用关联规则可以发现频繁项集。
Apriori 算法是如何工作的?
Apriori 算法是发现数据集中频繁项目集的方法之一。它分两步工作,即“连接”和“修剪”,这两步迭代执行,即连续执行几次。
Join :这一步形成集合 K 的项目集。k 代表重复步骤。
剪枝:在这一步中,所有没有达到预定义的支持阈值并因此被认为是稀有的项目集都被删除。
Apriori 算法利用了所谓的反质子特性。简而言之,这意味着如果由几个元素组成的项目集没有达到最小支持度,那么所有超集(由项目集的元素组成的所有集)也没有达到最小支持度。在我们的例子中,这意味着如果牛奶和饼干项集没有达到最小支持度,那么牛奶、饼干和巧克力项集不能超过最小支持度。
在每一次新的迭代中,项集被扩展一个元素,并再次执行“连接”和“修剪”步骤。如果在迭代中没有找到新的项集,则该算法终止,但只保留上一步中的项集。
通过例子先验地
对于我们的例子,让我们回到我们的超市。其数据库中总共有六笔交易。
超市交易|来源:作者
对于我们的关联规则,我们希望达到 50%的支持度和 70%的置信度。这些值完全是任意的。
第一步(K=1): 在第一步中,我们搜索数量为 1 的项目集,也就是说,我们计算单个产品总共被购买的频率。这对应于第一阶段中的加入步骤。
第一级中的项目集|来源:作者
步骤 2 (K=1): 连接步骤之后是修剪步骤,在该步骤中,我们移除未达到最小支持度的所有项目集。我们选择了 50%的支持度。由于计算支持度的形式,这意味着在六个事务中,项集必须至少出现三次才能满足支持度。所有其他项目集都可以删除:
修剪后第一层中的项目集|来源:作者
因此,产品/项目集“Bread”会掉出,因为它只出现两次。
步骤 3 (K=2): 完成连接和修剪步骤后,我们进入第二阶段。这里,项集大小现在是 2。可能的项目集是来自前一个阶段的所有剩余产品的组合。
第二级项目集|来源:作者
步骤 4 (K=2): 在剪枝步骤中,未达到最小支持度三的项目集被再次移除。因此,组合(牛奶、米饭)和(面条、米饭)被丢弃:
剪枝后第二层的项集|来源:作者
第 5 步(K=3): 在这一步中,我们形成数量为 3 的项目集,这是可以由剩余乘积形成的数量:
第三级中的项目集|来源:作者
我们没有购买这些项目集,但是您仍然可以检查这些项目集是否会得到支持。为了这个目的,我们利用了锑的性质。这里我们注意到项目集(牛奶,巧克力,大米)由子集(牛奶,巧克力),(巧克力,大米)和(牛奶,大米)组成。然而,项集(牛奶,大米)无法达到支持度,因此较大的项集(牛奶,巧克力,大米)也不能是频繁的,即使它没有数字。
按照同样的推理,项目集(牛奶,面条,米饭)和(面条,巧克力,米饭)也会被删除,因为项目集(面条,米饭)出现的频率不够高。最后剩余的项目集现在可以用于使用置信度导出关联规则。
**第六步:**我们可以检查以下关联规则:
(牛奶、巧克力)→(面条)|来源:作者
(牛奶、面条)→(巧克力)|来源:作者
(巧克力、面条)→(牛奶)|来源:作者
(牛奶)→(巧克力、面条)|来源:作者
(巧克力)→(牛奶、面条)|来源:作者
(面条)→(牛奶、巧克力)|来源:作者
在运行 Apriori 算法之后,总共出现了五个关联规则,它们经受住了我们 70%的置信度。这些包括规则“(牛奶,巧克力)->(面条)”。这意味着,如果已经购买了牛奶和巧克力,那么购买面条也很有可能。
使用 Apriori 算法的优缺点是什么?
Apriori 算法是在具有许多事务的大型数据库中发现关联规则的好方法。此外,join 和 prune 步骤在编程语言中相对容易开发,例如 Python 。此外,还有一些模块可以进一步简化 Apriori 算法的导入。
然而,对于大型数据库,该算法的计算量非常大。正如在我们的例子中已经变得清楚的,必须计算许多组合和步骤,即使在我们的简单例子中,这也占用了大量的时间和资源。因此,在实施之前,必须确保努力是值得的。
什么应用使用这种算法?
有几个应用程序需要搜索关联规则,因此需要使用 Apriori 算法。以下是在其中搜索关联的一些主题:
- 教育:在教育中,人们寻求联想,例如,当试图找出为什么一些学生在某些科目上比其他人做得更好的时候。
- 医学:在新药开发中,研究关联规则,以确定新药如何与物理特征相互作用。为此,对测试药物的样本进行了更详细的研究。
- 生物学:在世界各地,森林火灾变得越来越频繁。因此,我们目前正在调查哪些预警因素,如极端干旱或高温,与森林火灾有关,以便能够尽早发现和预防火灾。
- 电商&推荐:我们在本文中了解到了 Apriori 算法的经典例子:购物车分析。基于以前客户的购买行为,它试图识别产品之间的关联,然后使用这些进行产品推荐。
照片由rupixen.com在 Unsplash 上拍摄
Apriori 算法如何改进?
对于大型数据库,Apriori 算法可能效率非常低,而且会花费大量时间。因此,目前有一些方法有助于使算法更有效和更快。其中包括:
- 基于散列的项目集计数:该方法试图加速项目集的创建。为此,使用了所谓的散列表,该散列表给每个产品或交易一个唯一的号码。这意味着不必包含和处理占用大量内存的字符串,而是包含和处理更高效的散列。
- 事务减少:在执行 Apriori 算法之前,在数据库中搜索重复的事务,然后将其排除。同样,罕见的事务在早期阶段被过滤掉,因为它们在算法的计算中不起作用。
- 分区:对于这种方法,数据库扫描的次数显著减少。这里的基本思想是,一个项集只有在两个数据库分区中的至少一个分区中出现时才能是频繁的。这意味着整个数据库只需扫描两次,效率会高得多。
- 采样:这种方法不是在整个数据库中搜索频繁项集,而是只取数据库中的一个检查单元进行检查。但是,存在丢失实际上频繁的项集的风险。为了避免这种风险,应该使用相对较低的支撑。
- 动态项集计数:使用这种方法,在扫描数据库的同时,已经可以发现新的潜在项集。
这是你应该带走的东西
- Apriori 算法试图从数据库的事务中学习关联规则,即逻辑关系。目标是找到频繁出现的项目集,例如数据库中频繁出现的产品。
- Apriori 算法分两步工作(“Join”和“Prune”),依次迭代执行。
- 在每一步中,都会创建一个项集,该项集比前一步大一个乘积(“联接”)。然后,检查这些项目集的哪一个满足先前定义的支持,从而保留下来。
- 虽然 Apriori 算法相对容易理解和实现,但对于大型数据库来说,它的效率非常低,并且需要大量的计算能力。因此,已经有一些方法来提高算法的性能。
- 在实践中,每当寻找关联规则时,就使用 Apriori 算法。例如,这包括医药、生物或电子商务。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5*获得会员资格*
* *
OLS 回归中的假设——它们为什么重要?
原文:https://towardsdatascience.com/assumptions-in-ols-regression-why-do-they-matter-9501c800787d
为什么你应该关心他们,他们是如何建立或破坏你的回归模型的
作者图片
当然,你知道线性回归!
很有可能,你已经用 R 和 Python 运行了数百个线性回归模型。你只需要从 R/Python 库中调用一个函数,瞧!
这还不是全部。对于如何运行回归诊断,您也有一个合理的想法(或者可能是您的数据管道为您做的!).
那么,为什么回归最基本的东西并理解“假设”有那么重要呢?
为什么?
事实证明,对这些假设的合理理解似乎过于“理论化”,最重要的是,可以接受的是,对于大多数数据科学初学者(包括我自己)来说,有点无聊,他们希望投入建模并测试他们的模型的预测能力。
然而,模型得出的结果可能从“无效”到“无用”,这取决于这些假设是否得到满足(模型仍然会给出那些结果!).大量的 ML 和统计建模尝试失败的原因只有一个——缺乏正确的问题定义,没有关注模型的基本理论。
在数据科学中,更常见的是在计量经济学中,通常最重要的不是简单的预测,而是建立可靠的因果联系,使人们能够操纵自变量以实现因变量的预期结果。如果一个计算模型的参数由于理论上的不一致而被直接拒绝,我们就不能这样做!
虽然许多讨论这一主题的教科书需要耐心地浏览所有的方程和符号,但许多关于这一主题的在线文章完全跳过了数学,解释也变得过于肤浅。目前的文章介于两个极端之间,主要目的是容易地提供正确的直觉;同时为感兴趣的读者提供了一个对数学的初步了解。
总结一下——这篇文章用简单的英语(以及一些对大脑友好的例子)解释了以下内容
- OLS 回归的假设到底是什么?有些教科书说有 5 个,有些说有 6 个,有些说有 10 个…让我们永远解决这个困惑吧!
- 最重要的是,每个假设在数学上有什么贡献?
- 什么会真的( 真的! )发生,如果其中任何一条被违反了呢?
在我们开始之前你必须知道的。
在我们开始之前你需要一些大脑纹身。
- ‘线性回归’是一个模型。“普通最小二乘法”,缩写为 OLS,是模型参数的估计器(在许多其他可用的估计器中,例如最大似然)。了解模型和它的估算者之间的区别是至关重要的。
- 当我们讨论假设时,需要注意的是,所有这些假设都是对***【OLS 估计量】*** 的假设(而不是对线性回归模型本身的)。
- 正如我们将看到的,这些假设中的一些是模型的基本有效性所需要的,另一些是任何估计量的一些特定的“期望的”统计特性所需要的。当最有意义的时候,我们会介绍它们(例如高斯马尔可夫定理的大脑友好版本)。
- 虽然不同教材和文章中假设的数量和顺序有所不同;从概念上讲,为了更好地理解,我们可以把几个假设放在一个标题下。这给了我们总共七个 假设,这将在下面讨论。
- 为了符号的方便,我们坚持线性回归的经典矩阵符号
作者图片
其中 y 为响应变量向量, ϵ 为随机扰动向量, X 为自变量数值矩阵(其中 n 行数据点, k 列回归变量 xᵢ *包括截距)。*第一列 x₁ 仅包含 1,以说明截距参数β₁的系数)
现在来看假设,让我们直接开始吧!
1.线性
虽然这看起来是最基本的,但我向你保证它不是。
这是唯一可能同时适用于 OLS 估计器和 LR 模型本身**、**的假设,原因略有不同。
首先,线性对于“模型”意味着什么?
嗯,线性回归是很容易理解的,“线性”。
当您选择线性回归作为备选模型时,您打算拟合一条线,或者更一般地说,拟合一个超平面来解释回归量 y 和回归量 X(x₁、x₂,…,xₖ).之间的关系
您选择使用 LR 一定是基于对数据的某种预先探索。例如,你可能在 Y 和每个 xᵢ 之间画了一个老式的散点图,并注意到一个没有任何明显曲率的相当线性的图案。
但是如果你注意到 y 和某个 xᵢ的曲线有明显的弯曲呢?还能用 LR 吗?
不。用一条线(超平面)来拟合一个明显的非线性关系是没有意义的。这不是一个很好的契合,也违背了建模的目的。那你是做什么的?
这就是 变量转换 的用武之地。LR 不需要 y 总是与 x 线性相关。它需要的是 y 的函数,比如说 f(y) 与 x 的函数线性相关,比如说 g(x) 这样我们就可以将关系建模为
作者图片
尽管 y 和 x 之间的关系不完全是线性的,但以上所有都是有效的线性回归模型。
警告:虽然变量转换可以模拟回归变量和回归变量之间的非线性关系,但它可能会使系数的解释有点棘手。
第二,线性对于“OLS 估计量”意味着什么?
真实形式 OLS 假设不是关于“变量的线性”,而是“参数的线性”。
事情是这样的,一般来说,这不是你需要确保的事情。这是一个理论上的假设,OLS 推导真的
OLS 估计量分两步导出:
- 得到“误差平方和”表达式相对于每个βᵢ.的偏导数这会给你 k 个表情。使这些都等于零(对于最小的表达式,一阶导数应该为零)。所以现在你有 k 个未知量的 k 个方程。
- 当你求解β系数估计向量的这些方程时,你得到如下的封闭形式的解(用矩阵符号)
作者图片
这样找到的上述解依赖于我们在上述步骤 1 中获得的方程。如果βᵢ的模型不是线性的,这些方程看起来会完全不同,上面第 2 点的解决方案也是如此。
因此,参数的线性是 OLS 回归的基本假设。然而,每当我们选择进行 OLS 回归时,我们只需要确保**‘y’和‘x’**(或变换后的’**y’**和变换后的’x’)是线性相关的。在 OLS 估计过程本身中假设β的线性。虽然我们不需要太担心,但理解它是很重要的。
2.满秩
这个假设本身包含三个假设。
- 任何回归变量之间都不应该有任何完美的多重共线性。
- 观察值的数量(矩阵 X 的 n 行)应该大于回归量的数量(矩阵 X 的 k 列)。
- 对于简单线性回归的情况,回归量 x 的所有值不应该相同。
虽然许多教科书分别提到了这些假设,但这些假设可以被准确地理解为一个假设,即回归矩阵 X 应该是“满秩”的。
矩阵“满秩”是什么意思?简单地说,你不能将矩阵中任何一列的值表示为其他列的线性组合。换句话说,所有列应该彼此线性独立。如果一个列可以用其他列来线性表示,那么这个列就是多余的,矩阵就变得“秩亏”了。
当一个矩阵秩亏(非满秩)时,它的行列式为零,因此它的逆矩阵不存在。因此,确定β系数的 OLS“公式”不起作用
作者图片
那么,为什么上述 3 个假设都归结为一个单一的假设“满秩”?
让我们再仔细看看这三个假设。
- 如果任意两个或多个回归量之间存在完美的多重共线性,矩阵 X 没有“k”个线性无关列。因此,不是满秩。
- 如果 n 它没有全列排名。因此,当我们有 k 个回归变量时,我们至少应该有 k 个观测值,以便能够通过 OLS 估计β。
- 对于**简单线性回归,如果自变量 X 的所有值都相同,则矩阵 X 中有两列,一列全为 1(截距项的系数),另一列全为 c (回归变量的常数值) 、 ,如下所示。显然,在这种情况下,矩阵也是非满秩的,**逆不存在, β无法确定。
作者图片
3.扰动的零条件均值
作者图片
扰动项ϵᵢ应该独立于回归量 xᵢ.它的期望值应该为零。
让我们用两个问题来解开上述问题:
首先,为什么不同观测值之间扰动项的均值应该为零?
嗯,误差或干扰很小(希望如此!)与模型预测的估计值的随机偏差。如果模型预测精确到小数点后一位,那就奇怪了!因此,偏差是很正常的。
然而,虽然干扰是可预期的,但我们不期望这些干扰总是正的(这意味着模型总是低估实际值)或总是负的(这意味着我们的模型总是高估实际值)。
相反,扰动不应该有任何固定的模式。换句话说,我们希望我们的错误是随机的——有时是正的,有时是负的。大致来说,所有这些单个误差的和将相互抵消,变得等于零,从而使误差项的平均值(或期望值)也等于零。
其次,为什么误差项的均值要独立于回归变量?
假设你想预测你办公室里的员工的年收入,仅仅使用他们的工作经验。你有三组人——第一组有不到 3 年经验的员工,第二组有 3 到 7 年的经验,第三组有 7 到 10 年的经验。
您创建了一个 LR 模型,并预测了每个组中每个成员的估计收入。接下来,为了查看您的模型的真实表现,您计算了所有三组成员的平均误差(称之为 E(ϵᵢ)。此外,您想知道您的模型在预测特定群体的收入方面是否特别好,因此您还分别计算了 3 个群体(E(ϵᵢ|group1、E(ϵᵢ|group2 和 E(ϵᵢ|group3)).)的平均预测误差
现在的问题是,你是否希望你对一组 的预测比对另外两组 的预测更错误?
当然不是!您希望公正地评估每一组,并且对每一组都同样正确(或不正确)!因此,理想情况下,单个组的平均误差应该与总平均误差相同。
e(ϵᵢ)= e(ϵᵢ|group1)= e(ϵᵢ|group2)= e(ϵᵢ|group3)
因此,“经验年数”这个变量的值不应该在决定你的估计有多错误上起任何作用。
概括地说,在一个好的模型中,回归量 xᵢ本身应该不包含关于误差ϵᵢ的有用信息——它们应该与误差项“无关”(回归量应该是“外生的”)。
现在只要结合以上两个问题的答案,你就得到我们的第三个假设零条件均值,如下所示。
作者图片
实现了无偏性!
现在让我们喘口气。三个假设已经完成,那么我们目前取得了什么成果?
好了,我们已经实现了线性回归模型参数的线性无偏估计量。
无偏性是估计量的一个理想的统计特性。它说,平均而言,估计量不会系统地低估或高估实际总体参数。
对于一个无偏的估计量,我们只需要证明它的期望值等于真实的总体参数。虽然我们很难知道人口参数的真实值来验证这一点,但可以通过分析来证明这一点(但前提是满足上述 3 个假设)。
有兴趣的,下面给出证明。对于那些不是的人,至少注意一下,这三个假设是如何被纳入证明的。
作者图片
上面所示的第一个等式与假设 1 所示的β系数估计值的闭合解相同。在接下来的步骤中,我们只需展开 y 并分配乘积,最后,对两边都取期望值。我们需要注意的是这三个假设是如何实现的-
a.如前所述,在没有线性和满秩假设的情况下,证明的第一行中所示的β-hat 的表达式是无效的。
b.请注意用红色圈出的部分。由于零误差期望值(或零条件均值)的第三个假设,被圈起来的部分变为零,从而使得β-hat 的期望值等于β。
最终结果——前三个假设足以说明 OLS 估计量是一个 无偏 线性估计量。
然而,这就是我们所需要的吗?
估计量的另一个理想特性是“低方差”。估计量在样本间变化越大,它对总体参数的估计就越不可靠。在所有的线性无偏估计量中,方差最小的是称为“最佳线性无偏估计量”(蓝色)。
那么我们能证明 OLS 估计量是蓝色的吗?
是的,但前提是另外两个假设成立。让我们看看它们是什么。
4.同方差性
我们刚刚讨论了误差项的条件意味着独立的假设。现在我们来谈谈误差项的条件方差独立性假设(也叫‘同方差’)。
希望我们已经清楚了一件事——我们不希望回归者携带任何关于错误的有用信息。
这意味着,它是否是误差的均值(期望值);或者误差的方差,它不应该基于不同的回归 xᵢ.值而不同
回想一下假设 3 中提到的基于多年经验的收入预测的同一个例子。您希望第一组(少于 3 年的经验)的误差比两组的误差“更分散”(或更少分散)吗?
不会。如果一个或多个组的误差比其他组更分散(误差方差更大),这基本上意味着你对这些组的预测不太可靠。
同方差性表示,无论回归函数值是多少,误差项ϵᵢ的方差都应该等于一个常数。数学表述如下。
作者图片
5.非自相关
让我们继续我们的探索,使误差尽可能随机和独立于其他因素。
我们已经讨论了两个假设——一个是关于误差的平均值独立于回归变量,另一个是关于误差的方差独立于回归变量。
均值独立性和同方差性确保误差 与 回归量 无关。
非自相关确保错误 与 其他错误 无关。
从数学上来说,观测误差的协方差应该为零。
作者图片
虽然这听起来有点不直观,但有时,对于以某种方式排序的数据观察(例如,时间序列数据),在连续观察中观察到具有“惯性”的误差值是很常见的,即正误差后跟着正误差或负误差后跟着负误差(称为正自相关)。误差也可能在观测值之间具有交替模式——正误差跟随负误差,反之亦然(称为负自相关)。
有几种技术可以处理和转换 LR 模型,以便自相关不会造成问题,尽管它自然存在于数据中。
达到的最小方差(蓝色)!
在前三个假设的基础上增加假设 4 和假设 5,借助于 高斯-马尔可夫定理 ,可以证明 OLS 估计量是蓝色的。
高斯马尔可夫定理的证明表明,所有线性无偏估计量的方差都将大于 OLS 估计量的方差。
为了使事情变得简单,让我们如下象征性地理解高斯马尔可夫定理的最终输出。根据证据,可以证明
Var(任意线性无偏估计量)= X +一个正量
上面的等式清楚地表明 X 小于 LHS。
重要的是,利用同方差(Var(ϵᵢ)=σ)和非自相关(对所有 i ≠ j 的 Cov(ϵᵢ,ϵⱼ)=0)条件,我们可以证明x = ols 估计量的方差。
为了简单起见,我们直观地理解了高斯马尔可夫定理。感兴趣的读者可以在网上这里或者任何标准教科书中找到更多关于证明的信息。
虽然上面讨论的五个假设足以使 OLS 估计量变得令人沮丧(如果没有这五个假设,一个估计量就不会真正达到它应有的水平!),还有两个假设值得一提。
6.随机或非随机回归变量
这个假设可能是你唯一可以忘记的(一旦你明白了!).
我把这个包括在内,这样当你在每本教科书中看到它时,你就知道它的意思了。
非随机回归器是指你固定了某些**【x】值(独立变量值),只收集了这些 x 值对应的【y】**上的数据,但是收集了多个样本。
回到我们之前的例子,假设你想根据多年的经验预测年收入。你的经理给了你三份员工名单和他们的年收入。每个列表都对应一个特定的经验水平——比如分别是 3 年、6 年和 10 年的经验。每个列表包含 50 名员工的数据。如您所见,x 值是固定的(3,6,10),但有重复的样本(每个样本 50 个数据点)。这就是所谓的非随机回归变量(理论上,遵循这一点的模型也被称为经典线性回归模型或 CLRM )。
你的经理可能会给你一份 150 名员工的年收入清单,而不是给你三份单独的清单。该列表可能包含具有随机变化的工作年限的员工(例如,1 年、2 年、3 年、7 年、10 年)。这里的 x 值不是固定的,而是可以根据多年的经验取任何(现实的)值。在这种情况下,我们使用随机(random)回归变量(理论上,遵循这一点的模型被称为新古典线性回归模型或 NLRM )。
在创建回归模型之前,您使用哪种数据生成过程并不重要,只要前面陈述的 5 个假设成立,所有的统计特性和 OLS 估计器的优点仍然成立(这就是为什么您可以忘记这一点!).
数学上,唯一的区别是——如果你使用非随机回归,你会得到一个数学上的便利——删除所有假设表达式中“给定的 X”部分,使它们成为无条件的(因为我们将 X 视为已知常数,而不是随机变量本身)。
E(ϵᵢ|X) = 0 就会变成,E(ϵᵢ) = 0
Var(ϵᵢ|X) = σ会变成 Var(ϵᵢ)= σ
在大多数数据科学研究中,对回归变量的数据收集通常是随机的,所以我们通常坚持使用条件表达式。在计量经济分析的一些实验设置中,有时以非随机方式设置回归变量,然后收集这些回归变量值的响应数据。
7.常态
作者图片
这个假设非常简单。它只是说误差**应该是正态分布的。**这种分布应该具有均值零(假设 3)和恒定方差σ(假设 4 ),这已经在前面展示过了。
然而,请注意,这一假设并不是获得良好的统计特性(如 OLS 估计量的“无偏性”和“最小方差”)的必要条件。只要满足前 5 个假设,即使误差不是正态分布,OLS 估计量也将是蓝色的(最佳线性无偏估计量)。
那我们到底为什么需要这个假设呢?
首先,如果我们需要的只是一个蓝色估计量,我们就不需要它。事实上,对于足够大的样本,通常满足正态性条件,而不需要我们为它担心(渐近正态性)。对于随机收集的最具代表性的数据样本,预期正态误差是合理的。
然而,把这作为一个明确的假设,会使两件有趣的事情成为可能-
- 当所有其他假设都符合正态假设时,OLS 估计与最大似然估计相一致(这在估计者中是一个很大的问题!),为我们提供了一些有用的属性。在以后的文章中会有更多的介绍!
- βᵢ的系数估计值可以显示为误差ϵᵢ.的线性函数要记住一个非常酷的特性——正态分布随机变量的线性函数也是正态分布的。因此,假设 ϵᵢ 为正态分布,我们得到 **βᵢ估计值也为正态分布。**这使我们更容易计算置信区间和估算β系数的 p 值(常见于 R 和 Python 模型总结中)。如果不满足误差正态条件,那么β系数的各个 t 检验的所有置信区间和 p 值都是不可靠的。
总结一下!
如果你只对线性无偏估计量感兴趣,你只需要—
- 线性度
- 满级
- 扰动的零条件均值(外生回归量)
如果除了无偏的线性估计量之外,您还想要最佳(或最小方差)估计量,那么您还需要
4。同质性
5。非自相关
除了蓝色的估计量之外,如果您还想要单个β系数的可靠置信区间和 p 值,并且估计量与 MLE(最大似然)估计量一致,那么除了上述五个假设之外,您还需要确保—
7。常态
最后,如果你想写下一篇关于这个主题的研究论文,并且想要数学上正确的方程,不要忘记假设 6(非随机和随机回归)。
结论
既然你已经看到了每一个 OLS 假设的实际应用,那么就该由你来决定应该验证哪些假设,以确保你的模型能够正确工作。
虽然这些假设中的一些是证明理论的数学便利,但大多数是创建具体和稳健模型的必要基础。
对这些假设的良好理解使我作为一名数据从业者能够掌握统计建模和机器学习中更难的概念。希望对你也有帮助!
加入我的旅程
如果您喜欢这篇文章,我邀请您关注我的 Medium 页面,了解更多关于数据科学有趣话题的更新,并通过LinkedIn与我联系。
教科书参考
- William H. Greene — 计量经济学分析第七版,第 2 章,第 51–65 页。
- Jeffrey M. Woolridge — 计量经济学导论第七版,第 2 章,第 40–57 页。
多元线性回归的假设
原文:https://towardsdatascience.com/assumptions-of-multiple-linear-regression-d16f2eb8a2e7
python 中假设的实现
图片来自 Unsplash
简介
线性回归是各种预测分析的核心过程。根据定义,线性回归是指拟合两个感兴趣的连续变量。不是所有的数据集都可以用线性方式拟合。在开始回归分析之前,有几个假设必须满足。其中一些对于模型的评估非常重要。
- 线性
- 多重共线性
- 同方差性
- 多元正态性
- 自相关
用数据弄脏手
出于演示的目的,我将利用开源数据集进行线性回归。“鱼”数据集受 GPL 2.0 许可。我们将通过各种需求来建立对这个数据集的线性回归分析。
线性度
第一个假设非常明显和简单。我们试图拟合的变量应该保持线性关系。如果没有线性关系,可以对数据进行转换,使其成为线性关系。这些类型的转换包括对响应数据取对数或对响应数据求平方根。检查散点图是检查线性最好也是最简单的方法。
让我们做一个体重和身高变量之间的线性检查。散点图显示这两个变量之间几乎没有线性关系,因此我们需要转换变量。我们可以对两者进行对数运算,并获得更线性的散点图。
变量之间观察到非线性(图片由作者提供)
对数变换后线性增加(图片由作者提供)
很明显,即使在对数变换之后,数据仍然显示出某种双峰。一些数据位于重量分布的上半部分,而剩余的数据点独立于前一个分布。在这种情况下,我们可能需要收集 2.5 到 3.56 厘米之间的更多数据,最终我们可以获得更正态的分布。
外卖 1
→对照所有独立变量检查响应变量的散点图。
→如果没有观察到线性,转换数据。
多重共线性
当两个或两个以上的独立变量相互关联时,就会出现多重共线性。如果是这样的话,模型对系数的估计将是系统性错误的。人们可以检查方差膨胀因子(VIF)来确定高度相关的变量,并可能从模型中删除这些变量。R 是变量相关程度的量度,VIF 由这个 R 值确定。如果变量之间有很高的相关性,VIF 值就会飙升。通常,VIF 值大于 5 表示存在多重共线性。VIF 的最小值为 1,这对于方程来说是显而易见的,这表明不存在多重共线性。
VIF 公式
VIF 价值观
观察 VIF 值,很明显所有的变量都是高度相关的。如果我们的响应变量是“权重”,我们可以保留其余五个变量中的任意一个作为我们的自变量。由于各种原因,数据集中可能会出现多重共线性。它可能是由于数据收集过程而出现的。一些变量可能会重复,而另一些可能会转换,这可能会导致多重共线性。
皮尔逊多重共线性系数是这种情况下的另一个度量。它可以用矩阵的形式表现出来,这很好。
皮尔逊多重共线性系数(图片由作者提供)
外卖 2
→检查散点图或 R 值,以确定是否存在多重共线性。
→同时检查 VIF 值以筛选出变量。
同方差
同方差是多元线性回归建模的另一个假设。它要求线性拟合两侧的数据点之间的方差相等。如果不是这样,数据就是异方差的。通常,数据质量会导致这种异方差行为。如果响应变量呈现圆锥形分布,我们可以说方差不可能在模型的每一点都相等,而不是线性增加或减少。
异方差数据的锥形分布(图片由作者提供)
我有另一篇文章是关于数据的这个特性的。读者可能会觉得有用。
在我们的“鱼”数据集中,变量“重量”在散点图中显示了类似的行为。
拟合线周围的不等方差(图片由作者提供)
当残差相对于预测值作图时,它也提供了这种异方差的指示。下图显示了残差的某种模式。在这种情况下,响应变量的转换可能是最小化异方差的好步骤。
剩余散点图(图片由作者提供)
外卖 3
→检查响应变量的散点图,如果方差是可变的(非常数)或任何锥形图。
→转换变量以最小化异方差。
多元常态
这种假设表明模型的残差是正态分布的。确定模型参数后,最好检查残差的分布。除了直观的分布,人们应该检查 Q-Q 图以更好地理解分布。鼓励读者仔细阅读下面文章中概述的 Q-Q 情节的基础和实现。
在我们的数据集中,我们可以可视化分布以及 Q-Q 图,但为了更好地理解,让我们生成一些合成数据。
用拟合线生成的数据(图片由作者提供)
残差分布(图片由作者提供)
Q_Q 图(图片作者提供)
Q-Q 图偏离了 45⁰线,后者似乎代表了一个分散不足的数据集,其尾部比正态分布更细。在这种情况下,非线性变换也有助于建立多元正态性。
外卖 4
→检查残差分布和 Q_Q 图,以确定正态性
→如果缺乏正态性,则执行非线性转换
除了这些情况之外,还有一个“无自相关”假设,它基本上告诉我们,在残差散点图中应该没有特定的模式。特定位置的一个残差不应依赖于其周围的残差。恒定方差假设与此有些关系。
结论
我们已经展示了多元线性回归假设检验的实现。线性和多重共线性比其他假设更重要。在各种机器学习或统计问题中,线性回归是最简单的解决方案。然而,用户应同样小心这里概述的假设,并采取必要措施将非线性引起的影响降至最低。
面向数据科学家的异步—不要阻塞事件循环
原文:https://towardsdatascience.com/async-for-data-scientists-dont-block-the-event-loop-ab245e28ee01
CPU 密集型任务或非异步 I/O 库可能会阻塞程序的事件循环。了解如何在 Python 中避免这种情况。
图片作者。
异步编程已经成为 API 设计和大多数服务的标准范例。数据科学家的技能范围也发生了变化。今天不足以创建好的模型或可视化;在大多数情况下,通过 API 或其他服务部署它们也是必要的。如果您还没有在部署中处理过异步编程,那么您很快就会了。
明确一下,这个故事不是另一个异步教程。相反,一些关于数据科学家在将工具与异步框架接口时可能面临的常见障碍的见解。也就是说,用 CPU 密集型任务或非异步 I/O 库阻塞事件循环。
这个故事将探讨事件循环是如何被阻塞的,以及我们有哪些资源来防止它。
Python 中有许多处理异步编程的好库,但是 Asyncio 必须是 Python 中包含的标准库;例如,看看三重奏。因此,在这个故事中,我们将关注 Asyncio。
故事结构
- 事件循环
- 测试设置
- 天真地调用阻塞函数
- Asyncio 默认执行者
- 并发.未来线程池
- 并发.未来进程池
- 受 I/O 限制的基准测试
- 受 CPU 限制的基准测试
- 这个故事的寓意
事件循环
无论您使用的是 Asyncio 模块还是任何其他异步库,它们都使用底层的事件循环。事件循环是一个调度器,负责在程序的生命周期内执行所有的协同程序(异步函数)。
这种并发模型本质上是一个单独的while
(循环),它采用协程并巧妙地运行它们。一旦一个协同程序正在执行,await
( yield
)关键字将控制权交还给事件循环,以运行其他协同程序。因此,当事件循环等待一个 I/O 响应,一个未来完成,或者只是一个异步睡眠时,它可以运行其他协程。事件循环跟踪应该返回给每个协程的内容,并在循环的未来迭代中将其返回给相应的协程。
现在我们知道了事件循环是如何工作的,让我们想想当我们在事件循环中运行 CPU 密集型任务时会发生什么。这正是讨论与数据科学家相关的地方。如果我们在事件循环中运行一个受 CPU 限制的任务,这个循环将运行这个任务直到它完成,就像你曾经使用过的任何顺序的和普通的while
循环一样。这在异步编程中是一个大问题,因为所有其他任务都必须等到我们的 CPU 密集型任务完成之后。
对于事件循环,有三条规则:
- 您不能阻止事件循环
- 您不能阻止事件循环
- 您不能阻止事件循环
乍一看,阻塞事件循环听起来可能没那么糟糕。但是想想这个场景。您负责编写一个模块,该模块将在一个公开 API 的大型应用程序(服务)中提供数据分析。API 是在异步框架中编写的。如果您将 CPU 绑定的函数包装在协程中,您可能会导致整个应用程序瘫痪。所有其他任务,如客户端处理,都将停止,直到 CPU 密集型任务完成。
以下部分将回顾运行事件循环阻塞任务的方法,并研究它们的性能。
测试设置
我们从两个函数开始事件循环阻塞测试:
- 执行 CPU 相关任务的函数:使用 NumPy 的矩阵乘法
- 休眠线程的函数,即一些非异步 I/O(例如,非异步数据库库);是的,
time.sleep
将阻塞事件循环
让我们用一个每边有 7,000 个元素的正方形矩阵来计时(在事件循环之外)我们的 CPU 限制函数,这样我们就知道会发生什么:
每圈 9.97 秒±2.07 秒(平均标准偏差。戴夫。7 次运行,每次 1 个循环)
然后我们创建一个模拟周期性 I/O 任务的函数。这个函数为durarion_secs
运行一个循环,并在任务开始前(asyncio.sleep
为sleep_secs
)和任务完成后将当前时间戳附加到一个列表(time_log
)中:
这个函数的时间日志将是我们评估其他进程是否阻塞事件循环的数据。此外,我们格式化时间日志,以便只保留任务执行前和执行后的时间差。
使用 1 毫秒的睡眠,这是没有任何其他函数在事件循环中运行时time_log
的样子:
轴尺寸以秒为单位[图片由作者提供]。
天真地调用阻塞函数
天真地说,创建异步库的第一种方法是将我们的阻塞函数包装在一个协程中:
为了测试这种方法,我们将我们的函数、CPU 绑定函数和线程阻塞函数(time.sleep
)封装在一个循环中,该循环定期执行函数并追加到一个time_log
:
现在我们同时运行所有任务,即dummy_io_stuff
,CPU 密集型和线程休眠功能:
注意:在这段代码中,我在协程外部运行await coroutine
,因为我使用的是 Jupyter 笔记本,但是规则是await
只能在协程内部使用(async def
)。
以下是格式化时间日志的结果:
轴尺寸以秒为单位[图片由作者提供]。
从 I/O 时间日志(第一个子图)中可以看出,事件循环被阻塞了。我们期望平均一毫秒,并且在大多数迭代中花费的时间超过 5 秒。
另外两个图显示,在测试过程中,其他任务并没有一直执行,而是竞争资源并相互阻塞。
Asyncio 默认执行者
避免事件循环阻塞的解决方案是在别处执行阻塞代码。我们可以使用线程或其他进程来实现这一点。 Asyncio 有一个非常方便的循环方法,run_in_executor
。这个方法使用了concurrent.futures
线程和多重处理接口。运行阻塞函数的默认方式如下:
run_in_executor
的第一个参数设置为None
(默认执行程序),第二个参数是我们要在执行程序中运行的函数,后面的参数是函数的参数。这个默认的执行者是来自concurrent.futures
的ThreadPoolExecutor
。
包装我们的函数,类似于上一节,并同时运行任务:
格式化时间日志的结果是:
轴尺寸以秒为单位[图片由作者提供]。
我们可以看到,在事件循环中仍然有一些小故障(第一个图),但是 I/O 时间日志显示了接近 1 毫秒的时间差。根据阻塞任务本身,它们确实是并发执行的。
并发.未来线程池
我们可以通过显式定义并将其传递给run_in_executor
方法来自定义上一节中的ThreadPoolExecutor
:
使用只有一个工人的ThreadPoolExecutor
,我们包装我们的阻塞函数来周期性地执行它们并保持时间日志,类似于前面的部分:
同时运行我们的任务并绘制格式化的时间日志:
轴尺寸以秒为单位[图片由作者提供]。
我们看到的结果类似于上一节中获得的结果;当然,这是意料之中的;都用ThreadPoolExecutor
。
根据需要调整线程池中的线程数量。测试最佳数量是多少。对于某些用例来说,线程数量越多并不总是越好,因为它会带来一些开销。
线程池执行器在处理非异步编写的 I/O 库时大放异彩。Python 中的许多数据库库还不支持异步。在异步程序中使用它们会阻塞事件循环;相反,使用线程池执行器来包装它们。
并发.未来进程池
最后,我们可以使用一个单独的进程来运行我们的阻塞代码。我们通过将一个来自concurrent futures
的ProcessPoolExecutor
实例传递给run_in_executor
方法来实现这一点:
我们再次为测试创建周期性包装器,现在使用单独的过程:
运行测试并绘制结果:
轴尺寸以秒为单位[图片由作者提供]。
我们看到 I/O 中的故障
时间日志不像前面的案例那样重要。阻塞进程也同时执行。
在某些情况下,多处理可能是一个很好的解决方案,特别是对于 CPU 受限的任务(不是线程休眠任务)来说,这需要更长的时间。创建多个新流程和移动数据成本高昂。也就是说,确定你愿意为多重处理付出代价。
受 I/O 限制的基准测试
下图显示了 I/O 虚拟协程(任务完成之前和之后)的时间日志时间差(越少越好),使用了前面章节中概述的四种方法:
轴尺寸以秒为单位[图片由作者提供]。
在所有情况下,我们希望这些差异接近 1 毫秒,因为这是理论值。有些不一致是可以接受的,但超过 4 秒的差异是不可接受的,就像我们阻塞事件循环一样。线程池的结果(默认的执行器和只有一个工作线程的线程池)没有明显的不同。然而,ProcessPool 的结果清楚地表明,这个执行器对事件循环的破坏最小。
受 CPU 限制的基准测试
下图显示了对于前面讨论的所有方法,完成 CPU 限制的任务所花费的时间(越少越好):
轴尺寸以秒为单位[图片由作者提供]。
我们可以看到,天真地调用我们的阻塞函数会产生最好的结果。有道理;执行 CPU 密集型任务的代价是阻塞所有其他任务。关于其他三个执行人,他们的结果不相上下;进程池花费的时间稍长。将数据从主进程移动到分支进程需要一些时间。
在任何情况下,我们都可以说使用一个执行器不会导致严重的性能损失,并且事件循环不会被严重阻塞。进行性能测试以选择正确的执行器(和配置)。但是,从默认的执行程序开始并将其作为基准并不是一个坏主意。
这个故事的寓意
到目前为止,我们已经知道,阻塞事件循环是我们在进行异步编程时必须避免的关键事情。如果你设法保持事件循环没有障碍,一切都会好的;你的 MLOps 和 DevOps 队友会感谢你的。
这个故事的三个关键要点是:
- 不要盲目地从协程(异步定义)中调用常规函数,因为它们可能会阻塞事件循环
- 将线程池执行器用于非异步 I/O(非异步数据库库)或少量 CPU 限制的计算
- 使用 ProcesPool 执行程序执行密集的 CPU 密集型任务;请记住,创建流程和移动数据是非常昂贵的,因此必须物有所值
在创业公司,数据科学家还必须是产品经理,等等。
确保你的公司正在努力使产品适应市场
Marc-Olivier Jodoin 在 Unsplash 上拍摄的照片
你的公司正在下沉
作为一名数据科学家,你接受的培训主要是关注数据管理和建模。您已经掌握了 SQL/Pandas 数据库技能,并且可以通过 scikit、statsmodels 甚至 EconML 中的正确模型获得不错的准确度。但是,这与你公司的生存有什么关系呢?
初创公司通常仍在寻找适合自己市场的产品。最终,这意味着找到一个客户群,创造一个对他们如此有价值的产品,以至于公司的增长现在是不可阻挡的。
如果你是一家 20-250 人的小公司的第一批数据科学家,很可能你的公司还没有一个非常适合市场的产品。一旦实现,收入将飙升至 1 亿美元,你的投资将一轮接一轮,每次估值都将翻三倍,你的公司将在一年内拥有 1000 名员工。
不过,更有可能的是,你的公司收入远低于其消耗率,你所希望的大规模 MoM 指数增长似乎不会到来。
创业公司总是在沉沦。无论你如何看待现实,这都是一个很好的心态。除非你有无可争议的产品和市场的契合度,否则你的组织还没有找到宝藏,时间也不多了。
你工作的背景是什么?
你作为数据科学家的角色最终是为公司的产品做出贡献。无论你是直接创建一个人工智能驱动的功能,还是使用数据来驱动关于应该对公司当前和未来的客户以及他们当前和未来的产品做什么的决策,都是如此。
为了进行正确的数据科学研究,并让您的工作推动公司朝着正确的方向发展,您需要了解正在发生的事情:
- 公司如何决定你应该做什么?
- 公司如何看待你正在做的工作?
- 公司如何决定如何处理你的工作?
周而复始,当你和公司一起决定你应该做什么的时候,他们看着它,做一些事情(或者不做),然后你想出下一步该做什么。
如果他们问你错误的项目,那么你就没有在修理沉船。如果人们不理解你的工作,那么,即使你能够做一些真正有价值的事情,它也可能不会被正确理解、优先排序和利用。
你是唯一知道数据的人
作为数据科学家,你是数据科学方面的专家,可能也是数学方面的专家。这意味着您比任何人都清楚,在您的公司,数据科学能做什么,不能做什么。
你比任何人都清楚什么项目容易或困难,快或长,便宜或昂贵,希望你能感觉到哪些项目会有成果,哪些不会,以及应该如何解释和利用你以前的项目。
在这些问题上,公司是否充分吸收了你所有的知识?
作为处理数据的人,你对数据中的所有信息都有特别的洞察力——你知道数据讲述的所有故事。
你知道顾客在做什么——哪种顾客是常见的,哪种是罕见的。您知道大部分客户有什么共同点,哪些用例只是边缘用例,以及哪里没有足够的样本量让我们说太多。
你也知道数据中存在哪些机会。从什么可以预测什么?可以提出什么样的建议?同样,信号比噪声大的地方。如果你知道有什么样的模型和解决方案,那么你就知道你的公司可以用这些数据做什么——可以制造什么样的产品,可以提出什么样的建议——让公司从客户那里获得最大价值,让你的客户从你的产品那里获得最大价值。你知道什么是数据驱动的内部决策,什么是创造数据驱动的面向客户的产品。
你是否从数据中找到了这些问题的所有答案?公司知道你收集的所有事实和可能性吗?你是专家。没有人比你更清楚,只有你弄明白了并告诉他们,他们才会知道一切。
无论何时有人在你的公司对数据做了什么,你都有责任去发现,如果不对,就去做点什么。这些分析是否尽可能接近因果关系?所使用的度量和方法实际上回答了被问到的业务问题吗?如果你不确定,谁会确定?如果你不解决它,会发生什么?
然而,这不仅仅是数据
尽管如此,弄清楚你的公司应该做什么并不一定与数据有关。
对于一个没有产品市场适应性的早期创业公司来说,现在不是关注小的优化的时候。
在我们真正打造出合适的产品之前,还不是时候去审视我们的客户流失,并围绕客户、流程和功能做出一些似乎与客户维系相关的小改变。
直到我们有大量的客户觉得这是他们的完美产品甚至在他们使用了几个月后,它带来了巨大的价值,没有人怀疑他们为什么会购买它,现在还不是挖掘用户行为来寻找 10%的业务改进的时候。
直到你的产品变得不需要动脑筋的时候,你才知道你的公司会提供什么。在那之前,可能还不是对贵公司的高收购成本,或其成本超过收入,或其高流失率进行小改进的时候。这些只是表明你的公司没有提供好的产品。句号。
产品?什么产品?
那么为什么这意味着你必须是一个产品经理呢?
产品组织的存在是为了找出公司应该构建什么产品,并推动公司构建、发布和度量这些产品。
你的公司正在制造什么产品?
这是一个十亿美元的问题。
这正是商业存在的原因:提供一些有价值的产品。事实上,企业有资金和 100 名员工,并雇用你开始做一些数据科学,并不意味着他们已经搞清楚他们实际上卖的是什么。
通常情况下,早期阶段的投资更多的是投资者对团队的信心,以实现未来产品与市场的契合。最初的一点点吸引力,你拥有的几个付费客户,只是一个迹象,表明你的团队能够找到一些少数人愿意支付的东西,这表明你的团队有能力在未来找到合适的产品**——投资者并不真的相信你的公司现在有黄金产品——而你的公司可能没有足够好的产品来生存。**
在找到那个产品之前,所有人都要全力以赴。如果你想保住你的工作,那么你的公司必须生存。如果你想让你的股权变得有价值,那么你的公司必须发展壮大。这意味着你最好尽你所能帮助你的公司找到合适的产品。
如何找到黄金产品
那么产品经理如何找到合适的产品呢?你可以做无数的事情来做出贡献,所以尽你所能,做其中的一些吧:
- 了解你的竞争对手。所有的公司都在建立与你的公司相似的东西:他们提供什么功能,谁在购买,为什么。你了解所有这些竞争对手吗?你了解所有其他类似和相关的产品吗?贵公司的产品路线图是否基于使贵公司与众不同的因素,如贵公司与那些竞争对手的不同之处,以及贵公司需要与那些竞争对手的共同之处(哪些因素使贵公司成为特定客户群的正确选择)?当你参与商业决策,或者从事数据驱动的功能时,这个方向在包含这些竞争对手的市场环境中有意义吗?
- 了解你的客户想要什么。你的公司需要做大量的客户研究:你在解决什么问题?在销售和客户服务过程中,您是否系统地学习了有关客户的结构化信息?为什么你成功的客户对你感兴趣,你失败的销售尝试中哪里出了问题?如果你是一家 B2C 公司,那么是什么样的需求、价值观和感觉促使顾客选择你的公司呢?如果你是一家 B2B 公司,那么可能成为你客户的公司的角色、工作流程、过程和策略是什么?你完全了解你的顾客吗?当我们的客户围绕你的产品做决定时,我们是否熟悉他们所经历的每一个工作流程?当他们考虑你的产品和竞争对手的产品时,他们在想什么?我们的产品是否与客户的其他产品在生态系统中相适应(例如,在软件产品之间导入和导出数据,顺利融入人们的日常工作/工作流程以满足他们的需求,等等)。) ?如果你知道客户想要什么,那么你就可以推动你的公司生产合适的产品。
- 了解你的公司是如何运作的。它是如何组织的——哪个团队负责什么?每个团队如何决定他们将做什么,选择一个项目想法而不是另一个。他们可能有一个优先化的过程,或者可能有一些自然的、重复的对话,其中信息和想法变成项目。追踪它,弄清楚你的公司是如何选择每个人的时间做什么的,并确保这一切都是为了找到合适的产品。他们是否在利用我们对市场的所有了解来构思和区分优先顺序?
- 你的公司造东西的速度够快吗?产品就像营销——虽然我们希望尽可能做到消息灵通和量化,但仍然有点不可预测什么有效。尽管我们首先必须了解客户的现状,但除此之外,还必须有全新领域的创新。这是通过最大限度地了解信息,然后建立一堆相关的东西供客户尝试(从最有可能的赢家开始!)但如果你的公司每年只尝试几样东西,那么它很可能会在找到黄金产品之前就死掉。它需要快速尝试许多合理的新功能。那么你的公司在花时间做什么呢?他们是在拨弄拇指争论小变化而不是尝试新事物吗?他们是否过早地优化而不是制造新产品?他们是不是为了规模而过度工程化,阻碍了自己快速迭代?他们是在响应客户的要求而做小项目,而不是充分探索他们可能提供的产品吗?
让我们再来回顾一下这些想法:
- 你了解市场上的其他产品吗?它们是为谁设计的?
- 你了解客户对你潜在产品的全部体验吗?
- 你了解公司里每个人是如何工作的吗?
- 你的公司正在尝试大量伟大的产品创意吗?
总之,你的公司在获取这些信息时做了正确的事情,并且在做每一个决定时都参考了这些知识吗?
对我来说,这听起来像是创业——从零开始建立一家公司。那是因为你在一个创业组织中。不要被骗了,很有可能你的公司没有合适的产品。事实上,这是一群有着美好头衔的企业家试图发现一种产品,并获得几百万美元的收益和 100 个人的努力。所以,和他们平起平坐——成为一名企业家。从零开始创建这个企业,就像它是你自己的一样。如果这是你自己的公司,做你会做的一切——或者至少,确保有人在做这件事。
等等,这是谁的工作?
你可能会想——嘿,这真的是我工作的一部分吗?高管不就是干这个的吗?还是产品组织?一些第三方研究?销售和客户服务机构?
首先,知道这些问题的答案会帮助你做出更好的决定。如果你不知道答案,那么你将提出你的特征想法或分析想法,或者
- 有人会回来向你解释为什么这不是一个好的方向,或者
- 你会得到绿灯去做你的项目,然后要么不用,要么用了,对公司没有真正的积极影响。
但是公司真的依赖我做这些事情吗?
很有可能。
当然,在一家大公司,处理这些问题超出了你的权限。在大公司,这没问题。他们只有通过充分打磨流程才能达到这个规模,以持续捕捉产品的市场适应性。在这种情况下,这些问题可能会得到处理,你可以依靠指挥链来让你知道该做什么。你在那里的工作是专门化。
但是,如果你仍然在一家小公司工作,还没有找到适合自己产品的市场,你希望你的公司能够生存下去,尤其是如果你希望有一天变得足够有价值,能够升职,那么是的,一切都是你的工作。如果你的公司倒闭了,你被解雇了,你可以随意责怪任何人——但你本可以做得更多。
领导很辛苦
最后,我必须警告你,你试图去做你认为对公司有益的事情,并不总是会被接受。首先,你当然可能是错的。也许你遗漏了什么。所以,一定要谦虚地对待每一件事。提问,但要谦虚。
你也要尊重人的极限。他们可能没有足够的时间和感情来处理你带来的东西。所以要有战略眼光——匹配人们的能量,设定期望,合作…老样子。
这里有一些特殊的方法,你可以尝试帮助你的公司找到合适的产品,但你可能不会马上找到合作伙伴:
- 你用你认为正确的数据科学方法来解决一个商业问题(特别是用因果推理),或者构建正确的数据驱动特性的原型,而其他人不同意。他们可能不理解你做了什么。他们可能看不到价值,因为他们对你公司的数据和你产品的市场没有相同的看法。这可能不是他们想的方向,新的信息需要时间来消化。一定要以尽可能清晰的方式展示——文件而不是演讲,幻灯片而不是文件,模型而不是幻灯片,或者工作 MVP 而不是模型。
- 也许你认为有些工作需要完成。需要收集额外的信息。这个系统需要改造。需要探索各种选择。作为数据科学家,将新工作分配给跨组织的其他人可能不太正常。很可能,你必须说服某人这是一个好主意,让他们去做——否则你必须说服他们周围的人。
- 最后,如果你想改变一个流程或工作流程,你真的需要人们的认同。他们对待工作的方式是个人的,改变工作是对他们的再培训——这比做他们习惯做的事情要费力得多。更不用说这是承认他们以前的工作没有价值。如果员工不同意强加给他们的流程,他们都会不高兴——这是很多员工幻灭的核心。过程可以看起来像自然对话,人们如何提出想法,他们如何记录他们所做的事情,他们如何做出决策,或者他们如何做工作的任何方面。如果有些事情需要改变,你真的需要他们的认同。最坏的情况是,如果这个人看不到改变的价值,你必须说服他们的老板。也许他们的老板可以说服他们。同样的信息来自不同的人会有很大的不同。
我认为这里的模式是,如果人们看不到工作的价值,他们就会对被要求做工作感到不满。当你提出问题时,你必须拿出解决方案,因为问题只是更多的工作,但解决方案会把我们带到正确的方向,所以如果听众同意,他们会很高兴走上通往公司成功的道路。当人们被要求改变或者不同意时,他们会紧紧的闭上耳朵,所以要明智的对待这一切。
但是你必须这么做
总之,一家公司只有在正确处理了关于客户、市场和公司每个人的工作的大部分关键因素后,才能取得成功。确保所有的情报都收集好了。通过与合适的人反复分享关键信息来创造透明度。帮助确保所有这些信息在每个决策中都得到正确使用,从公司的最高战略到公司的所有流程,再到每个人负责的每个项目。
因为你的公司需要弄清楚它应该生产什么。
否则,它就死了。
试图在你看完上半场之前预测一场 NBA 比赛的结果
实践教程
试图在你看完上半场之前预测一场 NBA 比赛的结果
使用支持向量机算法
马库斯·斯皮斯克在 Unsplash 上的照片
用机器学习来模拟自然过程并不容易。普通的数据科学家可能会花费无数时间收集数据,更不用说清理数据了。在此基础上,他们还必须考虑对数据做了哪些假设,以及如何使用多种算法中的任何一种对数据进行最佳建模。根据分析结果,人们必须考虑他们模型中的任何偏差,或者他们是否从可用数据中选择了最佳数据。
在这篇博客中,我将尝试所有这些。继续我的专业运动中的机器学习主题,即国家篮球协会(NBA)。我今天的目标是创建一个机器学习模型,它可以预测一场比赛的结果,但只使用来自上半场**的详细数据。
经常看体育的人都明白,影响一场比赛的潮很多因素,更不用说最后的结果了。根据运动的不同,你可能会观察到任何数量的重大比赛、点球或纯粹的运气,这些都可以改变球队之间的平衡。我们真的能指望一种算法能看穿这一切吗?
我们来做个假设。
首先,让我们对正在使用的数据有一个基本的了解。
篮球是一项简单的运动——与队友合作得分,同时阻止对方得分。有组织的球队在整场比赛中表演“战术”,将球推向对方的篮筐或防守自己的篮筐。然而,一场比赛可能对一个队有利,也可能不利。正如我提到的,球队会受到来自任何一方的重大影响,这将会以这样或那样的方式改变比赛的趋势。因此,尽管只有上半场比赛的数据限制,但我们有兴趣获得尽可能多的信息来理解这些趋势变化。
当比赛中出现以下任何情况时,NBA 比赛将被记录:
- 篮下得分(包括罚球)
- 投篮被阻挡或被抢回
- 裁判判罚点球或犯规
- 任何一个队都叫暂停
- 失误(如抢断)
- 球员替换
戏剧是偶然发生的,或者是通过策略发生的。但这在这里无关紧要。重要的是,一场比赛是否预示着一支球队更接近胜利还是更接近失败。在上面的列表中,唯一不表示输赢的是球员替换(虽然这是一个假设,但相对安全)。我们可以为其他人辩护:
- 得分使一个队更有可能获胜
- 盖帽或抢篮板会阻止对方得分
- 点球将球队置于艰难的境地,同时也为对方球队提供了机会
- 团队经常叫暂停来缓解他们自己的压力,进行调整,或者拖慢其他团队的速度
- 失误给对手提供了得分的机会
也就是说,游戏的结果要么是赢,要么是输,因此将这些数据分为“赢的游戏”和“输的游戏”是有意义的。假设 A 队和 B 队比赛,我选择了这样的结构:
“赢”代表 A 队(“输”代表 B 队):
- A 队得分得分
- A 队挡住了一次射门
- A 队获得了一个进攻或防守篮板(注意,得分进攻篮板意味着之前的投篮尝试被错过了。从某种意义上说,这两部戏剧相互抵消。为了获得数据点,我选择保留它们。)
- B 队受到处罚或犯规(在大多数情况下,这会给 a 队带来失误或得分机会)
- B 队叫暂停(假设 A 队获得优势后,B 队叫暂停。)
- B 队发生失误,导致 A 队控球
现在,NBA 的比赛数据可以被格式化,因此很容易被机器学习模型理解。在探索之前,我想提一下我为这个实验收集的一些额外的决定和数据点。
- 篮球比赛的胜负完全取决于得分。一旦时间到了,发生多少点球、换人或失误都无关紧要。因为得分是最重要的打法类型,所以我保留了一个额外的“得分打法”变量。这意味着,如果比赛导致得分,那么“获胜的比赛”也将被算作“得分比赛”。这试图强调模型学习时评分的重要性。
- 有些战术比其他战术更有影响力,尤其是在比赛剩余时间方面。如果两队比分接近,得分或盖帽几乎肯定会改变比赛结果。正因为如此,我纳入了另一个数据点,那就是规定的剩余秒数(48 分钟)。
- 在 NBA 很难量化的一点是势头*。这或多或少是一种心理效应,当玩家在快速连续的比赛中有许多好的或坏的比赛时,他们会经历这种心理效应。动量已被广泛研究,以至于的研究文章已经在这个上发表。如何准确地对势头建模是有争议的,但我选择通过在最后 60 秒内发生的得分游戏、获胜游戏和失败游戏的数量来建模。每种类型的游戏都被缩放以强调其重要性。下面是我用来做实验的动量方程,秒是 60。*
气势(秒) = (1 + 得分 _ 打法(秒)) (1 + 好 _ 打法(秒)) - (2 * 差 _ 打法(秒))*
现在,关于机器学习。
神经网络
我花了一天时间思考从这个数据集中学习什么是好的算法。我发现在一场 NBA 比赛的上半场大约有 200 场比赛。最重要的是,每支球队在一个典型的赛季中至少打 82 场比赛,所以我们正在处理大量的比赛数据。也没有任何一个数据点能告诉你最终的结果。这让我想起了对图像数据的机器学习——因为通常你会处理成千上万像素数据形式的数据点。一个像素几乎不能告诉你图像是什么。所以我开始使用神经网络。
神经网络的基本结构。图片作者。
神经网络通过在输入层引入数据并沿着由节点组成的“隐藏”层网络遍历(为了简化,这种遍历“数学上”发生)来发挥作用。在到达输出层时,对输入数据进行预测(即,图像的“狗”或“猫”,NBA 数据的“赢”或“输”)。预测通常是一个置信概率,比如 70%可能是一只狗,30%可能是一只猫。这个概率然后通过称为“反向传播”的过程通过网络反馈,其中整个网络中的节点被调整以校正在最近预测期间所犯的任何错误。我刚才描述的是训练过程。一旦经过训练(即网络能够合理地准确预测),新数据可以从输入层前馈,从而在输出层进行预测。
简而言之,神经网络是一个糟糕的选择。我使用了 scikit-learn 提供的多层感知器(MLP)分类器。我怀疑我的模型不符合 NBA 的数据。改变隐藏层或每个隐藏层的节点数对数据的预测几乎没有影响。我还试图改变所提供的数据量——从上半年增加到前三个季度。即使数据增加了 50%,该模型也难以预测任何有意义的事情。使用 2020-2021 年 NBA 赛季的数据,如果一支球队有良好的记录(赢得约 65%的比赛),预测将总是获胜。类似地,对于有失败记录的团队,预测总是失败的。这告诉我,我选择的数据不适合 MLP 分类器。
回到绘图板。
支持向量机
支持向量机算法的目标是找到一个理想的超平面来分离数据类别。在上图中,线 A、B 和 C 是学习线或超平面。理想超平面是指星形类和圆形类之间的距离最大的超平面,即 c 线。
我认为,因为在这个实验中唯一感兴趣的类别是赢和输,所以对数据的机器学习解释可能有某种决策边界,或者某种区分赢和输的方法是有意义的。这让我想到了支持向量机(SMV)。
SVM 的超平面如何通过胜败的差距来区分游戏结果的图示。
Rushikesh Pupale 写了一篇精彩的文章介绍支持向量机,你可以在这里阅读。总而言之,SVM 算法找到了将我们的数据按类分开的最佳超平面。换句话说,假设我要画出所有导致盈利的数据点以及所有导致亏损的数据点。SVM 在图上找到一个平面或直线,最好地将盈利数据与亏损数据分开。
我把 MLP 分类器换成了 scikit-learn 的 LinearSVC 分类器。这立即改变了游戏规则。获胜的队伍被预测为获胜的队伍——但不是不败的队伍——而未获胜的队伍被预测为预期的队伍。下面是使用上半场数据(即游戏中大约前 200 场比赛)的结果快照。如果不调整超参数,情况是这样的:
*Correctly predicted 66.67% for team PHILADELPHIA 76ERS
Correctly predicted 66.67% for team ATLANTA HAWKS
Correctly predicted 55.56% for team BOSTON CELTICS
Correctly predicted 83.33% for team BROOKLYN NETS
Correctly predicted 44.44% for team CHICAGO BULLS
Correctly predicted 44.44% for team CHARLOTTE HORNETS
Correctly predicted 66.67% for team CLEVELAND CAVALIERS
Correctly predicted 66.67% for team DALLAS MAVERICKS
Correctly predicted 38.89% for team DENVER NUGGETS
Correctly predicted 83.33% for team DETROIT PISTONS
Correctly predicted 44.44% for team GOLDEN STATE WARRIORS
Correctly predicted 83.33% for team HOUSTON ROCKETS
Correctly predicted 66.67% for team INDIANA PACERS
Correctly predicted 77.78% for team LOS ANGELES CLIPPERS
Correctly predicted 38.89% for team LOS ANGELES LAKERS
Correctly predicted 33.33% for team MEMPHIS GRIZZLIES
Correctly predicted 50.00% for team MIAMI HEAT
Correctly predicted 50.00% for team MILWAUKEE BUCKS
Correctly predicted 55.56% for team MINNESOTA TIMBERWOLVES
Correctly predicted 55.56% for team NEW ORLEANS PELICANS
Correctly predicted 55.56% for team NEW YORK KNICKS
Correctly predicted 83.33% for team OKLAHOMA CITY THUNDER
Correctly predicted 66.67% for team ORLANDO MAGIC
Correctly predicted 66.67% for team PHOENIX SUNS
Correctly predicted 33.33% for team PORTLAND TRAIL BLAZERS
Correctly predicted 77.78% for team SACRAMENTO KINGS
Correctly predicted 66.67% for team SAN ANTONIO SPURS
Correctly predicted 77.78% for team TORONTO RAPTORS
Correctly predicted 61.11% for team UTAH JAZZ
Correctly predicted 55.56% for team WASHINGTON WIZARDS*
对于 2020-2021 年的篮网、活塞、火箭、快船、雷霆、国王和猛龙来说,这看起来很好。全联盟平均准确率为 60.56%。这也发生在 SVM 没有调整超参数的情况下,所以还有一些改进的空间。但是,在继续之前,让我们花点时间了解一下成功的衡量标准是什么样的。
显然,最好的指标是对上述每个百分比进行 100%的预测。由于前面描述的原因——竞技体育的性质和背景、可用数据的利用以及所做的假设,这是非常不现实的。有些团队达到 100%的准确率,而有些团队达到 20%,这也是不准确的。最后,达到完美的准确性将意味着这个模型可能会过度适应本赛季,并且无法推广到未来(或过去)的赛季,在这些赛季中,球员的经验水平随着球队名单而变化。相反,我选择针对以下方面优化模型:
每场比赛,一个 NBA 球队和另一个 NBA 球队比赛。这意味着总会有一个赢家和一个输家。鉴于常规赛有 82 场比赛,这意味着联盟平均 41 胜 41 负。因此,如果这个模型运行良好,它将预测联盟平均 41 胜,或者如果我们不预测 82 场比赛的胜率,胜率为 0 . 500。我们会看看跑完之后联盟的平均胜场数来比较。这个标准更现实(也更宽容),因为我们不再强调完美地挑选每个团队的游戏,而是为所有团队共同制定一个期望。没有一支球队是孤立存在的,而是球队之间的互动造就了 NBA。
超参数优化(验证)
上面的结果来自一个普通的(未调整的)线性 SVC 模型。通过使用来自 sklearn 的 SVC 分类器,我们得到了几个要研究的参数。我将从 Mohtadi Ben Fraj 的帖子中获得灵感:SVC 的参数调整和 SVM 的多项式和 RBF 内核的扫描超参数。
c 是正则化超参数。正则化的强度与 c 成反比。γ是非线性超平面的超参数。对于 gamma,值越高,它尝试精确拟合训练数据集。这两个值都是沿着从 0.1 到 1000 的对数标度扫描的。
我对以下情况进行了扫描(包括文件名约定,用于交叉引用存储库中的图):
- RBF 内核“svc_rbf_gamma_x”的 gamma 扫描
- 多项式核的伽玛扫描(0-6 次)" svc_poly_gamma_x_degree_y "
- RBF 内核“svc_rbf_c_x”的 c 扫描
- 多项式核的 c 扫描(0-6 次)" svc_rbf_c_x_degree_y "
完整笔记本在我的 Macbook 上运行了大约 30 个小时,产生了足够的数据来创建 16 个不同的图。把它们都贴在这里有点多,但是如果你想仔细看看,你可以在博客末尾的链接中查看完整的源代码和相关的数据和图表。同时,我现在将介绍更重要的发现。
首先,看一下 C 的多项式扫描,由于使用了不同的 C 或 gamma 值,赛季预测准确性或联盟胜率几乎没有相关性。这看起来有点令人失望,但我决定更仔细地观察,寻找任何不太明显的趋势。首先,我用趋势线来显示整个扫描的总体变化率。对于平均季节预测准确度(ASPA ),所有趋势线都下降。这表明 ASPA 随着 C 的减少而增加(并且正则化更普遍),因此 C 的较低值可以产生对训练数据的更好拟合。
联赛平均胜率(LAWR)有三条趋势线在下降,四条趋势线在上升。然而,趋势线的方向在这里并不重要。我们希望这个值更接近 0.500,因为这表明模型预测联盟会有很多赢家和输家。4 次多项式的 LAWR 趋势最接近 0.500。趋势线也有下降,以配合相应的 ASPA 趋势。这可能表明较低的 C 值与 4 次多项式相结合会产生更好的结果。
具有四次多项式内核的超参数扫描快照。图片作者。
现在让我们来看看伽马扫描。
Gamma 确定模型尝试与定型数据拟合的紧密程度。我们发现,在所有多项式扫描中,趋势线通常会略微下降或保持平坦。这告诉我们,紧密拟合训练数据通常会降低泛化精度,换句话说,过度拟合训练数据。因此,伽马值可以忽略,也可以包含在较低的值中。
除了 gamma 和 C 之外,还有一点需要注意的是,高次多项式的 LAWR 通常更高。4 度、5 度和 6 度的趋势线更接近 0.500,而低次多项式则远离 0.500。
我想补充的另一点是,0 次多项式几乎肯定会对数据进行欠拟合。这是因为模型参数(非超参数)的数量非常有限,并且没有足够的数据来了解可以从训练数据中学习到什么。他们的情节包括在内,但他们的结果应该被轻视。**
如果我们将多项式核转换为 RBF 核,我们可以看到与 gamma 的显著相关性。事实上,伽马每增加 10 的幂次,LAWR 就增加大约 2.5%。就达到 0.500 的目标 LAWR 而言,最佳时机出现在γ= 10 左右。因此,伽玛的效用取决于这里 SVM 所用的内核。
当扫描 RBF 核的 C 时,LAWR 略微上升,在较高的 C 值时接近 0.500。因此,对于 RBF 核,正则化的效果是与多项式核的效果相反的。在这里,随着正规化减少 LAWR(和 ASPA)改善。**
也就是说,我将训练一个具有 4 次多项式,C=0.01,gamma=0.001 的 SVM,并将其应用于本赛季 2021-22 的数据,我们将看到它在上半年数据的基础上预测比赛结果的能力。
模型检验
测试的设置类似于培训的设置。我建立了模型来预测每支 NBA 球队在 2021-22 赛季的前 25 场比赛。应该注意的是,因为我们预测的是一个新赛季,任何预测结果都应该承认球队阵容的变化。使用如上所述配置的模型,这产生了 0.5842 的 ASPA 和 0.499 的 LAWR。
这种模式充其量是适度的。一般来说,对于输赢率高或输赢率低的团队来说,它表现得很好。换句话说,模型的预测与之前看到的一致。更大的挑战是预测输赢比接近 1.0 的球队。在这种情况下,该模型不得不减少对最近游戏趋势的依赖,而更多地依赖于逐场比赛的数据。我们可以通过计算每个团队在测试中获胜次数的标准偏差来衡量这种影响。
球队可以预测 0 到 25 场胜利。当 C=0.01,gamma=0.001 时,标准偏差为 12.21。这个值很大,接近平均 win 值 12.5,我们可以得出结论,数据的信噪比相当低。通过对参数的细微调整,我能够得到 9.65 的最低标准偏差。LAWR 为 0.499 时,预测性能与预期一致,但结果并不确定是否可以抢先预测游戏的结果。
后续步骤和结论
在这篇博客中,我详细介绍了一种预测 NBA 比赛结果的机器学习方法,只给出上半场比赛的详细数据。各种各样的假设和决策产生了一个可以做出预测的模型,但并不具有真正的说服力。基于预测的结果,我认为下一步应该是重新评估模型训练中使用的数据。从比赛数据中提取额外的特征可以让模型了解游戏过程中发生的更多信息。
为了更进一步,我会提出一个基于玩家层面而不是团队层面的模型。这将使一个模型在不同的赛季中更加稳健,并考虑到球员对他们所效力的球队的贡献。例如,在撰写本文时,杰森·塔图姆是联盟中投篮不中次数最多的。相比之下,凯文·杜兰特是联盟中射门得分最多的。凯文·杜兰特投篮不中并不重要,因为他在剩下的比赛中仍然会得分,而塔图姆则相反。这里的一个挑战是从其他 30 个团队过渡到 500 多个玩家,并维护一个数据丰富的数据集。
虽然这个实验的发现并不令人印象深刻,但我个人认为它对我目前的发现很有吸引力。从特征提取到超参数调整,这个问题有很多开放性可以探索。我认为这将是一个很好的试验,有朝一日可以探索更深的领域,因为目前这是没有资金支持的研究的极限。😃
如果你想查看这里使用的源代码,请随意查看 Github repo 中的全部内容。
变压器模型
原文:https://towardsdatascience.com/attention-is-all-you-need-e498378552f9
变压器编码器-解码器架构的逐步分解
介绍
2017 年,谷歌的研究人员和开发人员发布了一篇论文“Attention is All You Need”,该论文强调了 Transformer 模型的兴起。在他们的论文中,transformer 在翻译任务方面达到了超越以前的自然语言处理(NLP)模型架构的新水平。鉴于它们目前在 NLP 领域的主导地位,本文深入探讨了 transformer 架构的细节,目的是强调是什么使它成为如此强大的模型。
总体架构
transformer 模型的体系结构从 RNNs 中的编码器-解码器体系结构中使用的注意机制中得到启发,以处理序列到序列(seq2seq)任务,但通过消除顺序性的因素;这意味着,与 RNNs 不同,transformer 不按顺序处理数据,这允许更多的并行化并减少训练时间。
图 1 展示了变压器的整体架构。变压器由两个主要部件组成:
- 编码器堆栈— Nx 层相同的编码器(在原始论文中 Nx = 6)
- 解码器堆栈— Nx 层相同的解码器(在原始论文中 Nx =6)
由于该模型不包含任何递归或卷积,因此它在编码器和解码器堆栈的底部添加了一个位置编码层,以利用序列的顺序。
图 1:变压器架构的总体概述—左边的图像是简化的形式(来源),右边的图像是详细的架构(来源)
深入了解变压器
本节通过解释输入产生输出的步骤,详细介绍变压器的不同组件。
在本文中,我们考虑了使用 transformer 将英语翻译成法语的经典示例。输入句子是这样的“我是学生”,预期输出是“我是学生”。
编码器
我们将从仔细观察编码器开始,并发现每一步都发生了什么。
输入 原始数据是一个英文文本,然而,与任何其他模型一样,转换器不理解英语,因此,文本被处理以将每个单词转换成唯一的数字 ID。这是通过使用特定的词汇表来完成的,该词汇表可以从训练数据中生成,并将每个单词映射到一个数字索引。
图 2:原始文本的数字表示(图片由作者提供)
嵌入层
如同在其他模型中一样,转换器使用学习的嵌入将输入令牌转换成 d = 512 维的向量。在训练期间,模型更新向量中的数字,以更好地表示输入令牌。
图 3:嵌入层对 d=512 的嵌入(图片由作者提供)
位置编码
将转换器与以前的序列模型区别开来的一个方面是,它不按顺序接受输入嵌入;相反,它一次接受所有的嵌入。这允许并行化并显著减少培训时间。然而,缺点是它丢失了与单词顺序相关的重要信息。为了使模型保持单词顺序的优势,位置编码被添加到输入嵌入中。由于位置编码和嵌入是相加的,所以它们都具有相同的维数 d = 512。有不同的方法来选择位置编码;转换器的创建者使用正弦和余弦函数来获得位置编码。在偶数维指数上应用正弦公式,在奇数维指数上应用余弦公式。图 4 显示了用于获得位置编码的公式。
图 4:位置编码公式(来源)
图 5:将位置编码添加到嵌入中以生成位置嵌入(ep)
多头关注层——自我关注
图 6:多头关注层(来源)
在本节中有两个术语需要说明,自我关注和多头。
自我关注:
我们将从什么是自我关注以及如何应用自我关注开始。自我注意的目标是通过创建每个输入单词的基于注意的向量来捕捉句子中单词之间的上下文关系。基于注意力的向量有助于理解输入句子中的每个单词与句子中的其他单词(以及单词本身)的相关程度。
应用图 6 左侧所示的标度点积注意力来计算基于注意力的向量。下面是如何从位置嵌入创建这些向量的详细解释。
第一步是获得查询(Q)、键(K)和值(V)。这是通过将位置嵌入的相同副本传递给三个不同的线性图层来实现的,如下图所示。
图 7:生成查询、键和值(作者图片)
第二步是从查询(Q)和键(K)中创建一个注意力过滤器。注意力过滤器将指示每个单词在每个位置被关注的程度。它是通过应用图 8 中的公式创建的。
图 8:从查询(Q)和键(K)生成关注过滤器(图片由作者提供)
最后,为了获得基于注意力的矩阵(自我注意力层的最终输出),在注意力过滤器和先前生成的值(V)矩阵之间进行矩阵到矩阵乘法(matmul)。产生下面的最终公式:
图 9:比例点产品关注度(来源
多头注意:
如图 6 的右侧所示,比例点积注意(即自我注意)不仅应用一次,而且应用多次(在原始论文中应用了 8 次)。目标是为同一个单词生成几个基于注意力的向量。这有助于模型在一个句子中有不同的单词关系表示。
从不同的头部生成的不同的基于注意力的矩阵被连接在一起,并通过线性层以将大小缩回到单个矩阵的大小。
残差连接,添加&范数和前馈网络
从图 1 中可以看出,该架构包括剩余连接(RC)。剩余连接的目标是通过允许旧信息绕过多头关注层来避免这些信息丢失。因此,位置嵌入被添加到多头注意力的输出,然后在将其传递到常规前馈网络之前被归一化(Add & Norm)。
解码器
解码器端与编码器端有许多共享组件。因此,本节不会像上一节那样详细。解码器和编码器的主要区别在于,解码器接受两个输入,并两次应用多头注意力,其中一个被“屏蔽”。此外,解码器中的最终线性层的大小(即,单元的数量)等于目标字典(在这种情况下是法语字典)中的单词数量。每个单元将被分配一个分数;softmax 用于将这些分数转换为概率,表示每个单词出现在输出中的概率。
输入
解码器接受两个输入:
- 编码器的输出—这些是解码器执行多头关注(图 1 中的第二个多头关注)的键(K)和值(V)。在这个多头注意力层中,查询(Q)是被掩蔽的多头注意力的输出。
- 输出文本向右移动—这是为了确保特定位置“I”处的预测只能依赖于小于 I 的位置(参见图 10)。因此,解码器将在位置 I 处要预测的实际字之前接收所有已经预测的字(位置 0 到 i-1)。注意,传递到解码器的第一个生成的字是令牌,预测过程继续,直到解码器生成特殊的结束令牌。
图 10:在推理阶段,输出右移作为解码器的输入(图片由作者提供)
蒙面多头注意
掩蔽的多头注意的过程类似于常规的多头注意。唯一的区别是,在将矩阵 Q 和 K 相乘并对它们进行缩放之后,在应用 softmax 之前,会在生成的矩阵上应用一个特殊的遮罩(参见图 6 左图-遮罩选项)。).目标是使文本中特定位置“I”处的每个单词只关注文本中的每一个其他位置,直到包括其当前位置(位置 0 直到位置 I)。这在训练阶段很重要,因为当预测位置 i+1 处的单词时,模型将只关注该位置之前的所有单词。因此,I 之后的所有位置都会被屏蔽,并在传递给 softmax 运算之前设置为负无穷大,从而导致注意力滤波器中出现 0(见图 11)。
图 11:屏蔽注意力过滤器(作者图片)
结论
Transformer 模型是一种深度学习模型,已经在该领域存在了五年,并且已经产生了几个顶级性能和最先进的模型,如 BERT 模型。鉴于它在自然语言处理领域的主导地位及其在计算机视觉等其他领域的不断扩大的用途,理解它的体系结构是很重要的。本文涵盖了转换器的不同组件,并强调了它们的功能。
重要资源
注意力是你所需要的全部(A. Vaswani 等人,2017)
生成人工智能的归因问题
生成模型和人类一样依赖于它们的来源吗?
当关于大型预训练生成模型的讨论触及“艺术家、程序员和作家的所有这些作品在他们不知情或未同意的情况下被用于商业产品/模型中怎么办?”,为什么这是可以的一个论点是这种模型与潜在搜索引擎的比较。事情是这样的:
作为一个人,你可以也确实在其他人的作品、代码片段和艺术作品中寻找灵感。生成模型与之类似,它只是为你在大量数据中进行搜索提供了一个方便的界面。
附注:这是关于生成模型在其常规生成过程中执行的训练数据的“潜在搜索”或“合成”。关于使用模型替代基于索引的搜索引擎,有一个相关但独立的讨论。例如,Metzler,Tay,Bahri 和 Najork (2021)提出了模型作为“领域专家”的愿景,为用户可能有的任何问题提供权威答案。Shah & Bender (2022 年)通过讨论搜索用户需要采取的多种行为来挑战这一愿景,这些行为根本不会得到试图产生一个明确答案的“领域专家”模型的支持(例如,在提炼他们的问题之前了解更多,考虑选项列表,不同来源背后的动机等)。
那么,生成模型的“潜在搜索引擎”观点有什么问题呢?
显然,自回归语言模型确实会根据提示搜索最有可能的完成。同样真实的是,人类的写作和艺术取决于所述人类在其生活中遇到的输入,以及为应对特定挑战而故意寻找的相关输入。在文学研究和艺术中有互文性的概念(巴赫金,1981;克里斯特瓦,1980;Barthes,1977),涵盖了各种不同的文本/艺术作品相关的方式(或被读者认为相关),如典故,引用,戏仿等。
但这种类比有一些重要的局限性,包括生成模型和人类灵感背后的机制的根本差异,商业模型的潜在社会影响规模,以及非常不同的利益相关者和资助者。这篇文章关注的是搜索引擎类比失败的一个特殊点:归属问题。
归因问题
当你使用搜索引擎时,你会找到一个特定的想法、作品或代码片段,你可以清楚地看到其来源。有参考(即使来源只知道 stackoverflow user02348)。重要的是,不存在任何想法/艺术作品/代码就在那里,可以作为你自己的作品自由使用的错觉。如果你的搜索空间不是网络,而是你自己的记忆或生活经历,你通常仍然知道值得引用的东西的来源(或者你在 Twitter 上问人们“有/没有 X 的电影/书籍/项目/论文是什么?”)
如果你是一名研究人员,你可能会有像 Zotero 这样的东西来跟踪你的参考资料,以及一个巨大的书籍和论文数据库。即使你的消息来源本身来自其他地方,即使有人在你不知情的情况下说了同样的话,你在读者(和你自己)面前的可信度要求你披露你确实知道的参考文献。在这样做的过程中,你必须确保你真的相信消息来源是可靠的,并且你意识到它在你自己的推理中的作用。
注意,归属问题是双向的:当且仅当你知道并引用了你的资料来源时,为你的工作成果要求完全的荣誉才是可能的。这和原创程度是完全正交的。假设我发表了这篇博文,然后我发现别人已经发表了完全相同的文本:我仍然会知道我发表的是我自己的作品。另一方面,如果我没有写这篇博客,而是让 GPT-3 生成它,甚至得到了完全相同的结果——我根本不能声称有任何贡献。在作为我自己的文本发表时,我的角色只是说“我将这解释为连贯的文本,并同意其内容”(我认为杰克·克拉克在国会作证时使用合成文本时就是这么做的)。如果我用 GPT-3 获得下一步写什么的“想法”——即生成连贯的文本部分,然后我会编辑——我会说什么呢?不确定。但是想法、风格、背景知识的数量等等。只会有一部分是我的。
最近在 Reddit 上有一个关于 GPT-3 如何开始受学生欢迎的讨论,目的是避免写论文。除了学生们完全误解了练习的目的,以及浪费了老师的时间,这场讨论还强调了一个想法,即人工智能辅助写作者实际上不是因为写作而获得荣誉,而是因为“街头智慧”:他们能够利用系统并获得高分,即使他们的语言技能并不太好。有些人可能会说,这就像使用拼写检查器或类似 Grammarly 的服务来提高自己的写作水平,但很明显,生成完整或部分草稿在性质上是不同的:你不仅可以获得语言形式的帮助,还可以获得内容的帮助。
但是人们不也在做同样的事情吗?
是的,人们当然总是在别人的工作基础上发展。如果你想使用某些东西,你可以这样做——但社会已经制定了相当多的规范,关于你自己的工作有多少必须进入结果。因为这些规范随着时间的推移而演变,我们通常很清楚我们的来源。也许不是全部,但肯定是重要的。
任何音乐家都听过影响他们的其他音乐。艺术生去画廊,创意写作生看别人的书。他们和/或他们的老师甚至可能故意策划他们所接触的内容,以达到特定的结果。他们都可以接受采访,讲述他们的成长经历。这种解释将是不完整的,与批评家的想法不一致,但这不是重点:只是人们通常会保留至少一些对他们来说非常重要的事情的记忆。
另一个关键的区别是,如果他们的目标是成为一名原创艺术家/音乐家/作家,当他们建立在以前的工作基础上时,重点总是要加入足够多的他们自己的想法,下一代也可以从他们(而不仅仅是他们的“来源”)那里学到一些东西。我们是否能从生成模型中获得同样程度的创造力还远未可知。
特别是关于人工智能艺术:我根本不是艺术家,但它似乎实际上是风格(形状、配色方案等),而不仅仅是艺术家花费一生开发的特定图像/艺术品,这也给他们带来了专业的认可。他们似乎非常不同意,这是可以的,只是挪用(Heikkil,2022)。产卵人工智能已经为艺术家建立了一个工具来检测他们的作品何时成为流行训练数据集的一部分。
总之:不,生成模型不像人类在创作文本或艺术时一样,对他们可能“说”的事情进行同样的潜在搜索。一个关键的区别是,对人类来说,这不仅是一种由内容考虑驱动的认知活动,也是一种社会活动。我们敏锐地意识到何时需要归因,我们提供归因,并期望归因作为回报。当然,不同的人可能对何时归因是恰当的有不同的理解(基于他们的个人经验、对一个主题的熟悉程度、他们环境中的社会规范等)。)——但这并没有降低基本原则的真实性。
反论点
本着讨论的精神,这里是我看到的一些反对意见,以及我对它们的回应。
生成模型具有足够的创造性
要声称一个生成模型有足够的创造力而不用担心归因,我们首先需要定义“创造力”。有人举出了 DALL-E 的鳄梨椅这样的例子。对我来说,这里的创造力是由制定疯狂提示的人展示的,而模型展示了能够重组它所学习的视觉“概念”的组合性(在这种情况下,它学习了“椅子”、“木头”和“鳄梨”,以及视觉图式“椅子+材料”)。我们大多数人都画得不好,所以几乎任何处决都会让人印象深刻。但是,考虑一下这种作曲技能在语言领域会是什么样子,我们都足够精通:模型学习了“约翰喝了咖啡”和“玛丽喝了茶”,然后它能够产生“约翰喝了茶”。这看起来像鳄梨椅一样令人印象深刻的创意吗?
我也不会将创造力解释为随机性(例如,由 GPT-3 的温度设置控制)。如果我遇到写作瓶颈,不得不求助于随机的写作提示来摆脱困境,那倒不如说是一种缺乏创造力的的症状,不是吗?此外,随着当前模型增加生成的随机性,可能会牺牲生成数据的事实正确性,因为它必然会进一步远离训练分布,并且没有概念一致性的机制。在生成的文本锚定于现实世界或一些长篇叙事的大多数场景中,创造性/无意义不是可接受的权衡。
最后,在关于人工智能艺术或人工智能-人类合作的出版物中,“创造力”可能被讨论为生成的文本/艺术作品的一些外部特征,由评论家在一些美学维度上评分,如(Hitsuwari,,Yun,& Nomura,2022)。我认为这也不是这次讨论的创意的相关概念。由于我们正在谈论一个机器学习系统,对其输出的任何美学属性的评估都有与任何其他基准相同的问题:除非我们知道系统在训练中看到了什么,否则我们无法判断它是否实际获得了某种能力,或者只是鹦鹉学舌。到目前为止,我还没有看到给定所有训练数据的非常大的模型的研究(考虑到这些数据通常不会以可查询的形式完全公开)。因为从根本上说,当前的模型被优化以产生当前提示的统计上可能的完成,所以举证的责任在声称有创造性的一方。
我们从较小模型的研究中所知道的是,它们能够并且确实逐字重现训练数据的段落(Carlini 等人,2021;Carlini 等人,2022 年等)。记忆和抄袭的能力会随着规模的增加而增加(Lee,Le,Chen 和 Lee,2022)。有鉴于此,我认为,即使我们有一些一般性的证据证明生成模型有能力合成有意义的原创内容,这也是不够的:毕竟,人类也可以有创造力,但是老师们仍然怀疑学生的剽窃行为。对于一个统计学习者来说,一个给定的一代人有多有创造力(或可信)可能取决于它有多少证据,以及不同的数据点有多相似。因此,除非出售该模型的公司在特定情况下提供一些原创性保证,否则它只是将潜在抄袭的责任转嫁给不知情的客户。
我们可以只添加参考吗?
当介绍他们的“领域专家”端到端信息检索的愿景时,Metzler,Tay,Bahri 和 Najork (2021)主张一个添加一些参考的模型,此外还努力介绍有争议主题的“双方”。也许这是解决归因问题的一个简单方法——如果我们只是添加指向与生成的输出最相似的训练数据示例的指针?
假设你正在写一篇关于《变形金刚》中自我关注的深度学习博文。假设您的“书写辅助”模型将为您提供以下句子组合:
变形金刚中的自我注意机制能够全局计算面片之间的成对关系,从而实现大范围的特征交互。它被认为是查询和键/值对到输出的映射,每一个都由一个向量表示。一个众所周知的关于自我关注的问题是二次时间和记忆的复杂性,这在许多情况下会阻碍模型的可扩展性。
所有这些句子实际上都来自不同的研究论文。如果加上这些论文的链接,同一段落应该是这样的:
变形金刚中的自我注意机制能够全局计算面片之间的成对关系,从而实现大范围的特征交互。[https://arxiv.org/pdf/2201.00462v2.pdf]它……被认为是查询和键/值对到输出的映射,每一个都由一个向量[https://arxiv.org/pdf/1807.03052.pdf]表示。一个众所周知的关于自我关注的问题是二次时间和记忆的复杂性,这在许多情况下会阻碍模型的可扩展性。https://arxiv.org/pdf/2009.06732.pdf。
关键的区别在于第一段看起来像是模型实际“完成”的东西,你可能真的想使用它。参考文献破坏了无归属文本的幻想,于是“写作辅助”看起来就不那么吸引人了。如果你选择依靠 GPT-3 来进行高层次的思考,它可能是一个有用的研究工具。但是,除非你习惯于简单地从别人的作品中抄袭短语,否则“写作辅助工具”的幻想就会破灭。
不可否认,这个例子被夸大了:也许只有生成文本的某个部分会如此明显地抄袭。也许这只会偶尔发生。但是,如果没有这些参考,科学界的归因规范仍然会被打破。有了它们,就意味着你要依靠 GPT 三号来获得你研究背后的高层次思考。这是否有意义取决于(a)你在多大程度上相信它有这样的思考能力,(b)如果是这样的话——你在多大程度上愿意接受别人的想法。
Shah & Bender (2022 年)认为,即使对于 Metzler,Tay,Bahri 和 Najork (2021 年)设想的“领域专家”QA 模型,参考文献方法也是不够的:该模型可能最终成为远未解决的案件真相的仲裁者,可能在扁平地球理论等主题上呈现“双方”,并可能掩盖引用背后的真实信息来源(例如,所谓的“XYZ 诊所”实际上可能是一个没有医学证书的顺势疗法提供商)。当然,在有些情况下,答案足够简单,可以信任当前的模型——但不幸的是,我们无法轻易说出哪些情况是“安全的”。
如果你足够深入,一切都有参考。
如果你足够深入,一切都有参考。没有人期待基础代数或英语字母表的归属。没有人对使用语法或拼写检查器写作有道德上的疑虑。为什么要求抽象的想法或艺术风格的归属?
的确,当我们现在写学术文章时,没有人期望你提供一路追溯到亚里士多德的参考文献。但很少有人会说,拿走某人最近的 NeurIPS 论文并重新发表就可以了。是的,它是一个连续体,但它仍然是真实的。
究竟什么是常识,什么在给定时间点值得参考,因人而异,取决于他们的领域知识和原则。尽管如此,每个人都相当清楚自己的界限是什么。您个人是否愿意在 StackOverflow 代码片段中更改一些变量名,并将其作为您自己的工作来传递?你会告诉你的孩子从公共领域复制粘贴文章是可以的吗——毕竟,这并不违法。如果你在某人的主题演讲中听到一个你在其他地方没有听到过的贴切比喻——你会说它“只是英语”并将其作为你自己的吗?不管你对这些问题的答案是什么——你有这些答案,这意味着你有自己的归因规范。他们对你很重要。你拥有这套特定规范的部分原因是,你知道这是你周围的人所期望的。
“合理使用”
这只是卢德主义。印刷机让书法家失业,这样世界会更好。版权和知识产权的概念已经过时,将很快在“合理使用”中消失。如果这让艺术家/作家/程序员失业——那又怎样,社会只需要适应。
印刷机并不是真的由世界上所有书法家的作品驱动,在他们不知情或未同意的情况下被用于商业用途——尤其是在同时代的法律中至少已经存在一些保护措施的时候。对于学术研究或制作人工智能辅助内容的个人创作者来说,“合理使用”听起来可能是一种合理的方法(有适当的来源归属),但这不是讨论的内容——人工智能公司有权使用他们可以获得的任何数据来训练商业模型,而不与原始创作者分享任何收益,甚至不让他们知道他们的作品被使用。这场斗争远未结束,为数不多的法院判决(如正在进行的 LinkedIn 案)是基于个案的,而不是公司已经可以用来作为一揽子许可的东西。关于 GitHub CoPilot 的实际诉讼调查正在进行中(Joseph Saveri 律师事务所& Butterick,2022)。
我不知道社会方面正在设想什么样的适应。让我们想象一个可能的场景:你是一个程序员,生活在一个被未来的类似副驾驶的系统所主宰的世界里,这个系统每个人都在使用,并接受所有公共代码的训练。你的任何新的公共代码都被输入到这个系统中,其他人可以立即使用它。由于没有归属,你的公共工作不再能帮助你建立声誉、社区和专业形象,而这些在你目前的公司之外是众所周知的,这将使你更难在出现任何问题时更换工作。你的雇主知道这一点,并调整了一些人力资源政策。
也许未来的 CoPilot 所有者制定了一些许可计划,当你的代码片段被使用时会给你一些版税?这就是平台力量的用武之地,我们希望我们没有如此热衷于商业上的“合理使用”。有趣的事实:2020 年,Spotify 上 700 万艺术家中只有 0.96%的人赚到了 5K 美元(Smith,2021)。700 万艺术家中只有 0.19% (13,400 名艺术家)受欢迎程度足以年薪 5 万美元。
非常感谢来自 HuggingFace 的了不起的人们的反馈和建议!特别是 Christopher Akiki、Gérard Dupont、Sasha Luccioni 和 Aleksandra Piktus(按字母顺序排列)。由于这个 Twitter 帖子的反馈,这篇帖子也被更新了。
参考
- 巴赫金,硕士(1981)。小说中的话语。在 M. Holquist(编辑。),对话想象:四篇散文。德克萨斯大学出版社。
- 巴特,河(1977 年)。作者之死。在 S. Heath (Tran。)、形象、音乐、文字:随笔(第十三篇,第 142–148 页)。伦敦:丰塔纳。
- n .卡里尼,d .伊波利托,m .贾吉尔斯基,Lee,k .,Tramer,f .,,张,C. (2022)。跨神经语言模型量化记忆。https://doi.org/10.48550/arXiv.2202.07646
- Carlini,Tramèr,f .,Wallace,e .,Jagielski,m .,Herbert-Voss,a .,Lee,k .,Raffel,C. (2021)。从大型语言模型中提取训练数据。第 30 届 USENIX 安全研讨会(USENIX 安全 21),2633-2650。https://www . usenix . org/conference/usenixsecurity 21/presentation/Carlini-extracting
- 约瑟夫·萨维里律师事务所&巴特里克,硕士(2022)。 GitHub 副驾驶调查。https://www . saverilawfirst . com/our-cases/github-copilot-知识产权-诉讼
- 黑基勒,M. (2022)。这位艺术家正在主宰人工智能生成的艺术。他对此并不高兴。https://www . technology review . com/2022/09/16/1059598/this-artist-is-dominating-ai-generated-art-and-hes-not-happy-about-it/
- Hitsuwari,j .,,y .,Yun w .,& Nomura,M. (2022)。人类与人工智能的合作会带来更多创造性的艺术吗?人工俳句和人工俳句的审美评价。人类行为中的计算机,107502。https://doi.org/10.1016/j.chb.2022.107502
- 克里斯特瓦,J. (1980 年)。语言中的欲望:文学艺术的符号学研究。哥伦比亚大学出版社。
- 李,李,陈,陈(2022)。语言模型抄袭吗?https://doi.org/10.48550/arXiv.2203.07618
- 梅茨勒博士、泰伊、巴里博士和纳约克博士(2021 年)。重新思考搜索:让领域专家走出困境。 ACM SIGIR 论坛, 55 (1),13:1–13:27。https://doi.org/10.1145/3476415.3476428
- Shah,c .,& Bender,E. M. (2022)。定位搜索。ACM SIGIR 人类信息交互和检索会议,221–232。https://doi.org/10.1145/3498366.3505816
- 史密斯博士(2021)。13,400 名艺术家(700 万人中)每年从 Spotify 获得 5 万美元或以上的收入。https://www . digital music news . com/2021/03/18/Spotify-artist-earnings-figures/
TensorFlow 中的音频增强
原文:https://towardsdatascience.com/audio-augmentations-in-tensorflow-48483260b169
直接加强和向前传球
对于基于图像的任务,研究人员和从业人员通常都依赖于增强。这些是(人工)数据转换,如旋转、模糊或调整大小。与其他数据类型的修改相比,图像增强可以很快被理解。通常,一瞥向我们展示了一个特定的图像是如何转变的。虽然增强在图像领域很常见,但它们对其他数据类型也很有用,如音频。
理查德·霍瓦特在 Unsplash 上的照片
在早先的一篇博文中,我描述了一个简单的 GUI 来在浏览器中可视化这种增强。它还在运行,你可以在这里现场试用。在这篇文章中,我继续我早期的工作,并描述了如何在 TensorFlow 中将增强应用到数据集的两种方法。第一种方式直接修改数据;第二种方式是在网络的正向传递过程中实现的。
直接音频增强
在第一个场景中,我们从生成人工音频数据集开始。这个过程是直截了当的,并尽可能保持简单,所以你可以很容易地跟随。我们不加载预先存在的数据集,而是根据需要多次重复 librosa 库中的一个样本:
您可能已经注意到,在这个过程中,我们已经创建了一个 Dataset 对象。为了方便,我选择这样做;但是我们也可以使用纯 NumPy 数组。无论如何,音频数据现在与其采样率一起存储。如果您正在寻找其他方法来创建这样的数据集对象,您可以使用本实践指南中给出的方法之一。
既然我们的小数据集已经可以使用了,我们可以开始应用扩充了。对于这一步,我们使用了一个GUI 转换库(顺便说一下,这是为提到的 GUI 生成转换的库)。
为了简单起见,我们只导入三个修改,特别是 PitchShift、Shift 和 ApplyGaussianNoise。前两个移位音高(Pitchshift)和数据(Shift,可以认为是滚动数据;例如,狗的叫声将偏移+ 5 秒)。最后的变换使信号更加嘈杂,增加了神经网络以后的挑战。接下来,我们将所有三个扩展合并到一个管道中:
在通过管道输入数据之前,我们必须编写一些额外的代码。我们需要这样做,因为我们正在使用一个 Dataset 对象,简单地说,它在应用占位符之前通过一个函数输入占位符(这仅在实际数据加载期间完成!).
在我们的例子中,这个额外的代码告诉 TensorFlow 将张量临时转换为 NumPy 数组,这被管道接受:
有了这些辅助函数,我们现在可以扩充数据集了。此外,我们扩展了数据的维度,在末尾添加了一个人工轴。这将单个音频样本从(num_data_point,)变为(num_data_points,1),表示我们有单声道音频。这是必要的,在这里我们通过网络来馈送数据:
这一节到此为止。应用增强后,任何后续操作,无论是网络还是其他,都将看到增强的数据。
向前传球时的音频增强
与第一种技术相比,增加网络内的音频数据会增加前向传递的计算负荷。
为此,我们将使用 kapre 库,它提供了自定义的 TensorFlow 图层。这些层中有 MelSpectrogram 层,它接受原始(即未修改的)音频数据,并在 GPU 上计算 Mel 缩放的频谱图*。*
虽然与数据扩充没有直接关系,但这有两个好处:
首先,我们可以在例如超参数搜索期间优化用于频谱图生成的参数,使得重复的音频-频谱图生成变得不必要。第二,转换直接在 GPU 上进行,因此速度更快,无论是在原始转换速度还是在设备上的存储器布局方面。
考虑到这些好处,我们可以在计算出光谱图后再进行扩充。尽管在撰写本文时可用转换的数量有限,但我们可以在概念上欺骗这个过程。
首先,我们从加载音频特定层开始,这些层是由 kapre 库提供的。如上所述,这些层获取原始音频数据并计算声谱图表示:
之后,我们从 规范增强包中添加一个增强层。这个软件包实现了研究人员 Park 等人[1]的 SpecAugment 论文,它屏蔽了部分谱图。屏蔽模糊了神经网络所需的信息,从而增加了挑战。反过来,这种修改迫使网络关注其他功能,扩展其能力以概括看不见的数据:
最后,我们可以在上面添加更多的层。对于我们的例子,我添加了一个未经训练的残差网络,用任意 10 个类将数据分类成:
这部分到此为止。我们现在有一个深度神经网络,在向前传递的过程中增强音频数据。
摘要
在这篇博文中,我们讨论了两种增加音频数据的方法:第一种方法直接修改音频数据,第二种方法作为神经网络正向传递的一部分。这两个方法应该给你如何在你的用例中继续的好主意。为了让你快速入门,你可以在 GitHub 上找到完整的笔记本。
[1] Park 等, Specaugment:一种用于自动语音识别的简单数据增强方法,2019,Proc。Interspeech 2019
通过 Google Analytics 和 Data Studio 扩大销售渠道
找出你的潜在客户感兴趣的东西
T 他的文章概述了一个将谷歌分析标签嵌入数据工作室仪表板的过程,并以这样一种方式构建所述仪表板,以帮助销售渠道/推销/提案请求。这一过程适用于任何使用数据作为向潜在客户推销的一部分的企业,只要这些数据至少有一个有意义的类别,可以根据这个类别进行细分。
到本文结束时,你将有一个清晰的方法来量化你的潜在客户对你所提供的产品的主要喜欢/不喜欢——然后你可以将它融入到你对他们的推销中。
一种清晰的方法,用于量化潜在客户对你所提供产品的主要喜好/厌恶
先决条件:
- 谷歌账户/访问 Data Studio 的方式
- 谷歌分析/通用分析属性
- 可以按照某种有意义的类别/维度进行划分的数据,以及潜在客户感兴趣的数据
这个过程最好用一个例子来解释。我创造了一个假想的场景,我们是一家数字广告公司,正试图赢得一家大型流媒体服务公司 NextFix 的业务。在这种情况下,我们有关于他们的业务以及他们的 4 个竞争对手的数据。我们的销售团队想知道他们最关心 4 个竞争对手中的哪一个,以及他们是否特别担心自己的品牌表现。我们将发送给他们的仪表盘是我们最初推介的一部分,如下所示。
我们对数据进行分类的类别是流媒体服务——尽管它很容易被归类为国家或关键词等。
流媒体服务与主要竞争对手—按作者划分的仪表板
在我们构建了想要与 NextFix 共享的仪表板之后,我们只需要在其中设置 Google Analytics 标签,这样我们就可以看到 NextFix 客户端是如何使用它的。
谷歌分析标签可以在管理>属性>数据流中找到,更多指导可以在这里找到。
一旦有了标签,只需要将它粘贴到报告中,如下面的 GIF 所示。
文件>报告设置>谷歌分析测量 id。
但是请记住,仪表盘中的数据可能需要 24 小时才能显示在您的 Google Analytics 中。检查一切工作正常的一个简单的解决方案是在一个窗口中查看报告,然后在另一个窗口中查看 Google Analytics 的实时报告——希望您能看到自己!
向 Data Studio 报告添加 g a 标签 GIF by Author
现在一切都设置好了,我们只需要将仪表板发送给 NextFix 客户端,我们将能够在 Google Analytics 中看到他们感兴趣的部分。
我们甚至可以将该报告的使用数据导入到另一个 Data Studio 仪表板中(您可以在这里使用和),这在您开始扩展流程并希望跟踪多个潜在客户的兴趣时特别有用。
从下面的图片中我们可以看到,NextFix 查看了他们自己的页面,并与 Lulu 页面进行了最多的交互。我们的销售团队可以看到这一点,并认为宣传贝佐斯 Prime、Dixie Plus 或 Pear TV 的威胁不会像宣传 Lulu 的威胁那样有效。我们还可以看到,伦敦办事处比纽约办事处更加积极。
我们已经找出了客户最担心的主要竞争对手,以及与我们的推介最密切相关的 NextFix office。
销售渠道监视器—按作者分类的图片
最终想法
将 GA 标签嵌入 Data Studio 仪表板的过程非常通用,可以进行调整以适应各种业务的销售宣传。你所需要的只是一些你认为你的潜在客户会感兴趣的数据,一个有意义的分解数据的维度,以及一个谷歌分析属性。
它实现起来既快速又轻松,而且易于扩展。因此,如果你想知道你的潜在客户对你的商业产品有什么样的看法,试一试吧!
临时演员
- 如果你不希望内部流量污染你的谷歌分析数据(即只看到来自你的潜在客户的数据),那么你可以很容易地设置一个内部 IP 过滤器按照步骤概述这里。
- 您可能会发现 Google Analytics 的默认页面标题维度在 Data Studio 中使用起来有点笨拙。我更喜欢在 Data Studio 的页面标题维度上使用本地 REGEXP_EXTRACT 函数来创建定制维度。
这使您的页面标题尺寸更加简洁,如果您将页面扩展到多个类别,也可以让您以不同的粒度级别查看页面,例如,不仅仅是品牌、竞争对手 1、竞争对手 2,还包括品牌美国、竞争对手 1 美国等。您可以自定义维度,按国家或品牌/竞争对手类别查看使用情况。 - 本文的所有数据都是模拟的。流媒体服务业务数据是根据美国 25 个最大城市的人口规模和各种虚拟数据生成过程组成的。Google Analytics 查看数据是使用匿名 windows 创建的,并在不同位置设置了 VPN。
增强深度学习的图像
原文:https://towardsdatascience.com/augmenting-images-for-deep-learning-3f1ea92a891c
使用 Python 通过翻转、调整亮度、颜色抖动和随机噪声来增加数据
(来源:作者)
数据收集既费时又费钱,说实话还很无聊。当我们收集数据的能力有限时,数据扩充可以发挥重要作用。它可以帮助我们建立一个更强大的数据集,减少过度拟合,增加训练数据量。
我们将讨论数据扩充及其好处。我们也将保持实事求是。那就是通过遍历用于增强图像的 Python 代码。具体来说,我们将讨论如何进行这些扩充:
- 翻转图像
- 调节亮度
- 随机颜色抖动
- 随机噪声(高斯、椒盐和删除)
最后,我们将讨论增强图像的最佳实践。特别是,如何最好地验证我们的模型并在生产中测试它。
用例—自动化汽车
为了保持有趣,我们将为自动驾驶汽车增加图像。你可以在图 1 中看到我们的意思。汽车前面有一个摄像头,一个模型使用这些图像进行预测。这些预测然后被用来指导汽车。
图 1:装有摄像头传感器自动汽车(来源:作者)
我们的目标是让赛车绕着赛道行驶,同时保持在橙色线内。在这个过程中,我们将讨论哪些增强对于这个特定的应用程序有意义。这是为了强调围绕数据扩充的选择需要一些批判性思维。
收集可靠的数据集
在我们开始之前,有必要讨论一下数据收集。这是因为数据扩充是收集可靠数据集的替代或补充方法。
什么是稳健数据集?
稳健数据集是反映模型预期运行的所有条件的数据集。这些条件由照明条件、摄像机角度、房间颜色或背景中的物体等变量决定。在这样的数据集上训练将产生一个对这些变量的变化有弹性的模型。
稳健数据集=稳健模型
一个很好的例子来自我们对自动汽车的体验。我们收集数据,训练模型,并部署它。它完美地工作了!直到我们打开百叶窗…
图 2:在不同条件下努力表现的模型
阳光从轨道上反射回来,把模型“弄糊涂了”。在这种情况下,它无法做出准确的预测。换句话说,该模型对光照条件的变化并不鲁棒。
如何收集可靠的数据集
构建强大的数据集始于良好的数据收集策略。你需要考虑所有会影响条件的变量。然后你需要收集数据来捕捉这些变量的变化。例如,对于不同的照明条件,我们可以:
- 开灯和关灯
- 打开和关闭百叶窗
- 在一天的不同时间收集数据
其他变量是图像背景的不同方面。这包括墙壁和地毯的颜色以及背景中不同的物体。为了说明这些,我们可以:
- 在不同的房间收集数据
- 将不同的对象移到背景中
随着这些变化,我们正在做的是向我们的数据集添加噪声。希望模型将学会忽略这种噪音,只使用轨道进行预测。换句话说,我们希望模型使用真正的原因,而不是关联。
数据扩充的好处
数据扩充是指我们使用代码系统地或随机地改变图像。这允许我们人为地引入噪声并增加数据集的大小。实际上,目标与数据收集是一样的,因此好处是相似的。
构建强大的数据集
通常我们会受到可以收集多少数据的限制。在这种情况下,数据扩充有助于提高数据集的稳健性。即使您已经设法收集了大量数据,增强也可以提供额外的一层健壮性。
不过,要做到这一点,我们需要批判性地思考扩增的类型。也就是说,它们应该模拟我们期望在真实世界中看到的条件。例如,稍后我们将看到如何调整图像的亮度来模拟不同的照明条件。
减少对一组条件的过度拟合
通过良好的扩充,我们可以减少过度拟合。需要明确的是,这不同于过度适应训练集。以图 3 为例。假设,我们只在一个房间里收集数据。因此,该模型将背景中的对象与左转的预测相关联。
图 3:过度适应房间中的对象(来源:作者)
这个物体会出现在我们收集的所有图像中。这意味着它将出现在训练、验证甚至测试集中。该模型可以在所有这些集合上执行得很好,但是在生产中仍然执行得很差。例如,如果我们移走物体,它可能会变得“混乱”,不能左转。换句话说,模型过度适应了我们数据集中反映的条件。
数据扩充有助于这种类型的过度拟合。稍后,我们将看到删除像素对上面的例子有什么帮助。也就是说,我们可以人为地从背景中去除物体。
模型收敛
我们可以用多种不同的方式来增强同一个图像。这可能会人为地扩大数据集的规模。考虑到深度学习需要大型数据集,这可以帮助模型参数的收敛。
用 Python 扩充数据
好了,记住所有这些,让我们继续实际增加数据。我们会检查代码,你也可以在 GitHub 上找到这个项目。
首先,我们将使用下面的导入。我们有一些标准包装(第 2-3 行)。 Glob 用于处理文件路径(第 5 行)。我们还有一些用来处理图像的包(第 8-11 行)。
#Imports
import numpy as np
import matplotlib.pyplot as plt
import glob
import random
import torchvision.transforms as transforms
import matplotlib.image as mpimg
from PIL import Image, ImageEnhance
import cv2
如前所述,我们将增强用于自动驾驶汽车的图像。你可以在 Kaggle 上找到这些例子。这些图像都是 224 x 224 像素。我们用下面的代码显示其中的一个。
记下图像名称(第 3 行)。前两个数字是 224 x 224 帧内的 x 和 y 坐标。在图 4 中,你可以看到我们用绿色圆圈显示了这些坐标(第 11 行)。
read_path = "../../data/images/"
name = "32_50_c78164b4-40d2-11ed-a47b-a46bb6070c92.jpg"
#Get x,y coordinates from name
x = int(name.split("_")[0])
y = int(name.split("_")[1])
#Load image and add circle for coordinates
img = mpimg.imread(read_path + name)
cv2.circle(img, (x, y), 8, (0, 255, 0), 3)
plt.imshow(img)
图 4:示例图片(来源:作者)
这些坐标是目标变量。该模型使用这些图像来尝试预测它们。这个预测然后被用来指导汽车。在这种情况下,你可以看到汽车即将左转。理想的方向是朝着绿圈给出的坐标走。
翻转图像
假设我们在逆时针方向上收集了一堆图像(即仅左转)。如果我们想让汽车右转,我们必须收集更多的数据。或者,由于我们的轨道是对称的,我们可以在 x 轴上翻转图像。
图 5:翻转对称轨道(来源:作者)
我们使用 flip_img 函数来实现这一点。请记住,在水平轴上翻转时,x 坐标也需要调整。我们在第 9 行从 224(图像宽度)中减去当前坐标。你可以在图 6 中看到这个函数的结果。
def flip_img(name,img):
"""Invert image and target on x axis"""
# flip image
img = cv2.flip(img,1)
# flip target variable
s = name.split("_")
s[0] = str(224 - int(s[0]))
name = "_".join(s)
return name, img
图 6:水平翻转(来源:作者)
即使你已经收集了两个方向的数据,翻转图像也是有意义的。这允许我们将数据集的大小加倍。但是垂直翻转呢?
对于某些应用,这可能是有意义的。对于我们的自动驾驶汽车来说……没那么多。看一下图 7 。垂直翻转意味着汽车将在天花板上行驶。除非我们在太空中驾驶,否则这不是我们在生产中预期的情况。
图 7:垂直翻转(来源:作者)
调整亮度
通过 adjust_brightness ,我们可以使用 factor 参数来改变图像的亮度。查看图 8 ,如果我们增加因子(1.5),图像会更亮。类似地,当系数小于 1 时,图像会变暗。
def adjust_brightness(img,factor=1):
"""
Invert image on x axis
factor: <1 will decrease brightness and >1 will increase brightness
"""
img = Image.fromarray(img)
enhancer = ImageEnhance.Brightness(img)
img = enhancer.enhance(factor)
return img
图 8:调整亮度(来源:作者)
这个功能可以帮助我们模拟不同的光照条件。我们可以看到,如果我们在数据收集期间开灯和关灯,我们会得到类似的结果。
颜色抖动
我们可以使用抖动功能进一步扩大这些类型。这将随机改变图像的亮度、对比度、饱和度和色调。使用这些参数,我们可以定义这些方面的变化程度。你可以在图 9 中看到一些例子。这些是使用默认参数值创建的。
def jitter(img, b=0.2, c=0.2, s=0.2, h=0.1):
"""
Randomly alter brightness, contrast, saturation, hue within given range
"""
img = Image.fromarray(img)
transform = transforms.ColorJitter(
brightness=b, contrast=c, saturation=s, hue=h)
# apply transform
img = transform(img)
return img
图 9:抖动增强(来源:作者)
同样,您需要考虑这些扩充对您的应用程序是否有意义。你可以看到,默认情况下,我们将色调因子设置为 0.1(即 h=0.1)。如图图 10 所示,较高的色调因子会返回具有不同色彩轨迹的图像。然而,在生产中,我们的轨道将始终是橙色的。
图 10:色调=0.5 时的抖动(来源:作者)
我们还应该考虑这些类型的转换的局限性。他们调整整个图像的颜色。现实中,光照条件更复杂。阳光可以从不同的角度反射出赛道。轨道的某些部分可能比其他部分更暗。如果你真的想捕捉这种噪音,你必须做好数据收集工作。
输入噪声
一种不太系统的方法是随机引入噪声。你可以在图 11 中看到一些例子。在每种情况下,我们都能够调整引入的噪声量。
图 11:噪音(来源:作者)
在进行这些放大时,请记住,我们 224 x 224 图像中的每个像素都有 3 个通道——R、G、b。每个通道可以取 0 到 255 之间的值。这些决定了像素的颜色。
图 11 中的第一行是使用 gaussian_noise 函数创建的。我们创建一个与图像(第 4-5 行)具有相同尺寸(224 x 224 x 3)的随机噪声阵列。这个数组中的每个元素将从均值为 0 的正态分布和给定的方差( var )中采样。将此添加到图像中会随机调整 R、G、B 通道。
def gaussian_noise(img,var=5):
"""Add guassian noise to image"""
dims = np.shape(img)
noise = np.random.normal(0,var,size=dims).astype("uint8")
img = img + noise
return img
sp_noise 功能的工作方式类似。除了现在我们以给定的概率( prob )随机改变像素为黑色或白色。您可以在图 11 中的第二排看到这一点。
def sp_noise(img,prob=0.1):
"""Add salt and pepper noise to image"""
height,width,channels = np.shape(img)
img = np.array(img)
#Iterate over all pixels
for i in range(height):
for j in range(width):
#Randomly change pixel values
if random.random()<prob:
if random.random() < 0.5:
img[i][j] = np.array([255,255,255]) #white
else:
img[i][j] = np.array([0,0,0]) #black
img = Image.fromarray(img)
return img
高斯和椒盐噪声具有降低图像质量的效果。在生产中,模型可以使用不同质量的图像进行预测。这些扩充有助于创建一个对这些变化具有鲁棒性的模型。
delete_square 函数是添加噪声的另一种方法。它的工作原理是删除大块的图像。更具体地说,它将一个给定尺寸的随机正方形(像素)变成黑色。图 11 的最后一行给出了示例。
def delete_square(img,pixels=20):
"""Delete random square from image"""
img = np.array(img)
h,w,channels = np.shape(img)
#Random starting pixel
rh = random.randint(0,h)
rw = random.randint(0,w)
sub = round(pixels/2)
add = pixels-sub
#Boundries for square
hmin = max(rh-sub,0)
hmax = min(rh+add,h-1)
vmin = max(rw-sub,0)
vmax = min(rw+add,w-1)
# Turn pixel within range black
img[hmin:hmax,vmin:vmax] = np.array([0,0,0])
img = Image.fromarray(img)
return img
删除也有助于建立一个更健壮的模型。在进行预测时,模型可能会关注某个特定的特征。例如,我们的模型可能只使用外部橙色车道。删除部分图像将强制模型使用多个特征。因此,如果某个特征发生了变化,模型仍然能够做出准确的预测。
虽然耗时,与删除,你可能要采取更系统的方法。即排除图像的特定部分。你可以在图 12 中看到这一点。这里我们已经从背景中删除了椅子。这是因为模型不会将其与右转相关联。
图 12:系统删除(来源:作者)
测量增强的效果
所以我们已经看到了不同类型的增强。我们也看到了如何改变其中一些的水平。实际上,类型和级别可以被视为一个超参数。当调谐这些是重要的是要记住一些事情。
不要扩充测试集
假设我们扩充整个数据集,并进行训练和测试分割。这可能会导致高估模型的性能。这是因为过度适应训练集不一定会导致测试集的性能不佳。
以我们在图 8 中看到的亮度增强为例。其中一些可能在训练中结束,而另一些可能在测试集中结束。现在考虑同样的事情会发生在其他的增强上。您可以看到测试集看起来与训练集非常相似。
图 8:调整亮度(来源:作者)
事实上,最好不要增加测试集。这是因为测试集用于评估模型在生产中的性能。这里,不期望模型对扩充数据进行预测。
测试集中没有反映所有条件
同时,您需要考虑到您的测试集并不健壮。因此,良好的测试性能并不意味着生产中的良好性能。这是因为您的模型可能会面临测试集中没有捕捉到的情况。因此,为了真正理解增强的影响,我们需要在生产中测试它们。
这让我们陷入了一个棘手的境地。生产环境中的测试非常耗时,并且您无法在所有环境中进行测试。这意味着不可能测量扩增的效果。最终,您将需要批判性地思考什么样的增强适合您的应用程序。领域知识和经验可能更好地表明什么会起作用。
我希望你喜欢这篇文章!你可以成为我的 推荐会员 😃 来支持我
https://conorosullyds.medium.com/membership
| 推特 | YouTube | 时事通讯 —注册免费参加 Python SHAP 课程
资料组
JatRacer 图片 (CC0:公共领域)https://www.kaggle.com/datasets/conorsully1/jatracer-images
参考
H.Naveed,调查:用于数据扩充的图像混合和删除(2021)https://arxiv.org/abs/2106.07085
Gaudenz Boesch,2022 年计算机视觉的图像数据增强 【指南】https://viso . ai/Computer-Vision/Image-Data-Augmentation-for-Computer-Vision
如何在 PyTorch 中随机更改图像的亮度、对比度、饱和度和色调(2022)https://www . geeks forgeeks . org/How-to-random-change-the-brightness-contrast-saturation-and-hue-of-an-image-in-py torch/
C.Shorten & T.M. Khoshgoftaar,深度学习的图像数据增强调查(2019)https://journalofbigdata . springer open . com/articles/10.1186/s 40537-019-0197-0
Jason Brownlee,用噪声训练神经网络以减少过拟合(2019)https://machine learning mastery . com/Train-Neural-Networks-With-Noise-to-Reduce-over fitting/
八月版:作为数据科学家更好地写作
原文:https://towardsdatascience.com/august-edition-writing-better-as-a-data-scientist-5893196fd3cf
月刊
发展你的写作技能的好处是从作为求职者更大的知名度到更深层次的学习过程
由 Pierre Bamin 在 Unsplash 上拍摄的照片
每个数据科学家都是作家。即使您没有在 TDS 上与我们一起发布,您仍然每天与您的经理、利益相关者和同事共享幻灯片、报告和代码文档。你有没有遇到过没有把“较强的沟通能力”列为要求的职位描述?我们也没有。
当你写好你的数据科学或 ML 项目时,受益的不仅仅是你的读者,还有你,作者。为了证明这一点,我们收集了数据从业者最近的几篇文章,他们逐渐认识到发展写作技能的好处。向下滚动阅读他们的旅程,并从他们一路上获得的见解中学习。
如果你的写作抱负超出了你工作的要求,并且你正在考虑与更广泛的专业圈子分享你的专业知识,那么,这对我们来说是个好消息。为了支持我们社区中更多想要获得公共写作回报的成员,本月早些时候我们发起了作家工作坊:一个新的系列,面向当前和有抱负的 TDS 贡献者,他们想要完善他们的工艺。如果你还没有读过这个系列的第一篇文章推广的艺术,那你就错过了——这是一个丰富的资源,可以帮助你培养受众,扩大你作为数据专家的影响力。
说到我们的作者:如果你觉得鼓舞了他们,可以考虑通过成为中级会员来表达你的支持。
TDS 编辑亮点
- 在互联网上写作如何帮你找到一份数据方面的工作我开始写数据科学是为了好玩。[……]但后来我意识到我写的那些文章对我的职业生涯有多么大的帮助(现在仍然如此)。”奥特维奥·西莫斯·西尔维拉解释了他的博客如何带来工作机会,并分享了入门建议。(2022 年 7 月,5 分钟)
- 我的技术写作之旅写了几十篇文章,吸引了成千上万的读者,高反思了将想法和问题转化为与他人联系的博文的挑战。(2022 年 6 月 9 分钟)
- 写作可以帮助你成为一名更好的数据科学家给你的动力,阅读弗兰克·安德拉德的这篇简洁的概述,他解释了如何提高你的写作水平可以导致对你正在解开的概念的更深理解,并帮助你建立你在该领域的权威(招聘人员也可能注意到这一点)。(2022 年 7 月,4 分钟)
- 提高数据素养的实用步骤
梅根·迪布尔说:“我希望看到一个没有人会被数据世界吓倒的未来,”她认为实现这一目标的方法是让数据科学学习资源更具可读性和更容易理解。(2022 年 5 月,4 分钟) - 我写技术文章的 6 个步骤如果你觉得有灵感终于把羽毛笔写在纸上(或者,好吧,手指对着键盘)但发现实际的起草过程令人生畏,康纳·奥沙利文在这里可以帮你。他为技术写作者提供的详细路线图涵盖了从创意产生到编辑的所有内容,并将帮助你将写作从“一团糟”推向“抛光的宝石”
原始特征
TDS 团队的最新文章和资源:
- 推广的艺术 。网络、关键词、分销渠道……我们的第一篇作家研讨会文章涵盖了作为数据科学家在 TDS 及其他领域寻找和发展受众的要点。
- 作者角 。为了帮助你找到写作(和相关主题)的资源,我们创建了这个方便的、经常更新的摘要,你也可以在我们的主页上看到它。
- “一个没有商业头脑的数据专业人士,就像一把没有柄的剑。” 我们最新的作者聚焦高级数据分析师 Rashi Desai ,他分享了对职业道路的见解,找到你作为数据专业人员的目标,以及有效沟通你的结果的重要性。
- 夏读为数据科学家 。这或多或少都是一个非常热门的话题,所以如果你想学点新东西,但真的需要它成为海滩阅读的好去处,我们为你准备了一系列有趣、吸引人的文章。
热门帖子
如果你错过了它们,这里有一些我们在过去一个月发表的最受欢迎的文章。
- 简历中阻碍你获得第一份数据科学工作的 5 件事麦迪森·亨特
- 强大的熊猫俏皮话每个数据科学家都应该知道byAvi Chawla
- Python 中的探索性数据分析——循序渐进的过程 作者安德鲁·D
- 6 层次数据可视化 由 Kruthi Krishnappa
- 作为数据科学家如何开发在线收入流Pier Paolo Ippolito
如果你想加入我们作者社区的行列,请大胆尝试与我们分享你的作品。你将成为一群聪明、有成就的作家中的一员——包括我们上个月首次发表作品的所有新撰稿人:昆廷·加利亚博士、雷纳托·索蒂诺、斯泰西·李、西德尼·霍夫、埃德加·阿吉拉尔、西蒙·奥伯里、乔希·贝里、内哈·德萨茹。 弗朗西斯科·卡斯蒂略·卡拉斯科,皮埃尔·布兰查德,托纳姆,莱昂纳多·里古蒂尼,克里斯蒂安·万瑟,贾宁,尼克·孔兹,菲尔·贝尔,卡洛琳·王,纳姆迪·乌祖库,
用于对象检测的自动标记工具
原文:https://towardsdatascience.com/auto-labeling-tool-for-object-detection-acf410a600b8
停止浪费所有时间标注数据集
凯尔·辛克森在 Unsplash 上的照片
任何使用过对象检测的人都知道标记/注释过程是最难的部分。这并不困难,因为它像训练一个模型一样复杂,而是因为这个过程非常繁琐和耗时。
在我以前使用这项技术的工作中,我面临的挑战是处理包含数千幅图像或数百幅图像(每幅图像包含几十个对象)的数据集。在这两种情况下,我唯一的选择是浪费几天时间来创建标签,或者使用大量的人力资源来这样做。
考虑到这个恼人的瓶颈,我创建了一个简单(但有效)的自动注释工具来简化这个过程。虽然它不能完全取代手工注释过程,但它会帮你节省很多时间。基于此,本文解释了这个工具是如何工作的,以及如何使用它来简化您的下一个对象检测项目!
它是如何工作的
自动标注工具基于半监督架构的思想,其中使用少量标记数据训练的模型用于为数据集的其余部分产生新的标签。就这么简单,库使用一个初始和简化的对象检测模型来生成带有图像注释的 XML 文件(考虑到 PASCAL VOC 格式)。下图说明了这一过程:
自动注释过程。(图片作者)
不幸的是,作为一个半监督的解决方案,手动标注是不可能避免的,但是你只需要标注一小部分数据。
很难确定要手动标记的图像数量,因为这取决于问题的复杂程度。例如,如果您想要检测狗和猫,并且数据集中有 2000 张图像,那么大概 200 张图像就足够了(每类 100 张)。另一方面,如果您有几十个难以检测的类或对象,您应该需要更多的手动注释才能看到半监督方法的好处。
另一方面,至少花一些时间手动注释图像有一些有趣的优点。首先,您将更仔细地查看数据,这可以帮助您发现问题(例如,对象之间距离太近,或者照明条件与您想象的不同)并确定模型约束。
除此之外,数据集的缩减版本通常用于超参数调整和神经架构搜索,因此这可能是尝试找到最适合您问题的模型配置的绝佳时机。
也就是说,一旦您标记了一些图像并训练了一个初始模型,您将能够使用自动注记工具来加速数据集其余部分的这一过程!
使用自动注释工具
这个项目是完全开源的,可以在 GitHub 上获得。代码是用 Python 编写的,目前,它只支持 TensorFlow 模型(尽管 Pytorch 支持很快就会出现)。
您可以使用 pip 安装该库,如下所示:
$ pip install auto-annotate
建议使用 Python 虚拟环境,以避免与 TensorFlow 版本的任何兼容性问题。安装完成后,您可以从命令行或直接在 Python 代码中使用该库。对于这两者,您将拥有相同的参数集:
- saved_model_path: 初始模型所在的 saved_model 文件夹的路径。
- **label _ map _ path:**label _ map . Pb txt 文件的路径。
- imgs_path: 包含要标记的数据集图像的文件夹的路径。
- **xml_path(可选)😗*保存生成的 xml 文件的路径。默认行为是保存在数据集图像的同一文件夹中。
- **阈值:**接受模型检测的置信度阈值。默认值为 0.5。
命令行
使用这个库更简单的方法是从命令行调用它。为此,在您的终端中,使用您自己的参数执行以下命令:
python -m auto_annotate --label_map_path /example/label_map.pbtxt \
--saved_model_path /example/saved_model \
--imgs_path /example/dataset_images \
--xml_path /example/dataset_labels \
--threshold 0.65
Python 代码
如果出于某种原因,您希望在 python 代码中直接使用该库,您可以简单地执行以下操作:
如果一切正常,您将看到数据集注释的进度条。在执行过程中,您可以使用像 LabelImg 这样的注释工具来打开您的图像和自动生成的标签,以验证它们是否按预期生成。
行动后:查看标签
我们已经知道,每一个机器学习模型都会犯错误,这在这个标记过程中并没有什么不同。如果你用这个工具生成的全新标签重新训练你的初始模型,你将假设弱监督,因为你将在标签/注释中发现一些噪声。
监管不力有其自身的问题,如果可能的话,你希望避免这种情况。也就是说,建议在自动标注过程后检查标签,以找到并修复错误的预测。我们再次面临手动过程,但是检查和改进一些标签的质量比从零开始绘制边界框要快得多。
此外,生成的预测的质量将取决于初始模型的准确性和置信度阈值。如果置信度阈值很高(接近 1),模型将生成更少的错误预测(假阳性),并且您必须为丢失的对象(假阴性)画出方框。
另一方面,接近 0 的阈值将生成更多不正确的预测,但是您只需要擦除并修复倾斜的边界框。最佳置信度值将是根据您的问题和模型性能进行调整的参数。
检查之后,您就可以用整个数据集重新训练初始模型了。
项目扩展:MLOps 用例
在自动注释了我的整个数据集并训练了一个很棒的模型之后,我刚刚完成了我的项目,对吗?嗯,也许不是…
机器学习工程和模型产品化是当今非常重要的领域,因为我们知道生产中的模型需要监控和改进,这对于深度学习模型来说没有什么不同,比如对象检测器。
当您发布基于图像的项目时,用户可能会发送在训练数据集中不常见的图像。例如,考虑一下猫狗检测器:您的数据集中可能没有很多海滩上的狗的图像,但您可能在暑假期间收到很多!
也就是说,这个项目的一个很好的用例是创建一个自动注释管道,从用户在生产中发送的图像中不断生成新的标签。然后,您可以将新的图像和生成的注释集成到自动训练管道中,以便每月重新训练您的对象检测模型。
使用这种方法,您将保证您的模型总是随着用户行为而更新,并且性能良好。此外,随着您的模型变得更加健壮,注释新图像所需的手动验证将会减少。
结论和最终想法
随着深度学习不断推进新的最先进的架构,以及更多的计算机能力可用,数据仍然是人工智能的一个巨大瓶颈。
为了训练一个好到足以投入生产的对象检测模型,需要大量带注释的数据,这很容易成为项目中最昂贵的部分。
鉴于这一事实,自动注释工具在这个过程中可以是一个很好的助手,因为它通过推断图像中对象的位置和类别来加速人工任务。
在其他选项中,本文介绍的自动注释工具具有免费、开源和易于使用的优点。虽然手工部分还是有必要的,但是这个库到目前为止已经帮助了我很多不同的项目,我想它也可以帮助其他人!
Python 中的自动 MLBox 包概述
原文:https://towardsdatascience.com/auto-ml-in-python-an-overview-of-the-mlbox-package-66668c6b1bfb
了解 MLBox,针对 python 中的分类问题快速高效地训练自动化机器学习管道
今天的帖子很特别。它是与 Axel De Romblay 合作编写的,他是 MLBox Auto-ML 软件包的作者,该软件包在过去几年中广受欢迎。
如果你还没有听说过这个库,那就去 Github 上看看吧:它包含了一些有趣的特性,正在变得越来越成熟,现在正在积极开发中。
MLBox
回购
在本帖中,我们将向您展示如何轻松地使用它来训练自动机器学习管道来解决分类问题。它将首先加载和清理数据,消除漂移,启动一个强大的加速优化管道,并生成预测。
我们开始吧!🚀
MLBox 简介
MLBox 已经在许多机器学习会议上展示过。你可以在这里查看其中一张幻灯片。这是一个很好的开始,让我们对更一般的 AutoML 概念的库有一个总体的了解。
MLBox 的幻灯片分享演示
2 —下载训练和测试数据集
在这本笔记本中,我们将解决著名的泰坦尼克号卡格尔挑战,其中包括根据乘客的属性(性别、年龄、姓名等)预测他们的存活率。
如果你不熟悉这个比赛,你可以查看这篇文章。
现在让我们下载数据:
如果你有账户的话
如果您有一个 Kaggle 帐户,您可以在您的个人资料页面上生成一个 API 令牌:
一旦生成了 API 令牌,您的系统上就会下载一个 kaggle.json,其中包含您的用户名和密钥。
- 如果您使用的是基于 Unix 的操作系统,请将该文件放在~/中。kaggle/然后
chmod 600 ~/.kaggle/kaggle.json
- 如果您在 Windows 机器上:
export KAGGLE_USERNAME=<your-username>
export KAGGLE_KEY=<your-key>
来自互联网:
确保您安装了 wget:pip install wget
然后将 train.csv 和 test.csv 放在项目根目录下的data
文件夹中。
3 —环境设置和从 PyPI 安装 MLBox
建议创建一个 conda 虚拟环境,因为 MLBox 包含几个依赖项,可能会与您当前的库混淆。拥有一个干净的虚拟环境是正确的解决方案,如果出现任何问题,您可以在不影响系统的情况下将其删除。
conda create -n automl python=3.7
这就创建了一个名为 automl 的环境,其中预配置了 python 3.7。
如果你像我一样在 OSX 上,你必须通过 brew 安装 OpenMP (开放式多处理),这是多线程的有效实现:
(base) brew install libomp
现在激活 automl 并直接从 PyPI 安装 MLBox:
(base) source activate automl
(automl) pip install mlbox
原创博文
如你所见,MLBox 有相当多的依赖项,如 scikit-learn、pandas 等。这就是为什么我们创建了一个空的虚拟环境。
[可选]:从 Jupyter 访问 automl 内核。
如果你想在这种环境下使用 jupyter notebook,而不是激活它,而是从基本的 jupyter 下拉列表中选择内核;你必须安装 ipykernel :
(automl) conda install ipykernel
图片由作者修改
现在你可以走了!
4 —测试 MLBox:从数据摄取到模型构建
现在我们将测试并运行 MLBox,快速构建一个模型来解决 Kaggle Titanic 挑战。
有关软件包和 API 文档的更多信息,请访问以下链接:
正在导入 MLBox
Using TensorFlow backend. CPU times: user 2.42 s, sys: 740 ms, total: 3.16 s
Wall time: 4.04 s
MLBox 的输入
如果你有一个 train 和一个测试集,就像在任何 Kaggle 比赛中一样,你可以将这两个路径直接提供给 MLBox 以及目标名称。
否则,如果只输入一个训练集,MLBox 将创建一个测试集。
读取和预处理
MLBox 的 Reader 类负责准备数据。
它提供方法和实用程序来:
- 使用正确的分隔符(CSV、XLS、JSON 和 h5)读入数据并加载
- 通过以下方式清理数据:
- 删除未命名的列
- 推断列类型(float,int,list)
- 处理日期并从中提取相关信息:年、月、日、星期、小时等。
- 删除重复项
- 准备列车和测试分离
更多信息请点击:https://ml box . readthe docs . io/en/latest/features . html # ml box . preprocessing . reader
原创博文
当这个函数完成运行时,它创建一个名为save
的文件夹,将目标编码器转储到这个文件夹中以备后用。
df["train"].head()
原创博文
消除漂移
这是我在其他包里没遇到过的创新功能。主要思想是自动检测和移除在训练集和测试集之间具有显著不同分布的变量。
这种情况经常发生,我们通常会谈到有偏差的数据。例如,您可能会遇到这样的情况:列车组中有年轻人,而测试组中只有老年人。这表明年龄特征不是健壮的,并且可能导致模型在测试时的不良性能。所以它必须被丢弃。
更多信息:
- 关于算法:https://github . com/AxeldeRomblay/ml box/blob/master/docs/webinars/features . pdf
- 关于 MLBox 实现:https://ml box . readthe docs . io/en/latest/features . html # ml box . preprocessing . drift _ thresholder
图片由作者修改
MLBox 如何计算单个变量的漂移
MLBox 构建了一个分类器,将训练与测试数据分开。然后,它使用与该分类器相关的 ROC 分数作为漂移的度量。
这是有道理的:
- 如果漂移分数高(即 ROC 分数高),则从测试数据中辨别训练数据的能力很容易,这意味着两种分布非常不同。
- 否则,如果漂移分数低(即 ROC 分数低),则分类器不能正确地分离两种分布。
MLBox 提供了一个名为 Drift_thresholder 的类,它将训练集和测试集以及目标作为输入,并计算每个变量的漂移分数。
Drift_thresholder 然后删除漂移分数高于阈值(默认为 0.6)的变量。
原博文
正如你在这里看到的,Name
、PassengerId
和Ticket
因为他们各自的漂移分数而被移除。如果你仔细想想,这一点也不奇怪,因为这些变量,鉴于它们的性质,可以有任何随机值,从而导致它们的训练和测试分布之间的似是而非的漂移。
重担:优化
此部分执行管道的优化,并尝试不同的参数配置:
- NA 编码器(缺失值编码器)
- CA 编码器(分类特征编码器)
- 功能选择器(可选)
- 堆叠估计器—特征工程师(可选)
- 估计器(分类器或回归器)
更多详情请点击:https://ml box . readthe docs . io/en/latest/features . html # ml box . optimization . optimizer
我们首先实例化优化器类:
opt = Optimiser()
然后,我们可以使用默认的模型配置来运行它,而不需要任何 autoML 或复杂的网格搜索。
这应该是第一个基线
原创博文
负对数损失= -0.6325 作为第一基线。
现在让我们定义一个多种配置的空间:
- ne__numerical_strategy:如何处理数字特征中的缺失数据
- ce__strategy:如何处理分类变量编码
- fs:功能选择
- 堆叠:元功能堆叠器
- 估计值:最终估计值
现在让我们来评估这个模型:
opt.evaluate(params, df)
原创博文
运行此管道导致了更高的 neg 损失,这是更好的。
如果我们定义一个更好的搜索或堆叠操作空间,也许还有其他的特征选择技术,就有很大的潜力可以进一步改进。
5-运行预测
现在,我们拟合最佳管道并预测我们的测试数据集。
更多详情请点击:https://ml box . readthe docs . io/en/latest/features . html # ml box . prediction . predictor
6 —结论
运行自动化 AutoML 管道从未如此简单。使用 MLBox,您可以快速高效地完成这项工作,以便在解决业务问题时可以专注于重要的事情。
- 理解问题
- 获取和整合正确的数据
- 形式化性能指标以达到和计算
让我们希望这三个第一步不会很快自动化:)
我们希望你喜欢这个图书馆。不要犹豫,在 G ithub 上给它一颗星,或者向它的贡献者报告一个问题。
新到中?你可以每月订阅 5 美元,并解锁各种主题的无限文章(技术、设计、创业……)你可以通过点击我的推荐链接来支持我
https://ahmedbesbes.medium.com/membership
由 Unsplash 上的 Karsten Winegeart 拍摄
基于 ML 技术的时间序列自动模型描述
如何使用 Python 库 scalecast 自动选择时间序列的最佳趋势、季节和自回归表示
根据所采用的模型,有几种方法可以找到时间序列的最佳模型规格。对于 arIMA 模型,一种流行的方法是在搜索不同的 AR、I 和 MA 订单时监控信息标准。这已经被证明是一种有效的技术,流行的库 R 和 Python 提供了自动 ARIMA 模型供用户试验。类似的方法可以用于其他经典的统计时间序列方法,如霍尔特-温特斯指数平滑和 TBATS。
对于机器学习模型来说,它可以稍微复杂一些,除了复杂的深度学习模型(如 N-Beats 、 N-HiTS 和其他几个),没有多少自动化的纯 ML 方法持续优于经典模型(Makridakis 等人,2020)。
Python 库 scalecast 提供了一个名为 [auto_Xvar_select()](https://scalecast.readthedocs.io/en/latest/Forecaster/Forecaster.html#src.scalecast.Forecaster.Forecaster.auto_Xvar_select)
的函数,可以使用来自 scikit-learn 的模型自动选择任何给定系列的最佳趋势、季节性和回望表示(或滞后)。
pip install --upgrade scalecast
该函数的工作方式是首先搜索时间序列给定趋势的理想表示,然后是季节性,然后是回望,所有这些都是分别进行的。“理想”在这种情况下意味着使用选定的模型(默认为多元线性回归,或 MLR)最小化一些样本外误差(或最大化 R2)。在分别找到这些中的每一个之后,搜索所有上述表示的理想组合,并选择考虑不规则周期和用户认为合适的其他回归量。
按作者分类的图片 scalecast 如何使用 auto_Xvar_select()函数为预测模型自动选择回归量
这是一个有趣的功能。当应用于 M4 竞赛的 100,000 系列时,它返回具有不同准确度的结果,这取决于系列的频率。对于每小时频率组,使用 KNN、LightGBM 和 XGBoost 模型均可获得低于 0.6 的 OWA,其中使用默认 MLR 模型搜索这些模型的表示。就背景而言,这意味着这些模型的表现有望超过一个简单的模型,其季节性调整平均超过 40%(1–0.6)。这是一个非常可靠的结果,与 sktime 在同一系列中使用纯 ML 方法发布的结果相当(Loning 等人,2019)。
**# evaluate the hourly series
for** i **in** tqdm(Hourly**.**index):
y **=** Hourly**.**loc[i]**.**dropna()
sd **=** info**.**loc[i,'StartingDate']
fcst_horizon **=** info**.**loc[i,'Horizon']
cd **=** pd**.**date_range(
start **=** sd,
freq **=** 'H',
periods **=** len(y),
)
f **=** Forecaster(
y **=** y,
current_dates **=** cd,
future_dates **=** fcst_horizon,
)
f**.**set_test_length(fcst_horizon)
f**.**integrate(critical_pval**=**.99,max_integration**=**1)
f**.**set_validation_length(fcst_horizon)
f**.**set_validation_metric('mae')
**if** len(f**.**y) **>** 300:
f**.**auto_Xvar_select(
monitor**=**'LevelTestSetMAE',
max_ar **=** 48,
exclude_seasonalities **=** [
'quarter',
'month',
'week',
'day',
]
)
f**.**determine_best_series_length(
monitor**=**'LevelTestSetMAE',
step**=**50,
min_obs **=** 300,
)
**else**:
f**.**auto_Xvar_select(
monitor**=**'LevelTestSetMAE',
irr_cycles **=** [168], *# weekly*
exclude_seasonalities **=** [
'quarter',
'month',
'week',
'day',
'dayofweek',
],
max_ar **=** 24,
)
f**.**tune_test_forecast(
models,
error**=**'ignore',
)
查看用于在 M4 系列此处运行所有带有 scalecast 的模型的笔记本,以及用于在相同过程中评估每个模型性能的笔记本此处。
我的问题是,在auto_Xvar_select()
函数中使用不同于缺省值的估计量是否能导致持续更好的结果。以这种方式搜索模型规格可能很耗时,但使用 MLR 来做通常不会使事情变慢太多,这就是为什么它是该功能的默认设置。
不幸的是,这是一个漫长的过程来充分研究。为了简化流程,我将模型限制为:
- 多元线性回归
- 弹性网
- 梯度增强树(GBT)
- k-最近邻(KNN)
- 支持向量机
- 多级感知器(MLP)
这些模型中的每一个都被用来寻找代表和预测,尝试了所有的组合。我也只对每个模型使用默认参数,尽管我相信用网格搜索来调整它们可以显著提高性能。最后,我只使用了从小时组的 414 个系列中随机选择的 50 个样本。即使做了这些修改,这个过程在我的 Windows 电脑上运行了 17 个多小时。由此产生的预测通过各自的平均对称平均绝对百分比误差(SMAPE) 性能进行评估,这是 M4 竞赛中用于评估模型的指标之一。在这里找到完整的笔记本。
for i in tqdm(Hourly.index):
y = Hourly.loc[i].dropna()
sd = info.loc[i,'StartingDate']
fcst_horizon = info.loc[i,'Horizon']
cd = pd.date_range(
start = sd,
freq = 'H',
periods = len(y),
)
f = Forecaster(
y = y,
current_dates = cd,
future_dates = fcst_horizon,
)
f.set_test_length(fcst_horizon)
f.integrate(critical_pval=.99,max_integration=1)
for xvm in models:
for fcstm in models:
f2 = f.deepcopy()
f2.auto_Xvar_select(
estimator = xvm,
monitor='LevelTestSetMAE',
max_ar = 48,
exclude_seasonalities = [
'quarter',
'month',
'week',
'day'
],
)
f2.set_estimator(fcstm)
f2.proba_forecast(dynamic_testing=False) if fcstm in (
'mlp','gbt','xgboost','lightgbm','rf'
) else f2.manual_forecast(dynamic_testing=False)
point_fcst = f2.export('lvl_fcsts')[fcstm]
results.loc[xvm,fcstm] += metrics.smape(
Hourly_test.loc[i].dropna().to_list(),
point_fcst.to_list(),
)
这引出了几个值得观察的有趣观点:
- 在衡量实际预测准确性时,KNN 和 GBT 模型始终优于其他模型,无论哪个模型用于搜索最佳序列表示。这并不奇怪,因为这些是整个 M4 每小时系列中表现最好的车型。
- 表现最差的模型是 SVR、ElasticNet 和 MLP,最好的模型和最差的模型平均相差 60.8(!!)个百分点。
- 在寻找理想的系列表现方面最好的模型是 ElasticNet 和 MLP,在这方面最好的和最差的模型之间只有 4 个百分点的差距。
- 平均而言,表现最好的模型组合是 KNN 模型和 MLP 模型。
作者图片
因此,从该实验中可以看出,用于进行预测的模型比用于寻找理想表示的模型对获得高精度更重要。不过,这两方面的最佳模式似乎也是相互颠倒的。寻找表征的最佳模型在预测方面表现不佳,反之亦然。弱估计量可能更依赖于找到理想的趋势、季节性和回顾性,甚至有机会做出好的预测,因此将弱估计量与强估计量结合起来找到最佳表示以实际做出预测是一个好主意。但是,这只是一个想法,还需要更多的研究来证实。
结论
很难找到一种完全自动化的机器学习技术来预测持续优于经典统计方法的情况。很多时候,最好的结果来自于不同的最大似然估计的组合。在这种情况下,我发现使用较弱的模型来寻找给定序列的理想趋势、季节性和回望表示,并将该表示与较强的模型相结合来进行预测,通常会在我测试的小时序列样本上获得最佳结果。所有这些方法都用样本外数据进行了测试,scalecast 软件包提供了一个非常简单的界面来执行这种分析。
链接
- Scalecast: Github / 阅读文档
- 带 scalecast 的 M4 车型: GitHub
- 用 scalecast 评估 M4 模型: GitHub
- 使用 scalecast 对 50 系列进行 Auto Xvar 实验: GitHub / 阅读文档
作品引用
马库斯·洛宁、安东尼·巴格纳尔、萨贾苏亚·加内什、维克多·卡萨科夫、杰森·莱恩斯和弗朗兹·基拉里。sktime:时间序列机器学习的统一接口。更正,abs/1909.07872,2019。网址http://arxiv.org/abs/1909.07872.
斯皮罗斯·马克里达基斯、伊万杰洛斯·斯皮里奥蒂斯和瓦西里奥斯·阿西马科普洛斯。M4 竞赛:100,000 个时间序列和 61 种预测方法。国际预测杂志,36(1):54–74,2020。doi:10.1016/j . ijforecast . 2019 . URLhttps://ideas.repec.org/a/eee/int for/v36y 2020 i1p 54–74 . html