直接使用
请打开交替最小二乘算法解决推荐相关问题,并点击右上角 “ 在DSW中打开” 。
ALS 电影推荐
ALS (Alternating Lease Square)交替最小二乘法是一种model based的协同过滤算法, 用于对评分矩阵进行因子分解,然后预测user对item的评分。 它通过观察到的所有用户给产品的打分,来推断每个用户的喜好并向用户推荐适合的产品。 本文将介绍如何使用Alink的ALS算法在pai-dsw中进行电影推荐。
运行环境要求
1. PAI-DSW 官方镜像中默认已经安装了 PyAlink,内存要求 4G 及以上。 2. 本 Notebook 的内容可以直接运行查看,不需要准备任何其他文件。
from pyalink.alink import * useLocalEnv(2) # 设置并行度为 2
Use one of the following commands to start using PyAlink: - useLocalEnv(parallelism, flinkHome=None, config=None): run PyAlink scripts locally. - useRemoteEnv(host, port, parallelism, flinkHome=None, localIp="localhost", config=None): run PyAlink scripts on a Flink cluster. - getMLEnv(): run PyAlink scripts as PyFlink scripts, support 'flink run -py xxx.py'. Call resetEnv() to reset environment and switch to another. JVM listening on 127.0.0.1:58422
MLEnv(benv=<pyflink.dataset.execution_environment.ExecutionEnvironment object at 0x7fbb6a99dc10>, btenv=<pyflink.table.table_environment.BatchTableEnvironment object at 0x7fbb6a99df90>, senv=<pyflink.datastream.stream_execution_environment.StreamExecutionEnvironment object at 0x7fbb6a99dd10>, stenv=<pyflink.table.table_environment.StreamTableEnvironment object at 0x7fbb6a9ca210>)
扩展到更大规模的数据
在这个示例中,我们使用 useLocalEnv 在本地(也就是 DSW 的 container 内)运行 Alink 作业,使用多线程的方式模拟分布式计算。
对于更大规模的数据,可以使用 usePAIEnv 向大规模集群提交作业,详细使用可以通过 help(usePAIEnv) 查看。
准备数据
Movielens 数据来源:http://files.grouplens.org/datasets/movielens/ml-100k/
Als算法需要输入数据是三列(userId,itemId,ratings),也即用户ID,商品ID以及用户对商品的打分信息。
PATH = "http://alink-test.oss-cn-beijing.aliyuncs.com/yuhe/movielens/" RATING_FILE = "ratings.csv" PREDICT_FILE = "predict.csv" RATING_SCHEMA_STRING = "user_id long, item_id long, rating long, ts long" ratingsData = CsvSourceBatchOp() \ .setFilePath(PATH + RATING_FILE) \ .setFieldDelimiter("\t") \ .setSchemaStr(RATING_SCHEMA_STRING) predictData = CsvSourceBatchOp() \ .setFilePath(PATH + PREDICT_FILE) \ .setFieldDelimiter("\t") \ .setSchemaStr(RATING_SCHEMA_STRING) ratingsData.lazyPrint(5) BatchOperator.execute()
user_id | item_id | rating | ts | |
0 | 42 | 523 | 5 | 881107375 |
1 | 286 | 741 | 4 | 876521887 |
2 | 436 | 1058 | 4 | 887770547 |
3 | 514 | 48 | 4 | 875318114 |
4 | 621 | 584 | 5 | 874965094 |
训练 ALS 模型
算法相关文档:https://www.yuque.com/pinshu/alink_doc/alstrainbatchop
Als 算法通过对输入的三元组信息进行矩阵分解,得到每一个userId 和 itemId 对应的向量表示。
alsModel = AlsTrainBatchOp() \ .setUserCol("user_id").setItemCol("item_id") \ .setLambda(0.1).setRank(20).setNumIter(4) \ .setRateCol("label").linkFrom(ratingsData.select("(case when rating>3 then 1 else 0 end) as label,*"));
使用 ALS 模型打分
算法相关文档:https://www.yuque.com/pinshu/alink_doc/alsraterecommender
使用 Als 模型为给定的(userId,itemId)对进行打分,通常用来判断一个用户对某一个电影的喜好程度。
als = AlsRateRecommender() \ .setModelData(alsModel) \ .setItemCol("item_id") \ .setUserCol("user_id") \ .setReservedCols(["user_id", "item_id"]) \ .setRecommCol("prediction_score") als.transform(predictData).lazyPrint(10) BatchOperator.execute()
user_id | item_id | prediction_score | |
0 | 196 | 242 | 0.567872 |
1 | 186 | 302 | 0.548883 |
2 | 22 | 377 | 0.05246 |
3 | 244 | 51 | 0.544646 |
4 | 166 | 346 | 0.393879 |
5 | 298 | 474 | 0.714769 |
6 | 115 | 265 | 0.551989 |
7 | 253 | 465 | 0.556266 |
8 | 305 | 451 | 0.292035 |
9 | 6 | 86 | 0.635126 |
使用 ALS 模型为用户推荐电影
算法相关文档: https://www.yuque.com/pinshu/alink_doc/fmitemsperuserrecommender
为给定的某一个userId推荐相关的itemId list. 通常用来为某一个用户推荐他可能喜欢的若干部电影。
als = AlsItemsPerUserRecommender() \ .setModelData(alsModel) \ .setK(5) \ .setReservedCols(["item_id"]) \ .setUserCol("user_id") \ .setRecommCol("recall_list") als.transform(predictData).lazyPrint(5) BatchOperator.execute()
使用 ALS 模型为一部电影找寻相似的电影
算法相关文档: https://www.yuque.com/pinshu/alink_doc/alssimilaritemsrecommender
为给定的某一个itemId推荐相关的itemId list. 通常用来为看过某一部电影的用户推荐他可能喜欢的若干部电影。
als = AlsSimilarItemsRecommender() \ .setModelData(alsModel) \ .setK(5) \ .setReservedCols(["item_id"]) \ .setItemCol("item_id") \ .setRecommCol("recall_list") als.transform(predictData).lazyPrint(5) BatchOperator.execute()
使用 ALS 模型为用户推荐相似的用户
算法相关文档: https://www.yuque.com/pinshu/alink_doc/alssimilar
为给定的某一个 userId 推荐相关的 userId list. 通常用来为用户推荐和他兴趣相近的用户群,便于大家沟通交流。
als = AlsSimilarUsersRecommender() \ .setModelData(alsModel) \ .setK(5) \ .setReservedCols(["user_id"]) \ .setUserCol("user_id") \ .setRecommCol("recall_list") als.transform(predictData).lazyPrint(5) BatchOperator.execute()
使用 ALS 模型为电影推荐潜在的用户
算法相关文档: https://www.yuque.com/pinshu/alink_doc/alsusersperitemrecommender
为给定的某一个 itemId 推荐相关的 itemId list. 通常用来为某一部电影推荐可能的观影者,用于新电影宣传推荐。
als = AlsUsersPerItemRecommender() \ .setModelData(alsModel) \ .setK(5) \ .setReservedCols(["item_id"]) \ .setItemCol("item_id") \ .setRecommCol("recall_list") als.transform(predictData).lazyPrint(5) BatchOperator.execute()