更智能模型的秘诀-跟踪特征历史

更智能模型的秘诀:跟踪特征历史

towardsdatascience.com/the-key-to-smarter-models-tracking-feature-histories-a9e3baadd52a/

我最近在数据科学领域的工作中稍微转向了一个更侧重于工程的角色。我的团队正在构建一个高质量的数据仓库,以满足组织的 BI 和 ML 需求。我接受这个职位是因为我认为这是一个利用我从数据科学角色中获得见解来影响具有前瞻性数据仓库设计和开发的机会。

在过去 6 年中我从事的几乎每一个数据科学角色中,我注意到一个共同的主题——数据基础设施没有考虑到数据科学的需求。数据仓库/数据湖中的许多表,通常是事实和维度,缺乏构建高性能机器学习模型所需的临界字段或结构。我注意到最普遍的局限性是,大多数表只跟踪观察的当前状态,而不是历史状态。

本文探讨了这个问题,并展示了如何通过一种称为“缓慢变化维度”的数据建模技术来解决它。到那时,你将了解存储历史数据对模型性能的影响,并拥有帮助你在用例中实施此技术的策略。

数据科学家的一个常见诅咒

如果你长期从事数据科学家或机器学习工程师的工作,你很可能遇到过以下建模问题。对于你数据中的每个实例,你希望建模某个事件随时间发生的概率:

在每个时间步建模事件发生概率的表示法。图片由作者提供。

在每个时间步建模事件发生概率的表示法。图片由作者提供。

这种建模范式,通常被称为面板建模,无处不在。任何特征与时间交互的建模问题都可以,并且通常应该以这种方式建模。常见例子包括客户流失预测、贷款违约预测、疾病进展监测、欺诈检测、设备故障预测等等。

更正式地,你可以用以下符号描述这个问题:

面板机器学习模型的表示法。图片由作者提供。

面板机器学习模型的表示法。图片由作者提供。

以贷款违约预测为例。通用的目标是预测每个时间周期(t)内个人是否会违约(Y),这是基于随时间变化的借款人特征(X)。对于一个特定的借款人,你的模型预测可能看起来像这样:

借款人随时间预测的贷款违约概率。图片由作者提供。

随着时间的推移,对借款人预测的贷款违约概率。图片由作者提供。

在这个图中,t = 0 是贷款发放周,t = 100 是贷款到期时。对于这个例子,模型预测随着贷款接近完成,借款人的违约概率会降低,但这并不总是如此,这取决于个人的信用状况和其他相关特征。

为了为这个模型创建特征,你可能会依赖你数据仓库中的几个事实和维度表。例如,许多特征可能来自记录借款人属性的dim_borrower维度表。在许多在其生命周期后期采用机器学习项目的组织中,dim_borrower表看起来是这样的:

一个典型的借款人维度表。图片由作者提供。

一个典型的借款人维度表。图片由作者提供。

dim_borrower表中的每一行记录了一个由borrower_key唯一标识的借款人的属性。例如,借款人 153443 目前的 FICO 分数为 567,收入为$55,123,DTI 比率为 0.25。created_datetime_utc是记录创建的时间,updated_datetime_utc是记录最后更新的时间。

这些类型维度表的问题在于它们不记录历史。在上面的例子中,你不知道在2024–04–19记录创建时,借款人 153443 的 FICO、收入和 DTI 比率是多少。你也不知道记录被更新了多少次或哪些特征被更新了。你所知道的就是借款人的当前特征、记录创建的时间以及最近一次更新的时间。

如果你使用借款人 153443 的数据构建一个面板训练集,它可能看起来像这样:

一个示例面板训练集,其中包含一个借款人的数据,这些数据来自一个不记录历史的维度表。图片由作者提供。

一个示例面板训练集,其中包含一个借款人的数据,这些数据来自一个不记录历史的维度表。图片由作者提供。

这组训练数据的问题在于,直到weeks_to_completion = 0,即你拥有借款人特征的最新记录时,它可能是不正确的。实际上,借款人数据的记录可能看起来更像是这样:

借款人面板训练集应有的样子。图片由作者提供。

借款人面板训练集应有的样子。图片由作者提供。

这份数据与应用于借款人历史记录的最近特征的原始训练数据讲述了一个不同的故事。你可以看到,借款人的 FICO 评分从第 20 周降至第 11 周,其 DTI 比率从 0.018(几乎无债务)增至 0.25。这些变化表明,借款人在这些周内积累了更多的外部债务,其信用状况恶化。基于这个数据集训练的模型将远远优于基于没有保留借款人特征历史记录的数据集训练的模型。

现在你已经了解了不跟踪历史记录的表格的问题,你将探索解决这个问题的最佳和最受欢迎的方法之一——缓慢变化维度。

解决方案:缓慢变化维度

跟踪维度历史记录的最佳和最受欢迎的方法之一是通过一种称为缓慢变化维度(SCD)的数据建模范式。SCD 正如其名——一个相对稳定的维度,随着时间的推移(缓慢)发生变化。有四种类型的 SCD,但最常见的是 SCD 类型 II。

贷款借款人维度是完美的 SCD 候选者。在 SCD 范式下,像这样的标准维度表:

一个典型的借款人维度表。图片由作者提供。

一个典型的借款人维度表。图片由作者提供。

变成这样:

一个 SCD 类型 II 的借款人维度表。图片由作者提供。

一个 SCD 类型 II 的借款人维度表。图片由作者提供。

在这个借款人 SCD 中,每一行代表借款人在由start_datetime_utcend_datetime_utc定义的时间间隔内的属性。例如,从大约 2024-04-27 到 2024-06-09,借款人 153443 的 FICO 评分为 567,收入为 55,123 美元,DTI 比率为 0.25。每个借款人的当前状态记录在is_current = 1 或等价于end_datetime_utc为 null 时。因此,只有当is_current = 1 时,borrower_key才是唯一的。

考虑使用 SCD 数据对您的机器学习模型的影响。如果您用于创建机器学习模型数据集的所有表都是 SCD 或事实表,您可以使用一个准确反映特征值随时间变化如何影响目标的最优模型进行训练。

你可以轻松地将 SCD 转换为创建模型所需的面板视图。回想一下前一小节中借款人 153443 的例子:

一个示例面板训练集,包含一个借款人的数据,这些数据来自 SCD 表。图片由作者提供。

一个示例面板训练集,包含一个借款人的数据,这些数据来自 SCD 表。图片由作者提供。

从训练数据的角度来看,dti_ratio特征随时间的变化看起来是这样的:

非 SCD 训练集和 SCD 训练集的 DTI 比率与贷款发放周数对比图。图片由作者提供。

非 SCD 训练集和 SCD 训练集的 DTI 比率与贷款发放以来周数对比图。图片由作者提供。

使用标准维度数据训练的模型无法看到 DTI 比率随时间的变化,也无法准确模拟 DTI 比率的变动如何影响贷款违约的概率。相反,使用 SCD 数据训练的模型可以完全了解借款人 DTI 比率的整个历史,并将其纳入其预测中。

在生产环境中,如果你比较两个模型对同一借款人的预测,你可能会得到截然不同的结果:

使用在非 SCD 数据上训练的模型(蓝色)和在 SCD 数据上训练的模型(橙色)对同一借款人进行预测的模型预测。图片由作者提供。

使用在非 SCD 数据上训练的模型(蓝色)和在 SCD 数据上训练的模型(橙色)对同一借款人进行预测的模型预测。图片由作者提供。

在推理时间,仅使用标准维度数据训练的模型只知道借款人的当前特征值。对于借款人 153443 的情况,这个模型只能看到贷款余额随时间减少或保持不变。因此,除非借款人的特征值移动到训练数据中表示违约的极端范围,否则预测的违约概率将随着时间的推移稳步下降。

另一方面,在 SCD 数据上训练的模型观察到借款人的 FICO 评分下降,他们的 DTI 比率上升。因此,随着时间的推移,借款人风险增加,违约预测概率也随之上升。

你可能可以想象出更多的情况,其中 SCD 或一般跟踪完整历史的表格会很有用。为了总结这篇文章,你将获得一些关于如何在你的组织中开始使用 SCD 的技巧。

行动呼吁

根据你的角色,你可以倡导使用 SCD 或其他历史跟踪表格来提高你组织中机器学习模型的质量。

数据工程师

如果你是一名数据工程师,你可能在你的数据仓库/湖仓的设计中至少有一些话语权。如果你不确定一个表格是否应该跟踪历史,默认情况下,它可能应该这样做。虽然实施 SCD 需要更复杂的 ETL,但考虑到它带来的价值,通常这项工作是非常值得的。

你最可能遇到的反对意见是存储成本的增加,但大多数现代数据平台由于列式存储格式,存储成本都很低。

数据科学家/ML 工程师

作为数据科学家/ML 工程师,你可能对数据仓库/湖仓的设计话语权较少,特别是如果机器学习模型不是你组织数据的首要消费者。尽你所能倡导跟踪历史的表格。

如果你无法影响你消费的上游表,开始在你特征存储或为你的模型提供数据的数据集中跟踪历史。可能需要一段时间你才能利用你收集到的历史数据,但尽早开始会更好。

产品经理

可能影响创建历史跟踪表的最佳方式是将它们作为产品需求。机器学习模型的优劣取决于其训练数据,而使用无历史数据的模型永远无法达到其全部潜力。为了构建最高质量的机器学习产品,你需要最高质量的数据,而跟踪历史的数据集对于高质量模型是基础。

最后的想法

跟踪特征历史是构建更智能机器学习模型的必备条件。通过将历史数据纳入你的数据集,你捕捉到了上下文和时序动态,从而提高了预测准确性和模型的鲁棒性。

采用历史数据跟踪确实会带来一些挑战,例如增加存储需求和更复杂的 ETL 流程。然而,在模型性能和洞察力方面的回报远远超过了这些成本。对于数据工程师、数据科学家和产品经理来说,将历史跟踪作为一项基本原则可以提升你们组织的数据基础设施和机器学习能力。

如果需要,从小处着手——倡导在关键表中进行变更,将历史跟踪集成到特征存储中,或将 SCD 纳入新的数据管道。历史数据的价值随着时间的推移而增长,你开始得越早,你的模型就越能定位到提供可操作、上下文感知的预测。

通过关注特征历史,你不仅是在构建更好的模型,你还在为更深入洞察和未来准备的数据生态系统打下基础。

成为会员:harrisonfhoffman.medium.com/membership

参考文献

  1. _ 缓慢变化维度 – en.wikipedia.org/wiki/Slowly_changing_dimension_
posted @ 2026-03-27 10:27  布客飞龙III  阅读(12)  评论(0)    收藏  举报