機械学習 PR

【機械学習】時系列データの前処理 -ラグ特徴量作成-

時系列データの前処理 -ラグ特徴量作成-
記事内に商品プロモーションを含む場合があります

こんにちは。

現役エンジニアの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでも機械学習で色々やってます。

今回は時系列データの前処理(ラグ特徴量)について勉強したので、備忘録も兼ねて本記事を書きます。

時系列データとは

時系列について、Wikipediaでは以下のように説明しています。

時系列(じけいれつ、英: time series)とは、ある現象の時間的な変化を、連続的に(または一定間隔をおいて不連続に)観測して得られた値の系列(一連の値)のこと。

引用元:Wikipedia

より直観的な説明をすると、データを可視化したとき横軸が時間なら、そのデータは時系列データといえます。

時系列データ

上図の縦軸が加速度センサの計測値、横軸が時間です。つまり、これも時系列データです。

センサ値の多くは時系列データです

機械学習のための前処理 -時系列データ編-

時系列データと機械学習を活用すれば、異常検出などを実現できます。

異常な時系列データ

上図の例だと、データ1点で異常か否かを判断できそうですが、以下のような3/4の天気を予測するタスクの場合はどうでしょう?

日時 3/1 3/2 3/3 3/4
降水確率(%) 30 65 80 90
天気(ラベル)

これも3/4の降水確率のみで☂と予測できるかもしれませんが…

3/2から天気が崩れ始め、前日の3/3は降水確率80%で☂なので、3/4も高確率で☂になると予測できます。

今度は以下の例を考えてみます。

日時 3/5 3/6 3/7 3/8
降水確率(%) 30 90 20 68
天気(ラベル)

降水確率68%なので☂か☀か微妙なところですが、過去データの傾向から☀と☂が交互に続いているので、3/8も☂と予測するのが正解かもしれません。

このように、過去データから現在のパラメータを予測できることがあります。

現時点のデータ1点で予測するより、過去データを活用した方が予測精度を向上できるタスクもあります

ラグ特徴量とは

上記の天気予報の例で説明した通り、過去データを特徴量とすることで、機械学習モデルの予測精度を向上できる可能性があります。

このとき使う過去データの特徴量をラグ特徴量と呼びます。

スポンサーリンク

実践!ラグ特徴量を生成する

様々なラグ特徴量があり、例えば以下のものが考えられます。

  1. 2日前のデータを特徴量とする
  2. 1~3日前のデータを特徴量とする

「2日ごとに(2日周期)で○○が発生しやすい」などの背景が既知なら、上記❶のラグ特徴量を作成するのが有効です。

「過去3日間の変化から○○が発生しやすい」などの背景が既知なら、上記❷のラグ特徴量を作成するのが有効です。

今回は「現在のデータ xx のラグ(過去データ1~4)」を特徴量とした以下のデータセットを生成します(y はラベル)。

ラグ特徴量

タスク応じて、どんなラグ特徴量を作成すべきか検討する必要があります

データ取得

まずは以下のコードでデータを取得します。

時系列データ

ちなみにxは筋トレ中の加速度です(詳細は以下の記事参照)。

振動の基礎
【データ分析入門】機械学習未使用!Pythonでゼロから始める振動解析機械学習(深層学習含む)によるデータサイエンスが流行っていますが、フーリエ解析などの振動解析により、異常検知を行うこともできます。本記事はデータ分析/振動解析学ぶための実践的なチュートリアル記事です。...

可視化

以下のコードで可視化できます。

時系列データ

データの前半が腹筋中の加速度、後半が背筋中の加速度です。

【前知識】ラグ取得

shift(n)を使えば、簡単にn周期前のデータを取得できます。

ラグ特徴量生成

以下のコードでlag1~nをまとめて取得できます(以下のコードは n=5 )。

ラグ特徴量

データフレーム連結

最初に取得したデータとラグ特徴量を連結します。

ラグ特徴量

ラベル付け

全データの内、腹筋データ(0~300行)はラベル”0”、背筋データ(300~最後まで)はラベル”1”とします。色んな方法がありますが、今回は NumPy を使います。

次にnumpyをdataframeに変換して、結合します。

ラグ特徴量

欠損データ削除

今回は欠損データ(NaN)がある最初の4行を削除します。

ラグ特徴量

以上でラグ特徴量をもつデータセットの完成です。

【補足】rolling関数で移動平均・最大・最初値を算出

rolling関数を活用することで、windowサイズの移動平均・最大値・最小値などを簡単に算出できます。

shift関数と組み合わせれば、n周期前のデータに対するwindowサイズの移動平均・最大値・最小値などの特徴量を作成できます(以下のコードは n=1, window=4)

これらの特徴量もタスク次第では有効です。

rolling関数を活用することで、手軽にフィルタ処理ができます。

まとめ -ラグ特徴量作成-

時系列データの前処理(ラグ特徴量)についてソースコード付きで説明しました。

機械学習は前処理が重要なので、タスクに応じて適切な前処理(特徴量作成含む)を実施したいですね。

本記事の内容が少しでも参考になれば嬉しいです。

はやぶさ
はやぶさ
時系列データから色んな情報を読み解けるとカッコイイですよ

おまけ -参考資料-

時系列データ解析について、タスク次第では機械学習ではなく、振動解析や信号処理が有効な場合もあります。

振動解析入門・信号処理入門の記事も書いてるので、良ければ参考にしてください。

機械学習未使用!Pythonでゼロから始める振動解析
振動の基礎
【データ分析入門】機械学習未使用!Pythonでゼロから始める振動解析機械学習(深層学習含む)によるデータサイエンスが流行っていますが、フーリエ解析などの振動解析により、異常検知を行うこともできます。本記事はデータ分析/振動解析学ぶための実践的なチュートリアル記事です。...
【信号処理入門】Hampelフィルタで外れ値検出(異常検知)
信号処理におけるフィルタのイメージ
【信号処理入門】機械学習未使用!Hampelフィルタで外れ値検出(異常検知) -Python-機械学習(深層学習含む)による異常検知が流行っていますが、信号処理のフィルタで外れ値検出(異常検知)を行うこともできます。本記事は信号処理の基礎から実践(フィルタ設計)まで実践的に学べるチュートリアル記事です。...

深層学習による時系列データ異常検知の概要を知りたい人は、以下の資料をオススメします(イラスト多めで分かりやすい)。

時系列データ含め多様なデータの分析技術を学びたい人には、以下の書籍をオススメします。

実用的なデータ分析技術を学べる良書

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python