• Event Recommendation Engine Challenge分步解析第一步


    一、简介

     此项目来自kaggle:https://www.kaggle.com/c/event-recommendation-engine-challenge/

     数据集的下载需要账号,并且需要手机验证(之前如果kaggle账号已经验证过,就不需要验证了),验证的时候手机号前面需要加上860:

     这里我已经将数据下载,并上传到百度云盘,链接:https://pan.baidu.com/s/1KDZN313XkbhkRDZX4dLYNA 提取码:ino3

     

     背景介绍

      根据user actions, event metadata, and demographic information(社交信息)预测用户对哪个event感兴趣

     桌面新建文件夹:推荐比赛->进入推荐比赛文件夹->shift + 右键->在此处新建命令窗口->jupyter notebook->新建recommend脚本,将上面下载的数据解压到推荐比赛文件夹

     1)第一步:统计user和event相关信息

      我们先看看train.csv:

    import pandas as pd
    df_train = pd.read_csv('train.csv')
    df_train.head()

      结果如下:前两列是用户ID和对应的event ID

      test.csv中用户缺少了标签:

      让我们来看看第一步的完整代码:

    from collections import defaultdict
    import scipy.sparse as ss
    import scipy.io as sio
    import itertools
    #import cPickle
    #From python3, cPickle has beed replaced by _pickle
    import _pickle as cPickle
    
    class ProgramEntities:
        """
        我们只关心train和test中出现的user和event,因此重点处理这部分关联数据,
        经过统计:train和test中总共3391个users和13418个events
        """
        def __init__(self):
            #统计训练集中有多少独立的用户的events
            uniqueUsers = set()#uniqueUsers保存总共多少个用户:3391个
            uniqueEvents = set()#uniqueEvents保存总共多少个events:13418个
            eventsForUser = defaultdict(set)#字典eventsForUser保存了每个user:所对应的event
            usersForEvent = defaultdict(set)#字典usersForEvent保存了每个event:哪些user点击
            for filename in ['train.csv', 'test.csv']:
                f = open(filename)
                f.readline()#跳过第一行
                for line in f:
                    cols = line.strip().split(',')
                    uniqueUsers.add( cols[0] )
                    uniqueEvents.add( cols[1] )
                    eventsForUser[cols[0]].add( cols[1] )
                    usersForEvent[cols[1]].add( cols[0] )
                f.close()
            
            self.userEventScores = ss.dok_matrix( ( len(uniqueUsers), len(uniqueEvents) ) )
            self.userIndex = dict()
            self.eventIndex = dict()
            for i, u in enumerate(uniqueUsers):
                self.userIndex[u] = i
            for i, e in enumerate(uniqueEvents):
                self.eventIndex[e] = i
                
            ftrain = open('train.csv')
            ftrain.readline()
            for line in ftrain:
                cols = line.strip().split(',')
                i = self.userIndex[ cols[0] ]
                j = self.eventIndex[ cols[1] ]
                self.userEventScores[i, j] = int( cols[4] ) - int( cols[5] )
            ftrain.close()
            sio.mmwrite('PE_userEventScores', self.userEventScores)
            
            #为了防止不必要的计算,我们找出来所有关联的用户或者关联的event
            #所谓关联用户指的是至少在同一个event上有行为的用户user pair
            #关联的event指的是至少同一个user有行为的event pair
            self.uniqueUserPairs = set()
            self.uniqueEventPairs = set()
            for event in uniqueEvents:
                users = usersForEvent[event]
                if len(users) > 2:
                    self.uniqueUserPairs.update( itertools.combinations(users, 2) )
            for user in uniqueUsers:
                events = eventsForUser[user]
                if len(events) > 2:
                    self.uniqueEventPairs.update( itertools.combinations(events, 2) )
            #rint(self.userIndex)
            cPickle.dump( self.userIndex, open('PE_userIndex.pkl', 'wb'))
            cPickle.dump( self.eventIndex, open('PE_eventIndex.pkl', 'wb') )
    
    print('第1步:统计user和event相关信息...')
    pe = ProgramEntities()
    print('第1步完成...
    ')
    

      其中PE_userEventScores.mtx是所有users和events的矩阵,但是里面的值只有train.csv的值,值是1或者-1

      scipy.sparse.dok_matrix()函数是产生一个稀疏矩阵,这样PE_userEventScores.mtx只保存了非0值

      针对该步使用的变量作简单介绍:

       uniqueUsers:集合,保存train.csvtest.csv中的所有user ID

       uniqueEvents:集合,保存train.csvtest.csv中的所有event ID

       eventsForUser:字典,key为每个用户,value为该用户对应的event集合

       usersForEvent:字典,key为每个event,value为该event对应的user集合

       userIndex:字典,每个用户有个Index

       eventIndex:字典,每个event有个Index

       userEventScores:稀疏矩阵3391 * 13418,use vs event,矩阵元素为train.csv中每个user对某个event的兴趣分(1, 0 or -1)即interested - not_interested

    import pandas as pd
    pd.DataFrame(userEventScores)

       代码示例结果:

    userEventScores:每个user对每个event的兴趣分(1, 0 or -1

       uniqueUserPairs:集合,如果对于同一个event来说,关联上3个及3个以上users,则该event关联上的users进行两两配对,保存在uniqueUserPairs中,注意保存的是userId,而不是user对应的索引:

    import pandas as pd
    df_train = pd.read_csv('train.csv')
    df_train[df_train['event']==1502284248]
    
    import itertools
    for each in itertools.combinations(set([3044012,1302145719,3194014105,3669515588]), 2):
        print(each)

       代码结果示例:

     

       uniqueEventPairs:集合,对于同一个用户,如果其关联的events大于等于3,则这些关联的events保存在uniqueEventPairs中,注意保存的是event id,而不是event对应的索引:

    import pandas as pd
    df_train = pd.read_csv('train.csv')
    df_train[df_train['user']==3044012]
    
    import itertools
    for each in itertools.combinations(set([1918771225,1502284248,2529072432, 3072478280, 1390707377, 1532377761	]), 2):
        print(each)
    

       代码结果示例:

     

       cPickle模块(python3为pickle或者_pickle模块):请参考pickle详解

     

     至此,第一步完成,哪里有不明白的请留言

     我们继续看Event Recommendation Engine Challenge分步解析第二步

  • 相关阅读:
    26个Jquery使用小技巧(jQuery tips, tricks & solutions)
    JavaScript中Eval()函数的作用
    基于邮件通道的WCF通信系统
    同步一个数据库要发多少个数据包?
    还在写SQL的同志,去喝杯咖啡吧!
    隐藏在程序旮旯中的“安全问题”
    在SQLMAP中使用动态SQL
    SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
    实例探究字符编码:unicode,utf8,default,gb2312 的区别
    Why to do,What to do,Where to do 与 Lambda表达式!
  • 原文地址:https://www.cnblogs.com/always-fight/p/10248084.html
Copyright © 2020-2023  润新知