机器学习:个性化推荐之评分预测问题
2016-07-24 15:50
375 查看
前段时间参加了一次数据竞赛,做的是用户兴趣度预测。下面说说我做的时候的一些思路和想法。
首先说数据:官方给了大约700M的训练数据,数据为CSV格式,用python的pandas读入后观察数据,会发现一个行数大约为三千四百余万、列为4的Dataframe,每一行代表了一次评分记录,记录中包含的信息为uid、iid、‘score’、‘time' ,即(columns=['uid'、‘iid’、‘time’、‘score’])。
下面就可以说说我们的思路了~:我们先是使用各种平均值法(包括u_means,i_means,u_i_means方法)这种方法逼格Low,效果也不怎么样,所以这里详细说了,然后我们把用户和商品评分的方差(std)考虑了进来,以此表示评分的波动,希望可以建立一个数学模型,最终效果也不好,再然后我们使用了协同过滤算法~~,这是推荐系统里最常见的算法,不多解释了,可是我们在做的时候又遇到问题了,(稀疏性如何解决就不提了,因为我们根本就没有建立起计算相似度所需要的矩阵,原因是数据太多,用户多,商品也多,建立一个[iid_max,uid_max]的矩阵太耗内存~~,我的笔记本只有6G内存,无法存储如此大的数据),不过这个问题并不严重,毕竟我们可以分开计算物体的相似度,具体思想参考 http://data.qq.com/article?id=823,我尝试了如此做,先是借鉴了关联规则里的Aproari算法来做,可问题来了,这样太慢了,然后我选择用FP-Tree,以为会快好多,事实证明自己是在太天真,等了三小时,没有结束,我便强制停止了程序,所以协同过滤的效果会怎么样,我没有确切的知道,谁如果愿意的话可以自己找些数据做做~~,再然后我们选择了LFM算法,这是一个学习算法~~,具体如何理解可参考http://blog.csdn.net/zjxiaolu/article/details/44545885
不过对于LFM这个算法真正在用的时候依然会有问题~~,会遇到一些奇葩的问题~~,具体问题是什么,大家做的时候可能也会遇到,对此如何解决呢~~?我们想到的是在学习的过程中加入限制条件~~,这样便可以解决学习过程中的一些问题,下面贴代码:
这是LFM的代码,可以看出我的参数设置的都不多,但还是跑了16个小时~~,后来我想用biasLFM,并且把参数改改,可是想了想时间问题,放弃了~~,毕竟还得做些其他事情,不能总是让电脑跑着一个程序~~
再后来我们用DL(深度学习)也得到了不错的结果~~,不过这个还有待进一步的研究,就不在这儿写了。
最后我们进行了多模型融合。
总结一下:DeepLearning真的不错~~,LFM也不错,但有些问题需要解决,比如多人对同一物品评分对的p和q矩阵的影响问题,这都是要进一步解决的。
首先说数据:官方给了大约700M的训练数据,数据为CSV格式,用python的pandas读入后观察数据,会发现一个行数大约为三千四百余万、列为4的Dataframe,每一行代表了一次评分记录,记录中包含的信息为uid、iid、‘score’、‘time' ,即(columns=['uid'、‘iid’、‘time’、‘score’])。
下面就可以说说我们的思路了~:我们先是使用各种平均值法(包括u_means,i_means,u_i_means方法)这种方法逼格Low,效果也不怎么样,所以这里详细说了,然后我们把用户和商品评分的方差(std)考虑了进来,以此表示评分的波动,希望可以建立一个数学模型,最终效果也不好,再然后我们使用了协同过滤算法~~,这是推荐系统里最常见的算法,不多解释了,可是我们在做的时候又遇到问题了,(稀疏性如何解决就不提了,因为我们根本就没有建立起计算相似度所需要的矩阵,原因是数据太多,用户多,商品也多,建立一个[iid_max,uid_max]的矩阵太耗内存~~,我的笔记本只有6G内存,无法存储如此大的数据),不过这个问题并不严重,毕竟我们可以分开计算物体的相似度,具体思想参考 http://data.qq.com/article?id=823,我尝试了如此做,先是借鉴了关联规则里的Aproari算法来做,可问题来了,这样太慢了,然后我选择用FP-Tree,以为会快好多,事实证明自己是在太天真,等了三小时,没有结束,我便强制停止了程序,所以协同过滤的效果会怎么样,我没有确切的知道,谁如果愿意的话可以自己找些数据做做~~,再然后我们选择了LFM算法,这是一个学习算法~~,具体如何理解可参考http://blog.csdn.net/zjxiaolu/article/details/44545885
不过对于LFM这个算法真正在用的时候依然会有问题~~,会遇到一些奇葩的问题~~,具体问题是什么,大家做的时候可能也会遇到,对此如何解决呢~~?我们想到的是在学习的过程中加入限制条件~~,这样便可以解决学习过程中的一些问题,下面贴代码:
import numpy as np import pandas as pd import math from numba import jit from datetime import datetime import mpmath as mp train = pd.read_csv('f:/train.csv') train = train.loc[:,['uid','iid','score']] u_max = train['uid'].max()+1 i_max = train['iid'].max()+1 u_ms = train.groupby('uid')['score'].mean() i_ms = train.groupby('iid')['score'].mean() @jit def learning_lfm(n,alpha,lambd): p = np.random.rand(u_max,5)*3 q = np.random.rand(i_max,5) for step in range(n): for i in range(len(train)): x = train.values[i] uid = x[0] iid = x[1] rui = x[2] pui = sum(p[uid]*q[iid]) eui = round(rui-pui,4) for k in range(5): p[uid][k] += alpha*(round(q[iid][k],4)*eui-lambd*round(p[uid][k],4)) q[iid][k] += alpha*(round(p[uid][k],4)*eui-lambd*round(q[iid][k],4)) if p[uid][k]> 5: p[uid][k] = 5 if p[uid][k]<-5: p[uid][k] = -5 if q[iid][k]< 0: q[iid][k]=0 if q[iid][k]>1: q[iid][k]=1 alpha = round((alpha * 0.9),4) return p,q start = datetime.now() p,q = learning_lfm(50,0.9,0.001) stop = datetime.now() print(stop-start)
这是LFM的代码,可以看出我的参数设置的都不多,但还是跑了16个小时~~,后来我想用biasLFM,并且把参数改改,可是想了想时间问题,放弃了~~,毕竟还得做些其他事情,不能总是让电脑跑着一个程序~~
再后来我们用DL(深度学习)也得到了不错的结果~~,不过这个还有待进一步的研究,就不在这儿写了。
最后我们进行了多模型融合。
总结一下:DeepLearning真的不错~~,LFM也不错,但有些问题需要解决,比如多人对同一物品评分对的p和q矩阵的影响问题,这都是要进一步解决的。
相关文章推荐
- JAVASE总结--02(注释、标识符、数据类型、源码、反码、补码、浮点数为什么那么能装、变量、类型的转换)
- java----WeekendHomework
- java中String类的方法说明
- Django中CSRF实现分析
- HDU 4135 Co-prime
- 机器学习实战 - 读书笔记(08) - 预测数值型数据:回归
- 多态性与虚函数
- form 中Enctype=multipart/form-data 的作用
- 计算几何 ( 判断线段相交 )——You can... ( HDU 1086 )
- 纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
- Web.config配置文件详解
- Scala Iterator(迭代器)
- C# ToolStrip 控件的动态生成
- 详解OkHttp
- codeforce 24D Broken robot—概率DP—conquersea博客
- Java设计模式之工厂模式
- bzoj 3573(树形DP)
- 设计模式---行为类型---备忘录
- Halocn---MvTec--Halcon机器视觉软件包几位算法研究人员相关的主页
- [C++11]并发程序模板(std::thread)