基于BigQuery ML的MovieLens数据集协同过滤推荐系统实战

基于BigQuery ML的MovieLens数据集协同过滤推荐系统实战

training-data-analyst Labs and demos for courses for GCP Training (http://cloud.google.com/training). training-data-analyst 项目地址: https://gitcode.com/gh_mirrors/tr/training-data-analyst

概述

本文将通过Google Cloud Platform的BigQuery ML服务,使用MovieLens电影评分数据集构建一个协同过滤推荐系统。我们将完整展示从数据准备、模型训练到实际应用的全过程,帮助读者掌握基于矩阵分解的推荐系统核心技术。

数据集介绍

MovieLens数据集是由明尼苏达大学GroupLens研究实验室发布的一个经典电影评分数据集,广泛应用于推荐系统研究和开发。本教程使用的版本包含:

  • 超过138,000名用户
  • 近27,000部电影
  • 约2,000万条评分记录

数据准备

数据集加载

首先我们需要将MovieLens数据集加载到BigQuery中。数据集包含两个主要文件:

  1. ratings.csv:用户对电影的评分记录
  2. 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构建基于矩阵分解的协同过滤推荐系统。关键步骤包括:

  1. 数据准备和预处理
  2. 探索性数据分析
  3. 矩阵分解模型训练和评估
  4. 个性化推荐实现
  5. 目标用户筛选
  6. 批量预测

这种基于云服务的推荐系统实现方式具有以下优势:

  • 无需复杂的基础设施搭建
  • 内置高效的矩阵分解算法
  • 与BigQuery无缝集成,适合大规模数据
  • 提供便捷的预测接口

对于希望快速构建推荐系统的开发者,BigQuery ML提供了一个高效可靠的解决方案。

training-data-analyst Labs and demos for courses for GCP Training (http://cloud.google.com/training). training-data-analyst 项目地址: https://gitcode.com/gh_mirrors/tr/training-data-analyst

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常拓季Jane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值