Skip to content

IBMDeveloperTokyo/failure-prediction

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

故障予知

本ハンズオンでは、とある工場に配置されたマシンから取得した稼働データ(起動時間ごとの消費電力・温度・エラーコード)を使用し、故障予知をしてみます。
image

本ハンズオンを通じて、1からこのストリーム(完成版ストリームファイル.str)を作成していきます。
image

1. プロジェクトの作成

Watson Studioのホーム画面で、プロジェクトの作成をクリックします。
image

プロジェクトの作成画面で、空のプロジェクトを作成をクリックします。
image

新規プロジェクトの画面で、名前欄にDojoを入力します。
画像の様に①ストレージ・サービスの選択と表示されている場合は、「追加」がリンクとなっていますのでクリックしてください。
ストレージと表示され、ストレージ名が既に入力されている場合は、右下の作成をクリックし、以降のストレージ作成の手順はスキップしてください。
image

Cloud Object Storageの作成画面が表示されたら、料金プランの中から、ライトプランを選択し、作成をクリックします。
※自動でプロジェクト作成画面に戻ります
image

先ほどのプロジェクト作成画面でストレージ欄にストレージ名が入っていることを確認して、作成をクリックします。
image

以下の様にプロジェクトのホーム画面が表示されたら、プロジェクトの作成完了です。
image

2. 資産の作成

資産タブに切り替えて、新規資産をクリックします。
image

新規資産画面が表示されたら、検索フィールドにSPSS Modelerと入力し、グラフィカルビルダーに表示されるSPSS Modelerをクリックします。
image

SPSS Modeler Flowの作成画面が表示されたら、以下の通り設定しCreateをクリックします。

フィールド 設定値
Name Hands-on
環境定義 Default SPSS Modeler S(2 vCPU 8GB RAM)

image

少し待つと、SPSS Modeler Flowが利用できる様になります。
image

3. データの読み込み

このリポジトリをダウンロードし、dataフォルダに入っている以下のCSVファイルをすべて画面右側の点線で囲まれた部分にドラッグ&ドロップします。

ファイル名
エラー.csv
エラー_予測.csv
温度.csv
温度_予測.csv
電力.csv
電力_予測.csv

image

インポートパレットから、データ資産ノードをフロー・キャンバスにドラッグ&ドロップします。
image

データ資産ノードをダブルクリックまたは、右クリックし開くをクリックします。
image

データ資産の選択画面が表示されたら、データ資産 > 電力.csvと選択し、条件抽出をクリックします。
image

タイプセクションを選択します
値の読み込みをクリックし、下の表に列名などが表示されたらM_CD指標名義に変更します。
再度値の読み込みをクリックし、保存をクリックします。
image

先ほど配置したノードの名前が電力.csvに自動で切り替わります。
image

同様の手順で、温度.csvエラー.csvをフロー・キャンバスに追加します。
温度.csv指標で変更するのはM_CD
エラー.csv指標で変更するのはマシンコードERR_CDです。 image

余裕のある方は、任意のノードを右クリックして、データのプレビューを選択してみてください。
読み込んだデータの中身を画面上で確認することができます。
image

4. データ加工(列名変更)

用意されたデータの中身を確認すると、列名に揺らぎがあることが確認できます。
後々、データを加工する際同じ列名の方が便利なため、列名を統一します。
image

フィールド操作パレットから、フィルターノードをフロー・キャンバスにドラッグ&ドロップし、エラー.csv → フィルターと接続します。
image

ノード同士の接続方法
接続元のノードにマウスカーソルを置くと、>マークが表示されます。
>マークをドラッグし接続先のノードの上で離すとノードの接続ができます。
index

フィルターノードをダブルクリックまたは、右クリックし編集をクリックします。
出力フィールドマシンコードM_CD起動時間UP_TIMEに変更し、保存をクリックします。
image

データの加工が意図した通りにできているか確認をします。
出力パレットから、ノードをフロー・キャンバスにドラッグ&ドロップし、フィルター → 表と接続します。
image

表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

実行結果は、右上にある赤枠のアイコンをクリックし、出力タブに切り替えることで確認できます。
image

列名が変換できました。
image

5. データ加工(レコード結合)

3つのCSVファイルをマシンコードと起動時間をキーに1つのテーブルに結合します。
image

レコード操作パレットから、マージノードをフロー・キャンバスにドラッグ&ドロップし、
電力.csv → マージ
温度.csv → マージ
フィルター → マージ (エラー.csvから接続しない様に注意)
と接続します。
image

マージノードをダブルクリックします。
マージ法にキーを選択し、列の追加をクリックします。
image

M_CDとUP_TIMEをONにし、OKをクリックします。

それぞれの入力データに同じ名前のキー項目が含まれているので複数表示されていますが、どれを選んでも問題ありません。 自動で先頭のキー名がONになります。

image

保存をクリックします。
image

再度、マージノードによって得られるデータが意図したものか確認するため、一度表ノードに出力します。
ノードを使い回しするため、先ほど使用したフラグ設定と表の接続を解除してください。

ノードの接続解除方法
削除したい接続(→)を右クリックし、削除をクリックすると接続が解除できます。
image

接続の解除ができたら、マージ → 表と接続します。
image

表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

上手くM_CD, UP_TIMEをキーに3つのテーブルを結合できました。
image

マージは、キーとなる項目が必要です。
各入力データでキーとなる項目名は同じである必要があります。
キー項目の名称が異なる場合は、先ほど実施した様にマージの前に項目名を変更するノード(フィルターノード)を使用します。
例)マシンコード → M_CDなど

(Option)キャッシュ

SPSSにはキャッシュと言う便利な機能が提供されています。
基本的にはフローを実行すると、データの入力から出力まで全てのノードの処理が流れます。
データ量が少ない場合には特に問題が表面化しにくいのですが、大量のデータを処理する場合、毎回データの入力から処理を実行するのは時間がかかるので、その対策としてキャッシュを利用します。
任意のノードでキャッシュを有効にすると、1回目の処理結果をメモリ上に保持する様になり、2回目以降の実行時にはキャッシュからデータを取得してくれます。
image

キャッシュを設定したいノードを右クリックしcache > 有効にするを選択します。
image

キャッシュを有効にした直後は左側の白いアイコンが表示されます。
白いアイコンはまだキャッシュにデータが保持されていないことを意味し、一度キャッシュにデータが保持されると右側の黒いアイコンに変更されます。
image

6. データ視覚化(データ検査)

結合がひとまず出来た段階でデータの可視化を行い、欠損値があるか確認します。

出力パレットから、データ検査ノードをフロー・キャンバスにドラッグ&ドロップし、マージ → データ検査と接続します。
image

データ検査ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

各項目のグラフ描画・基本的な統計量算出・欠損値の検査を網羅的に行い、想定外の値・分布・欠損値が確認できます。
電力と温度に欠損値が存在することがわかったため、データを加工しましょう。
image

7. データ加工(条件抽出)

欠損値を含む温度(データとしては3行)を使用するデータから除外します。

レコード操作パレットから、条件抽出ノードをフロー・キャンバスにドラッグ&ドロップし、
マージ → 条件抽出
条件抽出 → 表
と接続し直します。
image

ノードの割り込み方法
既存の接続間にノードを追加したい場合、→の上に追加したいノードをドラッグ&ドロップすることで簡単に追加することができます。
image

条件抽出ノードをダブルクリックします。
式の下にあるアイコンをクリックし、欠損値を除外する式を作成します。
image

式ビルダーが表示されたら、フィールドをクリックし、式を手入力するか以下の手順で作成し、OKをクリックします。

  1. TEMPをダブルクリック
  2. **/=**をクリック
  3. '$null$'(半角・小文字)を入力

image

式が下記画像の状態になっていることを確認してください。
image
違っていた場合、以下の式へ修正してください。

TEMP /= '$null$'

保存をクリックします。

image

表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

5802レコードの中から3レコード除外したため、5799レコードが取得できました。
image

今回は省きますが、データ検査ノードを条件抽出ノードに再接続して、本当に欠損値を含むレコードを除外できているか確認すると良いでしょう。

8. データ加工(置換)

欠損値を含む電力(データとしては1行)を1つ前のデータを利用して置換します。

フィールド操作パレットから、置換ノードをフロー・キャンバスにドラッグ&ドロップし、
条件抽出 → 置換
置換 → 表
と接続し直します。
image

置換ノードをダブルクリックし、列の追加をクリックします。
image

POWERをクリックし、OKをクリックします。
image

置換NULL値を選択し、置換文字列には以下の式を入力します。

if @OFFSET(M_CD,1) = M_CD then
 @OFFSET(POWER,1)
else
 0
endif

保存をクリックします。
image

この手順で追加した条件式は、1行前のマシンコードを参照(@OFFSET(M_CD,1))して、自分と同じマシンコードなら1行前の電力(@OFFSET(POWER,1))に置換し、異なる場合は0に置換します。

表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

マシンコード1000番の1秒時点の部分が欠損値だったため、値が置換されていることを確認します。
image

余裕のある方は、置換前(条件抽出ノードまで)のデータを表に出力して、マシンコード1000番のPOWER列を確認してみてください。 今回置換した1秒時点のデータが空白(null)になっていることが確認できます。

9. データ加工(特徴量抽出)

生データから、予測に役立つ特徴量を抽出します。
適切なデータを利用して適切な特徴量を設定することが、予測分析の精度を向上するための最も有効な方法です。
今回は各行に直近3秒分の電力と温度をすでに持っているので、このデータを利用して、その中の最大値・最小値を算出します。
image

フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、置換 → フィールド作成と接続します。
image

フィールド作成ノードをダブルクリックし、派生フィールド名に生成する列名としてPOWER_MAX3と入力します。
式にPOWER_1~POWER_3の中の最大値を取得する以下の式を入力します。

max_n(@FIELDS_BETWEEN('POWER_1', 'POWER_3'))

保存をクリックします。
image

同様の手順で電力の最小値も作成します。

フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、POWER_MAX3 → フィールド作成と接続します。
フィールド作成ノードをダブルクリックし、派生フィールド名に生成する列名としてPOWER_MIN3と入力します。
式にPOWER_1~POWER_3の中の最小値を取得する以下の式を入力します。

min_n(@FIELDS_BETWEEN('POWER_1', 'POWER_3'))

保存をクリックします。
image

温度の最大値と最小値も作成します。

POWER_MAX3とPOWER_MIN3を選択し、コピー&ペーストします。
image

ノードの範囲選択方法
キーボードのShiftキーを押すとノードを範囲選択できます。
image

(コピー元の)POWER_MIN3 → (コピー先の)POWER_MIN3と接続します。 image

(コピー先の)POWER_MIN3をダブルクリックし、派生フィールド名に生成する列名としてTEMP_MIN3と入力します。
式にTEMP_1~TEMP_3の中の最小値を取得する以下の式を入力します。

min_n(@FIELDS_BETWEEN('TEMP_1', 'TEMP_3'))

保存をクリックします。
image

(コピー先の)POWER_MAX3をダブルクリックし、派生フィールド名に生成する列名としてTEMP_MAX3と入力します。
式にTEMP_1~TEMP_3の中の最大値を取得する以下の式を入力します。

max_n(@FIELDS_BETWEEN('TEMP_1', 'TEMP_3'))

保存をクリックします。
image

表ノードをTEMP_MAX3に接続し直し、右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

直近3秒分の電力と温度の最大値・最小値が算出できました。
image

これでデータの加工は完了です。
ここまでのキャッシュもTEMP_MAX3に設定しておきましょう。

10. モデル作成(決定木)

教師あり学習の一種である、決定木を用いて予測モデルを作成します。
エラーの確度が高いグループと低いグループに分岐していき、最終的に樹木の様に枝分かれした樹形図を作成します。

フィールド操作パレットから、パーティションノードをフロー・キャンバスにドラッグ&ドロップし、TEMP_MAX3 → パーティションと接続します。
image

フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、パーティション → タイプと接続します。
image

タイプノードをダブルクリックし、値の読み込みをクリックします。
ロールを以下の通り設定して保存をクリックします。

フィールド ロール
M_CD なし
UP_TIME なし
ERR_CD 対象
データ区分 パーティション
上記以外 入力

タイプノードで設定したロールは、モデルのルールに対して以下の様な意味を持ちます。

ロール 説明
両方 前提条件と結果両方の候補
入力 前提条件の候補
対象 結果の候補

モデル作成パレットから、C5.0ノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → C5.0と接続します。
C5.0ノード(ノード名がERR_CDになっています)を右クリックし、実行をクリックします。
image

C5.0のモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
image

モデルの詳細が表示されたら、特徴量の重要度を選択します。
この画面では、作成したモデルでエラーコードを予測する際に重要となる列(今回はTEMPが多くを占める)を示しています。
もし、上位に予測に関係がないと思われる列が入っている場合は、先ほどのタイプノードのロールをなしに変更してモデルを再作成します。 image

次に、ツリー図を選択します。
赤枠で囲った部分は、温度が253.5〜259.5かつ電力が863.5以下の場合、303のエラーが発生するルールを示しています。
image

11. モデル作成(Lasso回帰)

本ハンズオンでは列数が少ないため、人力で列の要不要が判断できますが、数百以上の列を含むデータを利用する際はそうはいきません。
そこで不要と考えられる列を洗い出せる便利なノードを紹介します。
わかりやすい様に、今回は全く同じ意味を持つ列を1つ作成し動作を確認しましょう。

フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、TEMP_MAX3 → フィールド作成と接続します。
フィールド作成ノードをダブルクリックし、派生フィールド名にPOWER_COPY、式にPOWERを入力し、保存をクリックします。 image

フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、POWER_COPY → タイプと接続します。
タイプノードをダブルクリックし、値の読み込みをクリックします。
ロールを以下の通り設定して保存をクリックします。

フィールド ロール
M_CD なし
UP_TIME なし
ERR_CD 対象
上記以外 入力

image

モデル作成パレットから、GLEノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → GLEと接続します。
image

GLEノード(ノード名がERR_CDになっています)をダブルクリックします。
モデル選択を開き、モデル選択または正則化を使用するのチェックをONにし、保存をクリックします。
GLEノードを右クリックし、実行をクリックします。
image

GLEのモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
image

モデルの詳細が表示されたら、パラメーター推定値を選択します。
先ほど作成した不要な列POWER_COPYを確認すると、使用されていないことがわかります。
分析の際にどの列を採用すれば良いかわからない場合はまずはこのLasso回帰を試してみても良いでしょう。
image

12. 学習とテスト

作成した予測モデルの予測精度を検証します。
パーティションノードによって実績データの一部を学習用に、残りをテスト用に分割して実施します。
image

出力パレットから、解析ノードをフロー・キャンバスにドラッグ&ドロップし、ERR_CD → 解析と接続します。
image

解析ノードをダブルクリックし、一致行列のチェックをONにして、保存をクリックします。
image

解析ノードを右クリックし、実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
image

学習・テストの両方に対して、正答率などを表示できます。
目標としている精度を達成しているかや、過学習(学習データに対しては予測精度が高いのに、テストデータに対しては精度が低いこと)が発生していないかの確認ができます。
image

13. 予測ステップ

学習ステップで行ったデータ加工と同じ処理を予測データに対して実施します。

データの読み込みステップと同様の手順で、電力_予測.csv温度_予測.csvエラー_予測.csvをフロー・キャンバスに追加します。
image

学習ステップから、赤枠で示したノード(フィルター・マージからTEMP_MAX3まで)をまとめてコピー&ペーストします。
image

電力_予測.csv → マージ温度_予測.csv → マージエラー.csv → フィルターと接続します。
image

先ほどと同様に学習ステップから、C5.0のERR_CDモデルナゲットをコピー&ペーストし、TEMP_MAX3 → ERR_CDと接続します。
image

出力パレットから、ノードをフロー・キャンバスにドラッグ&ドロップし、モデルナゲット → 表と接続します。
image

表ノードを右クリックし、実行をクリックし予測結果を見てみます。
image

予測用として渡したデータに対して、その時点で発生するだろうと予想されるエラーコードとその確度を提示しています。
今回使用したデータでは「63〜65秒は98%くらいの確率でエラーは発生しないが、66秒目の電力・温度が上昇しているタイミングからは98%くらいの確率で202のエラーが発生する。」と言う結果が得られました。

予測結果はモデルによって自動で命名された列が追加されます。 予測結果は画面への表示だけでなく、ファイルやRDBへの書き出しや作成したモデルを保存しアプリケーションから実行することも可能です。

image

以上で本ハンズオンは終了です。お疲れ様でした。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published