Git Product home page Git Product logo

tianchi's Introduction

天池大赛——商场中精确定位用户所在店铺

前些日子,受同学“鼓动”,到天池官网注册了一个帐号,“顺理成章”的参加了这个“演技满满”的比赛。“影帝”们的表演还在继续,我等“龙套演员”已经领盒饭走人了。最终B榜成绩:119 / 2845,accuracy为0.9083。特此分享一波自己的解题过程。抛砖(确定是砖)引玉,希望“影帝们”赛后可以稍加点拨。让我们的“演(技)技(术)”也得到一丁点儿的提升,就很感激了。

在这里特别感谢技术圈各位大神之前的开源,让我学到很多。谢谢!

解题思路

这种比赛每个人写代码可能都有自己的风格,所以这里特别说明一下自己的解题过程。

时间戳

首先自己对时间戳做过一定的处理。比如分时间段、分周末和工作日,可能是姿势不太正确。并没有起到好的效果,反而“逆上分”。这里仅仅截取时间戳的预处理函数,如果想尝试的,可以自行尝试一下。

@staticmethod
def timestamp_handle(df):
mdays = []
wdays = []
hours = []
mins = []
for timestamp in df['time_stamp']:
    timeArray = time.strptime(timestamp, "%Y-%m-%d %H:%M")
    mdays.append(timeArray.tm_mday)
    wdays.append(timeArray.tm_wday)
    hours.append(timeArray.tm_hour)
    mins.append(timeArray.tm_min)
df['time_mday'] = mdays
df['time_wday'] = wdays
df['time_hour'] = hours
df['time_min'] = mins
df = df.drop(['time_stamp'], axis=1)
return df

经纬度信息

首先用户的经纬度存在不准确的情况。这部分用户可以通过一个偏差上限来甄别,只要用户的经纬度偏差大于这个上限,说明这个用户的经纬度是不准确的,在接下来的计算过程中,不考虑这个用户的经纬度。对于经纬度比较准确的用户,自己通过计算欧式距离或者经纬度距离基本都可以排除20%左右(或者更少)的商铺。这里仅仅提到有这个可以缩小范围的方式,但自己在代码中并没有采用。对于经纬度,自己在代码中只使用了原始数据,并没有做任何处理。

WIFI信息

整个题目,自己基本都在围绕WIFI信息做文章。之前有大神开源过一份XGBoost的代码(非常感谢)。自己在代码中有尝试融合,自己当时选用的是Random Forest算法。也能取得基本一致的结果(按自己的处理方式,Random Forest的表现可能要好一点儿),很遗憾,这个题自己没有找到XGBoost的调参姿势(时间开销),所以在结果基本一致的情况下,自己选择了Random Forest算法。其中这里开源了两份代码,分别位于文件夹1文件夹2,其中文件夹1的代码跟大神的思路是一样的,筛选出WIFI作为特征,并保留经纬度,整个的特征向量的结构为[longitude, latitude, wifi1, wifi2, wifi3 ...],可能差别就插在挑选WIFI的方式上,自己是按照TF值来挑选了一部分,然后按照整个商场中WIFI的出现次数补充了一部分。这种方式A榜成绩为0.9075,B榜成绩为0.9054。文件夹2的代码是在文件夹1的代码的基础之上做了部分改动。首先利用随机森林预测得到一部分测试集的结果(对某个商铺的预测概率大于等于0.8,则认为随机森林预测结果可靠),之后对于剩下的测试集,计算每个用户的WIFI和每个商铺的WIFI(挑选出来的,假设这个WIFI属于这个商铺)的余弦相似度,然后排序,挑选出最多5个(之所以说最多是因为用这种方式,有的用户的候选集里的商铺数不足5个)商铺作为候选集。然后将候选集相同的测试集样例进行合并到一起,然后依照候选集划分出一个个小的测试集。然后提取每个候选集里的商铺对应的训练集数据,构建分类器,然后进行预测(这样就减少了分类数,但本质上还是多分类)。最终B榜成绩0.9083。

其他

  • 关于WIFI连接,自己统计过一个数据,当一个WIFI被连接的时候,用户在哪个商铺前?发现有部分WIFI,当WIFI被连接次数大于等于10次,用户在某个商铺前的概率为1。但融合到最终结果。结果有了小小的下降。自己不太明白为什么,要么是自己计算错误,要么是前后两个月的WIFI有比较大的差别?(生活所迫,并没有细究下去,哈哈)。

  • TextCNN,这部分只是自己觉得好玩儿,做了个实验。先确定出每个SHOP的WIFI列表,然后给定一个用户的WIFI信息,与每个SHOP的WIFI比对,该SHOP是否有该WIFI,有的话,在对应的位置上填上WIFI强度。这样最后的特征向量的为“店铺数 × 每个店铺的WIFI数”样式的矩阵结构,如此构造特征向量是可以收敛的,最终的成绩能在0.9左右。

  • 时间有限(好朋友的项目都给耽误了,sorry)(老师的项目不敢怠慢~),其他信息这里没有再考虑了~,比赛也到此为止了。

  • 再说一下收获吧:技(演)术(技)真的非常重要~,自己有很多不足,多读 paper,多多实践吧。

大致如上,水文一篇,如果大家有什么好的思路,希望多多指导~,谢谢!QQ: 765422195

多多加星哦~

tianchi's People

Contributors

iie-cas avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.