机器学习:个性化推荐之评分预测问题

 前段时间参加了一次数据竞赛,做的是用户兴趣度预测。下面说说我做的时候的一些思路和想法。

首先说数据:官方给了大约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矩阵的影响问题,这都是要进一步解决的。

你可能感兴趣的:(机器学习)