【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

如何在 Python 中使用 LightFM 构建可扩展的电子商务推荐系统?

  • 2018-12-12
  • 本文字数:5154 字

    阅读完需:约 17 分钟

如何在Python中使用LightFM构建可扩展的电子商务推荐系统?

AI 前线导读:在我国,电商非常发达。今年双 11 的成交额仅仅过了 12 小时就达到了惊人的 1491.6 亿元!电商在我国的火爆程度由此可见一斑。不知你们有没有发现,在网店浏览商品时,它们好像能读懂你的内心,推荐的几乎都是你想找的宝贝?其实,这背后的功臣就是人工智能的应用之一——推荐系统。今天,我们分享了一篇在 Python 中使用 LightFM 构建可扩展的电子商务推荐系统的文章,以飨读者。


更多干货内容请关注微信公众号“AI 前线”(ID:ai-front)


在过去的几年里,网购的形式发生了翻天覆地的变化。像 Amazon 这样的网店,以更为个性化的方式来接待客户。这些网店根据客户的网购活动(如查看商品、往购物车里添加商品以及最终下单的商品等)来了解客户对某些商品的兴趣。例如,你在 Amazon 上搜索某件商品,然后点击其中一些搜索结果。当你下一次再次登陆 Amazon 时,会看到页面上有一块特定部分:“与您浏览过的商品相关的推荐”,里面罗列的是根据你上次搜索内容为你推荐的类似商品。但故事并未就此结束,随着你与网店进行更多的交互,你将会得到更多的个性化建议,包括 “购买此商品的顾客也同时购买……”,并向你显示经常一起购买的商品列表。另外,一些商店还会发送促销电邮,提供针对客户更有可能购买的商品清单。


推荐系统是机器学习最常用的应用之一。由于本文的目标是专注于如何使用 LightFM 包来构建推荐系统,并提供明确的指标来衡量模型性能,因此,我将只会简单提一下不同类型的推荐系统。要了解有关推荐系统的更多详情,我推荐观看 Siraj Raval 制作的这部短片, 并阅读 Chhavi Aluja 撰写的这篇文章《Recommendation Systems made simple!》


00:00 / 00:00
    1.0x
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    网页全屏
    全屏
    00:00


    推荐系统有三种类型如下:


    • Content-Based(基于内容的推荐);

    • Collaborative Filtering(协同过滤,CF)(Item-Based、User-Based、Model-Based)

    • 混合方法(整合基于内容的推荐和协同过滤)


    我最初的目标是构建一个混合模型,因为它可以将基于内容的推荐整合到协同过滤中,并能够通过纯协同过滤推荐系统来解决冷启动问题。然而,有着公开可用的良好数据集,且同时具有商品或用户的元数据和评级交互,并不是很多。因此,我决定先研究协作过滤模型并理解推荐系统的不同方面,在下一篇文章中,我将会构建一个混合模型。


    AI 前线注:所谓冷启动问题,就是在对用户一无所知的情况下,如何进行最有效的推荐。

    实现方法

    为什么选择 LightFM?

    我在研究推荐系统时,我无意碰到了许多相关的重大项目,然而,这些项目都缺少一个用于评估模型性能的明确指标。我认为,如果你无法通过提供的明确指标来评估模型的性能,那么你可能很难让人相信这个推荐系统模型运行良好。因此,我选择 LightFM 的原因是,它提供了明确的指标,可以用于评估训练模型的性能的 AUC 得分、Precision@K 等。如果想构建更好的模型并实现更高的正确率(accuracy),这可能非常有用。


    根据用例或我们要解决的问题类型,究竟是选择 Precision@K 还是 AUC 分数,这可能是个棘手的问题。在这种情况下,我们将使用 AUC 分数,因为它能够测量综合排名质量,并能够被解释为随机选择的正向条目排名高于随机的负向条目的概率。


    根据 LightFM 的文档可知,“LightFM 是针对隐式和显式反馈的许多流行的推荐算法的 Python 实现,包括 BPR 和 WARP 排名损失的有效实现。它具备易用、快速(通过多线程模型估计)的特点,能够产生高质量的结果。”


    AI 前线注:LightFM 官方文档网址为:http://lyst.github.io/lightfm/docs/home.html

    数据

    对于这个项目,我们将使用 Book-Crossing 数据集 来实现基于矩阵分解(Matrix Factorization) 方法的纯协同过滤模型。我们将利用 Chhavi Aluja 在博文《My Journey to building Book Recommendation System…》 中提到的方法,进行数据清洗,并为数据集进行预处理。让我们来看一下数据:







    以上代码块的用途是常规数据清洗,以确保在将数据用于模型中的输入之前,数据格式是正确的。此外,我们还需要确保评级数据帧中的所有行都代表了来自用户和图书数据帧的数据。接下来,评级必须只包括有效的评级分数(1-10),因此我们应该去掉所有评级值为零的所有行。



    这是评级值的分布:



    要完成数据预处理的最后一件事就是,为已评级图书的用户数量和用户评分的图书数量指定一个阈值。换言之,我们必须有用户和图书的最低评级计算数量。我认为,只有至少为 20 本图书评级的用户和至少被 20 位用户评级的图书,这样感觉就会很好。



    ratings_explicit.shape

    (217729, 3)

    训练模型

    在此步骤中,我们将训练模型,但问题有所不同。在协同过滤模型中,我们寻找基于 user-item 交互的每个商品(图书)的潜在特征,并寻找每个用户对每个潜在特征发现的相关性。这一过程是通过矩阵分解来完成的。首先我们需要将数据 (ratings_explict) 分成训练集和测试集。这正是使事情变得棘手的地方。 很明显,纯协同过滤方法并不能解决冷启动问题。因此,必须完成拆分训练集和测试集,这样,测试集中的用户或图书的实例就能在训练集中有剩余的实例:



    函数 informed_train_test() 返回训练集和测试集的 coo 矩阵,以及原始训练数据帧,以便稍后评估模型。让我们看看如何如何配合模型来评估其性能:



    — Run time: 4.7663776795069377 mins —Train AUC Score: 0.9801499843597412Test AUC Score: 0.853681743144989


    正如预期那样,训练集的 AUC 分数接近 1,我们的测试集中 AUC 得分为 0.853,情况不算太差。使用随机搜索来调整用于训练 LightFM 模型的参数。由于 GridSearch 的运行成本太高,因此我决定在 scikit-optimize 包中使用函数 forest_minimize() 来调整参数。有关调整参数的函数更多详情,请参阅本文的 GitHub 页面。


    我清楚,我之前提到的纯协同过滤,对向没有与网店进行任何交互的新用户推荐商品(冷启动问题)的预期效果不佳。在 LightFM 文档中提供的示例中,他们还表明,使用电影数据集向新客户推荐影片的纯协同方法并不能得到令人满意的结果。但是,出于好奇,我还是自己想测试一下 book-crossing 数据集。令人惊讶的是,测试结果显示数据集对冷启动问题反应良好,AUC 分数相对较高!在这种情况下训练模型,唯一的区别是,我们随机将数据集分成训练集和测试集。这意味着在训练集和测试集中具有共同的 user-item 交互的概率完全是随机的:



    现在,我们来看一看随机训练 - 测试分组中 AUC 分数的差异:



    — Run time: 8.281255984306336 mins —Train AUC Score: 0.9871253967285156Test AUC Score: 0.6499683856964111


    对于随机拆分数据,预计可以得到 0.5 左右的 AUC 分数,但我们可以看到,因为我们的 AUC 分数为 0.649,相比通过掷硬币来向新用户推荐商品或想当前用户推荐新商品,我们的表现则要好得多。我将此行为的进一步分析留给本文读者来做。

    应用

    让我们假设,售出数据集中的图书是我们正销售的商品,数据集中的用户实际上是预期的客户。为了更接近电子商务网店的实际情况,我们可以做的一件事是改变评级值,将其值的范围从(1-10)缩小到(7-10)。客户的互动行为可归纳为:


    A - 浏览商品;B - 点击商品;C - 将商品加到购物车中;D - 下单购买商品。


    因此,在这种情况下,通过将评级值降低到前 4 个评级(7,8,9,10),我们就可以对上述 item-customer 互动进行更为逼真的模拟。


    推荐系统有三种主要方案可用于电子商务应用。 限于篇幅,在本文中,我不提供为下一节中提供结果的函数的实际代码,你可以在 GitHub repo 中的 Jupyter notebook 中看到:https://github.com/nxs5899/Recommender-System-LightFM


    • 最常见的情景是根据客户的交易(如浏览和点击商品)向特定客户提供的典型建议:



    User-Item 交互矩阵


    user_dikt, item_dikt = user_item_dikts(user_item_matrix, books)
    similar_recommendation(model, user_item_matrix, 254, user_dikt, item_dikt,threshold = 7)
    Items that were liked (selected) by the User: 1- The Devil You Know 2- Harlequin Valentine 3- Shout!: The Beatles in Their Generation 4- Sandman: The Dream Hunters 5- Dream Country (Sandman, Book 3) 6- Assata: An Autobiography (Lawrence Hill & amp; Co.) 7- The Golden Compass (His Dark Materials, Book 1) 8- The Fellowship of the Ring (The Lord of the Rings, Part 1) 9- The Hobbit: or There and Back Again 10- Harry Potter and the Sorcerer's Stone (Book 1) 11- Something Wicked This Way Comes 12- Martian Chronicles 13- Animal Farm 14- 1984 15- The Dark Half 16- Harry Potter and the Goblet of Fire (Book 4) 17- Harry Potter and the Prisoner of Azkaban (Book 3) 18- Harry Potter and the Prisoner of Azkaban (Book 3) 19- Harry Potter and the Chamber of Secrets (Book 2) 20- Harry Potter and the Chamber of Secrets (Book 2) 21- The Bonesetter's Daughter 22- The Wolves in the Walls 23- Stardust 24- Martian Chronicles 25- American Gods: A Novel
    Recommended Items: 1- The Lovely Bones: A Novel 2- Harry Potter and the Order of the Phoenix (Book 5) 3- The Catcher in the Rye 4- The Da Vinci Code 5- Harry Potter and the Sorcerer's Stone (Harry Potter (Paperback)) 6- Red Dragon 7- Interview with the Vampire 8- Divine Secrets of the Ya-Ya Sisterhood: A Novel 9- Sphere 10- The Pelican Brief 11- Little Altars Everywhere: A Novel 12- To Kill a Mockingbird 13- Coraline 14- The Queen of the Damned (Vampire Chronicles (Paperback)) 15- The Hours: A Novel

    复制代码


    我们根据类似的 user-item 交互,向 ID 号为 254 的用户推荐了 15 个商品(图书)。


    • 第二种最常见的情景是,当你计划告知客户有关向上销售和交叉销售的选项时。具体的例子是:“购买此商品的顾客也同时购买……”、“浏览过此商品的顾客也浏览过……” 为完成这一任务,我不得不将用户和图书评级的阈值从 20 提高到 200,这样我就可以获得更小的评级数据帧。查找相似商品需要为数据集中的所有商品创建 item embedding,它可能会占用很多内存。我尝试过运行几次,但都遇到了 LowMemory 错误。因此如果你电脑有足够的内存,那么你可以试试它较低的阈值:


    item_embedings = item_emdedding_distance_matrix(model,user_item_matrix) also_bought_recommendation(item_embedings,'B0000T6KHI' ,item_dikt)
    Item of interest :Three Fates (ISBN: B0000T6KHI) Items that are frequently bought together: 1- Surrender to Love (Avon Historical Romance) 2- Landower Legacy 3- Ranch Wife 4- Sara's Song
    复制代码


    AI 前线注:向上销售 是指根据既有客户过去的消费喜好,提供更高价值的产品或服务,刺激客户做更多的消费。如向客户销售某一特定产品或服务的升级品、附加品、或者其他用以加强其原有功能或者用途的产品或服务,向上销售也称为增量销售。这里的特定产品或者服务必须具有可延展性,追加的销售标的与原产品或者服务相关甚至相同,有补充、加强或者升级的作用。所谓 交叉销售,就是发现现有客户的多种需求,并通过满足其需求而实现销售多种相关的服务或产品的营销方式。促成交叉销售的各种策略和方法即 “交叉营销”。简单地理解是,说服现有的顾客去购买另一种产品,也是根据客人的多种需求,在满足其需求的基础上实现销售多种相关的服务或产品的营销方式。


    • 推荐系统的第三个情景是,当你有一家网店,并决定通过向更有可能购买该商品的特定用户推荐来投放促销广告时,它可以帮助改善客户的体验,并增加销售量:


    users_for_item(model, user_item_matrix, '0195153448', 10)[98391, 5499, 136735, 156214, 96473, 83443, 67775, 28666, 115929, 42323]
    复制代码


    我们推荐的 10 个用户(ID),他们更有可能对 ISBN 编号为 0195153448 的图书感兴趣。下一步可能就是向这些用户发送促销电邮,看看他们是否对提到的商品感兴趣。

    结语

    值得注意的是,一般来说,协同过滤方法需要足够的数据(user-item 交互)才能获得良好的结果。


    本文提到的该项目的 GitHub repo 的链接如下:


    https://github.com/nxs5899/Recommender-System-LightFM


    参考资料:


    https://github.com/aayushmnit/cookbook/blob/master/recsys.py


    https://towardsdatascience.com/my-journey-to-building-book-recommendation-system-5ec959c41847


    https://towardsdatascience.com/challenges-solutions-for-production-recommendation-systems-d656024bbdca


    原文链接:


    https://towardsdatascience.com/if-you-cant-measure-it-you-can-t-improve-it-5c059014faad

    会议推荐:

    AICon


    2018-12-12 07:002556
    用户头像

    发布了 370 篇内容, 共 171.5 次阅读, 收获喜欢 940 次。

    关注

    评论 1 条评论

    发布
    暂无评论
    发现更多内容

    PoseiSwap IDO在Bounce上启动在即,如何参与?

    西柚子

    WorkPlus AI助理 | 将企业业务场景与ChatGPT结合

    WorkPlus

    企业研发效能度量利器,华为云发布CodeArts Board看板服务

    华为云开发者联盟

    云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

    混沌演练实践(二)-支付加挂链路演练 | 京东云技术团队

    京东科技开发者

    微服务 混沌工程 混沌工程实践 企业号 5 月 PK 榜

    直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码

    做梦都在改BUG

    Java 并发编程 多线程 jdk源码

    Scrum的三个工件(产品Backlog、Sprint Backlog、产品增量 )

    顿顿顿

    Scrum 敏捷 敏捷开发管理 敏捷开发管理工具

    全新一代小度智能屏X9焕新上市 正式开启预售

    Geek_2d6073

    1.5万字+30张图盘点程序员面试必会MySQL索引常见的11个知识点

    Java你猿哥

    Java MySQL 数据 ssm 索引

    常用的表格检测识别方法——表格结构识别方法(上)

    合合技术团队

    人工智能 深度学习 算法 人工智能文字识别 表格检测

    龙博机电:90后“厂二代”,靠伙伴云零代码让中小制造业实现数字化“逆袭”

    联营汇聚

    SpringBoot + Docker 实现一次构建到处运行

    Java你猿哥

    Java Docker Spring Boot ssm 容器化部署

    阿里巴巴亿级并发系统设计手册已开源(2023 最新版)震撼来袭

    架构师之道

    Java 高并发

    2023最新版Java面试八股文大全(附各大厂面试真题及答案)

    采菊东篱下

    java面试

    ps vs top:CPU占用率统计的两种不同方式

    极限实验室

    Linux 运维 监控系统 INFINI Console

    以敏捷性为目标,构建良好企业生态

    智达方通

    数据驱动 数据孤岛 智达方通 全面预算管理 数据分析系统

    PoseiSwap IDO在Bounce上启动在即,如何参与?

    鳄鱼视界

    红旗软件正式发布龙蜥社区版国产高可靠操作系统

    OpenAnolis小助手

    Linux 开源 龙蜥社区 红旗软件 社区版操作系统

    浅谈财务共享未来发展趋势

    用友BIP

    业财融合 财务共享

    深度学习基础入门篇-序列模型:[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解

    汀丶人工智能

    人工智能 深度学习 RNN LSTM GRU

    最高奖金100万!第二届广州·琶洲算法大赛火热报名中

    飞桨PaddlePaddle

    百度飞桨 算法大赛

    云图说丨初识商标注册服务

    华为云开发者联盟

    云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

    3天速成!阿里人私用的Netty速成实战手册,3天Github星标11.5k

    Java你猿哥

    Java 源码 Netty ssm netty内存管理

    深度学习进阶篇-预训练模型[1]:预训练分词Subword、ELMo、Transformer模型原理;结构;技巧以及应用详解

    汀丶人工智能

    人工智能 深度学习 预训练模型 Transformer ELMo

    Elasticsearch与Clickhouse数据存储对比 | 京东云技术团队

    京东科技开发者

    数据库 elasticsearch Clickhouse 企业号 5 月 PK 榜

    Flutter三棵树系列之详解各种Key | 京东云技术团队

    京东科技开发者

    flutter key 企业号 5 月 PK 榜 localkey

    2023年,Flutter3.10版本的变化有哪些?

    没有用户名丶

    小程序容器

    内部开发者平台|自建还是购买,企业应如何选择?

    SEAL安全

    平台工程 企业号 5 月 PK 榜 内部开发平台

    CloudQuery v2.0.0 发布 新增数据保护、数据变更、连接管理等功能

    BinTools图尔兹

    数据库 国产数据库 版本发布

    基于 Log 的通用增量 Checkpoint 在美团的进展

    Apache Flink

    大数据 flink 实时计算

    有哪些好用的企业即时通讯软件值得推荐?

    WorkPlus

    胜面试官半子!阿里SpringBoot全栈笔记首发,源码实战齐飞

    做梦都在改BUG

    Java spring 微服务 Spring Boot 框架

    如何在Python中使用LightFM构建可扩展的电子商务推荐系统?_语言 & 开发_Nasir Safdari_InfoQ精选文章