ApachePredictionIO使用

PredictionIO初步使用

0 簡介

0.1 什麼是ApachePredictionIO®?

ApachePredictionIO®是一個開源的機器學習服務器,它建立在最新的開源堆棧之上(基於:Apache Spark,MLlib,HBase,Akka HTTP和Elasticsearch),供開發人員和數據科學家使用,以爲任何機器學習任務創建預測引擎。它可以讓您:

  • 使用可自定義的模板在生產環境中快速構建和部署引擎作爲Web服務,RestfulAPI支持;
  • 部署爲Web服務後,可以實時響應動態查詢;
  • 系統地評估和調整多種引擎變體;
  • 批量或實時統一來自多個平臺的數據,以進行全面的預測分析;
  • 通過系統的流程和預先建立的評估措施來加快機器學習建模;
  • 支持機器學習和數據處理庫,例如Spark MLLib和OpenNLP;
  • 實施您自己的機器學習模型並將其無縫整合到您的引擎中;
  • RestfulAPI支持
  • 簡化數據基礎架構管理。

0.2 PredictionIO 組件構成

三大組件

PredictionIO 由三大組件構成:

  • PredictionIO platform (PredictionIO平臺)-我們的開源機器學習堆棧,用於使用機器學習算法構建,評估和部署引擎。
  • Event Server-我們的開源機器學習分析層,部署爲Web服務後,它會偵聽您的應用程序中的查詢並實時響應預測結果。
  • Engine(引擎)-引擎負責進行預測。它包含一種或多種機器學習算法。
  • Template Gallery (官方模板庫)-您可以在此下載用於不同類型的機器學習應用程序的引擎模板

0.3 部署步驟

部署和使用引擎需要6個簡單的步驟:

  • 安裝並運行PredictionIO
  • 通過下載引擎模板創建引擎
  • 如果要將PredictionIO與新應用程序集成,請生成應用程序ID和訪問密鑰
  • 收集數據
  • 將引擎即服務部署
  • 使用引擎推薦

1 docker安裝ApachePredictionIO

1.1 官網方式

http://predictionio.apache.org/install/install-docker/

1.1.1 下載docker源文件

從v0.13.0開始,ApachePredictionIO®開始爲生產環境提供docker支持。Dockerfile和依賴項配置可以在git存儲庫的docker文件夾中找到。

首先下載項目:
git clone https://github.com/apache/predictionio.git

然後進入docker文件夾下:
cd predictionio/docker

1.1.2 Build Docker Image

爲了構建PredictionIO Docker image,在子目錄pio中提供了Dockerfile

使用上面的命令,您將能夠使用標籤prediction/pio:latest build 一個 image。

docker build -t predictionio/pio pio

1.2 從DockerHub拉取docker鏡像

https://github.com/steveny2k/docker-predictionio

https://www.cnblogs.com/Yuanjing-Liu/p/9516536.html

1.2.1 拉取鏡像文件

拉取鏡像文件:

docker run -it -p 8000:8000 -p 7070:7070 steveny/predictionio:0.12.0 /bin/bash

該命令會自動發現你本地沒有該鏡像,然後主動去DockerHub拉取。

docker 容器操作:

# 查看所有的容器 及其狀態
docker ps -a

# 開始/停止 容器
docker start/stop xxxx

# 查看容器日誌
docker logs -f xxxx

#進入docker容器中,比attach命令更好,退出不會關閉
docker exec -it xxxxid bash

# 退出container時,這個container仍然在後臺運行
exit # 或者按鍵“Ctrl + D”

1.2.2 啓動事件引擎

拉去鏡像之後, docker會直接啓動一個 容器。並且進入容器。然後我們 啓動所有PredictionIO事件服務器(HBase和Elasticsearch):

pio-start-all

查看有沒有啓動成功:

pio status

看到以下結果說明成功。
在這裏插入圖片描述

如果報錯:Please make sure they are correct. Source Name: ELASTICSEARCH; Type: elasticsearch; xxxxxx 類似的錯誤 都表示 elasticsearch 沒有啓動成功,
https://github.com/shimamoto/docker-predictionio/issues/1 參考 解決方案爲,增加docker對內存的限制 提高到2g以上

# 如果有問題,就用stop命令關閉,並重啓
pio-stop-all
pio-start-all	

2 使用Quick Start例子做推薦系統

http://predictionio.apache.org/templates/recommendation/quickstart/

基本Recommendation模板的QuickStart是一個很好的分步指南

2.1 下載模板引擎

這裏下載的是一個數據推薦引擎,推薦原理是:
收集用戶買了哪些商品,用戶給商品打分這兩項數據,通過協同過濾算法訓練出用戶喜好模型,推薦用戶還會買哪些商品。

打開一個命令行:

git clone https://github.com/apache/predictionio-template-recommender.git MyRecommendation
cd MyRecommendation

這會創建一個新目錄MyRecommendation,您可以在其中找到下載的引擎模板。

在docker中可能沒有網,用 docker cp 命令,將文件夾拷貝到 docker中/去。

# 在pio中創建文件夾
cd /home/pio
mkdir engine

# 另外開啓命令行,把在外面下載的模版存到 docker中。
docker cp MyRecommendation/ 06d3ba0fb17d:/home/pio/engine

2.2 生成應用程序ID和訪問密鑰

您將需要在PredictionIO中創建一個新的應用程序以存儲您應用程序的所有數據。收集的數據將用於機器學習建模。

假設您要在名爲“ MyApp1”的應用程序中使用此引擎。運行以下命令以創建一個新應用“ MyApp1”:

在 PredictionIO docker中:

pio app new MyApp1

您應該在控制檯輸出中找到以下內容:

...
[INFO] [HBLEvents] The table pio_event:events_1 doesn't exist yet. Creating now...
[INFO] [App$] Initialized Event Store for this app ID: 1.
[INFO] [Pio$] Created a new app:
[INFO] [Pio$]       Name: MyApp1
[INFO] [Pio$]         ID: 1
[INFO] [Pio$] Access Key: 7_BPHXMzGKKWOQMwwAP-YBvj_3OrMhrE9gbIbxfPQYQ_Ud_UmypIJgR2UlXQ-_IB

請注意,爲此應用程序“MyApp1”創建了App ID ,** Access Key *。使用此應用程序的EventServer收集數據時,您將需要訪問密鑰。

您可以通過運行以下命令列出創建其相應ID和訪問密鑰的所有應用程序:

pio app list

你應該會看到你創建的應用列表,例如:

pio@bd7804a18b5b:/$ pio app list
[INFO] [Pio$]                 Name |   ID |                                                       Access Key | Allowed Event(s)
[INFO] [Pio$]               MyApp1 |    1 | 7_BPHXMzGKKWOQMwwAP-YBvj_3OrMhrE9gbIbxfPQYQ_Ud_UmypIJgR2UlXQ-_IB | (all)
[INFO] [Pio$]               MyApp2 |    2 | io5lz6Eg4m3Xe4JZTBFE13GMAf1dhFl6ZteuJfrO84XpdOz9wRCrDU44EUaYuXq5 | (all)
[INFO] [Pio$] Finished listing 2 app(s).

2.3 收集數據

2.3.1 通過url收集數據

接下來,讓我們收集一些訓練數據。默認情況下,推薦引擎模板支持兩種類型的事件:rate和buy。用戶可以給商品評分或購買商品。該模板需要user-view-itemuser-buy-item事件。

也可以輕鬆地自定義該模板,以考慮更多用戶事件,例如like,dislike,嫌棄,超愛等。

您可以通過發出HTTP請求或通過提供的SDK輕鬆地將這些事件實時實時發送到PredictionIO Event Server。有關如何將您的應用程序與SDK集成的更多詳細信息,請參見“ 應用程序集成概述 ”。

讓我們嘗試使用以下curl命令將事件發送到EventServer (相應的SDK代碼顯示在其他選項卡中)。
替換<ACCCESS_KEY>爲以上步驟中生成的訪問密鑰。請注意,這localhost:7070是事件服務器的默認URL。
爲了方便起見,將訪問密鑰設置爲shell變量,運行:

ACCESS_KEY=<ACCESS_KEY>

PredictionIO提供了收集數據的接口,在啓動了Prediction服務後可以調用它,這裏需要用到Access Key。

$ curl -i -X POST http://localhost:7070/events.json?accessKey=$ACCESS_KEY \
-H "Content-Type: application/json" \
-d '{
  "event" : "rate",
  "entityType" : "user",
  "entityId" : "u0",
  "targetEntityType" : "item",
  "targetEntityId" : "i0",
  "properties" : {
    "rating" : 5
  }
  "eventTime" : "2014-11-02T09:39:45.618-08:00"
}'

這個例子表示u0用戶給i0產品,評價了5分。 這個請求也可以使用postman等工具進行模擬。

在這裏插入圖片描述

  • 查詢事件服務器:
    現在,讓我們查詢EventServer,看看是否成功導入了這些事件。
$ curl -i -X GET "http://localhost:7070/events.json?accessKey=$ACCESS_KEY"

它應該以JSON格式返回導入的事件。

2.3.2 python腳本批量導入

該引擎需要更多數據才能訓練有用的模型。爲了進行快速入門演示,我們不是實時地一次發送更多事件,而是使用腳本批量導入更多事件。

模板中提供了Python導入腳本import_eventserver.py,以使用Python SDK將數據導入事件服務器。請安裝Python SDK。

 pip install predictionio

這些命令必須在Engine目錄中執行,例如:MyRecomendation

cd MyRecommendation
curl https://raw.githubusercontent.com/apache/spark/master/data/mllib/sample_movielens_data.txt --create-dirs -o data/sample_movielens_data.txt
python data/import_eventserver.py --access_key $ACCESS_KEY

插入數據後顯示:

Importing data...
1501 events are imported.

2.3.3 自定義其他事件

默認情況下,模板使用“評分”事件(顯式評分)訓練模型。您可以自定義引擎以讀取其他自定義事件並處理隱式選項的事件(例如,查看,購買)

自定義引擎 http://predictionio.apache.org/templates/recommendation/reading-custom-events/
處理隱式 (Recommendation): http://predictionio.apache.org/templates/recommendation/training-with-implicit-preference/

xxxx待補充

2.4 部署引擎即服務

現在,您可以 build構建,train訓練 和 deploy部署 引擎。首先,請確保您位於該MyRecommendation目錄下。

cd MyRecommendation

在目錄下,您應該找到一個engine.json文件;修改此文件,以確保appName參數與您先前創建的應用程序名稱匹配(例如 MyApp1)。

  ...
  "datasource": {
    "params" : {
      "appName": "MyApp1"
    }
  },
  ...

2.4.1 build構建引擎

在MyRecommendation目錄,運行以下命令:

pio build --verbose

第一次,此命令應花費幾分鐘;所有後續構建應少於一分鐘。–verbose如果您不想查看所有日誌消息,也可以不運行它。

成功構建後,您應該看到類似於以下內容的控制檯消息

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

2.4.2 train訓練引擎

要訓​​練引擎,請運行以下命令:

pio train

成功訓練引擎後,您應該看到類似於以下內容的控制檯消息。

[INFO] [CoreWorkflow$] Training completed successfully.

2.4.3 deploy部署引擎

現在,您的引擎已準備好部署。運行:

pio deploy

引擎成功部署並運行後,您將看到類似於以下內容的控制檯消息:

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

不要終止已部署的引擎進程。

默認情況下,已部署的引擎綁定到 http://localhost:8000。您可以在網絡瀏覽器中訪問該頁面以檢查其狀態。

在這裏插入圖片描述

2.5 使用引擎推薦

現在,您可以嘗試檢索預測結果。要向ID爲1的用戶推薦4部電影,請將此JSON發送{ “user”: “1”, “num”: 4 }到已部署的引擎,它將返回推薦電影的JSON結果。只需通過發出HTTP請求或通過EngineClientSDK 發送查詢即可。

在已部署的引擎運行的情況下,打開另一個終端並運行以下curl命令或使用SDK發送查詢:

curl -H "Content-Type: application/json" \
-d '{ "user": "1", "num": 4 }' http://localhost:8000/queries.json

以下是示例JSON響應:

{
  "itemScores":[
    {"item":"22","score":4.072304374729956},
    {"item":"62","score":4.058482414005789},
    {"item":"75","score":4.046063009943821},
    {"item":"68","score":3.8153661512945325}
  ]
}

在這裏插入圖片描述

2.6 定期更新推薦模型

要使用新數據定期更新模型,只需設置一個linux的 cron job來定時調用pio train和pio deploy。

在重新訓練過程中,引擎將繼續提供預測結果。

訓練完成後,pio deploy將自動關閉現有引擎服務器,並在同一端口上啓動新進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章