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

大数据挖掘DT数据分析  公众号: datadw

本文初赛、决赛代码 github 地址

在公众号 datadw 里 回复 定位  即可获取。

题目回顾

题目地址:

题目要求给定一条用户的消费记录,求该用户当前所在的店铺。

下面介绍题目数据和评测方式

1. 店铺和商场信息表(mall)

2.  用户店铺内交易表(train)

3. 评测集(test)

评测集和和表2差不多,只是把shop_id改为了mall_id

我们的模型需要预测出该数据每一行用户记录的shop_id,并进行提交。

比赛分为A | B榜,A榜数据是9月份第一周数据,B榜数据是9月份第二周数据。

4. 评测方法

比赛的评测方法采用的是accuracy

比赛历程


初赛排名 13 / 2845


拿到这个赛题,第一个想法就是利用经纬度信息,首先水了个经纬度的KNN版本,准确率大概在0.66左右吧。太低。

然后把每条记录的wifi分开,看成一个个的词,类似于NLP中的BOW模型,展开,跑RandomForest多分类,然而内存炸了,果断分mall,就到了0.90。 加上经纬度特征就0.905。 挖到强特就是爽哈哈哈~ 要注意的是wifi强度是负数,我修正为正数了(直接+120)。

此时为了日后能方便的增删特征,尝试不同分类器,于是我重构了代码:

  • 新特征只要继承XXToVec纯虚类,实现 _fit_transform 和_transform结构就行(模仿sklearn的接口)

  • 抽象测试类。 ModelBase,可以设置使用什么分类器、保存模型。最棒的是关于特征只需要传一个list。如

1

2

3

task = ModelTest(save_model=False, use_multiprocess=False, save_result_proba=True)

vecs = [LocationToVec2(), WifiToVec(), WifiStrongToVec(), WifiKStrongToVec(), PriceToVec(), CategoryToVec2()  ]

task.train_test(vecs)

上述的代码使用vecs里的特征,就可以进行训练并评价。(内部就是遍历vecs,然后对每个vec直接调用fit_transform和transform即可)

我感觉我代码写的很好~有了这个框架,之后挖特征写代码就很容易啦。非常松的耦合~代码还不会乱七八糟的。

之后开始进行数据的查看,比如同一商场多个bssid如何处理,不同商场有同一个bssid。有的商场得分特别低画出雷达图查看可能是强度普遍偏弱照成的。

然后画出了全部商场的location信息和各个商场中用户和商店的经纬度信息。下图是某mall的可视化结果:

圆形为商家自己提供的经纬度坐标。而三角形是交易发生时的经纬度。中间的矩形则是算出来的商场中心。可以看出,很多用户偏离商店非常远。这和室内GPS信号不好有很大关系。

看到这个我自然就想到要“修正”那些离群点。我的做法是: 如果一个用户a距离商店中心过远,超过商店的长度(用最远商店距离算)一定倍数,那么需要修正。通过wifi信号来计算最近的那个用户b,将b的经纬度写成a的即可。这个修正后有小幅提升。

然后联想到wifi空值处理,取最近经纬度用户的wifi来填充。

队友超超弄了个wifi强度和时间特征,只取最强的那个给我,然后我忘记加时间特征,一交0.9116,下午才发现要是加了时间特征反而更低。然后把wifi空值处理、经纬度修正加上去,立马升到了0.9139嘿嘿,上分美滋滋。

接着队友wqs调参成功,rf的个数400,0.9144。 原来都100的跑。。。

然后我去新中关还有欧美汇实地考察商场,哈哈哈,其实是去吃东西,顺便下了个APP记录wifi信息。

期间超超说做到了0.96,我问怎么做到的,就是他把训练数据中每一条记录对应的shop_id对应的类别作为特征,之后又把price也作为特征,到了0.99几乎全对。然而这个做法是错误的,因为测试数据不知道shop_id,因此也不知道每一条记录对应的category和price。但给我启发:假如我预测出category和price呢?会因为累积误差炸了么?

预测类别一开始失败了,但是回归预测price成功了,提交price的特征版本线上0.9161.

接着看群里影帝的表演,从言语中观察他们应该用的是二分类的方法,于是我也做简单的尝试,采用OneVsRest,线上0.9175,线下0.915269.

这期间麦芽开源了多分类的xgboost版本的baseline,这个baseline线上0.91左右,方法和我们的类似,感觉药丸。 后面的追分真可怕。

然后超超发现bootstrap = false,再跑二分类 线上0.9196,线下0.9174。期间我在试stacking,以及 wifi的tf-idf特征、lightgbm(可能参数没有调好)、PCA等,但是都没啥用。去除了移动热点有小幅提升。然后为了提高代码效率,尝试并行化 data_to_vec和predict,但是Python GIL真是坑,线程不快,进程大量数据传输反而拖慢。然后用生产者、消费者模式加速data_to_vec和predict过程(predict的传递classifier内存会炸,服务器大内存会说太大之类的)。 感觉Python效率真的是卧槽。xgboost跑了几个grid search,太慢了都要放弃了。队友新特征也木有挖出有用的。

没办法了,我上融合把,稳住第一页,用的是比例融合的方式(rf, binary rf, binary xgboost),线上到了0.9234!

这时候我又重新跑了十则的price和category,category终于有用,0.9243!

然后期间还试二分类候选集的,效果不好。接着统计用户特征,做用户偏好,没有考虑冷启动问题,最简单的直接计数法。。。线上0.9264!

这时候开始B榜了,被df的小哥骗了,说会自动抓取之前最好的A榜来计算B榜的。结果木有,浪费了一次机会。提交掉了快6个千,0.9207…

最后融了一个新的多分类xgboost,到了0.92115. 排名13

最后模型如下:

1

2

models = ['random forest not price 0.9199', 'binary random forest not price 0.91998', 'binary xgb 0.9149','xgb 0.9123']

weights = [78, 80, 34, 5]  # Mean: 0.9240684683620611

第二赛季就没怎么打了,线上赛用的PAI平台太坑了。。Create table都要十几分钟。资源限制太不合理了。都没法玩。。对hive也不熟,UDF也不会,分wifi都搞了半天,特征也限制列数不能超过1200好像。也就是BOW wifi会GG。最后水了各个mall取了wifi top 1000,加上经纬度,直接RF多分类,(ps: 用python生成的各个mall的代码)。排45名,挺差的,不过也不怎么在意。

冠军队的做法对比

候选集直接选取目标mall中所有的shop作为候选,为了避免训练集数据量过大,在训练集中进行样本抽样。具体方法是,保留全部正样本,负样本中随机抽取一定比例加入训练集。实际测试,抽样对于模型的精度影响不大。而预测的时候没有抽样,因为速度快。PS: 多分类用商店的特征得展开,二分类就不用。

训练集和测试集的构造方法图示如下:

训练:

row_id 候选 特征 label
1 shop_1 1
1 shop_2 0
1 shop_3 0
2 shop_1 0
2 shop_2 1
2 shop_3 0

测试:

row_id 候选 特征 输出概率 预测
3 shop_1 0.6
3 shop_2 0.8
3 shop_3 0.9
4 shop_1 0.1
4 shop_2 0.9
4 shop_3 0.2

特征的差异不说,多分类的输出概率作为二分类的特征。

复赛中不一样的,记录如下:

分离信号强度为null的数据。对于信号强度为null的那些数据,强度不论填成多少,对于模型都是个干扰。所以直接去除这一部分数据,用剩下的数据来训练。(我们没有排除。。。)

分区表存储训练数据。如果为每个mall都单独生成一张训练数据表,那么表会太多,而且不断的生成、删除表,会增加任务提交的排队时间。我们的解决方案是用分区表存储所有mall的训练数据,以mall_id作为分区列。模型训练时可以直接指定分区,这样避免了反复的生成表、删除表。

一点感想

第一次打数据挖掘的比赛,得了13名感觉还可以。初赛基本都保持在第一页,每次掉出第一页马上又能冲回去。

不过也犯了一些错误:比如线下的数据集划分不是很好,一开始直接排序取后20%作为验证集,其实最好还是按照线上的取最后一周这样比较好。特征感觉不够多啊。

还有模型的建立缺乏经验,本题确实多分类不如二分类的好。

这比赛学到了很多东西~原来都木有用过xgboost,lightgbm,stacking等~

本文来自 微信公众号 datadw  【大数据挖掘DT数据分析】

比赛经验很重要,对业务理解很重要。前者可以看看别人的比赛的经验学习学习。这比赛中商家提供的经纬度某商场竟然有40多个一样的! (这题给的经纬度精度都达到了分米的级别了!) 不可能49楼大商场把。。我也实地逛了几个商场,感觉是有那种移动的摊位,今天这个,明天那个。然后一开始拿到题目就想到了经纬度肯定有一样的,还想要把商店进行上下分层,为此采集了新中关和欧美汇部分商店的wifi信息。不过我没有时间实践这个想法了,队友后面也没啥激情做这比赛,放弃这想法挺可惜的。后面听经验分享觉得很有道理,不要太早组队,因为你不能确定你的队友到后面是不是很努力,已经组队了都不好意思踢,而且比较后面组队大家想法不太一样,模型融合起来也会比较好。

还有就是机器性能也很重要。实验室两台机器,女票那还有服务器,感觉美滋滋~

还是要多学习才能更厉害~

https://www.hrwhisper.me/tianchi-contest-location-at-mall/

人工智能大数据与深度学习

搜索添加微信公众号:weic2c

长按图片,识别二维码,点关注


大数据挖掘DT数据分析

搜索添加微信公众号:datadw


教你机器学习,教你数据挖掘

长按图片,识别二维码,点关注

天池大赛—商场中精确定位用户所在店铺 作品分享相关推荐

  1. 根据IP定位用户所在城市信息

    2019独角兽企业重金招聘Python工程师标准>>> 当我们在页面中填写个人资料中的省市信息时,页面会根据当前用户所在的城市自动选中省市下拉选项:当我们访问某个大型站点时,网站程序 ...

  2. 微信定位当前城市 php,html5,javascript_微信内置浏览器如何定位用户所在城市,html5,javascript - phpStudy...

    微信内置浏览器如何定位用户所在城市 我的代码这样写的,但是有个问题,在wifi网络下可以正确定位(杭州),但是把网络切换到移动网络比喻4G网络就不准确了,我在杭州,但是定位显示温州. $(functi ...

  3. python根据经纬度确定省份_根据经纬度定位用户所在城市

    //根据经纬度定位用户所在城市 if (navigator.geolocation){ navigator.geolocation.getCurrentPosition(showPosition, s ...

  4. 微信公众号定位用户所在位置

    微信公众号定位用户所在位置 最近由于项目的原因,涉及到了微信公众号,看了几天文档加上问了问同事,对这个玩意有一点了解,写一下微信公众号定位的方法,记一下以后方便用. //获取codevar url = ...

  5. 安卓之位置服务(简单定位用户所在的位置)

    *位置的服务(Location Based Service) 基于位置的服务简称LBS,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置. 基于位置的服务所围绕的核心就 ...

  6. 模式识别中精确定位之垂直和水平投影

    在模式识别中常用垂直投影和水平投影对目标物进行精确投影,以便于后期的分割. 示例: (1)                                                       ...

  7. 天池大赛-用户在商场中的定位

    赛题回顾 这是一个室内定位问题.给定交易时的环境信息(包括GPS,wifi信息),确定交易所处的商铺.详情可参见比赛页面. knn方案概述 针对测试集中的每一条记录,构造候选shop集合,用模型输出每 ...

  8. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码...

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  9. 支付宝小程序 定位用户所在的城市

    使用小程序 自带的api my.getLocation 如果你用的模拟器的话 提起需要定义一个位置 my.getLocation({type:1, // 传入type 没有type 或者type=0的 ...

最新文章

  1. 百练-16年9月推免-B题-字符串判等
  2. linux下安装dovecot
  3. JPA JoinColumn vs mappedBy
  4. leader:你的代码太烂了我根本看不懂
  5. mysql无法启动修复_记一次MySQL无法启动及修复经历
  6. java内存管理总结
  7. python+tensorflow+captcha库:基于TF快速破解验证码
  8. ubuntu 16.04 + zabbix 3.4 + postgresql libzbxpgsql
  9. 拓端tecdat|R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列
  10. 嗅探工具java_权宜之计 让迅雷5支持傲游2嗅探器来下载视频
  11. clodop配置SSL证书 WEB打印机服务
  12. mi5splus android9,小米5s plus和华为mate9买哪个好 小米5sPlus和华为mate9区别对比评测...
  13. Rayman的绝顶之路——Leetcode每日一题打卡13
  14. 【JIRA学习】 研发项目管理工具工时管理-插件Tempo
  15. vue无法加载ps1
  16. 机器学习笔记2:建立模型一般所需步骤
  17. 独立开发者+开源项目,超级个体的价值模式
  18. R语言 自定义函数之趣味程序--老虎机
  19. GPIO内部结构和各种模式
  20. pixy cmucam5接线图

热门文章

  1. ValidationGroup属性
  2. Web3究竟红在哪里,它的出现能为人类社会带来什么?
  3. Proteus所有元件名称
  4. lg 传奇 手机 java_LG G650 java手机游戏全攻略
  5. 谷歌浏览器(chrome)、火狐浏览器(firefox)、Opera浏览器修改UserAgent方法汇总
  6. Word处理控件Aspose.Words功能演示:使用Java在MS Word文档中进行邮件合并
  7. MinGW/MSYS development environment
  8. echarts中graphic_vue项目中引入echart 调用其graphic方法报错的问题
  9. OSChina 周日乱弹 ——程序员闷骚么?事实证明……
  10. 『51CTO七周年庆典活动』社区总动员,一“七”同行