机器学习:使用数据扩充提高 MNIST 的分类精度
增加训练数据集的简单方法
MNIST 数据集有被称为你好世界的图像分类。每个机器学习工程师迟早都会处理这个数据集。
数据集
MNIST 是一组手写数字的小图像。请看下图,其中有一些例子。
MNIST 数据集
共有70000 张图像,每张图像有 784 个特征。这是因为每幅图像都是 28 x 28 像素,每个特征代表一个像素的强度,从 0 到 255。
有许多分类算法(SGD,SVM,RandomForest 等)可以在这个数据集上训练,包括深度学习算法(CNN)。
培训和评估
我们以 RandomForest 分类器为例,在上面的数据集上对其进行训练,并进行评估。
在测试集上评估或建模后,我们得到的准确度分数是 0.9705
我们能提高准确性吗?
我们可以通过调整算法的超参数或者尝试不同的算法来改进。但是我们能对数据集做些什么吗?
是的,我们可以!(是的,我们也会打败新冠肺炎)
有时算法需要更多的数据集来提高预测功能,我们可以使用相同的数据集本身来扩展数据集。
如何扩展数据集?
正如我们之前所讨论的,数据集的每个实例只不过是( 784 )个像素值的向量。(这实际上是一个代表 28x28 图像)
如果我们把图像向两边移动两个像素会怎么样?请看下面的例子。
增强图像
这些图像会聚在一起,对吗?如果我们生成这样的图像,并将其添加到我们的训练集中,然后再次训练模型,会怎么样呢?我们可能会得到更准确的预测。
履行
我们可以编写一个方法,按照给定的顺序在四个方向上移动图像。
我们将把图像向四个方向移动一个像素,并从一幅图像中再生成四幅图像。结果数据集现在将包含 3,00,000 张 图像( 60000 x 5 )。
我们可以为每一次移位增加 60,000 个实例。
让我们在这个新数据集上训练模型并进行评估。
瞧啊。!!精度得分现在是 0.9803 。
我们将精度提高了 ~0.01% 。这太棒了。
结论
- 我们已经从现有的数据集扩展了我们的数据集,使用“数据扩充”技术,通过简单地改变像素顺序。
- 在这个更大的数据集上进行训练,我们的准确率提高了 0.01%
请在下面的 GitHub 位置找到完整的代码
机器学习的注释和代码:https://akashp1712.github.io/ml-akash-阿卡什 1712/ml-阿卡什
github.com](https://github.com/akashp1712/ml-akash/tree/master/Articles/data-augmentation)
更多想法?
- 你能增加更多的数据集吗?(提示:对角移动图像)
- 尝试其他算法,而不是随机森林,比如 KNeighborsClassifier 或 SVM
当你纠结于一个问题的时候,就是你理解它的时候——埃隆·马斯克
通过改变图像的难度来提高分类器性能
我们提出了一个难度转换模型,该模型修改了结肠直肠组织病理学图像,使分类变得更具挑战性,发现用生成的图像作为增强数据训练的图像分类器表现更好。
**概述。**在这项研究中,我与一组研究人员合作,为组织病理学图像创建了一个难度翻译模型。换句话说,给定一些癌症的图像,我们将其修改成一个更难分类的图像。这是基于这样的动机,即这些图像具有一系列决定它们将如何被分类的特征,这不同于像 ImageNet 这样的一般计算机视觉数据集(例如,没有猫和狗的范围)。
如果你想更详细地了解我们的工作,可以在这里找到全文。
病理学家对生成的图像的认同度较低。左边的一组图片显示的是更难分类的翻译图片。右边的一组图像显示了图像翻译,并没有变得更难分类。
**数据集。**数据集由来自达特茅斯-希区柯克医疗中心的结肠直肠癌图像组成,它已被分为 2,051 个图像的训练集和 1,101 个图像的测试集。这些图像中的每一个都被标记为过度增生性息肉(HP)或无柄锯齿状腺瘤(SSA)。
**模型。**我们的模块由一个评分器和一个循环一致的生成对抗网络(CycleGAN)图像翻译器组成,前者预测给定图像的难度,后者将容易分类的图像翻译成较难分类的图像。通过这种配置,该模块能够将给定的图像翻译成类似的示例,该示例将被分类为具有相同的标签,但是将更加难以分类。
**生成更难的训练数据。**在本模块中,我们将 image translator 的源域设置为简单惠普映像,并将目标域设置为硬惠普映像。通过这样做,图像翻译器学会了将简单的 HP 图像转换成硬的 HP 图像。
为了评估翻译图像的难度,我们与三位病理学家一起进行了图灵测试。每个病理学家被给予 75 个随机采样的真实简易 HP 图像、75 个随机采样的真实硬 HP 图像、75 个从选择的简易 HP 图像翻译的生成的 HP 图像和 75 个 SSA 图像。病理学家被要求将每个图像分类为 HP 或 SSA。我们发现病理学家在生成的图像上比他们真正的对手有更多的分歧,这意味着生成的图像确实更难分类。完整的结果可以在下面看到。
与真实图像相比,病理学家对生成的 HP 图像的真实标签认同较少。大多数生成的图像保留了它们的 HP 标签,因为源图像和它们相应的生成图像都被大多数病理学家分类为 HP。
**提高分类器的性能。**生成的图像也可以作为附加数据,更好地训练深度学习分类器。为了测试这一点,我们首先将生成的 HP 图像添加回原始训练数据集中。然后,我们在这个新的训练数据集上训练了一个新的分类器,并将其性能与我们以前的分类器进行了比较。我们将我们的方法与一种更简单的数据增强方法进行了比较,在该方法中,简单图像和困难图像被拼接在一起,发现我们优于基线增强,并且使用生成的图像作为增强数据始终提高了性能。完整的结果可以在下面看到。
图像分类器的性能(% AUC)使用生成的图像作为具有高注释者一致性(即,容易图像)、低注释者一致性(即,困难图像)和所有测试集图像的增强数据进行训练。
**总结。**在我们的研究中,我们证明了改变图像的难度并使用困难的例子作为附加数据是一种改善深度学习分类器性能的有前途的方法。在我们的数据集上,我们的方法能够将性能提高大约 2%,这是一个显著的改进。我们希望这些结果鼓励其他人探索在其他环境中使用改变图像难度,如课程学习或对抗性攻击。
如果你想阅读我们的全文,可以在这里找到。
我们如何使用类平衡方法改进用于文本一致性建模的卷积神经网络
最近,深度学习由于在处理非常复杂的问题时在准确性方面的优势而越来越受欢迎。它在 NLP 中被证明是有效的,并被许多问题广泛采用,为更有意义和更准确的建模方法打开了新的大门。
虽然自然语言处理中的许多问题涉及文本合成,如文本生成和多文档摘要,但文本质量度量成为一个核心需求,并且对它们进行建模是一个活跃的问题。在这些措施中,语篇连贯是关键,需要特别处理。
语篇连贯(Text coherence)是指语篇逻辑一致性的程度,这个问题可以追溯到 20 世纪 80 年代,当时提出了几个模型。但是由于连贯性的概念过于抽象,因此制定一个衡量标准相当困难。我们讨论了使用最先进的方法对文本连贯性建模,以及我们为获得更准确的结果而对其进行的改进。图 1 显示了两段文本:文本 1 是连贯的,其中句子是逻辑有序的,而文本 2 具有不连贯的句子顺序。
图一。连贯和不连贯的文本样本
相干建模
统计方法
在深度学习兴起之前,有人建议用统计方法来模拟连贯性的意义;隐马尔可夫模型(HMM)被建议通过将文本视为主题序列来捕获全局连贯,连贯通过主题转移来捕获,其他方法使用词汇和句法特征。这些方法显示了良好但不是最好的结果。后来,提出了一种更有前途的基于深度学习的方法,使用递归神经网络(RNNs)⁵.然而,这种方法很少注意句子之间的语义关系。由于消失梯度问题,它也受到了 RNNs 处理长句的限制。
CNN 模型
2017 年,Yingming Li 等人提出了一种基于深度学习的文本连贯性分析,该分析利用卷积神经网络(CNN)的能力,将输入句子映射到专注于低级特征的高级表示中,并利用这些特征来捕捉更准确的句子语义交互,从而克服了以前模型的局限性。该模式建议同时学习句子分布表征和连贯;通过映射句子和学习句子级别的交互,如相似性,可以实现对文本连贯性的有意义的评分。然后在句子排序任务上对该模型进行评估。
了解模型
该模型将文档分成被称为 n 个句子的集团的段落。原始文档的派系是一致的;标记为 1。然后,它生成文档的 20 个排列,其中形成排列文档的集团被认为是不一致的;标记为 0。因此,文档的一致性分数是其所有派系的产物。
一个 3 人集团模型应该是这样的:
图二。文本连贯性测量的 CNN 模型
卷积层将句子映射到高级表示中,在该表示中捕获细粒度特征,然后根据图 3 中的等式计算相似性,在图 3 中还学习了相似性矩阵。
相似性方程使用训练的相似性矩阵 M1 来测量团体的第一个句子 Xf 和第二个句子 Xs 之间的相似性。同样的等式适用于第二句和第三句;Xs 和 Xt。第一句和第三句的相似度既然是传递关系,那就从前两个分数推断出来,不需要计算。
最后,致密层负责决定句子是否连贯。
图 3。相似方程
该模型的结果得到了认可,并且优于其他方法。正如该报所报道的:在由美国国家运输安全委员会官员撰写的航空事故报告集上测试该模型的结果是 95.0% 的准确率。
模型实现和分析
我和我的团队在“单文档摘要和评估”中实现了这篇论文,作为我们毕业论文的一部分,其中我们给生成的摘要一个一致性分数(代码可在 GitHub 这里获得),据我们搜索,这是这篇论文唯一可用的开源实现(有另一个资源库的作者宣布它是一个不正确的实现)。
我们首先按照论文的建议,使用相同的事故数据集训练模型。我们使用分层 k 折叠交叉验证进行 10 个折叠的模型训练,结果与论文报道的几乎相同;平均模型准确率为 95.38%
然后,我们开始解决模型的弱点。主要地,为训练数据中的每个文档创建 20 个排列,然后将其分成单独的集团的建议产生了不平衡的数据集。如 Buda 等人(⁴)所讨论的,具有类别不平衡数据会导致模型表现显著不佳。这可以通过调查下图 4 中测试数据的建议模型的 ROC 曲线来显示,其中模型的 AUC 为 0.77
图 4。基于测试数据的不平衡基本模型 ROC 曲线
尽管由于 CNN 使用共享参数并且该架构所建议的密集层较浅,所以该模型不会遭受过拟合,但是所建议的模型允许进一步改进。
改进模型
为了解决阶级不平衡的问题,我们采用了两种方法来比较它们是如何工作的:获取更多的数据,并试图克服阶级不平衡的问题。
1.访问更大的数据集:
首先,我们试图获得更多的数据。由于模型没有对文档进行限制,我们可以使用由数百万篇文章组成的 CNN/Daily Mail 数据集来增加数据集的大小。这种方法仅将精度提高到了 ~98% ,并允许架构有更深的密集层。但是 ROC 曲线几乎保持不变。
2.使用过采样平衡等级:
改进模型的第二种方法是使用布达和 al.⁴建议的过采样,通过随机重复数据中的少数类观察值来平衡类,直到它们几乎平衡。这种技术非常有效,并允许更深层次的网络架构,导致分层 10 倍验证准确性的平均 ~99% 和测试数据的 98.3% 准确性。
如图 5 所示,不仅提高了模型准确性,而且测试 ROC 曲线也接近最优,AUC 等于 0.993 。
图 5。基于测试数据的平衡基础模型 ROC 曲线
参考
[1] Pascale Fung 和 Grace Ngai。2006.一个故事,一个流程:用于多语言多文档摘要的隐马尔可夫故事模型。TSLP 3,2 (2006),1–16。
[2]安妮·路易斯和阿尼·年科娃。2012.基于句法模式的连贯模型。在 EMNLP-CoNLL。1157–1168.
[3]崔,b,李,y,张,y,张,z:基于深度神经网络的语篇连贯分析。载于:CIKM 2017,第 2027–2030 页。美国计算机学会(2017 年)
[4] Mateusz Buda、Atsuto Maki 和 Maciej A Mazurowski。卷积神经网络中类不平衡问题的系统研究。神经网络,2018。
[5]李继伟和爱德华·h·霍维。2014.基于分布式句子表示的连贯模型。在 EMNLP。2039–2048.
改进深度神经网络
吴恩达在深度学习专业课程中对超参数调整和正则化的建议。
帕维尔·卡迪什
我最近一直在学习 Coursera 的深度学习专业课程,该课程由吴恩达设计和教授。第二个子课程是改进深度神经网络:超参数调整、正则化和优化。在我开始这个子课程之前,我已经在我以前的项目中完成了传统机器学习算法的所有步骤。我调优了决策树的超参数,比如 max_depth 和 min_samples_leaf,还调优了 SVM 的 C、kernel 和 gamma。为了正则化,我将 Ridge (L2 惩罚)、Lasso (L1 惩罚)和 ElasticNet (L1 和 L2)应用于回归模型。所以我想这不会比把这些概念翻译到神经网络上多多少。好吧,我在某种程度上是对的,但是考虑到吴恩达是如何解释数学和直观地展示这些优化方法的内部运作的,我从基础层面上有了更好的理解。
在这篇文章中,我想回顾一下 Andrew 对这些技术的一些解释,并附有一些数学和图表。
超参数调谐
以下是一些针对深度网络调整的流行超参数:
- α(阿尔法):学习率
- β(β):动量
- 层数
- 隐藏单元的数量
- 学习率衰减
- 小批量
还有其他特定于优化技术的,例如,对于 Adam 优化,有β1、β2 和ε。
网格搜索 vs 随机搜索
假设对于一个模型,我们有一个以上的超参数正在调整,一个超参数可能会比另一个超参数对训练/验证精度有更大的影响。在这种情况下,我们可能希望为更有影响力的超参数尝试更广泛的值,但同时,我们也不想运行太多模型,因为这很耗时。
对于这个例子,假设我们正在优化两个不同的超参数,α和ε。我们知道α更重要,需要通过尝试尽可能多的不同值来调整。然后你仍然想尝试 5 个不同的ε值。所以,如果我选择尝试 5 个不同的α值,那么就有 25 个不同的模型。我们已经用 5 α和 5 ε的不同组合运行了 25 个模型。
但是我们想在不增加模型数量的情况下尝试更多的α值。以下是安德鲁的解决方案:
为此,我们使用随机搜索,其中我们为每个α和ε选择 25 个不同的随机值,每对值用于每个模型。现在我们只需要运行 25 个模型,但是我们可以尝试 25 个不同的α值,而不是网格搜索中的 5 个。
左:网格搜索,右:随机搜索
额外收获:使用由粗到细的方法有助于进一步提高调音效果。这包括放大表现最佳的超参数的较小区域,然后在该区域内创建更多模型,以更精确地调整这些超参数。
选择音阶
当尝试不同的超参数值时,选择正确的比例可能会很困难,尤其是要确保在一个非常大的数字范围和一个非常小的数字范围内进行彻底的搜索。
学习率是一个超参数,可以根据模型的不同而有很大的变化,它可以在 0.000001 和 0.000002 之间,或者在 0.8 和 0.9 之间。当查看线性标尺时,很难同时在这两个不同的范围之间进行公平的搜索,但是我们可以使用对数标尺来解决这个问题。
假设α的值在 0.0001 到 1 之间。使用线性标度意味着 10%的尝试α值在 0.0001 和 0.1 之间,90%在 0.1 和 1 之间。这很糟糕,因为我们没有对如此广泛的值进行彻底的搜索。通过使用 10 标度的对数,25%的α值在 0.0001 和 0.001 之间,25%在 0.001 和 0.01 之间,25%在 0.01 和 0.1 之间,最后 25%在 0.1 和 1 之间。这样我们对α进行了彻底的搜索。0.0001 到 0.1 的范围对于线性标度是 10%,而对于对数标度是 75%。
左:线性标度,右:对数标度
这里有一点数学知识,用一个 numpy 函数来演示它如何对α的随机值起作用。
规范化
由于高方差,过度拟合可能是模型的一个巨大问题,这可以通过获得更多的训练数据来解决,但这并不总是可能的,所以一个很好的替代方法是正则化。
L2 正规化(‘重量衰减’)
正则化利用 L1 和 L2 两种惩罚技术中的一种,主要使用神经网络 L2。
我们必须首先看一下神经网络的成本函数:
价值函数
然后加上 L2 罚项,其中包含了弗罗贝纽斯范数:
L2 刑罚术语,包括弗罗贝纽斯规范
通过 L2 正则化,权重不仅通过学习速率和反向传播降低,而且通过包括正则化超参数λ (lambda)的中间项降低。λ越大,w 越小。
重量衰减
规范化如何防止过度拟合?
我们看到 L2 正则化使用λ惩罚来减少权重 w,但是这如何减少方差并防止模型的过度拟合呢?
λ上升,w 下降,改变 z 的幅度
如果 w 很小,z 的大小也会下降,如果 z 是一个大的正数,它会变小,如果是一个大的负数,它会变大,接近 0。当通过激活函数传递 z 时,我们有一个更线性的效果(如下图所示,tanh 曲线在 0 附近更线性)。
双曲正切激活函数的图形,显示了 z 值的减小如何使函数更加线性
这里 g(z)对于 tanh 激活函数大致是线性的。“最佳拟合线”的决策边界将更简单,更接近线性,这将消除训练数据中的过度拟合。
这是吴恩达深度学习专业化课程的一小部分,我觉得非常有用,并想写下来,但课程提供了更多。如果你对学习深度神经网络感兴趣,并希望从基础水平理解所有事情,对所有过程进行彻底的数学论证,并进行编码练习,我强烈建议你完成本课程。
用合成数据改进机器学习中的大规模不平衡数据集
我们将使用合成数据和 SMOTE 中的一些概念来提高欺诈、网络安全或任何极少数类别分类的模型准确性
在机器学习中处理不平衡的数据集是一项艰巨的挑战,可能包括支付欺诈、诊断癌症或疾病,甚至网络安全攻击等主题。所有这些交易的共同点是,在所有交易中,只有很小一部分是真正的欺诈,而这些交易才是我们真正关心的。在本帖中,我们将通过训练一个生成合成数据模型来创建额外的欺诈记录,从而提高流行的 Kaggle 欺诈数据集的准确性。独特的是,该模型将结合来自欺诈性记录及其最近邻居的特征,这些特征被标记为非欺诈性的,但与欺诈性记录足够接近,以至于有点“可疑”。
特征图像 Gretel.ai
我们不平衡的数据集
在这篇文章中,我们选择了 Kaggle 上流行的“信用卡欺诈检测”数据集。该数据集包含 2013 年 9 月欧洲信用卡持有者的标记交易。为了保护用户身份,数据集将敏感特征降维为 27 个浮点列(V1–27)和一个时间列(数据集中此事务和第一个事务之间经过的秒数)。在这篇文章中,我们将使用信用卡欺诈数据集中的前 10k 条记录——点击下面的链接,在 Google 联合实验室中生成下面的图表。
colab.research.google.com](https://colab.research.google.com/github/gretelai/gretel-synthetics/blob/master/examples/research/synthetics_knn_classify_and_visualize.ipynb)
一个极度不平衡的数据集
度量陷阱
让我们看看使用最先进的 ML 分类器检测欺诈记录可以获得什么样的性能。我们首先将数据集分为训练集和测试集。
对我们的默认欺诈数据集进行分类的结果
哇,99.75%的检出率。太棒了,对吧?!也许——查看整体模型准确性只是显示模型在整个集合中的表现有多好,而不是我们在检测欺诈记录方面做得有多好。要了解我们的实际表现,请打印一份混淆矩阵和准确性报告。
从上面我们可以看到,尽管我们的总体准确率为 99.75%,但在我们的测试集中,我们对 43%的欺诈示例进行了错误分类!
用合成数据增加欺诈案例
在本节中,我们将重点关注如何通过使用 gretel-synthetics 生成欺诈记录的更多示例,来提高欺诈记录的模型性能和泛化能力。让我们从我们想要完成的事情开始——我们的目标是生成额外的欺诈记录样本,这将帮助我们的分类器进行归纳,并更好地检测我们测试集中的欺诈记录。
合成少数过采样技术
数据科学社区中实现这一点的一种流行技术被称为 SMOTE(Syn intesticMinorityOversamplingTetechnique),由 Nitesh Chawla 等人在他们 2002 年的论文中描述。SMOTE 的工作方式是从少数类中选择样本,在少数类中找到它们最近的邻居,并在它们之间有效地插入新点。SMOTE 不能合并来自少数类之外的记录的数据,在我们的示例中,这些记录可能包含有用的信息——包括欺诈性的或贴错标签的记录。
Gretel 合成了 SMOTE 的概念
我们的训练集中只有 31 个欺诈数据的例子,这给泛化带来了独特的挑战,因为 gretel-synthetics 利用深度学习技术来学习和生成新的样本,这在传统上需要大量数据才能收敛。打开下面的笔记本,使用 Google Colab 免费生成您自己的合成欺诈数据集。
colab.research.google.com](https://colab.research.google.com/github/gretelai/gretel-synthetics/blob/master/examples/research/synthetics_knn_generate.ipynb)
通过借用 SMOTE 找到欺诈集的最近邻居的方法,并结合来自多数类的几个最近邻居,我们有机会扩展我们的训练集示例,并结合从我们的欺诈类(姑且称之为可疑)记录中获得的一些知识。这种方法不需要对 Gretel Synthetics 做任何更改,我们只是智能地从欺诈+最近正邻居(shady)记录中挑选数据集。我们开始吧!
为了构建我们的合成模型,将使用 Gretel 的新数据框架训练模式默认值和以下几个参数集来优化结果:
epochs: 7
。将 epochs 设置为尽可能低的设置,以平衡创建有效记录,而不会过度适应我们有限的训练集。dp: False
。在这种情况下,不需要考虑运行差分隐私对准确性的影响。gen_lines: 1000
。我们将生成 1000 条记录,以增强我们现有的 31 个正面示例。注意,并不是所有从我们的模型生成的记录都是正面的,因为我们合并了一些负面的例子——但是我们至少应该有几百个新的正面例子。batch_size=32
。将所有 30 行放入单个神经网络模型中,以保留所有字段-字段相关性,代价是更多记录未通过验证。- 训练模型,生成行,并且只保留由合成数据模型创建的“欺诈性”记录
检查我们的合成数据集
现在,让我们来看看我们的合成数据,看看我们是否可以直观地确认我们的合成记录是他们接受培训的欺诈记录的代表。我们的数据集有 30 个维度,因此我们将使用数据科学中的一种称为主成分分析(PCA)的降维技术来以 2D 和 3D 方式可视化数据。
下面我们可以看到我们的训练、合成和测试数据集被压缩成二维。从视觉上看,除了 31 个原始训练示例之外,883 个新的欺诈性合成记录可能对分类器非常有帮助。我们添加了 7 个测试集正面例子(其中我们的默认模型误分类了 3/7,我们希望增强的合成数据将有助于提高检测。
从我们的图表中可以看出,我们合成生成的欺诈示例可能真的很有用!注意在训练负集附近出现的假阳性例子。如果你看到很多这样的例子,试着将NEAREST_NEIGHBOR_COUNT
从 5 减少到 3 以获得更好的结果。让我们把同样的 PCA 可视化 3 维。
查看上面的数据集,似乎用合成数据增强我们的少数欺诈记录集可能对模型性能有很大帮助。我们试试吧!
用合成数据增强我们的训练数据集
现在,我们重新加载训练和测试数据集,但这一次用新生成的合成记录增加了现有的训练数据。
增加 852 个合成例子,使我们的负/正比从 257 降低到 9 倍!
在扩充数据集上训练 XGBoost,针对测试数据集运行模型,并检查混淆矩阵。
借助额外的欺诈示例检测,欺诈检测率提高了 14%!
正如我们所见,训练机器学习模型来准确检测极端少数类是一个严峻的挑战。但是,合成数据创造了一种提高准确性的方法,并有可能提高模型归纳到新数据集的能力,并且可以独特地将整个数据集的特征和相关性合并到合成欺诈示例中。
接下来,试着用你自己的数据运行上面的笔记本。想了解更多关于合成数据的信息吗?点击这里的和这里的查看关于数据科学的文章。
结束语
在 Gretel.ai ,我们对使用合成数据来增强训练集以创建 ML 和 ai 模型的可能性感到非常兴奋,这些模型可以更好地概括未知数据,并减少算法偏差。我们很乐意听到您的使用案例——欢迎在评论、 twitter 或 hi@gretel.ai 中联系我们进行更深入的讨论。关注我们,用合成数据跟上最新趋势!
有兴趣在自己的数据集上进行训练吗? Gretel-synthetics 是免费开源的,你可以通过联合实验室在几秒钟内开始实验。如果你喜欢 gretel-synthetics,请在 GitHub 上给我们一个⭐!
磨练熊猫的知识
三个有用的熊猫方法
Pandas 是 python 中的一个库,通常用于统计分析、数据聚合等等。在这篇文章中,我将讨论熊猫中非常有用的三种方法。我将讨论“read_clipboard()”方法、“query()”方法和“apply()”方法。
我们开始吧!
读取剪贴板的方法
“read_clipboard()”方法提供了一种在数据框中存储复制到剪贴板的文本的简单方法。首先,去雅虎财经搜索道琼斯工业平均指数。接下来,单击历史数据并突出显示前几行,如下所示:
并按“CTRL + c”。最后,我们可以通过执行以下命令将复制的文本存储在数据框中:
import pandas as pd
df = pd.read_clipboard()
print(df.head())
让我们将此数据帧写入“csv ”,因为我们将在后续示例中继续使用此数据。
df.to_csv("dow_jones.csv")
接下来,让我们继续讨论“query()”方法。
查询方法
“query()”方法提供了一种使用字符串表达式选择数据的简单方法。让我们使用上面的相同数据来演示这种方法的使用。
让我们将 csv 文件读入数据帧:
df = pd.read_csv("dow_jones.csv")
让我们将日期列转换成日期时间对象:
df['Date'] = pd.to_datetime(df['Date'])
接下来,让我们创建月和周列:
df['Month'] = df['Date'].dt.month
df['Week'] = df['Date'].dt.week
让我们也放宽对行和列的显示限制:
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)print(df.head())
最后,让我们使用“query()”方法来选择基于周的数据:
df = df.query('Week < 10')
print(df.head())
我们也可以按月份过滤:
df = df.query('Month == 3')
print(df.head())
就此而言,我们也可以基于任何其他列进行筛选。
现在让我们继续讨论“apply()”方法。
该应用方法
我们将讨论的下一个方法是“apply()”方法。假设我们想取“开放”列的平方。要使用“apply()演示这一点,让我们首先从“Open”列中的字符串值中删除逗号,并将字符串值转换为浮点型:
df['Open'] = df['Open'].str.replace(',', '')
df['Open'] = df['Open'].astype(float)
然后,我们可以使用“apply()”方法对列中的值求平方:
df['Open^2'] = df['Open'].apply(lambda x:x**2)
print(df.head())
一个更实际的用例是使用带有自定义函数的 apply 方法。假设我们想从“Open”和“Close*”值计算回报。让我们从“Close*”列的字符串值中删除逗号,并将字符串值转换为浮点数:
df['Close*'] = df['Close*'].str.replace(',', '')
df['Close*'] = df['Close*'].astype(float)
接下来,让我们定义一个用于计算回报的函数:
def calculate_returns(df_in):
returns = (df_in[1] — df_in[0])/(df_in[0])*100
return returns
回报的公式是:
(df['Close*'] — df['Open'])/(df['Open'])*100
现在,让我们使用“apply()”方法和我们的自定义函数来计算将存储在新列中的回报:
df['returns'] = df[['Open', 'Close*']].apply(calculate_returns, axis = 1)
让我们打印前五行:
print(df.head())
结论
总之,在这篇文章中,我们讨论了熊猫的三种方法。我们讨论了“read_clipboard()”方法,该方法允许我们将复制到剪贴板的文本读入数据框。我们还讨论了“query()”方法,它允许我们用字符串表达式选择和过滤数据。最后,我们讨论了“apply()”方法,该方法允许我们用相对简单的代码转换和创建新列。这篇文章的代码可以在 GitHub 上找到。感谢您的阅读!
改进 Plotly 的极坐标条形图
超越默认设置,创建漂亮且可复制的图表
如果您想将更多的注意力吸引到具有更高值的类别上,极坐标条形图是显示分类信息的好方法。它们在《华尔街日报》关于亚马逊 HQ2 候选名单的文章中发挥了巨大作用。但是,即使有了强大的可视化工具,制作这样的图表也需要一些跑腿的工作。
今天我在这里向你们提供将 Plotly 的极坐标条形图转化为视觉上可接受的东西所需的几何图形。到最后,你可以把这些烦人的内务代码扔进一个函数里,再也不去想它了。
这是 Plotly 的教程代码产生的情节。
虽然我知道他们在演示如何用更少的代码行创建 Matplotlib 徽标,但是这个例子对于实际应用程序并没有什么用处。
下面,我将以一种可重现的方式解决我在这个例子中遇到的主要问题。这些问题是:
- 图和背景的切片在数量上是不同的,并且没有对齐。
- 图切片之间的间隙不一致。
- 从例子看不清楚怎么做传奇。
像往常一样,您可以跳到最后查看完整的代码片段。
切片对齐又称角度窗格条
让我们从框定我们的问题开始。我们有一组值,我们希望将每个值映射到一个圆形切片的半径。也许我们也有每个值的标签。
vals = [3, 2, 5, 1, 2]
labels = ["Strength", "Intelligence", "Dexterity", "Wisdom", "Stealth"]
仅从这些值,我们想要确定切片和背景的定位和对齐。
每个切片的半径、位置和宽度分别由 Plotly barpolar 函数的r
、theta
和width
参数决定。注意theta
对应每个切片的中心的角度。
如果我们希望切片之间没有间隔,并且宽度相等,我们可以从原始值的长度推断出这些参数。
num_slices = len(vals)
theta = [(i + 1.5) * 360 / num_slices for i in range(num_slices)]
width = [360 / num_slices for _ in range(num_slices)]
这里“+ 1.5”将确保我们的第一个切片的右边缘在零度。
我喜欢做的另一件事是通过调色板(如粉彩)为我的切片产生一个颜色序列:
color_seq = px.colors.qualitative.Pastel
color_indices = range(0, len(color_seq), len(color_seq) // num_slices)
colors = [color_seq[i] for i in color_indices]
让我们来看看我们的进展:
fig = go.Figure(go.Barpolar(r=vals, theta=theta, width=width, marker_color=colors))
fig.show()
越来越好了!如您所见,切片从零度开始,间隔均匀。但是背景还是完全不对齐。
角窗格条第 2 部分:背景对齐
对齐背景就是调整图形的polar_angularaxis_tickvals
布局选项。我们将推断角度的顺序,类似于我们对切片所做的那样。
angular_tickvals = [(i + 1) * 360 / num_slices for i in range(num_slices)]
fig.update_layout(polar_angularaxis_tickvals=angular_tickvals)fig.show()
很好,现在背景和切片对齐了。你可以用update_layout
调整更多的选项,让剧情更有美感。最后我会给你们留下一些。
痕迹和传说带来的麻烦
现在,如何添加将标签与每个切片相关联的图例?如果你只是使用name
参数,你会遇到一个问题:Plotly 将我们所有的切片视为一个单独的轨迹,它只能与一个单独的名字相关联。
我们如何将每个单独的切片与其自己的名称关联起来?
这并不理想,但目前我发现为每个切片制作一个单独的条形图是最好的方法。我希望存在一种更好的方法,或者至少一种方法将很快被开发出来。
barpolar_plots = [go.Barpolar(r=[r], theta=[t], width=[w], name=n, marker_color=[c])
for r, t, w, n, c in zip(vals, theta, width, labels, colors)]fig = go.Figure(barpolar_plots)angular_tickvals = [(i + 1) * 360 / num_slices for i in range(num_slices)]
fig.update_layout(polar_angularaxis_tickvals=angular_tickvals)fig.show()
将所有东西打包在一起
因为我们只是从原始值中推断出所有的角度参数,所以将所有的工作打包到一个函数中是有意义的。我已经用一些额外的布局选项演示了它的用法。您可以在 Plotly 图参考中找到更多信息。
目前,从 Plotly 的教程极坐标条形图到一些可用的东西需要一点工作。特别是,需要一些角度格来对齐切片和背景。此外,添加图例并没有想象中那么简单。
在这里,我已经完成了进行这种调整所需的步骤,并将它们打包到一个可重用的函数中。希望对你有帮助。
用数据科学改善 SaaS
我们的实习团队如何利用数据帮助一家 SaaS 公司改善其客户拓展和维系战略
作为一名加州大学戴维斯分校 MSBA 分校的学生,我是实习团队的一员,为一家 SaaS 公司从事数据科学项目。这个为期 10 个月的项目致力于帮助他们的销售团队改进客户拓展和保留策略。在我开始深入细节之前,先来看看我将在这个博客上涵盖的内容:
- 什么?那么,SaaS 到底是什么?
- 为什么 —为什么订阅很重要?
- 谁—SaaS 公司和我们加州大学戴维斯分校 MSBA 团队
- 如何 —我们利用他们的数据改善业务的计划
什么是 SaaS?
SaaS 代表软件即服务。这意味着供应商通过互联网向客户提供基于云的服务(即托管/维护组成应用程序的服务器、数据库和代码)。软件咨询,一家 Gartner 公司,软件服务的领导者之一,解释说SaaS 的最大优势之一是它允许客户消费软件而不必担心硬件和基础设施成本。它在数据方面也更加安全,并且允许定制。
使用 SaaS 的另一个重要优势是定价模型。选择 SaaS 的客户通常会支付满足他们所有需求的年费或月费,而不是购买软件许可证、维护和支持费用。
为什么订阅很重要?
客户按月或按年向 SaaS 供应商付款。对于这样的 SaaS 公司来说,获得客户是昂贵的,所以他们必须投资于他们的客户,并等待一段时间才能从最初的成本中收回任何利润。连续创业者和《福布斯 2 号最佳创业者网站》的作者 David Skok,用一个简单的客户现金流的例子说明了这个概念。想象一下,你花了 6000 美元获得了一个每月支付你 500 美元的新客户。您需要两年时间才能从该客户身上看到任何利润:
SaaS 企业最终从他们在获取新客户的初始投资中看到利润
正如我们从上面的图表中所看到的,初始投资在一段时间后显示出积极的结果。换句话说,企业在某个时间点后开始创造正现金流。人越多越好!如果一个客户获得成功,那么获得更多的客户并提高获得率将导致更深的正现金流曲线:
更深的曲线意味着更高的短期支出,但也会导致更高的长期收益
我们已经看到,获得客户是昂贵的,但最终这种投资是值得的。也就是说,在 SaaS 业务中,收入是在很长一段时间内产生的,也就是客户的一生:
“如果客户对服务满意,他们就会长期*,从该客户身上获得的利润就会大大增加。另一方面,如果客户对不满意,他们会很快流失,企业很可能会在获得该客户的投资上赔钱。”—大卫·斯科克***
这都与订阅相关,因为:
- 获得客户是昂贵的
- 让他们开心,让他们的人生价值最大化,将有助于公司收入最大化
我们今天不会关注客户获取部分,而是在 让客户开心 。
谁参与了这个项目?
你已经知道我们是加州大学戴维斯分校 MSBA 实习团队,与 SaaS 的一家公司合作,但是我们与他们公司的谁合作呢?
既然我们关心创造更多的收入,我们与他们的销售&运营团队合作也就不足为奇了。然而,我们也关心如何让客户满意,幸运的是,这家公司有一整个团队致力于这一目标,即客户成功团队**。他们在提供大量有趣的数据方面非常有帮助,这些数据结合了客户使用数据(来自公司的平台)以及客户关系管理(CRM)信息。**
我们将如何利用他们的数据创造商业价值?
好了,现在进入有趣的部分!
我们的实习项目旨在发现客户的关键特征,这些特征表明客户是否准备增加与 SaaS 公司的业务,或者客户是否即将流失。我们将执行客户细分分析和客户流失分析来确定 SaaS 公司扩大收入的方法。这些模型将帮助该公司从传统的基于直觉的决策过渡到基于数据的决策,并重新定义客户健康指标,从而在未来几年改善他们的客户战略。
客户细分分析
我们细分分析的目标是扩大现有客户的业务。为了做到这一点,我们将看看:
- 客户关系管理(CRM)数据:他们成为客户多久了,他们在公司消费了多少,等等。
- 客户使用数据:他们使用产品的频率如何,他们使用最多的是什么样的产品功能,他们的问题(如果有的话)得到解决的速度有多快,等等。
这个想法是要看看不同类型的客户(大鱼,休闲客户,非常活跃的客户等)的典型行为是什么。)为了根据这些指标对客户进行分类,我们计划执行 K 均值聚类。这是一种无监督的学习算法,我们将试图在观察值中找到同质的子群。机器学习专家和 StatQuest 创始人 Josh Starmer ( 他也是一位相当不错的歌手!)在这段视频中非常好地解释了 K-means 聚类。
我们还将利用至关重要的 SaaS 指标,如下所示,这些指标在由 B2B 软件领导者 Joel York 创建的这份有用的备忘单中有详细说明:
- 经常性收入:由于客户是基于订阅的,他们的经常性收入是他们在一段固定时间内支付的费用,通常按月(MRR)、按季度(QRR)或按年(ARR)计算。
- 客户获取成本(每个客户):我们之前讨论过这个问题。这是(在营销和销售活动中)激励某人成为实际付费客户的成本。
- 客户终身价值:客户一生能为公司带来多少价值。这通常是一个固定的时间量,不幸的是,它用一条曲线来表示,最终总是随着时间的推移而减少。不过,这是意料之中的。举例来说,谁会在一生中真正成为 Prime 会员?
- 流失率(或损耗)**:客户在特定时间段内取消订阅的概率。该指标也将用于流失分析。
- 留存率:客户在同一时期停留的概率。因此,它是 1-流失率。
通过使用这些指标以及来自约克的小抄的更多信息,我们希望这些数据能告诉我们 T21 一个故事。
流失分析
流失分析似乎很有前景,我们非常兴奋能够开始这部分的分析!关于这个话题已经做了很多研究,所以有很多资料。一个很酷的例子是 Zuora 的首席数据科学家 Carl Gold 关于用数据对抗流失的博客。我们了解到的一个令人放心的概念是,防止客户流失的方法之一是建立客户成功**团队。戈尔德解释说,“客户成功和支持代表通过确保客户采用某个产品来防止客户流失,并在他们不能接受时给予帮助。”如果您还记得“谁参与了这个项目?”上一节,我们很幸运能与一个客户成功团队合作,该团队正引导我们更好地理解客户行为和业务洞察力。他们不只是向我们扔数据,而是在整个项目中努力与我们合作。
这些是我们准备尝试的一些方法,目的是提高客户保持率:
- 由于客户的异质性,确定动态保留率
- 实施人工神经网络来模拟流失
- 运行 XGBoost 和/或逻辑回归来预测流失
- 查看生存分析,估计客户在特定时间段内流失的可能性
有这么多的工具和方法,我们可以为这个部分,它可以是自己的博客!好消息是我们已经准备好了数据,像这个教程这样的好例子,还有很多时间(期中考试后)来应对这个挑战。
下一步是什么?
按照我们项目中的数据科学工作流程的步骤,我们已经对业务问题有了充分的了解,我们已经修改了数据并准备好进行分析,我们即将开始建模阶段。在整个过程中,我们将与销售&运营和客户成功团队一起检查,以确保我们的分析朝着正确的方向发展。
敬请关注,看看我们发现了哪些有趣的见解!
用 BERT 和表征学习改进句子嵌入
在这个实验中,我们对 BERT 模型进行了微调,以提高它对短文本进行编码的能力。这为下游 NLP 任务产生了更有用的句子嵌入。
虽然一个普通的 BERT 可以用来编码句子,但是用它生成的嵌入并不健壮。正如我们在下面看到的,被模型认为相似的样本通常在词汇上比语义上更相关。输入样本中的小扰动会导致预测相似性的大变化。
平均池 BERT-base 模型编码的句子对之间的相似性
为了改进,我们使用斯坦福自然语言推理数据集,该数据集包含手动标记有蕴涵、矛盾和中性标签的句子对。对于这些句子,我们将学习这样一种表述,即蕴涵对之间的相似性大于矛盾对之间的相似性。
为了评估学习嵌入的质量,我们在 STS 和 SICK-R 数据集上测量 Spearman 等级相关性。
这个实验的计划是:
- 准备 SNLI 和 MNLI 数据集
- 实现数据生成器
- 定义损失
- 构建模型
- 准备评估管道
- 训练模型
这本指南里有什么?
本指南包含在标记数据上构建和训练句子编码器的代码。
需要什么?
对于一个熟悉的读者来说,完成这个指南和训练句子编码器需要大约 90 分钟。代码用 tensorflow==1.15 测试。
好吧,给我看看代码。
这个实验的代码可以在这里获得。这一次,来自先前实验的大部分代码被重用。我建议先去看看。
独立版本可以在库中找到。
步骤 1:设置
我们从下载 SNLI 、 MNLI 、 STS 和 SICK 数据集以及预训练的英语 BERT 模型开始。
为 SNLI jsonl 格式定义一个 loader 函数。
为了更方便地处理数据集,我们稍微重新安排了一下。对于每个唯一的锚,我们创建一个 ID 和一个包含锚、蕴涵和矛盾样本的条目。每类缺少至少一个样本的锚被过滤掉。
单个条目如下所示
{
'anchor': ["No, don't answer."],
'contradiction': ['Please respond.'],
'entailment': ["Don't respond. ", "Don't say a word. "]
}
最后,加载 SNLI 和 MNLI 数据集。
步骤 2:数据生成器
为了训练模型,我们将对三元组进行采样,由锚、正样本和负样本组成。为了处理复杂的批处理生成逻辑,我们使用以下代码:
高层逻辑包含在 generate_batch 方法中。
- 批量锚点 id 是从所有可用 id 中随机选择的。
- 锚样本从其 id 的锚样本中检索。
- 阳性样本从其 id 的蕴涵样本中检索。
- 阴性样本是从矛盾样本中检索出它们的 id。
这些可以被认为是硬否定样本,因为它们通常在语义上与它们的锚相似。为了减少过度拟合,我们将它们与从其他随机 ID 检索的随机阴性样本混合。
第三步:损失函数
我们可以将学习句子相似性度量的问题框架化为排序问题。假设我们有一个由 kk转述的句子对 x 和 y 组成的语料库,并且想要学习一个函数来估计 y 是否是 x 的转述**。**对于某些 x 我们有单个阳性样本 y 和 k-1 阴性样本 y_k 。这个概率分布可以写成:
使用评分函数估计 P(x,y) 的联合概率,S:
在训练期间,对数据集中的所有 k-1 阴性样本求和是不可行的。相反,我们通过从我们的语料库中为每一批抽取 K 个响应并使用它们作为负样本来近似 P(x) 。我们得到:
我们将最小化数据的负对数概率。所以,对于一批 K 个三胞胎的损失我们可以写下:
注 :以上表达式称为 Softmax-Loss。
在本实验中,内积用作相似性函数 S 。计算最后括号中表达式的代码如下
第四步:模型
首先,我们导入之前实验中的微调代码,并构建 BERT 模块。
该模型对于锚、阳性和阴性样本有三个输入。具有平均池操作的 BERT 层被用作共享文本编码器。文本预处理由编码器层处理。对编码的句子计算 Softmax 损失。
为了方便起见,创建了 3 个模型: enc_model 用于编码句子, sim_model 用于计算句子对之间的相似度, trn_model 用于训练。所有型号都使用共享重量。
步骤 5:评估渠道
自然语言编码器通常通过嵌入标记的句子对,测量它们之间的某种相似性,然后计算相似性与人类判断的相关性来评估。
我们使用 STS 2012–2016 和 SICK 2014 数据集来评估我们的模型。对于测试集中的所有句子对,我们计算余弦相似度。我们报告了带有人工标注标签的 Pearson 等级相关性。
下面的回调处理评估过程,并在每次达到新的最佳结果时将提供的保存模型保存到保存路径。
第六步:培训
我们训练 10 个时期的模型,每个时期有 256 个批次。每批由 256 个三胞胎组成。我们在每个时期的开始执行评估。
trn_model.fit_generator(tr_gen._generator, validation_data=ts_gen._generator, steps_per_epoch=256, validation_steps=32, epochs=5, callbacks=callbacks)*** New best: STS_spearman_r = 0.5426
*** New best: STS_pearson_r = 0.5481
*** New best: SICK_spearman_r = 0.5799
*** New best: SICK_pearson_r = 0.6069
Epoch 1/10
255/256 [============================>.] - ETA: 1s - loss: 0.6858
256/256 [==============================] - 535s 2s/step - loss: 0.6844 - val_loss: 0.4366
*** New best: STS_spearman_r = 0.7186
*** New best: STS_pearson_r = 0.7367
*** New best: SICK_spearman_r = 0.7258
*** New best: SICK_pearson_r = 0.8098
Epoch 2/10
255/256 [============================>.] - ETA: 1s - loss: 0.3950
256/256 [==============================] - 524s 2s/step - loss: 0.3950 - val_loss: 0.3700
*** New best: STS_spearman_r = 0.7337
*** New best: STS_pearson_r = 0.7495
*** New best: SICK_spearman_r = 0.7444
*** New best: SICK_pearson_r = 0.8216
...
Epoch 9/10
255/256 [============================>.] - ETA: 1s - loss: 0.2481
256/256 [==============================] - 524s 2s/step - loss: 0.2481 - val_loss: 0.2631
*** New best: STS_spearman_r = 0.7536
*** New best: STS_pearson_r = 0.7638
*** New best: SICK_spearman_r = 0.7623
*** New best: SICK_pearson_r = 0.8316
Epoch 10/10
255/256 [============================>.] - ETA: 1s - loss: 0.2381
256/256 [==============================] - 525s 2s/step - loss: 0.2383 - val_loss: 0.2492
*** New best: STS_spearman_r = 0.7547
*** New best: STS_pearson_r = 0.7648
*** New best: SICK_spearman_r = 0.7628
*** New best: SICK_pearson_r = 0.8325
作为参考,我们可以查看来自 Sentence-BERT 论文的评估结果,在该论文中,作者对 STS 和 SICK 任务上的几个预训练句子嵌入系统进行了评估。
我们使用普通平均池 BERT 模型的结果与公布的指标一致,在 SICK-R.
上获得 57.99 Spearman 等级相关分数,在 10 个时期后,最佳 Colab 模型获得 76.94 ,与通用句子编码器的最佳结果 76.69 相当。
Spearman 对句子表述的余弦相似性和各种文本相似性任务的黄金标签之间的相关性进行排序。(摘自句子-伯特:使用暹罗伯特网络的句子嵌入)
由于在一个批次中的所有样本之间共享负面示例,因此使用较大的 batch_size 进行微调往往会将指标提高到某个程度。如果你的 GPU 能够处理的话,解冻更多的编码器层也会有所帮助。
一旦训练完成,我们就可以通过编码测试三元组并并排检查预测的相似性来比较基础模型和训练模型。一些例子:
结论
上面我们提出了一种使用标记句子对来改进句子嵌入的方法。
通过显式地训练该模型来根据它们的语义关系对句子对进行编码,我们能够学习更有效和更健壮的句子表示。
自动和人工评估都证明了相对于基线句子表示模型的实质性改进。
本系列中的其他指南
利用仪表板提高利益相关者的认同度
数据仪表板是向利益相关者传达分析故事的一个宝贵工具
在 Manufacturing Analytic,我们发现使用交互式仪表板共享我们的运营评估使客户成为发现过程的一部分。仪表板成为持续讨论的推动者——客户可以提问,我们可以即时提供答案。
仪表板原型将高利润和低利润产品与过程变量相关联
我们的方法从我们如何看待生产过程开始:业务不是销售产品;在线出售时间,就好像该公司出租其生产资产一样。
企业应该问的是:
我应该优先考虑我生产线上的什么产品,以提高生产线的每小时盈利能力?
我生产的每件产品的利润率或 EBITDA 率是多少,我如何将其与关键流程变量联系起来?
我们通常发现,误导的先入之见决定了公司优先考虑哪些产品。这些假设是由于将业务团队和工厂运营者分开的组织筒仓。虽然业务团队可能知道与浪费材料、在制品和转换损失相关的实际成本,但他们不关心产品线面临的问题以及这些问题如何扰乱周期时间。将来自工厂车间的知识与业务部门的知识相结合,以提供准确的分析来提高生产率和优先级,这一点至关重要。
这种筒仓效应的一个原因是,制造业中的许多人对最新数据方法的吸收一直很慢。由于缺乏数字基础设施,他们无法贯穿整个流程。一旦渗透到组织中的零散数据集被组合起来,资金模式就变得清晰了。(即带有流程或周期时间数据的产品利润)。
举一个简单的例子,按照 EBITDA 对每种产品进行排序,然后绘制一个 EBITDA/hr 的气泡图,气泡大小与体积成比例,通常会得到以下结果:高和低 EBITDA 尾部以高体积产品为标志,而净零产品的长平台以低体积产品为标志。不足为奇的是,新产品或实验性产品的产量不足以推动利润增长。然而,在某些情况下,低产量产品具有非常高的 EBITDA/hr。如果这些产品具有适当的产量,它们可能会为组织实现更高的回报。如果我们只考虑息税折旧及摊销前利润(EBITDA ),我们会失去这样的洞察力,即我们应该扩展到几个关键的、低产量的产品,因为它们的生产速度更快。
气泡代表一种独特产品的许多生产周期。泡沫从左到右按平均 EBITDA 递减的顺序排列。气泡尺寸与体积成比例,y 轴值为 EBITDA/hr。几种关键的低体积产品比高体积产品提供更高的 EBITDA/hr 比率。
在我们的一次客户分析中,我们发现了他们流程的关键组成部分和产品利润率之间的相关性。在化学组成、颜色、形状、处理和其他因素的数百种组合中,我们能够确定哪些是赢家,哪些是输家。通过将这些分组合并到一个控制面板中,我们能够即时提出问题:如果我们用这个组合替换这个组合,可能会对我们的利润产生影响,但它是否仍然符合最终客户的需求——不会吗?—嗯,这个组合怎么样?诸如此类。它简化了客户会议,使我们能够围绕他们流程中的哪些部分快速制定可行的计划,从而大幅提高他们的盈利能力。
Violin 在左侧绘制了特定产品的等级——逐行排序,即递减的平均 EBITDA。右侧的旭日图显示,对于 E28 系列,该产品的最低 EBITDA 版本与 TR 颜色组中的产品隔离。
智能分析仪表盘是讲述分析故事不可或缺的工具。当组织内的涉众试图向其他业务部门阐明计划的优先级时,他们可以很容易地返回到数据。让算法挑选出哪些过程变量是重要的是一回事。如果它随后将这种洞察力转化为能够以直观的方式深入和总结主题的指标和图表,那就是另一回事了。创建一条所有组织部门都能使用同一种语言的道路是不可或缺的。
概括地说,我们从制造业在数字化和数据科学吸收方面进展缓慢这一事实开始,但他们正开始快速加快步伐。在 MFG Analytic,我们希望我们的客户处于这一潮流的最前沿。您的数字化之旅始于分析,始于充分利用当今组织中现有的数据集。在花大价钱“感知”工厂里的每一个泵、水箱和热交换器之前,使用已经有的东西。找出您所知道的,并让您的下一个数字化步骤成为一个明智的步骤—一个由数据支持的步骤。
提高循环一致对抗网络中损失函数的效率
CycleGAN 是一种涉及图像到图像翻译模型的自动训练的技术,不需要成对的例子。我们先来看结果。
基于循环一致对抗网络的马到斑马翻译
在这篇文章中,你会发现一些关于生成对抗网络、CNN、CycleGAN 技术的小知识。现在让我们从这个概念背后的一些基本信息开始:生成性对抗网络。生成对抗网络(GANs)是一类用于无监督机器学习的神经网络。发生器和鉴别器分开工作,互为对手
生成对抗网络
生成对抗网络(GAN)是神经网络中的一种模型,它在机器学习领域提供了很多潜力。在 GAN 中有两个神经网络:第一个是生成网络,第二个是鉴别网络。所以这个项目背后的主要概念是生成性对抗网络。甘是关于创造的东西,这是很难比较的另一个深度学习领域。GAN 的主要重点是从零开始生成数据。GAN 的一个例子是,从马生成斑马。正如我们所见,早期的 GAN 由两个网络组成,即发生器和鉴别器。我们来看图像。
了解 GAN(资料来源:Suransh Chopra 著《CycleGANs 简介》)
CycleGAN 是一种使用生成对抗网络或 GAN 模型架构来处理准备图像到图像翻译模型的方法。
现在,在我们跳到 CycleGAN 之前,我们需要了解 CNN。
卷积神经网络
CNN 如何识别图像(来源:Jason Brownlee,“深度学习的 Adam 优化算法的温和介绍”)
CNN 主要用于图像分类或识别。CNN 使功能更加高效,减少了参数。CNN 接受像素值作为网络的输入。用于特征提取的隐藏层和最后完全连接的层识别图像属于哪一类?CNN 有 4 层。卷积层、ReLu 层(激活函数)、池层和全连接层。
卷积层使用图像上的滤波器矩阵或图像上的移位滤波器矩阵,并获得卷积的特征图。
下一层是 ReLu 层。它将所有负像素转换为零并运行,但在 CycleGAN 中,由于负值,我们使用了 LeakyReLu。输出被称为校正特征图。下一层是池层。合并层降低了校正后的特征图的维度,这意味着我们必须从图像中选择最大像素。然后将汇集的特征图转换成长的连续 LV。这整个过程叫拍马屁。谄媚地连接着一个完全连接的图层来对图像进行分类。
循环 GAN
该模型包含两个函数 G: X -> Y 和 F: Y -> X,其中 X 是源域,Y 是目标域。生成器 X2Y 将马转换为斑马,Y2X 将斑马转换为马。CycleGAN 背后的关键思想是,它们允许你将模型指向两个不成对的图像集合。例如,一个图像集合,组 A 是未来的斑马,而另一个集合 B 是马。所以 Cycle-GAN 模型可以计算出如何解释不成对的图片。
这里的主要部分是循环一致性损失,例如,如果我们的输入图像 A 来自域 X,通过生成器 G 转换为目标图像或域 Y 的输出图像 B,然后域 Y 的图像 B 通过生成器 f 转换回域 X,因此这两个图像之间的差异称为循环一致性损失。
循环损耗(资料来源:Mohan Nikam“改善循环-GAN”)
发电机有三个部分:
I .编码器(提取特征):作为输入,卷积网络拍摄一张图片,我们在输入图片上移动以提取特征的滤波器窗口的大小,以及选择每次前进后我们将移动滤波器窗口的量的步长。
二。Transformer(添加先前结果的余数):因此,为此,我们利用了 9 层 resnet 块来如下改进结果:Resnet 块是包括两个卷积层的神经网络层,其中信息的累积被添加到产出。
三。解码器(解码结果):解码步骤是步骤 1 的特定逆步骤,我们将从元素向量再次返回低级特征。
CycleGAN 实施的步骤
周期目标函数、对抗性损失和周期一致性损失。
对抗性损失
现在,我们可以通过将这些损失项放在一起,并用超参数λ对循环一致性损失进行加权,来创建完整的目标函数。我们建议设置λ = 10
为了测量损失,我们像在大多数深度学习中一样使用交叉熵:p log (q)。
对于生成的图像,我们反转标签(即一减一标签)。所以目标变成了:
识别真实图像和生成的图像
另一方面,基于等式 1,优化检查发生器图像的 D,目标函数希望模型以最高可能的方式生成图像来欺骗鉴别器。
愚弄鉴别者
g 想最小化 V,而 D 想最大化 V。
通过提升其随机梯度来更新鉴别器:
通过降低其随机梯度来更新生成器:
这些算法实际上是由 Ian Goodfellow 使用的,但大多数深度学习研究人员使用 adam optimizer 来获得更好、更高效的结果,因为这种算法的结果与最佳结果相差很远。我使用了亚当优化的最佳效果。
发电机损耗:
发电机损耗是这两项之和:
G _ loss _ G = G _ loss _ G _ disc+G _ loss _ G _ cycle
因为循环损耗非常重要,所以我们想增加它的影响。
我们为这个乘数使用了一个 L1λ常数(在论文中使用了值 10)。
现在发电机损耗看起来像:
G _ loss _ G = G _ loss _ G _ disc+L1 _λ G _ loss _ G _ cycle*
g _ loss _ F = g _ loss _ F _ disc+L1 _λ g _ loss _ F _ cycle*
鉴频器损耗:
鉴别器需要做出两个决定:
1.真实图像应标记为真实(推荐值应尽可能接近 1)
2.鉴别器应该能够识别生成的图像,从而预测假图像为 0。
减少模型振荡
- 为了防止模型从一次迭代到另一次迭代发生剧烈变化,鉴别器被输入生成图像的历史,而不仅仅是由最新版本的生成器生成的图像。
- 此外,我们包含了过去 100 张图像的历史来训练鉴别器,为什么我们要做这些事情,因为生成器和鉴别器都可能过度拟合,导致模式崩溃
- 为此,我们保存了 100 张最近生成的图像。基于这种技术,我们减少了模型振荡以及模型过拟合。
亚当优化器
Adam 代表*自适应矩估计。*在训练的前半部分,学习率被设置为 0.0002,然后在剩余的迭代中线性降低到零。
就像最初的 GAN 实现一样,我们将创建单独的优化器,这些优化器只能更新网络的某些部分。我们希望两个网络都变得更好。
优化器是最重要的,因为在每个时期后,学习率会改变,偏差和权重也会改变,我们会获得最佳结果。大多数研究人员使用随机梯度,但随机是恒定的学习率算法,这就是为什么学习率在每个时期后不会改变。利用亚当优化函数和 L1 损失函数达到了较好的效果。 批量大小被设置为 1,这就是为什么我们称之为实例规范化,而不是批量规范化。
我们将在这里做同样的事情,只是现在我们有 3 个网络要优化,因此我们需要 3 个优化器:
- G_xy 和 G_yx 变量将作为生成器进行优化,而 D_x 和 D_y 应该更新两个不同的鉴别器。
FCN-不同方法的得分,在城市景观标签上进行评估
这是我在表 1 和表 2 中实现的结果,我们考虑的是完全损失的清除。消除 GAN 损失会极大地破坏结果,消除循环一致性损失也是如此。我们沿着这些思路假设这两个术语是我们结果的基础。
我们同样评估我们的策略,仅在一个方向上的周期损失:GAN +正向周期损失或 GAN +反向周期损失。
消融研究:FCN——我们方法的不同变体的得分,在城市风景照片→标签上评估
此外,我们包含了最近 100 张图像的历史记录来训练鉴别器,为什么我们要做这些事情,因为生成器和鉴别器都可能过度拟合自己(例如:普京骑在马上),导致模式崩溃。使用这种鉴别器不会有助于击败发生器。它需要击败最后的 100 个生成器,才能得到最优解。
结果(Pytorch)
故障案例(Pytorch)
有时生成器崩溃,这就是为什么产生有限的样本数据
摘要
在本文中,你发现了在循环一致的敌对网络中提高损失函数的效率。具体来说,您学到了:
执行 CycleGAN 的确切方法,GAN、CNN、随机和 Adma 优化器、发电机损耗、鉴别器损耗的知识,减少模型振荡。
如果您想了解更多的实现细节,可以参考一些非常开放的用法。
感谢阅读!
随时给我发信息。
Twitter:aamirjarda
LinkedIn:aamirjarda
insta gram:aamirjarda
你有什么问题吗?在下面的评论中提出你的问题,我会尽力回答。
提高机器学习模型的性能
模拟性能的不同方法
克里斯·利维拉尼在 Unsplash 上的照片
在之前的帖子中,我们探索并分析了一个客户流失数据集。然后,我们建立了一个机器学习模型来预测客户流失,在训练集和测试集上的准确率分别达到了%91.7 和%90.7。
在本帖中,我们将致力于:
- 如何提高准确率(正负类都有)
- 如何将模型的焦点更多地向正面类倾斜
值得注意的是,提高模型性能的最佳方法通常是收集更多的数据。然而,这并不总是一个可行的选择。
让我们回到我们的话题。
我们构建的模型是一个带有超参数的随机森林分类器:
- max_depth = 10(森林中一棵树的最大深度)
- n_estimators = 200(森林中的树木数量)
该模型的性能如下:
第一和第二矩阵分别是训练集和测试集上的混淆矩阵。混淆矩阵通过显示每个类别的正确和不正确(即真或假)预测,比分类准确性更深入。
让我们首先关注准确性,然后深入研究混淆矩阵和相关指标。
提高模型性能的一种方法是搜索最佳超参数。调整超参数就像调整模型一样。随机森林有许多超参数,但最重要的是树的数量(n_estimators)和单棵树的最大深度(max_depth)。
我们将使用 scikit-learn 的 GridSearchCV 类。它允许从一系列值中选择最佳参数。让我们首先创建一个字典,其中包含一组 n_estimators 和 max_depth 的值。我将选择我们之前使用的值。
parameters = {'max_depth':[8,10,12,14],
'n_estimators':[175,200,225,250]}
可以尝试更多的值或者超参数。没有一个正确的答案。我们现在可以将这个字典和一个估计器一起传递给 GridSearchCV 对象。
rf = RandomForestClassifier()gridsearch = GridSearchCV(rf, param_grid=parameters, cv=5)gridsearch.fit(X_train_selected, y_train)
cv 参数正在进行交叉验证。
我们已经训练了 GridSearchCV 对象。让我们看看最佳参数是什么:
gridsearch.best_params_
{'max_depth': 12, 'n_estimators': 225}
我用大约 12 和 225 的值再次运行了 GridSearchCV。最好的参数是 13 和 235。
让我们看看这些新的超参数值的混淆矩阵和准确性。
rf = RandomForestClassifier(max_depth=13, n_estimators=235)
rf.fit(X_train_selected, y_train)y_pred = rf.predict(X_train_selected)
cm_train = confusion_matrix(y_train, y_pred)
print(cm_train)y_test_pred = rf.predict(X_test_selected)
cm_test = confusion_matrix(y_test, y_test_pred)
print(cm_test)train_acc = (cm_train[0][0] + cm_train[1][1]) / cm_train.sum()
test_acc = (cm_test[0][0] + cm_test[1][1]) / cm_test.sum()print(f'Train accuracy is {train_acc}. Test accuracy is {test_acc}')
训练集的准确率提高了,但我们在测试集上没有取得任何成绩。如果我们可以收集更多的数据,这通常是提高准确性的最佳方式,测试准确性也可能随着这些新参数而提高。
如果你还记得之前的帖子,我们已经删除了 4 个与其他相比信息量较少的特性。在某些情况下,消除信息量较少或不相关的要素是一种很好的做法,这样可以避免给模型带来不必要的计算负担。然而,这些被消除的特征可能会稍微提高精度,所以这归结为性能增强和计算负担之间的决定。
我摆弄了一下超参数值,并用所有的特性进行了训练。结果如下:
我们已经实现了大约%1 的测试精度增加,这也是在过度拟合方面的改进。
我们的任务是预测客户是否会流失(即不再是客户)。因此,重点应该放在积极的一类(1)上。我们必须正确预测所有的正类(Exited=1)。对于负类(Exited = 0),我们可以承受一些错误的预测。
我们需要进一步提高精确度。先说混淆矩阵。
(图片由作者提供)
- 真阳性(TP) :预测阳性类别为阳性(ok)
- 假阳性(FP) :将阴性类别预测为阳性(不正常)
- 假阴性(FN) :将阳性类别预测为阴性(不正常)
- 真阴性(TN) :预测阴性类为阴性(ok)
因为我们希望尽可能预测客户流失,所以我们的目标是最大化 TP,最小化 FN。
当我们预测“客户不会流失(0)”但在实际情况下,客户会流失时,就会发生 FN。
是时候引入两个指标了,即精度和召回。
Precision 衡量当预测为正时,我们的模型有多好。
精度的焦点是正面预测。它表明有多少积极的预测是正确的。
回忆测量我们的模型在正确预测正类方面有多好。
召回的重点是实际正班。它表示模型能够正确预测的阳性类别的数量。
我们希望预测所有积极的类,因此 recall 是我们任务的合适度量。最大化 TP 和/或最小化 FN 将增加召回值。
以下是训练集和测试集的混淆矩阵:
我们需要最小化标有黄色的值,这些值是假阴性(FN)。
实现这一点的一个方法是告诉模型“正类(1)比负类(0)更重要”。使用我们的随机森林分类器,可以通过 class_weight 参数来实现。
rf = RandomForestClassifier(max_depth=12, n_estimators=245,
class_weight={0:1, 1:3})rf.fit(X_train_transformed, y_train)
我们传递了一个包含每个类的权重的字典。我设定为 3 比 1 作为例子。
以下是新的混淆矩阵:
假阳性的数量大大减少。积极类上的错误预测比消极类上的错误预测受到更多惩罚。因此,该模型倾向于在尽可能低的正类上犯错误。
这种方法有一个缺点。虽然在预测正类方面越来越好,但整体准确性可能会变得更差。让我们检查一下。
测试集的准确率从%91.21 下降到%89.57。因此,这归结为一个商业决策。如果我们只想预测所有的正类,不关心整体的准确率,可以进一步增加正类的权重。
例如,当我们将权重指定为 10 比 1 时,这是混淆矩阵和准确度:
我们还可以尝试不同的算法,看看性能是否会变得更好。然而,更复杂的模型需要更多的数据。他们渴望数据。梯度增强决策树(GBDT)及其变体(如 XGBOOST、LightGBM)也可以尝试,但我认为性能只会略有提高。
当考虑到任务的复杂性和数据量时,我认为随机森林会做得很好。
感谢您的阅读。如果您有任何反馈,请告诉我。
使用 Bagging 提高机器学习模型的性能
理解 Bootstrap Aggregation (Bagging)集成学习的工作原理,并使用 sklearn 库实现一个随机森林 Bagging 模型。
在 Unsplash 上由 Carlos Muza 拍摄的照片
机器学习模型的性能告诉我们,对于看不见的数据点,模型的表现如何。有各种各样的策略和技巧来提高 ML 模型的性能,其中一些是:
- ML 模型的微调超参数
- 使用集成学习。
什么是集成学习?
集成学习是一种组合多个 ML 模型以形成单个模型的技术。也被称为基础模型或弱学习器的多个 ML 模型可以是不同的算法,也可以是超参数有变化的相同算法。
像分类任务一样,多个 ML 模型可以是逻辑回归、朴素贝叶斯、决策树、SVM 等。对于回归任务,多个 ML 模型可以是线性回归、Lasso 回归、决策树回归等。
集成学习结合了基本模型的优点,以形成具有改进性能的单个鲁棒模型。各种类型的集成学习技术有:
- 引导聚集
- 助推
- 投票
- 级联
- 堆垛
还有很多。本文将介绍 Bagging 集成技术的工作和实现。
Bagging(引导聚合)概述:
Bagging ensemble 技术也称为 Bootstrap Aggregation,它使用随机化来提高性能。在 bagging 中,我们使用在部分数据集上训练的基础模型。在 bagging 中,我们使用弱学习者(或基础模型)模型作为积木,通过组合其中的几个来设计复杂的模型。
大多数时候,这些基本模型表现不佳,因为它们要么过拟合,要么过拟合。模型的过拟合或欠拟合是由偏差-方差权衡决定的。
什么是偏差-方差权衡?[1]
模型的总体误差取决于模型的偏差和方差,遵循以下等式:
对于一个好的稳健模型,模型的误差尽可能小。为了最小化误差,偏差和方差需要最小,并且不可约误差保持恒定。下面的误差与模型灵活性(自由度)图描述了偏差和方差以及测试和训练误差的变化:
来源,偏差-方差权衡误差图
从上图分析:
- 当模型处于训练的初始阶段时,训练和测试误差都非常高。
- 当模型训练足够的时候,训练误差很低,测试误差很高。
- 训练和测试误差高的阶段是欠拟合阶段。
- 训练误差低而测试误差高的阶段是过拟合阶段。
- 在训练和测试误差之间存在平衡的阶段是最合适的。
- 欠拟合模型具有低方差和高偏差。
- 过度拟合模型具有高方差和低偏差。
Bagging Ensemble 技术可用于具有低偏差和高方差的基础模型。Bagging ensemble 使用数据集的随机化(将在本文稍后讨论)来减少基础模型的方差,从而保持较低的偏差。
装袋工作[1]:
现在很清楚,装袋减少了基础模型的方差,保持了较低的偏差。通过结合 bootstrap 抽样和聚集策略来减少基本模型的方差。装袋的整个工作分为三个阶段:
- 自助抽样
- 基础建模
- 聚合
下图描述了具有 n 行的样本数据集 D 的所有三个步骤:
(图片由作者提供),打包的 3 个步骤——引导取样、建模、汇总
自举采样:
引导样本是一个较小的样本,是初始数据集的子集。引导样本是通过替换采样从初始数据集创建的。
假设一个数据集有 n 行和 f 个特征,我们做一个引导取样,它指的是取样替换成 k 个不同的较小数据集,每个数据集大小为 m,具有相同的 f 个特征。D_i 形成的每个更小的数据集看到数据集的子集。在下图中,形状为(n,f)的初始数据集 D 被采样为形状为(m,f)的 k 个数据集,其中 m < n
(图片由作者提供),数据集的自助抽样
下图描述了如何引导样本。具有 10 行的数据集 D 被采样并替换成 k 个更小的数据集,每个数据集具有 5 行。上图中 n=10,m=5。
观察到通过自举形成的每个数据集仅看到原始数据集的一部分,并且所有数据集彼此独立。
(图片由作者提供),10 行样本数据集的 Bootstrap 采样。
这是 bagging 集成技术的第一步,其中 k 个较小的数据集通过彼此独立的引导来创建。
建模:
建模是装袋的第二步。在通过自举创建了 k 个较小的数据集之后,使用 ML 算法来训练 k 个数据集中的每一个。用于训练 k 数据集的算法在超参数改变或不改变的情况下可以是相同的,或者可以使用不同的算法。
举个例子,
- 决策树算法可以用作基础模型,并改变超参数,如“深度”。
- 可以使用不同算法的组合,例如 SVM、朴素贝叶斯、逻辑回归。
在每个引导数据集上训练的模型被称为基础模型或弱学习器。下图描述了独立模型的每个数据集的训练:
(图片由作者提供),引导数据集的建模
聚合:
通过组合 k 个不同的基础模型来创建最终强大的健壮模型。因为基本模型是在引导样本上训练的,所以每个模型可能有不同的预测。根据问题陈述的不同,聚合技术也不同。
- 对于回归问题:聚合可以取每个基础模型预测的平均值。
Notation,
**prediction:** Final Output of bagging ensemble
**k:** number of base models
**pred_i:** prediction of ith base model
- 对于一个分类问题:聚集可以使用多数投票,具有最多投票的类可以被声明为最终预测。
Notation,
**prediction:** Final Output of bagging ensemble
**pred_i:** prediction target class of ith base model
**1,2,3...,c:** c different target class
**C:** Target Class having maximum vote
(图片由作者提供),k 基础模型的聚合
随机森林:
随机森林是 bagging 集成学习的一个例子。在随机森林算法中,基学习器只是决策树。随机森林使用装袋和列抽样形成稳健模型。
换句话说,RF 使用 bagging 集成学习的实现,除此之外,它在自举步骤期间使用替换进行列采样。引导第一步的变化如下所示:
(图片由作者提供),自举采样和列采样
初始数据集 D 的形状是( n 行, f 特征),在 bootstrap 采样+ column 采样的情况下,形成的 k 基数据集是行采样和列采样。基础数据集 D_i 的形状是( m 行, d 特征)其中 n > m 和 f > d 。
随机森林的实现:
为来自 Kaggle 的 Pima Indians 糖尿病数据集实施决策树和随机森林分类器。
(作者代码),决策树和随机森林分类器的实现
决策树分类器的观察:
决策树分类器针对 X_train 进行训练(第 16–19 行),DT 分类器模型的性能(第 21–23 行)在 X_test 数据上进行测试。对 DT 模型性能的观察是:
随机森林分类器的观察:
k=50 的随机森林分类器针对 X_train 进行训练(第 25–28 行),RF 分类器模型的性能(第 30–32 行)在 X_test 数据上进行测试。对 RF 模型性能的观察是:
性能改善观察:
- 模型的准确率从 71%(对于 DT 分类器)提高到 75%(对于 RF 分类器)。
- 从两个混淆矩阵中可以观察到 FN 和 FP 值减少以及 TP 和 FN 值增加的变化。
参考文献:
[1](2019 . 4 . 23),系综方法:装袋、升压、堆叠:https://towardsdatascience . com/Ensemble-methods-bagging-boosting-and-stacking-c 9214 a 10 a 205
感谢您的阅读!
利用 Keras 中超参数调整提高 ResNet50 涂鸦图像分类器的性能
来自数据集的涂鸦图像
介绍
在世界各地的绝大多数城市地区,街道周围都有故意破坏的迹象。最常见的破坏形式之一是涂鸦或标记,这也是众所周知的。在世界上任何一个城市的墙上、高速公路上、火车上,都可以发现涂鸦。它们可以是在公共表面上绘制或刮擦的不适当的图像、颜色、字母,这是所有执法机构共有的问题。
涂鸦破坏行为会影响社区,对旅游业和财产价值造成负面影响。它还会导致零售额下降,并加剧公民的恐惧;这最终耗尽了用于预防措施的税收。为了更好地协助执法部门减少破坏行为,涂鸦图像分类器可以帮助他们完美地识别街道上的涂鸦图像。
本文的重点是通过调整参数,如学习速率、批量大小和识别最佳冻结层,使用 ResNet50 神经网络来提高 Graffiti 分类器的性能。
为什么要调学习率、批量、冻层?
学习率是随机梯度下降反向传播中的步长。学习率将告诉我们在反向传播中需要改变多少权重,以便我们的模型预测得更好。对于较大的学习率,训练将是多样化的,并且模型可能表现得更差。因此,选择最佳的学习率对于模型的更好性能至关重要。
批次大小是用于训练模型以更新模型参数的样本数。也可以用单幅图像更新参数,但是这个过程噪声很大,而且损耗会很高。所以我们选择批量。一次用一批图像训练网络,可以更准确地估计误差梯度。
对于神经网络的前几层,网络学习图像的边缘(水平线和垂直线)和形状。在特定层,网络能够区分图像是否是涂鸦。因此,如果我们能够冻结该层并训练其余层,将会提高模型的性能。
用于训练/测试模型的图像总数
共有 2256 张图片;1127 个涂鸦,1129 个无涂鸦图片。总图像被分成 0.8:0.1:0.1 的比例作为训练、测试和验证集。要将图像分割成训练、测试和验证文件夹,可以使用“split _ folders”python 包。
注意:所有模型都是使用 Keras functional API 在 Google Colab (GPU)中运行的。
数据集和代码文件的链接:【https://github.com/ShailuSurya/GraffitiImageClassifier
迁移学习模型
ResNet50 针对 Imagenet 类的一百多万张图像进行了训练。因此,用超过 2000 张图像训练整个网络,对于一台带 CPU 的普通计算机来说是不可能的。因此,通过迁移学习,可以使用预先训练好的网络权重来训练顶层。
通过迁移学习的神经网络(使用 draw.io 创建)
我在输出中添加的图层是一个全局平均池图层、一个完全连接图层、一个下降图层和一个用于输出图层的 sigmoid 函数。如果对输出不满意,可以使用正则化或超参数技术来提高模型的性能。
我使用数据扩充(shear_range=0.2,horizontal flip=True,zoom_range=0.2)和丢失(rate=0.3)以及早期停止(耐心=10)作为正则化技术来提高模型的性能。
注意:在这里,我着重于涂鸦图像比无涂鸦图像更完美的预测。因此,我将检查所有模型的假阴性率;最终优选的模型将是具有高测试准确度和低假阴性率的模型。
超参数调整以提高性能
- 学习率
该网络以各种学习率进行调整,例如 0.1、0.01、0.001、0.0001、0.00001。选择一个最佳的学习速度非常重要。如果我们选择一个更高的学习率,通过选择最大损失函数,模型可以表现得更差。
- 对于学习率 0.1 和 0.01,训练准确率达到 80%,而验证和测试准确率为 50%,这是一个直线趋势。这意味着,对于较高的学习率,模型学习不多。
- 对于学习率 0.001,测试准确率为 82%。该模型错误地将 27 个图像预测为没有涂鸦,即使它们是涂鸦图像。总体而言,该模型正确预测了 89%的涂鸦图像。
- 对于学习率 0.0001,测试准确度为 84%。这个模型错误地将 26 个图像预测为涂鸦。该模型的召回率为 77%,准确率为 89%,假阴性率为 8%。
- 对于学习率 0.00001,测试精度为 86%,尽管在训练和验证精度之间存在较小的差异,但这存在欠拟合问题。该模型正确预测 83%的无涂鸦图像和 90%的涂鸦图像,假阴性率为 8%。
总的来说,0.0001 的学习率比其余的学习率表现得更好。因此,有了这个学习率,批量大小和冷冻层数被调整。
调整不同的学习率 0.01、0.001、0.0001、0.00001
不同学习速率下涂鸦图像预测混淆矩阵的度量
2。批量大小
根据 Jason Brownlee 博士关于调整超参数的文章,ResNet50 使用 16、32、64、100 个批量进行了调整,学习率为 0.0001。
- 对于批量 16,测试准确度为 82%。训练和验证准确度之间的波动很大(见下图)。该模型以 88%的精度正确预测了 75%的涂鸦图像。
- 对于批量 32,测试准确度为 84%。该模型以 90%的精度正确预测了 77%的涂鸦图像。
- 对于批量大小 64,测试精度为 85%,该模型以 88%的精度正确预测 81%的图像为涂鸦。该模型的假阴性率为 10.5%,这意味着该模型有 10.5%的可能性预测错误。
- 对于批量大小为 100,测试准确率为 85%,该模型正确预测 86%的图像为涂鸦,82%的图像为无涂鸦,假阴性率为 13.1%。
总的来说,根据需求的优先级,可以在 32、64、100 之间选择任何批量。如果优先考虑的是完美地预测涂鸦图像,那么可以选择批量 64。然而,我们也应该考虑假阴性率。批次大小为 64 时,假阴性率较低。所以,我要 64 号的。
调整批量大小 16、32、64、100
不同批量的涂鸦图像预测混淆矩阵的度量
3。寻找最佳冷冻层
根据下面的大小-相似性矩阵,在象限 3 中,如果数据集大小很小,那么我们必须冻结前几层并训练剩余的层。通过这样做,我们的模型可以更多地了解我们的数据集。
尺寸相似矩阵
基于大小-相似性矩阵,也基于 加布里埃尔·林斯·特诺里奥的一篇关于提高迁移学习性能的文章,我已经冻结了前几层,并训练了剩余的几层。为了让模型更好地学习涂鸦数据集,我已经冻结了除最后 15 层、25 层、32 层、40 层、100 层、150 层以外的所有层。
- 训练最后 15 层,测试准确率 86%。该模型能够正确预测 86%的涂鸦图像。尽管该模型将图像分类为涂鸦,但该图像不是涂鸦的可能性为 19%(假阴性率)。
- 训练最后 25 层,训练准确率为 81%,训练和验证数据集之间的方差较高。这个模型只正确预测了 73%的涂鸦图像。
- 训练最后 32 层,测试准确率 81%。与其他模型相比,该模型在预测涂鸦图像方面表现更好,准确率为 90%。
- 训练最后 40 层,测试准确率 86%。该模型仅能够正确预测 88%的涂鸦图像,但是假阴性率高达 14%。这意味着,有 14%的几率图像不是涂鸦,即使模型预测它是涂鸦。
训练最后几层并冻结剩余层
用于训练不同层的来自涂鸦图像预测混淆矩阵的度量
训练最后 100 层,测试准确率 87%。该模型可以正确预测 85%的涂鸦图像。假阴性率为 11.4%,低于“训练最后 40 层”。所以,我要进行最后 100 层的训练。
什么样的学习速率、批量大小和冻结层数提高了性能?
总体而言,在学习率为 0.0001 的情况下,测试准确率为 84%,假阴性率为 8%。以这个学习率和批量 64 ,测试准确率为 85%,假阴性率为 10.5%。最终在学习率为 0.0001,批量为 64 的情况下,训练最后 100 层,测试准确率提高到 87%。
结论
最佳学习速率、批量大小和识别最佳冻结层的选择取决于我们的要求。一些模型完美地预测无涂鸦图像,一些模型更正确地预测涂鸦图像。对于所有的模型,我考虑了假阴性率来决定最佳的参数值。最后,决策取决于需求的优先级。
参考
电通外部服务管理 *,(2017)。*涂鸦:墙上的文字
加布里埃尔·林斯·特诺里奥、克里斯蒂安·穆尼奥斯·比利亚洛沃斯、莱昂纳多·福雷罗·门多萨、爱德华多·科斯塔·达席尔瓦和沃特·卡尔。提高迁移学习性能:在遥感数据分类中的应用
莱斯利·史密斯,美国海军研究实验室高级研究科学家。竞赛获奖学习率。
罗森布拉特感知机的改进
自适应线性神经元和 Delta 规则
机器学习和人工智能已经在许多领域产生了变革性的影响,从医学科学(例如成像和 MRI )到实时战略视频游戏(例如星际争霸 2 )。这些成功的关键促成因素是深度神经网络,其特点是所谓的隐藏层和人工神经元的数量不断增加。然而,必须强调的是,神经网络最初有着卑微的开端:当弗兰克·罗森布拉特(1928–1971)在 1957 年介绍他的感知机时,它只有一层由单个计算神经元组成,与今天可能有数百层和数千个神经元的神经网络相去甚远。尽管自 20 世纪 50 年代末以来发生了很多变化,但这些系列旨在引导学生了解神经网络的起源。这样做将更容易最终掌握深度学习所依赖的数学,以及现代神经网络是如何成为今天的样子的。为此,今天的主题是自适应线性神经元和 Delta 规则,这是由 Bernard Widrow 和他的学生 Ted Hoff 于 1960 年提出的。在开始之前,让我们快速回顾一下罗森布拉特的感知机。
左图:伯纳德·维德罗。右:马尔西安“特德”霍夫。
快速回顾罗森布拉特的感知机(1957)
深度学习快速入门。
towardsdatascience.com](/rosenblatts-perceptron-the-very-first-neural-network-37a3ec09038a)
当 Rosenblatt 在 1957 年首次为二进制分类问题引入感知器时,他的机器使用了一个单一的计算神经元,如下图所示。
罗森布拉特感知机
给定输入向量
感知器首先计算加权和
然后将其传递给 Heaviside 函数以生成其输出
最终输出是 x 所属的预测类(0 或 1)。尽管这种人工神经元的数学简单,罗森布拉特的主要成就是设计了一种算法,使它能够直接从训练数据中实际学习一组权重和偏差 b 。今天,这种监督学习算法被称为感知器学习算法*。*
感知器训练程序的局限性
罗森布拉特的感知机并非没有局限性。其中一些根源于数学模型本身,已经在明斯基于 1969 年出版的一本臭名昭著的书中指出。
图 1: 玩具问题考虑。
为了说明我们的观点,让我们考虑图 1 中的二元分类玩具问题。这和介绍罗森布拉特的感知机时考虑的是一样的。然而,一个单独的训练示例被故意贴错了标签。使用标准的机器学习工具,人们会期望这一个错误标记的训练示例不会显著恶化分类模型的性能。虽然这种直觉对最近的模型可能是正确的,但我们会看到它不适用于罗森布拉特的感知机。
图 2: 罗森布拉特感知器的决策边界在 100 个历元上的演变。学习率设置为 1。
图 2 描绘了当历元的数量从 1 到 100 变化时,感知机的决策边界的演变(即,我们循环通过整个训练数据集以学习权重 w 和偏差 b 的次数)。很明显,决策边界到处都是。巧合的是,错误分类点的数量从 1 一直到 100 个数据点中的 69。这种不稳定的行为不能通过降低学习速率(默认设置为 1)来缓解,这是一种经典的建议。事实上,回头看看感知器学习算法(见算法 1),只要感知器误分类哪怕是一个点,权重 w 和偏差 b 就会不断更新。然而,给定我们的训练数据集,感知器实际上不可能正确地分类所有的点,因此学习过程永远继续下去,永远不会收敛!然而,感知器学习算法的这种基本限制和缺乏鲁棒性可以通过稍微修改学习过程来消除。我们将在下文讨论的小修改产生了现在被称为 ADALINE 的单层感知器。
适应性线性神经元(1960 年)
像罗森布拉特的感知器一样,ADALINE(又名自适应线性元素或 Widrow-Hoff 规则)是一个单层感知器。然而,它与它的不同之处在于它如何从数据中学习权重 w 和偏差 b 。
阿达林。与罗森布拉特感知器的图表进行比较。
主要区别来自用于调整两个感知器的权重和偏差的反馈误差。Rosenblatt 使用分类误差(即二进制值),ADALINE 引入了所谓的损失函数*(有时也称为成本函数或目标函数)的概念,它依赖于量化前人工神经元的输出(即连续值)。虽然这可能看起来是一个很小的区别,但我们很快就会看到,当涉及到最终的模型时,这实际上是一个很大的区别!*
损失函数的引入使得 ADALINE 比 Rosenblatt 的感知器更接近现代机器学习方法。给定我们的集合 m 例(x【yₘ】用 yₘ ∈ {0,1}表示类**x所属,ADALINE 的损失函数定义为**
其中 φ(z) 为激活函数(即这里的恒等函数)。基于该定义,获得权重 w 和偏差 b 作为最小化问题的解
即,它们被选择为使得我们的示例集上的误差平方和尽可能小。
损失函数如何最小化?
让我们看看如何找到最小化损失函数的权重和偏差集。为此,我们将依赖于损失函数是二次的以及相关的最小化问题是凸的事实。如果你不知道什么是凸优化问题,简单来说就是我们知道如何高效求解的优化问题。我们还需要一些基本的高中微积分。
一个凸函数ℒ (z) 只有一个最小值。它位于ℒ (z) 的斜率为零的点 z ,即
我们的目标是找到满足这个条件的一组权重 w 和偏差 b 。这些是导致误差平方和尽可能小的权重和偏差(给定我们的数据)。
****德尔塔法则:记住一个函数的梯度表示正斜率最大的方向。因此,寻找函数最小值点的一个简单的启发式方法是向与梯度相反的方向移动。因此,让我们首先计算损失函数的梯度。对于一般激活函数 φ(z) ,它由下式给出
和
**用*φ’(z)*激活函数相对于 z 的导数。注意 ADALINE 代表 ADA 感受性线性神经元。它的激活是恒等式,即 φ(z) = z 从而 φ’(z) = 1 。因此,损失函数的梯度简化为
和
从给定的一组权重 w 和偏差 b 开始,delta 规则规定,为了减少误差平方和,这些权重和偏差需要更新如下
其中更新∈w和∈b由下式给出**
和
这里,α是一个标量,通常称为学习率或步长。最简单的形式是,德尔塔法则假设α常数。变量 w 和 b 持续更新,直到执行了规定的迭代次数,或者更新的范数小于用户定义的容差。这就是事情的全部。
如你所见,德尔塔法则背后的数学和哲学都很简单。尽管如此,它仍然是用于训练更深层次神经网络的更一般的反向传播算法的一个特例,因此它在本系列中很重要。不要犹豫重新推导所有的数学作为练习。同时,现在让我们转移到有趣的东西,用 Python 实现 ADALINE。假设您已经熟悉 Python,下面的代码应该是不言自明的。
为了清晰和易用,我们将在整个系列中坚持使用 scikit-learn API。这段代码的扩展版本也可以在我的 TowardsDataScience Github repo 上获得(此处)。
ADALINE vs. Rosenblatt 的感知器
图 4: 随着训练的进行,训练数据集中误分类点的数量。
图 5: 罗森布拉特感知器(浅灰色)和 ADALINE(黑色)的决策边界在 100 个历元上的演变。在这两种情况下,学习率都设置为 0.1。
图 4 显示了 Rosenblatt 的感知器和 ADALINE 在训练过程中错误分类点的数量,而图 5 描述了两个模型的决策界限的演变。罗森布拉特的感知器无处不在,在某个特定时期的准确率接近 99%,而在下一个时期的准确率不到 50%。这种鲁棒性的缺乏来自于一个错误标记的数据点阻止罗森布拉特的感知机学习任何东西。
相比之下,随着训练的进行,ADALINE 的误分类点的数量单调减少。看 ADALINE 的决策边界的演化,可以看出它比 Rosenblatt 的感知器要平滑得多。这种更平滑的演变来自于成本函数的定义,使得训练过程能够基于对当前预测的错误程度的一些评估,而不是简单地基于它是否错误(如罗森布拉特的感知器的情况),在每一步对权重*【w】*和偏差 b 执行小的调整。由损失函数编码的信息因此使得 ADALINE 的训练更加健壮和良好。最后要注意的是,即使这两个类不是线性可分的(由于一个错误标记的数据点),ADALINE 的最终线性决策边界仍然是基于最小化问题的公式以有原则的方式选择的,从而确保它在某种意义上是最优的。关于 Rosenblatt 的感知器的决策边界,没有这样的事情可以说,因为对于这里考虑的问题,它根本不存在,感知器学习算法不能收敛。这是这两个单层感知器的主要区别…
ADALINE 普通最小二乘法是变相的吗?
在结束之前,让我们试着更好地理解 ADALINE 实际上在学习什么。虽然它用于分类目的,但它与最简单的回归模型之一的普通最小二乘法 (OLS)密切相关。当观察损失函数时,这种紧密的联系清晰可见
使用简单的变量变化,
和
这个损失函数可以重写为
其中 X 的每一行都是给定的训练示例。这个损失函数不过是普通最小二乘最小化的二次损失函数。最优解的封闭形式是
因此,两个模型之间的这种等价允许我们将 ADALINE 的权重 w 和偏差 b 理解为出现在超平面的方程中的系数,该方程在最小二乘意义上最好地分离了两个类别。
尽管 ADALINE 改进了 Rosenblatt 的感知器,但我们将在接下来的帖子中看到在最小二乘意义上解决问题并不是一个人可以为分类问题做的最合适的事情…
结论
这篇文章是我的深度学习初学者系列的第二篇。这本书应该更早出版,但生活另有决定(新生儿、新房子、工作等)。至于罗森布拉特的感知机的第一篇文章,我知道将自适应线性神经元的文章标记为深度学习可能有些牵强,但相信我,我们会实现的。与此同时,不要犹豫地玩代码(见 GitHub repo ),如果有兴趣,自己重新推导所有的数学。没那么复杂。如前所述,ADALINE 比 Rosenblatt 的感知器更接近现代机器学习方法。因此,当我们转向现代神经网络时,很好地理解它所依赖的数学将是非常有价值的!
在接下来的几篇文章中,我们将讨论以下主题:
- 感知器收敛定理。
- XOR:深度学习的卑微开端。
最后,您会在下面找到一个与 ADALINE 相关主题的附加在线资源列表。不要犹豫,看看这些,因为它们可能会处理一些我们可能会忽略的方面!
PS:如果你知道任何其他相关链接,不要犹豫给我发消息,我会编辑帖子来添加它:]
其他在线资源
- Sebastian Raschka 关于单层神经网络和梯度下降的博客文章以及他的机器学习常见问题。
- 如果你想更多地了解泰德霍夫:https://computerhistory.org/profile/ted-hoff/
**想要阅读更多此类内容?查看我其他关于低秩结构和数据驱动建模 的文章或者干脆我的 机器学习基础知识 !
有没有想过我们为什么使用它,它来自哪里,如何有效地优化它?这里有一个解释(代码…
towardsdatascience.com](/binary-cross-entropy-and-logistic-regression-bf7098e75559)**
杂质和判断分裂——决策树如何工作
罗马卡夫在 Unsplash 上拍摄的照片
如果你想了解机器学习算法是如何工作的,那么从不起眼的决策树开始是不会错的。本质上,决策树是一个流程图,它询问一系列关于数据点的问题(数据点被赋予一组特征/值)以便对其进行分类(见下文,决策将是绿框中的多数组)。
**注意:**绿框代表叶节点,在这些叶节点上,将组进一步分成“赢”和“输”是没有改进的
为了训练一个决策树,你需要一组训练数据,然后通过在每个点为每个结果组提出最佳问题,找到将它分成越来越相似的组的最佳方法。
例如,在上面的图表中,我们想要分类一支球队是否会赢得比赛(训练集为 9 胜 5 负),它查询的第一个问题是数据中的列,该列详细说明了他们是与 A 队、B 队还是 C 队比赛,然后将它分成三组。如果你玩的是 B 队,那么它不会再进行分裂,因为最终的小组是你能做到的最纯粹的小组(4 胜 0 负),所以预测你会赢得任何新的数据点。其他组仍然是“不纯的”(有混合数量的赢和输),将需要进一步的问题来进一步分裂他们。有趣的是,对于每个组,他们可能不会被问到相同的问题(例如,“主场优势?”或者“以前赢过?”).
决策树的工作方式是一种非常有趣的预测方式,因为:
- 它们很直观——你可以阅读这些问题集,很快就能知道它是如何做出决定的
- 您可以按类别或数量分割数据——如果数据大于某个数量(即一组小于 3,另一组大于或等于 3),您可以按类别分割数据(一组中的所有“狗”,另一组中的所有其他动物)
- 这是一种你可以硬编码的东西——你可以将问题物理编码到简单的电子设备中,这比神经网络等更复杂的算法更容易,甚至在某些情况下可以打印出来
- 它是更复杂算法的构建模块(最流行的机器学习算法之一,随机森林,本质上是一组专门构建的决策树)
- 他们可以做出非常复杂的决定——他们处理高维和低维数据,他们甚至可以预测一个数字以及预测一个类别(他们可以进行分类和回归预测)
- 可以计算特征重要性 —这个我以后再回答。
你说很好。让我们开始编写代码吧!等等,等等,等等……在我们开始构建一棵树并测试它之前,我们需要回答一个重要的问题。
它如何决定要问的最佳问题?
埃文·丹尼斯在 Unsplash 上拍摄的照片
如果你想到了关于球队获胜的例子,那么算法是如何知道问你在和哪个队比赛是最先问的问题的呢?我们可能会争论“最佳”在这里意味着什么,但我的意思是,对于我们从可用问题列表中提出的每个问题,它应该是将数据分成彼此更相似的组的问题(因此,对于我们之前的示例,我们希望组只包含赢或输)。那么它是如何决定的呢?
照片由 Justus Menke 在 Unsplash 上拍摄
为了观察这一点,我将制作一组虚假的数据,根据你鞋子的抓地力有多滑(4 表示非常滑,0 表示不滑)以及地板表面有多滑,涵盖你是否可能摔倒(“摔倒”)或不摔倒(“没有摔倒”)。想象它,我们有:
假的秋天数据。蓝色不太可能掉(“不掉”),绿色很可能掉(“掉”)
我们凭直觉知道,如果你有更多防滑鞋,你可以在更滑的地板上保持抓地力,反之亦然。因此,如果您可以将一个轴(地板或鞋子光滑度)上某个值的数据分成两组,这样得到的组会“更纯”,那么您会怎么做呢?更重要的是,算法是如何做到的?是否要在地板光滑度为 2.5 的情况下将数据分成两组?或者是 1.5 的鞋滑度?
这就是我们进入测量分割数据质量的数学的地方。对于每一个问题,我们都希望将一组数据放入问题中,最终得到两组数据,一组包含问题上方的所有数据,另一组包含问题下方的所有数据。我们不会问没有出现分裂的问题(比如将鞋子光滑度 5 分或以上的所有分数放入一个新组,而将其余分数放入另一个新组),因为我们根本没有改进这些组(没有任何变化)。
分裂的纯粹性
汤姆·巴瑞特在 Unsplash 上的照片
已经存在几种“纯度”或“最佳”分离的数学方法,您可能遇到的主要方法有:
- Gini 杂质(主要用于正在进行分类的树)
- 熵(同样主要是分类)
- 方差减少(用于正在进行回归的树)
*如果你在 pythons 的 SKLearn 模块中寻找决策树分类器或回归器,你会看到它们列在“标准”选项下。
本周,我将重点讨论基尼系数不纯度,因为一旦你理解了它的数学原理,你就可以很直观地计算出来(而熵可能会有点困难)。在我们的决策树在未来的版本中工作之后,我们总是可以看看其他的。
基尼杂质
(我打赌你能看出为什么我之前一直用“纯”这个词来让你做好准备!)
基尼系数所做的是计算出你从一组数据中选择一个项目的概率,然后计算出你错误分类的概率。
例如,如果我有一袋 6 个蓝色和 4 个黑色的球(上面都有一个说明颜色的小标签),那么纯度测量就是如果我去掉所有的标签,随机选取一个标签放在我也从袋子中随机抽取的一个球上,我对它们进行错误分类的可能性有多大。
基尼系数的实际等式如下:
其中 I(i)是一组数据的杂质,I。j 和 k 是该组中不同的类别/标签,f(i,j)和 f(i,k)是 I 被分类为 j 组或 k 组的概率。
求和项是因为我们对没有正确分类的每个可能的组合都这样做。我不会深入这个等式,因为我会把它作为一个练习留给着迷的读者去查看链接,我发邮件去了解更多。
因此,做一个工作示例,对于袋子,我们选择蓝色球的概率是 6/10(10 个袋子中只有 6 个蓝色球),我们在袋子上贴黑色标签的可能性是 4/10(总共 10 个标签中只有 4 个黑色标签)。我们将这两者相乘,得到 24/100。如果我们对黑球这样做,我们得到 4/10 乘以 6/10,得到 24/100。将它们相加,我们得到 48/100 或 0.48。这袋球的纯度是 0.48。
现在我们有了一种计算一组数据的杂质的方法,我们要问的问题应该是,分裂组合并杂质(这通常由分裂组的大小加权,因此较大的组具有较大的权重)较低,我们对此进行了最大化。
对于我们跌倒的例子,我们只需要检查鞋子打滑和地板打滑的所有可能值,看看哪一个分裂给出最大的基尼不洁分数减少。
**注意:**有些人可能会说,如果你同时兼顾鞋子和地板的光滑度,这两组人会更好。
然而,虽然这是真的,但将它编码到算法中在计算上是非常昂贵的。这是因为要问的问题数量会成倍增加。
例如,对于我们来说,我们问了 4 个关于鞋子特征的问题和 4 个关于地板特征的问题(之所以是 4 个,是因为我们没有问一个所有数据都在一个组中结束而不是在另一个组中结束的问题,就像在 4.5 的光滑度上分裂一样),总共有 8 个可能的分裂问题。
如果我们使用上述方法,我们将有 4*4=16 个问题,这是一个很大的数字。一次只执行一次分割的结果是训练算法更快,只是树中的问题稍微多一些。合理的交易。
应用拆分
因此,查看我们的秋季数据,我们发现初始杂质分数为 0.3648,如果我们以 1.5 的鞋滑度进行分割,那么我们得到的分数为 0.2747(减少 0.0901),如果我们以 2.5 的地板滑度进行分割,那么我们得到的分数为 0.288 (0.0768),这使得鞋子切割效果最佳。我制作了一个 python Jupyter 笔记本和一个 Excel 电子表格(可以在我的 GitHub 上找到,还有一个处理 100 个数据点的脚本)来显示所有决策的计算,并在下面制作了这些漂亮的视觉效果来展示如何将数据分成更好的组。
左: Excel 模型,右: Python Jupyter 笔记本模型
对于获胜的问题,我们可以计算分数:
- **首发组:**总分 25 分有 6 个“摔倒”,19 个“没有摔倒”。由于篇幅原因,我不会在这里计算它,但在阅读了下面几点后,可以随意尝试一下。总数是 0.3648。
- **高于 1.5 的组:**我们有 1/15 的机会选择一个“无落差”数据点,14/15 的机会给它一个错误的 14/225 倍数值的标签。对于 14 个“下降”数据点,我们有相反的结果,但是 14/225 的结果是相同的。求和后我们得到的值是 28/225。
- **低于 1.5 的组:**我们有 5/10 的几率选择“不坠落”,有 5/10 的几率误分类为 25/100 的值。对于“下降”数据,我们有相反但相同的最终值 25/100。总数是 50/100
- **总计:**高于 1.5 的组有 15 个数据点,因此其值被加权为 15/25(起始组中有 25 个数据点)。对于低于 1.5 的组,我们有 10/25。这给了我们:
28/22515/25 + 50/10010/25 = 0.0747 + 0.2000 = 0.2747
- 杂质的减少是起始组 Gini 杂质减去来自所得分裂组的杂质的加权和。这是 0.3648–0.2747 = 0.0901(与代码相同!)
我之前说过,您可以询问决策树数据中的哪些特征是最重要的,您可以通过对针对该特征提出的每个问题的纯度减少量进行求和来实现这一点(例如,我在前面的问题中根据身高分割数据,然后在后面的问题中再次分割数据)。把这些加起来,你就能清楚地看到哪些决定是最重要的。这对于修剪和简化你的树是有用的,但是也给出了最有价值的决策信息来自哪里的很好的指示。
我们完了。我们可以判断劈叉的质量
恭喜你!现在,您了解了决策树判断最佳问题的一种方式。我计划在以后的文章中添加到 jupyter 笔记本中,这样我们就可以使用这种方法从头开始构建一棵树。
对于那些认为我们的数据太容易分割的人来说,嗯…你是对的。虽然我的测试例子很简单,你可以通过眼睛很容易地判断它,但请记住,这些算法经常查看超过 2 维的数据,一旦你到达 3 或 4 维,人脑真的很难想象它。这真的显示了这些算法的关键力量,它总是能够对我们自己难以做到的数据进行最好的分割。
**参考资料:**从零开始构建算法的一个很好的参考资料是 Toby Segaran 的《编程集体智慧:构建智能 Web 2.0 应用程序》。它很老了,是用 Python 2 编写的,期望数据在列表中,但这是一个很好的介绍,你可以挑战自己,将它转换成最新 Python 中的 pandas 数据帧。如果你想先看看机器学习算法,我也推荐维基百科。
IMS 超细与 VST:一个小样本浓缩咖啡过滤器的比较
利用数据找到一种比较和对比的方法
当我第一次得到 VST 过滤篮时,它极大地改变了我的浓缩咖啡。一旦我开始制作不连续浓缩咖啡,过滤的想法就更加强烈了。我对我的 VST 过滤器和其他过滤篮进行了分析,在某个时候,我偶然发现了 IMS 超细过滤器。有人在网上询问过滤器,当我提到我使用过它们时,我想到了数据。
我有足够的数据来更好地比较 IMS Superfine 和 VST 吗?我有足够的数据来比较我的 VST 7g 过滤器和 VST 20g 过滤器吗?所以我挖掘了 6 个月的数据,看看我是否能控制足够的变量来发现一些有趣的东西。
请记住,就使用的过滤器数量而言,这是一个超小型采样。这种分析应该从“这些特定过滤器中哪一个更好”的角度来看,而不是 IMS 或 VST 总体上更好。对于这项测试,需要进行更大规模的研究。
顶部图片:7g VST,20g VST,IMS 超细。左下:VST 20g,IMS 超细。右下:IMS 超细
极其简短的历史
VST 过滤器是经过大量研究后制成的,这些研究确定了改善浓缩咖啡所需的孔公差。他们提供了一份购买规格表,我已经独立核实了他们的说法。
IMS 超细过滤器使用筛网过滤掉 170 微米以上的颗粒,而不是典型的 250 微米及以上。该过滤器也被视为精密过滤器。
之前,我已经使用图像处理来分析过滤器上的孔尺寸变化。我将对这些过滤器进行分析,以便进行比较。每一个都有一些热点,那里的孔比较大,会影响流动。我注意到这些整体流动模式,而拉镜头。很难看出特定的孔值有很大的影响,但这是需要注意的。他们都有一些偏见,但没有一个主要的偏见会表明他们的表现会很糟糕。对于超细过滤器,分析包括顶部的金属筛网,使每个孔具有 4 至 10 个更小的孔。然而,我不确定这是否是过滤器的实际作用,因为金属网只是附着在边缘,而不是焊接在过滤器上。
绩效指标
我使用了两个指标来评估过滤器之间的差异:最终得分和咖啡萃取。
最终得分是 7 个指标(强烈、浓郁、糖浆、甜味、酸味、苦味和余味)记分卡的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难确定。
使用折射仪测量总溶解固体量(TDS ),该数值与咖啡的输出重量和输入重量相结合,用于确定提取到杯中的咖啡的百分比。
浓缩咖啡数据随着时间的推移慢慢收集
我用六个月的时间拍摄了我的 VST 单曲(7g)、VST 双曲(20g)和 IMS superficial(18g),我开始寻找模式。最终,我没有一个公平的比较,因为我没有一个相同的重量,但我有很多数据,也许我们可以看到一个故事。
首先,将所有跨最终得分和提取的数据与产出投入比进行比较。除了看起来他们有相似的表现之外,在这些数据中没有出现一个模式。
然后,让我们比较一下在过滤(PFF)篮中有无纸质过滤器的情况。尽管如此,除了超细提取似乎与味道不太相关(最终得分)之外,模式还不太清楚。
为了改进这种比较,我们来做一些配对数据。我们将为每种烤肉搭配最佳口味,并将 VST 的最佳口味与 IMS 进行比较。同样,也缺乏数据,但即使是这么少的数据,也没有明确的令人信服的模式。
因此,让我们为每一次烧烤拍摄所有照片,按口味排序,并对 VST 和 IMS 拍摄进行配对,以比较 VST 的最佳照片和 IMS 的最佳照片,第二好的照片和第二好的照片,等等。这就给出了更多的数据,从口味上来说,它们似乎没有太大的区别。从提取方面来说,VST 要么与 IMS 相同,要么比 IMS 好得多。
VST 7 克对 VST 20 克
因为我们在比较数据,所以让我们用同样的方法来比较 VST 7g 和 VST 20g。让我们开始直接把每一次烘烤的最佳镜头配对在一起。一般来说,问题是一次烘烤有 20 次左右,我没有刻意对每次烘烤使用所有三种过滤器。所以在数据上有点欠缺。
让我们扩展数据,包括过去一年的数据,即使我没有提取测量。有些镜头是实验性的,有些是用来拨入研磨。总的来说,我在性能方面没有看到太多的偏好。当我有时间的时候,我喜欢更频繁的投篮,所以一个更小的篮子,但是这些天我在原地躲避的时间更少了。
这两个 VST 过滤器有差异,但最终在过去的一年里,他们最好的镜头对彼此几乎相等。
末端的精密过滤器
关于哪一个更好还存在一些争论。最终,在这篇文章中,我只有 2 个 VST 滤波器和 1 个 IMS 滤波器。为了获得更好的过滤器性能总体样本,需要大约 30 个过滤器,每个过滤器上有多个镜头。如果我有时间和钱,我会尝试这个实验。
我很失望,因为我以为 IMS 超细将是下一个增量改进,但它是相同的另一个 VST 过滤器。然而,令人欣慰的是,IMS 滤波器比 VST 滤波器差。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
买得起的咖啡研磨机:比较
克鲁夫筛:一项分析
AI 中的“地面真实”是什么?(一个警告。)
一个演示,展示了为什么你不应该把人工智能当成一个神奇的魔法盒
注意:下面所有的链接都会带你去同一作者的其他文章。
随着所有的无端拟人化感染机器学习( ML )和人工智能( AI )空间,许多商人被骗去认为 AI 是一个客观、公正的同事,知道所有正确的答案。这里有一个快速演示,告诉你为什么这是一个可怕的误解。
图片:来源。
几乎每个人工智能学生都必须经历的一项任务是建立一个系统,将图像分类为“猫”(照片包含一只猫)或“非猫”(看不到猫)。这是一项经典人工智能任务的原因是,识别物体对人类来说是一项相对容易完成的任务,但我们真的很难说出我们是如何做到的(所以很难编写描述“猫性”的明确规则(T21)。这些任务对人工智能来说是完美的。
演示
我听到你们中那些已经和 AI 相处了一段时间的人的抱怨——你们已经厌倦了猫/非猫的任务。很公平,但就这一次。对于这个练习,你将是我的 AI 系统。你的任务是将下面的六幅图片分类。您只能从两个允许的标签/输出中选择:
- 猫
- 非猫
我们开始吧!给 6 幅图像中的每一幅分配一个允许的标签,就像人工智能系统会做的那样:
花点时间将每张图片标记为“猫”或“非猫”。
啊哈!图片 1-5 很简单,但是我听到你对图片 6 喃喃自语。《大猫》?《猫的种类》?《也许猫》?这些是不允许的选项!你是一个被编程为只输出*【猫】或【非猫】*的系统。那到底是哪一个?
转到此视频的 0:20,与现场观众一起观看本文的演示。
因此,我们开始看到项目的决策者是多么重要。正确的答案不是柏拉图式的,当然也不是来自人工智能系统……事实上,没有*【正确】的答案。【正确】*答案取决于系统的所有者希望系统做什么。
人工智能不能为你设定目标——那是人类的工作。
如果我试图建立一个宠物推荐系统,它只推荐那些在典型的成年形态下可以安全拥抱的动物,那么答案就很明显了。我对该系统的预期目的是指您的正确行动是将图像 6 标记为“非猫”。如果在这一点上你仍然把它贴上“猫”的标签,那么…我建议你购买更多的人寿保险。
机器学习的“正确”答案通常是在旁观者的眼中,因此为一个目的而设计的系统可能不会为不同的目的而工作。
如果你打算出于其他目的给猫分类,那么也许*【正确】*答案会有所不同。目的或目标来自人类决策者!靠边站柏拉图;不同的答案将适用于不同的项目。在人工智能中,客观总是主观的。由项目的所有者来决定那些主观的提议。(其他每个人都应该明白,人工智能系统有很多主观性。)
在人工智能中,客观总是主观的!人工智能系统有很多主观性。
决策者必须充当负责任的家长挑选他们希望他们的系统复制的行为……几乎从来没有一个“正确的”方法来定义类别并设定每个决策者都会同意的目标。那些事情取决于个人。不同的人会发现不同的行为适合复制。
如果你继承了我的系统,并且你的意图与我的不同,或者如果你计划将它用于不同于我设计它的目的——例如,如果你在什么应该被称为猫的问题上与我的观点不同——你可能会发现我的系统不适合你。它甚至可能伤害你,尽管它让我非常开心。
如果发生这种情况,那就是你的错,而不是我的。你太蠢了,以为只有一种方法来定义事物。你认为一个有数学成分的系统不可能有歧义和人类的弱点,所以你最终找到了一个解决错误问题的好方法,因为这不是你的问题(是我的问题),而是 T2 的问题。
你应该总是测试别人开发的人工智能系统,尤其是当你不知道他们是如何定义他们的目标的时候。
我是不是在说,你不能使用其他 AI 工程团队开发的系统,每次都必须从头开始构建自己的系统?一点也不。然而,你确实需要对正确执行你的任务意味着什么形成你自己的清晰想法(例如,如果有一只老虎该怎么做),你需要仔细测试你正在考虑继承的一系列你自己的例子的系统(例如你手工标记的照片)。
什么是地面真相?
你可能听说过术语“地面真相”在 ML/AI 领域流传,但是它是什么意思呢?新闻快讯:地面真相不是真的。这是一个理想的预期结果(据负责人说)。换句话说,这是一种通过创建一组带有输出标签的例子来总结项目所有者意见的方法,这些标签是那些所有者觉得合意的。它可能涉及手工标记示例数据点或将传感器“放在地上”(在一个精心策划的真实世界位置),以收集所需的答案数据,用于训练您的系统。
新闻快讯:地面真相不是真的。
例如,根据项目负责人的意见,一组图像可能被煞费苦心地手工标记为猫或非猫,这些猫/非猫标签将被称为该项目的“真相”。
这到底是什么?!猫还是不猫?看电影猫的预告片诱惑我漂白眼睛。
当这样一个数据集被用来训练 ML/AI 系统时,基于它的系统将继承并放大那些决定理想系统行为对他们来说是什么样子的人的隐含值。
当我们创造基于数据的机器系统时,我们教给他们我们的价值观。
当我们谈到这个话题时,请注意,通过让可信任的人执行您的任务来创建“地面真相”会出现各种错误,包括人为错误。尝试通过基于共识的数据收集工作流、反应时间监控和减少数据输入错误可能性的巧妙用户体验(UX)技巧等方法来最小化这种错误的可能性是一个好主意。(在以后的文章中会有更多的介绍。)
让你的项目决策者审查一个随机的样本来检查质量是否足够高总是一个好主意。
如果你在网上找到一个数据集并使用它而不是收集你自己的呢?那么你的项目就继承了创建你的数据集的人的隐含价值和偏见。在这个过程中总会有主观的判断,无论是谁做出这些判断,都会为你的项目确定“对”和“错”。小心你信任的人!决策者花时间亲自执行任务,以更好地理解他们试图解决的问题,以及数据、目标和边缘案例,这有很多值得说的。
警告(如何做一个好公民)
我写了很多赞扬仔细测试 ML/AI 系统的文章,但是要小心!由于整个过程从根本上邀请定义和目标的主观性,所有的测试将根据你的团队的决策者喜欢的答案来完成。不幸的是,首先没有测试这些主观想法的愚蠢程度。除了其他决策者审查他们在项目第阶段所做选择的理由之外,对决策者没有制衡。
没有测试来检查主观定义和目标的愚蠢,所以明智地选择你的项目负责人。
现在你知道了所有人工智能/人工智能项目的第一部分是多么主观,你可以在一个日益人工智能泛滥的社会中成为一个更好的公民。不要轻信人工智能解决方案,而要经常问自己:
- 这个系统是谁建的?
- 他们的(主观)目标是什么?
- 他们是如何定义正确答案的?
- 大多数人会有相似的定义吗?
- 地面真实数据集是如何创建的?
- 这个系统打算让哪些人受益?
- 犯错会有多痛苦?
- 是否有合适的 安全网 内置?(系统的创建者是否谦逊地预见到他们的选择可能是不明智的,并据此制定计划?)
在许多情况下,你对这些问题的回答不会暴露任何可怕的东西。人工智能已经围绕在你的周围,在很大程度上,它设计得很好,很有营养。唉,偶尔你会发现自己身处困境。例如,你不会想成为短视的欺诈检测系统的受害者,该系统对金融欺诈的定义很草率,特别是如果这样的系统被允许错误地指控人们,而不给他们一个简单的方法来证明自己的清白。那种事情是自找麻烦的火药桶。作为一个负责任的公民,你应该注意到易燃的情况,并大声说出来。一旦你开始看到人工智能游戏中固有的主观性,你将更好地武装自己,召唤出丑陋的人类元素,如果没有人观看,这些元素可能会被放大。
关于如何明智地处理这些模糊的主观想法,请看我的《终极决策者 AI 入门指南》。
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?用这个表格联系。
在对话式人工智能中,精确和回忆(嗯)不是你最好的朋友
这些指标实际上是不相关的对话情况下,导致误解和过度自信
为了让对话助手自动响应用户的请求,有必要训练用户正确识别问题,从而触发正确的场景。为此,工业解决方案(即聊天机器人解决方案)大多使用机器学习来执行这种检测,方法是创建一个模型(学习过程的结果)来按意图对请求进行分类。学习方面的文献建议我们通过精度和召回指标来检查模型的性能。从经验来看,我发现这些指标实际上在对话情况下是不相关的,会导致误解、过度自信,并最终成为分析师的诱饵。我建议使用关键成功指数(CSI ),但由于它仍然不够,通过分析我们的老朋友和新朋友的无偏变异系数来完成这一指标。
插图照片。照片由 gratisograph-Pexels 提供
介绍
在对话式人工智能中,系统必须“理解”用户的请求,然后才能执行所请求的操作(例如,“开灯”、“给我点一份披萨”、“我如何才能关掉电视”等)。).为了做到这一点,这些系统使用了一种机器学习技术,其中包括从具有相同含义的句子分组中自动创建分类模型,这些句子隐含着相同的意思。为此,对话人(即编写对话助手的对话的人)必须监督检测器(分类器)的训练,向其提供一组例句,并按意图(按请求类型)对其进行分组。
天气预报助手的例句
在学习之后,必须对系统进行测试,以确保它足够“聪明”来理解所有的请求。尤其是因为这些系统被用于检测需求的能力,即使需求与预期不同。关于用户请求处理的描述,你可以参考我以前的文章《对话人的对话式人工智能:4 个复杂等级》。
为了测试他的助手,对话人必须问一些不在训练中的问题,并检查系统是否检测到意图,尽管他会引入一些变化,以验证系统能够提取不同的句子。例如由于训练不足而导致的训练缺陷会给用户带来负面影响,因为系统会触发与其初始请求不对应的动作。
不良检测示例
该理论
在自动分类中,精度(也称为正面预测值)是所有建议项目中相关信息的比例。召回率(敏感度)是所有相关项目中建议的相关项目的比例[1]。
当对话助手正确回答了 20 次(也称为真肯定或 TP),执行了 10 次不是请求的动作(称为假肯定或 FP),没有执行预期动作 40 次(称为假否定或 FN),则其精度则为 20/(20+10) = 0.667 (66.7%),其召回率等于 20/(20+40) = 0.334 (33.4%)。能够无错误检测的系统具有等于 1 (100%)的精确度和等于 1 (100%)的召回率。
在训练阶段之后,用一个意图的不同测试短语来测试分类器(然后是下一个)。每个测试的结果根据识别的意图进行排序。
计算二进制系统的精度和召回值(检测到或未检测到)
在多类系统中(在我们的例子中,是多意图系统,因此它涉及所有会话助手),整体系统精度是所有意图精度的平均值,召回率是所有意图召回率的平均值。这些值被称为精度的宏观平均值和召回的宏观平均值。
多类系统中查准率和查全率的计算
计算每个意向的精确度和召回率,并对总体结果进行平均。真正的肯定结果对应于对意图的正确检测。假阴性对应于我们的意图测试句子给出另一个意图作为结果(其他意图之一)的情况。假阳性对应于给出那个意图的其他意图的句子。真正的否定对应于所有其他没有给出我们想要的结果的测试。
还有另一个指标是精度的微平均值,它对应于不同类别的 TPs 之和除以 TPs 和 FPs 之和。该计算包括对分母中的所有值求和,这导致最终成功率的计算。
为了测试该系统,对话方准备一组测试短语(称为验证数据集),该组测试短语由不属于训练(称为训练数据集)的短语组成。每个句子都与其中一个意图相关联。
还可以使用自动测试技术,根据取决于所选交叉验证类型的规则,将可用数据分成训练数据和测试数据。在非交叉分离中,选择一个比率将数据分成两组。通常使用 50/50、66/33 或 80/20 的比率。然而,如果数据数量较少,将可用数据分成两个不相交的子集会产生检测偏差。这些偏差可能是拟合不足或误差过大。
将数据分为训练和验证数据的示例
这个问题的一个解决方案是使用交叉验证技术,通过称为 k 折叠的折叠来分离集合。k 折叠建议将数据分离成 k 个折叠。保留一个折叠用于测试,剩余的折叠(k-1)用于训练[2]。在对话人可以直接干预模型的系统中,该测试模式允许调整模型的超参数并在适当的时间(即在过度拟合之前)停止训练。
将数据分成多个文件夹的示例(k = 4)
在具有不平衡意图的系统中(即,每个意图具有不同数量的句子,这在对话解决方案中也是常见的情况),保持意图中的块比率是很重要的。这种技术被称为分层交叉验证。
在“现成的”对话式人工智能解决方案(即几乎所有的商业聊天机器人解决方案)中,不可能选择这些超参数,系统“自行”设置自己。这种黑盒侧使得很难知道系统是否是工厂预设的,或者它是否使用内部交叉验证和早期关闭功能自动适应。
实践
让我们以一个四意图系统为例,它由一个专门为验证而创建的测试集构成。假设它在第一次业务迭代之后被训练,即主题专家已经给出了一组句子,根据他们,这些句子对应于需要自动化的领域的最常见的用户请求。让我们假设测试的第一阶段给出了以下结果:
TEST_1:第一次测试活动的结果
使用测试句子(每个意图 20 个句子)来测试分类器,并且在称为混淆矩阵的表格中记录检测的结果,该表格被分成用于要被测试的意图的行和用于被检测的意图的列。交叉点处的数字对应于测试意图的检测出现次数。
在示例 TEST_1 中,第一意图的 20 个测试短语被正确分类了 16 次,并且发现了 4 个错误。在 80 个测试短语中,59 个短语被全局正确地检测到,21 个导致分类错误。该分类器的平均准确率为 74%,召回率也为 74%。成功率(正确识别的句子/句子总数)给出了 74% (59/80)的结果,这对于第一次迭代来说是相对正确的。
在完成整体训练的第二次迭代之后,用初始测试句子再次测试系统。这一新测试给出了以下结果:
TEST_2:第二次测试活动的结果
新的成功率与之前的培训相同,即 59/80 = 74%。Intent 3 测试的准确率是 100%,召回率是 5%。这组平均值意味着该训练的总体精度为 80%,召回率为 74%,即精度提高了 6%,召回率相同,而结果在 intent 3 测试中急剧恶化,实际上不再被识别。因此,对整体精度的分析给出了肯定的结果,然而由于系统实际上将不再能够回答一类问题,因此用户体验严重下降。只有对每个意图的精细分析才允许在新的训练之后检查系统的发展。
假设分析师在意图 3 上执行了额外的工作来纠正已识别的问题,增加了对这个意图的了解,并执行了一组新的测试。
TEST_3:第三次测试活动的结果
新的成功率为 74%,与其他 2 次试验相同。准确率为 87%,与之前的测试相比提高了 7%,召回率为 74%,这个值在所有测试中都保持不变。对于分析师来说,系统显示了精度的整体进展,这表明系统的改进!通过更详细地分析结果,我们可以看到,意图 3 现在被过度检测,该意图的精度几乎为 20/41 = 49%,低于之前的测试。从用户的角度来看,这最终是最重要的,系统给人的印象是系统地触发相同的动作(50%的请求和 25%的请求是合理的)。
因此,对精确度总体变化的分析不会发现任何分类错误。在这些病例中,对召回的分析也是不确定的,因为它在 3 次测试中没有变化。从测试者的角度来看,未检测或错误检测之间的区别对于分析结果和确定要对培训执行的操作(创建新的意图、将它们组合在一起、向意图添加句子……)非常重要。
然而,从最终用户的角度来看,重要的是系统在大多数情况下都能正确响应,并且对这些值的整体分析会遗漏那些会影响用户体验的错误。当然,分类器的性能必须是全局平衡的。然而,对于不太频繁的请求,可以设想不太好的检测。然后有必要将结果与请求的频率相关联,但这是另一个主题。
关注不平衡的系统
测试分类器的性能时,考虑测试集的平衡并尽可能在每个意图中使用相同数量的测试值是很重要的。
为了突出这一点,让我们尝试另一个例子。我们正在执行检测测试,但我们没有一个平衡的系统,因为测试句子的数量根据意图而变化:意图 1 只有 10 个测试句子,意图 2 有 20 个,意图 3 最完整,有 45 个句子,而意图 4 只有 5 个句子。
该测试给出了以下结果:
第一次测试的结果
我们有以下指标:准确率= 86%,召回率= 84%,成功率= 86%。为了平衡结果,有必要引入加权指标的概念。不同类别的各个指标的值必须乘以用于测试的句子的比率。意向 1 的比例是 10/80 = 0.125。加权后的指标是加权精度= 87%,加权召回率= 86%。
我们修改培训,试图改善我们的系统。
第二次测试的结果
这些指标具有以下值:对于 90%的成功率,精确度= 80%,召回率= 89%。加权准确率为 93%,加权召回率为 90%。在没有加权的计算中,我们会看到精度下降了 6%,而系统总体上有所改善,这由加权值显示,因为我们看到精度提高了 7%。这个非常重要的区别来自于实例 4 的权重与其他类相同,而这个实例的测试数量很少。实例 4 的测试数量少意味着一个坏结果的影响给了这个实例的测试结果很大的权重,这里突出显示了这一点。
那么选择哪个(些)指标呢?
我们已经看到,精度和召回指标没有突出局部分类错误,这可能会对整个系统不利。在 TEST_3 的情况下,系统在四分之一的请求中检测到不良意图,这将最有可能导致对话助手的拒绝。此外,精确度和召回率集中在 2 个不同的轴上:第一个轴强调假阳性问题,而第二个轴强调假阴性问题。对于用户来说,这仍然是一个错误的答案,因此我们需要一个新的指标来将这两个轴组合在一起。
这个指标是存在的(尽管它不太明显),而且它是关键成功指数(CSI ),在其他地方的天气预报中被广泛使用。它也被称为威胁分值 TS。CSI 是用于分类检测的性能验证措施。它等于正确事件预测的总数(TP)除以错误检测的总数(FN + FP ),再加上 TP 就得到一个性能比。
为了在上线前完成我们的测试,我们正在进行一项新的培训,在全球范围内改进我们的模型,将其置于完全可操作的水平,准确率为 90%,召回率为 89%,成功率为 89%。
TEST_4:第四次测试活动的结果
然后我们计算几个指标,你会发现这些指标列在这个维基百科页面上。
不同测试的性能指标值
对该表的研究表明,没有指标真正突出了 TEST_2 和 TEST_3 分类器的问题。只有指标 CSI、F1-score、Matthews 相关系数(MCC)和 Fowlkes-Mallows 指数突出了 TEST_2 分类器的质量下降。没有检测 TEST_3 问题的指标。CSI 指标最接近整体系统性能的预期,这使得它比精确度、召回率甚至准确度更相关。
由于指标没有给出任何指示,我们不得不查看每个意图的价值测试的细节,以确定哪些意图是有问题的。
按意图的分类器得分
由于这项工作在大量的测试和许多目的上是单调乏味的,我建议使用一个叫做变异系数(或相对标准偏差)的离差指标。该指标定义为标准偏差与平均值的比率[3]。这个没有单位的数字允许在几个系列之间进行比较,这对于自动化测试来说很有趣。然而,考虑到样本数量较少,必须调整该值。这一指标的公式如下:
无偏变异系数
在我们的 4 次测试中,该指标的计算给出了精度、召回率和 CSI 的以下结果:
精确度、召回率和 CSI 指标的调整变异系数的计算结果,并突出显示最大值
因此,超过这 3 个值之一的阈值(例如 20%)可以用于通知分析师培训质量问题。这一指标补充了业绩指标的经典分析,例如整体精确度低。当达到阈值时,建议更仔细地分析结果,以便确定有问题的意图,从而了解如何修改训练,或者甚至拒绝新的训练。
结论
在会话助手领域,系统拒绝的原因之一是它们不能正确识别请求。因此,在发布助手并提供给用户之前,测试助手的性能非常重要。我们已经看到了如何计算多类系统的精度和召回值,以及当测试句子的数量不平衡时,对这些值进行加权是多么重要。然而,机器学习中最常用的精度和召回指标不允许我们得出一个系统是否在一个或多个意图上不包含错误的结论,因为我们只是在研究一个全局值。
因此,我邀请您通过添加 CSI 指标来完成您的计算,CSI 指标与用户期望更相关,即尽可能经常正确响应的助手(无论 I 型或 II 型错误)。通过计算精确度、召回率和顾客满意度指数的调整变异系数(无偏)来完成本指标。将警报阈值设置为这三个值中的最大值,可以让您突出显示学习问题,而不必逐个检查指标,从而节省分析训练迭代的时间。
参考
[1].精确和召回—维基百科—https://en.wikipedia.org/wiki/Precision_and_recall
【2】。交叉验证—维基百科—https://en . Wikipedia . org/wiki/Cross-validation _(统计)
【3】。变异系数—维基百科—https://en.wikipedia.org/wiki/Coefficient_of_variation
数据库中的机器学习:我们就不能好好相处吗?
意见/供应商观点
简单看看 Splice Machine 最近融合 ML 和关系世界观的努力
如果数据在企业内部驱动机器学习(ML),如果企业数据存在于数据库中,那么为什么两者不能和睦相处?为什么数据科学家用来构建 ML 结果的 ML 算法、模型和其他工件在物理上距离它们所依赖的数据如此之远?
简单的回答是,数据科学的工作方式不同于数据库,尤其是传统的关系数据库管理系统(RDMSes ),它强调定向事务,新数据随着时间的推移不断增加。相反,ML 项目是高度迭代的,探索性的,完全实验性的。
即使是最直接的企业 ML 项目,如预测客户流失,数据科学家也必须安排一个极其复杂和高度迭代的工作流程。这些工作通常在像 Project Jupyter 这样的基于 web 的笔记本环境中进行,需要不断地与支持性数据库资产进行交换。随着 ML 项目的临近和进入生产,这种来回变得更加困难和关键。这是 ML 的“最后一英里”问题:企业如何更快地将 ML 项目投入生产,然后随着时间的推移成功地将它们保持在那里。
作为回应,技术提供商开始推出更多生命周期完整的人工智能开发工具,如 AWS Sagemaker 套件。有趣的是,除了 AWS 广泛的数据库组合之外,这个神奇的工具独立存在,从任何和所有可用的数据存储中提取数据。但这并不意味着两者合不来。许多数据库供应商希望通过将 Sagemaker 所做的一些事情转移到数据库本身来参与其中。
表格功能:旧思想的新生命
一个恰当的例子是,数据库供应商 Splice Machine 在其最近的版本( version 3.0 )中引入了一种有趣的方法,使用一种古老的数据库技术来解决 ML“最后一英里问题”。供应商已经嵌入了自己的 Jupyter 笔记本环境实现,该环境可以支持 Python 和 r 之外的多种语言。该环境利用了流行的 ML 生命周期管理平台 MLflow 的产品内实现。或者,模型可以部署到 AWS SageMaker 或微软 Azure ML 。
使用这些工具,开发人员可以调用一个“deploy()”函数来将他们的最终模型推向生产。该函数采用最终的 ML 模型加上支持的数据库表,并在数据库中自动生成代码作为表函数(类似于存储过程)。每当新记录进入数据库时,这个原生表资源就会执行,生成新的输出预测。
这种方法的固有优势包括大大简化了模型部署例程,更好地了解关键的部署后问题(如模型漂移),由于数据不必离开数据库而提高了性能,以及由于解决方案包含自己的容器管理平台而减轻了管理负担。转化为业务成果,这意味着交付 ML 解决方案所需时间的显著减少,以及长期维护该解决方案的成本的降低。
这是在企业中实施 ML 问题的唯一解决方案吗?当然不是。与任何现实世界的 ML 实现一样,期望的结果取决于所选工具和可用资源(技术和专业知识)之间的完美结合。幸运的是,由于 ML 市场严重依赖开源软件,企业购买者可以混合搭配语言、库、编排器等。
这也意味着买家可以投资像 Splice Machine 这样的基于数据库的解决方案,并且仍然可以利用熟悉的资源。目前 3.0 版本可以把模型推送到比如 AWS SageMaker 和微软 Azure ML。在未来,Splice Machine 很可能允许用户运行其他 ML 编排工具,如 Kubeflow 与 MLflow 并行或代替 ML flow。
我们应该会看到更广泛的数据库社区使用这种方法进行更多的投资。Oracle 最近已经开始将许多 ML 特性推送到 Oracle 自治数据库中;微软也这么做了。接下来还会有更多,尤其是随着行业开始处理更多极端环境下的 ML 用例(制造业、医药、石油和天然气等)。),其中时间和性能是最重要的。
数据库机器学习—变得简单
包含代码的端到端指南
照片由皮卡在土坯库存上根据许可从 Zer0 到 5ive 拍摄
**免责声明:我是拼接机*的机器学习负责人
如果你点击了这篇文章,我不需要说服你,机器学习是一个改变游戏规则的工具。构建 ML 模型现在是可访问的、容易的、初学者友好的(大部分时间)。然而,部署这些模型是另一回事。简单性、可伸缩性和推理速度只是您必须克服的一些障碍。
创建 ML 模型的最大问题之一是,模型是在对部署无用的环境中构建的。也许你已经用 Python 启动了单实例 Jupyter 笔记本。您可以集成 Spark 进行大数据处理,这很好,但由此产生的推理速度非常慢。也许您已经用 Flask 创建了一个将您的单个模型投入生产的管道,这是可行的,但是它缺少可再现性(和潜在的可伸缩性)。也许 Python 对于您的实时用例来说太慢了。
根本的问题是,机器学习部署是一个年轻和不成熟的领域,它还没有开发出数据库或软件开发所拥有的工具包。例如,数据库广泛可用,稳定,(有时)可扩展,速度极快。正因为如此,我们将借鉴数据库工程师已经完成的工作,并利用他们的工具为我们服务。这里,我们将重点关注使用横向扩展 RDBMS 进行模型部署。
在本文中,我将带您使用熟悉的工具构建一个机器学习模型,并将其部署到数据库中。为了获得完整的体验,你可以在这里创建一个免费的沙盒环境,和我一起浏览这些例子。
**TL;**博士笔记本位于这里,有输出的笔记本的要点是这里。要直接跳到本文的模型部署部分,请单击这里的按钮
获取环境
首先,在这里创建一个免费的沙盒环境。准备好数据库后,单击数据库名称进入仪表板。
数据库名称
在那里,您可以单击“检索数据库密码”来获得您的登录。
获取数据库用户名和口令
一旦你有了,点击“笔记本”来启动你的 Jupyter 笔记本实例。
启动您的 Jupyter 笔记本
您将被提示输入您的用户名和密码,这是您刚刚在仪表板上看到的。这需要一分钟左右的时间。
现在您已经进入了笔记本环境,您将创建一个新的笔记本,选择 Python 3 作为您的内核。使用的整个笔记本将在这里可用
您将构建一个 Spark 模型来预测虹膜数据集,以保持演示简短,但这可以扩展到任何数据集(任何大小)。
选择你的环境
首先,您将创建您的 Spark 会话。配置设置是在幕后为您处理的,所以只需运行下面几行就可以开始了。
创建 Spark 会话
在任何时候,您都可以通过运行以下代码来检查您的 Spark 控制台
获取 Spark UI
这将返回一个交互式窗口,您可以在其中观察您的 Spark 作业,并在它们运行时深入研究它们。
既然已经有了 Spark 会话,就可以获得 MLFlow 会话和本机数据库连接了。你可以在这里了解更多关于 MLflow 的信息,在这里了解更多关于原生 Spark 数据源的信息。
MLFlow 和 NSDS 的设置
这些行将自动配置您的 MLflow 会话并将其连接到数据库。
最后,您将开始您的 MLflow 实验,并运行以表明您即将构建您的第一个模型。就像使用 Spark 一样,您可以使用类似的命令查看 MLflow UI。
MLFlow 开始实验并运行
建立模型
现在您已经连接了,您将加载数据并构建您的第一个模型。这一部分将会更短,因为它侧重于部署,但是您可以通过单击“拼接笔记本”文件夹,然后单击“7”来访问您的试用集群的 Jupyter 笔记本中更长、更深入的示例。MLManager "
访问拼接笔记本文件夹
访问更多 MLManager 示例
现在,您将加载 iris 数据集,并将其转换为用于训练的 Spark 数据帧。
您将在这里为分类构建一个简单的决策树模型。
建立火花模型
如果你愿意,你可以在 MLflow 中记录一些信息来跟踪你做了什么。至关重要的是,您将把您的模型记录到 MLflow 中,以便您可以部署它。
将参数、度量和模型记录到 MLFlow
部署您的模型
就是这样!您已经创建了一个简单的 Spark 模型。现在是时候将它部署到数据库中,并利用 SQL 与它进行交互。您将使用 deploy_db 函数来实现这一点。这个函数有许多可选参数,您可以在这里深入研究,但是现在,简单地说:
- 方案名:要部署到的表的方案
- 表名:要部署到的表
- 运行 ID:存储模型的运行 ID
- 创建模型表:是否为我们创建表
- Df:作为表格基础的数据帧
- 主键:表的唯一标识符列
- 类别:类别标签名称(鸢尾属、弗吉尼亚属、刚毛属)
部署 ML 模型
就这么简单。幕后发生的事情是,作业被提交给代表您处理请求的服务器。最后一行调用 watch_job 获取从服务器自动传入的日志,这样您就可以实时看到发生了什么,并在出现问题时进行调试。
现在您已经部署了您的模型,您将进行一些预测。通过用%%sql 启动单元格,您可以在笔记本中运行 SQL。这是一个定制的魔术,允许你直接对你正在工作的拼接机器数据库运行 SQL。
使用 SQL 调用模型
最后,你可以停止你的火花会议,结束你的跑步。这不会影响 SQL,并且您可以通过插入新行来继续与部署的模型进行交互。
结束我们的会话
包扎
就是这样!您已经创建了您的机器学习模型,对其进行了跟踪,并将其部署到数据库中,以提高可扩展性、可用性和速度。这个简单的例子可以扩展到 Scikit-learn(可以在文件夹“7。MLManager”)或大规模数据集和复杂管道的困难问题。您甚至可以用触发器将模型(表)链接在一起。要查看其他一些示例,请参见 7 中的笔记本实例附带的 splice_notebooks 文件夹。MLManager 文件夹。
感谢您坚持使用我的例子!如果你有任何问题,请在文章中发表,我一定会回复。
为 DIY 数据科学家辩护
西蒙·艾布拉姆斯在 Unsplash 上拍摄的照片
教会自己如何解决问题很酷
有些人从正规教育开始他们的数据科学之旅。他们在大学里学习基本的数学、编程和统计学。他们带着熟练的学位进入数据科学领域。
但是许多其他人没有。相反,他们自己拼凑知识。他们在需要的时候会把需要的东西挖出来。他们是自学的;DIY。
虽然每个人的旅程都有点不同,但如果你是一名 DIY 数据科学家,你的机会可能包括以下一项或多项:成为 excel 的专家用户,被迫学习一些编程,解决工作中与数据相关的问题,由同事或朋友介绍机器学习,学习一些算法的功能,使用 scikit-learn 建立模型,参加 Kaggle 竞赛。
这些活动中的许多都属于“应用数据科学”的范畴——使用已经整齐地打包在一起的代码来实现复杂想法的快速应用。
这些资源的可用性存在一些问题。知识有限的人会犯错。他们应用事物不正确。他们愚弄自己。
关于让错误的人或错误的情况与数据和数据科学工具一起失控所导致的问题,有大量的警告。
但是也需要用乐观和前瞻来平衡围绕民主化的怀疑。
事实上,我认为“应用”是未来的方向,正如它塑造了过去一样。
作为一个社会,我们学习一些东西,我们把它打包在一起,让它更容易使用和建立。所有的建设者也是用户——利用跨越时间和人类进步的长桥的工具和结构。
几乎每个人都会使用电脑,但只有少数人能详细解释晶体管的物理原理和将互联网浏览降低到 1 和 0 的代码。
当然,拥有这些知识的人可能是世界上“最好的”计算机用户。但是一般人用电脑能不完成很多令人印象深刻的事情吗?
许多 DIY 数据科学家的旅程将只在这个应用世界中进行。他们将用必要的工具和知识来武装自己,以解决越来越多的问题。当然,他们应该被教导要小心谨慎,但是怀疑他们创造价值的能力是愚蠢的——尤其是当 T2 工具变得更好的时候。正如数据问题存在于光谱中一样,解决这些问题所需的技能也存在于光谱中。
一些 DIY 数据科学家的旅程不会停留在基础应用上。他们将继续攻读本科和硕士学位,以补充他们的知识。或者他们会找一个小众,深入学习。或者他们会如此深入地自学以至于他们的知识达到或超过那些受过正规教育的人。
其他人,特别是那些拥有多种技能的人,将继续建立和领导公司——利用他们的数据素养在日益数据驱动的世界中创造价值。
最后,让我们面对现实吧。自学的人有令人钦佩的地方。
通过在线课程奋力拼搏的人们。那些晚上和周末都在调试代码和学习新工具的人。那些充满动力和激情,克服无数挑战来解决问题的人。至少,这种程度的坚韧说明了职业道德和内在动力。
自学如何解决问题很酷。