精品旅行服务成单预测(皇包车)比赛记录
精品旅行服务成单预测比赛是DC举办的“第二届智慧中国杯”的第一个比赛,主要是通过用户的历史行为数据对待预测用户是否购买精品旅游服务进行预测。具体的比赛背景和数据介绍可以参考比赛说明。
传送门:精品旅行服务成单预测
最近半年也参加了几个比赛,但是成绩也并不是很突出,所以也一直没有做过总结。趁着过年这几天比较空,将“皇包车”比赛的思路做一个小结,方便自己以后查看。比赛的大神很多,自己写的可能存在很多不足之处,希望能和大家多多交流。
博客只是将自己的思路和使用的特征情况做一个说明,具体的代码可以查看我的GitHub。
-------------------------- 一个有态度的分割线 ----------------------------
比赛提供的数据主要有(a)用户个人信息数据 (b)用户行为信息数据 (c)用户历史订单数据 (d)带预测订单数据和(e)评论数据。
-------------------------- 特征提取(特征工程) ---------------------------
对于用户个人信息数据,考虑到不同年龄段,性别和省份的人群的消费水平不同,在处理的时候直接对这些信息做ONE-HOT处理(把缺失的数据作为单独的类别)。(并没有发现某一类别的人具有较高的精品服务购买可能,也有可能是自己挖掘的不够仔细)
对于用户行为信息数据,行为类型一共有9个,其中1是唤醒app;2~4是浏览产品,无先后关系;5~9则是有先后关系的,从填写表单到提交订单再到最后支付。对于这些数据,提取了各个行为占据行为总数的比值。
# 统计每一种点击次数的占比 for i in range(1, 10): train['click_{}'.format(i)] = train['userid'].apply(lambda x: float(train_click_[(x, i)]/train_click_count[x]) if (x,i) in train_click_.keys() else 0)test['click_{}'.format(i)] = test['userid'].apply(lambda x: float(test_click_[(x,i)]/test_click_count[x]) if (x,i) in test_click_.keys() else 0) train.head()
特定时刻的行为(最后一次Type,倒数第二次Type,倒数第三次Type,第一次Typ
def get_type(df, userid): """ 获得特定次数行为 :param df: train_A or test_A :param userid: userid to use :return: 特定次数的行为结果 """ lastType = 0 lastType2 = 0 lastType3 = 0 firstType = 0 action_num = len(df[df['userid']==userid])if action_num>=1: lastType = df[df['userid']==userid].iloc[-1]['actionType']if action_num>=2: lastType2 = df[df['userid']==userid].iloc[-2]['actionType']if action_num>=3: lastType3 = df[df['userid']==userid].iloc[-3]['actionType']if action_num>=4: firstType = df[df['userid']==userid].iloc[0]['actionType']return lastType, lastType2, lastType3, firstType
距离各个行为最近的时间,(这里直接使用的是处理过的时间,你们也可以对这些时间进行处理,还原为原来的时间日期再进行计算,有可能效果会更好)
def get_time(df, userid): """ 获得距离各个行为最近的时间 :param df: train_A, test_A :param userid: userid to use :return: 距离各个行为最近的时间 """
type1_time = 0 type2_time = 0 type3_time = 0 type4_time = 0 type5_time = 0 type6_time = 0 type7_time = 0 type8_time = 0 type9_time = 0 userid_df = df[df['userid'] == userid] if len(userid_df)>=1: if len(userid_df[userid_df['actionType']==1])>0: type1_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==1].iloc[-1]['actionTime'] if len(userid_df[userid_df['actionType']==2])>0: type2_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==2].iloc[-1]['actionTime'] if len(userid_df[userid_df['actionType']==3])>0: type3_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==3].iloc[-1]['actionTime'] if len(userid_df[userid_df['actionType']==4])>0: type4_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==4].iloc[-1]['actionTime']if len(userid_df[userid_df['actionType']==5])>0: type5_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==5].iloc[-1]['actionTime']if len(userid_df[userid_df['actionType']==6])>0: type6_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==6].iloc[-1]['actionTime']if len(userid_df[userid_df['actionType']==7])>0: type7_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==7].iloc[-1]['actionTime']if len(userid_df[userid_df['actionType']==8])>0: type8_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==8].iloc[-1]['actionTime'] if len(userid_df[userid_df['actionType']==9])>0: type9_time = userid_df.iloc[-1]['actionTime'] - userid_df[userid_df['actionType']==9].iloc[-1]['actionTime'] return type1_time, type2_time, type3_time, type4_time, type5_time, type6_time, type7_time, type8_time, type9_time
就算距离最近的行为9,3,5,8的距离
def get_distance(df, userid): """ 求距离最近的9,3,5,8的距离""" distance_to_3 = 0 distance_to_5 = 0 distance_to_8 = 0 distance_to_9 = 0 dist_df = df[df['userid']==userid]len_act = len(dist_df)listType = dist_df['actionType'].tolist()if len_act>=1: if len(dist_df[dist_df['actionType']==3])>0: findloc = [a for a in range(len_act) if listType[a]==3][-1]distance_to_3 = int(len_act - findloc)if len(dist_df[dist_df['actionType']==5])>0: findloc = [a for a in range(len_act) if listType[a]==5][-1]distance_to_5 = int(len_act - findloc)if len(dist_df[dist_df['actionType']==8])>0: findloc = [a for a in range(len_act) if listType[a]==8][-1]distance_to_8 = int(len_act - findloc)if len(dist_df[dist_df['actionType']==9])>0: findloc = [a for a in range(len_act) if listType[a]==9][-1]distance_to_9 = int(len_act - findloc)return distance_to_3, distance_to_5, distance_to_8, distance_to_9
计算用户时间间隔相关的数据(代码较长,这里不放了,可以去GitHub上看):时间间隔的均值,最小值,方差;最后一个时间间隔的值,倒数第二个时间间隔,以及用户特定行为时间间隔的方差,均值,最小最大值等。
对于用户历史订单数据,数据共有7列,分别是用户id,订单id,订单时间,订单类型,旅游城市,国家,大陆。这里在处理的时候,提取了ever_buy特征,即在之前是否购买了精品旅游服务。
对于用户的评论数据,计算了用户的平均评分等指标。
--------------------- 特征处理 ----------------------
俗话说,好的特征工程决定成绩的上限,模型只能无限逼近这个上限。(和大神比,特征工程做的太渣了......)
对于上述的特征,主要是做两类处理(1)对于类别变量,对其进行one-hot处理(2)对于数值型变量进行标准化处理
标准化处理时,先对NAN值进行填充,填充方法有均值,中值填充等。这里主要是对平均得分进行填充,采用的是均值填充。
数据的正负样本比例在1:5左右,可以考虑一些数据平衡的方法,如降采样,过采样等。(尝试过对数据进行过采样处理,但是并没有显著提高AUC值)
--------------------- 模型实现 --------------------------
最后使用的模型只要是Xgboost和Lightgbm,调参之后的B榜成绩在0.956+, B榜排名79/1073(距离大神还有好大的距离......555)
前10重要性特征(其他重要性参考GitHub对应数据文件):
feature,score timespan_mean,2962 timespan_last2,2766 timespan_first,2507 timespan_last,2474 timespan_last4,2470 click_6,2426 type1_time,2322 timespan_last3,2282 min_5_ts,2237 click_5,2189
精品旅行服务成单预测(皇包车)比赛记录相关推荐
- Datacastle算法竞赛-精品旅行服务成单预测-AUC:0.94+解决方案
Datacastle在前一段时间发布了一个算法竞赛-精品旅行服务成单预测.当时空闲时间比较多就报名参加了,后面为了赶论文进度没有继续做下去,最后的一次提交结果是0.94+的auc.共计提取了76个特征 ...
- 循环智能的智能对话分析系统:帮助新东方在线实现全量机器质检、客户心声分析和线索成单预测 | 百万人学AI评选
2020 无疑是特殊的一年,而 AI 在开年的这场"战疫"中表现出了惊人的力量.站在"新十年"的起点上,CSDN[百万人学AI]评选活动正式启动.本届评选活动在 ...
- 7、python多种方式进行成单回归预测
多种方案成单预测比较 1 背景和挖掘目标 基于关键的业务指标进行成单预测,对影响成单的因子了解 2 分析步骤 01 基于关键特征数据底表的分组处理 02 关于机会.名片表的处理 基于业务逻辑或者数据 ...
- 早期创业,应该充分利用互联网产品和服务(从”皇包车”看一家全球中文车导服务平台如何选用ToB产品)
前段时间,在搜索"皇包车"相关的资料,于是在IT桔子网站看到了"从'皇包车'看一家全球中文车导服务平台如何选用ToB产品"这篇文章. 我是非常的震撼 ...
- 大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)...
小雷友情提示 : 创业有风险,投资需谨慎. 现在是2016年5月22日,23点55分,星期天,阴历四月十六. 扯扯淡 最近几年,世事变幻真是太快,发生了太多的故事,暂时不想分享太多敏感信息. ...
- 精益创业和画布实战(2):皇包车和易途8,中文包车游世界
上篇,给变革家-让天下没有难懂的生意,定制了一幅画,精益画布-变革家. 本篇,给皇包车和易途8-中文包车游世界,定制一幅画,精益画布-皇包车和易途8. 一.精益画布 照片名称:精益创业画布 二.皇包 ...
- 大学毕业4年-回顾和总结 9 -股权投资1年,给自己一个答卷 好狗狗 皇包车 职业梦 比呀比 易途8 创业有风险,投资
小雷友情提示 : 创业有风险,投资需谨慎. 现在是2016年5月22日,23点55分,星期天,阴历四月十六. 扯扯淡 最近几年,世事变幻真是太快,发生了太多的故事,暂时不想分享太多敏感信息. ...
- Spring 为啥默认把bean设计成单例的?这篇讲的明明白白的
作者:小小木 juejin.im/post/5cab7ebf518825177637b2f9 熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototyp ...
- Python数据分析高薪实战第十二天 网络服务用户流失预测分析和国产电视剧评分预测分析
29 综合实战:网络服务用户流失预测与分析 绝大多数互联网公司都面临一个非常重要的问题:用户流失问题.随着互联网和移动互联网的充分发展,发展新用户(也就是一般所说的拉新)的成本越来越高,往往要几块或者 ...
最新文章
- YOLOV5 v6.1更新 | TensorRT+TPU+OpenVINO+TFJS+TFLite等平台一键导出和部署
- 面试命中率 90% 的点 :MySQL 锁
- 【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( error: case value evaluates to -2 , which cannot be narrowed )
- Android Studio——[The ‘kotlin-android-extensions‘ Gradle plugin is deprecated.]解决方案
- java 模型 视图,部分视图模型
- 电脑黑屏故障的解决方案
- PHP学习笔记--015 PHP 随笔
- python实现寻找最长回文子序列
- BZOJ2525: [Poi2011]Dynamite
- 电大有计算机教程吗,中央电大 计算机平面设计(上)
- ​LeetCode刷题实战623:在二叉树中增加一行
- Android IMEI和MEID获取问题记录
- Mysql之AUTO_INCREMENT浅析
- vue路由详解 --基础
- 在word文档中添加目录(包括项目符号、编号、多级列表使用方法)
- 计算机桌面清理用于什么,C盘哪些文件可以删除?电脑C盘满了清理瘦身技巧
- 为什么有的人明明能力没问题,却总是抓不住升职加薪的机会?
- Angular: ‘ng’ is not recognized as an internal or external command, operable program or batch file
- You-Get, Annie 视频下载器 一键安装脚本
- 【财务数字化管理】金蝶ERP系统助力企业数字化转型
热门文章
- 安卓协议逆向之frida hook百例二
- Unity小游戏——移动的小船船(船体在水面上晃动)
- linux中creat-file函数,c语言createfile函数用法?
- 传统传真机面临新一代革新
- 4.18列表学习笔记及作业
- APP测试-头像测试点
- Unity 从零开始的2D游戏开发 —— [Animator] 使用动画状态机制作简单动画
- 邮政社招笔试题库_中国邮政招聘考试笔试都考什么内容和题型?最好具体一点...
- 常见数据结构排序算法时间复杂度
- 批处理设置计算机不休眠,虚拟机状态下怎样设置电脑不休眠