%22%3E%3Cpath%20d%3D%22m-369%200h408v79h-408z%22%20fill%3D%22%237933ff%22%2F%3E%3Cpath%20d%3D%22m-148%200h306v45h-306z%22%20fill%3D%22%23974dff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)
%22%2F%3E%3C%2FclipPath%3E%3Cg%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20d%3D%22m76%200h484v36h-484z%22%20fill%3D%22%23974dff%22%2F%3E%3Cpath%20d%3D%22m0%200h384v24h-384z%22%20fill%3D%22%2306bdfc%22%20transform%3D%22matrix(1%200%200%20-1%200%2060)%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)
“在许多实际的数据科学工作中,数据集都会包含分类变量。这些变量通常以文本值存储”。(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课程。
“在许多实际的数据科学工作中,数据集都会包含分类变量。这些变量通常以文本值存储”。(Practical Business Python)由于机器学习基于数学方程,如果直接保留分类变量不作处理,就会产生问题。许多算法无需额外处理即可支持分类值,但在这些情况下,是否对变量进行编码仍然值得讨论。对于不支持分类值的算法,就必须采用编码方法。下面来讨论一些方法。
编码方法
标签编码
在标签编码中,我们将每个类别映射为一个数字或标签。为类别选择的标签彼此没有关系。因此,原本存在联系或彼此接近的类别在编码后会丢失这类信息。
频数编码
这是一种将类别出现频数用作标签的方式。在频数与目标变量存在一定关系的情况下,它有助于模型根据数据特性以正比或反比的方式理解并分配权重。
独热编码
在这种方法中,我们将每个类别映射为一个由 1 和 0 组成的向量,分别表示该特征是否存在。向量的数量取决于我们要保留的类别数。对于高基数特征,这种方法会产生大量列,显著降低学习速度。关于独热编码与虚拟变量编码以及何时使用哪一种也常有讨论。两者非常相似,只是独热编码生成的列数等于类别数,而虚拟变量编码则少一列。这最终应由建模者在验证过程中酌情处理。
虚拟变量陷阱:
假设某个分类特征有两个类别。执行独热编码后,会有两列代表该分类特征,但仔细看会发现,仅用一个向量就足以表示这两个取值。比如某个分类特征有两个取值,设为“red”和“blue”。独热编码后会形成两个向量,一个表示“red”,另一个表示“blue”,但仅用一个向量即可学到信息,另一个将是冗余的。因此,我们可以删除其中一个向量,从而减少算法需要训练的数据量。这不仅有助于模型表现更好,也更容易解释模型的工作机制。在真实场景中,我们常常需要处理大量分类特征,有时还掌握它们与结果的先验知识。编码实践既能帮助您应对输入处理,也会让整个流程与学习过程成为一项繁重任务。
目标/影响/似然编码
目标编码与标签编码类似,但这里的标签与目标直接相关。比如,在均值目标编码中,对每个类别,其标签由训练数据上目标变量的均值决定。这种编码方法能体现相似类别之间的关系,但这种关系局限在类别与目标本身之内。均值目标编码的优点是不影响数据体量并有助于更快学习,缺点是更难验证。在实现该编码方法时需要进行正则化。请参阅 python 和 R 中的目标编码器。
编码统计
编码可变性描述了类别内部个体编码的变化。当我们谈及独热编码的可变性时,它取决于实施时机,即决定选择多少对目标有足够影响的类别。其他编码方法也会表现出显著的可变性,这通常在验证阶段被识别出来。
要计算编码可分辨性,我们统计类别的标签,然后计算这些标签的标准差。它显示了编码后类别的可分辨程度,即它们彼此相距较远还是聚集在一起。
请注意,如果在建模过程中选择简单的编码风格,模型往往会产生偏差。为更好地理解,请参阅这则讨论。针对不同模型,您需要选择合适的编码方法,例如回归可以使用均值目标编码;如果是分类,可以选择相对频数编码。
最后,分享一个 scikit-learn 风格的转换器,它通过不同技术帮助对分类变量进行编码。
category_encoders
这个 scikit-learn 库目前提供以下已实现的技术:
它支持以 pandas 数据框作为输入并可进行数据转换。它也支持 sklearn 流水线,详情请访问此处。
如果您想进一步学习 scikit-learn,请参加 DataCamp 的Supervised Learning with scikit-learn课程。