在最近一期的《技术演讲》中,我们了解了如何将从文本挖掘中得出的变量合并到预测模型中,以提高模型性能。 (如果您还没有观看演示文稿,您可能需要在继续阅读之前先观看一下。)该案例研究更多地关注文本挖掘而不是预测建模,因此现在让我们看一下未讨论的两个主要建模步骤:即,验证模型并对新观察结果进行评分。
模型验证
在预测建模中,在使用模型生成预测之前测试模型的准确性至关重要。 我们希望确保我们的模型不会“过度拟合”,准确地捕获它所训练的数据,但会对它以前从未见过的数据生成不准确的预测。 一个捕捉过度拟合概念的伟大模因已经在互联网上流传了一段时间。

检查过度拟合的一种方法是留出或“保留”数据的子集,在剩余数据上训练模型,然后在保留集上测试模型。 我们在训练数据和保留数据上测量模型的预测性能,如果我们看到训练集到测试集的准确性大幅下降,我们就有证据表明我们的模型过度拟合。
我们在案例研究中构建 Bootstrap Forest 模型时实际上使用了这种保留验证程序,尽管我们掩盖了它。 下面是验证过程中的模型拟合测量表。 联合管理计划提供了许多用于比较训练集和测试集性能的衡量标准(如果您好奇,请阅读它们这里);我们在演示中看到了测试组的熵 R 方和错误分类率。 没有一项指标显示从训练到测试的性能急剧下降(尽管有几个指标略有下降,这并不罕见),因此我们得出的结论是我们的模型没有过度拟合。

您可能会注意到一些事情:该表中也有一个“验证”列。 那是关于什么的? 实际上,我们将数据分为三个子集:训练、验证和测试。 在我们的 Bootstrap Forest 模型中,训练集用于查找每个决策树中的最佳分割,而验证集用于决定何时停止在每棵树中进行新的分割以及何时停止创建新树。 也就是说,只要每个新的分割或树都会提高验证集的性能,模型拟合算法就会继续下去。 一旦验证集的性能趋于稳定,算法就会停止。 (还记得熵 R 方统计量吗? 这是此过程中使用的验证统计数据。)算法停止后,将使用测试集评估生成的模型的准确性。 在JMP专业版,所有这一切都是通过在模型规范窗口中指定验证列来自动发生的,如您所见演示文稿。
并非所有模型都需要这样的三部分验证。 只有使用迭代拟合过程和单独的数据子集(验证集)的模型才需要决定何时停止拟合。 对于不涉及迭代拟合过程的模型(例如我们可以在此处使用的逻辑回归),仅需要训练和测试集。
JMP Pro 有一种简单的方法来划分数据以进行模型验证。 我们使用“创建验证列”实用程序,该实用程序对数据执行随机或伪随机采样(无替换)来创建每个子集,并将子集记录在数据表中的“验证列”中。

在这里,我们使用分层随机抽样来创建子集,这在第二个屏幕截图顶部的段落中进行了解释。 我们的一些分类变量存在严重不平衡,我们希望避免这样的情况,例如,测试集中很少或根本没有严重违规行为。 这会产生问题,因为我们需要了解模型在严重违规情况下的表现,才能有效衡量模型的准确性。
您可以在下面的交互式分布报告中看到,我们在三个数据子集中的每个分层列都有匹配的表示。 有了近 40k 行的数据,如果不使用分层,我们很有可能会没事,但为了安全起见,这并不是一个坏主意。 分层是 Make Validation Column 实用程序可以实现的几种不同的伪随机采样过程之一(请参阅这里了解更多)。

Make Validation Column 实用程序将名为“Validation”的列放回到我们的数据表中(可在技术演讲演示页面上下载),然后我们将其输入 Bootstrap Forest 平台以触发验证过程。 我们没有发现过度拟合的证据,因此假设我们对模型的整体准确性感到满意,我们准备使用它来生成新观察结果的预测(“评分”)。
对新观察结果进行评分
想象一下,我们刚刚发布了一组违反建筑规范的行为,我们希望为每一个行为分配一个财务处罚概率,我们将用它来衡量财务预测中每项征收的罚款金额。 例如,如果处罚概率为 0.7 的违规行为被处以 1,000 美元的罚款,则预计将支付 700 美元。 当然,被调查者最终将支付 1,000 美元或 0 美元,但平均而言,在许多违规行为中,我们的预测总和应接近我们的最终收入(我们希望)。 我们从 Bootstrap Forest 模型中获得惩罚概率,但该模型将主题分析的分数作为输入。 因此,我们需要通过这两种模型来运行新的违规行为。 使用一个模型的输出作为另一个模型的输入,这并不是一种罕见的做法。
联合管理计划可以将模型作为列公式输出回原始数据表(在建模平台中的红色三角形选项下),并且它们将在我们添加到表中的任何新数据上运行。 为了对新的观察结果进行评分,我们只需将新的违规行为添加到表中,主题分数和惩罚概率将通过列公式自动计算。 然后,我们创建一个新的列公式,将罚款概率乘以征收的罚款金额,然后我们就得到了预计的付款。 下面是我们对 1,000 起新违规行为的预测。 我们预计这些将为我们带来约 184 万美元的收入,尽管这一总额的大约三分之一仅由该正尾中最大的 100 笔预计付款所占。 我们预测的准确性在很大程度上取决于这些违规行为所发生的情况。
(顺便说一句:我们已经描述了对观察进行评分的点击方式,但是可以通过 JSL(JMP 脚本语言)中的脚本轻松实现评分自动化。 该模型还可以使用 Python 或 JavaScript 等语言部署在 JMP 之外,并且 JMP Pro 能够用其他语言编写评分代码。)
这凸显了也许是最重要的问题:我们的预测到底有多好? 我们有像熵 R 方这样的拟合统计数据来捕获模型性能,但是我们真的关心的是财务预测的准确性。 在实践中,我们会通过为我们的测试集生成收入预测并将其与我们观察到的实际收入进行比较,将其作为模型构建阶段的一部分进行评估。 我们在这里没有这样做,因为不幸的是,可用数据不包含最初征收的罚款金额,只包含裁决后的最终金额。 (在上面的评分示例中,我们只是出于说明目的想象了一些最初征收的罚款金额。)
离别的思念
虽然我们已经实现了目标——一个为新违规行为分配经济处罚概率的模型——但这样的项目从未真正完成。 随着时间的推移,新的违法行为类型或趋势可能会出现,新的政策可能会改变违法行为特征与罚款支付之间的关系,或者由于执法能力或宽大处理等不可衡量的因素,罚款支付概率可能会随着时间的推移而发生变化。 下图中随时间变化的趋势可能表明是后者。 (线宽代表每年的违规总数,这清楚地表明我们没有足够的 2020 年数据来相信今年的突然上升。)

由于许多可能的原因,随着时间的推移,我们的模型可能会变得不太准确。 我们应该定期重新调整我们的主题分析和引导森林模型,纳入最新的数据(也许会丢弃旧的数据),以确保我们的预测保持准确。
谢谢, @Swalo66 。我很高兴您发现它有帮助。