大家好!我叫拜伦·温格德 (Byron Wingerd),是 JMP 的系统工程师之一。我通常与东海岸的制药公司合作。今天我将讨论如何检测微小的偏移。这需要查看过程数据或分析数据,并尝试了解微小偏移何时发生以及如何检测它们。回顾数据,查看数据并尝试了解过去可能发生偏移的时间。我们讨论的是如何从持续捕获的数据噪声中发现信号。
我有一些警告要提醒你。你的流程并不爱你。你的系统,无论你的流程是什么,无论是测量系统还是制造系统,还是净化系统,无论它是什么流程,它对输入变化的敏感度都比你的进料质量控制方法更高。我的意思是什么?你所寻找的东西,比如纯度,如果你能检测到它,那当然很好,但你无法检测到那些你意想不到的东西。
除此之外,供应商的C of A(产品合格证),尤其是化学品的C of A,有时会被批次间抄袭。除非你拥有极其灵敏的检测方法,否则你很难对原材料的细微变化发出预警。对绝大多数人来说,这些变化根本不存在。
我还有一个警告要告诉你。你的跟踪和趋势分析程序?它们不太好用。部分原因是我们。我们变得自满。大家都说,如果警报太多,人们就会开始忽略它们。但另一方面,警报消失了。一切看起来都很好,一切都在掌控之中。我们什么都不用担心。我们也不再仔细查看数据了。我们无法检测到会影响流程的因素,而且一切看起来都很好,所以我没有仔细查看,我们可能会遇到麻烦。
我们为什么要使用控制图?我们为什么要使用统计过程控制 (SPC)、控制变量法 (CPV),或者随便叫什么?首要原因是,我们要区分常见原因变异和特殊原因变异。这是一种响应我们检测到的流程变化的机制。有了统计数据,我们可以对发现的问题非常敏感。我们还可以自动发出警报,以便在我们疏忽大意的时候发现问题。
但整个跟踪和趋势分析并非可有可无。如果你从事制药行业,这是法律要求的。如果你从事其他类型的制造,ISO9000 也提到了这一点。这并非可有可无。我们都应该这样做,并监控我们的流程。
另一个警告是,你的流程可能正在悄悄地警告你一些即将发生并让你陷入困境的事情。我的意思是,有些制造实验是意外发生的。有些情况千钧一发,比如,差点失控,或者差点对那批产品失去控制。有些奇怪的事情并没有失控,但你会发现,你可以在数据中发现一些细微的变化。问题是,你看不到那些你没有注意到的东西。
另一方面,你不想被随机性所迷惑,只想追逐随机信号。这就是控制图的精髓所在。我们只想响应特殊原因变异,而不是常见原因变异。我们处于这个边缘,就像查看介于两者之间的数据一样。
我想谈谈我们工具箱中一些用于检测微小变化的工具的应用。我们有累积和图(CUSUM charts)。这些图非常棒。理想情况下,它们应该用于前瞻性地寻找已经发生的变化。它观察的是过程中上升或下降的累积和。我们有不同的方法来解释这些变化。另一个非常好的方法是指数加权移动平均图(EWMA charts),也叫指数加权移动平均图(Expanentially Weighted Moving Average charts)。这些图真的很棒。
然后我们可以深入探讨变点检测的概念。这涉及到多变量分析中的一些内容,我们将讨论一种叫做融合套索(Fused Lasso)的方法,然后我们甚至可以使用一些树状方法,例如分区、预测筛选、自举森林等,来寻找正在发生的微小变化、转变和漂移。JMP 中有一些很棒的工具可以分析这些变化,我想谈谈其中的一些关键工具。
CUSUM 是一款出色的工具,可用于检测过程中的细微变化,尤其是那些缓慢发生然后开始加速的漂移。我们可以通过查看图表中非常明显的模式来发现这些变化。过去,我们用的是 V-Mask 之类的工具,你只需要查看 V-Mask 以及 V-Mask 中数据的走向,感觉就像在挥手示意。它确实有效,非常可靠。但在 JMP 中,我们几年前重建了该平台,使其看起来更像常规的控制图。使用起来非常方便。
控制图,即累积和图,使用了一些参数。其中有西格玛,表示你想检测到多大的差异。还有领先优势,比如快速的初始响应。还有H值和K值,它们用于计算我们能检测到多大的变化,以及我们使用的西格玛值,即K-西格玛区间。为了达到最佳效果,需要调整一些参数。
现在,我们提到的另一个控制图是 EWMA。这是一种内存有限的控制图,其中 CUSUM 关注的是累积和。EWMA 具有记忆性,就像你让之前的观察结果对它产生多大的影响?你可以对这段记忆进行指数加权。同样,它有一些参数。它包含目标值、Sigma,尤其是 Lambda。Lambda 就是平滑函数,就像在等待的过程中,你记忆中多久以前发生的事,或者什么都不记得,或者介于两者之间的事。
这两种方法都是查找偏移和漂移的常用方法,但使用它们需要一些背景知识和专业知识。你必须知道如何运用它们来精确地检测出你想要的东西,因为如果你过度调整参数,你可能会检测到不存在的东西,或者错过已经存在的东西,而无法做出真正准确的判断。
如果有某种方法,让我们能够使用某种类似机器学习的工具,在不受我们背景和理解的影响下,做出这些判断,那岂不是很好?嗯,那一定很棒。有一种方法可以帮助我们做到这一点,它叫做融合套索 (Fused Lasso)。它是工具箱的一部分,是高级现代回归方法的一部分。我们可以使用它来使用广义回归。广义回归是 JMP Pro 的一项功能。它是一种惩罚回归方法。
过去,人们曾讨论过将其作为一种寻找变化点的方法。它涉及一些复杂的数学运算和一些关于如何在数据中找到这些变化点的复杂想法。我必须承认,10年前,Clay Barker 在他的一次关于 Genreg、变化点检测和融合套索的演讲中提出了这个想法。
我觉得它最终成了一个脚注,而且非常重要。我用这个方法已经好几年了,但我发现很少有人知道。我的意思是,我认真听克莱·巴克说的每一句话,他是我的英雄。但其他人可能就不是了。
这时,你可能会说:“嘿,拜伦,我得稍微踩一下刹车。高级现代回归方法?Genreg?我有点绝望,因为你在谈论像JMP Pro这样的软件,还有一些我根本不想学的复杂数学。” 事实证明,这只是稍微复杂一点。它的设置相对容易,而且你可以设置一种检测信号的方法,这种方法可能比那些更简单的方法更有优势。
简单介绍一下背景。人们长期以来一直在使用类似 JMP 中的分区平台之类的工具。如果你把时间作为 X,把 Y 作为你正在查看的响应,你就可以用它来找到平均值随时间变化的位置,尤其是在使用一些正则化的时间表(例如行号之类的)时。它非常擅长查找过程数据可能发生偏移的位置,例如可能发生的均值偏移。它可以找到一些断点。它在这方面非常擅长。
有几个小问题。如果断点太近,它就找不到它们。如果噪音太大,它也找不到它们。如果有很多断点,它可能只会找到第一个,而找不到后面的。但这是一个非常酷的想法,因为你所做的,就像融合套索一样,是试图找到均值相似的组的邻居,然后找出均值之间的差异。这正是分区所做的事情。
回到这个高级回归技术,我们需要做的是建立一个特殊的数据结构,用一个非常简单的(我说的“简单”是指很短,但实际上并不简单)的 JSL 语句来构建一个矩阵。这个矩阵就像幻灯片里的那样。想象一个对角矩阵,第一列全是 1,下一列是 0,然后全是 1。再下一列是 0、0,然后全是 1。我们想要在数据表中查看的每一行都有一列。
如果我们有一百行数据,就会有一百列。如果有一千行数据,这个对角矩阵就会有一千列。为了简单起见,稍后我将其称为“发现矩阵”,但这完全是一个错误的杜撰术语。不过,对我来说,它确实有效。
过去,我们可以使用这个发现矩阵,也可以使用分区平台,做同样的事情。这使得检测突变的灵敏度更高,因为我们会找到某一列,它对应于平均值的变化。该列是数据集中的行。这种方法效果很好,而且设置起来也很简单。
JMP 在过去几年里取得了长足进步。JMP 中我最喜欢的功能之一是“预测筛选”。它的作用是构建大量决策树,然后计算它们的平均值。
好的,关键在于:在预测筛选中,它会构建 100 棵树,它会从发现矩阵中随机抽取列样本,并从我的数据中随机抽取行样本,只需查看我试图解释的 Y 值的随机样本即可。它会构建一棵树。它会一遍又一遍地重复这个过程。
实际情况是,一个偏移可能与另一个偏移很接近,但这些偏移并不会出现在所有树中。我们可以找到其他彼此接近的偏移。我们可以在整个数据集中找到大量偏移。这解决了分区方法的一些问题,例如无法找到彼此接近的偏移,以及如果发生多个偏移,则无法找到它们。这让我们能够找到更多。
我设置了一个沙盒来测试它的实际效果。多小才算小?我的沙盒是什么样子的?我想找到1-2个西格玛(Sigma)变化的因素。我想找到系统性的变化。这就像我之前提到的那些意外的制造实验或原材料变化。它们并没有让我们失去控制,但可能稍微改变了一下。当这批材料用完后,变化又会回落。这些都是在生产过程中发生的微小变化,这让我能够回溯并诊断其中的一些变化。我想要的是真正发生的细微变化。
你可以想象一下这样的情况:在我的沙盒中,我有大约200行数据。在前100行中,我在33行处进行了一次加1的平移,然后在66行处进行了一次减1的下移。假设我的平均值是3,我将其上移到4,然后再次回到3,这就是我的平均值。这其中存在一些噪声。这幅图非常清晰、漂亮。你看着它,会想:“好吧,拜伦,你开始这样看数据吧,我总能找到这样的数据。” 好的,但我最后会告诉你其中的奥妙。
在蓝色区域,我没有发现任何移位。前100行,我有一个明确的移位。第二个移位,什么也没有。这就是噪音所在。我不应该在这一部分发现任何东西,而我应该总是在33和66处发现一个移位。
当信号很容易找到时,说我有一种方法可以做到这一点,这相当大胆。但假设我的数据看起来像这样。假设我有几千组数据。它们都叠加在一起绘制。这里有一个模糊区域,我总是想找到33和66之间的偏移。平均而言,你仍然可以看到这些数据,然后说:“是的,拜伦,我完全看得出来。” 但其中一些会非常干净地偏移,而另一些则不会偏移,还有一些只是噪音,或者只是在那边蓝色区域随机出现的游走。我检测到变化的准确率有多高?
举个例子,能更清楚地说明这一点。大约在33岁时,第一次转变,我一眼就能看出,嘿,有些东西上升了。但第二次转变,它就像一个下降的趋势。这不太清楚。在我接近尾声时,没有漂移或转变,它是在上升吗?还是呈锯齿状?我不确定。这些转变可能不太容易被发现或察觉。
好的,我先稍微说点儿,先给你们看看它在现实生活中是什么样子的,然后我们再回过头来评估一些结果。好了,这是我的工具箱。我有一个随机数据样本,这个样本,它有一个向上的偏移,用红线标记,还有一个向下的偏移,也用红线标记。这只是一个数据控制图。光看这个,我很难说,是的,这里面真的有什么东西。
我来到这里,查看了累积和控制图,紫色线条代表可能发生偏移的位置。我们可以清楚地看到,紫色线条与红色线条对齐,累积和控制图正在检测这种偏移。如果我改变这里的 K、H 和 Sigma 值,可以提高灵敏度。假设这个值是 0.15。现在,通过改变我查看的 K,我可以把它调小一点。我们再把它改得更小一些。我没有找到 66,但它在这里发现了一些变化,这个变化在 80-90 的范围内。这表明发生了一些变化。但这是一个很好的测试。
我可以调低到这里,这是我的 EWMA 图。我把它放大一点。我有一个 Lambda 滑块,我可以调整。如果我调到这里,就没有记忆值了。如果我调到这里,就全是记忆值了。它和 CUSUM 图几乎一模一样。我说过这个,我知道经常做控制图的人会听我的。请不要因为我这么说就把我踢出去,但事实就是如此。在这里,通过降低这个值或增加 Lambda,我可以在 33 左右找到变化点,但在 66 左右我什么也找不到。
我们来看看第三种方法。这里我用的是预测筛选法,我刚刚画了一个帕累托图。在预测筛选法中,我设置了我的发现矩阵。我们可以快速看一下数据集。不,我不会去看数据集。相信我,它就在那里。我在这里看到的是第一个猜测。它显示第33行可能有一个偏移,而第二个猜测,也就是排名第二的,是65。我们在这里看到142,然后是35,然后是40,然后是80,最后是70。我们的前几个猜测都完全符合预期。
我所做的就是在这个图表上为预测器屏幕上显示的每一行画一条蓝线。它们解释的比例就是这里蓝线的粗细。这说明,我认为我们看到了 33 左右的一个值,我认为我们看到了 65 左右的一个值。这很好地发现了平均值在变化过程中的偏移,因为您可以看到这里,有一个点,如果您完全忽略这个点,那么看起来这个值相对于那个值发生了偏移。但我们的肉眼可以捕捉到这一点,其他方法也可以捕捉到这一点,并尝试将其包括在内。但它并没有包含在所有的树中,所以它让我们找到了那个偏移,这很酷。
这能多久才能正常工作?我想知道。我要回到PowerPoint这里。让我们重新开始吧。我模拟了数千个这样的独立数据集。每个数据集都同样嘈杂,有些很容易检测到,有些很难检测到,但总数有数千个。我对每一组数据集运行了预测分析器,并捕获了前10个排名,然后检查你选对了行吗?
这就是我的发现。大多数时候,我们选取的点非常接近或正好位于我们定义的移位点上。极少数情况下,我们会选取位于噪声值超过 100 的点,而我确信这些点不会发生任何变化。看起来效果不错。
我们来看看一些统计数据。这是基于 8,000 个不同的沙箱。到我们进行发现时,这个数字可能会更大。使用预测筛选进行评分时,我们只使用了 100 棵树,我们查看了排名前 10 位的树,我们有一个±3 的窗口。33 个树±3,66 个树±3。它在这个范围内进行筛选吗?对于这两个树,95% 的时间同时位于前 10 位,是的。它发现了 33 个树,90% 的时间在 33 位发生偏移,66 个树,92% 的时间在 33 位发生偏移。它在发现这些树方面做得相当不错,这太棒了。
在这张图中,我试图表达敏感性和特异性的概念。这是在预测筛选中,我们得到前10个排名,也就是前10个因素。我想问的是,它在±3个窗口内,还是±12个窗口内,占比是多少?第一个选择几乎总是被选中。在噪声中,第一个选择,尤其是前五个选择,出现的频率非常低。这是一种非常好、非常灵敏的方法。
结论:首先,在 JMP 中,小偏移检测可以通过多种方法实现,但融合套索方法的理念非常棒。JMP 19 图形生成器中将会有一个小彩蛋,它是其中一项特色功能。我不确定,但 19 版本发布时可以看看。这些高级方法非常简单,因为您只需使用脚本即可生成发现矩阵。无需任何调整,这种融合套索方法就能发挥出色效果。只需一点技巧和大量机会。
有没有一个脚本可以让我自己用?你们会分享那个沙盒工具吗?是的。等Discovery上线的时候,会有一个很棒的插件。你可以选择数据,使用沙盒工具和Explorer工具,进行多种位移检测。另外,我会重新发布Clay用来制作Discovery矩阵的脚本。希望这有用,或者至少有趣。希望在Discovery见到你们。如果你们在走廊里看到我,记得跟我打个招呼。我应该在那里。
待会儿再见。保持警惕。