跳至主要内容

编码方法概览

在本教程中,您将一览多种编码技术,并获得一些进阶参考,帮助您处理分类变量。
· 5分钟 阅读

使用 AI 探索

pencils graphic

“在许多实际的数据科学工作中,数据集都会包含分类变量。这些变量通常以文本值存储”。(Practical Business Python)由于机器学习基于数学方程,如果直接保留分类变量不作处理,就会产生问题。许多算法无需额外处理即可支持分类值,但在这些情况下,是否对变量进行编码仍然值得讨论。对于不支持分类值的算法,就必须采用编码方法。下面来讨论一些方法。

编码方法

标签编码

在标签编码中,我们将每个类别映射为一个数字或标签。为类别选择的标签彼此没有关系。因此,原本存在联系或彼此接近的类别在编码后会丢失这类信息。

频数编码

这是一种将类别出现频数用作标签的方式。在频数与目标变量存在一定关系的情况下,它有助于模型根据数据特性以正比或反比的方式理解并分配权重。

独热编码

在这种方法中,我们将每个类别映射为一个由 1 和 0 组成的向量,分别表示该特征是否存在。向量的数量取决于我们要保留的类别数。对于高基数特征,这种方法会产生大量列,显著降低学习速度。关于独热编码与虚拟变量编码以及何时使用哪一种也常有讨论。两者非常相似,只是独热编码生成的列数等于类别数,而虚拟变量编码则少一列。这最终应由建模者在验证过程中酌情处理。

虚拟变量陷阱:

假设某个分类特征有两个类别。执行独热编码后,会有两列代表该分类特征,但仔细看会发现,仅用一个向量就足以表示这两个取值。比如某个分类特征有两个取值,设为“red”和“blue”。独热编码后会形成两个向量,一个表示“red”,另一个表示“blue”,但仅用一个向量即可学到信息,另一个将是冗余的。因此,我们可以删除其中一个向量,从而减少算法需要训练的数据量。这不仅有助于模型表现更好,也更容易解释模型的工作机制。在真实场景中,我们常常需要处理大量分类特征,有时还掌握它们与结果的先验知识。编码实践既能帮助您应对输入处理,也会让整个流程与学习过程成为一项繁重任务。

目标/影响/似然编码

目标编码与标签编码类似,但这里的标签与目标直接相关。比如,在均值目标编码中,对每个类别,其标签由训练数据上目标变量的均值决定。这种编码方法能体现相似类别之间的关系,但这种关系局限在类别与目标本身之内。均值目标编码的优点是不影响数据体量并有助于更快学习,缺点是更难验证。在实现该编码方法时需要进行正则化。请参阅 python 和 R 中的目标编码器。

编码统计

编码可变性描述了类别内部个体编码的变化。当我们谈及独热编码的可变性时,它取决于实施时机,即决定选择多少对目标有足够影响的类别。其他编码方法也会表现出显著的可变性,这通常在验证阶段被识别出来。

要计算编码可分辨性,我们统计类别的标签,然后计算这些标签的标准差。它显示了编码后类别的可分辨程度,即它们彼此相距较远还是聚集在一起。

请注意,如果在建模过程中选择简单的编码风格,模型往往会产生偏差。为更好地理解,请参阅这则讨论。针对不同模型,您需要选择合适的编码方法,例如回归可以使用均值目标编码;如果是分类,可以选择相对频数编码。

最后,分享一个 scikit-learn 风格的转换器,它通过不同技术帮助对分类变量进行编码。

category_encoders

这个 scikit-learn 库目前提供以下已实现的技术:

  • 序数
  • 独热
  • 二进制
  • Helmert 对比
  • 求和对比
  • 多项式对比
  • 反向差分对比
  • 哈希
  • BaseN
  • LeaveOneOut
  • 目标编码

它支持以 pandas 数据框作为输入并可进行数据转换。它也支持 sklearn 流水线,详情请访问此处。

如果您想进一步学习 scikit-learn,请参加 DataCamp 的Supervised Learning with scikit-learn课程。

主题