最近我年纪大了,体力和脑力都已经不能和现在的那些年轻人相比,同时我所兼职的公司事务确实有些繁忙,不能像当年那样全力地参加数据挖掘竞赛了。于是我只好把心态放轻松,像这样以娱乐的心态,一边比赛,一边记录比赛的过程。当然我不能选择Kaggle或者天池这种平台上的比赛,因为把各种被吊打的过程记录下来实在有些丢人。因而我要选一些人数比较少的平台或是比赛。
于是在报春同学的推荐下(想象一下报春同学气鼓鼓地扭过头,说「哼!你这种菜鸡,还是老老实实做这种小比赛吧!」),我选择Nishika平台的
「Brandearオークション!」 レコメンドエンジン開発www.nishika.com这个平台似乎刚刚建立,比赛数量和参赛选手数都比较少,感觉会比较容易一些,即便被吊打也不会被吊打得太难看。
参赛的第一天,主要要完成的任务包括
1. 审题
2. 构建线下测试集
3. 设计基线
4. 提交
1. 审题
1.1 赛题
这场比赛的赛题的赛题是日文的,阅读起来可能有一些困难;不过借助一些翻译工具,大体还是能读懂。
简单来说,就是一个拍卖网站。我们大概需要给会员推荐一些拍卖。
也就是每个会员,我们需要推荐20件拍卖;这20件拍卖将被用NDCG来评价。
注意谷歌对お気に入り追加的翻译有些混乱。其实我们这里主要关注会员的两种动作,入札(即竞标),以及お気に入り追加(即收藏)(更准确的翻译应该是加入我的最爱,以下简称收藏)。简单来说,我们给会员预测的拍卖,如果用户最终竞标了它,那么得2分,如果用户最终收藏了它,那么得1分。
1.2 数据
接下来我们看数据
注意マスタ即master被翻译为了师父,我也不清楚这里的含义。或许是「主要的」的意思?
这里有好大一堆数据,我们先关心比较重要的。显然其中auction.csv(拍卖数据),watchlist.csv(收藏数据),shudounyuusatsu.csv(「手動入札」,竞标数据)这三份数据比较重要。我们可以找到data_explanation.xlsx文件来查看这几份数据的说明。
1.3 数据说明
结合列名和说明大致可以猜出每一列含义,这里的第三列说明基本上就是列名的汉字或片仮名的写法。
注意削除フラグ就是删除flag,表示是否被删除。收藏数据的删除包含两种情况,即用户自行删除,或者拍卖结束删除;竞标的删除则只包含拍卖结束删除的情况。
1.4 数据观察
接下来,我们把数据下载下来,然后汇入
library(data.table) 測試會員表 = fread("sample_submission.csv", col.names=c("會員標識", "拍賣標識")) 測試會員表 = unique(測試會員表[, .(會員標識)], by = NULL) 拍賣表 = fread("auction.csv", col.names=c("拍賣標識", "商品種別標識", "商品標識", "再出品回數", "狀態標識", "品牌標識", "類型標識", "類型組標識", "線標識", "顏色", "男女別標識", "參考價格", "拍賣作成日")) 拍賣表$拍賣作成日序 = as.double(as.Date(substring(拍賣表$拍賣作成日, 1, 10))-as.Date("2019-10-01")) 氣入追加表 = fread("watchlist.csv", col.names=c("會員標識", "拍賣標識", "登錄日", "削除標記")) 氣入追加表$登錄日序 = as.double(as.Date(substring(氣入追加表$登錄日, 1, 10))-as.Date("2019-10-01")) 氣入追加表 = merge(氣入追加表, 拍賣表, by = "拍賣標識") 入札表 = fread("shudounyuusatsu.csv", col.names=c("拍賣標識", "會員標識", "入札日", "金額", "數量", "即決標記", "削除標記")) 入札表$入札日序 = as.double(as.Date(substring(入札表$入札日, 1, 10))-as.Date("2019-10-01")) 入札表 = merge(入札表, 拍賣表, by = "拍賣標識")
注意評価手法页中提到有6016个会员,我暂时没有找到6016个会员的来源,因此只能从sample_submission.csv中读入这6016个会员。
此时,我们观察数据主要观察数据的时间。評価手法页有提到我们要预测的时间段是2019-09-24至2019-09-30(为了处理方便,我们可以把时间都转化为到2019-10-01的日数差)。其中收藏表(氣入追加表)和竞标表(入札表)的时间范围都是2018-09-01至2019-09-23;拍卖表的时间范围是2018-02-01至2019-09-30(尚不清楚这是否是一个穿越)。
2. 构建线下测试
线上的测试时间段是2019-09-24至2019-09-30,那么显然线下的测试时间段就应该向前推7天。也就是收藏表和竞标表截取到2019-09-17之前,然后预测2019-09-17至2019-09-23的数据。根据题目的描述,我们选取2019-09-17至2019-09-23内有竞标或收藏行为的会员(明显的穿越,尚不清楚对赛题又什么影响);这样的会员有6344个,和线上的6016基本相当,说明这样构建大致是没有问题的。
線下參照表 = rbind(氣入追加表[登錄日序 >= -14 & 登錄日序 < -7, .(會員標識, 拍賣標識, 標籤 = 1)], 入札表[入札日序 >= -14 & 入札日序 < -7, .(會員標識, 拍賣標識, 標籤 = 2)]) 線下參照表 = 線下參照表[, .(標籤 = max(標籤)), .(會員標識, 拍賣標識)] 線下測試會員表 = unique(線下參照表[, .(會員標識)], by = NULL) 線下氣入追加表 = 氣入追加表[登錄日序 < -14] 線下入札表 = 入札表[入札日序 < -14]
3. 设计基线
3.1 基本基线
实际上,我也不知道Brandear到底是干嘛的网站,我也不清楚拍卖是怎么进行的,题目中也没有什么相关的描述,这对于我们的分析来说是一个很大的困难。
我们之前更常见到的是对商品的推荐,也就是预测用户会购买或交互哪些商品。这个赛题推荐的是拍卖,和商品大概还是不太一样的。因为一个用户构建了一个商品,另一个用户还可以继续买这个商品;可是一个用户拍到了一件商品,另一个用户就没有办法再拍了。不过我们暂时先不考虑这些。
对于商品推荐的问题,例如要预测用户在未来一段时间内会交互的商品,我们经常用的一个规则是,将用户交互过的商品作为预测。这里我们可以采用类似的思路,也就是把会员收藏或是竞标过的拍卖作为预测(当然首先要确认会员是否经常多次收藏或是竞标,结论是肯定的)。当然这样的拍卖有很多个,我们要设计一个打分函数,来给每一个候选拍卖打分,并且按分数从高到低排序,每个会员取最高的20个。
那么首先,收藏过的拍卖和竞标过的拍卖的打分显然不同(因为评价时的权重不同)。我经过线下测试,最后发现分别给它们1分和4分最好。
然后我们要考虑时间。这里主要有两个时间,分别是拍卖表中的CreateDate和收藏表及竞标表各自的Date。正常判断,时间越近的拍卖,会员越有可能再一次收藏或是竞标。那么我们可以给它们一个和时间相关的权重,这个权重可以采用下面的形式
简单测试了一下,α取0.5时比较好,β取1时比较好。
这样的打分可能不止一个,因为用户可能既收藏过又竞标过。如果有多个分数,我们怎么合并这些分数呢?是取和,取范数和,还是取最大值呢?经过线下测试,取最大值效果最好,因此这里取最大值。
这样我们得到了一些会员-拍卖对,及它们的分数。那么我们将它们排好序,每个会员取前20个就好。但是这个题目要求每个会员必须预测20个拍卖,如果有不足20个的怎么办?我就简单地随便选了20个拍卖用来补充。
这个基线在线下的成绩大概是0.043。
3.2 删除
然后我又发现收藏表和竞标表中各有一个删除flag的字段。但实际上竞标表的这个字段都是1,可以忽略;收藏表也是绝大部分为1,不过有少量为0的记录。
我们可以大致分析一下,显然会员在删除收藏之后才会重新收藏,因此我们只要选取删除flag为1的收藏记录就好。(这纯属事后诸葛,事实上我分别测试了全取、只取0、只取1之后,发现只取1最好,遂采用)
这样改进了一下,成绩提升到0.046。
4. 提交
至此我们大致完成了一个基线(我一般都是像这样开始做一场数据挖掘竞赛的,也就是边做边理解赛题)。虽然感觉每个地方都可以再改进改进,但也没有必要一次性做到完美,毕竟这场比赛还有很多天的时间。
于是我们可以生成线上的结果并提交了。提交之后,成绩大概是
(第一次提交没有加时间权重;第二次提交补充了时间权重;第三次提交补充了上面提到的删除规则)
看排行榜便可以知道,这场比赛没有多少人认真做。看起来我选对了比赛。
那么今天就做到这里。把代码上传到github上(链接https://ndearAuction/tree/mastehttps://github.com/sang1yu2/BrandearAuction/tree/master/1)上,然后就可以休息了。改天有时间的时候,可以继续做一做。
最后背一背单词吧
會員(かいいん㉧) 会员
入札(にゅうさつ㉧) 竞标
お気に入り(おきにいり㉧) 喜欢的
追加(ついか㉧) 追加
手動(しゅど㉧) 手动
男女別(だんじょべつ) 男女别
参考(さんこう㉧) 参考
価格(かかく㉧) 价格
商品(しょうひん①) 商品
種別(しゅべつ①) 种别,类别
登録(とうろく㉧) 登录
削除(さくじょ①) 删除
金額(きんがく㉧) 金额
数量(すうりょう③) 数量