赛题分析

京东提供了用户在2016-02-01-2016-04-15时间区域内用户对商品的行为评价等数据,预测2016-04-16-2016-04-20时间区间内用户的下单情况。
赛题和阿里的第一个竞赛天猫推荐竞赛差不多,记得那时候也有个好心的同学提供了代码的框架,自己胡改一通还进了复赛,总之学习到很多东西。同学们可以找找当时的资料看看,不过现在大家的水平比那时候可高多了。
作为不严谨的效果一般的start code,其目的是为了帮助像我当时一样苦于无思路的朋友们入门这个竞赛,同时希望大家能够取得好成绩并且有所收获。
本文介绍如何用python实现:

  • 如何构造训练集/测试集
  • 时间滑动窗口特征的构造
  • 评测代码
  • 应用xgboost模型

类别特征处理

pandas处理特征非常好用,如下代码处理用户属性表,利用pd.get_dummies方法将类别特征进行编码。

def convert_age(age_str):if age_str == u'-1':return 0elif age_str == u'15岁以下':return 1elif age_str == u'16-25岁':return 2elif age_str == u'26-35岁':return 3elif age_str == u'36-45岁':return 4elif age_str == u'46-55岁':return 5elif age_str == u'56岁以上':return 6else:return -1def get_basic_user_feat():dump_path = './cache/basic_user.pkl'if os.path.exists(dump_path):user = pickle.load(open(dump_path))else:user = pd.read_csv(user_path, encoding='gbk')user['age'] = user['age'].map(convert_age)age_df = pd.get_dummies(user["age"], prefix="age")sex_df = pd.get_dummies(user["sex"], prefix="sex")user_lv_df = pd.get_dummies(user["user_lv_cd"], prefix="user_lv_cd")user = pd.concat([user['user_id'], age_df, sex_df, user_lv_df], axis=1)pickle.dump(user, open(dump_path, 'w'))return user

滑动窗口特征

赛题的要求是预测未来几天用户是否购买某个类目下的商品,经过简单的分析大概有30%的购买是有过行为记录的,所以我们的重点是预测在用户在有过行为记录下的购买情况。

我们现在有用户浏览/点击/购物车等信息的日志,比较简单特征提取方法有:

  • 滑动窗口
  • 时间衰减

在这个不严谨的start code中,我利用滑动窗口处理行为数据。可能有些人要问,什么叫滑动窗口,简单的可以这样理解。用户在购买商品之前,可能会对商品已经有过不同的行为,近期的行为影响较大,远期的行为影响较少。建立在这个逻辑下,我们可以统计不同时间区间内用户的行为累积。

示例代码: 统计时间区间内行为累积

def get_action_feat(start_date, end_date):dump_path = './cache/action_accumulate_%s_%s.pkl' % (start_date, end_date)if os.path.exists(dump_path):actions = pickle.load(open(dump_path))else:actions = get_actions(start_date, end_date)actions = actions[['user_id', 'sku_id', 'type']]df = pd.get_dummies(actions['type'], prefix='%s-%s-action' % (start_date, end_date))actions = pd.concat([actions, df], axis=1)  # type: pd.DataFrameactions = actions.groupby(['user_id', 'sku_id'], as_index=False).sum()del actions['type']pickle.dump(actions, open(dump_path, 'w'))return actions

统计距离预测开始日期前1、2、3、5、7、10、15、21、30的行为累积,别问我为什么这样设计,随手写的。

actions = None
for i in (1, 2, 3, 5, 7, 10, 15, 21, 30):start_days = datetime.strptime(train_end_date, '%Y-%m-%d') - timedelta(days=i)start_days = start_days.strftime('%Y-%m-%d')if actions is None:actions = get_action_feat(start_days, train_end_date)else:actions = pd.merge(actions, get_action_feat(start_days, train_end_date), how='left',on=['user_id', 'sku_id'])

累积特征

start_code中还用到了用户和商品的购买率等累积特征,代码就不贴了。克隆项目即可。

训练集/测试集划分

训练集: [t, t+30] [t+31, t+35]

测试集: [t+5, t+35] [t+36, t+40]

评测代码

由于线上一天只能提交两次,如果需要不断的优化效果,就需要本地的评测代码。
def report(pred, label):actions = labelresult = pred# 所有用户商品对all_user_item_pair = actions['user_id'].map(str) + '-' + actions['sku_id'].map(str)all_user_item_pair = np.array(all_user_item_pair)# 所有购买用户all_user_set = actions['user_id'].unique()# 所有品类中预测购买的用户all_user_test_set = result['user_id'].unique()all_user_test_item_pair = result['user_id'].map(str) + '-' + result['sku_id'].map(str)all_user_test_item_pair = np.array(all_user_test_item_pair)# 计算所有用户购买评价指标pos, neg = 0,0for user_id in all_user_test_set:if user_id in all_user_set:pos += 1else:neg += 1all_user_acc = 1.0 * pos / ( pos + neg)all_user_recall = 1.0 * pos / len(all_user_set)print '所有用户中预测购买用户的准确率为 ' + str(all_user_acc)print '所有用户中预测购买用户的召回率' + str(all_user_recall)pos, neg = 0, 0for user_item_pair in all_user_test_item_pair:if user_item_pair in all_user_item_pair:pos += 1else:neg += 1all_item_acc = 1.0 * pos / ( pos + neg)all_item_recall = 1.0 * pos / len(all_user_item_pair)print '所有用户中预测购买商品的准确率为 ' + str(all_item_acc)print '所有用户中预测购买商品的召回率' + str(all_item_recall)F11 = 6.0 * all_user_recall * all_user_acc / (5.0 * all_user_recall + all_user_acc)F12 = 5.0 * all_item_acc * all_item_recall / (2.0 * all_item_recall + 3 * all_item_acc)score = 0.4 * F11 + 0.6 * F12print 'F11=' + str(F11)print 'F12=' + str(F12)print 'score=' + str(score)

xgboost模型

为什么选择xgboost模型,因为树模型对特征处理的要求不高而且效果也相当不错,不管是类别特征,连续特征效果都很好。在Kaggle竞赛中,该模型通常能取得较好成绩。
user_index, training_data, label = make_train_set(train_start_date, train_end_date, test_start_date, test_end_date)
X_train, X_test, y_train, y_test = train_test_split(training_data.values, label.values, test_size=0.2, random_state=0)    dtrain=xgb.DMatrix(X_train, label=y_train)
dtest=xgb.DMatrix(X_test, label=y_test)
param = {'max_depth': 6, 'eta': 0.05, 'silent': 1, 'objective': 'binary:logistic'}
num_round = 309
param['nthread'] = 4
plst = param.items()
plst += [('eval_metric', 'logloss')]
evallist = [(dtest, 'eval'), (dtrain, 'train')]
bst=xgb.train(plst, dtrain, num_round, evallist)
sub_user_index, sub_trainning_data = make_test_set(sub_start_date, sub_end_date,)
sub_trainning_data = xgb.DMatrix(sub_trainning_data.values)
y = bst.predict(sub_trainning_data)

全部代码链接:https://github.com/foursking1/jd

数据官网下载:http://www.datafountain.cn/projects/jdata/


京东JData算法大赛——高潜用户购买意向预测相关推荐

  1. 京东JData算法大赛-高潜用户购买意向预测(github源码)

    向AI转型的程序员都关注了这个号

  2. 京东算法大赛-高潜用户购买意向预测(一) 资料整理

    初学者可以参考daoliker提供的资料:https://github.com/daoliker/JData,这是一位热心的参赛者提供的一份入门程序,涵盖了数据清洗.数据(统计)分析.特征抽取.搭建模 ...

  3. 京东JData算法大赛高潜用户购买意向预测——复现(并没有),提供数据集

    19-1-15更新,后面改了做法所以随笔烂尾了,具体内容不用看,想参考的可以看下面的参考链接 另外提供数据集在百度云,希望能帮到大家 链接: https://pan.baidu.com/s/1ojjV ...

  4. JData数据处理及高潜用户购买意向预测

    竞赛概述: 本次大赛以京东商城真实的用户.商品和行为数据(脱敏后)为基础,参赛队伍需要通过数据挖掘的技术和机器学习的算法,构建用户购买商品的预测模型,输出高潜用户和目标商品的匹配结果,为精准营销提供高 ...

  5. 京东JData2017算法大赛高潜用户购买意向预测数据集下载

    找了老半天,都没找到,要么链接过期,要么要收费,感觉这种东西收费不是很君子,毕竟这东西不是咱们自己产的嘛,感谢这位博主,下面是这位博主提供的下载链接 这位博主还提供了一些复现的思路,大家可以学习下 链 ...

  6. 京东JData算法大赛决赛圆满完成 30万冠军巨奖花落“鲁班七号”

    6月6日,由京东集团和英特尔联合主办,创造算法大赛单体赛参赛人数世界纪录的京东JData算法大赛举行了线下决赛,60万元大奖和Special offer均已名花有主,针对"高潜用户购买意向预 ...

  7. 京东JData算法大赛小结(公司内部赛)

    总体解决方案 本文将高潜用户购买意向预测,抽象为一个二分类问题.从用户,商品,品牌,用户-商品,用户-品牌五个维度进行特征提取.将观察天未来5天有购买行为的用户-商品对标记为正样本,观察天过去30天至 ...

  8. 京东用户购买意向预测(一)

    数据清洗 故事背景: 数据集: 数据挖掘流程: 数据集验证 首先检查JData_User中的用户和JData_Action中的用户是否一致 因为数据量很大所以每次读取的时间有点长,所以很着急看结果的话 ...

  9. 【机器学习】京东用户购买意向预测-数据集介绍和数据清洗 - 1

    主题:京东用户购买意向预测 数据集: 这里涉及到的数据集是京东最新的数据集: JData_User.csv 用户数据集 105,321个用户 JData_Comment.csv 商品评论 558,55 ...

最新文章

  1. linuxmessage日志消失_某工的centos7 启动了rsyslog之后,日志/var/log/messages等都不产生日志了,都是空的。求大神解决!...
  2. 看完苹果这场最新发布会,我只能说:太sao了
  3. 收缩分割多边形(PSENet中有使用)
  4. Process Explorer 进程管理利器常用功能(中)
  5. ICCV'21 Oral|拒绝调参,显著提点!检测分割任务的新损失函数RS Loss开源
  6. Redhat as5和fedora,centos一样使用yum管理软件
  7. 2017/07/27 工作日志
  8. 计算机等级考试四级--软件工程
  9. x64 - reject driver loading
  10. matlab高通滤波器除噪声,基于MATLAB的FIR滤波器的设计及应用(信号去噪).doc
  11. roundcube webmail登陆失败怎么回事_智慧团建登陆官网入口手机
  12. 关闭极域电子教室学生端的各种方法
  13. html怎么写海贼王旗帜图片,海贼王精美旗帜套图
  14. 一文读懂Auth0与Azure AD的区别
  15. C#(Csharp)基础教程(上)(菜鸟教程笔记)
  16. 矩阵和矢量的点乘推导及其简单应用
  17. TCP协议 握手与挥手
  18. 为什么上班只是坐着,一天下来还是觉得好累?
  19. 怎么用Folx下载制作短视频所用的素材
  20. unas基于_UNAS 2.0 Ushare Edition系统 NAS 软件 固件 收费版支持更新

热门文章

  1. 计算机二级四级分享经验,英语四级过关经验干货分享,从口语到写作,建议转发收藏!...
  2. 论网络少女包包啊紫-真善美
  3. 大连华信拒绝东软绣球 双方合并案流产,东软跌停
  4. 长时间停留在calculating requirements and dependencies
  5. matlab进行频谱分析
  6. 码云git push报错 DeployKey does not support push code 解决办法
  7. Spring的理解以及注解配置Spring
  8. 印花税下调为千分之一
  9. Python中item()和items()的用法
  10. loadrunner中C函数(带例子)