是否曾经好奇过Netflix是如何了解选择并展示感兴趣的电影的?或者有没有想过亚马逊是如何根据搜索项向推荐产品的?这些技术背后的魔法被称为“推荐引擎”。本文将带了解如何使用Google Cloud Platform(GCP)构建这样一个系统。
Google BigQuery是一个无服务器、成本效益高、高度可扩展的数据仓库系统。BigQuery ML允许仅使用标准的SQL查询在BigQuery中创建和执行机器学习模型。BigQuery ML使得数据科学家、机器学习工程师和数据工程师能够直接使用SQL快速构建和分析机器学习模型。
BigQuery ML支持多种模型,包括回归模型(线性回归、二元逻辑回归、多类逻辑回归)、聚类(K-means聚类)、矩阵分解(用于创建推荐系统)、时间序列模型(用于预测)以及提升树模型(XGBoost,分类和回归)和深度神经网络(DNN,分类和回归)。
BigQuery利用其处理能力构建模型,自动调整学习率,自动将数据分割为训练和测试集,进行L1/L2正则化,以及数据分割训练/测试分割(随机、顺序、自定义),设置学习率。
登录GCP账户,导航到BigQuery,接受条款和条件,然后点击完成。有两种选项来创建和加载数据集:使用UI创建和加载数据集,或者使用简单的BigQuery命令来创建和加载数据集。本文将只展示第二种方法,因为它更受偏好。
运行以下命令创建一个名为movies的BigQuery数据集:
bq --location=EU mk --dataset movies
这里选择了一个位置并创建了一个数据集。接下来,运行以下命令以CSV格式加载数据集,也可以上传自己的数据集来构建模型,但本文将使用BigQuery提供的数据集。
bq load --source_format=CSV --location=EU --autodetect movies.movielens_ratings gs://dataeng-movielens/ratings.csv
bq load --source_format=CSV --location=EU --autodetect movies.movielens_movies_raw gs://dataeng-movielens/movies.csv
在GCP控制台运行所有命令后,应该能看到电影数据。
让快速查看一下数据集。可以看到有一个名为“movies”的文件夹,其中包含“movielens_movies”和“movielens_ratings”,暂时忽略“movielens_movies_raw”。检查“movielens_movies”数据集,有“movieId”、“title”和“genres”,这些将用于模型构建部分。
查看“movielens_ratings”数据集,其中包含“userId”、“movieId”、“rating”和时间戳。
在BigQuery查询编辑器中编写此查询并执行:
SELECT COUNT(DISTINCT userId) numUsers, COUNT(DISTINCT movieId) numMovies, COUNT(*) totalRatings FROM movies.movielens_ratings
检查评分低于3的电影:
SELECT * FROM movies.movielens_movies_raw WHERE movieId < 3
还可以利用Google Data Studio可视化评分,点击“探索数据”然后“在Data Studio上可视化”。
检查评分低于5的电影:
SELECT * FROM movies.movielens_movies_raw WHERE movieId < 5
如所见,“genres”列有一个格式化的字符串,因此让将其分割(|)并保存到新表中。
CREATE OR REPLACE TABLE movies.movielens_movies AS SELECT * REPLACE(SPLIT(genres, "|") AS genres) FROM movies.movielens_movies_raw
还可以进行其他额外的数据预处理来优化模型。
要在BigQueryML中构建推荐系统,需要传递model_type,并确定哪些列对于协同过滤是重要的。
CREATE OR REPLACE MODEL movies.movie_recommender OPTIONS (model_type='matrix_factorization', user_col='userId', item_col='movieId', rating_col='rating', l2_reg=0.2, num_factors=16) AS SELECT userId, movieId, rating FROM movies.movielens_ratings
要查看训练好的模型,运行此查询到BigQuery编辑器:
SELECT * FROM ML.EVALUATE(MODEL `path_to_your_model.movies.movie_recommender`)
让为用户ID 102找到最好的浪漫电影。
SELECT * FROM ML.PREDICT(MODEL `path_to_your_model.movie_recommender`, (SELECT movieId, title, 102 AS userId FROM `movies.movielens_movies`, UNNEST(genres) g WHERE g = "Romance")) ORDER BY predicted_rating DESC LIMIT 5
SELECT * FROM ML.PREDICT(MODEL `path_to_your_model.movie_recommender`, (SELECT movieId, title, 402 AS userId FROM `movies.movielens_movies`, UNNEST(genres) g WHERE g = "Comedy")) ORDER BY predicted_rating DESC LIMIT 5