本ハンズオンでは、とある工場に配置されたマシンから取得した稼働データ(起動時間ごとの消費電力・温度・エラーコード)を使用し、故障予知をしてみます。
本ハンズオンを通じて、1からこのストリーム(完成版ストリームファイル.str)を作成していきます。
Watson Studioのホーム画面で、プロジェクトの作成をクリックします。
プロジェクトの作成画面で、空のプロジェクトを作成をクリックします。
新規プロジェクトの画面で、名前欄にDojoを入力します。
画像の様に①ストレージ・サービスの選択と表示されている場合は、「追加」がリンクとなっていますのでクリックしてください。
ストレージと表示され、ストレージ名が既に入力されている場合は、右下の作成をクリックし、以降のストレージ作成の手順はスキップしてください。
Cloud Object Storageの作成画面が表示されたら、料金プランの中から、ライトプランを選択し、作成をクリックします。
※自動でプロジェクト作成画面に戻ります
先ほどのプロジェクト作成画面でストレージ欄にストレージ名が入っていることを確認して、作成をクリックします。
以下の様にプロジェクトのホーム画面が表示されたら、プロジェクトの作成完了です。
新規資産画面が表示されたら、検索フィールドにSPSS Modeler
と入力し、グラフィカルビルダーに表示されるSPSS Modelerをクリックします。
SPSS Modeler Flowの作成画面が表示されたら、以下の通り設定しCreateをクリックします。
フィールド | 設定値 |
---|---|
Name | Hands-on |
環境定義 | Default SPSS Modeler S(2 vCPU 8GB RAM) |
少し待つと、SPSS Modeler Flowが利用できる様になります。
このリポジトリをダウンロードし、dataフォルダに入っている以下のCSVファイルをすべて画面右側の点線で囲まれた部分にドラッグ&ドロップします。
ファイル名 |
---|
エラー.csv |
エラー_予測.csv |
温度.csv |
温度_予測.csv |
電力.csv |
電力_予測.csv |
インポートパレットから、データ資産ノードをフロー・キャンバスにドラッグ&ドロップします。
データ資産ノードをダブルクリックまたは、右クリックし開くをクリックします。
データ資産の選択画面が表示されたら、データ資産 > 電力.csvと選択し、条件抽出をクリックします。
タイプセクションを選択します
値の読み込みをクリックし、下の表に列名などが表示されたらM_CDの指標を名義に変更します。
再度値の読み込みをクリックし、保存をクリックします。
先ほど配置したノードの名前が電力.csvに自動で切り替わります。
同様の手順で、温度.csvとエラー.csvをフロー・キャンバスに追加します。
温度.csvの指標で変更するのはM_CD、
エラー.csvの指標で変更するのはマシンコードとERR_CDです。
余裕のある方は、任意のノードを右クリックして、データのプレビューを選択してみてください。
読み込んだデータの中身を画面上で確認することができます。
用意されたデータの中身を確認すると、列名に揺らぎがあることが確認できます。
後々、データを加工する際同じ列名の方が便利なため、列名を統一します。
フィールド操作パレットから、フィルターノードをフロー・キャンバスにドラッグ&ドロップし、エラー.csv → フィルターと接続します。
ノード同士の接続方法
接続元のノードにマウスカーソルを置くと、>マークが表示されます。
>マークをドラッグし接続先のノードの上で離すとノードの接続ができます。
フィルターノードをダブルクリックまたは、右クリックし編集をクリックします。
出力フィールドのマシンコードをM_CD、起動時間をUP_TIMEに変更し、保存をクリックします。
データの加工が意図した通りにできているか確認をします。
出力パレットから、表ノードをフロー・キャンバスにドラッグ&ドロップし、フィルター → 表と接続します。
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
3つのCSVファイルをマシンコードと起動時間をキーに1つのテーブルに結合します。
レコード操作パレットから、マージノードをフロー・キャンバスにドラッグ&ドロップし、
電力.csv → マージ
温度.csv → マージ
フィルター → マージ (エラー.csvから接続しない様に注意)
と接続します。
マージノードをダブルクリックします。
マージ法にキーを選択し、列の追加をクリックします。
M_CDとUP_TIMEをONにし、OKをクリックします。
それぞれの入力データに同じ名前のキー項目が含まれているので複数表示されていますが、どれを選んでも問題ありません。 自動で先頭のキー名がONになります。
再度、マージノードによって得られるデータが意図したものか確認するため、一度表ノードに出力します。
ノードを使い回しするため、先ほど使用したフラグ設定と表の接続を解除してください。
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
上手くM_CD, UP_TIMEをキーに3つのテーブルを結合できました。
マージは、キーとなる項目が必要です。
各入力データでキーとなる項目名は同じである必要があります。
キー項目の名称が異なる場合は、先ほど実施した様にマージの前に項目名を変更するノード(フィルターノード)を使用します。
例)マシンコード → M_CDなど
SPSSにはキャッシュと言う便利な機能が提供されています。
基本的にはフローを実行すると、データの入力から出力まで全てのノードの処理が流れます。
データ量が少ない場合には特に問題が表面化しにくいのですが、大量のデータを処理する場合、毎回データの入力から処理を実行するのは時間がかかるので、その対策としてキャッシュを利用します。
任意のノードでキャッシュを有効にすると、1回目の処理結果をメモリ上に保持する様になり、2回目以降の実行時にはキャッシュからデータを取得してくれます。
キャッシュを設定したいノードを右クリックしcache > 有効にするを選択します。
キャッシュを有効にした直後は左側の白いアイコンが表示されます。
白いアイコンはまだキャッシュにデータが保持されていないことを意味し、一度キャッシュにデータが保持されると右側の黒いアイコンに変更されます。
結合がひとまず出来た段階でデータの可視化を行い、欠損値があるか確認します。
出力パレットから、データ検査ノードをフロー・キャンバスにドラッグ&ドロップし、マージ → データ検査と接続します。
データ検査ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
各項目のグラフ描画・基本的な統計量算出・欠損値の検査を網羅的に行い、想定外の値・分布・欠損値が確認できます。
電力と温度に欠損値が存在することがわかったため、データを加工しましょう。
欠損値を含む温度(データとしては3行)を使用するデータから除外します。
レコード操作パレットから、条件抽出ノードをフロー・キャンバスにドラッグ&ドロップし、
マージ → 条件抽出
条件抽出 → 表
と接続し直します。
ノードの割り込み方法
既存の接続間にノードを追加したい場合、→の上に追加したいノードをドラッグ&ドロップすることで簡単に追加することができます。
条件抽出ノードをダブルクリックします。
式の下にあるアイコンをクリックし、欠損値を除外する式を作成します。
式ビルダーが表示されたら、フィールドをクリックし、式を手入力するか以下の手順で作成し、OKをクリックします。
- TEMPをダブルクリック
- **/=**をクリック
'$null$'
(半角・小文字)を入力
式が下記画像の状態になっていることを確認してください。
違っていた場合、以下の式へ修正してください。TEMP /= '$null$'
保存をクリックします。
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
5802レコードの中から3レコード除外したため、5799レコードが取得できました。
今回は省きますが、データ検査ノードを条件抽出ノードに再接続して、本当に欠損値を含むレコードを除外できているか確認すると良いでしょう。
欠損値を含む電力(データとしては1行)を1つ前のデータを利用して置換します。
フィールド操作パレットから、置換ノードをフロー・キャンバスにドラッグ&ドロップし、
条件抽出 → 置換
置換 → 表
と接続し直します。
置換はNULL値を選択し、置換文字列には以下の式を入力します。
if @OFFSET(M_CD,1) = M_CD then
@OFFSET(POWER,1)
else
0
endif
この手順で追加した条件式は、1行前のマシンコードを参照(@OFFSET(M_CD,1))して、自分と同じマシンコードなら1行前の電力(@OFFSET(POWER,1))に置換し、異なる場合は0に置換します。
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
マシンコード1000番の1秒時点の部分が欠損値だったため、値が置換されていることを確認します。
余裕のある方は、置換前(条件抽出ノードまで)のデータを表に出力して、マシンコード1000番のPOWER列を確認してみてください。 今回置換した1秒時点のデータが空白(null)になっていることが確認できます。
生データから、予測に役立つ特徴量を抽出します。
適切なデータを利用して適切な特徴量を設定することが、予測分析の精度を向上するための最も有効な方法です。
今回は各行に直近3秒分の電力と温度をすでに持っているので、このデータを利用して、その中の最大値・最小値を算出します。
フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、置換 → フィールド作成と接続します。
フィールド作成ノードをダブルクリックし、派生フィールド名に生成する列名としてPOWER_MAX3と入力します。
式にPOWER_1~POWER_3の中の最大値を取得する以下の式を入力します。
max_n(@FIELDS_BETWEEN('POWER_1', 'POWER_3'))
同様の手順で電力の最小値も作成します。
フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、POWER_MAX3 → フィールド作成と接続します。
フィールド作成ノードをダブルクリックし、派生フィールド名に生成する列名としてPOWER_MIN3と入力します。
式にPOWER_1~POWER_3の中の最小値を取得する以下の式を入力します。
min_n(@FIELDS_BETWEEN('POWER_1', 'POWER_3'))
温度の最大値と最小値も作成します。
POWER_MAX3とPOWER_MIN3を選択し、コピー&ペーストします。
(コピー元の)POWER_MIN3 → (コピー先の)POWER_MIN3と接続します。
(コピー先の)POWER_MIN3をダブルクリックし、派生フィールド名に生成する列名としてTEMP_MIN3と入力します。
式にTEMP_1~TEMP_3の中の最小値を取得する以下の式を入力します。
min_n(@FIELDS_BETWEEN('TEMP_1', 'TEMP_3'))
(コピー先の)POWER_MAX3をダブルクリックし、派生フィールド名に生成する列名としてTEMP_MAX3と入力します。
式にTEMP_1~TEMP_3の中の最大値を取得する以下の式を入力します。
max_n(@FIELDS_BETWEEN('TEMP_1', 'TEMP_3'))
表ノードをTEMP_MAX3に接続し直し、右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
これでデータの加工は完了です。
ここまでのキャッシュもTEMP_MAX3に設定しておきましょう。
教師あり学習の一種である、決定木を用いて予測モデルを作成します。
エラーの確度が高いグループと低いグループに分岐していき、最終的に樹木の様に枝分かれした樹形図を作成します。
フィールド操作パレットから、パーティションノードをフロー・キャンバスにドラッグ&ドロップし、TEMP_MAX3 → パーティションと接続します。
フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、パーティション → タイプと接続します。
タイプノードをダブルクリックし、値の読み込みをクリックします。
ロールを以下の通り設定して保存をクリックします。
フィールド | ロール |
---|---|
M_CD | なし |
UP_TIME | なし |
ERR_CD | 対象 |
データ区分 | パーティション |
上記以外 | 入力 |
タイプノードで設定したロールは、モデルのルールに対して以下の様な意味を持ちます。
ロール 説明 両方 前提条件と結果両方の候補 入力 前提条件の候補 対象 結果の候補
モデル作成パレットから、C5.0ノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → C5.0と接続します。
C5.0ノード(ノード名がERR_CDになっています)を右クリックし、実行をクリックします。
C5.0のモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
モデルの詳細が表示されたら、特徴量の重要度を選択します。
この画面では、作成したモデルでエラーコードを予測する際に重要となる列(今回はTEMPが多くを占める)を示しています。
もし、上位に予測に関係がないと思われる列が入っている場合は、先ほどのタイプノードのロールをなしに変更してモデルを再作成します。
次に、ツリー図を選択します。
赤枠で囲った部分は、温度が253.5〜259.5かつ電力が863.5以下の場合、303のエラーが発生するルールを示しています。
本ハンズオンでは列数が少ないため、人力で列の要不要が判断できますが、数百以上の列を含むデータを利用する際はそうはいきません。
そこで不要と考えられる列を洗い出せる便利なノードを紹介します。
わかりやすい様に、今回は全く同じ意味を持つ列を1つ作成し動作を確認しましょう。
フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、TEMP_MAX3 → フィールド作成と接続します。
フィールド作成ノードをダブルクリックし、派生フィールド名にPOWER_COPY、式にPOWERを入力し、保存をクリックします。
フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、POWER_COPY → タイプと接続します。
タイプノードをダブルクリックし、値の読み込みをクリックします。
ロールを以下の通り設定して保存をクリックします。
フィールド | ロール |
---|---|
M_CD | なし |
UP_TIME | なし |
ERR_CD | 対象 |
上記以外 | 入力 |
モデル作成パレットから、GLEノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → GLEと接続します。
GLEノード(ノード名がERR_CDになっています)をダブルクリックします。
モデル選択を開き、モデル選択または正則化を使用するのチェックをONにし、保存をクリックします。
GLEノードを右クリックし、実行をクリックします。
GLEのモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
モデルの詳細が表示されたら、パラメーター推定値を選択します。
先ほど作成した不要な列POWER_COPYを確認すると、使用されていないことがわかります。
分析の際にどの列を採用すれば良いかわからない場合はまずはこのLasso回帰を試してみても良いでしょう。
作成した予測モデルの予測精度を検証します。
パーティションノードによって実績データの一部を学習用に、残りをテスト用に分割して実施します。
出力パレットから、解析ノードをフロー・キャンバスにドラッグ&ドロップし、ERR_CD → 解析と接続します。
解析ノードをダブルクリックし、一致行列のチェックをONにして、保存をクリックします。
解析ノードを右クリックし、実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
学習・テストの両方に対して、正答率などを表示できます。
目標としている精度を達成しているかや、過学習(学習データに対しては予測精度が高いのに、テストデータに対しては精度が低いこと)が発生していないかの確認ができます。
学習ステップで行ったデータ加工と同じ処理を予測データに対して実施します。
データの読み込みステップと同様の手順で、電力_予測.csvと温度_予測.csvとエラー_予測.csvをフロー・キャンバスに追加します。
学習ステップから、赤枠で示したノード(フィルター・マージからTEMP_MAX3まで)をまとめてコピー&ペーストします。
電力_予測.csv → マージ、温度_予測.csv → マージ、エラー.csv → フィルターと接続します。
先ほどと同様に学習ステップから、C5.0のERR_CDモデルナゲットをコピー&ペーストし、TEMP_MAX3 → ERR_CDと接続します。
出力パレットから、表ノードをフロー・キャンバスにドラッグ&ドロップし、モデルナゲット → 表と接続します。
表ノードを右クリックし、実行をクリックし予測結果を見てみます。
予測用として渡したデータに対して、その時点で発生するだろうと予想されるエラーコードとその確度を提示しています。
今回使用したデータでは「63〜65秒は98%くらいの確率でエラーは発生しないが、66秒目の電力・温度が上昇しているタイミングからは98%くらいの確率で202のエラーが発生する。」と言う結果が得られました。
予測結果はモデルによって自動で命名された列が追加されます。 予測結果は画面への表示だけでなく、ファイルやRDBへの書き出しや作成したモデルを保存しアプリケーションから実行することも可能です。
以上で本ハンズオンは終了です。お疲れ様でした。