2026/10/17 11:46:09

服装电商尺码推荐系统实战:从特征工程到算法落地

服装电商尺码推荐系统实战:从特征工程到算法落地 服装电商这个行当做得越久越会发现一个扎心的事实用户下单时对尺码的判断基本靠猜。我自己在某服装电商团队做推荐相关项目时第一天拿到业务方的需求对方只说了四句话让用户更容易买到合身的衣服把尺码相关退货降下来别让客服每天被尺码投诉淹没最好还能反哺供应链。听上去很简单真正动手才发现尺码推荐根本不是根据身高体重给个S/M/L这么粗暴的事。它横跨数据清洗、特征工程、算法选型、AB实验和供应链协同任何一个环节掉链子线上效果都会直接反弹到退货率上。这篇文章我会把整个项目从立项到落地踩过的坑、用过的方案、以及最终稳定运行的架构完整梳理一遍适合正在做推荐系统、或者准备在服装品类上做精细化运营的同行参考。1. 电商退货的隐形黑洞尺码问题背后的业务账1.1 不只退货率尺码问题牵动的是整条供应链先看一条业务账。服装品类退货率常年能到25%到35%而其中因为尺码不合适产生的退货通常能占到退货总量的40%到60%。一单退货背后的羊毛出在羊身上逆向物流成本、仓库二次质检、重新上架后的折价销售一套流程下来退货成本大约能吃掉订单金额的8%到15%。对于毛利只有40%到50%的服装品牌来说这意味着每退一单这件衣服的利润基本归零甚至倒亏。但我们当时复盘时发现更大的问题不在退货本身而在用户行为链的断裂。一个用户买错了尺码客服介入、退货退款表面上一单结束了实际上下一次她大概率不会再来这家店。我们从留存数据里看到一个趋势尺码推荐生效过的用户二次购买率比没生效的用户能高出3到5个百分点。这个数字单看不大放在服装这种低频复购品类上几乎决定了品牌在做的是一锤子买卖还是回头客生意。第三重成本是供应链的错配。尺码买错不是均匀分布的错而是集中在某些尺码上。比如一款连衣裙如果M码长期缺货、S码和XL码天天积压你会看到前端在丢订单后端在压库存。推荐的本质其实是把需求提前、精准地映射到库存结构上如果尺码推荐做得好库存周转的优化效果远比打折促销来得健康。1.2 尺码推荐算法的能力边界能做什么不能做什么做这个项目之前团队里很多人把尺码推荐和猜你喜欢混为一谈。直到我们梳理需求才想明白两者的差异猜你喜欢回答的是用户喜欢什么样的衣服尺码推荐回答的是用户穿这件衣服哪个尺码更合身。两者都叫推荐但判断逻辑完全不在一个维度上。尺码推荐能做的是利用用户侧和商品侧的历史数据给出一个最大概率合身的码数。它包括读取用户历史购买同品类的尺码偏好、比对商品本身的尺码表与版型、参考相似体型用户在目标商品上的购买分布最后综合出一个推荐结果。它做不到的也很明确用户主观上喜欢宽松还是紧身、她最近半个月是瘦了还是胖了、不同品牌尺码表之间暗藏的虚标问题这些都不是算法单靠历史订单能100%搞定的。这也是为什么尺码推荐从来不是预测一个绝对正确的码而是把选错码的概率尽量压低。业务方如果一开始就要求推什么就必须穿什么那这个项目趁早别接。2. 特征工程从身高体重到有信息量的尺码画像2.1 用户侧特征几个被严重低估的输入信号最基础的特征是身高和体重但这里有个坑用户填写的身体数据往往不是实时的有的人一年前注册时填了一次之后就再也没更新过。我们当时在用户画像侧加了一个自报数据置信度的权重——如果该用户有近90天的购买记录就降低自报数据的权重让历史下单行为主导尺码判断。这个改动上线后推荐准确率提升了大概2个百分点属于少见的低成本高收益优化。比身高体重更关键的是购买历史。我们提取了用户在每个品类的历史购买尺码序列不只是取最后一次而是看近半年的尺码漂移趋势。很多用户会随着体重变化或品牌切换从M码慢慢漂到L码捕捉这个趋势比单独用一个点判断准得多。还有个容易被忽略的信号是重复购买。用户对同一款商品第二次下单选的尺码就是高置信度的合身标签。这类样本在训练数据里权重我们调得非常高因为它是唯一一种用行动确认的尺码信号比任何问卷和客服反馈都可靠。2.2 商品侧特征尺码表、版型与品类差异商品侧的尺码表是最让人头疼的特征来源。不同品牌的尺码表口径完全不一致同样是M码有些品牌标胸围88到92厘米有些只标一句适合体重55到60公斤还有一些干脆只写了S/M/L连数字都不给。我们拿到原始尺码表后做了两件事第一把文本描述清洗成统一的数字化区间拆成胸围、腰围、肩宽、衣长等标准维度第二对不同品类单独建特征映射因为上装看胸围肩宽下装看腰围臀围连衣裙还得多看一个裙长混在一起建模会互相干扰。版型标签是另一个被验证有明显增益的特征。我们把商品打上修身标准宽松oversize等版型标签实测下来同一款式的修身版和宽松版如果只按基础尺码表推推荐结果会直接错位。用户穿修身版需要大一码穿oversize版反而要往小选这个差异只能靠版型标签来表达。这里分享一个我们在商品侧做的补充动作把商品的尺码表按品类做标准化对齐。比如上装统一映射到数字体系用160/84A这种国标码替代S/M/L这样就能对不同品牌做段差补偿——A品牌M码对应84厘米胸围B品牌M码对应88厘米映射到统一体系后推荐引擎能自动识别B品牌的M码其实等于A品牌的L码。2.3 最容易忽视的坑尺码标签噪声你可能会下意识认为商品本身的尺码标S/M/L是可信的。我们是吃过亏之后才明白这个假设不成立。有一个实际发生的案例某批次连衣裙因为供应商贴错水洗标全部从M码标成了L码用户收到的衣服普遍偏小于是该商品下所有购买记录都被打上了偏小的负反馈。但实际上问题出在标签错位不是版型问题如果我们不做清洗直接用历史数据训练模型会学到一条完全错误的规则。另一种常见噪声是面料缩水。棉质面料首次下水缩水率能达到3%到5%用户穿了一次再洗一次合身度数据就失真了。处理这种噪声我们用的办法是在特征层加入面料成分和洗涤方式标签在清洗层做异常尺码分布检测——当某SKU的退货尺码分布和同品类其他商品显著偏离时触发人工复核。3. 算法路线规则引擎起步逐步升级到机器学习3.1 0到1阶段基于品类规则的尺码映射在没有足够数据积累的第一版直接用规则引擎完全是合理的。我当时设计的规则很简单统计每个品类下历史订单中各个尺码对应的身高体重区间然后对当前用户的身高体重做区间重叠匹配从重叠度最高的尺码集合里挑推荐结果。这里有一个关键设计为什么用区间重叠而不是直接取最近中心点因为尺码本身不是点估计它是一段容忍区间。比如统计出来M码的典型身高体重区间是160到170厘米、50到65公斤用户165厘米、58公斤同时落在M和L的重叠区这时候就要叠加年龄、品类偏好去二次判断。规则引擎在这一步的兜底逻辑是用户年龄偏大的尺码倾向往大推一档因为体型随年龄的自然变化在服装上是客观存在的事实。规则引擎还有一个很实用的衍生功能输出推荐尺码的同时把命中的尺码区间边界也一并返回。前端可以展示您的体型数据落在M码和L码之间考虑到您过去偏好合身版型优先推荐M码这个交互对后续用户信任建设非常有帮助。3.2 过渡方案相似用户聚类与协同过滤变体当订单量积累到百万级之后规则引擎的瓶颈就出来了——它无法处理每个品牌实际版型不同这个事实。我们当时采用的中间方案是带权重的相似用户聚类思路非常朴素把用户在某个品类最后一次购买的尺码标准化成统一尺码编号然后统计出用户的历史尺码向量用余弦相似度找最像的N个用户再取这N个用户在目标商品上购买的尺码众数作为推荐。这个方案的可解释性不错部署也轻量但它的问题在于用了整体偏好去映射单品。如果用户平时买A品牌穿M码但目标商品是版型偏小的B品牌相似用户算法无法自己发现这个变化必须靠外部修正。所以我们又在聚类结果之上加了一层尺码偏移把A品牌和B品牌的尺码映射到统一数字码体系用两个品牌间的段差自动做补偿。举个例子A品牌M码映射为160/84AB品牌M码实际对应165/88A那么系统在推荐B品牌商品时会直接把聚类出的M码结果向上移一个段位。3.3 进阶路线多任务学习与排序模型在特征丰富到用户侧、商品侧、上下文侧都有充分数据之后我们最终采用的方案是GBDT多任务模型同时预测三个目标合适尺码的分类概率、用户是否退货作为合身度的代理标签、用户下单后是否复购。为什么一定要多任务因为单一的分类模型训练信号是用户最终购买的尺码但最终购买并不等于穿着合适。用户可能因为折扣大而接受偏大一码可能因为库存缺码而将就小一码也可能就是懒得退了。这些灰色行为单独看都会污染训练标签。多任务模型相当于让模型同时学习购买和合适两个角度在训练过程中共享底层特征表征上层各任务用不同损失函数约束最终学到的表示会天然区分买对了和买漏了。离线验证里单任务准确率大约78%换成多任务后直接拉到84%效果差得还是很明显的。3.4 为什么我不建议一上来就上神经网络这个观点可能会被一些做深度学习的同行反对但我的经验是服装尺码场景的数据量相比语言和图像领域其实是小得多的。哪怕头部电商平台单品类有效订单也就是千万级别而且带着大量稀疏和噪声。神经网络在这种数据规模下特别容易过拟合且排查问题、上线部署都会增加不少工程负担。我们团队也不是没试过深度模型最后发现那些提升基本来源于特征工程和标签清洗而不是模型的拟合能力。务实路线应该是把规则统计方法跑明白把特征和标签质量做扎实然后上梯度提升类模型就能拿到80%以上的提升。等用户规模和数据量真正上来之后再考虑用神经网络去做跨品类的特征交叉那时候性价比才合理。4. 数据陷阱与评估体系容易被带偏的两个环节4.1 稀疏数据和冷启动新用户新品怎么办尺码推荐对冷启动的敏感程度比常规推荐更夸张。常规推荐冷启动时可以用热门商品兜底尺码推荐却做不到——用户没有历史数据你根本不知道她适合什么码。我们做了三层回退策略新品冷启动时用同品牌同品类的尺码分布兜底比如同品牌牛仔裤的历史尺码分布中M码占45%那就优先推M码新用户冷启动时用身高体重区间匹配如果连身高体重都没有那就直接展示尺码表让用户自己选同时给一个不确定就选大一码的默认建议。这个三层回退看起来简单但落地时不注意就会出问题回退的顺序不能乱。我们一开始是先走用户相似度再走身高体重结果冷启动用户被大量误推到和他体型毫不相关的尺码上。调换顺序之后冷启动场景的推荐准确率明显更稳。4.2 反馈信号里的选择偏差没退货不代表合适用线上订单数据训练尺码模型最大的陷阱在于没有退货这个信号实在太弱了。用户不退货的原因可能很复杂嫌退货流程麻烦、刚好赶上折扣不想折腾、衣服虽然偏大但也能穿。如果模型把没退货一律当作合适那它学出来的分布一定会被这些灰色行为带偏。我们清洗标签时做了一套信号分级保留商品并且后续还有同品类复购的用户行为视为高置信合适信号退货单视为高置信不合适信号没退货但也没复购的行为权重直接降低一半。这个改动在离线评估里带来的提升非常显著因为误差原本就大量集中在这类灰色样本上。顺便说一句如果产品里已经有用户主动填写穿着体验的入口那这种显式反馈的权重应该给到最高它是比行为信号更干净的正样本。4.3 离线评估准确率不是唯一标准尺码推荐如果只盯准确率很容易自欺欺人。准确率反映的是推荐结果和用户最终购买尺码是否一致但用户最终购买尺码可能受折扣、库存、个人习惯等因素干扰。我们实际用的核心离线指标是加权准确率尺码跨度在一个段位内的判定权重为1跨两个段位以上的错误权重加到2。这个设计是基于业务优先级的——推荐错一码还可以接受推荐错两码用户基本就流失了。第二个常用指标是top2命中率。用户下单页通常会给2到3个尺码选择如果推荐结果包含正确尺码算作命中top2命中率能到92%以上说明至少不会让用户陷入推荐的码根本穿不了的尴尬。4.4 线上实验怎么设计才不被打脸线上验证时如果只看转化率很容易被各种因素干扰。尺码推荐真正要盯住的指标是推荐尺码对应订单的退货率、二次购买率和尺码客诉率。我们当时做过一个双向AB实验实验组展示算法推荐结果对照组展示商品默认尺码同时观察两组的退货率。结论很有意思实验组退货率下降了约1.5个百分点这是好消息但实验组里用户主动忽略推荐尺码、自行选其他码的比例反而上升了。原因不难理解用户已经习惯了默认选项突然弹出一个推荐码她会下意识怀疑。这事儿提醒我们推荐能力的建设不只是模型问题还要配合前端UI的设计让用户明白这个推荐是从你的购买行为推断出来的信任感建立起来了模型的效果才能真正释放。5. 工程落地把模型放进真实业务流5.1 在线推理与缓存策略尺码推荐其实不需要实时计算。用户的体重和购买记录不会每秒都变商品尺码表也不会频繁更新所以我们的架构是离线训练、线上查询。用户特征库和商品尺码库小时级刷新模型输出结果天级刷新并预计算好放进缓存线上请求直接读缓存返回单次服务延迟控制在几个毫秒内。不过缓存策略有个容易被忽略的细节不能把模型输出的原始尺码直接返回给前端它必须先经过一个业务层做尺码校准。比如模型推荐L码但目标商品只有M和XL有库存这时候直接推L就是在误导用户。我们的业务层会做库存交集判断推荐结果优先从模型推荐、且有库存、且尺码跨度不超过一个段位的集合里选。这个逻辑写在业务层而非模型层保证模型可以专心学习用户和商品的特征关系不用被实时库存这类易变信息干扰。5.2 可解释性让用户看到推荐理由尺码推荐这种低频但决策关键的功能用户不会盲目相信。我们在前端展示推荐结果时同时给出结构化的推荐理由比如根据你近三个月的上装购买记录你更多选择M码此商品版型标准建议尝试M码或者你的身高体重数据位于M/L区间考虑到该商品版型修身推荐L码。这套展示逻辑不只是为了提升用户体验还有一个隐藏价值记录用户的决策痕迹。如果用户看到了推荐理由仍然选择了其他尺码系统就能把这次偏差决策记录下来反哺后续模型迭代。为了支持可解释性模型层面也要做配合。GBDT这类树模型天然具备特征重要性的输出能力我们按特征贡献度排序把排名前两位的特征对应的文案模板拼接到推荐理由里。不需要复杂的可解释性模型一套文案模板加特征重要性排序就够用了。5.3 跨团队协作商品数据质量和推荐效果强相关做尺码推荐最难的其实不是算法规避坑而是建立一套商品级别的数据流程。很多商品管理团队在录入尺码表时只填了S/M/L完全没有数字化区间和版型字段。如果上游数据是脏的下游模型怎么调都没用。我们的做法是在商品创建环节增加必填的数字化尺码区间和版型标签并配置自动校验规则如果填写的尺码区间和同类目其他商品差异超过一定阈值系统直接给商品管理端发预警。这个动作对推荐效果的提升甚至比我们在模型层加班调参更明显。说到底推荐系统的上限是由数据质量决定的算法只是在逼近这个上限。与其在模型复杂度上内卷不如把商品数据的标准先立起来。6. 项目复盘失败方案与踩坑记录6.1 错误一试图用一个模型覆盖全部品类项目早期我们为了管理和维护方便做了一个全品类统一模型结果被现实狠狠打脸。连衣裙、牛仔裤、羽绒服、贴身内衣的尺码逻辑差异太大羽绒服要预留宽松量用户才能穿进内搭连衣裙对腰围和裙长极度敏感内衣几乎只靠胸围和罩杯公式。统一模型把所有这些差异揉进特征一试效果非常平庸而且很难定位是哪类数据在拖后腿。换成分品类小模型之后每个模型的特征空间和训练标签都更聚焦上装看胸围肩宽下装看腰围臀围连衣裙专门加了裙长作为额外特征效果立刻提升。教训就是宁可先按上装、下装、连衣裙、外套四类各搞一个小模型也不要贪图省事做一个大而全的统一模型。6.2 错误二把大量工程资源投到模型复杂度上另一段弯路是我们曾想着一步到位把工程资源大量投在跑深度模型上。前期离线指标看起来非常好团队一片乐观最后一分析才发现根本原因不在模型强而是训练集里塞满了大量重复购买同一商品的用户——模型直接学会了上次买过这个码就推荐这个码相当于把作弊答案背了下来。换一批新商品做测试效果立刻崩盘。这件事教会我们离线验证一定要做时序切分训练集只取某时间点前的数据测试集取之后的数据并且要把同一用户对同一商品的重复样本单独剔除。只有在这种设定下仍然表现稳定的模型才具备真实的泛化能力。6.3 迭代方向向尺码商品卡位延伸到后期我们不再只满足于在用户维度上预测尺码而是把视角转向商品维度评估这个SKU的尺码结构是否合理。做法是统计每款商品的尺码销量分布和用户群体的身高体重分布计算两者之间的错配程度。如果某款连衣裙的销量集中在M和L但库存却压在S和XL那就说明商品企划阶段定尺码结构就没有对齐用户需求。更实用的是用这个分析结果反哺设计师和版房如果某个品类在一段时间内持续出现偏小的反馈系统会生成量化提示比如近30天该品类建议尺码比实际版型大一个段位供版房改进。这一步做完尺码推荐就不再是一个单纯的线上转化工具而是成了连接用户需求和生产端的传感器。现在回想起来尺码推荐这个项目的价值最大的部分其实不是那个推荐模型本身而是它迫使整个团队把用户身体数据、商品尺码数据、供应链库存数据真正打通的这个过程。