想象你走进一家米其林三星餐厅的后厨。主厨技艺再高超,真正决定一桌菜成败的,往往是备菜团队端上来的食材:一块发蔫的牛肉、一撮过期的香料、一次不合时宜的上菜时机,都会让主厨的十八般武艺化为泡影。在推荐系统的“排序厨房”里,精排模型就是那位主厨——它负责给十几个候选商品逐一打分、排序,决定“此刻推给这个用户什么”。但模型最终发挥出多大本事,完全取决于特征工程这间“备菜房”喂给了它什么:用户是谁(口味档案)、商品是什么(食材品质)、此刻是什么场景(用餐氛围),以及这些信息被加工成了什么形态(统计、Embedding、交叉……)。 特征工程,就是决定精排效果的那块地基。地基打得越扎实,无论在上面盖 LR、GBDT 还是 DeepFM,都能稳稳站住;地基松散,模型再花哨也容易翻车。这篇文章就带你走进这间备菜厨房,把特征分类、预处理、统计特征、Embedding、交叉组合、特征筛选与在线实时特征,一道道菜给你讲明白。
对 AI 从业者而言,特征工程是精排模型的“隐形天花板”。掌握它,你才能从“调参工程师”升级为真正能掌控排序系统、驱动业务增长的架构师。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
精排特征体系 用户特征:画像+行为+实时序列 物品特征:统计+内容Embedding 特征决定上限,模型逼近上限 四大类特征构成精排地基
特征分类总览:三只篮子缺一不可
经验老到的备菜师开工前,会先摆出三只篮子:第一只放熟客档案——老王爱吃辣、李总忌海鲜;第二只放食材本身——今天空运来的和牛、现摘的香草;第三只放“此刻的环境”——是周末午市的热闹大堂,还是深夜安静的吧台。三只篮子分开装,是因为最终那道菜的口味,由三者共同决定:菜单再合口味,食材不新鲜是白搭;食材顶级,端上桌时客人已经吃饱,也是浪费。
推荐系统的精排模型面前,同样摆着三只“特征篮子”。模型给候选物品打分时,会同时打量“这是谁在请求”(用户侧)、“被推荐的物品是什么”(物品侧)、“请求发生在什么场景下”(上下文侧)。三者拼起来,才构成一次完整决策所需的全部信息。用户侧特征刻画长期画像与短期兴趣:性别年龄、历史点物品类分布、近 7 天活跃度、偏好价格带等。物品侧特征描述固有属性与热度:类目、价格、品牌、发布时长、近 30 天销量等。上下文特征则捕捉流动的推荐环境:当前时间、星期几、是否节假日、地理位置与网络环境等。
在工程实现中,这些特征被统一拼接为一个向量送入模型,形成一次请求的完整“食材拼盘”。所谓“地基”,首先就体现在这三类信息的齐备程度——缺了任何一类,模型就像盲人摸象。
三只篮子的食材缺一不可:只有熟客档案没有食材信息,等于客人说“想吃辣”却不知道后厨还剩什么;只有食材没有场景,等于深夜给客人端上一整桌重油菜。三篮子齐了,主厨才能对味下菜。
- X(完整特征向量)拼接后的整体特征向量,模型靠它输出排序分数,相当于备菜台上摆好的一整套食材。
- X_user(用户侧特征)描述“谁在请求”,包含用户画像与行为统计,相当于熟客的口味档案。
- X_item(物品侧特征)描述“被推荐的是什么”,包含物品属性与热度,相当于食材本身的品质标签。
- X_context(上下文特征)描述“此刻的环境”,包括时间、地点、设备等,相当于用餐时的季节与氛围。
- 分号拼接三类特征纵向拼接为一个整体向量,相当于把三只篮子的食材按顺序摆到同一张备菜台上。
特征预处理:洗菜切配的基本功
食材进厨房,第一件事绝不是下锅,而是清洗、去皮、切配。发霉的叶片要摘掉,长短不一的葱段要切齐,大小不一的土豆要分档。这些看似不起眼的“预处理”,决定了后面火候的控制。特征工程同样如此——原始数据极少干净整齐,直接喂给模型,轻则学歪,重则训练崩溃。
预处理的第一道工序是缺失值处理。用户没填年龄、商品没标价格,这些“空洞”在后厨里就像一块变质发黑的食材。常见做法是用中位数或众数填充,相当于切掉坏的部分再用好料补上;对缺失比例过高的特征,则直接丢弃,就像整筐扔掉发霉的菜。第二道工序是数值归一化。价格从 10 元到 1299 元,年龄从 18 到 60,量纲与跨度千差万别。若不做归一化,模型会误以为数值大的特征更重要,就像用“克”和“吨”两种秤称量食材,大厨无法比较。
第三道工序是类别分桶。对连续值按业务含义切分成档位:价格分为“平价、中端、高端”,时间段分为“早、午、晚、深夜”。分桶后的特征更稳健,不易受单个异常点干扰,如同把大小不一的土豆按个头分到不同的筐里——大厨取用时一目了然,出菜更均匀。
洗菜切配的功夫虽然朴素,却决定了食材能否在后续烹饪中发挥最佳状态。归一化、缺省处理、分桶这三板斧看似基础,却是精排模型稳定的第一步地基——厨房里真正的高手,从不在预处理上偷懒。
- x(原始特征值)尚未处理的原始数值,比如商品价格 12 元与 1299 元,量纲和跨度差异悬殊。
- x_min 与 x_max(最小最大值)整个样本的最小值与最大值,相当于备菜时定下的“最小份”与“最大份”标尺刻度。
- 分子(偏移量)x - x_min 表示当前值在标尺上距离最左端有多远,相当于这味食材在刻度上的位置。
- 分母(取值范围)x_max - x_min 表示整条尺子的长度,把所有特征跨度统一到同一比例。
- x'(归一化结果)最终落在 [0,1] 的无量纲数值,让价格、年龄、时长等不同尺度的特征具备可比性。
统计特征构造:读历史口碑算细账
一位老顾客走进餐厅,问“今天有什么推荐”,聪明的服务员不会只报菜名,还会补一句“这道招牌鱼今天已经有 80 桌客人点过了”。这就是历史口碑的力量。推荐系统的统计特征,做的正是这件事——把物品过去的表现加工成数字,告诉模型“这件商品有多受欢迎”。
最基础的统计特征是频次统计:曝光次数、点击次数、购买次数、收藏次数。这些数字刻画了物品的热度规模,如同后厨记录每道菜被点过的次数——点得多的菜,大概率有口碑。但光有规模不够,还需要比率特征来刻画“转化质量”。点击率 CTR 就是点击次数除以曝光次数,它回答的是“看到这道菜的人,有多大比例真的点了它”。曝光一万次、点击一千次的菜,和曝光十次、点击一次的菜,前者显然更靠谱。
这里有一个容易被忽略的坑:小样本下的比值极不可靠。曝光 1 次点击 1 次的 CTR 是 100%,却不能说明这道菜惊艳绝伦——那不过是第一个客人碰巧点了它。因此实践中会对 CTR 做平滑修正,比如分子分母各加一个小常数,或引入全局均值作为先验,让比值在样本不足时向整体水平收缩。如同服务员对只卖过一份的新菜,会保守地说“刚上新的,口碑还在积累”,而不是吹得天花乱坠。
历史口碑让模型有了“经验”,而不是每次拍脑袋。统计特征看似简单,却是精排模型里最能直接拉动效果的一类信号——就像老服务员的推荐,总是比花哨的菜单更有说服力。
- clicks(点击次数)物品被点击的次数,相当于顾客“翻牌”选择这道菜的总次数。
- impressions(曝光次数)物品被展示的次数,相当于这道菜被端上桌的次数。
- CTR(点击率)两者之比,刻画“看到的人有多大比例真的下单”,是衡量吸引力的核心比值特征。
- 小样本风险曝光少时比值波动极大,实践中需配合平滑或置信度处理,不能把一次品尝当成定论。
- 联合使用CTR 通常与曝光量、点击量同时入模,避免只用比值而丢失规模信息。
Embedding 特征:一罐浓缩的高汤
米其林后厨里总有一锅小火慢炖的高汤,鸡骨、火腿、干贝、香草,几十种食材的风味被浓缩成一罐精华。做菜时只需一勺,整道菜的层次立刻提升。Embedding 特征就是推荐系统里的那罐高汤——它把用户或物品的复杂语义浓缩成一个稠密向量,让模型用很少的维度抓住“灵魂”。
传统的 one-hot 编码,相当于用一本厚厚的字典描述食材:每个词占一页纸,整页只有一个字有用,其余全是空白,维度爆炸且毫无语义。Embedding 则不同:它通过神经网络把每个用户/物品映射成一段固定长度的实数向量,比如 [0.2, -0.1, 0.7, ……]。这段向量是模型从海量行为数据中“熬”出来的,相似的食材(物品)在向量空间里天然离得近——“猫”与“狗”相近,“连衣裙”与“半身裙”相近,这就是预训练向量带来的语义先验。
在精排工程中,Embedding 特征有三类典型用法:一是直接使用预训练向量(如 Word2Vec、Item2Vec),相当于后厨直接采购别人熬好的高汤;二是将多路 Embedding 拼接或加权融合,形成更丰富的用户/物品表示,类似用骨汤和菌汤勾兑出复合高汤;三是计算用户与物品向量的相似度,将相似度作为单维特征接入模型,相当于用“这勺汤跟那勺汤搭不搭”来判断匹配度。
一罐高汤不能替代所有调味,但它能让平凡的食材瞬间有灵魂。Embedding 特征的核心价值,在于把离散的 ID 世界压缩成连续的语义空间——这是精排模型从“记住”走向“理解”的关键一步。
- u 与 v(Embedding 向量)用户与物品的稠密向量表示,相当于把复杂风味浓缩成一张“配方表”。
- u · v(点积)两个向量逐位相乘再求和,度量两股味道的重合程度。
- ||u|| 与 ||v||(模长)向量的长度,代表味道的浓度或配方表的信息量。
- 分母归一除以模长消除量级差异,只保留方向上的相似性,如同只看“口味倾向”而非“吃了多少”。
- sim 取值范围落在 [-1, 1],越接近 1 表示越相似——在推荐中意味着“口味越搭”。
特征交叉组合:食材搭配的化学反应
单说“年轻人”,信息有限;单说“辣味”,也不稀奇。但如果说“年轻人 + 辣味”,很多餐饮老板眼睛会亮——这正是爆款麻辣烫的核心客群配方。特征交叉组合,就是捕捉这种"1 + 1 > 2"的协同效应:两个特征单独看平平无奇,放在一起却能揭示深刻的用户行为模式。
最朴素的做法是二阶交叉:把两个特征相乘,构造新的特征 x_i × x_j。在推荐场景中,“用户年龄段 × 商品价格带”能捕捉“年轻人偏好平价潮牌、中年人群偏好高质高价”这类组合规律;“用户兴趣类目 × 广告位类型”则能刻画“喜欢美妆的用户在开屏位更容易被吸引”的协同模式。这类交叉特征在 LR 模型中尤为关键——因为线性模型本身学不到特征间的非线性关系,交叉特征相当于人为地把非线性注入模型。
但全量交叉有个致命问题:特征维度会爆炸。假设有 1000 个类别特征,两两交叉就是 50 万个组合,俗称笛卡尔积灾难。如同后厨想把 100 种食材两两搭配试菜,菜单会厚到客人翻不完。工程上的解法有三条路:一是基于业务经验挑选少量高频组合,只交叉那些“直觉上就该有关系”的特征对;二是利用 Embedding 做隐式交叉——FM/DeepFM 模型在向量空间中自动捕捉特征交互,不必显式枚举;三是对交叉后的特征做降维,用哈希或主成分分析压缩到可控维度。
食材搭配是主厨的看家本领,交叉特征就是特征工程里的“搭配艺术”。好的组合能揭示数据的深层结构,但也要记住——不是所有食材放在一起都好吃,克制与精选同样重要。
- x_i 与 x_j(两个基础特征)比如年龄段与辣味偏好,单独看具有各自描述能力。
- 相乘运算将两者组合成新特征 x_ij,捕捉“当 i 与 j 同时出现”时的协同效应。
- 直观含义“年轻”与“辣味”同时出现才真正预示高转化,单独看都是弱信号。
- 维度爆炸风险全量两两交叉维度指数增长,必须结合业务先验做减法。
- 工程实践树模型可自动发现交叉,LR/FM 则依赖显式交叉特征,实践时按模型能力选择策略。
特征筛选评估:大厨的精选清单
米其林后厨每天收到上百种食材,但菜单上最终只有十几道菜。大厨不会把全部食材都堆进厨房,而是按三个标准精选:食材是否常用(覆盖率)、对招牌菜的贡献多大(重要性)、是否可以被其他食材替代(相关性)。特征筛选评估,就是精排工程的“精选菜单”环节。
第一关是覆盖率过滤。一个特征如果只在 1% 的请求中有值,对绝大多数样本就是摆设。比如“用户车辆品牌”特征,在没有车主信息的用户身上全部缺失,覆盖率和有效信息率过低,直接丢弃。这相当于一种食材 90% 的时间都缺货,大厨自然不会把它写进固定菜单。第二关是特征重要性评估。基于树模型(GBDT、RandomForest)可以计算每个特征在分裂中带来的增益占比——它回答“这个特征对预测贡献了多少”。贡献排名靠后的特征,可以优先裁掉,如同连续一个月无人问津的菜品,从菜单上撤下。
第三关是相关性分析。两个高度相关的特征(如“近 7 天点击量”和“近 30 天点击量”归一化后相关度极高)会带来冗余:模型参数难以稳定学习,特征重要性也被稀释。用皮尔逊相关系数或斯皮尔曼相关系数做两两检测,保留更具业务含义的一方即可。这就像高汤里已经有了鸡精又加一勺味精——味道不升反串,需要取舍。
精选菜单不是吝啬,而是对品质的执着。特征筛选表面上是“做减法”,本质上是通过剔除噪声、保留核心,让模型把有限的学习能力用在刀刃上——厨房如此,精排亦然。
- I_j(特征重要性)第 j 个特征对模型整体效果的贡献占比,是特征筛选时最直接的“成绩单”。
- splits(j)(特征 j 的分裂集合)树模型中使用特征 j 做切分决策的所有内部节点,相当于每次用到这味调料的分支场景。
- Gain_n(信息增益)每次分裂带来的纯度提升,相当于这味调料让菜品更有层次的程度。
- 分子(总贡献)所有使用特征 j 的分裂增益累加,刻画它在整棵模型中的总贡献。
- 分母(全局总增益)所有分裂增益之和,用于归一化,使不同特征的重要性可以跨维度比较。
在线实时特征:现做现卖的新鲜劲
客人刚落座,服务员推荐“今天午市刚到的海胆”,这句话的价值远超照本宣科的菜单——因为它包含了“此刻”的信息。推荐系统的在线实时特征,就是这股“现做现卖”的新鲜劲:离线特征描述的是过去,实时特征描述的是当下,很多场景下,当下才是用户做决策的关键。
实时特征最常见的是实时统计窗口:比如“近 5 分钟点击率”“近 1 小时销量”“当前直播间在线人数”。这些特征通过流式计算(Flink、Kafka)持续更新,让模型能捕捉突发热点——一条新闻刚爆、一场直播刚开,离线特征还停留在昨天的统计,实时特征已经敏锐感知。这如同后厨用实时客流调整备菜速度:刚进来的 20 人团需要立刻出菜,不能还按平时的节奏慢慢来。
但实时特征有两道工程门槛。第一道是缓存加速:每次请求都要在毫秒级拿到最新统计值,不可能现场跑一遍 MapReduce。行业做法是把热数据放进 Redis 等缓存,统计结果准实时地写入,模型服务直接读内存,把延迟压在 50ms 以内——相当于后厨提前备好半成品,客人点单时只需下锅快炒。第二道是口径一致性:训练时用的实时特征逻辑,和线上预估时必须完全一致。如果训练时“近 5 分钟点击率”按事件时间聚合,线上却按服务器时间聚合,分布稍有偏差,模型上线就会“水土不服”,轻则效果回退,重则线上事故。
现做现卖的菜最香,但同时也最考验后厨的供应链和流程管理。实时特征为精排模型注入了“当下的生命力”,而缓存与一致性则为这股生命力提供了可靠的工程地基。
- t_now(当前时刻)模型服务收到请求的实时时钟,相当于顾客此刻下单的瞬间。
- t_feature(特征采集时刻)实时特征对应统计窗口的截止时间,相当于食材最后一次被质检的新鲜时间。
- Δt(新鲜度)两者之差,衡量特征滞后程度,越小表示特征越贴合当下。
- 窗口大小权衡窗口过短噪声大,过长不敏感,需按业务节奏选择——如同午市和晚市的客流统计窗口本就不该一样。
- 工程权衡通过缓存与流式计算把 Δt 控制在毫秒到分钟级,同时用统一代码框架保证训练预估口径一致。
AI 应用场景
电商首页信息流精排
阶段:特征工程 + 精排建模
解决的问题:传统规则加权无法做到千人千面,而 AI 精排模型需在几十毫秒内给数百个候选商品打分。特征工程让模型“看见”用户此刻的真实诉求:既要知道他过去爱买什么(统计特征),也要知道现在是什么促销场景(上下文特征),还要知道“他常买的价位 × 当前折扣”这类组合信号(交叉特征)。
具体案例:某电商 App 在大促期间商品池膨胀 10 倍,单纯依赖离线特征导致冷门好物无法浮现。特征团队上线“实时价格变化”和“优惠券金额”上下文特征,并构造“用户历史客单价 × 商品折扣力度”交叉特征。实验结果显示 CTR 相对提升 8%,GMV 提升 3.2%,大促实时流量峰值下特征延迟仍控制在 45ms 内。
广告竞价中的 CTR 预估
阶段:统计特征 + 特征筛选
解决的问题:广告按点击付费,CTR 预估不准直接导致出价失真——高估则亏钱,低估则拿不到流量。统计特征(历史 CTR)在这里是主力,但小样本广告的 CTR 极度不稳定,需要平滑处理。
具体案例:某广告平台对曝光低于 100 次的广告采用贝叶斯平滑——用全局 CTR 作为先验,把稀疏点击修正到合理区间。同时构造“广告主行业 × 用户兴趣类目”交叉特征增强相关性判断。上线后 CTR 预估 AUC 提升 1.2 个百分点,eCPM(千次曝光收入)提升 12%。
短视频信息流的强时效特征
阶段:在线实时特征 + 缓存加速
解决的问题:短视频热点以分钟级更替,离线特征在次日更新后已成“昨日黄花”。实时统计特征(近 5 分钟完播率、近 1 小时点赞率)是捕捉热点的关键。
具体案例:某短视频 App 上线“近 5 分钟完播率”实时特征,通过 Flink 流式计算 + Redis 缓存构建特征服务,模型预估延迟稳定在 50ms 内。实验显示,热门视频从发布到被系统放大推荐的时延从 30 分钟缩短到 3 分钟,人均播放时长提升 5%。
Python 演示
import numpy as npimport pandas as pdfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_auc_score np.random.seed(42)n = 2000 # 构造原始特征: 用户侧 + 物品侧 + 上下文df = pd.DataFrame({ 'user_age': np.random.randint(18, 60, n).astype(float), 'user_level': np.random.randint(1, 8, n).astype(float), 'item_price': np.random.randint(10, 500, n).astype(float), 'item_score': np.random.uniform(1, 5, n), 'hour': np.random.randint(0, 24, n).astype(float), 'is_weekend': np.random.randint(0, 2, n).astype(float),}) # 人为制造缺失值df.loc[np.random.choice(n, 50), 'user_age'] = np.nandf.loc[np.random.choice(n, 50), 'item_price'] = np.nan # 预处理1: 缺失值用中位数填充df['user_age'] = df['user_age'].fillna(df['user_age'].median())df['item_price'] = df['item_price'].fillna(df['item_price'].median()) # 预处理2: 最小最大归一化for col in ['user_age', 'item_price']: mn, mx = df[col].min(), df[col].max() df[col + '_norm'] = (df[col] - mn) / (mx - mn) # 统计特征: 价格分桶后的组内评分偏差df['price_bucket'] = pd.cut(df['item_price'], bins=4, labels=False)df['item_score_vs_bucket'] = df['item_score'] - df.groupby('price_bucket')['item_score'].transform('mean') # 交叉特征: 年龄 x 价格df['age_x_price'] = df['user_age_norm'] * df['item_price_norm'] features = ['user_age_norm', 'item_price_norm', 'item_score', 'hour', 'is_weekend', 'item_score_vs_bucket', 'age_x_price']X = df[features]y = (df['item_score'] > 3).astype(int) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train) auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])print('AUC: %.4f' % auc) importance = pd.Series(model.feature_importances_, index=features).sort_values(ascending=False)print('特征重要性:')print(importance)
df.loc[np.random.choice(n, 50), 'user_age'] = np.nan随机挑选 50 行制造缺失,模拟真实数据的脏乱df['user_age'].fillna(df['user_age'].median())用中位数填充缺失值,稳健且不受极端值影响df[col + '_norm'] = (df[col] - mn) / (mx - mn)最小最大归一化,把不同量纲统一到 [0,1]df.groupby('price_bucket')['item_score'].transform('mean')计算同价格分桶内的平均评分,用于对比单品相对水平的统计特征df['age_x_price'] = df['user_age_norm'] * df['item_price_norm']构造年龄与价格的二阶交叉特征model.feature_importances_输出特征重要性排序,指导特征筛选roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])用 AUC 评估精排排序效果,兼顾正负样本排序能力
常见误区
误区我刚做精排时总觉得特征不嫌多,把几十个 ID 直接塞进模型,认为信息全备模型自然聪明。离线 AUC 涨了一点点就坚信“多多益善”。
正解特征多不等于信息多。海量高维特征会带来三重代价:一是维度灾难,样本稀疏时模型学不到稳定规律;二是过拟合,模型记住噪声而非本质;三是计算与存储成本暴涨。正确做法是先加特征观察增益,再通过覆盖率、重要性和相关性做减法。就像米其林后厨不是把所有香料都倒进锅里,而是精选几味让主味突出——盲目堆特征等于一锅乱炖。
为何常见:直觉上“信息越多越好”合理,且加特征比删特征容易,很多人只看离线 AUC 微升就误以为有效。
误区我以为 CTR 就是点击除以曝光,算出什么就填什么。曝光只有 10 次、点击 8 次,我就直接把 80% 当作特征写进模型。
正解小样本下的比值波动极大。曝光 1 次点击 1 次的 CTR 是 100%,但这并不代表物品真的优质。平滑(如分子分母各加常数、或用全局 CTR 做经验贝叶斯先验)让统计量向整体水平收缩,相当于对只被一位客人尝过的菜保守打分,而不是盲目相信一次品尝的反馈。平滑后的特征远比原始比值稳定可靠。
为何常见:比值公式太直观,初学者容易忽略统计显著性,不知道小样本方差有多大。
误区深度学习时代一切特征都能用 Embedding 表达。我觉得统计特征又土又低效,恨不得全部换成 Embedding 喂给模型。
正解Embedding 擅长表达语义相似与高阶关联,但对精确数值关系并不敏感——“满 300 减 50”“8 月 15 日大促”这类精确信号,统计特征和数值特征表达得更直接。主流精排模型如 DeepFM 恰恰是把稀疏 Embedding 与稠密统计特征拼接使用,互补才达到最佳效果。高汤再浓,也不能替代盐和醋。
为何常见:看到论文里 Embedding 大放异彩,容易以偏概全,忽视了工业界特征工程是组合拳。
误区我觉得特征窗口越短越高级,最好每秒都重新计算。上线了“近 5 分钟点击率”后还想上线“近 30 秒点击率”。
正解窗口太短噪声会急剧上升——凌晨 3 点的 5 分钟点击率几乎全是偶然。更关键的是工程稳定性:每次调整窗口或统计口径,必须同时改在线逻辑与离线回放逻辑,否则训练和预估分布不一致,模型上线就会崩溃。实时特征设计是延迟、噪声、成本、一致性的平衡,不是单纯追求“新”。
为何常见:人们对“新鲜”有天然好感,却容易忽视统计稳定性与线上线下口径一致性这些硬约束。
面试题
Q1. 精排模型中,“用户年龄 × 商品价格带”这类交叉特征的主要目的是什么?
- A.消除特征之间的相关性噪声
- B.增加数据量以满足模型需求
- C.捕捉两个特征组合时的协同效应← 正确答案
- D.减少特征的维度以简化计算
答案:C。交叉特征的核心价值是表达“1+1>2“的协同效应,比如”年轻人 × 辣味”组合比两个特征单独更具预测力。A 是相关性分析的目标,B 与特征构造无关,D 通常交叉会增加维度而非减少。
Q2. 某物品曝光 10 次、点击 8 次,直接将其 CTR 作为特征的问题是什么?
- A.数值一定偏大导致过拟合
- B.小样本下统计波动大不稳定← 正确答案
- C.该特征与标签完全无关
- D.数值一定偏小导致欠拟合
答案:B。曝光 10 次的 CTR=80% 缺乏统计显著性,只是极端样本下的偶然结果。正确做法是平滑或用置信度加权。A 和 D 的“一定偏大/偏小”都是绝对化误判,C 完全否定该特征,均不正确。
Q3. 最小最大归一化 x'=(x-min)/(max-min) 的核心作用是什么?
- A.将特征缩放到统一量纲← 正确答案
- B.让特征服从正态分布
- C.删除全部缺失值样本
- D.扩大特征的方差数值
答案:A。归一化把不同量纲(价格、年龄、时长)映射到 [0,1],让模型公平比较特征重要性。它不改变分布形态,B 是标准化的副作用而非本质;C 与归一化无关;D 不对,归一化通常压缩而非扩大方差。
Q4. Embedding 特征相比 one-hot 编码的核心优势是什么?
- A.维度更高信息更丰富
- B.语义相似物品距离更近← 正确答案
- C.不需要训练即可获得
- D.保证特征之间完全独立
答案:B。Embedding 通过神经网络把稀疏 ID 映射为稠密向量,使语义相似的物品在向量空间中距离相近,这是它“浓缩高汤”的本质。A 相反,Embedding 维度通常远低于 one-hot;C 错误,Embedding 需要训练;D 错误,向量各维并非独立。
Q5. 关于树模型的特征重要性,以下说法正确的是?
- A.特征重要性越高说明取值越大
- B.特征在分裂中的增益贡献占比← 正确答案
- C.特征重要性等于相关系数值
- D.特征重要性高即需要被删除
答案:B。特征重要性统计该特征在所有分裂节点带来的信息增益占比,反映的是“对预测的贡献度”,与取值大小无关,A 错;它是增益归一化的结果而非相关系数,C 错;重要性高的特征应保留而非删除,D 错。
Q6. 下列哪些属于上下文特征?
- A.当前时间为上午十点整← 正确答案
- B.用户历史购买总金额
- C.今天是周日属于周末← 正确答案
- D.物品近七天销量数据
答案:AC。上下文特征描述推荐发生时的场景,包括时间、地点、设备、网络等。A 的当前时间与 C 的是否周末都属于时效场景;B 是用户侧历史行为特征,D 是物品侧统计特征,均不属于上下文。
Q7. 为保证在线实时特征与离线训练特征口径一致,最关键的措施是什么?
- A.线上线下一套特征计算代码← 正确答案
- B.离线特征每天重新生成
- C.线上模型参数完全复制
- D.只保留用户侧特征数据
答案:A。训练与预估的一致性要求特征计算逻辑严格统一,复用同一套代码或特征平台是行业标准做法。B 只解决离线更新粒度,C 只涉及模型参数,D 直接放弃部分特征更是因噎废食。
Q8. 关于 CTR 统计特征的平滑处理,下列做法有效的是?
- A.分子分母各加小常数作为先验← 正确答案
- B.直接用曝光量替代分母
- C.用全局 CTR 作为先验再修正← 正确答案
- D.删除曝光量小于阈值的样本
答案:AC。A 是常见的加平滑(如 Beta 先验),C 是经验贝叶斯平滑,二者都让稀有小样本的比值向全局均值收缩,有效。B 改变了比值定义会产生系统性偏差,D 直接删样本会丢失信息,都不是平滑的正规做法。
Q9. 在精排特征中,“当前时间”和“是否节假日”这两类特征属于哪一类?
- A.描述用户画像的属性
- B.描述物品内容的属性
- C.描述当前环境的特征← 正确答案
- D.描述历史行为的统计
答案:C。当前时间和是否节假日描述的是推荐请求发生的场景环境,属于上下文特征。A 是用户侧画像,B 是物品侧内容,D 是统计特征,均不匹配。
Q10. 下列哪些是特征筛选的常见方法?
- A.基于覆盖率过滤低曝光特征← 正确答案
- B.基于特征重要性阈值筛选← 正确答案
- C.随机删除一半特征无依据
- D.基于相关性去除冗余特征← 正确答案
答案:ABD。覆盖率过滤保证特征的可用性,重要性排序筛掉贡献低的特征,相关性分析去除冗余特征,三者都是系统化的筛选手段。C 的随机删除没有任何依据,会破坏特征结构,不属于工程实践。