Kaggle competition

 

推荐系统的一个题目

1.题目综述

根据给出的事件信息、用户信息等,给出推荐的活动列表。对于每个时间,给出一个感兴趣的概率值,然后根据概率值进行排序。

判定标准是 MAP(Mean Average Precision) at 200

 

2.数据预处理

题目中给出了六个文件,分别是:

train.csv:特征有6个,分别是用户,事件,是否被邀请,时间戳,感兴趣,不感兴趣。数据量:15000+

test.csv:特征只有train的前四个,数据量:10000+

user.csv:特征有7个,记录了用户的相关信息,数据量38000+

user_friends.csv:记录了每个用户的朋友圈,朋友圈是用一个列表的形式给出的

events.csv:记录了每个活动的信息,110列,前9列给出了列名,后边的都是只给了编号,3100000+

event_attendees.csv:记录的每个活动的参加信息,5列,24000+

其中train和test中的用户和事件信息都是根据id去另外两个表中寻找

3. 特征工程

用到了协同过滤,推荐系统中经常用到协同过滤,分为两种:event与event之间的协同,user与user之间的协同

把协同过滤的推荐度当做一个feature

其他还有:

活动热度(多少人感兴趣/参加)

用户社交活跃度(有多少朋友)

朋友对用户影响度(朋友圈参加活动平均频繁度)

是否被邀请

导包:

from __future__ import division

import itertools
import cPickle
import datetime
import hashlib
import locale
import numpy as np
import pycountry
import scipy.io as sio
import scipy.sparse as ss
import scipy.spatial.distance as ssd

from collections import defaultdict
from sklearn.preprocessing import normalize

 

一、数据预处理

 

1.对local进行编码,用python.locale和defaultdict实现,defaultdict用来将没有编码的(极少数)编位0

2.同样的方法对location和gender进行编码,其中location对美国和加拿大的州进行了编码,其他的都是对国家编码,没找到的都是0

3.对时间进行编码  用datetime.datetime.strptime(‘时间字符串’,‘时间格式’),取出年和月

4.定义获取各个特征编码的函数(编码函数)

 二、特征工程

1.处理user和event数据

  1.统计所有训练集和测试集中所有用户集合和活动集合,并且用两个dict分别存:所有用户对应参加的所有事件和,各个事件对应参与的所有用户

  2.统计每个用户对每个事件是否感兴趣userEventScores,容器是用的dok_matrix(i,j),存成文件后:

  第一行的意思就是编号为1012的用户对11345事件感兴趣

  3.统计关联用户和关联事件,所谓关联就是至少有一次交集(对于事件就是至少有一个用户同时参加了两个事件),最后统计的格式是两两对应,

也就是每两个关联用户组成一个pair,用的是itertools.combinations(users/events, 2)方法,组成uniqueUserPairs和uniqueEventPairs

  4.对每个用户和每个事件进行编号

2.用户相似度userSimMatrix

  1)先从user数据中提取出训练集和测试集中出现的所有用户数据

  2)计算uniqueUserPairs中所有用户对所有特征的欧氏距离,记录到userSimMatrix

3.用户朋友圈数据挖掘

  1)统计用户的朋友个数numFriends

  2)统计用户所有朋友的活跃度userFriends,活跃度的计算是:感兴趣活动数/所有活动

4.事件相似度数据

  包括两个,一个是user-event相似度eventPropSim

      一个是event内容相似度eventContSim

  1)eventPropSim

  根据events中前7个特征,计算uniqueEventPairs中事件对的相似度

  2)eventContSim

  根据events中后101个特征,计算uniqueEventPairs中事件对的相似度

5.活动热度eventPopularity

  参加人数-未参加人数

6.整理特征

1)根据User-based协同过滤,得到event的推荐度

userSimMatrix*userEventScores,可以解释为朋友相似度作为系数*朋友对该事件的感兴趣分数(1or-1),得到的是朋友对用户的推荐度

2)根据基于物品的协同过滤,得到Event的推荐度

eventPropSim/eventContSim * userEventScores,可以解释为事件相似度作为系数*该用户对所有事件的感兴趣分数(注意虽然和上一个特征一样,但是上一个是取一列,这个是取一行),得到的event对event的推荐度

3)用户朋友数量归一化后可以作为一个特征

4)朋友的平均活跃度:

  朋友的活跃度的sum/朋友个数

5)活动热度,就是活动参与人数归一化:

6)有没有被邀请

一共7个特征

加上标签,组成训练集。

三、模型训练

选用SGDClassifier 

训练模型

交叉验证

进行预测

posted @ 2018-03-26 22:08  stAr_1  阅读(428)  评论(0)    收藏  举报