予知保全(Predictive Maintenance)
RapidMiner Studioのサンプルレポジトリ(Samples > Templates > Predictive Maintenance)にPredictive Maintenanceというサンプルプロセスがあります。このサンプルプロセスは機械の故障を予測し、事前にメンテナンスの予定を立てるために作成されています。Reference Dataは”Machine ID”で区別された136の機械と25個のセンサーの値、”Failure”という2値の目的変数で構成されています。Predictive Maintenanceプロセスは故障を予測するモデルを構築し、New Dataというラベルなしデータに適用されます。
以下では、Predictive MaintenanceプロセスをWebサービスの構築に使用します。
・パラメータなしのWebサービスは全ての”Machine ID”について故障の確率を予測します。
・一つのパラメータを用いたWebサービスは特定の”Machine ID”について故障の確率を予測します。
一般的なWebサービスでは入力と出力が常に変化するため、リアルタイム応答が必要になります。しかし、今回の例ではデータソースが静的であるため、Webサービスとしてはこの例は現実的ではありません。ですが、今回は入力から出力までの全ての流れを確認することができるため、初学者が始めるには良い例となっています。
原則として、Webサービスは数千のユーザーが使用し、1秒間に複数回呼び出されます。同じモデルを繰り返し構築することは理にかなっていません。したがって基本的な戦略としては、プロセスを以下の二つに分割します。
1.Predictive Maintenanceのモデルを作成し、保存します。
2.保存したモデルを読み込み、New Dataに適用して予測します。
注意:モデルの作成には時間がかかります。しかし、一度モデルを構築し保存してしまえば即時使用することができます。一般的には、Webサービスの作成にあたり作成したプロセスはモデル構築を含むべきではありません。
Predictive Maintenanceフォルダをコピー
自由にプロセスを変更できるように、Predictive Maintenanceフォルダをコピーし、新しいロケーションにペーストすることから始めましょう。以下の手順では、Temporary Repositoryにコピーすることにします。ですがPredictive Maintenanceフォルダの保存場所は任意の場所で構いません。
1.RapidMiner StudioのリポジトリパネルでSamples > Templates > Predictive Maintenanceを右クリックしコピーを選択してください。
2.RapidMiner StudioのリポジトリパネルでTemporary Repositoryへ移動します。フォルダを右クリックし、ペーストを選択します。3つのファイルと共にPredictive Maintenanceフォルダは新規のロケーションにコピーされました。なお3つのファイルはNew Data, Reference Data, Predictive Maintenanceです。
3.全てのプロセスとモデルの準備ができるまでは、RapidMiner StudioのTemporary Repository > Predictive Maintenanceで作業します。RapidMiner Studioで全ての作業が完了した時に、Predictive MaintenanceフォルダをRapidMiner Server リポジトリへコピーしWebサービスを作成します。
モデルの保存
元のプロセスではなく、確実にコピーしたフォルダを編集するためにTemporary Repository > Predictive Maintenanceフォルダを開き、Predictive Maintenanceプロセスをダブルクリックしてください。
Predictive Maintenanceプロセスはモデルを保存せずに構築し、予測しているため、Webサービスの観点から完璧ではありません。モデルを保存するためにStoreオペレータを追加する必要があります。Apply Modelのmodelポート(“mod”)をStoreオペレータの入力ポートへ接続してください。
Storeオペレータにはオブジェクトの保存場所を決めるパラメータがあります。パラメータパネルのフォルダアイコンをクリックしてロケーションを選択します。今回はモデルを作業中のデータやプロセスと同じフォルダに保存します。モデル名をPredictive_Maintenance_Modelとし相対パスを適用するチェックボックスにチェックを入れてください。これはのちにPredictive MaintenanceフォルダをRapidMiner Serverリポジトリに移動するためです。
プロセスを保存し(ファイル>保存)、実行してモデルを生成してください。Predictive_Maintenance_ModelがPredictive Maintenanceフォルダに出現します。
モデルの読み込み
モデルが保存できれば、Webサービスを作成するプロセスを構築します。元のPredictive Maintenanceプロセスのうちほとんどのオペレータはモデル構築のためのものです。そのため、それらを取り去って代わりにRetrieveオペレータを配置します。Retrieveオペレータは保存したモデルを取り出します。Retrieveオペレータの出力をApply Modelの入力ポートに接続し、以下の画像のように接続します。Retrieveオペレータのパラメータパネルでフォルダアイコンをクリックし、Predictive_Maintenance_Modelを選択してください。
パラメータなしの予知保全(Predictive Maintenance) XMLコード
-
<?xml version="1.0" encoding="UTF-8"?><process version="9.2.000-BETA2"> <context> <input/> <output/> <macros/> </context> <operator activated="true" class="process" compatibility="9.2.000-BETA2" expanded="true" name="Process"> <parameter key="logverbosity" value="init"/> <parameter key="random_seed" value="2001"/> <parameter key="send_mail" value="never"/> <parameter key="notification_email" value=""/> <parameter key="process_duration_for_mail" value="30"/> <parameter key="encoding" value="SYSTEM"/> <process expanded="true"> <operator activated="true" class="retrieve" compatibility="9.2.000-BETA2" expanded="true" height="68" name="Retrieve New Data" origin="GENERATED_TEMPLATE" width="90" x="112" y="136"> <parameter key="repository_entry" value="New Data"/> </operator> <operator activated="true" class="retrieve" compatibility="9.2.000-BETA2" expanded="true" height="68" name="Retrieve Model" width="90" x="112" y="34"> <parameter key="repository_entry" value="Predictive_Maintenance_Model"/> </operator> <operator activated="true" class="apply_model" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Apply Model" origin="GENERATED_TEMPLATE" width="90" x="380" y="85"> <list key="application_parameters"/> <parameter key="create_view" value="false"/> </operator> <operator activated="true" class="subprocess" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Subprocess" origin="GENERATED_TEMPLATE" width="90" x="514" y="34"> <process expanded="true"> <operator activated="true" class="sort" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Sort" origin="GENERATED_TEMPLATE" width="90" x="45" y="34"> <parameter key="attribute_name" value="confidence(yes)"/> <parameter key="sorting_direction" value="decreasing"/> </operator> <operator activated="true" class="select_attributes" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Select Attributes" origin="GENERATED_TEMPLATE" width="90" x="179" y="34"> <parameter key="attribute_filter_type" value="all"/> <parameter key="attribute" value=""/> <parameter key="attributes" value=""/> <parameter key="use_except_expression" value="false"/> <parameter key="value_type" value="attribute_value"/> <parameter key="use_value_type_exception" value="false"/> <parameter key="except_value_type" value="time"/> <parameter key="block_type" value="attribute_block"/> <parameter key="use_block_type_exception" value="false"/> <parameter key="except_block_type" value="value_matrix_row_start"/> <parameter key="invert_selection" value="true"/> <parameter key="include_special_attributes" value="false"/> </operator> <connect from_port="in 1" to_op="Sort" to_port="example set input"/> <connect from_op="Sort" from_port="example set output" to_op="Select Attributes" to_port="example set input"/> <connect from_op="Select Attributes" from_port="example set output" to_port="out 1"/> <portSpacing port="source_in 1" spacing="0"/> <portSpacing port="source_in 2" spacing="0"/> <portSpacing port="sink_out 1" spacing="0"/> <portSpacing port="sink_out 2" spacing="0"/> </process> </operator> <connect from_op="Retrieve New Data" from_port="output" to_op="Apply Model" to_port="unlabelled data"/> <connect from_op="Retrieve Model" from_port="output" to_op="Apply Model" to_port="model"/> <connect from_op="Apply Model" from_port="labelled data" to_op="Subprocess" to_port="in 1"/> <connect from_op="Subprocess" from_port="out 1" to_port="result 1"/> <portSpacing port="source_input 1" spacing="0"/> <portSpacing port="sink_result 1" spacing="0"/> <portSpacing port="sink_result 2" spacing="0"/> </process> </operator> </process>
このプロセスは上記のようにPredictive Maintenanceプロセスから必要なオペレータをコピーし、自身で構築することが可能です。また、上のXMLをコピーしてPredictive_Maintenance_web_service_without_parameters.rmpファイルを作成し、インポート(File > Import Process)することでも構築できます。
インポートした後、以下の手順で操作してください。
1.Temporary Repository > Predictive Maintenanceフォルダを右クリックし、このフォルダにプロセスを保存を選択してください。
2.プロセス名をPredictive_Maintenance_web_service_without_parametersにします。
3.保存したプロセスをダブルクリックしてRapidMiner Studioに読み込んでください。そしてプロセスを実行し、エラーが発生しないことを確認してください。このプロセスは元のPredictive Maintenanceプロセスと同じ出力をするはずです。しかし、モデル構築に関わる一連のプロセスはありません。
マクロを挿入
先ほど作成したプロセスは、全ての”Machine ID”について予測を返却しますが、特定の”Machine ID”についての予測を返却したい場合の方法を紹介します。まずFilter ExamplesオペレータをRetrieve New DataとApply Modelの間に追加します。その後特定の”Machine ID”だけ抽出するように設定します。
難しいのは、Webサービスが”Machine ID”に該当するパラメータを取り、ユーザーが任意の値を選択する点です。事前に”Machine ID”の値はわかっておらず、プロセス内に記載するわけにもいきません。プロセスが実行される際に任意の値が入るようにしたいのです。そこで使用するのがマクロです。
Filter ExamplesオペレータのパラメータパネルでAdd Filtersをクリックし、以下のダイアログを表示してください。普段であれば、”Machine ID equals M_0221”などのようにフィルタを作成しますが、今回は値が変化するフィルタを構成する必要があります。マクロはキーと値がペアになっています。マクロに名前(machineID)を与え、値はWebサービスから後で与えられます。以下のシンタックスをRapidMinerのフィールドに入力すると、マクロの値が代入されます。
%{machineID}
環境パネル
以下に述べる内容で、パラメータありのWebサービスを生成するプロセスの構築がほとんど完了します。うまくいかない場合は、以下のXMLをPredictive_Maintenance_web_service_with_parameters.rmpという名前で保存し、RapidMiner Studioにインポートしてください。このプロセスをPredictive Maintenanceフォルダに保存し、実行して期待通り動作することを確認してください。
パラメータありの予知保全(Predictive Maintenance) XMLコード
-
<?xml version="1.0" encoding="UTF-8"?><process version="9.2.000-BETA2"> <context> <input/> <output/> <macros> <macro> <key>machineID</key> <value>M_0221</value> </macro> </macros> </context> <operator activated="true" class="process" compatibility="9.2.000-BETA2" expanded="true" name="Process"> <parameter key="logverbosity" value="init"/> <parameter key="random_seed" value="2001"/> <parameter key="send_mail" value="never"/> <parameter key="notification_email" value=""/> <parameter key="process_duration_for_mail" value="30"/> <parameter key="encoding" value="SYSTEM"/> <process expanded="true"> <operator activated="true" class="retrieve" compatibility="9.2.000-BETA2" expanded="true" height="68" name="Retrieve New Data" origin="GENERATED_TEMPLATE" width="90" x="112" y="136"> <parameter key="repository_entry" value="New Data"/> </operator> <operator activated="true" class="filter_examples" compatibility="9.2.000-BETA2" expanded="true" height="103" name="Filter Examples" width="90" x="246" y="136"> <parameter key="parameter_expression" value=""/> <parameter key="condition_class" value="custom_filters"/> <parameter key="invert_filter" value="false"/> <list key="filters_list"> <parameter key="filters_entry_key" value="Machine_ID.equals.%{machineID}"/> </list> <parameter key="filters_logic_and" value="true"/> <parameter key="filters_check_metadata" value="true"/> </operator> <operator activated="true" class="retrieve" compatibility="9.2.000-BETA2" expanded="true" height="68" name="Retrieve Model" width="90" x="112" y="34"> <parameter key="repository_entry" value="Predictive_Maintenance_Model"/> </operator> <operator activated="true" class="apply_model" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Apply Model" origin="GENERATED_TEMPLATE" width="90" x="380" y="85"> <list key="application_parameters"/> <parameter key="create_view" value="false"/> </operator> <operator activated="true" class="subprocess" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Subprocess" origin="GENERATED_TEMPLATE" width="90" x="514" y="34"> <process expanded="true"> <operator activated="true" class="sort" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Sort" origin="GENERATED_TEMPLATE" width="90" x="45" y="34"> <parameter key="attribute_name" value="confidence(yes)"/> <parameter key="sorting_direction" value="decreasing"/> </operator> <operator activated="true" class="select_attributes" compatibility="9.2.000-BETA2" expanded="true" height="82" name="Select Attributes" origin="GENERATED_TEMPLATE" width="90" x="179" y="34"> <parameter key="attribute_filter_type" value="all"/> <parameter key="attribute" value=""/> <parameter key="attributes" value=""/> <parameter key="use_except_expression" value="false"/> <parameter key="value_type" value="attribute_value"/> <parameter key="use_value_type_exception" value="false"/> <parameter key="except_value_type" value="time"/> <parameter key="block_type" value="attribute_block"/> <parameter key="use_block_type_exception" value="false"/> <parameter key="except_block_type" value="value_matrix_row_start"/> <parameter key="invert_selection" value="true"/> <parameter key="include_special_attributes" value="false"/> </operator> <connect from_port="in 1" to_op="Sort" to_port="example set input"/> <connect from_op="Sort" from_port="example set output" to_op="Select Attributes" to_port="example set input"/> <connect from_op="Select Attributes" from_port="example set output" to_port="out 1"/> <portSpacing port="source_in 1" spacing="0"/> <portSpacing port="source_in 2" spacing="0"/> <portSpacing port="sink_out 1" spacing="0"/> <portSpacing port="sink_out 2" spacing="0"/> </process> </operator> <connect from_op="Retrieve New Data" from_port="output" to_op="Filter Examples" to_port="example set input"/> <connect from_op="Filter Examples" from_port="example set output" to_op="Apply Model" to_port="unlabelled data"/> <connect from_op="Retrieve Model" from_port="output" to_op="Apply Model" to_port="model"/> <connect from_op="Apply Model" from_port="labelled data" to_op="Subprocess" to_port="in 1"/> <connect from_op="Subprocess" from_port="out 1" to_port="result 1"/> <portSpacing port="source_input 1" spacing="0"/> <portSpacing port="sink_result 1" spacing="0"/> <portSpacing port="sink_result 2" spacing="0"/> </process> </operator> </process>
このプロセスを実行すると、特定の”Machine ID”についての予測結果を返します。これはXMLプロセスの定義がマクロの値を設定しているからです。厳密に言うと、この値は設定する必要がありません。この値が設定されていなくても、プロセスはエラーなく実行されます(出力はありません)。Webサービスはこの値をリセットし、URLから与えられる値を受け取ります。
しかし検証が目的であれば、マクロの値を設定すると良いです。環境パネルを開きます。環境パネルの一番下に現在のマクロが表示されます。右側の二つのアイコンからマクロを作成あるいは削除することができます。マクロを新しい値に変更して結果が変更されることを確認してみましょう。
詳しくはこちらもご覧ください:パラメータありのWebサービスの作成
Predictive MaintenanceフォルダをRapidMiner Serverにコピーする
モデルを保存し、RapidMiner Studioで両方の新規プロセスを構築し検証したら、RapidMiner Serverへコピーしましょう。先ほどと同じように、Predictive MaintenanceフォルダをRapidMiner Serverリポジトリ内のフォルダにコピーします。今回の例では、DockerOneTimeRepository内の/home/adminにコピーします。RapidMiner Studioからは以下のように見えます。
RapidMiner Serverにログインし、Repository > Browse Repositoryをクリックします。Predictive Maintenanceフォルダを探してください。RapidMiner Serverからは以下のように見えます。
2つのプロセスをWebサービスに使う準備ができました!
次 : Webサービスを作成