作者 | Craig Kerstiens

译者 | 弯月,编辑 | 王晓曼

头图 | CSDN 下载自东方IC

来源 | CSDN(ID:CSDNnews)

我非常喜欢数据。数据可以告诉你用户在干什么,还可以提供各种深刻的见解。数据应用的一个方面就是根据历史记录或用户做出的类似选择来提供建议。

其实,多年以前,我写了一个很小的应用程序,尝试根据葡萄酒的等级来推荐葡萄酒。这是一个小应用,我只分享给了几个好友,他们中有些人与我有相似的品味,而有些人则有不同的品味。

最初,我主要是为了研究如何编写推荐引擎,但如果能够顺便找到一些喜欢的新酒,那就是意外之喜了。事实证明,尽管只有少数几种葡萄酒的评分,但这款应用的推荐依然超出了我的预期。

另外,我也很喜欢 Postgres(不奇怪吧),最近我一直在想为什么我不能直接在 Postgres 中研究机器学习呢。没错,我们有 madlib,但是我想编写自己的推荐引擎。于是,我做了简单的尝试,结果发现我可以在 Postgres 中做很多事情。下面就让我来介绍一下如何在 Postgres 内快速构建一个推荐引擎。

从现有代码着手

首先,我快速浏览了 Python 推荐的一些示例引擎。为了简单起见,我想建立一款更小巧、更简洁的应用,我并不介意使用其它库。后来,我找到了一个简洁的rec-engine(https://github.com/scottfitzcodes/rec-engine-example)示例,该示例利用了 Pandas 和简单的数据模型大幅降低了构建推荐引擎的难度。

设置初始表结构 

我抽取了该示例应用程序使用的数据集,并将其转换为 SQL 进行加载:

CREATE TABLE orders (id int, product_idint);
CREATE TABLE products(id serial, nametext);INSERT INTO orders
VALUES (1,1),(1,2),(2,3),(2,10),(2,13),(3,3),(4,8),(4,9),(4,12),(5,3),(5,5),(5,7),(5,12),(6,1),(7,5),(7,13),(8,4),(9,3),(10,3),(10,13),(11,1),(11,8),(11,4),(12,8),(12,12),(13,5),(13,2),(13,7),(14,3),(14,13),(14,5),(15,3),(15,13);INSERT into products ("name")
VALUes ('Baseball Bat'), ('BaseballGlove'), ('Football'), ('Basketball Hoop'), ('Football Helmet'), ('BattingGloves'), ('Baseball'), ('Hockey Stick'), ('Ice Skates'), ('Soccer Ball'),('Goalie Mask'), ('Hockey Puck'), ('Cleats');

加载DataFrame

该 Python 示例直接从 CSV 加载了 DataFrame。但我想在 Postgres 中构建应用。通过上面一步,我将所有数据都存储在了表中,但是如今将其放入DataFrame中……我不是很想再解析成CSV格式。

解决这个问题的方法有很多种(比如创建 JSONB 对象、创建自定义类型等),但我选择了一种非常简单而且很容易实现的方法:将两个数组按照相同的方式排序,然后利用这两个数组创建DataFrame。

为此,我定义了一个函数,并导入了pandas:

CREATE OR REPLACE FUNCTIONgetrecommendations (id integer, orderids int[], orderedproducts int[],productids int[], productnames text[])
RETURNS json
AS $$import pandas as pd

注意:首先你需要在 PostgreSQL 数据库安装 plpython3u。

你可能注意到,我并没有用一个数组或一个字典传递订单而是传递了两个数组,后面的产品也是两个数组。为了将数据传递到SQL函数中,我创建了如下查询:

(SELECT ARRAY(SELECT id from ordersorder by id))

接下来,我就可以将订单数据加载到 DataFrame 了:

o = {'order_id': orderids, 'product_id':orderedproducts}
orders = pd.DataFrame(data=o)

下一组数据与嵌入到PostgreSQL函数中的Python示例(

https://github.com/scottfitzcodes/rec-engine-example/blob/master/engine.py)相同:

orders_for_product =orders[orders.product_id == id].order_id.unique();relevant_orders =orders[orders.order_id.isin(orders_for_product)]accompanying_products_by_order =relevant_orders[relevant_orders.product_id != id]
num_instance_by_accompanying_product =accompanying_products_by_order.groupby("product_id")["product_id"].count().reset_index(name="instances")num_orders_for_product =orders_for_product.size
product_instances = pd.DataFrame(num_instance_by_accompanying_product)
product_instances["frequency"]= product_instances["instances"]/num_orders_for_productrecommended_products =pd.DataFrame(product_instances.sort_values("frequency",ascending=False).head(3))

产品部分的处理与订单相同:创建字典,然后加载 DataFrame。最后,将结果集作为 JSONB 对象返回。两部分结合到一起,完整的函数如下所示:

CREATE OR REPLACE FUNCTIONgetrecommendations (id integer, orderids int[], orderedproducts int[],productids int[], productnames text[])
RETURNS json
AS $$import pandas as pdo = {'order_id': orderids, 'product_id': orderedproducts}orders = pd.DataFrame(data=o)   orders_for_product = orders[orders.product_id == id].order_id.unique();relevant_orders = orders[orders.order_id.isin(orders_for_product)]accompanying_products_by_order =relevant_orders[relevant_orders.product_id != id]num_instance_by_accompanying_product =accompanying_products_by_order.groupby("product_id")["product_id"].count().reset_index(name="instances")num_orders_for_product = orders_for_product.sizeproduct_instances = pd.DataFrame(num_instance_by_accompanying_product)product_instances["frequency"] =product_instances["instances"]/num_orders_for_productrecommended_products = pd.DataFrame(product_instances.sort_values("frequency",ascending=False).head(3))p = {'product_id': productids, 'name': productnames}products = pd.DataFrame(data=p)recommended_products = pd.merge(recommended_products, products,on="product_id")return recommended_products.to_json(orient="table")
$$ LANGUAGE 'plpython3u';

运行推荐引擎

直接在 SQL 中调用该函数,就可以获得推荐结果:

SELECT json_pretty(getrecommendations(3,(SELECT ARRAY(SELECT id from orders order by id)),(SELECT ARRAY(SELECT product_id from orders order by id)),(SELECT ARRAY(SELECT id from products order by id)),(SELECT ARRAY(SELECT name from products order by id))
));{"schema":{"fields":[{"name":"index","type":"integer"},{"name":"product_id","type":"integer"},{"name":"instances","type":"integer"},{"name":"frequency","type":"number"},{"name":"name","type":"string"}],"primaryKey":["index"],"pandas_version":"0.20.0"},"data":[{"index":0,"product_id":13,"instances":4,"frequency":0.5714285714,"name":"Cleats"},{"index":1,"product_id":5,"instances":2,"frequency":0.2857142857,"name":"FootballHelmet"},{"index":2,"product_id":7,"instances":1,"frequency":0.1428571429,"name":"Baseball"}]}

虽然这种做法可行,但我并不推荐。直接将所有应用程序逻辑嵌入数据库,会导致跟踪迁移和发布的难度加大。同时,它还需要一个复杂的流水线每晚提取数据并加载到 Spark 中,生成结果,然后将其反馈到数据库,这个工作量可不容小觑。对于 Plpython3u 和 Pandas 来说,每天使用 pg_cron 运行上述代码可能是一个更简单的解决方案。

原文链接:https://info.crunchydata.com/blog/recommendation_engine_in_postgres_with_pandas_and_python

本文为 CSDN 翻译,转载请注明来源出处。

更多精彩推荐
  • Get了!用Python制作数据预测集成工具 | 附代码

  • 用 Python 详解《英雄联盟》游戏取胜的重要因素!

  • 万字长文总结机器学习的模型评估与调参 | 附代码下载

  • “Talk is cheap, show me the code”你一行代码有多少漏洞?

  • 科普 | 定义 Eth2.0 中的验证者质量

如何使用 Python 构建推荐引擎?相关推荐

  1. 独家 | 从零开始用python搭建推荐引擎(附代码)

    作者:Pulkit Sharma 翻译:申利彬 校对:付宇帅 本文约10300字,建议阅读10分钟. 本文介绍了各种推荐引擎算法以及使用Python构建它们的基本框架. 简介 当今社会的每个人都面临着 ...

  2. 从零开始用Python搭建推荐引擎(附代码)

    作者 | Pulkit Sharma 来源 | 数据派THU(DatapiTHU) 简介 当今社会的每个人都面临着各种各样的选择.例如,如果我漫无目的想找一本书读,那么关于我如何搜索就会出现很多可能. ...

  3. 如何使用Apache的Prediction IO Machine Learning Server构建推荐引擎

    by Vaghawan Ojha 通过瓦哈万·欧哈(Vaghawan Ojha) 如何使用Apache的Prediction IO Machine Learning Server构建推荐引擎 (How ...

  4. mahout+Eclipse,使用 Taste 构建推荐引擎实例 – 电影推荐引擎

    使用 Taste 构建推荐引擎实例 – 电影推荐引擎 根据上面的步骤,我们可以得到一个简单的推荐引擎 demo 环境,下面介绍如何使用 Taste 方便地构建自定义的推荐引擎. 抽取 Taste 工具 ...

  5. 基于Spark构建推荐引擎

    基于Spark构建推荐引擎之一:基于物品的协同过滤推荐 http://blog.csdn.net/sunbow0/article/details/42737541 Spark构建推荐引擎之二:基于Sp ...

  6. Elasticsearch:Elasticsearch基础上构建推荐引擎 资料收集

    1. 深入了解推荐引擎组件(基于Apache Mahout和Elasticsearch) http://www.csdn.net/article/2015-05-14/2824676 ES+mahou ...

  7. python构建决策引擎_决策引擎与机器学习模型的集成 | 信数这么干(一)

    这是"信数这么干"之决策引擎系列专题的第1篇(该专题总计11篇,由技术篇和应用篇两大部分构成).信数这么干--决策引擎系列专题提纲 ✦ 决策引擎技术篇 -决策引擎与机器学习模型的集 ...

  8. python构建决策引擎_用Python和Keras搭建你自己的AlphaZero

    教会机器通过深度学习和自我博弈学习玩<四子连珠>游戏(Connect4). 在本文,我(作者 David Foster--译者注)会主要讲到以下三件事: AlphaZero 迈入人工智能一 ...

  9. 微博环境下利用综合策略构建推荐引擎

    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 本文内容是2012年在新浪微博的工作,是关于微群综合推荐系统的PPT,曾在QCON2013上海分享过.

最新文章

  1. Android中Intent传值
  2. echarts 点亮中国插件研究
  3. vmstat参数解释
  4. Android实现网页的放大与缩小
  5. python(1) - 输入和输出
  6. php的框架目录,Laravel 框架目录结构
  7. Makefile 自动产生依赖
  8. angluar ajax实例,Angular服务Request异步请求的实例讲解
  9. Android开发之通过Android Studio自带插件git创建分支,合并分支等
  10. SpringBoot 整合 Shiro实践
  11. 4.Unix工作环境
  12. (二)win7下用Intelij IDEA 远程调试spark standalone 集群
  13. 自动驾驶仿真:VTD自定义超声波雷达FOV
  14. 电影mysql设计_电影院数据库设计(案例)
  15. 彻底了解Cookie
  16. 职高计算机应用项目教程教案,项目教学法在中职计算机教学中的具体应用
  17. 好用的办公网优化工具OneDNS
  18. 第十章:如何制定项目目标?
  19. 如何使用传统图像处理方法进行大米的计数和长轴方向标记
  20. 5G手机开打价格战,4G手机将被加速淘汰

热门文章

  1. Nginx 学习笔记(六)引入线程池 性能提升9倍
  2. Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)
  3. NAS存储对称和非对称结构之前的区别概述
  4. tomcat中server.xml文件详解
  5. 干货:Android 源码使用心得分享
  6. iframe子页面操作父页面
  7. 算法系列15天速成——第二天 七大经典排序【中】
  8. 使用postMan测试erp系统登录接口
  9. 新能源汽车电驱系统行业深度报告
  10. 待解决--LaTex为什么其他符号可以用,插入大于等于,或者小于等于就报错?