🔥 Kaggle Mercari 商品价格预测:一篇带你从“懵”到“懂”的实战指南
这篇文章,是我在做 Kaggle 的 Mercari Price Suggestion Challenge 时的一些总结和踩坑记录。
不是学术论文,也不是硬邦邦的官方文档,而是一个普通开发者在 Kaggle 上“一边掉头发一边调模型”的真实心得。
如果你也想搞懂推荐/定价模型、稀疏矩阵、TF-IDF、SVD、Ridge 回归这些关键技能,我相信这篇文章你会喜欢。
1. 项目背景:Mercari 想让 AI 来帮用户“估价”
Mercari 是日本版的 “闲鱼”。
你卖东西时要自己填标题、描述、品牌、类别、成色……
平台想用算法来预测一个合理价格,让新手卖家别乱标价。
比赛的目标很简单:
👉 根据商品信息预测最终售价
你要做的是一个“自动估价系统”。
数据不小,一共有:
- 148 万条训练数据
- 73 万条测试数据
而且里面掺了大量文本字段,是一个典型的“结构化 + NLP”混合难题。
2. 数据长啥样?(一句话:该有的全有)
核心字段包括:
| 字段 | 含义 |
|---|---|
name | 商品标题(字数不多但很关键) |
item_description | 商品描述(文字又多又乱) |
brand_name | 品牌(缺失超级多) |
category_name | 三层类别(A/B/C 格式) |
item_condition_id | 成色(1=新) |
shipping | 1=包邮 |
price | 目标值 |
做过电商模型的同学看到这个字段列表,大概率直呼:
“这不就是我上班每天在做的东西吗?”
很对,这个项目真的很贴近实际业务。
3. 为什么几乎所有人都先对价格取 log?
原始价格分布是“典型长尾”。
便宜货一大堆,几千几万的贵价货偶尔来一个。
直接预测原始价格,模型会被大额数据支配。
于是我们都这么干:
y_log = np.log1p(price)
预测时再:
pred_price = np.expm1(pred_log)
Kaggle 的评估指标是 RMSLE(对 log 空间更友好),
所以这波算数据科学家与数学家双赢。
4. 特征工程:关键中的关键
如果你只想跑通 baseline,那推荐直接跳到后面;
如果你真想把模型分数干到“看起来还挺像回事儿”,特征工程一定要好好做。
4.1 文本特征:真正的核心武器(毫不夸张)
nameitem_description
这两个字段完全决定你的模型上限。
为什么?
因为定价最关键的信息,都藏在文字里:
- 品牌型号(iPhone 14?AirPods?)
- 成色(like new、broken)
- 配件(with charger)
- 使用情况(barely used once)
最经典的做法是:
👉 TF-IDF(1~2 gram) → 稀疏高维向量
用 sklearn 就行:
TfidfVectorizer(ngram_range=(1,2), min_df=2, dtype=np.float32)
4.2 类别特征:One-Hot + 分层 Target Encoding(TE)
brand_name
- 缺失特别多
- 不需要全部保留,取前几千个出现频率最高的就够了
category_name
拆成三层:
cat1 / cat2 / cat3
你既可以做 One-Hot,也可以做 Target Encoding。
我个人感觉——:
TE(分层)更符合人类对“类别价格”的认知
示例:
- cat1_te:顶层类别均价
- cat2_te:二层类别均价(不足回退 cat1)
- cat3_te:三层类别均价(不足回退 cat2 → cat1)
这是结构化特征的“灵魂补丁”。
4.3 数值特征:简单但有用
- shipping(包邮通常更便宜)
- item_condition(成色越新越贵)
- 以及前面算好的 TE 特征
全部转成稀疏矩阵,与 TF-IDF 拼起来就对了。
5. 稀疏矩阵大拼装:四大块拼成一个超大 CSR
训练数据是上百万条,特征维度可能十几万甚至几十万。
普通 numpy 肯定 GG,所以我们用 稀疏矩阵 CSR。
from scipy.sparse import hstack
X = hstack([X_name, X_desc, X_cat, X_num], format='csr')
能省掉成吨的内存。
6. SVD 降维:把“词袋稀疏”变成“语义密集”
稀疏 TF-IDF 特征虽然强,但维度太大,噪声也多。
所以我们用:
👉 TruncatedSVD(n_components=300~500)
你没看错,一个本来几万维的特征,压成 400 维还能保持语义。
这一步对模型效果提升非常明显。
7. 模型选择:Ridge 回归是这个任务里的“小钢炮”
很多不熟 Kaggle 的同学一看项目就想上 XGBoost/LGBM。
当然可以,但有一说一:
在大规模稀疏文本任务里,Ridge 是真正的性价比之王。
- 训练快
- 内存友好
- 不容易过拟合
- 对 SVD 后的特征响应特别强
结合 TF-IDF + SVD,能把 RMSLE 做到 0.43 左右(很优秀)。
8. 验证与反变换:几行代码的小细节
预测完 log 值后一定要安全还原:
val_pred = np.expm1(val_pred_log)
val_pred = np.clip(val_pred, 0, None)
val_pred[~np.isfinite(val_pred)] = 0
这样能避免负价格、inf、NaN 等坑人情况影响得分。
9. 模型效果参考
| 方法 | RMSLE |
|---|---|
| 无文本特征 | ~0.52 |
| TF-IDF + Ridge | 0.46~0.47 |
| + SVD | 0.43~0.44 |
| 多模型融合 | 0.42~0.43 |
如果你做到 0.43,基本就是 leaderboard 中上水平。
10. 我对这个项目的真实感受
- 这是一个练习文本特征工程的神级项目
- 也是理解稀疏矩阵处理流程的最佳机会
- 更是企业真实推荐/定价系统的“缩影”
- 数据大、字段乱、文本噪声多,很贴近真实业务
- 如果你未来要靠 NLP + 结构化模型吃饭,这项目必须做一遍

被折叠的 条评论
为什么被折叠?



