第一届大学生全国数据挖掘邀请赛#的数据集分析

今天下午有点时间,研究了下#第一届大学生全国数据挖掘邀请赛#的数据集,顺便写个酱油贴。

数据集版权归 上海花千树信息科技有限公司 世纪佳缘交友网站 http://www.love21cn.com 所有

此处省略相关废话51句,详细介绍走这边,http://www.statmodelingcompetition.com

咱们先了解下这次比较的评分标准:

Normalized Discounted Cumulative Gain(NDCG
有关NDCG评分,具体看这里http://www.statmodelingcompetition.com/explain.html


NDCG@10简单来说:
click得1分/msg得2分
取10个你的推荐人(有顺序的哦),对照实际的用户的反馈(rec/click/msg),结合上面的公式,算出你NDCG@10分数。
最理想的情况就是你推荐的每个人,他都发站内消息(注,spammer不算),即NDCG理想得分:1.0,当然这是不可能的,目前排行榜上最高也就.24左右

介绍下下载下来的数据:

data目录:
profile_f.txt,女性会员的资料,203843条数据
profile_m.txt,男性会员的资料,344552条数据
test.txt,
train.txt,原始数据,事实表,格式[USER_ID_A USER_ID_B ROUND ACTION],用户A在第几轮推荐的时候给用户B的反应(不理、点击查看资料、发站内消息)
字段列表.xlsx,这个不要解释,省去废话5字

python目录:(具体看里面的使用方法,这里简单提一下)
evaluate.py,本地计算NDCG分数的脚本
labels_train.txt,由data目录的train.txt数据转换而来,将同一用户的对其他后续人的推荐反馈做的一个聚合,注意,这里已经将推荐轮数给抹掉,分析的时候,推荐轮数可能有点影响。
yourranks.txt,这文件里默认给了一个随机的数据,主要是指导你上传提交的数据格式,每一行,每一列和labels_train.txt的文件里的数据是一一对应的,表示的是labels_train.txt里面的候选人(推荐给用户A的)最合理的推荐顺序(这个其实就是我们需要做的,那个最有可能被用户A看上,当然第一时间推给他,如此。。,注,可能你会奇怪为什么每行的数据不一样,没有办法,因为每一个用户的候选推荐人数列表就是不一样的,有可能是推荐轮数的问题,有可能是给我们的数据的稀疏性造成的,这些都不是问题,只有我们保证前10个,最多20个是非常精确的就行)
使用方法.txt,pass。。。

其实数据挖掘,对数据的理解很重要,并且还需要理解数据之上的业务,然后再建模分析,不断调整优化。

先八卦一下,看哪个人接受的推荐次数最多。
简单对train.txt里面的数据进行处理,得到按推荐次数排序的人员列表:
python脚本:

#!/usr/bin/env python
from operator import itemgetter
import sys
 
word2count={}
filehander=open('train.txt')
for line in filehander:
    line=line.strip()
    word,wordb,count,s = line.split(' ')
    try:
        count=int(count)
        word2count[word]=word2count.get(word,0)+count
    except ValueError:
        pass
 
sorted_word2count=sorted(word2count.items(),key=itemgetter(1))
 
for word,count in sorted_word2count:
    print '%s\t%s'% (word,count)

结果,按升序:

358896	1
542458	1
366130	1
360477	2
431983	2
540444	2
514275	2
26252	2
381466	3
418450	3
31146	3
---------------此处省略若干行------------
361231	36525137
79908	42795706
213224	48362800
175661	55608361
424005	89394331
320212	109569048
297597	123047871
367239	129110961
164276	3379051774

找到这条记录:

164276	m	1216389653	1299542797	1980	0811	33	3301	1	5224	0	20	4	1	1	0	9	1	0	1	172	30	1	1	19	27	155	168	0	1	20	1	0	33	3300

参照excel表格,还原下数据,我们来看一下:

Id:164276	
性别:m	
注册时间:1216389653(Fri Jul 18 2008 22:00:53 GMT+0800 (China Standard Time))
最后登录时间:	1299542797(Tue Mar 08 2011 08:06:37 GMT+0800 (China Standard Time))	
出生年:198031岁)
生日:0811	
工作所在地:33(浙江)	3301(杭州)
征友状态:1	(征友进行中)
登录次数:5224	
是否手机验证:00:未验证,1:验证,其他,归一化为1,注意这里)
学历:	20(大专)
是否购房:	4	(独自购房)
是否购车:1	(暂未购车)
婚姻状况:1(未婚)
是否有小孩:	0(保密,此处有些问题,未婚的一般不会有小孩,处理需注意)
职业:	9(客户服务/技术支持)
照片查看权限:	1(所有人可见,这点我觉得权重影响比较大)
诚信星标:	0(范围:05分)
民族:	1(汉族)
身高:	172
收人:	305000-1w的区间)
是否有头像:	1(有,此处需和照片查看权限结合处理)
宗教信仰:	1	(无)
 
择偶要求
最小年龄:19	
最大年龄:27	
最低身高:155	
最高身高:168	
是否要求星级会员:0	(不要求)
婚姻状况:1	(未婚)
学历:20(大专)
是否接受更高学历	1(ok)
是否要求有头像:	0(不要求)
地区:33	浙江
子地区:3300

这只是单个的特征而已,只能说明个体,我们要了解整体的情况,这么分析不死人吗,还是先入库吧。
先来Profile表的

CREATE TABLE Profile ( 
Uid nvarchar(500),
sex nvarchar(500),
register_time nvarchar(500),
last_login nvarchar(500),
birth_year nvarchar(500),
Birthday nvarchar(500),
work_location nvarchar(500),
work_sublocation nvarchar(500),
STATUS nvarchar(500),
login_count nvarchar(500),
ms_mobile nvarchar(500),
education nvarchar(500),
house nvarchar(500),
auto nvarchar(500),
marriage nvarchar(500),
children nvarchar(500),
industry nvarchar(500),
privacy nvarchar(500),
level nvarchar(500),
nation nvarchar(500),
height nvarchar(500),
income nvarchar(500),
avatar nvarchar(500),
belief nvarchar(500),
match_min_age nvarchar(500),
match_max_age nvarchar(500),
match_min_height nvarchar(500),
match_max_height nvarchar(500),
match_certified nvarchar(500),
match_marriage nvarchar(500),
match_education nvarchar(500),
match_edu_more_than nvarchar(500),
match_avatar nvarchar(500),
match_work_location nvarchar(500),
match_work_sublocation nvarchar(500)
 
)

导入方法:
sqlserver》建表》数据库右键选择import data》选择数据源:flat file source》选择txt文件》目标表选我们上面定义的表,column自动mapping》导》done

SELECT COUNT(*)
  FROM [love21cn].[dbo].[Profile]
 --result--
 --548395

其他表类似,建之。。。,典型的星型结构,简单。

入库之后,数据好分析多了,可以发现很多脏数据,需要做些清洗。

先分析下数据吧,看看数据集都有些什么特征:
首先,可以看到,这个数据集都是浙江的会员
地区:浙江、杭州市

分析注册时间(将unixtime转换成datetime):

SELECT  DATEADD(s, CONVERT(INT,register_time ), '19700101') AS register_time,
DATEADD(s, CONVERT(INT,last_login ), '19700101') AS last_login,*
  FROM [love21cn].[dbo].[Profile]

截取片段

register_time	last_login	Uid	sex	register_time	last_login	birth_year	Birthday
2003-10-16 16:00:00.000	2003-10-31 16:00:00.000	6	f	1066320000	1067616000	1976	0202
2003-10-18 16:00:00.000	2004-11-10 16:00:00.000	10	f	1066492800	1100102400	1982	0101
2003-10-20 16:00:00.000	2005-11-19 09:31:00.000	11	f	1066665600	1132392660	1979	0101
2003-10-22 16:00:00.000	2011-02-22 14:44:56.000	12	f	1066838400	1298385896	1977	1115
2003-10-22 16:00:00.000	2004-10-04 16:00:00.000	13	f	1066838400	1096905600	1978	0101
2003-10-23 16:00:00.000	2009-01-04 10:16:00.000	16	f	1066924800	1231064160	1975	0101
2003-10-25 16:00:00.000	2004-02-25 16:00:00.000	19	f	1067097600	1077724800	1976	1022
2003-10-26 16:00:00.000	2004-11-10 16:00:00.000	21	f	1067184000	1100102400	-1	-1
2003-10-29 16:00:00.000	2006-09-17 10:19:11.000	35	f	1067443200	1158488351	1976	0630

从注册时间可以看用户的会员资格,注册时间那么久,还米有找到意中人?神马情况?最后一次登陆时间还是03年,神马意思?
单看上面的数据可以得到一些有用的信息,另外结合评分的数据,创建维度表,根据需要建立各种分析模型,进行分析。

星座,年龄,登陆次数,是否有房,行业。。。这里面大有文章,一个引子,先到这里,希望对你有用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值