天池新人实战赛《阿里移动推荐算法》(二)—— 平台赛人工规则

   注:作为新手,基本思路来源于天池官网的视频教程,本文仅用于在天池的数加平台上学习后所作的个人总结,特此声明。

   视频网址:https://tianchi.shuju.aliyun.com/video.htm?spm=5176.100068.1234.7.7Kftz1 《新手入门赛-第三课时》

一、初始化数据:

  step0_original_data

 1 --odps sql
 2 --**********************************************************************************--
 3 --author:smilemoon
 4 --create time:2017-01-16 9:46
 5 --**********************************************************************************--
 6 --导入用户历史行为表
 7 DROP TABLE IF EXISTS DX_TRAIN_USER;
 8 
 9 CREATE TABLE DX_TRAIN_USER
10 AS
11 SELECT *
12 FROM odps_tc_257100_f673506e024.tianchi_fresh_comp_train_user_online;
13 
14 --导入商品历史行为表
15 DROP TABLE IF EXISTS DX_TRAIN_ITEM;
16 
17 CREATE TABLE DX_TRAIN_ITEM
18 AS
19 SELECT *
20 FROM odps_tc_257100_f673506e024.tianchi_fresh_comp_train_item_online;

 

二、分割训练集和测试集数据:

  思路:使用第1天到第29天(2014-11-18~2014-12-17)的数据作为训练集,第30天(2014-12-18)作为测试规则的集合。

 1 --odps sql
 2 --**********************************************************************************--
 3 --author:smilemoon
 4 --create time:2017-01-16 9:59
 5 --**********************************************************************************--
 6 -- 划分逻辑:根据赛题任务,确定划分的时间节点为“2014-12-18 00”
 7 -- 训练集
 8 DROP TABLE IF EXISTS DX_DATA_TRAIN;
 9 
10 -- 获取所有2014-12-18号之前的数据作为训练集
11 CREATE TABLE DX_DATA_TRAIN
12 AS
13 SELECT 
14     *
15 FROM 
16     DX_TRAIN_USER
17 WHERE 
18     TIME < '2014-12-18 00';
19 
20 -- 测试集
21 DROP TABLE IF EXISTS DX_DATA_TEST;
22 
23 CREATE TABLE DX_DATA_TEST
24 AS
25 SELECT 
26     A.USER_ID, A.ITEM_ID
27 FROM (
28     --获取所有2014-12-18当天的购买记录( BEHAVIOR_TYPE = 4),并按照user_id,item_id分组
29     SELECT 
30         USER_ID, ITEM_ID
31     FROM 
32         DX_TRAIN_USER
33     WHERE TIME >= '2014-12-18 00'
34         AND BEHAVIOR_TYPE = 4
35     GROUP BY USER_ID, 
36         ITEM_ID
37 )A
38 --左外连接DX_TRAIN_ITEM 规定的商品子集
39 --思考:为什么使用左外连接?
40 --左外连接:先保留所有左边的购买记录,右边可能会出现ITEM_ID为null的情况
41 --再根据 WHERE !ISNULL(B.ITEM_ID)排除掉
42 LEFT OUTER JOIN DX_TRAIN_ITEM B
43 -- RIGHT OUTER JOIN DX_TRAIN_ITEM B
44 -- FULL OUTER JOIN DX_TRAIN_ITEM B
45 ON A.ITEM_ID = B.ITEM_ID
46 WHERE !ISNULL(B.ITEM_ID)
47 GROUP BY A.USER_ID, A.ITEM_ID;
48 
49 --能否使用右外连接和全外连接?
50 --经测试,右连接与全外连接得到的F1值没有发生改变,目前仅从F1的维度来看,不考虑执行效率,与左外链接没有什么区别。

 

三、单一维度人工规则构造:

 1 --odps sql
 2 --**********************************************************************************--
 3 --author:smilemoon
 4 --create time:2017-01-16 10:40
 5 --**********************************************************************************--
 6 
 7 --第一条规则(最近购物车规则):用户最后一天加入购物车的商品,下一天会购买
 8 --优化1:用户购买了当天加入购物车的商品,下一天不会购买。
 9 --优化2:用户后半天加入购物车的商品,下一天更可能购买。
10 
11 DROP TABLE IF EXISTS DX_R_1;
12 CREATE TABLE DX_R_1 AS
13 SELECT  C.USER_ID,C.ITEM_ID
14 FROM (
15     SELECT A.USER_ID,A.ITEM_ID
16     FROM 
17     (
18         -- 查找在2014-12-17 12点到2014-12-18 0点之间发生过加入到购物车行为的记录 A
19         SELECT USER_ID,ITEM_ID
20         FROM DX_DATA_TRAIN
21         WHERE TIME >= "2014-12-17 12" AND TIME < "2014-12-18 00" AND BEHAVIOR_TYPE == 3
22         GROUP BY USER_ID,ITEM_ID
23     )A
24     LEFT OUTER JOIN
25     (
26         -- 查找在2014-12-17 12点到2014-12-18 0点之间发生过加入到购买行为的记录 B
       -- 经测试2014-12-17 13点的F1要略高些 5.95->5.97
27 SELECT USER_ID,ITEM_ID 28 FROM DX_DATA_TRAIN 29 WHERE TIME >= "2014-12-17 12" AND TIME < "2014-12-18 00" AND BEHAVIOR_TYPE == 4 30 GROUP BY USER_ID,ITEM_ID 31 )B 32 ON A.USER_ID == B.USER_ID AND A.ITEM_ID == B.ITEM_ID 33 -- 取ISNULL(B.ITEM_ID) 是因为在当天加入购物车并购买的人 一般情况下第二天会继续购买的概率会很低 34 WHERE ISNULL(B.ITEM_ID) 35 --查找在2014-12-17 12点到2014-12-18 0点之间发生过加入到购物车行为,但没有购买的记录 C 36 )C 37 -- 并且商品是在规定的商品子集之中 38 LEFT OUTER JOIN DX_TRAIN_ITEM D 39 ON C.ITEM_ID == D.ITEM_ID 40 WHERE !ISNULL(D.ITEM_ID) 41 GROUP BY C.USER_ID,C.ITEM_ID;

 

 

四、多维度规则构造:

  

五、F1公式线下评估:

 1 --odps sql
 2 --**********************************************************************************--
 3 --author:smilemoon
 4 --create time:2017-01-16 11:12
 5 --**********************************************************************************--
 6 
 7 
 8 SELECT C.PRECISION,C.RECALL,2 * C.PRECISION * C.RECALL / (C.PRECISION + C.RECALL) AS F1
 9 FROM
10 (
11     --格式:IF(Condition,A,B)
12     --意义:当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。
13     SELECT SUM(IF(!ISNULL(A.ITEM_ID) AND !ISNULL(B.ITEM_ID),1,0)) / SUM(IF(!ISNULL(A.ITEM_ID),1,0)) AS PRECISION,
14            SUM(IF(!ISNULL(A.ITEM_ID) AND !ISNULL(B.ITEM_ID),1,0)) / SUM(IF(!ISNULL(B.ITEM_ID),1,0)) AS RECALL
15     FROM DX_R_1 A
16     --进行全外连接 先将所有的数据拼装成一张大表
17     FULL OUTER JOIN DX_DATA_TEST B
18     ON A.USER_ID == B.USER_ID AND A.ITEM_ID == B.ITEM_ID
19 )C;

 

 

 六、提交预测结果:

  基本过程与规则相同,但是要修改训练数据集为所有数据,也就是DX_TRAIN_USER。日期范围也要从2016-11-18~2016-12-17扩大到2016-11-18~2016-12-18。

 1 --odps sql
 2 --**********************************************************************************--
 3 --author:smilemoon
 4 --create time:2017-01-16 11:35
 5 --**********************************************************************************--
 6 
 7 DROP TABLE IF EXISTS TIANCHI_MOBILE_RECOMMENDATION_PREDICT;
 8 CREATE TABLE TIANCHI_MOBILE_RECOMMENDATION_PREDICT AS 
 9 SELECT  C.USER_ID,C.ITEM_ID
10 FROM (
11     SELECT A.USER_ID,A.ITEM_ID
12     FROM 
13     (
14         SELECT USER_ID,ITEM_ID
15         FROM DX_TRAIN_USER
16         WHERE TIME >= "2014-12-18 12" AND TIME < "2014-12-19 00" AND BEHAVIOR_TYPE == 3
17         GROUP BY USER_ID,ITEM_ID
18     )A
19     LEFT OUTER JOIN
20     (
21         SELECT USER_ID,ITEM_ID
22         FROM DX_TRAIN_USER
23         WHERE TIME >= "2014-12-18 12" AND TIME < "2014-12-19 00" AND BEHAVIOR_TYPE == 4
24         GROUP BY USER_ID,ITEM_ID
25     )B
26     ON A.USER_ID == B.USER_ID AND A.ITEM_ID == B.ITEM_ID
27     WHERE ISNULL(B.ITEM_ID)
28 )C
29 LEFT OUTER JOIN DX_TRAIN_ITEM D
30 ON C.ITEM_ID == D.ITEM_ID
31 WHERE !ISNULL(D.ITEM_ID)
32 GROUP BY C.USER_ID,C.ITEM_ID;

 

posted @ 2017-01-16 13:37  gold_worker  阅读(487)  评论(0)    收藏  举报