category_encoders是一个Python库,专门用于将分类变量(如文字、标签)转换为机器学习模型可以处理的数值形式。它是 scikit-learn-contrib 项目的一部分,完全兼容Scikit-learn的API,可以无缝集成到机器学习流程中。本文将围绕该库的核心用法展开详细讲解。
category_encoders的github官方仓库见:category_encoders,category_encoders介绍文档见:category_encoders-docs。
安装方式如下:
pip install category_encoders
- # 查看category_encoders版本import category_encoders as cece.__version__
复制代码 目录
- 1 基础介绍
- 1.1 使用概览
- 1.2 编码方法介绍
- 1.3 编码器选择建议
- 2 代码示例
- 2.1 无监督编码方法(Unsupervised)
- 2.2 有监督编码方法(Supervised)
- 3 参考
1 基础介绍
1.1 使用概览
category_encoders库的核心价值在于它集成了超过20种不同的编码方法,远超Scikit-learn自带的少数几种。其主要特点包括:
- 统一的Scikit-learn API:所有编码器都遵循fit、transform等方法,可以轻松用于管道(Pipeline)和交叉验证。
- 丰富的编码方法:提供了从经典到前沿的各种编码技术,满足不同数据和模型的需求。
- 便捷的列处理:可以指定需要编码的列,或自动识别数据框中的非数值列进行编码。
- 处理未见类别:部分编码器(如TargetEncoder)能够以合理的方式处理在训练集中未出现过的新类别。
那么为什么需要这么多编码,这是因为机器学习模型只能看懂数字看不懂文字,所以得把颜色、城市这些文字类的特征转换成数字,这就是编码;独热编码虽然常用,但只适合类别少、没有顺序的特征,要是遇到几百个城市这种类别多的情况,用独热编码会生成超多列数据,模型计算起来又慢又容易出错,遇到低中高这种有顺序的特征,用独热编码还会丢掉高低顺序的关键信息。所以才需要序数编码、目标编码这些其他方法,它们能压缩数据列数或者保留顺序,让模型算得快还预测得准。
此外,对于深度学习模型,虽然其可以通过嵌入层自动学习类别特征的表示,但在某些场景下,预先使用编码方法将类别特征转换为数值形式,可以简化网络结构并提升训练效率。
所有category_encoders的编码器使用方式如下:- import category_encoders as ceimport pandas as pdimport numpy as np# 创建更简单的数据集 - 使用颜色代替城市np.random.seed(42)data = pd.DataFrame({ 'color': ['红', '蓝', '绿', '红', '蓝', '绿', '红', '蓝'], 'feature1': np.random.randn(8), 'target': [1, 0, 1, 0, 1, 0, 1, 0]})# 手动划分训练集和测试集(前6个训练,后2个测试)X_train = data[['color', 'feature1']].iloc[:6]y_train = data['target'].iloc[:6]X_test = data[['color', 'feature1']].iloc[6:]y_test = data['target'].iloc[6:]print("原始训练数据:")print(X_train)print("\n训练目标:")print(y_train)# 使用OneHot编码(这是类别编码的一种,更直观)encoder = ce.OneHotEncoder(cols=['color'])X_train_encoded = encoder.fit_transform(X_train) # 有监督编码需传入y,无监督可省略yX_test_encoded = encoder.transform(X_test)print("\n编码后的训练数据:")print(X_train_encoded)print("\n编码后的测试数据:")print(X_test_encoded)# 查看编码器学习到的映射关系print("\n编码器学习到的映射:")print(encoder.mapping)
复制代码- 原始训练数据: color feature10 红 0.4967141 蓝 -0.1382642 绿 0.6476893 红 1.5230304 蓝 -0.2341535 绿 -0.234137训练目标:0 11 02 13 04 15 0Name: target, dtype: int64编码后的训练数据: color_1 color_2 color_3 feature10 1 0 0 0.4967141 0 1 0 -0.1382642 0 0 1 0.6476893 1 0 0 1.5230304 0 1 0 -0.2341535 0 0 1 -0.234137编码后的测试数据: color_1 color_2 color_3 feature16 1 0 0 1.5792137 0 1 0 0.767435编码器学习到的映射:[{'col': 'color', 'mapping': color_1 color_2 color_3 1 1 0 0 2 0 1 0 3 0 0 1-1 0 0 0-2 0 0 0}]
复制代码 1.2 编码方法介绍
category_encoders库中的编码器大致可分为两类,可以根据数据是否有目标变量来确定。
无监督编码方法
这类方法不依赖于目标变量(预测值),仅根据特征自身的分布或属性进行转换。
- Backward Difference Contrast
- 编码方法:将有序分类变量的每个级别(除第一个外)与其前一个级别的均值进行比较和编码。
- 核心特点:适用于分析相邻级别间的变化趋势,常见于方差分析等统计模型。
- BaseN
- 编码方法:将整数类别ID转换为自定义进制(如二进制、三进制)的数值表示。
- 核心特点:提供灵活的数值转换,但通常不是特征工程的首选,效率有限。
- Binary
- 编码方法:先将类别转换为有序整数,再将该整数转换为二进制数,并将每一位作为独立的二元特征。
- 核心特点:能高效压缩维度,在类别数量极多时,比独热编码节省大量特征空间。
- Gray
- 编码方法:与二进制编码类似,但使用格雷码(循环码)进行转换,保证相邻数值间仅一位不同。
- 核心特点:编码后的相邻类别具有最小的特征差异,对某些算法可能更稳定。
- Count
- 编码方法:使用该类别在数据集中出现的次数(频数)作为其编码值。
- 核心特点:简单快速,能反映类别的普遍性或常见度,但会丢失类别本身的区分信息。
- Hashing
- 编码方法:应用哈希函数将类别字符串映射到一个固定大小的、低维度的特征向量中。
- 核心特点:内存消耗恒定,非常适合在线学习或超高基数特征,但存在哈希冲突导致信息损失的风险。
- Helmert Contrast
- 编码方法:将有序分类变量的某个级别,与其之后所有级别的均值进行比较和编码。
- 核心特点:用于统计模型,分析特定水平与后续整体平均水平之间的差异。
- Ordinal
- 编码方法:根据明确的顺序(如大小、等级),为有序分类变量分配连续的整数。
- 核心特点:简单且保留了顺序信息,但隐含了“类别间隔相等”的假设,可能引入误导。
- One-Hot
- 编码方法:为每一个类别创建一个新的二元特征(列),样本属于该类别则标记为1,否则为0。
- 核心特点:彻底消除类别间的虚假顺序关系,但类别多时会导致特征稀疏和维度灾难。
- Rank Hot
- 编码方法:先为有序分类变量按明确顺序分配排名,再对排名执行独热编码(对应排名标1,其余为0),可优化为Top-K策略(仅编码核心排名)。
- 核心特点:兼具顺序保留与无虚假间隔优势,灵活控维度;适用于中等类别数有序变量,类别过多易稀疏。
- Polynomial Contrast
- 编码方法:将有序分类变量的级别转换为正交多项式(如线性、二次、三次)的系数。
- 核心特点:用于检测和拟合目标变量与有序分类变量之间可能存在的多项式趋势(如曲线关系)。
- Sum Contrast
- 编码方法:将每个类别的效应编码为与所有类别整体均值的偏差。
- 核心特点:在回归模型中,使得截距项代表全局响应均值,系数易于解释为与全局均值的偏离。
有监督编码方法
这类方法在编码过程中利用了目标变量的信息,旨在将类别信息与预测目标更紧密地联系起来。
- CatBoost Encoding
- 编码方法:一种基于目标变量统计(如均值)的编码,通过引入样本的随机排列顺序,并在计算中排除当前样本的值来防止目标泄露。
- 核心特点:专为CatBoost设计,能有效防止过拟合,且可直接应用于其他树模型,无需额外验证策略。
- Generalized Linear Mixed Model
- 编码方法:将类别变量视为随机效应,使用广义线性混合模型估计其对目标的效应值,以此作为编码。
- 核心特点:特别适用于具有层次结构、重复测量或存在组内相关性的数据。
- James-Stein Estimator
- 编码方法:将每个类别的目标统计量(如均值)向整体均值进行收缩,收缩强度取决于该类别的样本量。
- 核心特点:通过方差缩减来优化估计,尤其能提升小样本类别编码值的稳健性和可靠性。
- LeaveOneOut
- 编码方法:对于当前样本,计算其所属类别中所有其他样本的目标统计量(如均值)作为编码值。
- 核心特点:最直接的防止目标泄露方法之一,但计算量较大,且对相同类别样本的编码值不完全相同。
- M-estimator
- 编码方法:计算目标均值与一个先验值(如全局均值)的加权平均。权重由类别样本量决定,样本量大的类别更依赖自身均值。
- 核心特点:对简单的目标均值编码进行平滑,有效减少因小类别样本量不足而引入的噪声和过拟合。
- Target Encoding / Mean Encoding
- 编码方法:使用该类别的目标变量均值(回归)或正类比例(分类)来替换类别标签。
- 核心特点:将类别信息与预测目标强关联,效果显著,但必须配合严格的交叉验证或平滑使用,否则极易导致数据泄露和过拟合。
- Weight of Evidence
- 编码方法:主要用于二分类,计算 ln((好样本比例) / (坏样本比例)) 作为编码值。
- 核心特点:直接衡量该类别对区分“好”、“坏”事件的预测能力,在金融风控等领域应用广泛,解释性强。
- Quantile Encoder
- 编码方法:不使用目标均值,而是使用目标变量在该类别下的特定分位数(如中位数、第25分位数)进行编码。
- 核心特点:对异常值不敏感,能捕捉类别内目标值的分布位置信息,比单一均值提供更稳健的编码。
- Summary Encoder
- 编码方法:为目标变量在每个类别下的分布计算多个统计量(如均值、标准差、分位数、偏度等),生成一组特征。
- 核心特点:提供关于类别与目标关系的全景视图,能更丰富地描述数据分布形态,但特征维度会增加。
重要提示:本文仅介绍category_encoders库中各种编码方法的基本使用和适用场景,关于每种编码方法的详细数学原理和统计理论,需要进一步自行查阅相关学术资料和官方文档进行深入学习。
1.3 编码器选择建议
<ul>无监督编码:无目标变量时使用
<ul>标准首选:One-Hot(类别少, |