5块钱低成本阿里云大数据生态协同过滤推荐系统实战

前情提要

人工智能千千万,没法落地都白干。自从上次老司机用神经网络训练了热狗识别模型以后,群众们表示想看一波更加接地气,最好是那种能10分钟上手,一辈子受用的模型。这次,我们就通过某著名电商公司的公开数据集,在阿里云大数据生态之下快速构建一个基于协同过滤的推荐系统!

推荐系统大家都不陌生,早就已经和大家的生活息息相关。从淘宝天猫的猜你喜欢,到抖音快手的向你推荐,再到新浪微博的热点推荐,推荐系统让大家又爱又恨。可是这无数的推荐系统背后的原理到底是如何构成的?今天就让数据科学老司机带你一起在5块钱以内构建一个基于协同过滤的推荐系统,为你揭开数据的秘密。

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

常见推荐系统原理

在开始之前,我们先讲讲常见的推荐系统的原理:

  1. 基于热度的推荐系统: 最简单,但是也是最不个性化的。典型的案例就是 bilibili 的日/周/月榜
    5块钱低成本阿里云大数据生态协同过滤推荐系统实战
  2. 基于内容的推荐系统: 基于内容描述的推荐系统
    5块钱低成本阿里云大数据生态协同过滤推荐系统实战
  3. 基于协同过滤的推荐系统: 基于用户相似度的推荐系统
    5块钱低成本阿里云大数据生态协同过滤推荐系统实战

但是用户和用户之间的相似度是如何定义的呢?其实这个数值的计算方式有很多种。这一次我们选择一个相对简单易懂的计算方式: Jaccard相似系数 具体计算公式如下

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值。Jaccard 距离越大,样本相似度越低。也就是说 如果2个用户的 Jaccard 得分为越高,这两个用户越相似。反之同理。

那么原理就说到这里,然后我们就进入实战环节。整个实验的架构图如下:

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

数据集解读

这一次我们选择从 UCI 开放数据集中的 在线购买商品数据集 来作为案例。这个数据集有 2010 年 1月 12日 到 2011年 9月 12日的一家 英国的网上电商所有的交易数据。这家公司主要是出售各种各样神奇的小礼物的。我们这里可以用天池的Notebook(免费的)来做一个简单的EDA和数据清洗。大家也可以直接下载我为大家准备好的数据清洗代码和数据集 下载之后直接运行 EDA_CN.py 即可。当然也可以看一下里面的Notebook。

载入数据集之后,我们可以看到我们的数据一共有55万条记录左右。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

但是再仔细观察一些,发现空值还是很多的
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

我们可以丢弃这些空值,然后再重新导出数据集。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

导出之后,我们可以随便找一台能够链接外网的 ECS 实例,把数据上传上去。我这里个人推荐可以用 FileZilla ,免费好用。阿里云的ECS是按月付费的,我们可以先短暂购买一下,用完之后释放就可以了。一个2核8G基础的ECS实例成本平摊到每天也就 2 块钱不到,远低于我们的 5块钱的经费。

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

服务开通 - 开通 PAI 和 DW(DataWorks)

准备好数据集之后,我们就可以开始准备我们在阿里云大数据平台上的环境配置了。可以先参考这个 PAI开通流程 开通 机器学习 PAI,并且创建可视化建模服务。完成之后,我们如果登陆 PAI 工作台DataWorks控制台 应该就可以看到我们刚刚创建的工作空间了。

DW 添加数据源 + 数据集成 + 验证

确认完工作空间创建之后,我们先登陆 DataWorks控制台 来进行数据集成,把我们刚刚清洗好的数据给上传到 MaxCompute 里面。

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

进入工作空间后,我们可以参考 FTP 数据源配置 先配置一个FTP数据源。

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

创建完成之后,我们在回到控制台,进入数据开发。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

进入之后,我们可以跟着系统的引导,创建一个业务流程。比如我这里就创建了一个名为 测试 的业务流程
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

创建完毕之后,我们可以双击数据集成,然后创建一个新的数据集成任务。选择我们刚刚添加的数据源,以及对应的表。这里我们可以先通过在数据开发中运行如下的 SQL 来创建一张我们的表。

-- 创建数据源
CREATE TABLE IF NOT EXISTS  uci_e_commerce_data_clean  (

InvoiceNo       STRING COMMENT 'InvoiceNo',
StockCode       STRING COMMENT 'StockCode',
Description     STRING COMMENT 'Description',
Quantity        BIGINT COMMENT 'Quantity',
InvoiceDate     STRING COMMENT 'InvoiceDate',
UnitPrice       DOUBLE COMMENT 'UnitPrice',
CustomerID      DOUBLE COMMENT 'CustomerID',
Country         STRING COMMENT 'Country'

)
COMMENT 'UCI E-Commerce DATASET '
lifecycle 36000;

然后我们再完成我们的数据集成配置。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

选中我们刚刚创建的 uci_e_commerce_data_clean 之后,下方应该会自动出现表名匹配的界面。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

然后再拉到地步看一下通道控制,这里我们用默认的就可以了。然后我们按下左上方的运行按钮,就会看到我们任务开始运行了。等到跳出的日志显示任务完毕之后,我们可以在左侧的公共表中看一下,验证我们的数据上云是否成功。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

能看到数据就说明我们的数据已经成功的从我们的ECS里面到我们的MaxCompute环境了。接下来就是构建我们的协同过滤模型的事情了。

PAI构建模型

首先,我们登陆到我们的 PAI 工作台,进入我们刚刚创建的 PAI-Stuido 实例。进入实例之后,我们新建一个实验。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

然后打开这个实验,我们可以从左侧数据源内搜索我们刚刚迁移到MaxCompute到表名,然后将它拖入主界面。然后我们再拖入SQl组件来做好数据类型的转换。SQL内容如下:

-- 类型转换
select  
    cast(cast(customerid AS BIGINT) AS STRING) customerid,
    REPLACE(description, ' ', '-') description
from    
    ${t1} 
;    

完成类型转换之后,我们就可以拖入我们的协同过滤算法了,并为其设置好相对应的字段。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

同时我们可以吧参数也更改一下,因为保留2000个最相近的物品对我们来说计算量有些太大,而且也没必要。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

最后我们再添加一个SQL组件来把协同过滤组件计算出来的结果全部读取出来 语句为
SELECT * FROM ${t1};,看一下长什么样。整个实验的图现在应该为如下:

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

确认无误之后,我们点击开始运行实验,就可以看到我们的实验正在运行了。等实验运行完毕之后,我们可以右键点击我们的最后一个SQL组件来查看结果数据。数据结果如下:

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

图上标红的就是我们计算结果存储的表名。接下来我们就可以进行清洗这个结果数据,将它部署为一个接口服务。

生成接口服务

我们先进入Dataworks的控制台,找到我们之前用过的工作空间。进入数据开发,然后用SQL语句来创建一张关系表来存放我们之前计算出来的结果。

CREATE TABLE IF NOT EXISTS `uci_ecommerce_recommendation` (
    `origin_product_name` string,
    `match_product_name` string,
    `coefficient` double
) ;

然后我们再使用如下的sql语句,将之前计算出来的结果转存储到这个表里面。

INSERT INTO uci_ecommerce_recommendation(origin_product_name, match_product_name, coefficient)
SELECT
    foo.itemid as origin_product_name,
    split(foo.sim,':')[0] as match_product_name,
    split(foo.sim,':')[1] as coefficient
FROM (
    SELECT  
        itemid,
        sim
    FROM 
        pai_temp_82363_1078761_1 -- 这里写查看数据的时候的那个表名     
    lateral view explode(split(similarity,' ')) similarity AS sim 
) foo

运行完毕之后,我们可以通过如下语句来检查是否成功插入数据

SELECT 
    * 
FROM 
    uci_ecommerce_recommendation
ORDER BY
    coefficient DESC
LIMIT 100

运行之后应该会看到如下结果:
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

完成之后,我们就可以开始配置我们的接口服务了。整个思路是我们会传入一个物品的名称,以及最相关的多少个商品数量N。首先我们去创建一个 Lightning 数据源,来查询我们这个MaxCompute中的数据。创建Lightning的方式可以参考这个 其中Lightning的 Endpoints 列表可以参考这里

创建完毕之后,我们就可以进入数据服务
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

然后我们以脚本模式创建接口。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

创建完毕之后,我们点击左侧的API列表,进入这个服务。在选择表的时候 数据源类型选择为 Lightning,数据源名称就选择我们刚刚创建的。然后在下方的sql区域内写入

SELECT 
    match_product_name,
    coefficient
FROM 
    uci_ecommerce_recommendation
WHERE
    origin_product_name = ${origin_product_name}
ORDER BY coefficient DESC
LIMIT ${k}

然后点击右侧的请求参数,设置我们的请求参数类型。
5块钱低成本阿里云大数据生态协同过滤推荐系统实战

配置完毕后,我们点击右上角的测试,输入一个物品的名字和多少个最相关的物品数量,就可以得到结果了

5块钱低成本阿里云大数据生态协同过滤推荐系统实战

这样我们就低成本的完成了一个协同过滤系统从数据探索,集成,模型构建到接口的构建。整个流程花费还不到5块钱,有想法的同学也可以一起试试。同时也欢迎加钉钉群 23304116 和我们交流更多有关与阿里云大数据平台实战的想法。

上一篇:History of UNIX Project Build Tools


下一篇:利用PAI-DSW访问Github, 快速获取最新的学习资源