这篇文章算是对这一个月以来天池比赛《CIKM 2019 EComm AI:用户行为预测》的一个总结,我们队伍第一次打这种“海量数据”的比赛,最终成绩能保留在第一页就已经很满意了。
这次比赛的要求是根据用户历史行为预测未来行为,对于特定的用户, 为其推荐最多50个TA未来3天可能会点击的商品,也就是根据用户的历史交互行为、用户基本属性、物品基本属性,来预测测试集内的用户可能点击50个商品,也就是我们一般做推荐系统中,需要得到的那个推荐池。比赛用的数据集非常庞大,交互数据集有23G,大概6亿多条交互数据,用户有400多万,物品有一千多万。
刚开始处理这批数据的时候我的内心是崩溃的,一起不管在处理线上数据,还是我们私下训练各种推荐排序模型的时候,基本数据都没有到达过上亿的级别。这就意味着,可能这次比赛,召回层的作用会尤为重要。(推荐一般分为三个阶段,召回、排序和重排序,对于海量数据来说,召回意味着筛选,将物料池从百万级别降到百级别,这个工作听起来就很吓人了)同时,组委会还给了提示:
GNN这个东西以我们的软硬件实力,十有八九是用不起来了,所以,我们尝试了一下简单的思路,也就是本文的主题,ItemCF算法,而且我们没有优化它,甚至连参数都没有调整,只做了一些效率优化的工作。
我们采用pyspark完成整个数据的处理工作,首先,加载环境:
from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.ml.feature import MinHashLSH
from pyspark.ml.linalg import Vectors
import pyspark.sql.functions as psf
from pyspark.sql import SparkSession
from pyspark.sql.types import FloatType
from pyspark.sql.types import StructType
from pyspark.sql.types import StringType
from pyspark.sql.types import StructField
from pyspark.sql.types import IntegerType
import math
import argparse
import time
import os
Path = "hdfs:///ECommAI/round2/train/"
spark = SparkSession \
.builder \
.appN