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-item
和user-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將自動關閉現有引擎服務器,並在同一端口上啓動新進程。