1.1.3.6. 予測を定期実行する

本項では、Alkanoを使用した予測の定期実行手順、また予測結果データファイルをWasabiオブジェクトストレージ(以下Wasabi)に保存する手順について記載します。

以下の手順は「1.1.3.3. サーバーインスタンスの構築をする」で構築したサーバー(以下Alkanoサーバー)で行います。

なお、本項中の設定値の「< >」の表記については、利用の環境により各自入力いただく箇所となります("<"から">"までを設定値に置き換えてください)。

前提条件を確認する

あらかじめ、これまでの「1.1.3.5. 学習モデルを作成する」に記載されているすべての作業が完了していることを確認してください。

予測用データを用意する

  1. Alkanoでの予測に用いる予測用データであるcsvファイルを作成します(本構成ガイドではファイル名を「sensor.csv」としています)。
    このcsvファイルは、「1.1.3.5. 学習モデルを作成する - 学習モデルを作成する(勾配ブースティング決定木アイコン)」で説明変数に選択した列と同じ列分、また行数は1日分のデータを用意したファイルになります。
  2. 上記csvデータをWasabiに配置します。本構成ガイドでは配置先を「alkano-bucket/alkano-csv」としています。

REST APIドキュメントを入手する

シナリオを自動実行する際に必要なREST APIドキュメントを入手します。

REST APIドキュメントの入手につきましては、当社営業までお問い合わせください。

お問い合わせ先およびAlkanoの詳細情報につきましては、「データ分析 Alkano」をご覧ください。

予測実行を行うためのシナリオを作成する

注釈

本構成ガイドで作成するシナリオの全体像は以下の図のとおりです。

作成するシナリオの全体像を確認する1

メタパラメータを設定する

Pythonスクリプトアイコンで使用するメタパラメータを設定します。

  1. シナリオ画面上部にある、「メタパラメータ設定画面を開きます」アイコンをクリックします。

    メタパラメータを設定する1
  2. 「+」をクリックし、メタパラメータを追加します。

    メタパラメータを設定する2
  3. 以下パラメーターを入力し「保存」をクリックします。

    項目
    名前 任意のメタパラメータ名(例:scriptsDatetime)
    文字列
    デフォルト値 <任意のデフォルト値(例:2023-06-01-123456)>
    メタパラメータを設定する3
  4. REST API実行用にメタパラメータID(メタパラメータ識別子)が必要になります。「メタパラメータIDをクリップボードにコピーします」をクリックしてコピーし、任意の場所に控えてください。

    メタパラメータを設定する4

予測用データをインポートする(Pythonスクリプトアイコン)

Alkanoシナリオ内にWasabiから予測用データをインポートする「Pythonスクリプト」アイコンを配置します。

  1. シナリオ画面内のアイコンが置かれていない場所を右クリックし、「Pythonスクリプトを追加」をクリックします。

    予測用データをインポートする(Pythonスクリプトアイコン)1
  2. 「Python script」アイコンを右クリックし、「ノード名変更」をクリックします。

    予測用データをインポートする(Pythonスクリプトアイコン)2
  3. アイコンの名称を「予測用データインポート」に変更し、シナリオ画面の余白部分をクリックします。

    予測用データをインポートする(Pythonスクリプトアイコン)3
  4. 「予測用データインポート」アイコンをダブルクリックして、パラメーター画面を開きます。

    予測用データをインポートする(Pythonスクリプトアイコン)4
  5. 「入力設定」にデフォルトで設定されている変数「table」を、「-」をクリックして削除します。

    予測用データをインポートする(Pythonスクリプトアイコン)5
  6. 「メタパラメータ参照設定」に作成したメタパラメータを追加します。

    予測用データをインポートする(Pythonスクリプトアイコン)6
  7. スクリプト部分を以下の内容に書き換えて「保存」をクリックします(下記スクリプトはWasabiのリージョンが「ap-northeast-1」の場合です)。

    予測用データをインポートする(Pythonスクリプトアイコン)7
    from msi.common.dataframe import read_csv
    
    import shutil
    import os
    import subprocess
    import glob
    from dotenv import load_dotenv
    
    PATH = "C:\\Alkano_Work\\"
    dirname = str(<作成したメタパラメータ名(例:scriptsDatetime)>)
    csvpath = PATH + dirname
    os.mkdir(csvpath)
    os.chdir(csvpath)
    load_dotenv()
    
    cmd = "aws s3 cp s3://alkano-bucket/alkano-csv/ . --endpoint-url=https://s3.ap-northeast-1.wasabisys-ntt.com --recursive --exclude \"*\" --include \"sensor.csv\""
    proc = subprocess.call(cmd,shell=True)
    
    files = glob.glob(csvpath + '\\*.csv')
    for file in files:
            result = read_csv(file, datetime_formats=['%Y/%m/%d %H:%M:%S'])
    os.chdir("C:\\")
    shutil.rmtree(csvpath)
    

注釈

  • 本スクリプトは動作確認用です。Wasabiからのファイル取得部分はCLI呼び出しの他に、APIで実施する方法もあります。
  1. パラメーター画面右上の「×」をクリックし、パラメーター画面を閉じます。

  2. 「予測用データインポート」アイコン内のスクリプトを動作するにあたり、「dotenv」ライブラリをMSIP用のPython環境にインストールする必要があります。コマンドプロンプトを開き、以下のコマンドを実行します。

    > C:\MSIP\python\Scripts\activate
    > python -m pip install dotenv
    

環境変数ファイルを作成する

上記Pythonスクリプト内で、Wasabiから予測用データをインポートする際に必要なアクセスキー・シークレットアクセスキー・リージョン名を保存する環境変数ファイルを作成します。

  1. エクスプローラで「C:\Alkano_Work」を開きます。
  2. 「C:\Alkano_Work」内に「.env」ファイルを作成し、そのファイルの内容を以下のように書き換えます。
AWS_Access_Key_ID='<※1>'
AWS_Secret_Access_Key='<※2>'
Default region name='<※3>'

注釈

前処理アイコン・予測アイコンを配置する

予測用データに対する前処理・予測をするアイコンを配置します。

  1. 「欠損値除外」アイコンを右クリックし、「ノードをコピー」をクリックします。

    前処理アイコン・予測アイコンを配置する1
  2. 「予測用データインポートアイコン」を右クリックし、「ノードを追加」をクリックします。

    前処理アイコン・予測アイコンを配置する2
  3. 「コピー」の中に表示されている「欠損値除外」アイコンをクリックします。

    前処理アイコン・予測アイコンを配置する3
  4. 「年月日時分の列を加える」アイコンを右クリックし、「ノードをコピー」をクリックします。

    前処理アイコン・予測アイコンを配置する4
  5. 「欠損値除外(1)」を右クリックし、「ノードを追加」をクリックします。

    前処理アイコン・予測アイコンを配置する5
  6. 「コピー」の中に表示されている「年月日時分の列を加える」アイコンをクリックします。

    前処理アイコン・予測アイコンを配置する6
  7. 「予測精度検証」アイコンを右クリックし、「ノードをコピー」をクリックします。

    前処理アイコン・予測アイコンを配置する7
  8. 「年月日時分の列を加える(1)」を右クリックし、「ノードを追加」をクリックします。

    前処理アイコン・予測アイコンを配置する8
  9. 「コピー」の中に表示されている「予測精度検証」アイコンをクリックします。

    前処理アイコン・予測アイコンを配置する9
  10. 「予測精度検証(1)」アイコンを右クリックし、「ノード名変更」をクリックします。

    前処理アイコン・予測アイコンを配置する10
  11. アイコンの名称を「予測結果」に変更し、シナリオ画面の余白部分をクリックします。

    前処理アイコン・予測アイコンを配置する11
  12. 「勾配ブースティング決定木」アイコンを右クリックし、「接続リンクを追加」をクリックします。

    前処理アイコン・予測アイコンを配置する12
  13. 「予測結果」アイコンをクリックし、接続リンクが追加されることを確認します。

    前処理アイコン・予測アイコンを配置する13

REST API実行環境を準備する

REST API利用のための準備をする

REST APIを利用するにあたり「requests」ライブラリをインストールし、パッチを当てる必要があります。

  1. 1.1.3.4. Alkanoの環境構築をする - 作業用ディレクトリを作成する」で作成した作業用ディレクトリに、REST APIドキュメントに含まれている「batch_tutorial\batch_tools.py」をコピーします。また、MSIPインストールディレクトリ(例:C:\MSIP)に「batch_tutorial\patch_for_batch_tools.js」をコピーします。

  2. コマンドプロンプトを開き、以下のコマンドを実行します。

    > cd C:\Alkano_Work
    > C:\MSIP\python\Scripts\activate
    > python -m pip install requests
    > cd C:\MSIP
    > node patch_for_batch_tools.js
    

アクセストークンを取得する

REST API実行に必要なアクセストークンを取得します。

  1. 1.1.3.4. Alkanoの環境構築をする - 作業用ディレクトリを作成する」で作成した作業用ディレクトリにて、アクセストークンを取得するスクリプト「getAccessToken.py」を以下のとおり作成してください。

    getAccessToken.py

    from datetime import datetime
    from dateutil import tz
    import json
    
    from batch_tools import create_accesstoken
    
    url = "http://localhost:8080"
    username = "<ユーザー名>"
    password = "<パスワード>"
    targets = ["roles, core"]
    application_name = "external-application-1"
    expiration = datetime(<年>, <月>, <日>, tzinfo=tz.gettz("Asia/Tokyo")) # アクセストークンの有効期限を指定します。
    
    accesstoken = create_accesstoken(url, username, password, targets, application_name, expiration)
    print(json.dumps(accesstoken, indent=2))
    

注釈

  1. 以下のコマンドを実行し、上で作成したスクリプトを実行します。

    > cd C:\Alkano_Work
    > C:\MSIP\python\Scripts\activate
    > python getAccessToken.py
    
  2. 以下のようなコンソール出力が表示されることを確認し、"payload"の"value"の値(アクセストークン)を控えておきます。

    {
            ...
            "payload":{
                    ...
                    "value":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
            },
            ...
    }
    

注釈

  • アクセストークンの有効期限が切れた場合はスクリプト内のアクセストークンの有効期限を書き換えて上記手順を再度実行してください。

分析フローの実行・実行結果の取得・予測結果データファイルをWasabiに保存するスクリプトを作成する

  1. "Alkanoシナリオ実行"・"実行結果の取得"・"予測結果データファイルをWasabiに保存"を行うスクリプトを作成します(本構成ガイドでは、Wasabiにおける予測結果データファイルの配置先を「alkano-bucket/alkano-csv」としています)。

1.1.3.4. Alkanoの環境構築をする - 作業用ディレクトリを作成する」で作成した作業用ディレクトリにて以下のスクリプト「prediction.py」を作成してください。

注釈

prediction.py

from batch_tools import (
        get_scenario_resources,
        run_scenario_resource,
        wait_job,
        get_result,
        write_files,
)
import datetime

url = "http://localhost:8080"
accesstoken = "<作成したアクセストークン(例:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)>"
target_scenario_name = "<シナリオ名(例:新しいシナリオ)>"
target_node_names = ["<実行するノード名(例:予測結果)>"]
target_nodes_to_output_files = ["<書き出すノード名(例:予測結果)>"]
output_dir = "<出力先ディレクトリ名(例:output)>"

datetime_now = datetime.datetime.now()
dirname = (datetime_now.utcnow() + datetime.timedelta(hours=9)).strftime('%Y-%m-%d-%H%M%S')
params = {
        "<作成したメタパラメータのID(メタパラメータ識別子)(例:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)>":{
                "value": dirname,
                "type": "string"
        }
}

if __name__ == "__main__":
        print("シナリオリソース一覧を取得")
        resources = get_scenario_resources(url, accesstoken)

        target_scenario_resource = [
                resource
                for resource in resources
                if resource["payload"]["name"] == target_scenario_name
        ]

        if len(target_scenario_resource) == 1:
                print("シナリオを取得")
                target_scenario_resource = target_scenario_resource[0]
                print("シナリオを実行開始")
                job = run_scenario_resource(url, accesstoken, target_scenario_resource, target_node_names, params)
                job = wait_job(url, accesstoken, job)
                print("シナリオの実行終了")
                print("実行結果を取得")
                result = get_result(
                        url,
                        accesstoken,
                        job,
                )
                print("実行結果を書出開始")
                write_files(
                        url,
                        accesstoken,
                        result,
                        target_nodes_to_output_files,
                        output_dir,
                )
                print("実行結果を書出終了")
        else:
                print("同名のシナリオが無いか重複があります")

import subprocess

cmd = "aws s3 cp C://Alkano_Work/<出力先ディレクトリ名(例:output)> s3://alkano-bucket/alkano-csv --endpoint-url=https://s3.ap-northeast-1.wasabisys.com --recursive --exclude \"*\" --include \"<実行するノード名(例:予測結果)>.result.csv\""
proc = subprocess.run(cmd,shell=true)

タスクスケジューラでPythonスクリプトを自動実行する

上記Pythonスクリプトをタスクスケジューラで時間ごとに自動実行します。

  1. タスクスケジューラを起動します。タスクバーの検索アイコンをクリックし、「task」と入力、「タスクスケジューラ」をクリックします。

    タスクスケジューラでPythonスクリプトを自動実行する0
  2. 「タスクの作成...」をクリックします。

    タスクスケジューラでPythonスクリプトを自動実行する1
  3. 「全般」タブの「名前」に任意の名前(例:シナリオ定期実行)を入力します。

    タスクスケジューラでPythonスクリプトを自動実行する2
  4. 「操作」タブを開き「新規」をクリックします。

    タスクスケジューラでPythonスクリプトを自動実行する3
  5. 以下の値をそれぞれ入力し「OK」をクリックします。

    項目
    プログラム/スクリプト(P): C:\MSIP\python\Scripts\python.exe
    引数の追加(オプション)(A): Pythonスクリプト名(例:prediction.py)
    開始(オプション)(T:) Pythonスクリプトがあるファイルパス(例:C:\Alkano_Work)
    タスクスケジューラでPythonスクリプトを自動実行する4
  6. 「トリガー」タブを開き、「新規」をクリックします。

    タスクスケジューラでPythonスクリプトを自動実行する5
  7. 「設定」画面にて、自動実行を始めたい時間(例:2023/03/01 12:00:00)、また「詳細設定」の「繰り返し間隔」にて繰り返したい時間間隔(例:1時間)を入力し、チェックを入れ「OK」をクリックします。

    タスクスケジューラでPythonスクリプトを自動実行する6
  8. 「OK」をクリックし、タスクスケジューラを閉じます。

    タスクスケジューラでPythonスクリプトを自動実行する7
  9. 1.1.3.4. Alkanoの環境構築をする - 作業用ディレクトリを作成する」で作成した作業用ディレクトリ下に「output/予測結果.result.csv」が作成されていることを確認してください。これが予測用データに対する予測結果です。

    タスクスケジューラでPythonスクリプトを自動実行する8
  10. 予測結果データファイルがWasabiに(本構成ガイドでは、予測結果データファイルの配置先は「alkano-bucket/alkano-csv」です)あることを確認してください。