基于BigQuery ML的MovieLens数据集协同过滤推荐系统实战
概述
本文将通过Google Cloud Platform的BigQuery ML服务,使用MovieLens电影评分数据集构建一个协同过滤推荐系统。我们将完整展示从数据准备、模型训练到实际应用的全过程,帮助读者掌握基于矩阵分解的推荐系统核心技术。
数据集介绍
MovieLens数据集是由明尼苏达大学GroupLens研究实验室发布的一个经典电影评分数据集,广泛应用于推荐系统研究和开发。本教程使用的版本包含:
- 超过138,000名用户
- 近27,000部电影
- 约2,000万条评分记录
数据准备
数据集加载
首先我们需要将MovieLens数据集加载到BigQuery中。数据集包含两个主要文件:
ratings.csv
:用户对电影的评分记录movies.csv
:电影元数据信息
# 数据集下载和解压
%%bash
mkdir bqml_data
cd bqml_data
curl -O 'http://files.grouplens.org/datasets/movielens/ml-20m.zip'
unzip ml-20m.zip
# 创建BigQuery数据集
bq --location=US mk --dataset \
--description 'Movie Recommendations' \
$PROJECT:movielens
# 加载评分数据
bq --location=US load --source_format=CSV \
--autodetect movielens.ratings ratings.csv
# 加载电影数据
bq --location=US load --source_format=CSV \
--autodetect movielens.movies_raw movies.csv
数据预处理
原始电影数据中的"genres"字段是以"|"分隔的字符串,我们将其转换为数组格式以便后续分析:
CREATE OR REPLACE TABLE movielens.movies AS
SELECT * REPLACE(SPLIT(genres, "|") AS genres)
FROM movielens.movies_raw
探索性数据分析
让我们先对数据集进行初步探索:
-- 查看评分数据样例
SELECT *
FROM movielens.ratings
LIMIT 10
-- 统计用户、电影和评分总数
SELECT
COUNT(DISTINCT userId) numUsers,
COUNT(DISTINCT movieId) numMovies,
COUNT(*) totalRatings
FROM movielens.ratings
-- 查看电影数据样例
SELECT *
FROM movielens.movies
WHERE movieId < 5
矩阵分解模型构建
协同过滤的核心思想是利用用户-物品评分矩阵,通过矩阵分解技术找到用户和物品的潜在特征向量。BigQuery ML提供了内置的矩阵分解模型实现:
-- 使用预训练模型(实际项目中应自行训练)
SELECT *
FROM ML.TRAINING_INFO(MODEL `cloud-training-demos.movielens.recommender_16`)
在实际项目中,我们需要通过实验确定最佳因子数(num_factors)。本案例中,num_factors=16时评估损失最低(0.97),优于36因子(1.67)和24因子(1.45)的模型。
推荐系统应用
个性化推荐
为特定用户推荐他们可能喜欢的电影:
-- 为用户903推荐喜剧电影
SELECT * FROM
ML.PREDICT(MODEL `cloud-training-demos.movielens.recommender_16`, (
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_16`, (
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)》寻找潜在观众
SELECT * FROM
ML.PREDICT(MODEL `cloud-training-demos.movielens.recommender_16`, (
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还提供了批量预测功能,可以一次性为所有用户-电影组合生成预测:
SELECT *
FROM ML.RECOMMEND(MODEL `cloud-training-demos.movielens.recommender_16`)
LIMIT 10
总结
本文详细介绍了如何使用BigQuery ML构建基于矩阵分解的协同过滤推荐系统。关键步骤包括:
- 数据准备和预处理
- 探索性数据分析
- 矩阵分解模型训练和评估
- 个性化推荐实现
- 目标用户筛选
- 批量预测
这种基于云服务的推荐系统实现方式具有以下优势:
- 无需复杂的基础设施搭建
- 内置高效的矩阵分解算法
- 与BigQuery无缝集成,适合大规模数据
- 提供便捷的预测接口
对于希望快速构建推荐系统的开发者,BigQuery ML提供了一个高效可靠的解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考