基于BigQuery ML的ALS矩阵分解推荐系统实践
前言
推荐系统是现代互联网应用中不可或缺的核心技术之一,它通过分析用户历史行为数据,预测用户可能感兴趣的物品,为用户提供个性化推荐。本文将介绍如何利用BigQuery ML实现基于矩阵分解的协同过滤推荐系统,使用经典的MovieLens数据集进行实践。
数据集介绍
MovieLens数据集是由明尼苏达大学GroupLens研究实验室发布的电影评分数据集,广泛应用于推荐系统研究和算法验证。数据集包含:
- 用户ID(userId):唯一标识用户
- 电影ID(movieId):唯一标识电影
- 评分(rating):用户对电影的评分(1-5分)
- 电影标题(title):电影名称
- 类型(genres):电影所属类型,多个类型用"|"分隔
环境准备
在开始之前,我们需要完成以下准备工作:
- 创建BigQuery数据集用于存储MovieLens数据
- 下载并加载MovieLens数据集到BigQuery中
- 预处理数据,特别是将电影类型从字符串转换为数组格式
数据探索
首先让我们对数据进行初步探索,了解数据的基本情况:
-- 查看评分数据样例
SELECT * FROM movielens.ratings LIMIT 10;
-- 统计用户、电影和评分总数
SELECT
COUNT(DISTINCT userId) numUsers,
COUNT(DISTINCT movieId) numMovies,
COUNT(*) totalRatings
FROM movielens.ratings;
通过查询我们可以了解到数据集包含约138,000名用户,27,000部电影和超过2,000万条评分记录。
矩阵分解模型
矩阵分解(Matrix Factorization)是协同过滤推荐系统中的经典算法,它将用户-物品评分矩阵分解为两个低维矩阵:
- 用户因子矩阵:表示用户潜在特征
- 物品因子矩阵:表示物品潜在特征
在BigQuery ML中,我们可以使用以下SQL创建矩阵分解模型:
CREATE OR REPLACE MODEL movielens.recommender
OPTIONS(model_type='matrix_factorization',
user_col='userId', item_col='movieId', rating_col='rating')
AS
SELECT userId, movieId, rating
FROM movielens.ratings;
注意:矩阵分解模型的训练需要BigQuery的Flat Rate计费方式。
模型训练监控
我们可以查看模型训练过程中的损失变化情况:
SELECT iteration, loss, duration_ms
FROM ML.TRAINING_INFO(MODEL `cloud-training-demos.movielens.recommender`);
训练过程中,模型会不断迭代优化,损失值(loss)会逐渐降低,表示模型预测能力在提升。
个性化推荐
为单个用户推荐电影
假设我们要为用户ID为903的用户推荐喜剧电影:
SELECT * FROM
ML.PREDICT(MODEL `cloud-training-demos.movielens.recommender`, (
SELECT
movieId, title, 903 AS userId
FROM movielens.movies, UNNEST(genres) g
WHERE g = 'Comedy'
))
ORDER BY predicted_rating DESC
LIMIT 5;
过滤已观看电影
更合理的做法是过滤掉用户已经观看过的电影:
SELECT * FROM
ML.PREDICT(MODEL `cloud-training-demos.movielens.recommender`, (
WITH seen AS (
SELECT ARRAY_AGG(movieId) AS movies
FROM movielens.ratings
WHERE userId = 903
)
SELECT
movieId, title, 903 AS userId
FROM movielens.movies, UNNEST(genres) g, seen
WHERE g = 'Comedy' AND movieId NOT IN UNNEST(seen.movies)
))
ORDER BY predicted_rating DESC
LIMIT 5;
物品定向推荐
有时我们需要为特定电影寻找潜在的目标用户,例如为电影《American Mullet (2001)》(movieId=96481)寻找最可能喜欢的5个用户:
SELECT * FROM
ML.PREDICT(MODEL `cloud-training-demos.movielens.recommender`, (
WITH allUsers AS (
SELECT DISTINCT userId
FROM movielens.ratings
)
SELECT
96481 AS movieId,
(SELECT title FROM movielens.movies WHERE movieId=96481) title,
userId
FROM allUsers
))
ORDER BY predicted_rating DESC
LIMIT 5;
批量预测
BigQuery ML提供了ML.RECOMMEND函数,可以方便地为所有用户-物品组合生成预测:
SELECT *
FROM ML.RECOMMEND(MODEL `cloud-training-demos.movielens.recommender`)
LIMIT 10;
总结
本文介绍了如何使用BigQuery ML实现基于矩阵分解的推荐系统,主要内容包括:
- MovieLens数据集的加载和预处理
- 矩阵分解模型的创建和训练
- 个性化推荐实现
- 物品定向推荐实现
- 批量预测方法
BigQuery ML提供了简单易用的SQL接口实现机器学习模型,使得推荐系统的开发变得更加高效。通过调整模型参数和优化数据预处理,可以进一步提升推荐效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考