分类特征,代表着不同的群组或标签,例如‘城市’、‘产品类别’或‘用户类型’,在许多机器学习数据集中很常见。尽管梯度提升等基于树的模型擅长处理数值数据,但分类特征带来了独特的挑战,需要仔细处理。标准的梯度提升实现通常依赖于预处理技术,这些技术可能导致效率低下或偏差,影响模型性能和泛化能力。下面,我们将审视在将分类数据纳入典型梯度提升流程时遇到的主要问题。数值编码方案的局限性树算法本质上是基于数值阈值来拆分节点(例如,特征值 < 阈值)。因此,分类特征必须首先转换为数值格式。然而,常见的编码方法伴随着明显的缺点。独热编码 (OHE)分类特征,代表着如“城市”、“产品类别”或“用户类型”等不同的组或标签,在许多机器学习数据集中普遍存在。虽然梯度提升等基于树的模型擅长处理数值数据,但分类特征带来了独特的障碍,需要仔细考量。标准的梯度提升实现通常依赖于预处理技术,这些技术可能会引入低效或偏差,从而影响模型性能和泛化能力。难题:高基数特征:如果一个分类特征有许多独特的值(高基数),独热编码会导致特征数量急剧增加。例如,对一个包含数千个独立用户ID的‘用户ID’特征进行编码,将创建数千个新的、大部分为零的列。结果:稀疏性:生成的数据集会变得极其稀疏,这对于存储和处理来说可能效率低下。训练速度:XGBoost 和 LightGBM 等算法对稀疏性进行了优化,但维度的纯粹增加仍然会大大减慢训练速度,特别是寻找分割点的过程。树结构:基于独热编码特征构建的树通常变得很深且复杂。每次分割通常只隔离一个类别,可能需要多次分割才能捕获涉及多个类别的情况。这会阻碍模型有效学习有用的模式。标签编码(序数编码)另一种方法是为每个类别分配一个唯一的整数(例如,‘红色’ -> 0,‘绿色’ -> 1,‘蓝色’ -> 2)。难题:人为排序:此方法在类别之间引入了一种任意的序数关系,而这种关系在实际中通常不存在。算法可能会将‘绿色’ (1) 理解为某种程度上介于‘红色’ (0) 和‘蓝色’ (2) 之间,或者将‘蓝色’和‘红色’之间的差异大小 ($2 - 0 = 2$) 解释为‘绿色’和‘红色’之间差异 ($1 - 0 = 1$) 的两倍。结果:基于这些人为数值(例如,color_encoded < 1.5)的树分割通常是无意义的,可能导致模型学习到错误的模式,从而降低预测性能。尽管对于具有天然顺序的类别(如‘低’、‘中’、‘高’)有时可以接受,但它通常不适用于标称特征。目标统计编码的危害为避免独热编码的维度问题和标签编码的人为排序,有时会使用基于目标的编码方法。在这种方法中,每个类别被替换为从属于该类别的样本的目标变量中得出的一个统计量。例如,在回归任务中,‘城市A’这样的类别可以被替换为所有位于‘城市A’的训练样本的平均目标值。难题:目标泄露:这是最主要的风险。通过使用直接源自目标变量的信息来编码特征,我们会在编码特征和目标之间建立起强关联性,这是通过构建实现的。模型在训练期间会学习到这种关系。结果:过拟合:模型在训练数据上表现非常好,因为编码特征包含关于目标的直接线索。然而,当这种泄露不存在时,它无法泛化到新的、未见过的数据。训练期间表面上的性能提升是虚假的。预测漂移:对于训练集中观测样本较少的类别,计算出的目标统计量可能不可靠。此外,类别内目标值的分布在训练数据和未来数据之间可能有所不同,导致编码变得不准确。虽然存在缓解目标泄露的技术,例如使用保留集或应用平滑,但它们增加了复杂性,并且并非总能完全解决问题。处理特征交互现象通常涉及特征之间的交互。例如,‘产品类别’对销售的影响可能取决于‘商店位置’。基于树的模型理论上可以通过在不同特征上进行连续分割来捕获交互。然而,发现高阶交互,特别是通过独热编码的多个分类特征之间的交互,可能需要非常深的树,并且可能无法高效或有效地实现。手动创建交互特征是可行的,但这需要专业知识,并可能导致潜在特征的组合式增长。这些与高基数特征、人为排序、目标泄露以及交互发现相关的挑战,都凸显了在提升算法内部直接处理分类数据需要更高级方法。这种需求促使了 CatBoost 中专门技术的开发,例如有序目标统计和自动特征组合生成,我们将在接下来的部分中对其进行讨论。