天池大数据比赛总结

一直想总结一下此次的比赛,拖啊拖。。。一直等到如今,趁着如今要找实习,好好总结一下。机器学习

比赛题目

比赛的官方网站在这,IJCAI SocInf'16学习

此次比赛的题目是给定 2015 年 7 ~ 11 月份的用户在不一样地点口碑购买记录,以及 2015 年 7 ~ 11 月淘宝上用户的购物行为数据,来预测 12 月这一整月用户来到一个地点以后会光顾哪些口碑商铺。这个比赛有一个颇有意思的地方,就是它关注的是一个用户来到一个他以前没有去过的新地点以后,他会去哪些店铺消费,有一点像推荐系统中经典的冷启动问题。比赛提供的数据也有这个特色:测试

  1. 在测试集中,只有 10 % 的用户用以前使用口碑的记录;网站

  2. 有 5 % 的用户虽然有以前使用口碑的记录,可是在测试集中,这些用户来到了新的地点;编码

  3. 全部用户都有他们淘宝购物的行为数据。orm

若是题目只是这样的,其实还不算奇怪,奇怪的是题目的评价标准上加上了 budget 这个神奇的东西,先来看看评价指标:htm

$$P = \frac{\sum_i min(|S_i \cap S_i^*, b_i|)}{\sum_i| S_i^* |}$$排序

$$R = \frac{\sum_i min(|S_i \cap S_i^*, b_i|)}{\sum_i min(|S_i, b_i|)}$$get

$$F_1 = \frac{2 \ast P \ast R}{P + R}$$产品

最后考核的目标是 F1 值。简单来讲一下这个 budget

咱们的目标是在用户来到一个地点以后,给他推荐他可能会去的店铺。这里,把问题转换一下,咱们要给不少店铺来推荐可能会来这里购物的人。这里推荐的人数要受到 budget 的限制,即不能超过店铺的最大承载量以及口碑提供给这家店铺的优惠券的个数。

先详细介绍一下比赛提供的数据格式:

  • Online user behavior before Dec. 2015. (ijcai2016 taobao.csv)

2015 年 7 ~ 11 月淘宝上用户的购物行为数据,包括用户的点击、购买,购买物品种类等属性。

  • Users shopping records at brick-and-mortar stores before Dec. 2015. (ijcai2016 Koubei train.csv)

2015 年 7 ~ 11 月份的用户在不一样地点口碑购买记录,数据格式:(user_id, loc_id, merchant_id, time_stamp)

  • Merchant information (ijcai2016 merchant info.csv)

不一样口碑商铺的位置分布状况,有的商铺有连锁店,数据格式:(merchan_id, loc_id1:loc_id2:...)

  • Prediction result. (ijcai2016 Koubei test.csv)

最后要提交的数据格式

user_id, loc_id, merchant_id1:merchant_id2...

对于这个问题,咱们的想法是,要充分利用每个用户和每个口碑商铺的历史数据。更准确的说,咱们要从训练集中提取足够的可训练的特征,而后利用一些经典的模型,好比 Xgboost 来构建分类模型。同时最须要注意的是,咱们要时刻考虑 budget 的影响。

如何来利用历史数据 ?

咱们分析了题目所给的训练集,而后将数据切分为两部分,第一部分是 2015 年 11 月 23 号以前的数据,咱们把这当作本地训练集;另外一部分是 2015 年 11 月 23 号以后的数据,咱们把这当作本地测试集。经过对这些数据的整理和分析,我发现几条条重大的规律:

  1. 若是地点肯定的话,对于一个用户,他最有可能去的是他曾经光顾过的店。

  2. 从口碑店铺的角度来说,若是这家店铺曾经的销量很好,那么它也将在将来吸引更多的顾客去消费。

从这两条观察出来的规律来看,咱们将探索数据的方向划分为两条道路:一条是从用户的角度出发;另外则是从口碑商店的角度出发。

从用户的历史信息来看

基于咱们的观察,当一我的来到一个他以前去过的地点,他们更倾向于去以前购物过的商店消费。所以,一个在过去的一段时间内在一家商铺的消费次数可以在很大程度上影响咱们的推荐质量。频率越高,越能表明这我的在将来会再次来到这家店消费。

咱们作了一个统计,若是一个用户在过去曾经关顾过一家口碑店铺超过 6 次的话,当咱们在以后再向这位用户推荐这家店的话,咱们会获得超过 90 % 的准确率。

不过从另外一方面说,每一家口碑店铺都有 budget 限制,这意味着,若是按照用户以前光顾过哪家店铺来推荐的话,确定会有部分店铺的 budget 超标。

咱们在用户的数据中找寻这样一个键值对 (user, location, merchant),经过计算这样一个键值对出现的频率,咱们能够统计出 (user, location, merchant, frequency) 的键值对,将这个键值对按照 frequency 来从高到低排序,而后按照这个顺序,从高到低来给 (user, query) 这样一个查询来推荐店铺,直到这家店铺的 budget 耗尽为止。

通过统计发现,平均每个用户在一个地点只会关顾 1.3 个商家,因此在这里咱们限制最大的推荐个数为 4。

从商家的历史信息来看

通过以前的分析,咱们发现不一样的店铺有着不一样的“受欢迎度”。举个例子,“820”这个商家在整个训练集中几乎出现 1/4。问题是咱们怎么定义这个“受欢迎度”呢?

为了解决这个问题,咱们首先定义,在不一样地点的同一家口碑商铺是不同。由于在题目给定的数据中,存在大量的连锁商铺,可是这些连锁店铺在不一样地点的“受欢迎度”是彻底不一样的。

接下来咱们设想这样一种状况,90 % 来到地点 A 的人都会去 商铺 B 消费,在这种状况下,若是咱们给全部的来地点 A 的人都推荐 B 商铺的话,咱们就能获得 90 % 的准确率。因此,在一个地点某家店铺消费的总人数占该地点全部人数的比例,咱们称之为该店铺的 “受欢迎度” (Popularity)。

所以咱们将全部店铺按照 Popularity 从大到小来进行排序,依次推荐来到该地点的全部用户,直到超过 budget。通过一些线下的实验,咱们取这个 Popularity 的值的阈值为 0.25。

引入淘宝数据来提高推荐质量

咱们以前的推荐彻底没有用到每一个人的特征,至关于没法作到“千人千面”。因而接下来咱们就想办法,如何利用淘宝的数据来提高推荐质量。

从直观上并且,淘宝的数据应该颇有帮助,好比,在淘宝上常常浏览或者购买电子产品的人每每不太会去关顾口碑商铺里面那些卖女式服装的。受到这个的启发,咱们就创建了一个这样的表:若是存在这样一条记录,一个用户在淘宝上浏览或者购买的商铺 A;同时也在线下口碑上的商铺 B 消费,咱们就把 (A, B) 这个关系链表放入表中。基于这样的表,咱们对那些以前没有口碑消费记录的新用户,若是他们曾在淘宝上购买或浏览了商铺 A, 那么咱们就只给他推荐在关系链表中与 A 相连的口碑商铺。线上的结果证实,咱们的预测质量提高了。

引入机器学习模型

目前为止咱们都没有怎么用机器学习模型,用普通的规则就能够在天池上面排一个不错的名次。可是为了取得更好的成绩,咱们尝试着去探寻每个用户、地点和商铺的各类各样可能的特征。下面我将详细介绍这些咱们的作法。

咱们将这个问题当作是一个二分类问题。咱们的方法是对每个店铺建模,好比说,在数据集中,用户 u 在地点 l 的店铺 m 消费了。咱们能够产生一个三元组 (u, l, m)。对应于这个三元组,咱们能够产生一些训练数据,首先,对于咱们而言,正样本便是那些消费过的用户,即 (u, l, m) 是 True;第二,咱们的负例是那些一样是这个地点的其余商铺,好比说 m‘,咱们将 (u, l, m') 定义为 False。按照这个方法,咱们能够产生供二分类的训练集。根据这个道理,对于赛题要咱们预测的用户来到一个地点以后会去哪些店铺的状况,咱们也能够根据这个三元组,产生一个每个店铺的预测几率。

这么作其实负样本是不少的。。。为了不正负样本不平衡的问题,咱们采起采样的方法去提取负样本。

特征工程

特征工程对应机器学习来讲十分重要,俗话说,特征是模型的上限。咱们观察到,有些用户喜欢关顾那些他们以前去过的店,有些喜欢光顾该地点上最热门的店铺,有些则喜欢去那些刚开张的店铺。

因此,针对 (u, l, m) 这样一个三元组,咱们试图找寻关于他们其中任意一个的特征。

咱们找寻的特征以下:

  1. 键值对 (u, l, m) 出现的次数,即 frequence,用户关顾这家店的频率。

  2. 键值对 (u, l, m) 是否出现过,True or False。

  3. user_id 的 onehot 编码。

  4. merchant_id 编码。

  5. (l, m) 出现次数,即这个地点这个商店的总销量。

  6. open_interval:店铺的开业时间。

  7. 用户 u 在淘宝上购物的次数

  8. 用户 u 在淘宝上浏览的次数

  9. 用户 u 在淘宝上购买过的商品的种类的 onehot 编码

  10. 用户 u 在淘宝上购买过的商铺的 id 的 onehot 编码

  11. 用户 u 在淘宝上购买的比例 (购买数 / (购买 + 点击)

  12. 用户 u 在淘宝上购买的次数

  13. 用户 u 在淘宝上点击的次数

  14. 经过 SVD 算出来的用户 u 的潜在矩阵

  15. 经过 SVD 算出来的商店 m 的潜在矩阵

模型融合

以前的规则能够得出一个结果,以后的模型也能够得出一个结果,在比赛的最后阶段,咱们对模型进行融合,尝试各类不一样的参数,达到了这个名次。

相关文章
相关标签/搜索