竞赛概述:

本次大赛以京东商城真实的用户、商品和行为数据(脱敏后)为基础,参赛队伍需要通过数据挖掘的技术和机器学习的算法,构建用户购买商品的预测模型,输出高潜用户和目标商品的匹配结果,为精准营销提供高质量的目标群体。同时,希望参赛队伍能通过本次比赛,挖掘数据背后潜在的意义,为电商用户提供更简单、快捷、省心的购物体验。

数据介绍:

符号定义:
S:提供的商品全集;
P:候选的商品子集(JData_Product.csv),P是S的子集;
U:用户集合;
A:用户对S的行为数据集合;
C:S的评价数据。

训练数据部分:
提供2016-02-01到2016-04-15日用户集合U中的用户,对商品集合S中部分商品的行为、评价、用户数据;提供部分候选商品的数据P。
选手从数据中自行组成特征和数据格式,自由组合训练测试数据比例。

预测数据部分:
2016-04-16到2016-04-20用户是否下单P中的商品,每个用户只会下单一个商品;抽取部分下单用户数据,A榜使用50%的测试数据来计算分数;B榜使用另外50%的数据计算分数(计算准确率时剔除用户提交结果中user_Id与A榜的交集部分)。

1、用户数据

2、商品数据

3、评价数据

4、行为数据

任务描述:

参赛者需要使用京东多个品类下商品的历史销售数据,构建算法模型,预测用户在未来5天内,对某个目标品类下商品的购买意向。对于训练集中出现的每一个用户,参赛者的模型需要预测该用户在未来5天内是否购买目标品类下的商品以及所购买商品的SKU_ID。评测算法将针对参赛者提交的预测结果,计算加权得分。

评分标准:

参赛者提交的结果文件中包含对所有用户购买意向的预测结果。对每一个用户的预测结果包括两方面:
1、该用户2016-04-16到2016-04-20是否下单P中的商品,提交的结果文件中仅包含预测为下单的用户,预测为未下单的用户,无须在结果中出现。若预测正确,则评测算法中置label=1,不正确label=0;
2、如果下单,下单的sku_id (只需提交一个sku_id),若sku_id预测正确,则评测算法中置pred=1,不正确pred=0。
对于参赛者提交的结果文件,按如下公式计算得分:
Score=0.4*F11 + 0.6*F12
此处的F1值定义为:
F11=6*Recall*Precise/(5*Recall+Precise)
F12=5*Recall*Precise/(2*Recall+3*Precise)
其中,Precise为准确率,Recall为召回率.
F11是label=1或0的F1值,F12是pred=1或0的F1值.

数据清洗:

比赛的题目是高潜用户的购买意向的预测,从机器学习的角度来讲,可以认为这是一个二分类的任务。那么就是要构建正负样本.
由于拿到的是原始数据,里面存在很多噪声,因而第一步先要对数据清洗,比如说:

  • 去掉只有购买记录的用户(没有可用的历史浏览等记录来预测用户将来的购买意向)
  • 去掉浏览量很大而购买量很少的用户(惰性用户或爬虫用户)
  • 去掉最后5(7)天没有记录(交互)的商品和用户
  • ......

为了能够进行上述清洗,在此首先构造了简单的用户(user)行为特征和商品(item)行为行为特征,对应于两张表user_table和item_table

  • user_table特征包括:
    user_id(用户id),age(年龄),sex(性别),
    user_lv_cd(用户级别),browse_num(浏览数),
    addcart_num(加购数),delcart_num(删购数),
    buy_num(购买数),favor_num(收藏数),
    click_num(点击数),buy_addcart_ratio(购买加购转化率),
    buy_browse_ratio(购买浏览转化率),
    buy_click_ratio(购买点击转化率),
    buy_favor_ratio(购买收藏转化率)
  • item_table特征包括:
    sku_id(商品id),attr1,attr2,
    attr3,cate,brand,browse_num,
    addcart_num,delcart_num,
    buy_num,favor_num,click_num,
    buy_addcart_ratio,buy_browse_ratio,
    buy_click_ratio,buy_favor_ratio,
    comment_num(评论数),
    has_bad_comment(是否有差评),
    bad_comment_rate(差评率)

探索高潜用户的行为:

比赛的题目是高潜用户购买意向预测, 那么理解清楚什么是高潜用户对于数据分析,特征抽取,以及之后的建立模型有着至关重要的作用.
简单来讲,作为训练集的高潜用户应该具有以下特征:

  • 必须有购买行为
  • 对一个商品购买和其他交互行为(浏览,点击,收藏等)时间差应该多于一天
    因为根据赛题,我们需要预测未来5天的购买情况,那么如果用户对某商品在同一天完成所有的交互行为(包括购买),
    无法从这种交易中指导未来的预测.

特征工程:

用户相关特征:

主要根据用户数据集,对用户原本的年龄、性别、用户等级,采用独热编码。

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 -1
        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)

商品相关特征:

根据商品数据集和评论数据集,对商品属性特征a1、a2、a3,和评论数量comment_num,进行独热编码

        product = pd.read_csv(product_path)attr1_df = pd.get_dummies(product["a1"], prefix="a1")attr2_df = pd.get_dummies(product["a2"], prefix="a2")attr3_df = pd.get_dummies(product["a3"], prefix="a3")product = pd.concat([product[['sku_id', 'cate', 'brand']], attr1_df, attr2_df, attr3_df], axis=1)
        comments = comments[(comments.dt >= comment_date_begin) & (comments.dt < comment_date_end)]df = pd.get_dummies(comments['comment_num'], prefix='comment_num')comments = pd.concat([comments, df], axis=1) # type: pd.DataFramecomments = comments[['sku_id', 'has_bad_comment', 'bad_comment_rate', 'comment_num_1', 'comment_num_2', 'comment_num_3', 'comment_num_4']]

提取商品在某段时间内的浏览购买转化率,加入购物车购买转化率,收藏购买转化率,点击购买转化率,可展现该商品在近期的人气与热门程度,方便预测该商品是否为用户可能购买的高潜商品。

        actions = get_actions(start_date, end_date)df = pd.get_dummies(actions['type'], prefix='action')actions = pd.concat([actions['sku_id'], df], axis=1)actions = actions.groupby(['sku_id'], as_index=False).sum()actions['product_action_1_ratio'] = actions['action_4'] / actions['action_1']actions['product_action_2_ratio'] = actions['action_4'] / actions['action_2']actions['product_action_3_ratio'] = actions['action_4'] / actions['action_3']actions['product_action_5_ratio'] = actions['action_4'] / actions['action_5']actions['product_action_6_ratio'] = actions['action_4'] / actions['action_6']

用户行为相关特征:

提取从起始日期start_date到截止日期end_date内的行为数据集,对用户行为类型type做one-hot编码,然后使用聚合函数groupby,对user_id,sku_id进行聚合分组,对组内的其他特征进行相加,即可统计出在此期间用户对商品的各种行为类型的累计交互次数。

这个函数方便后面采用划窗方式,多次提取不同时间段的用户行为累计特征。

        actions = actions[(actions.time >= start_date) & (actions.time < 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()

提取按时间衰减的累计行为特征,使用匿名函数lambda提取出每条行为数据发生时间与截止日期的相隔天数,然后对相隔天数取反,作为对数函数的指数。这样若发生交互行为的数据离要预测的日期离得越远,那么它对预测所占的权重指数就越小。

        actions = actions[(actions.time >= start_date) & (actions.time < end_date)]df = pd.get_dummies(actions['type'], prefix='action')actions = pd.concat([actions, df], axis=1) # type: pd.DataFrame#近期行为按时间衰减actions['weights'] = actions['time'].map(lambda x: datetime.strptime(end_date, '%Y-%m-%d') - datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))#actions['weights'] = time.strptime(end_date, '%Y-%m-%d') - actions['datetime']actions['weights'] = actions['weights'].map(lambda x: math.exp(-x.days))actions['action_1'] = actions['action_1'] * actions['weights']actions['action_2'] = actions['action_2'] * actions['weights']actions['action_3'] = actions['action_3'] * actions['weights']actions['action_4'] = actions['action_4'] * actions['weights']actions['action_5'] = actions['action_5'] * actions['weights']actions['action_6'] = actions['action_6'] * actions['weights']actions = actions.groupby(['user_id', 'sku_id', 'cate', 'brand'], as_index=False).sum()

通过提取用户的点击购买转化率,加入购物车后购买转化率,以及浏览购买转换率,可以更深刻的刻画该用户是否是要寻找的高潜购买用户对象。

        actions = get_actions(start_date, end_date)df = pd.get_dummies(actions['type'], prefix='action')actions = pd.concat([actions['user_id'], df], axis=1)actions = actions.groupby(['user_id'], as_index=False).sum()actions['user_action_1_ratio'] = actions['action_4'] / actions['action_1']actions['user_action_2_ratio'] = actions['action_4'] / actions['action_2']actions['user_action_3_ratio'] = actions['action_4'] / actions['action_3']actions['user_action_5_ratio'] = actions['action_4'] / actions['action_5']actions['user_action_6_ratio'] = actions['action_4'] / actions['action_6']

完成了特征工程部分,接下来主要就是从特征工程生成的许多特征中选出有用的特征,然后对模型参数进行调优。

使用xgboost模型对用户模型进行建模,然后由于xgboost是基于树模型的分类器,那么在建树的过程中也就自动完成了对特征的选择。

模型调优:

我们使用xgboost自带的交叉验证函数,先大约确定最优迭代次数。
param = {'eta' : 0.1, 'max_depth': 3, 'seed':27,'min_child_weight': 1, 'gamma': 0, 'subsample': 0.8, 'colsample_bytree': 0.8,'scale_pos_weight': 1,  'objective': 'binary:logistic','eval_metric':'auc'}bst=xgb.cv( param, dtrain, 500,nfold=5,early_stopping_rounds=100)
bst

然后再使用sklearn的格子搜索,类似以下代码,然后更改param_grid的值,即可确定每个参数的最优值。

param_test1 = {'max_depth':[1,3,5,7]
}
gsearch1 = GridSearchCV(estimator = XGBClassifier(         learning_rate =0.1, n_estimators=178, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8,             colsample_bytree=0.8,objective= 'binary:logistic', nthread=4,     scale_pos_weight=1, seed=27), param_grid = param_test1,     scoring='roc_auc',   n_jobs=4,   iid=False,   cv=StratifiedKFold(training_data.label,n_folds=5))
gsearch1.fit(dtrain_x,training_data.label)
gsearch1.grid_scores_, gsearch1.best_params_,     gsearch1.best_score_

当确定好所有超参数时,用这些参数作为xgboost模型的参数,然后训练出预测模型,此时可以调用xgboost自带的得分函数查看各个特征的重要性,方便确定哪些特征比较重要,哪些特征被选做分裂节点的次数少。然后可以试着重新选择特征集,不断重复上面的调优步骤,直到结果比较符合期望。

feature_score = bst.get_score()
feature_score = sorted(feature_score.items(), key=lambda x:x[1],reverse=True)
feature_score

编程过程中遇到的其他问题和解决方法:

1、MemoryError

因为数据集总共有5个多G,最初没做内存方面的考虑,运行代码出现了“ MemoryError”的问题,用以下方法成功解决:
     数据量非常大时,比如一份银行一个月的流水账单,可能有高达几千万的record。对于一般性能的计算机,有或者是读入到特殊的数据结构中,内存的存储可能就非常吃力了。考虑到使用数据的实际情况,并不需要将所有的数据提取出内存。当然读入数据库是件比较明智的做法。若不用数据库呢?可将大文件拆分成小块按块读入后,这样可减少内存的存储与计算资源。Python里面可用chunker做分块处理。

简易使用方法:

chunker = pd.read_csv(PATH_LOAD, chunksize = CHUNK_SIZE)

读取需要的列:

columns = ("date_time",  "user_id")
chunks_train = pd.read_csv(filename, usecols = columns, chunksize = 100000)

分块读取chunk中的每一行:

for rawPiece in chunker_rawData:current_chunk_size = len(rawPiece.index)   #rawPiece 是dataframefor i in range(current_chunk_size ):timeFlag = timeShape(rawPiece.ix[i])   #获取第i行的数据

2、特征变量的表示
     特征变量的选择和提取对于最后的目标函数(预测)非常关键,一开始用时间衰减来做效果很差,改用统计方法,把数值特征(如年龄、评论数等)表示成哑变量,并处理成onehot编码,预测结果准确率提升了20%。

JData数据处理及高潜用户购买意向预测相关推荐

  1. 京东JData算法大赛——高潜用户购买意向预测

    赛题分析 京东提供了用户在2016-02-01-2016-04-15时间区域内用户对商品的行为评价等数据,预测2016-04-16-2016-04-20时间区间内用户的下单情况. 赛题和阿里的第一个竞 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 京东用户购买意向预测(一)数据清洗

    故事背景: 京东作为中国最大的自营式电商,在保持高速发展的同时,沉淀了数亿的忠实用户,积累了海量的真实数据.如何从历史数据中找出规律,去预测用户未来的购买需求,让最合适的商品遇见最需要的人,是大数据应 ...

  9. NO.90——京东用户购买意向预测之数据预处理

    文章目录 1 目标 2 数据集 3 数据挖掘流程 4 数据清洗 4.1 数据集验证 4.2 检查是否有重复记录 4.3 检查是否存在注册时间在2016年-4月-15号之后的用户 4.4 行为数据中的u ...

最新文章

  1. 11.PHP与MySQL
  2. Windows锁定计算机C代码编程实现
  3. HashSet 和 TreeSet 及 Map 集合的简单方法,含程序。
  4. 编程小技巧 --用VB解决时间同步的问题
  5. js a/a中this的使用
  6. 亮风台AR眼镜震撼发布 HiAR 产品全面升级
  7. [2018.07.17 T2] Palindromes
  8. 三种短链接生成源码-iApp源码
  9. 苹果电脑驱动下载查询
  10. vsftpd安装包下载
  11. 分布式任务定时框架elasticjob详解
  12. 谷歌网页加载特别慢的问题
  13. Redis(九)Redis的过期时间操作以及部分常用命令
  14. 软考java题目_2016下半年软考程序员考试冲刺模拟试题及答案(三)
  15. I2C详解(3) I2C总线的规范以及用户手册(2) I2C其他的总线协议以及总线速度
  16. java中的udp丢包_udp丢包 处理
  17. 中国小三多,是因为女人缺乏精神上的独立,男人缺乏人格上的体面。
  18. n个评委给m个选手打分python_n个评委为m个选手打分(n个评委打分总次数mn)。请问如何评判m个选手的成绩?...
  19. 有什么翻译pdf的软件吗?告诉你几款实用的翻译软件
  20. 通过adb录制视频并通过FFMPEG将MP4转换成GIF格式(二)

热门文章

  1. 【PaperReading】Heterogeneous Graph Neural Network
  2. 高斯白噪声(white Gaussian noise,WGN)
  3. AlphaGo打星际,人类的胜算几何?
  4. 跨境电商赛道蓄势待发,“黑五”大促带来新的消费浪潮(Starday)
  5. 音乐播放器中的跳动的平衡器
  6. Python 课程设计 ---- 高校教务系统(数据库、wxPython界面)
  7. 云服务+开源,建设活力开源社区,我们一直在路上!
  8. matlab 等距采样,对均匀采样信号进行重采样
  9. 如何解决Win7将任务栏程序自动分组的困扰
  10. Java小游戏-中国象棋