天池新人实战赛《阿里移动推荐算法》(二)—— 平台赛人工规则
注:作为新手,基本思路来源于天池官网的视频教程,本文仅用于在天池的数加平台上学习后所作的个人总结,特此声明。
视频网址: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;

浙公网安备 33010602011771号