开发者社区> YuuuZeee> 正文

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

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

前情提要

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

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

afdf23cffbf3f803015f337b287ce6b5

常见推荐系统原理

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

  1. 基于热度的推荐系统: 最简单,但是也是最不个性化的。典型的案例就是 bilibili 的日/周/月榜
    Bilibili_
  2. 基于内容的推荐系统: 基于内容描述的推荐系统
    Bilibili_
  3. 基于协同过滤的推荐系统: 基于用户相似度的推荐系统
    _

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

Jaccard

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

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

_

数据集解读

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

载入数据集之后,我们可以看到我们的数据一共有55万条记录左右。
_

但是再仔细观察一些,发现空值还是很多的
_

我们可以丢弃这些空值,然后再重新导出数据集。
_

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

_MEME

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

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

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

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

_

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

_

创建完成之后,我们在回到控制台,进入数据开发。
_

进入之后,我们可以跟着系统的引导,创建一个业务流程。比如我这里就创建了一个名为 测试 的业务流程
_

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

然后我们再完成我们的数据集成配置。
_

选中我们刚刚创建的 uci_e_commerce_data_clean 之后,下方应该会自动出现表名匹配的界面。
_

然后再拉到地步看一下通道控制,这里我们用默认的就可以了。然后我们按下左上方的运行按钮,就会看到我们任务开始运行了。等到跳出的日志显示任务完毕之后,我们可以在左侧的公共表中看一下,验证我们的数据上云是否成功。
_

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

PAI构建模型

首先,我们登陆到我们的 PAI 工作台,进入我们刚刚创建的 PAI-Stuido 实例。进入实例之后,我们新建一个实验。
_

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

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

完成类型转换之后,我们就可以拖入我们的协同过滤算法了,并为其设置好相对应的字段。
_

同时我们可以吧参数也更改一下,因为保留2000个最相近的物品对我们来说计算量有些太大,而且也没必要。
_

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

PAI_

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

SQL_

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

生成接口服务

我们先进入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

运行之后应该会看到如下结果:
_

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

创建完毕之后,我们就可以进入数据服务
_

然后我们以脚本模式创建接口。
_

创建完毕之后,我们点击左侧的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}

然后点击右侧的请求参数,设置我们的请求参数类型。
_

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

API_

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[20150513]人为破坏数据块.txt
[20150513]人为破坏数据块.txt --演示的目的,参考链接: http://www.askmaclean.com/archives/oracle-make-block-physical-corruption.
679 0
新浪明星日志推荐系统——爬虫爬取数据(2)
由于之前的改造,现在将爬虫的功能做了一些改变,具体实现的功能是将推荐的日志全部抓取下来,并存放在以文章标题命名的文件中,代码如下: import urllib import os,re import sys from bs4 import BeautifulSoup reload(sys) sys.
733 0
Kubernetes生态系统走向成熟,六家供应商获认证
本文讲的是Kubernetes生态系统走向成熟,六家供应商获认证【IT168 资讯】云原生基金会(Cloud Native Computing Foundation,简称CNCF)宣布了第一批Kubernetes认证服务提供商(KCSPs),这些供应商已经擅长帮助企业采用Kubernetes进行容器,云计算和基于SaaS的基础架构。
1464 0
基于大量数据的Excel文件生成方案
基于大量数据的Excel生成方案 以往我们在基于POI生成Excel文件时,都是利用官方提供的HSSF或XSSF对应的系列API,它们操作简便,上手比较快。但是对于大数据量的Excel文件生成往往会比较耗时,这是我们利用标准的API进行开发的一个痛点。
967 0
推荐系统入门之使用协同过滤实现商品推荐的实验报告-2
推荐系统入门之使用协同过滤实现商品推荐的实验报告-2
51 0
多可用区部署、生态支持和集群共享,金融核心系统如何实践云数据库OceanBase
8月30日~31日2016蚂蚁金服&阿里云在线金融技术峰会拉开帷幕,阿里云分布式数据库技术组专家谭宇(茂七)带来了“云数据库OceanBase架构演进及在金融核心系统中的实践”的重要演讲。主要从OceanBase的起源开始讲起,进而和大家分享了OceanBase的历程与架构演进,重点介绍了云数据库O
10372 0
+关注
YuuuZeee
一只小鱼哲
8
文章
0
问答
来源圈子
更多
相关文档: 机器学习平台PAI
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载