1、比赛内容:

https://tianchi.aliyun.com/getStart/introduction.htm?spm=5176.100066.0.0.62a0c916DZRdDr&raceId=231574

2、解题思路:将转发、评论、赞次数作为物品推荐给博文(预先用结巴分词抽取关键词作为博文标签)

3、参考代码:

1)主程序

# -*- coding: utf-8 -*-
'''
Created on 2017年10月31日@author: Jason.F
'''
import time
import pandas as pd
from sklearn import cross_validation
import jieba
import jieba.analyse
from ItemCF import ItemCF class cWeibo:def __init__(self,path):self.path=pathdef importData(self):path=self.path#导入样本集data=pd.read_csv(path+'\\weibo_train_data.txt',encoding='utf8',sep='\t',names=['luid','mid','time','fcs','ccs','lcs','cont'])#nrows=1000data['fcs']=data['fcs'].astype('int')#博文发表一周后的转发数,权重0.5data['ccs']=data['ccs'].astype('int')#博文发表一周后的评论数,权重0.25data['lcs']=data['lcs'].astype('int')#博文发表一周后的点赞数,权重0.25train,test=cross_validation.train_test_split(data,test_size=0.2)self.traindata = pd.DataFrame(data)#全量训练self.testdata = pd.DataFrame(test)#测试集print '训练集,有:', self.traindata.shape[0], '行', self.traindata.shape[1], '列'print '测试集,有:', self.testdata.shape[0], '行', self.testdata.shape[1], '列'#导入预测集data=pd.read_csv(path+'\\weibo_predict_data.txt',encoding='utf8',sep='\t',names=['luid','mid','time','cont'])#nrows=100self.predata=data #预测集print '预测集,有:', self.predata.shape[0], '行', self.predata.shape[1], '列'def ETL(self):'''#uid映射为数字编号ut_train=set(self.traindata.ix[:,0])ut_pred=set(self.predata.ix[:,0])ut=list(ut_train.symmetric_difference(ut_pred))#取并集并去重df_ut=pd.DataFrame(ut,columns=['luid'])df_ut['uid']=df_ut.indexself.traindata=pd.merge(self.traindata,df_ut, on=['luid'], how='left')self.traindata=self.traindata[['uid','time','fcs','ccs','lcs','cont']]self.testdata=pd.merge(self.testdata,df_ut, on=['luid'], how='left')self.testdata=self.testdata[['uid','time','fcs','ccs','lcs','cont']]self.predata=pd.merge(self.predata,df_ut, on=['luid'], how='left')self.predata=self.predata[['luid','mid','uid','time','cont']]'''#time转换成0-23数字,必要下要考虑特殊节日self.traindata['time']=self.traindata.apply(lambda x:(time.strptime(x['time'],"%Y-%m-%d %H:%M:%S")).tm_hour,axis=1)self.traindata.rename(columns=lambda x:x.replace('time','tid'), inplace=True)#修改列名为tidself.testdata['time']=self.testdata.apply(lambda x:(time.strptime(x['time'],"%Y-%m-%d %H:%M:%S")).tm_hour,axis=1)self.testdata.rename(columns=lambda x:x.replace('time','tid'), inplace=True)self.predata['time']=self.predata.apply(lambda x:(time.strptime(x['time'],"%Y-%m-%d %H:%M:%S")).tm_hour,axis=1)self.predata.rename(columns=lambda x:x.replace('time','tid'), inplace=True)    #cont分词,文本内容要考虑带@和红包的特殊意义词#jieba.suggest_freq('@', True)self.traindata['cont']=self.traindata.apply(lambda x:",".join(jieba.analyse.extract_tags(x['cont'],topK=50,\allowPOS=('n','nr','ns','nt','nz','a','ad','an','f','s','i','t','v','vd','vn'))),axis=1)self.traindata=self.traindata.drop('cont', axis=1).join(self.traindata['cont'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('tag'))self.testdata['cont']=self.testdata.apply(lambda x:",".join(jieba.analyse.extract_tags(x['cont'],topK=50,\allowPOS=('n','nr','ns','nt','nz','a','ad','an','f','s','i','t','v','vd','vn'))),axis=1)self.testdata=self.testdata.drop('cont', axis=1).join(self.testdata['cont'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('tag'))self.predata['cont']=self.predata.apply(lambda x:",".join(jieba.analyse.extract_tags(x['cont'],topK=50,\allowPOS=('n','nr','ns','nt','nz','a','ad','an','f','s','i','t','v','vd','vn'))),axis=1)self.predata=self.predata.drop('cont', axis=1).join(self.predata['cont'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('tag'))#生成标签表ft_train=set(self.traindata.ix[:,6])ft_pred=set(self.predata.ix[:,3])ft=list(ft_train.symmetric_difference(ft_pred))#取并集并去重df_ft=pd.DataFrame(ft,columns=['tag'])df_ft['fid']=df_ft.indexself.traindata=pd.merge(self.traindata,df_ft, on=['tag'], how='left')self.traindata=self.traindata[['luid','mid','tid','fid','fcs','ccs','lcs']]self.traindata=self.traindata.dropna(axis=0,how='any')  self.traindata['fid']=self.traindata['fid'].astype('int')      self.testdata=pd.merge(self.testdata,df_ft, on=['tag'], how='left')self.testdata=self.testdata[['luid','mid','tid','fid','fcs','ccs','lcs']]self.testdata=self.testdata.dropna(axis=0,how='any') self.testdata['fid']=self.testdata['fid'].astype('int')          self.predata=pd.merge(self.predata,df_ft, on=['tag'], how='left')self.predata=self.predata[['luid','mid','tid','fid']]self.predata=self.predata.dropna(axis=0,how='any')self.predata['fid']=self.predata['fid'].astype('int')def callItemCF(self):data=self.traindata #data['u']=data.apply(lambda x:str(x['uid'])+':'+x['tid']+':'+str(x['fid']),axis=1)data_f=data[['fid','fcs','tid']]data_c=data[['fid','ccs','tid']]data_l=data[['fid','lcs','tid']]#训练转发次数推荐模型ic_f = ItemCF(data_f)ic_f.user_item()#转化成dict,并生成训练集和测试集ic_f.ItemSimilarity()#生成物品相似度矩阵self.ic_f=ic_f#训练评论次数推荐模型ic_c = ItemCF(data_c)ic_c.user_item()#转化成dict,并生成训练集和测试集ic_c.ItemSimilarity()#生成物品相似度矩阵self.ic_c=ic_c#训练点赞次数推荐模型ic_l = ItemCF(data_l)ic_l.user_item()#转化成dict,并生成训练集和测试集ic_l.ItemSimilarity()#生成物品相似度矩阵self.ic_l=ic_ltest=self.testdatatest_f=test[['mid','fid','tid','fcs']]test_c=test[['mid','fid','tid','ccs']]test_l=test[['mid','fid','tid','lcs']]test_f['pfcs']=test_f.apply(lambda x: ((ic_f.recommend(x['fid'])).keys())[0] if len((ic_f.recommend(x['fid'])).keys()) else 0,axis=1)test_c['pccs']=test_c.apply(lambda x: ((ic_c.recommend(x['fid'])).keys())[0] if len((ic_c.recommend(x['fid'])).keys()) else 0,axis=1)test_l['plcs']=test_l.apply(lambda x: ((ic_l.recommend(x['fid'])).keys())[0] if len((ic_l.recommend(x['fid'])).keys()) else 0,axis=1)#计算准确率precision=self.precision (test_f[['mid','fcs','pfcs']],test_c[['mid','ccs','pccs']],test_l[['mid','lcs','plcs']])print (precision)def precision(self,test_f,test_c,test_l):#转发、评论、点赞次数预测偏差test_f=test_f.groupby('mid').mean()test_c=test_c.groupby('mid').mean()test_l=test_l.groupby('mid').mean()test_f['dev_f']=test_f.apply(lambda x:abs(x['fcs']-int(x['pfcs']))/(x['fcs']+5),axis=1)test_c['dev_c']=test_c.apply(lambda x:abs(x['ccs']-int(x['pccs']))/(x['ccs']+3),axis=1)test_l['dev_l']=test_l.apply(lambda x:abs(x['lcs']-int(x['plcs']))/(x['lcs']+3),axis=1)#print(test_f.columns.tolist)test=test_ftest=pd.merge(test,test_c,left_index=True,right_index=True)#以索引连接test=pd.merge(test,test_l,left_index=True,right_index=True)test['prec']=test.apply(lambda x:(1-0.5*x['dev_f']-0.25*x['dev_c']-0.25*x['dev_l']),axis=1)test['count']=test.apply(lambda x: 100 if (x['pfcs']+x['pccs']+x['plcs']>100) else (x['pfcs']+x['pccs']+x['plcs']),axis=1)test['sgn']=test.apply(lambda x:1 if (x['prec']-0.8) >0 else 0,axis=1)test['on']=test.apply(lambda x:(x['count']+1)*x['sgn'],axis=1)test['down']=test.apply(lambda x:(x['count']+1),axis=1)prec_df=test[['on','down']]#prec_df.loc['Row_sum'] = prec_df.apply(lambda x: x.sum())#on=prec_df.get_value(index='Row_num',col='on',takeable=False)on=prec_df['on'].sum()down=prec_df['down'].sum()return (on/down)def predict(self):'''文件命名:weibo_result_data.txtuid、mid、forward_count字段以tab键分隔forward_count、comment_count、like_count字段间以逗号分隔'''predata=self.predata[['luid','mid','tid','fid']]predata['pfcs']=predata.apply(lambda x:((self.ic_f.recommend(x['fid'])).keys())[0] if len((self.ic_f.recommend(x['fid'])).keys()) else 0,axis=1)predata['pccs']=predata.apply(lambda x:((self.ic_c.recommend(x['fid'])).keys())[0] if len((self.ic_c.recommend(x['fid'])).keys()) else 0,axis=1)predata['plcs']=predata.apply(lambda x:((self.ic_l.recommend(x['fid'])).keys())[0] if len((self.ic_l.recommend(x['fid'])).keys()) else 0,axis=1)print (predata)if __name__ == "__main__":   start = time.clock()  wb=cWeibo('D:\\CVTE\\weibo')wb.importData()#导入数据wb.ETL()#特征抽取wb.callItemCF()#推荐算法wb.predict()end = time.clock()    print ('finish all in %s' % str(end - start)) 

2)基于时间上下文的ItemCF推荐算法:time设置为1,可以自己处理后传入

# -*- coding: utf-8 -*-
'''
Created on 2017年10月31日
基于时间上下文的物品协同过滤推荐算法
@author: Administrator
'''import math
import numpy as np
import timeclass ItemCF:def __init__(self,data):self.data = datadef user_item(self):#训练集转化成dictdata=self.dataself.traindata = {}       for user,item,time in  np.array(data).tolist():self.traindata.setdefault(user,{})self.traindata[user][item] =1#time        def ItemSimilarity(self,alpha=1):train=self.traindata#calculate co-rated users between itemsC=dict()N=dict()for u,items in train.items():for i,tui in items.items():N.setdefault(i,0)N[i]+=1for j,tuj in items.items():C.setdefault(i,{})if i==j:continueC[i].setdefault(j,0)C[i][j]+=1/(1+alpha*abs(tui-tuj))#calculate finial similarity matrix WW=dict()for i,related_items in C.items():W.setdefault(i,{})for j, cij in related_items.items():W[i].setdefault(j,0)W[i][j]=cij/math.sqrt(N[i]*N[j]*1.0)self.itemSim=W def recommend(self,user,tid=1,k=1,beta=1):W=self.itemSimtrain=self.traindatarank=dict()ru=train.get(user,{})for i,tui in ru.items():for j,wj in W[i].items():     if j in ru.keys():continuerank.setdefault(j,0)rank[j]+=wj/(1+beta*abs(tid-tui))return dict(sorted(rank.items(), key = lambda x:x[1], reverse = True)[0:k])if __name__ == "__main__":   start = time.clock()  end = time.clock()    print('finish all in %s' % str(end - start))

预测准确率比较低,主要是:

1)博文标签通过结巴分词标签化后,博文之间的关联性降低了,考虑用textrank或lsa方法;

2)对时间元素如何在推荐算法中体现需要进一步考虑;

3)用户在这里没有参与模型,这个缺失比较严重。

重点是研发基于时间上下文的ItemCF算法,其他思路待考虑。

【知识发现】天池平台新浪微博互动预测-ItemCF推荐方法相关推荐

  1. 天池新人赛之新浪微博互动预测

    最近参加了天池上的新人赛,把比赛的流程走了一遍,收获挺大.现把比赛思路简单记录一下,欢迎大家一起来讨论交流. 1. 对训练数据进行简单分析 拿到数据集,先对整个数据集做个简要分析,比如数据量大小.每种 ...

  2. 【Python学习系列二十九】scikit-learn库实现天池平台智慧交通预测赛

    1.背景:https://tianchi.aliyun.com/competition/introduction.htm?spm=5176.100066.0.0.3f6e7d83RQgWEL& ...

  3. 实战微博互动预测之一_问题分析 以及 分布式下的事件驱动机制(Pub与Sub模式)

    实战微博互动预测之一_问题分析 2017年12月08日 13:21:04 xieyan0811 阅读数:2390 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  4. 阿里云天池平台官方出品!从0到1层层拆解天池大赛赛题 | 文末送书

    天池平台 著 电子工业出版社-博文视点 2021-09-01 ISBN: 9787121417818 定价: 108.00 元 新书推荐

  5. 【机器学习】天池O2O优惠券使用预测_系统性总结与心得

    Preface:上半年参加天池的O2O优惠券预测赛排名第二,同时参加了学校数据仓库老师的课程改革建设团队,于是把参赛经验总结成文,准备分享给该课程的学弟学妹.现在我把总结的参赛教程文章也发到CSDN上 ...

  6. 如何接入一个全平台实时互动白板

    如何接入一个全平台实时互动白板 white 是一款全平台支持的实时互动白板,可以用于在线教育.会议.远程协作.设计审查.PPT 演示等场景. white 官方网站 我们在官网上做了详细的产品介绍,让用 ...

  7. 如何接入一个全平台实时互动白板 1

    如何接入一个全平台实时互动白板 white 是一款全平台支持的实时互动白板,可以用于在线教育.会议.远程协作.设计审查.PPT 演示等场景. white 官方网站 我们在官网上做了详细的产品介绍,让用 ...

  8. 大数据的应用-UserCF和ItemCF推荐算法

    一.推荐系统 1.1 推荐系统是大数据在互联网领域的典型应用,它可以通过分析用户的历史记录来了解用户的喜好,从而主动的为用户推荐其感兴趣的信息,满足用户的个性化推荐需求. 1.2 推荐系统是自动联系用 ...

  9. mac系统升级 brew 是用不了_MAC平台10款效率工具推荐

    推荐几款在MAC OS平台的效率软件,使我们的工作效率大大的提高.当然也欢迎补充在其他平台的替代品. Alfred 推荐指数:★★★★★ Alfred是macOS的一个生产力应用程序,它通过热键.关键 ...

最新文章

  1. 苹果大战FBI将加速科技圈的加密技术发展?
  2. nodejs之connect
  3. js 获取屏幕高宽_JS获取屏幕的宽高。
  4. antdesign的表单中的下拉框设置默认值BUG处理
  5. 活在贫困线之下的开源软件项目——开源的可持续性斗争
  6. 俄罗斯国家黑客TA505被指攻击金融机构
  7. springmvc 配置aop
  8. REPNZ SCANS
  9. Matlab获取线粒体序列及核苷酸初步分析
  10. ESP8266最小系统
  11. (python热门库之)PyQt5常用代码
  12. 智能家居无线方案ZIGBEE、Z-Wave、WIFI、蓝牙、红外、GPRS以及NB-IOT对比
  13. 用U盘做系统安装盘的极简方法
  14. 接口与抽象类的区别,为什么要用接口,抽象类不香吗?
  15. 2016年,网络程序设计,ustc se,SA16225161,梁昱森
  16. “互联网+”的六大商业模式
  17. QListWidget设置自定义行间距
  18. OPNET网络仿真分析-前言
  19. 轻量级模型设计/部署
  20. 解锁oracle中的scott用户,Oracle 解锁scott用户

热门文章

  1. 华为云计算基础-华为云计算套件
  2. jaca和mysql外卖系统_【项目实战】太强大了,Java外卖点餐初级系统【附源码】...
  3. python逐行读取txt写入新的txt_Python逐行读取txt文本,按符合分割词并逐行写入txt...
  4. git--分支管理:创建、合并、冲突解决
  5. Redis复制的高可用详解
  6. 使用IDEA整合spring4+spring mvc+hibernate
  7. (实际开发大数据分析系统)网络爬虫获取数据与销售数据分析系统
  8. Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程
  9. FSMC(STM32)
  10. levelDB数据库使用及实例 - 高性能nosql存储数据库