如何使用神经网络处理高基数/稀疏特征 查找相关示例与GitHub资源
高基数/稀疏数据集的神经网络编码实现参考
- 主流实现思路:优先采用哈希分桶+Embedding的组合方案,也可先按频率做阈值过滤,将出现次数低于阈值的低频值统一映射为
<OOV>特殊标记的向量,避免Embedding矩阵维度爆炸。 - 针对稀疏输入场景,直接调用框架原生的稀疏Embedding接口即可,不需要把稀疏张量展开为密集张量,可大幅降低内存占用。
- PyTorch极简实现示例:
import torch import torch.nn as nn class HighCardinalEncoder(nn.Module): def __init__(self, n_unique_val, embed_dim, hash_bucket_size=None, oov_threshold=10): super().__init__() self.embed_dim = embed_dim # 哈希分桶数默认不超过10000,可根据业务调整 self.hash_bucket_size = hash_bucket_size or min(n_unique_val, 10000) self.embedding = nn.Embedding(self.hash_bucket_size, embed_dim) def forward(self, x): # x为高基数特征的原始输入值 hashed_x = torch.fmod(x.abs(), self.hash_bucket_size).long() return self.embedding(hashed_x)
- 稀疏输入可直接替换
nn.Embedding为nn.EmbeddingBag,适配one-hot、multi-hot等多种稀疏输入格式。
非类别型数值变量的Embedding实现参考
- 主流实现思路:包含离散分桶Embedding、周期特征正余弦编码、可学习分段线性编码三类方案,可根据数值特征的业务属性选择。
- 数值分桶Embedding TensorFlow实现示例:
import tensorflow as tf from tensorflow.keras import layers class NumericEmbedding(layers.Layer): def __init__(self, embed_dim, n_bins=20): super().__init__() self.embed_dim = embed_dim self.n_bins = n_bins self.embedding = layers.Embedding(n_bins, embed_dim) def adapt(self, train_data): # 基于训练集数值分布计算分桶边界 self.bins = tf.cast(tf.linspace(tf.reduce_min(train_data), tf.reduce_max(train_data), self.n_bins+1), tf.float32) def call(self, x): bin_idx = tf.searchsorted(self.bins, x, side='right') - 1 bin_idx = tf.clip_by_value(bin_idx, 0, self.n_bins-1) return self.embedding(bin_idx)
- 不需要分桶的连续数值场景可采用可学习乘积编码:先将数值归一化到[0,1]区间,和随机初始化的可学习向量逐元素相乘后,经过一层全连接层映射为目标维度Embedding,可保留数值的大小关联信息同时引入非线性表达能力。
内容的提问来源于stack exchange,提问作者Aleyna Buse Sumer Student
相关产品推荐
相关产品推荐

