高基数特征如何编码?如何解决训练集测试集类别不匹配问题
高基数类别特征编码与OOV问题解决方案
高基数类别特征编码可选方案
针对单特征1500+类别的高基数场景,可根据数据特征和业务场景选择以下编码方式:
- 带平滑的目标编码:抛弃原生直接取类别目标均值的计算方式,加入贝叶斯平滑降低小样本噪声,计算公式为
编码值 = (类别样本数 * 类别目标均值 + 平滑系数 * 全局目标均值) / (类别样本数 + 平滑系数),平滑系数可根据样本量调整,通常取10~100,既保留目标相关性,也能避免过拟合。 - 频率编码:以类别在训练集中的出现频率作为编码值,实现简单泛化性强,适合类别出现频率与目标变量存在相关性的场景。
- 哈希编码:预先设定固定维度的哈希桶(通常取32~256,远低于原始类别数),将所有类别映射到对应哈希桶中,天然支持未知类别,仅需注意调整桶数降低哈希冲突概率。
- 聚类合并编码:若类别存在语义/业务关联(如商品ID、地区编码),可先按照业务规则或语义相似度将1500+个类别聚合成数十个大类,再对大类做常规编码,在压缩基数的同时保留业务信息。
训练测试集类别不匹配(OOV)问题处理
注意:所有编码逻辑的统计量只能来源于训练集,禁止引入测试集的任何分布信息,避免数据泄露。
所有编码方案都需提前做OOV兼容,禁止直接丢弃OOV样本或随意赋值0,可采用以下处理逻辑:
- 预合并稀有类别:训练集预处理阶段就将出现次数低于阈值(通常取3~10,根据总样本量调整)的长尾类别统一合并为
other类,从根源上降低OOV出现的概率,other类的编码值统一用所有合并的稀有类别的统计值计算。 - 预留默认兜底编码:构建编码映射表时同步预留OOV的默认编码,目标编码场景下默认取训练集全局目标均值,频率编码场景下默认取所有稀有类别的平均频率,测试集遇到未见过的类别直接用兜底编码即可。
- 交叉验证生成编码:计算目标编码时采用K折交叉验证方式,每一折的编码值用其余K-1折的统计量计算,既避免数据泄露,也能提升编码的泛化性,兜底编码的统计值也可通过交叉验证计算,稳定性更强。
高基数+OOV场景推荐落地方案
- 训练集预处理:统计每个类别的出现频次,将出现次数小于5的类别全部合并为
other类,通常可将1500+的基数压缩至100以内 - 编码计算:对合并后的类别做带贝叶斯平滑的目标编码,采用5折交叉验证计算每个类别的编码值,避免过拟合
- 测试集处理:匹配训练集生成的编码映射表,已出现的类别直接取对应编码,未出现的类别统一映射为
other类的编码值
内容的提问来源于stack exchange,提问作者Tejas
相关产品推荐
相关产品推荐

