SPSS Collaboration And Deployment Services(以下CADS)ではSPSS Modelerで作ったストリームをREST API化してリアルタイム実行することができます。これをリアルタイム・スコアリングといいます。
今回はPythonプログラムからREST APIでのリアルタイム・スコアリングを実行してみます。
1. ストリームの確認
以下のストリームを使います。
[機械ID]と[温度]を入力すると、予測結果である[$R-不良]と[$RC-不良]を付与して戻すストリームです。
2. スコアリング構成
確認したストリームをCADSのレポジトリに登録し、右クリックで[スコアリングの構成]でスコアリング構成のウィザードを立ち上げます。
名前をつけて、後はデフォルトの設定のままで、[終了]をクリックして構成を完成させます。
これでREST APIでのアクセスが可能になります。
3. Pythonプログラムの解説
まず以下のマニュアルに従って、httpのヘッダーを作成します。
ユーザーとパスワードをbase64でエンコーディングする必要があります。以下の例ではadminを使ってしまっていますが、本来はスコアリング専用のユーザーを作って使うことをお勧めします。
Specifying request headers - IBM Documentation
import base64
userpass_enc=str(base64.b64encode('admin:password'.encode()).decode("ascii"))
headers = {'Content-Type':'application/json;charset=utf-8',
'Authorization': 'Basic {}'.format(userpass_enc),
'Client-Accept-Language': 'ja-JP',
'Accept-Language':'ja-JP'}
以下のマニュアルに従ってスコアリングリクエストのボディを作成します。
The scoreRequest object - IBM Documentation
id:スコアリング構成で指定した名前
name: スコアリング枝の入力ノード名。以下の例だと「スコアリングデータ」です
input:説明変数名と値を指定します。リストオブジェクトなので、複数行を一度に渡すこともできます。
input={
"id":"FailPredict",
"requestInputTable":[
{
"name":"スコアリングデータ",
"requestInputRow":[
{"input":[
{"name":"機械ID","value":"1036"},
{"name":"温度","value":"911.726"}
]}
]}
]}
以下のマニュアルに従ってURLを指定してPOSTします。
Specifying a request URL - IBM Documentation
requestをつかってpostします。
status_codeに200が戻れば成功です。
import json
import requests
url="http://ms183-win19:9080/scoring/rest/configuration/FailPredict/score"
r_rts = requests.post(url, data=json.dumps(input),headers=headers)
print(r_rts.status_code)
post結果に対するjson()メソッドでスコア結果を得ることができます。
各エレメントは以下にマニュアルで解説されています。
The scoreResult object - IBM Documentation
columnNames:出力列名のリスト
rowValues:出力結果のリストです。出力列名のリストの順序どおりに出力されます。
pprint.pprint(r_rts.json())
上の例だと$R-不良'='F', '$RC-不良'=0.8809523809523809が返されています。
4.サンプル
サンプルは以下に置きました。
ストリーム
データ
■テスト環境
Modeler 18.3
Python 3.8.5
Windows 10 64bit
Collaboration and Deployment Services 8.3
Windows Server 2019
5.参考
Score POST - IBM Documentation