特征仓库介绍

特征仓库是机器学习平台重要的组成部分,而上面管理的特征是以数据驱动或者机器学习驱动的公司可以积累的核心资产。感觉网上对这个概念相关的介绍比较少,也不是很全面,这里写一篇文章介绍一下。

在这篇文章中我们不会涉及到具体工具,而是把重点放在要解决什么问题、以及为了解决这个问题需要有什么功能。所以这个更像是一个从产品经理角度出发写的东西,虽然本人是工程师…

为什么要特征仓库

一般来说,在一个完整的机器学习系统中,一个模型并不能搞定所有事情。从原始数据到最终结果,需要很多数据处理步骤。每一步可能是一些人工设计的数据处理过程,也可能是一个机器学习模型。每一步的输出是下一步的输入。这些中间处理产生的数据,称之为特征。

特征仓库为机器学习特征提供开发、管理、上线一条龙服务。

在实际开发中,很难有一个算法工程师从零开始处理所有环节。实际的情况往往是,一个算法工程师一次负责优化其中一个环节,例如尝试新的数据处理方式以生成新的特征,在已有特征上尝试新的模型,或者就是特征的排列组合。整个机器学习链路不断迭代优化。

从这一点来看,一个好的特征仓库对于提高团队和项目的效率至关重要。

那么一个好的特征仓库需要具有哪些功能?

同时支持线上线下场景

特征的开发和上线横跨线上线下场景。

特征开发往往是离线批处理。这个过程中,数据科学家会写一些程序或用一些模型,对已有数据进行处理,生成新的特征;然后基于这些特征训练模型,看模型的效果。结果可能会失败,然后尝试新的方法。如果数据量比较多,会使用一些分布式数据引擎进行处理。

当特征效果比较好,下一步是上线特征。这里按照实时性需求,分成三类:

  1. 批处理。一般对应一天以上的场景。往往是触发一些定时数据处理任务,以周期性的刷新特征。特征刷新的结果往往写入延时性很低的key-value数据库中。
  2. 准实时。一般对应分钟级到小时级。例如一些例如实时推荐的场景中。这种情况下,特征对应的流水线会跑在一个流处理引擎上。这样例如用户的一些行为信息会很快出现在特征仓库中,从而被模型使用到。
  3. 在线。一般是指特征获取。特征往往缓存在一个key-value数据库中,提供低延时的查询。后面一般对接model serving的服务。 从上面三种场景,我们可以看到特征仓库实际上背后需要有不同的存储方案以及不同的数据处理引擎,以覆盖不同业务场景的需求。

特征管理和共享

一个公司数据科学家们经过几年吭哧吭哧开发出很多对业务有用的特征,这些特征是公司的核心资产。当特征越来越多的时候,会带来一些管理问题,例如特征长啥样,它们之间的关系是怎样的。还有对于新来的同事,他们怎么方便的找到需要的特征。

一个好的特征仓库会提供元数据和特征血缘管理,即这个特征有哪些列,每列是什么类型,每列是啥东西,这个上下游是啥,能够让人方便查看。

另一个功能是特征搜索,基于这些元数据,可以提供搜索功能。一个新来的用户就可以方便的找到需要的特征,加快解决自己的业务问题。

数据可视化

在生成特征的时候,特征数据往往有一定的分布规律。数据可视化可以帮助数据科学家更好的看到这些规律,从而加深对数据的理解,设计出更好的特征以提高模型结果的质量。

一个好的特征仓库,应该有一个方便的接口让用户能够做数据可视化分析并存储结果。它还应该提供一个界面方便用户查看分析结果。

特征的时间旅行

数据在源源不断的产生,新的数据往往会带来新的特征,所以特征随着时间移动在不断的增加。在不同的时刻,特征的分布可能也不同。特征仓库应该提供特征的时间旅行功能。即让用户方便的切换不同时间上的数据版本。这一功能主要用在两个方面

  1. 模型可重现。模型可重现是机器学习领域一个越来越重要的要求。它是指一个已有的具有一定效果的机器学习模型能够方便的重新训练出来。模型可重现涉及到数据、超参和模型代码。在数据(特征)上,时间旅行功能是模型可重现的前提条件。
  2. 数据监控。下面会讲。

特征流水线

特征之间的血缘关系组成了一个有向无环图(DAG)。在特征上线之后,定期的或实时的更新特征数据就涉及到了流水线管理。

定期数据更新往往涉及到什么时候触发(定时的或者新的数据到来),下游数据怎么更新。很多ETL Pipeline系统都提供这些功能。

实时的流水线简单一些,一个实时特征上游可能是一个实时特征,也可能是一个离线特征;实时特征下游一定是一个实时特征。实时特征计算往往执行在流式计算引擎上,不同计算步骤之间可以通过消息队列连接。

数据监控

对于机器学习系统,数据漂移是个很头疼的问题。但也是一个实践中往往要面对的问题。

数据漂移是指训练数据分布和线上数据分布不一致。有时候可能是刚上线的时候一致,过一段时间后漂走了变得不一致。

数据漂移解决方案是数据监控。即在训练时计算出一个分布,在模型上线之后,持续不断的计算这个分布。当这个分布出现较大变化的时候,发出报警以及自动触发训练。

我们可以看到,前面的时间旅行功能能够帮助实现这一功能。此外我们还需要一个流水线功能定期或实时刷新这个分布。最后可视化功能能方便我们理解这个分布变化。

总结

我们在这篇文章里介绍了特征仓库是个什么东西,以及它解决了哪些问题。我们可以看到,特征仓库觉得都是机器学习工程化中必然要面对的基本问题,而且和应用领域无关。所以一个好的特征仓库对于机器学习项目会起到非常重要的作用。

特征仓库是一种新的数据平台,底下要用到不同的工具和系统。之后有时间会写一下常用的一些系统。