同学们:
随着比赛的进行,第二季比赛很快就要来临了。在第二季的比赛中,参赛者需登录阿里巴巴ODPS平台,访问海量天猫数据。利用ODPS平台的集成工具与算法,建模与提交结果。目前ODPS提供了一些基础的算法包和工具,可能不能完全满足大家需要。希望能够同学们可以通过回帖的方式反馈给我们,我们将视情况加入大家共同需要算法包,比如BP 神经网络。当然深度学习之类的估计就很难支持了。
ODPS目前提供的算法列表如下:
分类预测
|
随机森林
|
逻辑回归
| |
支持向量机
| |
朴素贝叶斯
| |
回归分析
|
线性回归
|
GBDT
| |
聚类分析
|
Kmeans
|
关联分析
|
关联规则
|
矩阵计算
|
SVD
|
PCA
|
支持的语言:sql 、java/pythonudf、ruby
希望大家踊跃提出自己的建议,谢谢!
天猫推荐算法团队
请关注微博:2014阿里大数据竞赛技术交流
http://bbs.aliyun.com/read/153103.html?spm=5176.7189909.0.0.JotHfl
鉴于本小弱非数据挖掘出身,只是在coursera上跟过Ng的机器学习,估计最后做一个regression再上一个协同过滤就到极限了,就不去争名次了。写一些step by step 的入门东西,帮助感兴趣的新手快速入手,希望大家可以快速的参与进比赛来,如果真的有帮助到某个同学的话,那就苟富贵勿相忘了。
首先扫一眼数据发现时间那一列居然是中文,先转成可处理的日期格式,就假设数据是13年的好了。
def parse_date(raw_date):
entry_date = raw_date.decode("gbk")
month = int(entry_date[0])
if len(entry_date) == 5:
day = 10 * int(entry_date[2]) + int(entry_date[3])
else:
day = int(entry_date[2])
return 2013, month, day
由于不能实时的去测试算法的效果,现阶段只能将给的数据分成训练集和验证集,我的策略是前三个月当训练集,最后一个月当验证集。这里好像吐槽一下阿里,你好歹弄个一天一测试也好啊,你一周给一次测试机会让我们怎么持续优化算法啊?一天跑一次测试对你们有什么难度么?这种东西你让我们事实测试也不是什么技术难题啊!
尽管对基于时间序列的分析半点经验都没有,但是还是知道越靠后的内容权重应该越大,于是以4月15号为零点,在把数据分成两个集合的同时把时间部分重新处理一遍。同时验证集合只需要购买的记录就可以了,就把没用的记录过滤掉。
def split_file(raw_file, seperate_day, begin_date):
train = open("train.csv", "w")
validation = open("validation.csv", "w")
raw_file.readline()
for line in raw_file.readlines():
entry = line.split(",")
entry_date = date(*parse_date(entry[3]))
date_delta = (entry_date - begin_date).days
if date_delta < seperate_day:
train.write(",".join(entry[:3]) + "," + str(date_delta) + "\n")
elif int(entry[2]) == 1:
validation.write(",".join(entry[:2]) + "\n")
print ",".join(entry[:2])
train.close()
validation.close()
生成了验证集合后,需要将结果归并一下,估计阿里那边的测试也就是个文本对比,所以把验证集合的结果也归并成提交格式要求的那个样子。
def generate_result(validation):
entrys = validation.readlines()
entrys.sort(key=lambda x: x.split(",")[0])
result = open("result.txt", "w")
for index, entry in enumerate(entrys):
uid, tid = entry.strip().split(",")
if index == 0:
cur_id = uid
cur_result = [tid]
elif uid == cur_id:
cur_result.append(tid)
else:
result.write(cur_id + "\t" + ",".join(set(cur_result)) + "\n")
cur_id = uid
cur_result = [tid]
result.close()
然后就是把这几个函数都整合起来,就可以省成初步的训练集,验证集,和最终结果了
SEPERATEDAY = date(2013, 7, 15)
BEGINDAY = date(2013, 4, 15)
raw_file = open("t_alibaba_data.csv")
split_file(raw_file, (SEPERATEDAY - BEGINDAY).days, BEGINDAY)
raw_file.close()
validation = open("validation.csv")
generate_result(validation)
由于官方一周才能跑一次测试(再次强烈吐槽)我们本地也要自己完成在验证集合上的测试,需要对比算法预测出来的结果和验证集上的结果:
from collections import defaultdict
predict_num = 0
hit_num = 0
brand = 0
result = defaultdict(set)
f = open("result")
for line in f.readlines():
uid, bid = line.split("\t")
result[uid] = bid.split(",")
brand += len(result[uid])
f.close()
f = open("predict.txt")
for line in f.readlines():
uid, bid = line.split("\t")
bid = bid.split(",")
predict_num += len(bid)
if uid not in result:
continue
else:
for i in bid:
if i in result[uid]:
hit_num += 1
print "predict num is ", predict_num
print "hit num is ", hit_num
print "total brand is ", brand
precision = float(hit_num)/predict_num
callrate = float(hit_num)/brand
print "precision is ", precision
print "call rate is ", callrate
print "F1 is ", 2*precision*callrate/(precision+callrate)
剩下的要做的就是不断的改进算法然后用上面的程序来测试效果了。不过我在本机的验证集合上测试出来的结果和官方数据测试的结果还是有些出入的,不过现阶段貌似也只能这么做了。
为了奖励看到最后的人,透漏一点小秘密,直接预测最后一个月买过东西的人再重新买一次也能获得9%的准确率,当然召回率很低了,不过至少应该比盲狙的结果好。
再说的直白点,即使你啥都不做就是把我的程序跑通了,那么你直接把前面验证集的结果提上去就能获得一个还算体面的准确率,多的我就不说了嗯。
阿里的大数据赛题
By buptlee · 23 天前 · 1995 次点击http://102.alibaba.com/competition/addDiscovery/gameTopic.htm
阿里提供了4个月的用户数据,格式是这样的一个EXCEL表:
11158000 5043 0 5月9日
11158000 5043 0 7月22日
11158000 5043 0 7月14日
11158000 5043 0 5月11日
11158000 5043 1 5月5日
第一列是用户ID,第二列是商品品牌ID,第三列是用户行为(0,1,2,3分别代表点击,购买,收藏,购物车)。需要我们预测下个月的用户购买行为,评价标准是准确率和召回率以及两者的调和平均值。
我试了几个方案, 发现直接将收藏和购物车作为用户购买行为的依据却是最好的方法, 简单粗暴,难道这就是所谓的奥卡姆剃刀?不过,也有可能是我另外的方案设计得不好。
熟悉推荐算法的同学给点建议吧,最好要简单点,实现起来比较方便,代码量在几百行级别最好,毕竟只是个竞赛呢。谢过啦。
1
casparchen 23 天前
我觉得还是综合几种建模方式的结果比较靠谱。比如
建模1:针对每个品牌,该品牌的不同用户点击/收藏/购买肯定是有规律的 建模2:针对每个用户,该用户对品牌的购买情况是有规律的。 比如以上两种建模方式,1的效果我猜是大于2的,因此可以取{建模1结果:建模2结果}={2:1} |
2
webjin 23 天前
http://gtms02.alicdn.com/tps/i2/T11omZFu0XXXaTF0MH-435-146.png 知道这是什么编辑器吗?那中间的->线是什么弄出来的
|
5
ljcarsenal 23 天前
@
webjin notepad++吧
|
6
vbs 23 天前
这比赛挺好的,可惜只许在校生参加
|
7
sobigfish 23 天前
只有报名了才下载的到数据么?
|
8
ericls 23 天前
数学建模上吧
|
10
yangff 23 天前
看起来像马尔科夫链……假如上个月对品牌A做了操作B导致下个月对品牌C操作D的概率啥的。。
|
12
66beta 22 天前
|
15
ericls 22 天前 via Android
这就是一个不折不扣的数学建模题啊
|
16
armysheng 22 天前
@
buptlee 直接将收藏和购物车作为用户购买行为的依据却是最好么?
如果用前三个月做测试,后1个月做校验,按照你说的直接选有收藏和购物车我算的结果是 predict num is 2858 hit num is 185 total brand is 18537 precision is 0.0647305808258 call rate is 0.00998003992016 F1 is 0.0172937602244 F1才1.7%啊? |
18
armysheng 21 天前
@
buptlee 额,上面说的好像搞错了。上午改了一下,但是如果纯按是否有收藏和购物车来判的话,F1貌似还是不高啊
predict num is 491 hit num is 2 total brand is 1377 precision is 0.0040733197556 call rate is 0.00145243282498 F1 is 0.00214132762313 判断条件的代码是这样的: if int(op3[2])|int(op3[3]) |int(op2[2])|int(op2[3])|int(op1[2])|int(op1[3]): predict_temp.write(uid +"," + bid + "\n") |
21
heliumhgy 18 天前 via Android
协同过滤算法
|
22
heliumhgy 18 天前 via Android
据说效果不好
|
Season 2:2014年4月25日至7月30日,参赛者须使用“天池”平台(阿里巴巴自主研发的分布式计算平台),访问海量的天猫数据,并利用Map&Reduce、SQL及各种平台集成的机器学习算法包调试模型、提交结果。
至于“天池”平台,希望他能够提供更多的数据工具箱,比如ARMA的时间序列分析,更多的回归方法~~~
建模的魅力是无限的,建立模型量化消费者的购物欲望,进而进行预测推荐,可能是需要我们仔细思考的。