前面两篇文章回顾了我们团队做天池数据比赛《CIKM 2019 EComm AI:用户行为预测》的复赛方案,现在让我们的目光回到初赛。初赛数据组织和复赛一样,只是数据量差异较大。(初赛才2G数据,复赛28G啊。。。)

所以,初赛尝试的方案更多,这次就先说明基于矩阵分解的方案。

矩阵分解为什么能做推荐系统呢,昨天机器学习爱好者群里还有同学问过这个问题,这里借用中南大学卢博士的回答:

矩阵分解问题是通过少数的矩阵观测值,恢复矩阵中的其他未知元素。而这个问题是无法直接求解的,因此提出了低秩假设,即对原问题做了松弛近似-----人对电影的评分是由少数的用户特征和少数的电影特征决定的。原问题转换为低秩近似问题,而低秩近似问题是采用交替最小二乘(ALS)来求解的。

所以,采用ALS的方法,对初赛的用户-物品交互数据集做了相关分析,并得到推荐列表。关于ALS算法,网上有太多的资料可以学习,这里就不做赘述了,我们采用的是python中implicit库实现的ALS算法,可以跑在GPU上。(注意:只是训练可以,预测就不行,很难受

from implicit.als import AlternatingLeastSquares
from implicit.approximate_als import FaissAlternatingLeastSquares
import pandas as pd
from tqdm import tqdm, trange
from scipy.sparse import coo_matrix, csr_matrix
import numpy as np
import deepdish as dd
import pickle
import os
from dask import dataframe
import pandas as pd
import gc
os.environ["MKL_NUM_THREADS"] = "1"raw_data = pd.read_csv("/data/ECommAI/round2_a/3Tuple/raw_data.csv", names=["user_index", "item_index", "ratings"])
user_id = raw_data["user_index"].values
item_id = raw_data["item_index"].values
ratings = raw_data["ratings"].values

首先是加载数据并读取文件,交互数据的格式是这样的:

《CIKM 2019 EComm AI:用户行为预测》用户历史行为

实际上会发现,这个数据格式和movielens的数据没什么区别,只是行为描述不再是评分,所以我们将行为字符串转换成评分,这里直接做的一一映射,如:

behavior_map = {"clk": 1.0 ,"collect":2.0 ,"cart" : 3.0 ,"buy" : 4.0}

这个操作实际上就是对一个列进行map操作,词典转换而已。(实际上对用户id和物品id也要做map_id的操作,毕竟要把数据放到矩阵里)

接着,我们将数据放入稀疏压缩矩阵csr_matrix中,然后调用ALS的模型训练函数fit,存储模型生成结果user和item的隐向量。

item_user_data = csr_matrix((ratings, (item_id, user_id)), shape=(max(item_id) + 1, max(user_id) + 1))
print("Done")
# initialize a model
model = AlternatingLeastSquares(factors=64, use_gpu=True, iterations=100, calculate_training_loss=True)
# train model
model.fit(item_user_data)
dd.io.save("/data/ECommAI/round1_b/user_factors.h5", model.user_factors, compression=False)
dd.io.save("/data/ECommAI/round1_b/item_factors.h5", model.item_factors, compression=False)

由于预测部分实在是太慢了,我们就把隐向量拿出来自己组织逻辑,完成推荐结果输出。

import deepdish as dd
import tensorflow as tf
import numpy as np
from tqdm import trangetf.enable_eager_execution()
user_factors = dd.io.load("/data/ECommAI/round1_b/user_factors.h5")
item_factors = dd.io.load("/data/ECommAI/round1_b/item_factors.h5")

首先加载模型训练好的用户隐向量和物品隐向量。

# recommend_result = Nonedef make_recommendation(index, scale):item_tensor = tf.convert_to_tensor(item_factors)user_tensor = tf.convert_to_tensor(user_factors[index:index + scale, :])idx0 = tf.shape(user_tensor)[0]if idx0 != 0:recommendation = tf.tensordot(user_tensor, item_tensor, axes=[1, 1])recommendation_k = tf.math.top_k(recommendation, k=50)return recommendation_k[1]else:return None

由于矩阵分解的预测阶段实际就是向量内积操作,通过tensorflow框架是可以并行化处理的,所以我们次啊用基于tensor的向量内积批量计算结果,并存储在list内。

scale = 200
recommend_result = make_recommendation(0, scale).numpy()user_count = user_factors.shape[0]
for i in trange(1, user_count // scale + 1):recommend_result = np.concatenate((recommend_result, make_recommendation(i * scale, scale).numpy()), axis=0)dd.io.save("/data/ECommAI/round1_b/ALS_recommendations.h5", recommend_result, compression=None)

最终,我们对每200个用户进行批量内积计算结果,即用户

结果进行排序,得到最终的推荐结果。

这个方案的线上评分在0.016左右,baseline的基于物品热度召回都有0.04,还是存在不少差距的。

这里有篇关于implicit库的文章可以参考:

使用python实战开发基于隐式反馈(点击,点赞,浏览,收藏,评论)的协同过滤的推荐系统(implicit库)​blog.csdn.net

numpy 矩阵 秩_大规模电商推荐数据分析-基于矩阵分解的召回相关推荐

  1. java itemcf_大规模电商推荐数据分析-基于ItemCF的召回

    这篇文章算是对这一个月以来天池比赛<CIKM 2019 EComm AI:用户行为预测>的一个总结,我们队伍第一次打这种"海量数据"的比赛,最终成绩能保留在第一页就已经 ...

  2. 利用python分析电商_某电商平台数据分析报告(1)

    某电商平台数据分析报告(1)--代码部分 1.说明:撰写代码更为精进,质量更高,将多次调用的方法和参数打包为函数,一改往日代码冗长的风格. 2.1引入第三方库: import numpy as np ...

  3. 【python】【数据分析】2022年全国大学生数据分析大赛题解-医药电商销售数据分析

    文章目录 一.前言 二.题目 三.题解 1.对店铺进行分析,一共包含多少家店铺,各店铺的销售额占比如何?给出销售额占比最高的店铺,并分析该店铺的销售情况. 2.对所有药品进行分析,一共包含多少个药品, ...

  4. 开课吧:电商产品数据分析的核心目标是什么?

    电商的本质是零售,所以在做电商产品数据分析时,始终围绕着"成交"这个核心目标.在这个过程中,会涉及到"人.货.场"三个概念. 人:指流量.用户或成员: 货:商品 ...

  5. 某电商平台数据分析报告(1)

    某电商平台数据分析报告(1)--代码部分 1.说明:撰写代码更为精进,质量更高,将多次调用的方法和参数打包为函数,一改往日代码冗长的风格. 2.1引入第三方库: import numpy as np ...

  6. 电商销售数据分析与预测(日期数据统计、按天统计、按月统计)

    本文来自<Python数据分析从入门到精通>--明日科技编著 随着电商行业的激烈竞争,电商平台推出了各种数字营销方案,付费广告也是花样繁多.那么电商投入广告后,究竟能给企业增加多少收益,对 ...

  7. 掌握电商数据的4个要点,电商平台数据分析其实很简单

    从近两年爆火的淘宝网红直播再到抖音由社交到电商的转变,不难看出电商行业迎来了又一次升级,从原来的图文时代升级到了直播时代,从原来的以"货"为中心开始转向以"人" ...

  8. 2022全国大学生数据分析大赛A题完整解题教程及代码 医药电商销售数据分析

    题目 A:医药电商销售数据分析 完整解题 随着国家政策的逐步开放,越来越多的药品可以在网络上购买, 医药电商平台蒸蒸日上,受新冠疫情的影响,线下药店购买困难,更 让医药电商进入了更多消费者的视野,各大 ...

  9. 某电商平台数据分析报告(2)

    某电商平台数据分析报告(2) 1.分析背景:某电商平台现有2016全年销售数据. 数据来源:互联网 2.分析思路:整体运营情况(GMV,实际支付总额,客单价,订单数,用户数),销售趋势(销售全年走势, ...

最新文章

  1. 并查集(disjoint set)的实现及应用
  2. (chap3 数据链路)MAC地址
  3. 使用Java查询Sql Server数据库
  4. 模仿网易新闻客户端的滚动菜单
  5. 视觉SLAM笔记(26) 状态估计问题
  6. hdfs的副本数为啥增加了_设置hdfs副本数 dfs.replication
  7. [短评] 技术研发向市场运营让步
  8. JavaScript核心语法——变量与常量
  9. 广州市车联网先导区建设总体技术规范
  10. python reportlab模块
  11. js一键批量打印_轻松用Lodop实现批量打印功能
  12. 常用搜索算法—盲目搜索和启发式搜索
  13. win、linux环境下JAVA+GDAL部署,jar包启动,相关描述,问题解决
  14. Kubernetes多节点二进制部署
  15. pg_rewind详解
  16. 荣耀android手机怎么截图,华为荣耀畅玩5C怎么截图/截屏方法教程
  17. ssm智能社区服务的设计与实现毕业设计-附源码221512
  18. ADDS:在域内或域间复制组成员
  19. 阿诺德给物体加描边_Arnold(C4DToA)阿诺德渲染教程(116):Arnold 如何抠透明通道?透明物体后期合成方案!...
  20. 综述 | 358 篇论文, 最新知识图谱KG综述

热门文章

  1. object对象进行深拷贝
  2. PHP操作Memcache基本函数的方法
  3. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
  4. [ 原创 ]学习笔记-安卓虚拟机终于达到最佳状态了
  5. 在线CSV转Excel工具
  6. linux远程复制文件命令小总结
  7. 在线URL转sitemap工具
  8. 决定薪资高低的到底什么?
  9. SDUT-2054_数据结构实验之链表九:双向链表
  10. 结对-贪吃蛇-开发过程