Skip to content

推荐系统的特征

特征是推荐系统里的重要概念,推荐模型通常需要同时处理多种信号,并将其转换为向量。NextRec 使用统一的特征对象描述模型输入,主要支持三种特征类型:

  • 稠密特征:连续或可序数化的数值(年龄、价格、时长等),常见做法是标准化/归一化或对数变换。
  • 稀疏特征:高基数离散字段(用户 ID、物品 ID、性别、职业、设备类型等),通常需要索引化后放入 embedding lookup 表里。
  • 序列特征:可变长历史行为(浏览/点击/购买列表),通常需要转化为ID后,截断、padding,再通过聚合(mean/sum/attention)这些ID的向量为一段定长的向量。

在初始化模型之前,我们需要对每个特征进行定义,让模型知道如何处理不同的特征。

稠密特征的定义

稠密特征适用于连续数值型数据,如年龄、收入、评分等,简单的示例如下:

python
from nextrec.basic.features import DenseFeature

dense_features = [
    DenseFeature(
        name="age", 
        input_dim=1, 
        use_projection=False,
        trainable=True
        ),
    DenseFeature(
        name="price", 
        input_dim=8, 
        use_projection=True,
        proj_dim=1,
        projection_type="mlp",
        mlp_hidden_dims=[16, 8],
        mlp_activation="relu",
        mlp_dropout=0.0,
        trainable=True
        )    
    ]

参数说明

参数说明
name[必需] 特征名称,用作输入键
input_dim特征的输入维度,对于单个数值为 1
use_projection是否使用投影层将输入投影到更高维度
proj_dim投影层维度,如果为 None 或 0,则不应用投影
projection_type投影类型,支持 "linear"(默认)和 "mlp"
mlp_hidden_dimsprojection_type="mlp" 时使用的隐藏层维度列表
mlp_activationprojection_type="mlp" 时使用的激活函数
mlp_dropoutprojection_type="mlp" 时使用的 Dropout
trainable投影层是否可训练
pretrained_weight可选的预训练投影权重
freeze_pretrained如果为 True,保持预训练权重冻结

多维 Dense 映射到 1 维示例

python
DenseFeature(
    name="dense_vec",
    input_dim=12,            # 输入是 12 维连续特征
    use_projection=True,
    proj_dim=1,              # 输出映射为 1 维
    projection_type="mlp",   # 使用 MLP 投影
    mlp_hidden_dims=[32, 16],
)

稀疏特征

适用于离散 ID 或类别型数据,通过 Embedding 查表转换为稠密向量,简单的示例如下:

python
from nextrec.basic.features import SparseFeature

sparse_features = [
    # 用户ID
    SparseFeature(
        name="user_id", 
        vocab_size=10000, 
        embedding_dim=32
        ),
    # 物品ID(使用权重共享)
    SparseFeature(
        name="item_id", 
        vocab_size=20000, 
        embedding_dim=32, 
        embedding_name="item"
        )
]

参数说明

参数说明
name[必需] 特征名称,用作输入键
vocab_size[必需] 唯一类别ID的数量(max_id+1 或 hash 空间大小)
embedding_name嵌入表名称,当两个特征共用一个embedding_name时共享词表,默认为 name
embedding_dim嵌入向量维度,设为 None 则自动调整大小为 min(vocab_size ** 0.5, 64)
padding_idx用于填充 token 的索引
init_type嵌入向量的初始化类型:"normal""uniform""xavier_uniform"
init_params初始化器参数,如 {"mean": 0, "std": 0.01}
l1_reg嵌入向量的 L1 正则化权重
l2_reg嵌入向量的 L2 正则化权重
trainable嵌入向量是否可训练
pretrained_weight可选的预训练嵌入权重
freeze_pretrained如果为 True,保持预训练权重冻结

序列特征

适用于用户行为序列,如点击序列、浏览序列、购买序列等。简单示例如下:

python
from nextrec.basic.features import SequenceFeature

sequence_features = [
    # 简单序列:平均池化
    SequenceFeature(
        name="click_hist",
        vocab_size=100000,
        embedding_dim=32,
        max_len=50,
        combiner="mean"
    ),
    # 使用点积注意力
    SequenceFeature(
        name="browse_hist",
        vocab_size=100000,
        embedding_dim=32,
        max_len=50,
        combiner="dot_attention"
    ),
]

参数说明

参数说明
name[必需] 特征名称,用作输入键
vocab_size[必需] 序列词汇表中唯一ID的数量
max_len用于填充/截断的最大序列长度
embedding_name嵌入表名称,当两个特征共用一个embedding_name时共享词表
embedding_dim嵌入向量维度,设为 None 则自动调整大小为 min(vocab_size ** 0.5, 64)
combiner序列嵌入的池化方法,可选项包含:mean,sum,concat,dot_attention,self_attention
padding_idx用于填充 token 的索引
init_type嵌入向量初始化类型
init_params初始化器参数
l1_reg嵌入向量的 L1 正则化权重
l2_reg嵌入向量的 L2 正则化权重
trainable嵌入向量是否可训练
pretrained_weight可选的预训练嵌入权重
freeze_pretrained如果为 True,保持预训练权重冻结

下一步

基于 MIT 许可证开源