PredictionIO安装使用

原创 2016年08月30日 21:07:15

PredictionIO 是一个开源的机器学习服务器框架,用Scala语言开发。它提供了简单的方式使用REST API来创建推荐引擎,也提供客户端SDK,包含REST API. 客户端SDK对Java, Python, PHP都适用。PredictionIO核心使用Apache Mahout.Apache Mahout是一个可扩展的机器学习应用,提供各种聚类,分类,过滤算法,可以在分布式的Hapoop集群上运行这些算法。不过它的官方文档感觉不太友好,配置的时候走了些弯路,本文简单分享一下配置过程。

1. 安装java

过程简单,不再赘述。

2. 下载PredictionIO


$ cd

$ mkdir PredictionIO

$ cd PredictionIO

$ pwd

/Users/ruifengshan/PredictionIO

$ wget http://download.prediction.io/PredictionIO-0.9.6.tar.gz

$ tar zxvf PredictionIO-0.9.6.tar.gz

设置环境变量:


$ PATH=$PATH:/Users/ruifengshan/PredictionIO/PredictionIO-0.9.6/bin; export PATH

3. 安装依赖


$ mkdir PredictionIO-0.9.6/vendors

3.1安装spark


$ wget http://d3kbcqa49mib13.cloudfront.net/spark-1.5.1-bin-hadoop2.6.tgz 

$ tar zxvfC spark-1.5.1-bin-hadoop2.6.tgz PredictionIO-0.9.6/vendors

如果你打算将Apache Spark安装到其他位置,你必须编辑PredictionIO-0.9.6/conf/pio-env.sh文件并切改变SPARK_HOME变量,将它设置为你自己的Apache Spark安装的位置。

如果你打算使用PostgreSQL或者MySQL,你可以直接进行第4步。

4. 修改配置

修改PredictionIO-0.9.6/conf/pio-env.sh文件中的如下内容:


PIO_STORAGE_REPOSITORIES_METADATA_NAME=pio_meta

PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=PGSQL



PIO_STORAGE_REPOSITORIES_EVENTDATA_NAME=pio_event

PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=PGSQL



PIO_STORAGE_REPOSITORIES_MODELDATA_NAME=pio_model

PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=PGSQL





PIO_STORAGE_SOURCES_PGSQL_TYPE=jdbc

PIO_STORAGE_SOURCES_PGSQL_URL=jdbc:postgresql://localhost/pio

PIO_STORAGE_SOURCES_PGSQL_USERNAME=pio

PIO_STORAGE_SOURCES_PGSQL_PASSWORD=pio

改为:


PIO_STORAGE_REPOSITORIES_METADATA_NAME=pio_meta

PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=MYSQL



PIO_STORAGE_REPOSITORIES_EVENTDATA_NAME=pio_event

PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=MYSQL



PIO_STORAGE_REPOSITORIES_MODELDATA_NAME=pio_model

PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=MYSQL





PIO_STORAGE_SOURCES_MYSQL_TYPE=jdbc

PIO_STORAGE_SOURCES_MYSQL_URL=jdbc:mysql://localhost/pio

PIO_STORAGE_SOURCES_MYSQL_USERNAME=pio

PIO_STORAGE_SOURCES_MYSQL_PASSWORD=pio

需要将jdbc:mysql://localhost/pio改为你的数据库链接,用户名密码也改为你数据库的用户名密码。

4. 启动PredictionIO

4.1 启动 PredictionIO Event Server

因为我们打算使用Mysql,所以使用如下命令启动:


pio eventserver --ip 127.0.0.1 &

配置正确的话,你将会看到如下输出:


INFO] [Console$] Creating Event Server at 127.0.0.1:7070

[INFO] [HttpListener] Bound to /127.0.0.1:7070

[INFO] [EventServerActor] Bound received. EventServer is ready.

可以使用命令:pio status来检测状态。如果正常,输出如下:


[INFO] [Console$] Inspecting PredictionIO...

[INFO] [Console$] PredictionIO 0.9.6 is installed at /Users/ruifengshan/PredictionIO/PredictionIO-0.9.6

[INFO] [Console$] Inspecting Apache Spark...

[INFO] [Console$] Apache Spark is installed at /Users/ruifengshan/PredictionIO/PredictionIO-0.9.6/vendors/spark-1.5.1-bin-hadoop2.6

[INFO] [Console$] Apache Spark 1.5.1 detected (meets minimum requirement of 1.3.0)

[INFO] [Console$] Inspecting storage backend connections...

[INFO] [Storage$] Verifying Meta Data Backend (Source: MYSQL)...

[INFO] [Storage$] Verifying Model Data Backend (Source: MYSQL)...

[INFO] [Storage$] Verifying Event Data Backend (Source: MYSQL)...

[INFO] [Storage$] Test writing to Event Store (App Id 0)...

[INFO] [Console$] (sleeping 5 seconds for all messages to show up...)

[INFO] [Console$] Your system is all ready to go.

4.2 下载引擎模版

可以在http://predictionio.incubator.apache.org/gallery/template-gallery/#recommender-systems页面上找到很多引擎模版,在这里我们选择Similar Product。

可以通过如下命令来下载它:


pio template get PredictionIO/template-scala-parallel-similarproduct MySimilarProduct

输出如下:




Please enter the template's Scala package name (e.g. com.mycompany): com.shanruifeng

Author's name:         ruifeng.shan

Author's e-mail:       ruifeng.shan@test.com

Author's organization: com.shanruifeng

Would you like to be informed about new bug fixes and security updates of this template? (Y/n) n

Retrieving PredictionIO/template-scala-parallel-similarproduct

There are 8 tags

Using tag v0.3.2

Going to download https://github.com/PredictionIO/template-scala-parallel-similarproduct/archive/v0.3.2.zip

Redirecting to https://codeload.github.com/PredictionIO/template-scala-parallel-similarproduct/zip/v0.3.2

Replacing org.template.similarproduct with com.shanruifeng...

Processing MySimilarProduct/build.sbt...

Processing MySimilarProduct/engine.json...

Processing MySimilarProduct/src/main/scala/ALSAlgorithm.scala...

Processing MySimilarProduct/src/main/scala/CooccurrenceAlgorithm.scala...

Processing MySimilarProduct/src/main/scala/DataSource.scala...

Processing MySimilarProduct/src/main/scala/Engine.scala...

Processing MySimilarProduct/src/main/scala/Preparator.scala...

Processing MySimilarProduct/src/main/scala/Serving.scala...

Processing MySimilarProduct/src/test/scala/CooccurenceAlgorithmTest.scala...

Processing MySimilarProduct/src/test/scala/EngineTestSparkContext.scala...

Engine template PredictionIO/template-scala-parallel-similarproduct is now ready at MySimilarProduct

4.3 生成App ID和访问的Key

假定我们的应用名是Exp1,使用如下命令来生成App ID和访问的Key:


pio app new Exp1

输出如下:


[INFO] [App$] Initialized Event Store for this app ID: 1.

[INFO] [App$] Created new app:

[INFO] [App$]       Name: Exp1

[INFO] [App$]         ID: 1

[INFO] [App$] Access Key: Dh7qyRN9xrb5uIouqcf6y8d3lKuNmx6giUUKVYiLW4ZZ5cZsIYnPg3r404BqQ8nV

4.4 收集数据

新建一个maven工程,引入如下依赖:


<dependency>
   <groupId>io.prediction</groupId>
   <artifactId>client</artifactId>
   <version>0.9.5</version>
</dependency>

然后使用如下示例代码来收集数据:


import com.google.common.collect.ImmutableList;

import com.google.common.collect.Lists;

import io.prediction.Event;

import io.prediction.EventClient;

import java.io.IOException;

import java.util.List;

import java.util.Random;

import java.util.concurrent.ExecutionException;



/**

 * @author ruifeng.shan

 * @date 2016-08-30

 * @time 16:07

 */

public class BlogDataDao {

    private static final String API_KEY = "Dh7qyRN9xrb5uIouqcf6y8d3lKuNmx6giUUKVYiLW4ZZ5cZsIYnPg3r404BqQ8nV";



    private EventClient eventClient;



    public BlogDataDao() {

        this.eventClient = new EventClient(API_KEY);

    }



    public BlogDataDao(String accessKey) {

        this.eventClient = new EventClient(accessKey);

    }



    public void addEvents() throws InterruptedException, ExecutionException, IOException {

        addUserEvents();

        addItemEvents();

        addViewEvents();

        eventClient.close();

    }



    public void addUserEvents() throws InterruptedException, ExecutionException, IOException {

        for (int i = 0; i < 100; i++) {

            List<Event> events = Lists.newArrayList();

            events.add(new Event().entityId("user"+ i).entityType("user").event("$set"));

            List<String> result = eventClient.createEvents(events);

            System.out.println(result);

        }

    }



    public void addItemEvents() throws InterruptedException, ExecutionException, IOException {

        List<Event> events = Lists.newArrayList();

        events.add(new Event().entityId("item1").entityType("item").event("$set").property("categories", ImmutableList.of("machine-learning")));

        events.add(new Event().entityId("item2").entityType("item").event("$set").property("categories", ImmutableList.of("javascript")));

        events.add(new Event().entityId("item3").entityType("item").event("$set").property("categories", ImmutableList.of("scala")));

        events.add(new Event().entityId("item4").entityType("item").event("$set").property("categories", ImmutableList.of("artificial-intelligence")));

        events.add(new Event().entityId("item5").entityType("item").event("$set").property("categories", ImmutableList.of("statistics")));

        events.add(new Event().entityId("item6").entityType("item").event("$set").property("categories", ImmutableList.of("python")));

        events.add(new Event().entityId("item7").entityType("item").event("$set").property("categories", ImmutableList.of("web-development")));

        events.add(new Event().entityId("item8").entityType("item").event("$set").property("categories", ImmutableList.of("security")));

        events.add(new Event().entityId("item9").entityType("item").event("$set").property("categories", ImmutableList.of("ruby")));

        events.add(new Event().entityId("item10").entityType("item").event("$set").property("categories", ImmutableList.of("openshift")));



        List<String> result = eventClient.createEvents(events);

        System.out.println(result);

    }



    public void addViewEvents() throws InterruptedException, ExecutionException, IOException {

        for (int i = 0; i < 100; i++) {

            List<Event> events = Lists.newArrayList();

            events.add(new Event().entityId("user"+ i).entityType("user").event("view").targetEntityType("item").targetEntityId("item1"));

            events.add(new Event().entityId("user"+ i).entityType("user").event("view").targetEntityType("item").targetEntityId("item4"));

            Random random = new Random();

            int id = random.nextInt(9) + 1;

            events.add(new Event().entityId("user" + i).entityType("user").event("view").targetEntityType("item").targetEntityId("item" + id));



            List<String> result = eventClient.createEvents(events);

            System.out.println(result);

        }



    }



    public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {

        BlogDataDao itemDataDao = new BlogDataDao();

        itemDataDao.addEvents();

    }

}

4.5 训练数据

现在,我们就可以去使用我们配置的引擎来训练数据了。首先进入之前下载的引擎模版目录


cd MySimilarProduct

然后编辑engine.json文件,将appName的值改为我们的应用名Exp1


...  

"datasource": {    

             "params" : {      

                    "appName": "Exp1"    

            }

},  

...

然后执行构建命令:


pio build

可以在该命令后加上--verbose来输出更多详细执行日志。

成功后,输出类似如下的信息:


[INFO] [Console$] Your engine is ready for training.

然后训练模型:


pio train

成功后,输出类似如下信息:


[INFO] [CoreWorkflow$] Training completed successfully.

4.6 部署引擎


pio deploy

成功后,输出类似如下信息:


[INFO] [HttpListener] Bound to /0.0.0.0:8000 
[INFO] [MasterActor] Bind successful. Ready to serve.

可以访问http://localhost:8000来查看部署的状态。

注意如果遇到异常:Cannot support TLS_RSA_WITH_AES_256_CBC_SHA with currently installed providers,那么可以参考https://github.com/apache/incubator-predictionio/issues/221 来解决。

如果还无法打开,则使用https://localhost:8000即可。

打开后大概是下面这个样子:
这里写图片描述

4.7 使用引擎


import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.gson.JsonObject;
import io.prediction.EngineClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

/**
* @author ruifeng.shan
* @date 2016-08-30
* @time 18:59
*/
public class EngineTest {
   public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
       EngineClient engineClient = new EngineClient("https://localhost:8000");

       JsonObject response = engineClient.sendQuery(ImmutableMap.<String, Object>of(
               "items", ImmutableList.of("item1"),
               "num",  4
       ));
       System.out.println(response);
       engineClient.close();
   }
}

输出结果如下:


{"itemScores":[{"item":"item4","score":0.9999999486704595},{"item":"item8","score":0.273179592470303},{"item":"item3","score":0.18825708554025072},{"item":"item9","score":0.12653278519243383}]}

因为我们的测试数据中,用户都同时看了item1和item4,所以,这两者相似性最高,接近1。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Day 4:PredictionIO——如何创建一个博客推荐器

今天是“30天学习30种新技术”的第4天。到目前为止我很享受,而且周围开发者反响也很不错。我现在更有动力在30天内完成它了。在这篇文章中,我将介绍如何在Java下使用PredictionIO来简单地构...

linux下如何在终端上运行和安装可执行文件

linux下可执行文件,如果是在/bin、/sbin、/usr/bin或者/usr/sbin 里头,就直接敲文件名就可以运行.(注意环境变量PATH是否包含了路径) 如果是在其他文件夹里,比如说运行...

JDK8 十大新特性详解

本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口...

螺旋矩阵算法java实现

class TT { public static void main(String[] args) { int m = 5;/*行*/ int n = 6;/*列*/ in...

安装PredictionIO-0.9.1

1.PredictionIO简介 Prediction IO是从500 Satrtups毕业的一家初创公司,也是上一期颇为热门的一家公司。在Demo Day现场,他们的CEO兼创始人Simo...

predictionio部署

predictionio部署安装。predictionio由两部分组成:eventserver和predictionserver,eventserver负责数据源的收集,predictionserve...

predictionIO构建简单的博问推荐系统

PredictionIO是什么? PredictionIO是一个用Scala编写的开源机器学习服务器应用,可以帮助你方便地使用REST API搭建推荐引擎。它同时也提供了客户端SDK,封装了RE...

基于PredictionIO的推荐引擎打造,及大规模多标签分类探索

 基于PredictionIO的推荐引擎打造,及大规模多标签分类探索       摘要:在2015年3月21日的北京Spark Meetup第六次活动上,尹绪森就如何使用Pre...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)