聊聊基于Alink库的推荐系统

聊聊,基于,alink,推荐,系统 · 浏览次数 : 0

小编点评

**Alink提供一系列与推荐相关的组件,从组件使用得角度来看,主要包括以下几个部分:** **1. 数据加载器** - 提供多种数据加载器,例如 `TsvSourceBatchOp` 和 `AkSourceBatchOp`,可以加载各种格式的数据。 - 支持从多个数据源加载数据,例如 CSV、parquet 和 JSON。 **2. 模型训练器** - 提供多种模型训练器,例如 `AlsTrainBatchOp` 和 `AlsRateRecommender`,可以进行协同过滤和排名推荐。 - 模型训练器支持各种参数设置,可用于优化模型性能。 **3. 模型评估器** - 提供多种评估器,例如 `EvalRegressionBatchOp` 和 `Predictor`,可用于评估模型的性能。 - 评估器可用于衡量模型的准确性、召回率和 F1 分数等指标。 **4. 模型加载器** - 提供模型加载器,例如 `PipelineModel` 和 `Lookup`,可将模型加载到内存中。 - 允许用户自定义模型加载器。 **5. 自定义组件** - Alink允许用户创建自定义组件,以扩展模型的功能。 - 用户可以编写自己的模型或扩展现有的组件。 **示例代码:** ```python # 加载数据器 data_loader = TsvSourceBatchOp() data_loader.load_data(data_path) # 创建模型 model = AlsTrainBatchOp() model.set_model_data(data_loader.get_data()) # 训练模型 model.train() # 获取模型 model_result = model.predict(test_data) ``` **总结:** Alink 提供了一套功能丰富的推荐组件,可用于各种推荐任务,包括协同过滤、排名推荐和个性化推荐。这些组件易于使用,可用于构建高效的推荐系统。

正文

概述

Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面:

  1. 算法选择

推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。

  1. 推荐方式

输入信息可以有多种选择,输入结果也有多种情况。

  • 同时输入一个用户信息和一个物品信息,计算用户对此物品的评分。
  • 输入用户的信息,可以推荐适合此用户的相关物品,也可以计算与其相似的用户。
  • 输入物品的信息,推荐给可能喜欢该物品的用户,也可以计算与其相似的物品。
  1. 使用方法

在应用推荐引擎时,可能是在离线任务中进行批量推荐,也可能是在实时任务中对流式数据进行推荐,还可以通过使用Alink Java SDK将推荐引擎嵌入用户的应用系统。

推荐算法

基于物品的协同过滤

基于物品的协同过滤算法(Item-based Collaborative Filtering),Alink提供了相关的组件。模型训练为离线批式训练,对应组件为ItemCfTrainBatchOp,得到ItemCf模型。基于此模型可以进行多种推荐,但不是每种推荐方式使用该ItemCf算法都可以得到较好的效果。Alink只提供了适合该算法的推荐方式:评分预测(ItemCfRate)、根据用户推荐物品(ItemCfItemsPerUser)、计算相似物品(ItemCfSimilarItems)。考虑到每种推荐需要支持多种使用方式,每种方法都提供了3种组件——批式推荐(RecommBatchOp)、流式推荐(RecommStreamOp)和Pipeline节点。如下所示:
418328041.jpeg

交替最小二乘法

基本思路为交替固定用户特征向量和物品特征向量的值,每次求解一个最小二乘问题,直到满足求解条件。根据用户-物品矩阵中的值额含义是评分值还是行为次数、观看/收听时长,分别选用显示反馈算法与隐式反馈算法。两种计算方式得到ALS模型格式是一样的,后面可以选用五种推荐方式,并且每种方法都提供了3种组件——批式推荐、流式推荐、Pipeline节点。如下所示:
-1238822384.jpeg

关于最小二乘法可以参考 交替最小二乘法

Alink组件支持

Alink在推荐组件方面提供的组件是比较多的。详细说明如下
现支持的算法如下:

  • 基于物品的协同过滤(ItemCf)
  • 基于用户的协同过滤(UseCf)
  • ALS显式反馈算法(Als)
  • ALS隐式反馈算法(AlsImplicit)
  • FM算法

推荐方法如下:

  • 评分预测(Rate)
  • 根据物品推荐用户(UserPerItem)
  • 根据用户推荐物品(ItemsPerUser)
  • 计算相似物品(SimilarItems)
  • 计算相似用户(SimilarUsers)

使用方法如下:

  • 批式推荐
  • 流式推荐
  • Pipeline节点

Alink实现推荐系统

实现概览

基于物品的协同过滤推荐实现概览

static TsvSourceBatchOp getSourceRatings() {
    return new TsvSourceBatchOp()
        .setFilePath(DATA_DIR + RATING_FILE)
        .setSchemaStr(RATING_SCHEMA_STRING);
}


/**
 * 基于ItemCf算法做推荐
 * 1.基于ItemCfTrainBatchOp算子做协同过滤模型的训练,并将训练好的模型保存
 * 2.基于ItemCfItemsPerUserRecommender算子的推荐过程;包括推荐、查找物品名称、选择列并排序
 * */
static void c_5() throws Exception {

    if (!new File(DATA_DIR + ITEMCF_MODEL_FILE).exists()) {

        getSourceRatings()
            .link(
                new ItemCfTrainBatchOp()
                    .setUserCol(USER_COL)
                    .setItemCol(ITEM_COL)
                    .setRateCol(RATING_COL)
            )
            .link(
                new AkSinkBatchOp()
                    .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
            );
        BatchOperator.execute();

    }

    MemSourceBatchOp test_data = new MemSourceBatchOp(new Long[]{1L}, "user_id");

    new ItemCfItemsPerUserRecommender()
        .setUserCol(USER_COL)
        .setRecommCol(RECOMM_COL)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
        )
        .transform(test_data)
        .print();

    LocalPredictor recomm_predictor = new ItemCfItemsPerUserRecommender()
        .setUserCol(USER_COL)
        .setRecommCol(RECOMM_COL)
        .setK(20)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
        )
        .collectLocalPredictor("user_id long");

    System.out.println(recomm_predictor.getOutputSchema());

    LocalPredictor kv_predictor = new Lookup()
        .setSelectedCols(ITEM_COL)
        .setOutputCols("item_name")
        .setModelData(getSourceItems())
        .setMapKeyCols("item_id")
        .setMapValueCols("title")
        .collectLocalPredictor("item_id long");

    System.out.println(kv_predictor.getOutputSchema());

    MTable recommResult = (MTable) recomm_predictor.map(Row.of(1L)).getField(1);

    System.out.println(recommResult);


    new Lookup()
        .setSelectedCols(ITEM_COL)
        .setOutputCols("item_name")
        .setModelData(getSourceItems())
        .setMapKeyCols("item_id")
        .setMapValueCols("title")
        .transform(
            getSourceRatings().filter("user_id=1 AND rating>4")
        )
        .select("item_name")
        .orderBy("item_name", 1000)
        .lazyPrint(-1);

    LocalPredictor recomm_predictor_2 = new ItemCfItemsPerUserRecommender()
        .setUserCol(USER_COL)
        .setRecommCol(RECOMM_COL)
        .setK(20)
        .setExcludeKnown(true)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
        )
        .collectLocalPredictor("user_id long");

    recommResult = (MTable) recomm_predictor_2.map(Row.of(1L)).getField(1);

    System.out.println(recommResult);

}

ALS推荐实现概览

/**
 * 基于ALS算法做推荐
 * 1.基于AlsTrainBatchOp算子做协同过滤模型的训练,并将训练好的模型保存
 * 2.基于AlsRateRecommender算子的推荐过程;包括推荐、查找物品名称、选择列并排序
 * */
static void c_4() throws Exception {

    TsvSourceBatchOp train_set = new TsvSourceBatchOp()
        .setFilePath(DATA_DIR + RATING_TRAIN_FILE)
        .setSchemaStr(RATING_SCHEMA_STRING);

    TsvSourceBatchOp test_set = new TsvSourceBatchOp()
        .setFilePath(DATA_DIR + RATING_TEST_FILE)
        .setSchemaStr(RATING_SCHEMA_STRING);
    train_set.lazyPrint(10);

    if (!new File(DATA_DIR + ALS_MODEL_FILE).exists()) {

        train_set
            .link(
                new AlsTrainBatchOp()
                    .setUserCol(USER_COL)
                    .setItemCol(ITEM_COL)
                    .setRateCol(RATING_COL)
                    .setLambda(0.1)
                    .setRank(10)
                    .setNumIter(10)
            )
            .link(
                new AkSinkBatchOp()
                    .setFilePath(DATA_DIR + ALS_MODEL_FILE)
            );
        BatchOperator.execute();

    }

    new PipelineModel
        (
            new AlsRateRecommender()
                .setUserCol(USER_COL)
                .setItemCol(ITEM_COL)
                .setRecommCol(RECOMM_COL)
                .setModelData(
                    new AkSourceBatchOp()
                        .setFilePath(DATA_DIR + ALS_MODEL_FILE)
                ),
            new Lookup()
                .setSelectedCols(ITEM_COL)
                .setOutputCols("item_name")
                .setModelData(getSourceItems())
                .setMapKeyCols("item_id")
                .setMapValueCols("title")
        )
        .transform(
            test_set.filter("user_id=1")
        )
        .select("user_id, rating, recomm, item_name")
        .orderBy("rating, recomm", 1000)
        .lazyPrint(-1);

    BatchOperator.execute();

    new AlsRateRecommender()
        .setUserCol(USER_COL)
        .setItemCol(ITEM_COL)
        .setRecommCol(RECOMM_COL)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ALS_MODEL_FILE)
        )
        .transform(test_set)
        .link(
            new EvalRegressionBatchOp()
                .setLabelCol(RATING_COL)
                .setPredictionCol(RECOMM_COL)
                .lazyPrintMetrics()
        );
    BatchOperator.execute();

}

算子函数

AlsTrainBatchOp
AlsRateRecommender

ItemCfTrainBatchOp
ItemCfItemsPerUserRecommender

与聊聊基于Alink库的推荐系统相似的内容:

聊聊基于Alink库的推荐系统

概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。 推荐方式 输入信息可以有多种选择,输入结果也有多种情况。 同时输

聊聊基于Alink库的决策树模型算法实现

示例代码及相关内容来源于《Alink权威指南(Java版)》 概述 决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。 如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。 特征分类 特征数据

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取技术,用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量,这些新变量称为主成分,它们按照方差递减的顺序排列,以保留尽可能多的原始数据信息。 主

聊聊基于Alink库的随机森林模型

概述 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,通过构建多个决策树并汇总其预测结果来完成分类或回归任务。每棵决策树的构建过程中都引入了随机性,包括数据采样和特征选择的随机性。 随机森林的基本原理可以概括如下: 随机抽样训练集:随机森林通过有放回抽

C#如何创建一个可快速重复使用的项目模板

写在前面 其实很多公司或者资深的开发都有自己快速创建项目的脚手架的,有的是魔改代码生成器实现,有的直接基于T4,RazorEngine等模板引擎打造;但无论如何,其最终目的其实就是搭建一个自定义项目模板(脚手架)。 今天我们聊聊:如何基于官方的cli donet new 命令创建自己的项目模板。 什

聊聊日志聚类算法及其应用场景

阅读《[基于 Flink ML 搭建的智能运维算法服务及应用](https://mp.weixin.qq.com/s/yhXiQtUSR4hxp9XWrkiiew "基于 Flink ML 搭建的智能运维算法服务及应用")》一文后,对其中日志聚类算法有了些思考。 ### 概述 日志聚类,简而言之是对

聊聊Transformer和GPT模型

本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。 可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。 ## 序列到序列(seq2seq) Transformer能实现的核心

聊聊我认为的分布式、集群实现关键点

基于常见的中间件(Mysql、ElasticSearch、Zookeeper、Kafka、Redis)等分布式集群设计的机制,自己总结了在在集群设计过程中需要考虑的通用问题。 ### 节点通信机制 主节点的增加、删除、通信机制。 ### 路由算法 即数据路由到哪个节点的策略机制。在集群内有多个节点,

聊聊Spring Cloud Gateway

Spring Cloud Gateway是基于Spring Boot 2.0、Spring WebFlux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能;解决了Spring Cloud Zuul的性能问题。

聊聊神经网络的基础知识

来自《深度学习入门:基于Python的理论与实现》 张量 Numpy、TensorFlow、Pytorch等框架主要是为了计算张量或是基于张量计算。 标量:0阶张量;12,4,3, 向量:一阶张量;[12,4,3] 矩阵:二阶张量;[ [12,4,3], [11,2,3] ] 多阶张量:多维数组;