实战淘宝穿衣搭配
实战淘宝穿衣搭配
#算法实战
1. 说明
《淘宝穿衣搭配》比赛是 2015 年的一个天池算法比赛,现已开放为新人赛,仍可下载数据,上传结果及计算排名。具体地址是:https://tianchi.aliyun.com/getStart/information.htm?spm=5176.100067.5678.2.78904065HrZLpP&raceId=231575
这是一个集图片、文字、数据挖掘于一体的比赛,可下载的数据是千万级的,在网上也可以找到冠军及一些选手的解题思路。新人可用来练手,通过评分定位自己的实力,也能从前人的思路中受到启发。
2. 具体问题
竞赛数据包含三部分,分别是:商品基本信息数据(分类、文本、图像);用户历史行为数据(用户、商品、购买时间);和专家提供的搭配套餐数据(商品组合)。任务是预测给定商品最佳搭配的前 200 个商品。具体计分公式是:
其中 n 表示答案集合中商品的数量,p(k) 表示在 k 截断之前的预测准确率,当第 k 个商品在答案集合中Δ(k) 为 1,否则为 0。从中可见:在答案中越靠前的商品权重越大。 购物表数据共 1361 万条,用户 110 万个,50 万种商品,不重复关键字 8 万多个,280 种分类。
3. 问题分析
测试集中的数据均未出现在专家推荐表中,无法直接使用专家推荐。测试集中出现的商品大约有一半即没被购买过,也没被推荐过,要想对预测它的搭配,就需要找到与之类似的商品。因此本题可分解成两部分:求某商品的最佳搭配,求某商品的近似商品。 求最佳搭配,可在专家推荐表中获取商品所在组中的其它商品,用户购买记录可将用户在某一时段购买的商品认为是可配搭商品,并从中减掉不可搭配的品种。不可搭配的品种由专家推荐表算出,280 个类别可以有约 280x280 种组合,而专家给出的可组合类别只有不到 1000 种。 求近似商品,可通过商品信息中商品的分类,关键字,图片计算,主要使用在同类中找关键字 TF/IDF 加权后最近似的商品。
4. 无监督学习和半监督学习
此题代表了一类典型的问题:从以往的用户行为中寻找规律,以便辅助和引导用户之后的行为,像视频,新闻,购物推荐都属于此类问题,俗称啤酒尿布问题(在超市购物时买尿布的往往也买啤酒)。 此题应该算是一个无监督或半监督学习问题。尽管用公式给出了计分标准,但开发者仍不知道预测搭配的 5000x200 项中,具体哪些正确的,哪些是错误的。线上每天只有两次评分机会,根据其反馈只能在粗略的方向上调整。
因为是无监督学习,各个特征影响的大小,很多都是靠人和经验和猜,然后花大量的时间在线上验证自己的猜测,监督学习算法,迭代改进算法都无法使用。于是在第二赛段,有些选手将其改造成半监督学习:通过专家推荐生成正例,通过随机抽取生成反例,这样就可以代入算法了。常用于处理无监督学习的方法有聚类,关联规则,规则等等。
5. 规则算法
有人把此题解法戏称为“规则吊打”,就是说它非常考验规则。再看看自己的解法,以及别人分享出的算法,前期几乎都是“人”总结出来的规则,比如:同一个人在同一季节购买的更可能是搭配,对同时购买次数进行排序,有些类别不适合搭配等等。如果不知道数据的具体意义,这些规则都无法获得。当然,这也是特征工程的一部分。 常见的与规则相关的算法有从决策树中抽取规则,它是一个监督学习;还有关联规则,比如 Apriori 算法或 Fp-Growth 算法,基本都属于统计类算法,该类算法也适用于本文中的问题。
6. 文本分析
题目给出的数据中包括商品的描述,给出的不是具体的文字,而是其关键字转换成的 ID 号,就是说一个商品的描述信息由多个 ID 号组成。如果两件商品都包括很多同样的关键字,则说明它们可能是近似商品。这只是一个粗略的比较,可能与一件相品关键字个数相同的几百件商品,所以还要考虑每个关键字的重要程度。几乎所有人都使用了 TF/IDF 算法,使用中也有一些技巧,比如在什么范围内取 IDF?是在同一类中取,还是在所有商品中取。
7. 图像处理
除了数据表,此题还提供了好几 G 的图片,也是用来计算商品的相似度和搭配度的,由于图片太多,处理时间太长,并且需要大量存储空间,所以很多人都忽略了该特征。也有人处理了其中的一部分,比如只在找不到搭配信息,没有购买记录,又找不到关键字类似的商品时,才分析其图片信息。求取图片特征的方法可以用 SIFT(有相应的 python 库),即尺度不变特征变换。
8. 一些小技巧
(1) 大数据问题
此题应该算是数据量较大的问题,一次处理上千万条数据,内存不够会让程序运行起来非常慢,又只能使用一个 cpu,因此在前期处理时,可切成了几个小数据集,用多线程分别计算后再合并。
(2) 按时间分组
除了统计每个用户购买的所有商品以外,还需要考虑季节,比如冬天的不能和夏天的搭配,可使用判断前后一个月内购买,以及将时间分为春夏秋冬等方法。
(3) 简化成模型
题目给的信息量很大,而我们关注的只是测试集中的 5000 个商品,以及与它近似的商品,因此,在前期可以先不考虑简化成模型,因为简化都或多或少会造成数据损失。
(4) 上传结果评分
如果同时改进了几个问题,那最好分开评测,因为同时提交,会分不清哪些是加分项,哪些是减分项。