単一ラベルの分類¶
ここでは、RAPID機械学習時系列数値解析 Python APIを用いた分析の例として、 センサーデータの中に、正常時の情報しかないようなデータに対して、 異常検知システムで異常を検知する予測モデルを作成し、 その予測モデルで予測して、予測結果を評価するシナリオを示します。
データを準備する¶
ユーザがアクセス可能なディレクトリにrapid-tsa-python-getting_started.zipを格納します。
格納したファイルを解凍します。
$ unzip rapid-tsa-python-getting_started.zip -d ~/work
[work/examples/classification_ocn] ディレクトリに移動します。
$ cd ~/work/examples/classification_ocn/
分析を実行する¶
1. 予測モデル作成¶
学習データを用いて予測モデルを作成します。
In [1]:
import os
from rapid_tsa_python import exec_train
ROOT_DIR = os.path.abspath(os.path.curdir)
DATA_DIR = os.path.join(ROOT_DIR, 'data')
preprocess_def_path = os.path.join(DATA_DIR, 'preprocess_def.json')
model_dir = os.path.join(ROOT_DIR, 'model')
exec_train('cls', '1DOCN', os.path.join(DATA_DIR, 'train_label_ocn.lab'), model_dir,
preprocess_def_path=preprocess_def_path, param_conf_path=os.path.join(DATA_DIR, 'train_param.conf'))
2. 結果評価¶
予測データと予測モデルを用いて予測を実行します。
In [2]:
from rapid_tsa_python import exec_predict
label_path=os.path.join(DATA_DIR, 'predict_label_ocn.lab')
result_dir = output_dir=os.path.join(ROOT_DIR, 'result')
exec_predict(model_dir, label_path=label_path, preprocess_def_path=preprocess_def_path, output_dir=result_dir,
param_conf_path=os.path.join(DATA_DIR, 'predict_param.conf'))
時刻ごとのラベルの実測値と予測値を表示します。
In [3]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df_actual = pd.read_csv(label_path).reset_index()
df_actual.columns = ['start', 'end', 'actual']
df_predict = pd.read_csv(os.path.join(result_dir, 'predict_label_ocn.result')).reset_index()
df_predict.columns = ['start', 'end', 'predict']
df_result = pd.DataFrame(np.zeros((len(df_predict), 2), dtype=object),
columns=['actual', 'predict'], index=df_predict['start'])
df_result['predict'] = df_predict.set_index('start')['predict']
for idx in range(len(df_actual)):
mask = (df_actual['end'][idx] >= df_predict['end']) & (df_actual['start'][idx] <= df_predict['start'])
df_result.loc[mask.values, 'actual'] = df_actual.loc[idx,'actual']
df_result.replace({'NG': 0, 'OK': 1.0}, inplace=True)
df_result.plot()
plt.xlabel("Time")
plt.ylabel("Label")
plt.yticks([0.0, 1.0],['NG', 'OK'])
plt.show()