Event Recommendation Engine Challenge分步解析第五步

一、请知晓

 本文是基于:

  Event Recommendation Engine Challenge分步解析第一步

  Event Recommendation Engine Challenge分步解析第二步

  Event Recommendation Engine Challenge分步解析第三步

  Event Recommendation Engine Challenge分步解析第四步

 需要读者先阅读前四篇文章解析

 

二、活跃度/event热度数据

 由于用到event_attendees.csv.gz文件,我们先看看该文件

import pandas as pd
df_events_attendees = pd.read_csv('event_attendees.csv.gz', compression='gzip')
df_events_attendees.head()

 代码示例结果(该文件保存了某event出席情况信息):

 1)变量解释

  nevents:train.csvtest.csv中总共的events数目,这里值为13418

  self.eventPopularity:稀疏矩阵,shape为(nevents,1),保存的值是某个event在上图中yes数目-no数目,即一行行处理上述文件,获取该event的index,后yes列空格分割后数目减去no列空格分割数目,并做归一化 

 

import pandas as pd
import scipy.io as sio
eventPopularity = sio.mmread('EA_eventPopularity').todense()
pd.DataFrame(eventPopularity)

  代码示例结果:

 

  第五步完整代码:

 

from collections import defaultdict
import locale, pycountry
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 cPickleimport scipy.spatial.distance as ssd
import datetime
from sklearn.preprocessing import normalizeimport gzip
import numpy as npimport hashlib#处理user和event关联数据
class ProgramEntities:"""我们只关心train和test中出现的user和event,因此重点处理这部分关联数据,经过统计:train和test中总共3391个users和13418个events"""def __init__(self):#统计训练集中有多少独立的用户的eventsuniqueUsers = set()#uniqueUsers保存总共多少个用户:3391个uniqueEvents = set()#uniqueEvents保存总共多少个events:13418个eventsForUser = defaultdict(set)#字典eventsForUser保存了每个user:所对应的eventusersForEvent = 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] = ifor i, e in enumerate(uniqueEvents):self.eventIndex[e] = iftrain = 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 pairself.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') )#数据清洗类
class DataCleaner:def __init__(self):#一些字符串转数值的方法#载入localeself.localeIdMap = defaultdict(int)for i, l in enumerate(locale.locale_alias.keys()):self.localeIdMap[l] = i + 1#载入countryself.countryIdMap = defaultdict(int)ctryIdx = defaultdict(int)for i, c in enumerate(pycountry.countries):self.countryIdMap[c.name.lower()] = i + 1if c.name.lower() == 'usa':ctryIdx['US'] = iif c.name.lower() == 'canada':ctryIdx['CA'] = ifor cc in ctryIdx.keys():for s in pycountry.subdivisions.get(country_code=cc):self.countryIdMap[s.name.lower()] = ctryIdx[cc] + 1self.genderIdMap = defaultdict(int, {'male':1, 'female':2})#处理LocaleIddef getLocaleId(self, locstr):#这样因为localeIdMap是defaultdict(int),如果key中没有locstr.lower(),就会返回默认int 0return self.localeIdMap[ locstr.lower() ]#处理birthyeardef getBirthYearInt(self, birthYear):try:return 0 if birthYear == 'None' else int(birthYear)except:return 0#性别处理def getGenderId(self, genderStr):return self.genderIdMap[genderStr]#joinedAtdef getJoinedYearMonth(self, dateString):dttm = datetime.datetime.strptime(dateString, "%Y-%m-%dT%H:%M:%S.%fZ")return "".join( [str(dttm.year), str(dttm.month) ] )#处理locationdef getCountryId(self, location):if (isinstance( location, str)) and len(location.strip()) > 0 and location.rfind('  ') > -1:return self.countryIdMap[ location[location.rindex('  ') + 2: ].lower() ]else:return 0#处理timezonedef getTimezoneInt(self, timezone):try:return int(timezone)except:return 0def getFeatureHash(self, value):if len(value.strip()) == 0:return -1else:#return int( hashlib.sha224(value).hexdigest()[0:4], 16) python3会报如下错误#TypeError: Unicode-objects must be encoded before hashingreturn int( hashlib.sha224(value.encode('utf-8')).hexdigest()[0:4], 16)#python必须先进行encodedef getFloatValue(self, value):if len(value.strip()) == 0:return 0.0else:return float(value)#用户与用户相似度矩阵
class Users:"""构建user/user相似度矩阵"""def __init__(self, programEntities, sim=ssd.correlation):#spatial.distance.correlation(u, v) #计算向量u和v之间的相关系数cleaner = DataCleaner()nusers = len(programEntities.userIndex.keys())#3391#print(nusers)fin = open('users.csv')colnames = fin.readline().strip().split(',') #7列特征self.userMatrix = ss.dok_matrix( (nusers, len(colnames)-1 ) )#构建稀疏矩阵for line in fin:cols = line.strip().split(',')#只考虑train.csv中出现的用户,这一行是作者注释上的,但是我不是很理解#userIndex包含了train和test的所有用户,为何说只考虑train.csv中出现的用户if cols[0] in programEntities.userIndex:i = programEntities.userIndex[ cols[0] ]#获取user:对应的indexself.userMatrix[i, 0] = cleaner.getLocaleId( cols[1] )#localeself.userMatrix[i, 1] = cleaner.getBirthYearInt( cols[2] )#birthyear,空值0填充self.userMatrix[i, 2] = cleaner.getGenderId( cols[3] )#处理性别self.userMatrix[i, 3] = cleaner.getJoinedYearMonth( cols[4] )#处理joinedAt列self.userMatrix[i, 4] = cleaner.getCountryId( cols[5] )#处理locationself.userMatrix[i, 5] = cleaner.getTimezoneInt( cols[6] )#处理timezonefin.close()#归一化矩阵self.userMatrix = normalize(self.userMatrix, norm='l1', axis=0, copy=False)sio.mmwrite('US_userMatrix', self.userMatrix)#计算用户相似度矩阵,之后会用到self.userSimMatrix = ss.dok_matrix( (nusers, nusers) )#(3391,3391)for i in range(0, nusers):self.userSimMatrix[i, i] = 1.0for u1, u2 in programEntities.uniqueUserPairs:i = programEntities.userIndex[u1]j = programEntities.userIndex[u2]if (i, j) not in self.userSimMatrix:#print(self.userMatrix.getrow(i).todense()) 如[[0.00028123,0.00029847,0.00043592,0.00035208,0,0.00032346]]#print(self.userMatrix.getrow(j).todense()) 如[[0.00028123,0.00029742,0.00043592,0.00035208,0,-0.00032346]]usim = sim(self.userMatrix.getrow(i).todense(),self.userMatrix.getrow(j).todense())self.userSimMatrix[i, j] = usimself.userSimMatrix[j, i] = usimsio.mmwrite('US_userSimMatrix', self.userSimMatrix)#用户社交关系挖掘
class UserFriends:"""找出某用户的那些朋友,想法非常简单1)如果你有更多的朋友,可能你性格外向,更容易参加各种活动2)如果你朋友会参加某个活动,可能你也会跟随去参加一下"""def __init__(self, programEntities):nusers = len(programEntities.userIndex.keys())#3391self.numFriends = np.zeros( (nusers) )#array([0., 0., 0., ..., 0., 0., 0.]),保存每一个用户的朋友数self.userFriends = ss.dok_matrix( (nusers, nusers) )fin = gzip.open('user_friends.csv.gz')print( 'Header In User_friends.csv.gz:',fin.readline() )ln = 0#逐行打开user_friends.csv.gz文件#判断第一列的user是否在userIndex中,只有user在userIndex中才是我们关心的user#获取该用户的Index,和朋友数目#对于该用户的每一个朋友,如果朋友也在userIndex中,获取其朋友的userIndex,然后去userEventScores中获取该朋友对每个events的反应#score即为该朋友对所有events的平均分#userFriends矩阵记录了用户和朋友之间的score#如851286067:1750用户出现在test.csv中,该用户在User_friends.csv.gz中一共2151个朋友#那么其朋友占比应该是2151 / 总的朋友数sumNumFriends=3731377.0 = 2151 / 3731377 = 0.0005764627910822198for line in fin:if ln % 200 == 0:print( 'Loading line:', ln )cols = line.decode().strip().split(',')user = cols[0]if user in programEntities.userIndex:friends = cols[1].split(' ')#获得该用户的朋友列表i = programEntities.userIndex[user]self.numFriends[i] = len(friends)for friend in friends:if friend in programEntities.userIndex:j = programEntities.userIndex[friend]#the objective of this score is to infer the degree to#and direction in which this friend will influence the#user's decision, so we sum the user/event score for#this user across all training eventseventsForUser = programEntities.userEventScores.getrow(j).todense()#获取朋友对每个events的反应:0, 1, or -1#print(eventsForUser.sum(), np.shape(eventsForUser)[1] )#socre即是用户朋友在13418个events上的平均分score = eventsForUser.sum() / np.shape(eventsForUser)[1]#eventsForUser = 13418,#print(score)self.userFriends[i, j] += scoreself.userFriends[j, i] += scoreln += 1fin.close()#归一化数组sumNumFriends = self.numFriends.sum(axis=0)#每个用户的朋友数相加#print(sumNumFriends)self.numFriends = self.numFriends / sumNumFriends#每个user的朋友数目比例sio.mmwrite('UF_numFriends', np.matrix(self.numFriends) )self.userFriends = normalize(self.userFriends, norm='l1', axis=0, copy=False)sio.mmwrite('UF_userFriends', self.userFriends)#构造event和event相似度数据
class Events:"""构建event-event相似度,注意这里有2种相似度1)由用户-event行为,类似协同过滤算出的相似度2)由event本身的内容(event信息)计算出的event-event相似度"""def __init__(self, programEntities, psim=ssd.correlation, csim=ssd.cosine):cleaner = DataCleaner()fin = gzip.open('events.csv.gz')fin.readline()#skip headernevents = len(programEntities.eventIndex)print(nevents)#13418self.eventPropMatrix = ss.dok_matrix( (nevents, 7) )self.eventContMatrix = ss.dok_matrix( (nevents, 100) )ln = 0for line in fin:#if ln > 10:#breakcols = line.decode().strip().split(',')eventId = cols[0]if eventId in programEntities.eventIndex:i = programEntities.eventIndex[eventId]self.eventPropMatrix[i, 0] = cleaner.getJoinedYearMonth( cols[2] )#start_timeself.eventPropMatrix[i, 1] = cleaner.getFeatureHash( cols[3] )#cityself.eventPropMatrix[i, 2] = cleaner.getFeatureHash( cols[4] )#stateself.eventPropMatrix[i, 3] = cleaner.getFeatureHash( cols[5] )#zipself.eventPropMatrix[i, 4] = cleaner.getFeatureHash( cols[6] )#countryself.eventPropMatrix[i, 5] = cleaner.getFloatValue( cols[7] )#latself.eventPropMatrix[i, 6] = cleaner.getFloatValue( cols[8] )#lonfor j in range(9, 109):self.eventContMatrix[i, j-9] = cols[j]ln += 1fin.close()self.eventPropMatrix = normalize(self.eventPropMatrix, norm='l1', axis=0, copy=False)sio.mmwrite('EV_eventPropMatrix', self.eventPropMatrix)self.eventContMatrix = normalize(self.eventContMatrix, norm='l1', axis=0, copy=False)sio.mmwrite('EV_eventContMatrix', self.eventContMatrix)#calculate similarity between event pairs based on the two matricesself.eventPropSim = ss.dok_matrix( (nevents, nevents) )self.eventContSim = ss.dok_matrix( (nevents, nevents) )for e1, e2 in programEntities.uniqueEventPairs:i = programEntities.eventIndex[e1]j = programEntities.eventIndex[e2]if not ((i, j) in self.eventPropSim):epsim = psim( self.eventPropMatrix.getrow(i).todense(), self.eventPropMatrix.getrow(j).todense())if np.isnan(epsim):epsim = 0self.eventPropSim[i, j] = epsimself.eventPropSim[j, i] = epsimif not ((i, j) in self.eventContSim):#两个向量,如果某个全为0,会返回nan"""import numpy as npa = np.array([0, 1, 1, 1, 0, 0, 0, 1, 0, 0])b = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])from scipy.spatial.distance import cosinetemp = cosine(a, b)会出现下面问题:Warning (from warnings module):File "D:\Python35\lib\site-packages\scipy\spatial\distance.py", line 644dist = 1.0 - uv / np.sqrt(uu * vv)RuntimeWarning: invalid value encountered in double_scalars"""ecsim = csim( self.eventContMatrix.getrow(i).todense(), self.eventContMatrix.getrow(j).todense())if np.isnan(ecsim):ecsim = 0self.eventContSim[i, j] = ecsimself.eventContSim[j, i] = ecsimsio.mmwrite('EV_eventPropSim', self.eventPropSim)sio.mmwrite('EV_eventContSim', self.eventContSim)class EventAttendees:"""统计某个活动,参加和不参加的人数,从而为活动活跃度做准备"""def __init__(self, programEntities):nevents = len(programEntities.eventIndex)#13418self.eventPopularity = ss.dok_matrix( (nevents, 1) )f = gzip.open('event_attendees.csv.gz')f.readline()#skip headerfor line in f:cols = line.decode().strip().split(',')eventId = cols[0]if eventId in programEntities.eventIndex:i = programEntities.eventIndex[eventId]self.eventPopularity[i, 0] = len(cols[1].split(' ')) - len(cols[4].split(' '))#yes人数-no人数,即出席人数减未出席人数f.close()self.eventPopularity = normalize( self.eventPopularity, norm='l1', axis=0, copy=False)sio.mmwrite('EA_eventPopularity', self.eventPopularity)def data_prepare():"""计算生成所有的数据,用矩阵或者其他形式存储方便后续提取特征和建模"""print('第1步:统计user和event相关信息...')pe = ProgramEntities()print('第1步完成...\n')print('第2步:计算用户相似度信息,并用矩阵形式存储...')Users(pe)print('第2步完成...\n')print('第3步:计算用户社交关系信息,并存储...')UserFriends(pe)print('第3步完成...\n')print('第4步:计算event相似度信息,并用矩阵形式存储...')Events(pe)print('第4步完成...\n')print('第5步:计算event热度信息...')EventAttendees(pe)print('第5步完成...\n')#运行进行数据准备
data_prepare()

 

 

 综上完成数据的预处理和保存功能

 下面我们来看看特征构建:Event Recommendation Engine Challenge分步解析第六步

 

转载于:https://www.cnblogs.com/always-fight/p/10505454.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络之RIP协议与OSPF协议模拟、UDP与TCP编程,Wireshark抓包分析

通过Python模拟RIP协议,OSPF协议,并模拟UDP和TCP编程,并通过Wireshark抓包工具,对所发送的报文进行捕获分析。 文章目录 一、RIP协议的模拟与编程二、OSPF协议的模拟与编程三、UDP编程四、TCP套接字编程五、Wireshark 数据分析六、总结一、RIP协议的模拟与编程 1.1 题目 …

虚拟机 NAT模式与桥接模式的区别

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! NAT模式:相当于宿主机再构建一个局域网,虚拟机无法和本局域网中的其他真实主机进行通讯。只需要宿主机器能访问互联网,那么虚拟机就能上网,不需要再…

基础研究和前沿技术领域校企融合协同创新的国际经验及启示

来源:中国科学技术发展战略研究院作者:薛姝、何光喜、张文霞原载于《全球科技经济瞭望》2021年5月第5期摘要:促进大学与企业的合作是各个国家科技创新政策和创新体系建设的重点任务,近年来也出现了加强在基础研究和前沿技术领域加…

理解云计算三种服务模式——IaaS、PaaS和SaaS

云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为三个大类:SaaS(Software as a Service–软件即服务) PaaS(Platform as a Service–平台即服务) IaaS(Infrastruc…

术,路,心:陈天桥的大脑行旅

来源: 脑极体在互联网、云计算与电动汽车之后,连同资本、产业、学术界在内的社会各界,纷纷开始将目光投向更远的地方。下一个超级机会藏在何处?下一个改变人类文明的技术机遇何时触发?随着各国开始在国家战略层面布局下…

8万行的insert数据,Ctrl+c、Ctrl+v后心态崩了(如何在Linux下对MySQL数据库执行sql文件)...

从最下面可以看到,差不多有86389行,Ctrlc、Ctrlv后 PHPstorm一直没有反应。。。。 肿么办??复制粘贴不行的话,可以用什么方法把数据插入到数据库中,数据库用的是MySQL。 皇天不负有心人,卧薪尝胆…

链路状态路由协议与OSPF

链路状态路由算法(LS算法) 工作原理 每个路由器将自己的链路状态信息洪泛到网络上的所有路由器。tips:(每个路由器都洪泛会给网络带来负担)每个路由器最终会知道整个网络的拓扑结构(LSDB)。每个路由器使用…

感知算法、规划地图……波士顿动力揭秘Atlas机器人跑酷背后的技术

来源:机器之心,编辑:nhyilin仅用于学术分享,版权属于原作者几天前,波士顿动力公司放出了双足人形机器人 Atlas 的最新酷炫视频。这次,Atlas 展示了它的最新技能「跑酷」。在一系列倾斜胶合板还有木箱垒成的…

BGP协议

概述 BGP是目前“唯一”的EGP协议,用于AS之间传递路由信息,目前版本为4 为什么需要BGP? 不同AS自治系统的管理部门不同,路由策略不同AS之间的路由不强调最优路径,更强调路由控制和路由策略 IGP与BGP对比 IGP关注如…

Science Robotics:新型多足机器人可自行组装,零件损坏时也能继续运动

来源:DeepTech深科技在自然环境中,群体昆虫(如蜜蜂、蚂蚁、白蚁等)、鱼类和鸟类等动物可以通过合作来完成生物个体难以或不可能完成的任务。受到这些集群行为的启发,许多研究人员研究了自组装或可重构的模块化群机器人…

NAT与DHCP协议

DHCP概述 DHCP产生的原因 大型网络中静态配置IP地址容易出现地址冲突 定义 DHCP:动态主机配置协议,用于主机自动获得IP地址、子网掩码、网关地址、DNS服务器地址,租用期等相关信息。采用C/S模式。DHCP给运行服务器软件、且位置固定的计算机…

OpenGL基础入门及准备

一、计算机图像学相关概念 1.1 计算机图形学,是一种使用数学算法将二维或三维图形转化为计算机显示器所能显示的二维栅格形式的科学。 1.2 屏幕像素组成的网格即称为栅格。 1.3 计算机图形学研究 Modeling:构造场景的三维模型,建模&#…

哈佛商业评论:什么是颠覆性创新?

来源:点滴科技资讯什么是颠覆性创新?在引入该理论 20 年后,我们重新审视了它所解释的和未解释的。本文发表于哈佛商业评论(2015 年 12 月) 作者:克莱顿 M.克里斯滕森, 迈克尔E雷诺,和…

定长掩码地址划分与VLSM子网划分

定长掩码地址划分 案例 若某个公司得到一个C类网络地址210.33.15.0,假如所有子网的掩码都一样,该如何划分子网? 步骤一:确定子网个数 7个子网,其中4个局域网,3个广域网 步骤2:确定每个子网所需…

OpenGL之几何、投影、裁剪、视口变换以及全局变换与局部变换

一、变换的概念 1.1 图形流水线 1.2 变换(Transformation) 变换主要分为四个步骤,主要就是在Vertex operations阶段操作顶点信息,会在流水线中依次进行。 几何变换投影变换裁剪视口变换 三维模型到二维图形的主要变换过程&am…

WinForm中DataGridView的TextBoxColumm换行

一、内容超过显示宽度自动换行: 在需要自动换行的列中设置 二、换行符换行: 一开始在需要换行的文本添加"\r\n"并不能直接换行,DGV直接把\r\n显示出来了,后换成 System.Environment.NewLine 解决问题转载于:https://www…

刷脸背后,卷积神经网络的数学原理原来是这样的

来源:深度学习这件小事计算机视觉技术在日常生活中有着非常普遍的应用:发朋友圈之前自动修图、网上购物时刷脸支付……在这一系列成功的应用背后,卷积神经网络功不可没。本文将介绍卷积神经网络背后的数学原理。在自动驾驶、医疗以及零售这些…

OpenGL之坐标系以及单位

1.1 OpenGL中默认的坐标系为右手坐标系,默认视点位置为原点,原点正好投影在投影窗口的中心,也正好投影在视口的中心。 1.2 在OpenGL中无绝对单位,只有相对的大小,相对于视锥体的大小来设定物体的大小。 1.3 通过估算…

人工智能设计芯片,比你想象的更大胆

来源:ZDNet作者:Tiernan Ray编译:科技行者AI(人工智能)技术正在越来越多地被应用于半导体设计之中,这种做法的优势之一是,人工智能技术会尝试人类想都不敢想的设计方案。例如,对边际…

OpenGL之相关库介绍及基本语法、The OpenGL Machine

1.1 OpenGL Library核心库 包括115个函数,前缀为 :gl,主要在gl.h、openGL32.lib,openGL32.dll中; 1.2 OpenGL utility library 实用程序库 包含43个函数,前缀:glu;主要为核心库的…