概述
Mercari,日本最大的社区驱动的购物应用,深深知道这个问题。他们想向卖家提供价格建议,但这很难,因为卖家可以在Mercari的市场上投放几乎任何东西或任何东西。
在这场竞赛中,Mercari挑战您建立一种算法,该算法自动提示合适的产品价格。您将获得用户输入的有关其产品的文字描述,包括诸如产品类别名称,品牌名称和商品状态之类的详细信息。
具体可以参考:https://www.kaggle.com/c/mercari-price-suggestion-challenge
注意事项
最后的评估标准为平均算术平方根误差Root Mean Squared Logarithmic Error.
![image.png](https://segmentfault.com/img/bVbK75n)
其中:
- 最后提交的文件为test_id ,price 包含两列数据,一列为测试数据中id,另一列为预测的价格.
训练集或者测试集中包括以下特征:
- train_id test_id 物品的编号,一个商品对应一个编号
- name 名称
- item_condition_id 物品状态
- category_name 品类
- brand_name 品牌
- price 物品售出的价格,测试集中不包含此列,此列也为我们要预测的值
- shipping 1 if shipping fee is paid by seller and 0 by buyer,也就是1代表包邮,0代表不包邮
- item_description 物品的详细描述,描述中已经除去带有价格标签的值,已用[rm]代替
思路启发——Bird
这部分主要学习比赛季军bird的想法,具体地址:https://zhuanlan.zhihu.com/p/34061253
代码可以在比赛官网上找到。
思路
既然是限时赛,那么我们要做的事情就是通过人的先验知识去为模型铺好道路,让它沿着最优的梯度一路滑下去。商品定价回归不同于文本分类,并不是简单的截取单个关键字就可以进行判断,而是由关键词之间会有强烈的互作用力:比如苹果+手机产生的价格远远高于他们各自价格相加,所以奠定了FM会是隐层中一个非常有效的回归工具。而且二手市场大部分都是女性用户,冗长的文本拥有大量信息,那么输入端提取特征时nn的embedding也是一个很好的选择。
预处理
预处理占据了代码的70%,但却是最不提分的部分。一个优秀的模型奠定了你的baseline,预处理只能给你锦上添花。如果不是参加比赛的选手其实可以忽略冗长的预处理:基本就是给拼写错误的单词纠正,干掉奇怪的符号,把法语字母翻译成英文字母等。
NN系列模型:
模型结构如下:
四个input分别代表一些普通数值特征、商品分类embedding、商品名称+商标的短文本以及商品详细信息长文本。普通特征用Dense处理、文本使用cnn+attention。
高光细节
1. 文本的处理
首先放弃了lstm使用快速的cnn和attention,让模型训练在cpu下也可以非常快的处理embedding。特征方面把商品名字和商品商标放在一起作为一个短文本,我之前有一篇博客专门谈过这个加速训练的方案,比赛后我惊讶地发现这个思路很多top选手也用了,殊途同归。
2. 训练技巧
模型训练为了极致优化时间,我甚至将每个ep的batchsize和optimizer手动控制,让前期的batchsize小lr大——小步迅速迭代更新,后期batchsize大lr小——finetune。为了让参数最优,几乎所有参数都是靠不断猜想尝试+盯着loss的每一跳感受模型的梯度下降调整的......养成盯进度条的习惯有好处的。
3. 激活函数
大量运用了concat不同激活函数的方式。本来一个relu的结构,我习惯用一个relu和sigmoid拼接,甚至再加一个linear。我认为每一层的隐层特征里面既有表达是与否的二分类特征也有表达程度的量特征,用任何一个激活函数都是会有信息丢失,最合适的方式是让模型的梯度自行选择合适的激活函数。