别只会One-Hot了!20种分类编码技巧让你的特征工程更专业

简介: 分类变量需编码为数字才能被模型处理。本文详解20种编码方法,从基础的独热、序数编码到高级的目标编码、CatBoost、WOE等,涵盖适用场景与代码示例,助你提升模型性能,避免泄露与过拟合,是特征工程中不可或缺的实用指南。

机器学习模型处理不了原始文本。无论是线性回归、XGBoost还是神经网络,遇到

"red"

"medium"

"CA"

这类分类变量都没法直接处理。所以必须把它们转成数字这个过程就是分类编码。

大家入门时肯定都学过独热编码或序数编码,但编码方法其实非常多。目标编码、CatBoost编码、James-Stein编码这些高级技术,用对了能给模型带来质的飞跃,尤其面对高基数特征的时候。

编码到底有多重要

"Toyota"

举例,它本身没有数值含义,但模型只认数字:

 {"Toyota": 0, "Ford": 1, "Honda": 2}

或者写成向量形式:

 [0, 1, 0]

更高级的做法是直接编码成目标相关的数值:

 Toyota → +0.12 mean adjusted uplift in target

编码方式选得好不好,直接影响模型准确率、可解释性、过拟合程度、训练速度、内存占用,还有对稀有类别的处理能力。

示例代码准备

后面所有例子都基于这个简单数据集:

 import pandas as pd  
from sklearn.model_selection import train_test_split  
import category_encoders as ce  
from sklearn.linear_model import LogisticRegression  

df = pd.DataFrame({  
    "color": ["red", "blue", "green", "green", "blue", "red"],  
    "city": ["NY", "LA", "NY", "SF", "LA", "NY"],  
    "target": [1, 0, 1, 0, 0, 1]  
})  
X = df.drop("target", axis=1)  
 y = df["target"]

1、序数编码 Ordinal Encoding

最简单粗暴的方法,给每个类别分配一个整数。red是0,blue是1,green是2。

XGBoost、LightGBM这类树模型用这个就够了。另外当类别本身有顺序含义(比如small/medium/large)时也很合适。

 encoder=ce.OrdinalEncoder(cols=["color"])  
 X_trans=encoder.fit_transform(X, y)

2、独热编码 One-Hot Encoding

每个类别单独开一列,是就标1,不是就标0。

线性回归、逻辑回归、神经网络经常用这个。不过类别太多的话列数会爆炸,低基数特征才适合。

 encoder=ce.OneHotEncoder(cols=["color"], use_cat_names=True)  
 X_trans=encoder.fit_transform(X)

3、 二进制编码 Binary Encoding

把类别索引转成二进制。比如索引5变成101,拆成三列。

这个方法在类别数量中等偏多(50-500个)的时候很好使,既保持了稀疏性又比独热编码省内存。

 encoder=ce.BinaryEncoder(cols=["city"])  
 X_trans=encoder.fit_transform(X)

4、Base-N编码

二进制编码的泛化版本,可以用任意进制。base=3时,索引5就变成

"12"

。想精细控制输出维度的话可以试试。

 encoder=ce.BaseNEncoder(cols=["city"], base=3)  
 X_trans=encoder.fit_transform(X)

5、哈希编码 Hashing Encoding

用哈希函数把类别映射到固定数量的列上。速度极快,输出宽度固定,也不用存储类别映射表。

缺点就是:会有哈希冲突而且结果不可解释。

 encoder=ce.HashingEncoder(cols=["city"], n_components=8)  
 X_trans=encoder.fit_transform(X)

6、Helmert编码

正交对比编码的一种,每个类别跟它后面所有类别的均值做比较。统计建模和分类对比回归分析会用到。

 encoder=ce.HelmertEncoder(cols=["color"])  
 X_trans=encoder.fit_transform(X, y)

7、求和编码 Sum Encoding

也叫偏差编码。每个类别跟总体均值比较,而不是跟某个基准类别比。

 encoder=ce.SumEncoder(cols=["color"])  
 X_trans=encoder.fit_transform(X, y)

8、多项式编码 Polynomial Encoding

给有序类别生成线性、二次、三次对比项。如果怀疑类别对目标有非线性影响,可以考虑这个。

 encoder=ce.PolynomialEncoder(cols=["color"])  
 X_trans=encoder.fit_transform(X, y)

9、向后差分编码 Backward Difference Encoding

每个类别跟前面所有类别的均值比较,跟Helmert正好相反。

 encoder=ce.BackwardDifferenceEncoder(cols=["color"])  
 X_trans=encoder.fit_transform(X, y)

10、计数编码 Count Encoding

直接用类别出现的次数替换类别值。

高基数特征用这个效果不错,计算快、结果稳定。只要在训练集上fit就不会有数据泄露问题。

 encoder=ce.CountEncoder(cols=["city"])  
 X_trans=encoder.fit_transform(X)

11. 目标编码 Target Encoding

把每个类别替换成该类别下目标变量的均值。

威力很大但有个坑,就是容易造成目标泄露。必须配合平滑处理或者用交叉验证的方式来做。

encoder = ce.TargetEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X, y)

12、CatBoost编码

CatBoost编码是目标编码的改良版。编码每一行时只用它前面的行来计算,这样就大大降低了泄露风险。

这是目前最安全的目标编码方案,高基数特征、时序数据都能用,效果很稳。

encoder = ce.CatBoostEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X, y)

13、留一法编码 Leave-One-Out Encoding

计算类别的目标均值时把当前行排除掉。既保留了目标编码的效果,又减轻了泄露。

encoder = ce.LeaveOneOutEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X, y)

14、M估计编码 M-Estimate Encoding

用贝叶斯思想对目标编码做平滑。

高基数和噪声目标场景下表现不错。

encoder = ce.MEstimateEncoder(cols=["city"], m=5)  
X_trans = encoder.fit_transform(X, y)

15、WOE证据权重编码

这是信用评分领域的老朋友了。

逻辑回归配WOE是经典组合,可解释性很强。

encoder = ce.WOEEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X, y)

16、James-Stein编码

基于James-Stein估计的收缩编码器。能有效降低方差,做分类变量回归时效果很好。

encoder = ce.JamesSteinEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X, y)

17、GLMM编码

用广义线性混合模型来编码。处理层次结构数据或者类别组很大的时候可以一试。

encoder = ce.GLMMEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X, y)

18、分位数编码 Quantile Encoding

不用均值,用目标分布的分位数来编码。

encoder = ce.QuantileEncoder(cols=["city"], quantile=0.5)  
X_trans = encoder.fit_transform(X, y)

19、RankHot编码

独热编码的变体,列按类别频率排序。对树模型友好。

encoder = ce.RankHotEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X)

20、格雷编码 Gray Encoding

用格雷码表示类别,相邻编码只差一位。

encoder = ce.GrayEncoder(cols=["city"])  
X_trans = encoder.fit_transform(X)

怎么选编码器

低基数(<10个类别):独热、二进制、序数都行。统计模型的话可以试试求和、Helmert、多项式编码。

中等基数(10-100):二进制、BaseN、CatBoost、带平滑的目标编码。

高基数(100-50000):计数编码、CatBoost编码(首选)、留一法、M估计、带交叉验证的目标编码,内存紧张就用哈希编码。

常见的坑

目标编码泄露:用CatBoost编码、交叉验证或留一法来规避。

树模型误读序数整数:树模型可能会把序数编码的数字当连续变量处理,换成独热或目标编码更稳妥。

独热编码维度爆炸:类别太多就别用独热了,换二进制、BaseN或哈希。

稀有类别噪声:M估计、James-Stein或目标平滑能缓解这个问题。

总结

分类编码是特征工程里最容易被忽视却又最能出效果的环节。scikit-learn自带的编码器只是冰山一角,

category_encoders

这个库才是真正的百宝箱:统计编码、贝叶斯编码、哈希编码、对比编码应有尽有,用好了模型效果能上一个台阶。

https://avoid.overfit.cn/post/899f24e435ac4733ac4b981a0b3629f4
作者:Abish Pius

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 测试技术
DeepSeek-R1 与 OpenAI o3 的启示:Test-Time Compute 技术不再迷信参数堆叠
2025年,AI告别“参数内卷”,迎来Test-Time Compute范式革命。模型不再依赖训练时的“烘焙”智能,而是通过推理阶段的思考、验证与优化,在数学、逻辑等任务中实现质的飞跃。DeepSeek-R1与OpenAI o3证明:让小模型“多想一会儿”,效果远超盲目堆参数。Best-of-N+验证机制让普通开发者也能复现高精度推理,算力成本可控。未来AI产品核心不再是模型大小,而是可配置的“Inference Budget”。
58 14
DeepSeek-R1 与 OpenAI o3 的启示:Test-Time Compute 技术不再迷信参数堆叠
|
19天前
|
缓存 运维 监控
一次内存诊断,让资源利用率提升 40%:揭秘隐式内存治理
阿里云云监控 2.0 推出 SysOM 底层操作系统诊断能力,基于 eBPF + BTF 协同分析,无需侵入业务,即可一键完成从物理页到文件路径、再到容器进程的全栈内存归因,让“黑盒内存”无所遁形。
462 75
|
10天前
|
数据采集 弹性计算 供应链
包年包月、按量付费和抢占式实例有什么区别?阿里云ECS付费类型如何选择?
阿里云ECS提供三种付费模式:包年包月适合长期稳定使用,价格优惠且支持备案;按量付费按小时计费,灵活但成本较高,适合短期或突发业务;抢占式实例价格低至1折,但可能被释放,仅推荐用于无状态应用。根据业务需求选择合适模式可优化成本与稳定性。
65 20
|
6天前
|
存储 缓存 并行计算
LMCache:基于KV缓存复用的LLM推理优化方案
LMCache推出KV缓存持久化方案,显著优化大模型推理首Token延迟(TTFT)。通过将KV缓存存储至GPU、CPU或磁盘,实现跨请求复用,支持任意位置文本匹配,与vLLM深度集成,多轮对话、RAG场景提速3-10倍,降低硬件压力,提升吞吐。开源支持Linux/NVIDIA,正拓展AMD及更多生态支持。
88 14
LMCache:基于KV缓存复用的LLM推理优化方案
|
13天前
|
存储 人工智能 算法
多模态融合 AI 视频识别技术:高精度合规
基于亚裔优化算法,融合多模态识别与本地加密部署,实现99.5%高精度识别与0.5%低误识率,支持复杂环境稳定运行。构建端到端安全防护,满足GDPR合规,集成生物识别与RFID双因子验证,实现毫秒级响应、10秒内预警处置,打造“识别-预警-追溯-整改”闭环管理,全面提升智能管控效率与安全性。
114 14
|
19天前
|
存储 机器学习/深度学习 弹性计算
阿里云8核16g服务器能容纳多少人?性能配置够用吗?
阿里云8核16G服务器适合中小型企业应用,如网站、APP、SAAS系统等。静态网站可支持上万并发,动态网站或轻量应用可达5000-1万并发。游戏、高并发电商等场景需优化或集群部署。具体承载人数因业务而异,性能足够日常使用,支持弹性扩展。
159 15
|
20天前
|
供应链 数据可视化 Java
云端SaaS诊所管理系统(java源码),实现挂号、开方、收费、发药全流程管理
云诊所SaaS系统,集患者管理、预约挂号、电子处方、智能诊断、药房进销存、财务统计于一体,支持模板调用、库存预警、多支付方式,实现诊疗全流程数字化管理,提升基层医疗效率。
104 13
|
4天前
|
人工智能 弹性计算 应用服务中间件
阿里云搭建网站收费标准:自建网站、云小智AI建站和云企业官网价格更新
阿里云建站三种方案:1)自购服务器,38元起/年,适合有技术者;2)万小智AI建站,698元起/年,送CN域名,零基础可操作;3)云企业官网,5480元起/年,定制设计,适合中大型企业。按需选择,性价比高。
|
4天前
|
机器学习/深度学习 并行计算 文件存储
机器学习超参数调优:十个实用的贝叶斯优化(Bayesian Optimization)进阶技巧
贝叶斯优化虽强大,但直接使用常面临收敛慢、计算贵等问题。本文总结十大实战技巧:引入先验加速冷启动,动态调整采集函数打破平台期,对数变换处理量级差异,避免超-超参数过拟合,成本感知抑制资源浪费,混合随机搜索提升鲁棒性,并行化利用多GPU,正确编码类别变量,约束无效区域,以及集成代理模型降方差。结合这些策略,让BO更智能、高效,真正发挥超参调优潜力。
60 12
机器学习超参数调优:十个实用的贝叶斯优化(Bayesian Optimization)进阶技巧

热门文章

最新文章