阿里云 大数据 推荐系统

同学们:
        随着比赛的进行,第二季比赛很快就要来临了。在第二季的比赛中,参赛者需登录阿里巴巴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分别代表点击,购买,收藏,购物车)。需要我们预测下个月的用户购买行为,评价标准是准确率和召回率以及两者的调和平均值。
我试了几个方案, 发现直接将收藏和购物车作为用户购买行为的依据却是最好的方法, 简单粗暴,难道这就是所谓的奥卡姆剃刀?不过,也有可能是我另外的方案设计得不好。
熟悉推荐算法的同学给点建议吧,最好要简单点,实现起来比较方便,代码量在几百行级别最好,毕竟只是个竞赛呢。谢过啦。
  • 用户
23 回复  |  直到 2014-03-23 10:52:05
 
    1
casparchen   23 天前
我觉得还是综合几种建模方式的结果比较靠谱。比如
建模1:针对每个品牌,该品牌的不同用户点击/收藏/购买肯定是有规律的
建模2:针对每个用户,该用户对品牌的购买情况是有规律的。
比如以上两种建模方式,1的效果我猜是大于2的,因此可以取{建模1结果:建模2结果}={2:1}
 
    2
webjin   23 天前
http://gtms02.alicdn.com/tps/i2/T11omZFu0XXXaTF0MH-435-146.png 知道这是什么编辑器吗?那中间的->线是什么弄出来的
 
    3
yelite   23 天前  ♥ 1
@ webjin 那个是制表符
编辑器目测是notepad++
 
    4
ihacku   23 天前
@ webjin 这不是notepad++么
 
    5
ljcarsenal   23 天前
@ webjin notepad++吧
 
    6
vbs   23 天前
这比赛挺好的,可惜只许在校生参加
 
    7
sobigfish   23 天前
只有报名了才下载的到数据么?
 
    8
ericls   23 天前
数学建模上吧
 
    9
webjin   23 天前
@ yelite 哦 我也感觉是notepad++ 但是那制表符是怎么弄出来的
 
    10
yangff   23 天前
看起来像马尔科夫链……假如上个月对品牌A做了操作B导致下个月对品牌C操作D的概率啥的。。
 
    11
66beta   22 天前
@ webjin 觉得是gedit
 
    12
66beta   22 天前
 
    13
delo   22 天前
@ webjin npp里有个显示所有字符的功能
 
    14
Lucius   22 天前
@ 66beta notepad++无疑 而且是默认配色
 
    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%啊?
 
    17
buptlee   21 天前
@ armysheng 要不show me your code?
 
    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")
 
    19
armysheng   20 天前
@ buptlee 方便私底下交流么,没人可以讨论真是尴尬
 
    20
lj   20 天前
@ armysheng 官方论坛里还是蛮多人在讨论的,看了一圈清晰了很多。P.S. 我也觉得2、3效果有限而且毕竟数据量太小,0和1的correlation比2、3的大多了。
 
    21
heliumhgy   18 天前 via Android
协同过滤算法
 
    22
heliumhgy   18 天前 via Android
据说效果不好
 
    23
buptlee   17 天前
@ heliumhgy 恩,我们就用简单的打分办法,效果却还可以,F1值有接近6%吧,打算调调参数,等到season2再上算法了,。

一、同为推荐,大不同!
     不知道同学们是否经常在天猫购物,但是相信大家一定听过音乐,看过电影,读过新闻和小说。大家在享受各种娱乐信息的时候,正在被网站的后台悄悄地记录着你的信息,分析着你的偏好,然后向你推荐越来越喜欢的内容。整个过程也许你并没有明显的感知,但是你会慢慢上瘾,喜欢上它,比如爱上虾米。这其实都是推荐算法的功劳。现在,你们也有机会用自己的算法让大家爱上购物。但是,音乐推荐、视频推荐、新闻推荐和品牌推荐的不同之处还是要注意的,要去思考的。
     不都是推荐么?有什么不同的呢?其实,还是有很多不同点的,我觉得没有一个人能把所有的不同点罗列清楚,暂且和大家分享一下我想到的一些点,没有什么逻辑,主要是抛砖引玉,希望大家能跟帖谈谈你们认为的不同点。
     1、代价不同。你推荐给我一首歌,不好听,大不了换一首,不好听,再换,最后总能找到自己喜欢的歌。可是购物呢,你推荐我一个服装品牌,我花了半个月的伙食费买了,等待了几天,到货后发现不满意,怎么办?扔掉?太可惜了!穿在身上?天天别扭!退掉?还要再花点邮费!不管结局怎们样,总之不爽。如果是买个家居什么的,不喜欢的话,可能后悔一辈子。所以购物的用户体验周期要远长于音乐、影视推荐。推荐的试错成本很大。
     2、需求的单一性与喜好的相似性。喜欢看动作片,那么相似的动作片我都能看一遍。但是购物就不同了,购物更多的是刚需,喜欢可爱的衣服,一般人也不会把所有喜欢的可爱的衣服都买下来,更多的是每个季节只买一件。家居类的频次就低了,可能一辈子就买一次。不同的类目的需求频率是不一样的。
     还有很多不同的点,这里不再赘述。找不同有什么用?当然是算法选择了,通过上面的2个不同的点,你还会用协同过滤么

二、活用数据,不要被数据绑架!
     大家一谈到大数据就兴奋,数据就是资产,数据就是财富。
     其实,大就是少,越是真实的业务数据,数据量就越大,可用的信息比例就越少,更多的是噪音数据。
     玩大数据和玩实验室数据有啥不同?夸张点,就是大海捞针试管捉鱼的不同!如果没有找到适合的信号探测方法,很难找到那根你要的针。
    如果你拟合了噪音数据,那就被数据绑架了,所以不要只看数据,更多地从思考一下业务
     相关与因果
     最近有本书很火,里面提到一个论点,大概意思是:大数据更重视相关,不关心因果。大家不要迷信这些话。我举几个例子:1)你如果看数据,手机和手机配件的相关性一定很大,如果一个人买了手机,你推荐手机配件是合理的,但是如果一个人买了手机配件,你去推荐手机就有点弱智了。2)孕妇装和奶粉的相关性也许很大,但是买了奶粉的人,推孕妇装就不合适了。所以买了又买的又字不是同时的意思,是条件的意思。
    人的消费行为是有规律的,比如:随着收入的增加会越来越重视品牌,在人生的不同阶段会买不同类目的商品等等;人的消费有心理学现象的,比如:从众购买,容易受限时秒杀等活动影响等。
     信号与噪声
     信息就像能量一样,总会衰减,最终退化成毫无意义的噪声。我昨天点击了某个品牌,说明可能想买,但是如果是上个月点击的,和现在会不会买基本上没有多大关系了。
    对品牌A点击了1次,对品牌B点击了10次,是更喜欢品牌B,还是犹豫不决?需要通过数据去分析,要结合其它指标对判定。
     点击了某个品牌是想买,还是过来看看卖家是否发货?或者没到货前,再品味一下?
     所以,真实的业务数据处处都是噪声。
     活用数据,设计有业务含义的特征体系,是构造鲁棒模型的基础!
  
自我介绍:
算者:ADD大赛内部赛冠军拓扑队队长。阿里巴巴商务智能部数据分析专家。曾就职于中科院自动化所复杂系统与智能科学实验室、光大银行总行、百度;
冠军队其它成员:
楚蛮:学习于中科院计算所感知课题组,曾就职于雅虎北京研究院,百度等公司,现在在阿里巴巴聚划算数据挖掘岗位;
小法:曾就职神州数码、百度、现就职于阿里妈妈事业部,从事项目工程相关工作,平时喜欢打球、dota。

feature不但重要而且很关键,模型或者算法的作用在于如何更好组合这些feature。举个例子,就像玩乐高积木,feature就像各种组件,如果你想做一个汽车积木,首先要凑够车轮、车轴等零件和组件(feature),模型或者算法就是你的设计,通过你的设计用你自己选择的零部件组装一辆汽车。然后看谁的车跑的远,或者做的像。如果测评的是谁的车跑的远,就要重点选择车轮、车轴,如果考虑看谁的车做的像,就要考虑车灯,车窗,车架。首先看你要比什么,这是优化目标,然后看需要什么特征(零部件)和算法(设计)。

请关注“天池”平台支持的脚本和已有的算法,在Season 1可以使用自己熟悉的,但是Season 2数据是不可下载的,只能在“天池”平台上操作。
Season 2:2014年4月25日至7月30日,参赛者须使用“天池”平台(阿里巴巴自主研发的分布式计算平台),访问海量的天猫数据,并利用Map&Reduce、SQL及各种平台集成的机器学习算法包调试模型、提交结果。

F1-score只是衡量模型和算法效果的多种方式中的一种,评分标准的制定是主办方权衡各种利弊制定出来的。同学们要从解决真实业务问题的目的出发,不要刻意去找所谓的漏洞。相信一点,相对于高分,大家更希望看到高分背后的好思路、好算法和好特征。我们要做的是找到业务背后的规律,不是对数据的拟合,也只有前者才可以取得最后的好成绩。

楼主体会很多,相信在建模的过程中,考虑到了很多实际情况,这一点就是做实际工作和搞研究的不一样。最近参加大数据竞赛,看了国内很多写个性化推荐算法的论文,品质不算太高(只是觉得对竞赛的帮助不是特别大,个人鄙见,看的数量不是太多)。具体问题确实需要具体分析,越真实的环境,越需要贯彻:实事求是、求真务实的精神。
至于“天池”平台,希望他能够提供更多的数据工具箱,比如ARMA的时间序列分析,更多的回归方法~~~
建模的魅力是无限的,建立模型量化消费者的购物欲望,进而进行预测推荐,可能是需要我们仔细思考的。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
AliDMCompetition 阿里巴巴大数据竞赛(http://102.alibaba.com/competition/addDiscovery/index.htm ) 数据说明 提供的原始文件有大约4M左右,涉及1千多天猫用户,几千个天猫品牌,总共10万多条的行为记录。 用户4种行为类型(Type)对应代码分别为: 点击:0 购买:1 收藏:2 购物车:3 提交格式 参赛者将预测的用户存入文本文件中,格式如下: user_id \t brand_id , brand_id , brand_id \n 上传的结果文件名字不限(20字以内),文件必须为txt格式。 预测结果 真实购买记录一共有3526条 TODO 注意调整正负样本比例 在LR的基础上做RawLR。按照天猫内部的思路来。 在LR的基础上做MRLR,样本提取要更加合理。 在UserCF和ItemCF上加上时间因子的影响。 利用UserCF做好的用户聚类、ItemCF做好的品牌聚类来做细化的LR,或者在聚类 上做LFM 在ItemCF的思路上挖掘频繁项集/购买模式,如购买品牌A和商品后往往会购买 品牌B的商品 LFM 数据集特征 某一商品在购买前的一段时间内会出现大量点击次数,购买完成后的一段时间内也会出现大量点击次数 用户在本月有过行为的商品极少出现在下个月的购买列表里 根据观察推断:用户浏览商品的行为可分为两类: 无目的浏览,可能会在浏览过程中对某些中意的商品进行购买,数据表现为有大量点击次数<=2的行为记录,但很少有购买行为 有目的的查找商品,可能是事先有需求的情况,数据表现为一段时间内点击商品数很少, 但点击过的商品大多数都进行了购买 参考论文 See https://www.google.com.hk/search?q=data+mining+time+series&ie=utf-8&oe=utf-8&aq=t for more. Chapter 1 MINING TIME SERIES DATA - ResearchGate 模型列表 LR(model=LinearSVC(C=10, loss='l1'), alpha=0.7, degree=1) | TOTAL VISITED BOUGHT FAVO CART NEW | Pred # 1438 1436 626 71 12 | % 100% 99.861% 43.533% 4.937% 0.834% | Real # 1311 250 89 10 1 | % 100% 19.069% 6.789% 0.763% 0.076% Hit # 76 Precision 5.285118% Recall 5.797101% F1 Score 5.529283% LR(model=LogisticRegression(penalty='l1'), alpha=0.7, degree=1) | TOTAL VISITED BOUGHT FAVO CART NEW | Pred # 1472 1470 615 68 14 | % 100% 99.864% 41.780% 4.620% 0.951% | Real # 1311 250 89 10 1 | % 100% 19.069% 6.789% 0.763% 0.076% Hit # 74 Precision 5.027174% Recall 5.644546% F1 Score 5.318002% 这个模型在数据变成2次后,Precision ~ 16%,同时F1 ~ 3% LR(model=Perceptron(penalty='l1'), alpha=0.7, degree=1) | TOTAL VISITED BOUGHT FAVO CART NEW | Pred # 3145 3140 1023 130 26 | % 100% 99.841% 32.528% 4.134% 0.827% | Real # 1311 250 89 10 1 | % 100% 19.069% 6.789% 0.763% 0.076% Hit # 113 Precis

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值