Oryx 推荐系统初体验 | Eric's Blog

标签: | 发表时间:2017-11-16 17:08 | 作者:
出处:https://youngfor.me

Oryx 推荐系统初体验

Summary

Oryx 的前身叫 Myrrix,后来被 Cloudera 收购改了这个名字。值得一提的是 Oryx 的维护者就是 Mahout 的主要贡献者—— Sean OwenOryx开源项目旨在提供实时的大规模机器学习/预测分析基础框架目前它实现了一列工程应用常用到的机器学习算法:协同过滤,分类/回归以及聚类。Oryx 通过Apache hadoop来实现对大规模的数据流进行建模。同时可以通过实时的REST API来对建好的模型进行查询,并且有也可以通过API将新数据输入到模型中进行训练。 oryx_logoOryx 具有以下特点:

  • Hadoop 版本跟着 CDH 升级
  • 将推荐引擎分为 Serving Layer 和 Computing Layer,隔离出 Serving Layer 让扩展变得很容易
  • 同时支持推荐、聚类、分类的机器学习
  • 数据引入了 Generation 的概念,提供了很好的增量补充数据的支持

目前Oryx release的版本是Oryx1.0,而 Oryx2.0也正在孵化当中。相较于1.0版本,Oryx2.0更好的实现了 lambda架构,使得各个层之间可复用性更强。实现了比1更多的机器学习算法(1.0只实现了,ALS协同过滤,随机森林,以及K-means++算法)同时2.0版本还引入更新的Spark和Streaming技术。

安装Oryx

Oryx 的安装需要运行环境,以及Hadoop2.3或以后的运行环境,这里我们悬着Cloudera公司的CDH5发行的hadoop版本,也是官方推荐的版本。CDH5的安装,请参见 上一篇文章。 Oryx的Server层和Computation层都是独立的Jar包 oryx-serving-x.y.z.jaroryx-computation-x.y.z.jar,只需要用 java命令单独的运行这两个Jar包即可。需要注意的是这里的两个jar包不是在 hadoop jar命令中运行,只是在长期跑的服务器程序。

跑Oryx例子stepBystep

Orxy官方的项目提供了3个机器学习的例子,分别是用协同过滤做推荐,用随机森林做分类,用K-means++做聚类。在运行这些例子之前我们先要做一下准备工作。

  1. 已经建立了CDH5 或者Hadoop2.0+的环境,如果没有请参考 这里
  2. 运行 git -clone https://github.com/cloudera/oryx.git,将项目下载到本地的机子上并用 unzip命令解压,并cd到该目录下。 这样我们就准备好了,开始跑第一个例子吧。

例1.建立一个简单的推荐系统

第一个例子采用了交替最小二乘的算法ALS (alternating least squares)是对 audioscrobbler数据库(last.fm的音乐数据)的一些样本建立推荐系统。为了建立这个系统,ALS-Modle要求的输入的原始数据格式必须是 user, item或者是 user, item, strength。每列的数据必须用 ,隔开,前两列可以是任何数据类型(数字和非数字都可以),最后一列是可选的,但必须是数字类型。 我们看一眼 audioscrobbler数据库的数据。

      1000002,"A Perfect Circle",144
1000002,"Aerosmith",314
1000002,"Metallica",329
1000002,"Counting Crows",157
1000002,"Dire Straits",125
1000002,"Free",155
1000002,"Guns N' Roses",236
1000002,"Goo Goo Dolls",119
1000002,"Michael Jackson",104
1000002,"Barenaked Ladies",115

第一列为用户ID,第二列为歌手的名字,第三列为喜爱度。 正常情况下会把数据放在hadoop下跑,我们可以通过下面的指令把下载下来的数据库存放到hdfs上:

      hadoop fs -mkdir -p /user/oryx/example/00000/inbound
hadoop fs -copyFromLocal [data file] /user/oryx/example/00000/inbound/

这里我们只在本地做一下实验,将数据拷贝到 /tmp/oryx/example:

      mkdir -p /tmp/oryx/example1/00000/inbound
cp audioscrobbler-sample.csv.gz /tmp/oryx/example/00000/inbound/

为了运行Serving层和computation层,我们必须定义一个配置文件,来告诉程序如何运行。配置文件详细的说明可以在 common/src/main/resources/reference.conf下查看。我们这的配置例子如下:

      model=${als-model}
model.instance-dir=/tmp/oryx/example1
model.local-computation=true
model.local-data=true
model.features=25
model.lambda=0.065

我们可以用 vim oryx-example1.conf新建一个配置文件将内容填入。 接着我们便可以运行计算层和服务层了。可以看到model类型为ALS-model,instance-dir,设定了存放数据的地址。

      java -Dconfig.file=oryx-example1.conf -jar computation/target/oryx-computation-1.0.1-SNAPSHOT.jar

我们可以看到程序的运行日志,看到从读取数据到不停跌代进行矩阵分解的整个过程 log接着我们运行serving层:

      sudo java -Dconfig.file=oryx-example1.conf -jar serving/target/oryx-serving-1.0.1-SNAPSHOT.jar

serving 层开启了Tomcat网络服务,并且加载了模型中的元素。日志如下: log我们还可以在浏览器中查看运行的结果,在浏览器上输入 http:\\localhost,我们便可以显示的看到所有oryx提供的API。 servinglayer包括对某一用户做推荐,物品间的相似度,用户对某个item的偏好,最受欢迎Item等等,甚至可以在原来数据的基础上添加数据再对这些数据进行推荐,非常方便。 在浏览器中输入 http:\\localhost:8080可以查看计算时候的资源消耗等等一系列属性,由于我们是在本地跑,所以上面没有数据显示。 computinglayer

至此我们的第一个实验就做完了。

例2.利用随机森林算法做分类

这里随机森林算法是机器学习中常用的算法,有关它的介绍可以看 这里。例子二对某一地区的森林覆盖类型做分类的例子。数据集采用了 UCL repository。该数据集记录了581012个样本地区的54个特征,包括海拔,坡度,到最近水域的垂直距离和水平距离,土壤类型等等。更详细的描述可以参见 covtype.info文件。 它的一条样本是这个样子的: 2596,51,3,258,0,510,221,232,148,6279,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,5 跟例子1类似,我们同意需要配置文件 orxy-example2.conf,在里面输入:

      model=${rdf-model}
model.instance-dir=/tmp/oryx/example2
model.local-computation=true
model.local-data=true
inbound.numeric-columns=[0,1,2,3,4,5,6,7,8,9]
inbound.target-column=54
inbound.column-names=["Elevation", "Aspect", "Slope", "Horizontal_Distance_To_Hydrology",
  "Vertical_Distance_To_Hydrology", "Horizontal_Distance_To_Roadways", "Hillshade_9am", "Hillshade_Noon",
  "Hillshade_3pm", "Horizontal_Distance_To_Fire_Points", "Wilderness_Area1", "Wilderness_Area2",
  "Wilderness_Area3", "Wilderness_Area4", "Soil_Type1", "Soil_Type2", "Soil_Type3", "Soil_Type4",
  "Soil_Type5", "Soil_Type6", "Soil_Type7", "Soil_Type8", "Soil_Type9", "Soil_Type10", "Soil_Type11",
  "Soil_Type12", "Soil_Type13", "Soil_Type14", "Soil_Type15", "Soil_Type16", "Soil_Type17", "Soil_Type18",
  "Soil_Type19", "Soil_Type20", "Soil_Type21", "Soil_Type22", "Soil_Type23", "Soil_Type24", "Soil_Type25",
  "Soil_Type26", "Soil_Type27", "Soil_Type28", "Soil_Type29", "Soil_Type30", "Soil_Type31", "Soil_Type32",
  "Soil_Type33", "Soil_Type34", "Soil_Type35", "Soil_Type36", "Soil_Type37", "Soil_Type38", "Soil_Type39",
  "Soil_Type40", "Cover_Type"]

这里模型选择是rdf-model,同意定义了数据的一些格式0~9为数字,label列是滴54列,以及各个列的名名称。 然后我们把下载到的文件拷贝的 /tmp/oryx/example2/00000/inbound下,按上例的方法运行serving层和computation层。只是配置文件做改变。

      java -Dconfig.file=oryx-example2.conf -jar 
computation/target/oryx-computation-1.0.1-SNAPSHOT.jar

sudo java -Dconfig.file=oryx-example2.conf -jar serving/target/oryx-serving-1.0.1-SNAPSHOT.jar

计算层的时间会比较长,需要较长时间等待。相信在集群上跑回好很多。 servingLayer我们可以在 /classify栏里手动的输入一个样本:

      2500,51,3,258,0,510,221,232,148,6279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,

进行判别,得到分类结果。

例3.使用K-means++算法聚类

oryx的聚类算法采用了 Scalable K-Means++算法。数据集使用 KDD Cup 1999的数据,kddcup.data_10_percent.gz A 10% subset. (2.1M; 75M Uncompressed)。 由于内存较小,在用-Xmx 1024m分配了1G内存后,运行过程还是出现了OutofMemoryError。所以在本地单机没法进行,serve层开放的API如下: servingLayer可以使用 /assign对新样本进行聚类。

      0,tcp,http,SF,259,14420,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0.00,0.00,0.00,0.00,1.00,0.00,0.00,11,97,1.00,0.00,0.09,0.08,0.00,0.00,0.00,0.00

总结

至此我们就初步体验了oryx这个开源的大规模机器学习框架,虽然目前oryx实现的算法比较少,但是可以看到他的lamda架构,提供Rest API,generation概念,以及对Hadoop乃至Spark的适配,必将使得它在未来推荐系统领域占领一席之地。

参考

oryx官方github build-a-scalable-recommendation-system

相关 [oryx 推荐系统 初体验] 推荐:

Oryx 推荐系统初体验 | Eric's Blog

- -
Oryx 的前身叫 Myrrix,后来被 Cloudera 收购改了这个名字. 值得一提的是 Oryx 的维护者就是 Mahout 的主要贡献者——. Sean OwenOryx开源项目旨在提供实时的大规模机器学习/预测分析基础框架目前它实现了一列工程应用常用到的机器学习算法:协同过滤,分类/回归以及聚类.

Oryx 2: Lambda architecture on Apache Spark, Apache Kafka for real-time large scale machine learning

- -

Min-Hash和推荐系统

- - xlvector - Recommender System
前几年看Google News Recommendation的那篇Paper,对里面提到的MinHash的算法基本没有注意,因为之前的习惯都是只注意论文的模型那块,至于怎么优化模型一般都只是扫一眼. 不过最近看了大量的Google Paper,发现Google在实现一个算法方面确实有很多独到之处. 其实,Min-Hash是LSH(Locality Sensitive Hash)的一种,我之前对LSH的了解仅仅限于知道它能把两个相似的东西Hash成两个汉明距离接近的2进制数.

推荐系统实战

- - 博客园_首页
推荐算法:基于特征的推荐算法. 推荐算法准确度度量公式:. 其中,R(u)表示对用户推荐的N个物品,T(u)表示用户u在测试集上喜欢的物品集合. 集合相似度度量公式(N维向量的距离度量公式):. 其中,N(u)表示用户u有过正反馈的物品集合. 其中,S(u,k)表示和用户u兴趣最接近的K个用户集合;N(i)表示对物品i有过正反馈的用户集合;w(u,v)表示用户u和用户v的兴趣相似度;r(v,i)表示用户v对物品i的兴趣.

推荐系统杂谈

- - 后端技术杂谈 | 飒然Hang
推荐系统是近些年非常火的技术,不管是电商类软件还是新闻类app,都号称有精准的推荐系统能给你推送你最感兴趣的内容. 现象级的资讯类app“今日头条”就得益于此成为了势头非常猛的一款产品. 本文就针对推荐系统讲述一些相关概念和实践经验. 首先需要明确的就是推荐系统的目标,一般来说不外乎以下几个:. 用户满意性:首当其冲的,推荐系统主要就是为了满足用户的需求,因此准确率是评判一个推荐系统好坏的最关键指标.

MapR初体验

- 呆瓜 - 淘宝数据平台与产品部官方博客 tbdata.org
MapR是MapR Technologies, Inc的一个产品,号称下一代Hadoop,使Hadoop变为一个速度更快、可靠性更高、更易于管理、使用更加方便的分布式计算服务和存储平台,同时性能也不断提高. 它将极大的扩大了Hadoop的使用范围和方式. 它包含了开源社区的许多流行的工具和功能,例如Hbase、Hive.

VSCode 初体验

- - SegmentFault 最新的文章
Microsoft 今天在其 Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 OS X,Windows 和 Linux 之上的,针对于编写现代web和云应用的跨平台编辑器. 作为编辑器控的我,得知消息后立马下载体验了一下. Windows上优秀的编辑器实在太多了, Sublime Text, EditPlus, Notepad++......还有诸如国产的 EverEdit等后起之秀.

个性化推荐系统综述

- Tony - 所有文章 - UCD大社区
上个月写过一篇产品推荐的文章,详情请见《我所了解的产品推荐》,内容很泛,多为工作心得. 本周读了几篇相关的论文,收获颇多,分享点干货. 以下内容摘自《个性化推荐系统的研究进展》,该文发表于2009年1月的《自然科学进展》专题评述,作者是刘建国、周涛、汪秉宏. 我略去了具体的算法和许多公式,重点看原理、思路和比较.

推荐系统开源工具 – SVDFeature

- Roger - Resys China
SVDFeature是我们(上海交大Apex实验室)在参加KDDCUP 2011期间开发的. 通过这个工具,我们和港科大(HKUST)的联合小组InnerPeace在KDDCUP 2011中获得Track 1第三名,并创造单模型最好成绩. 在此分享给大家,并希望和大家有更多的交流. (1)基于feature的可扩展性 —— SVDFeature实现了我们的基础模型feature-based matrix factorization.

Reculike : 开源论文推荐系统

- votis - Resys China
今天这篇博文主要总结一下reculike的系统架构. 两周前我们宣布发布了reculike的alpha版. 本着分享的原则,今天在这儿介绍一下我们的各个模块的设计方法. 我们这个项目一开始叫paperlens,这是因为我们想学习业界的前辈movielens,开发一个源代码和数据都开源的系统. 关于数据的开源,我想当用户数达到一定程度后,每个月会dump一次我们所有的数据库(密码等隐私信息除外),放到网络上供大家下载.