機械学習 PR

【seglearn】時系列データと機械学習 -入門から実践まで-

ラベルを考慮した時系列データのセグメンテーション
記事内に商品プロモーションを含む場合があります

こんにちは。

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

今回は『時系列データと機械学習 -入門から実践まで-』について書きます。

本記事は以下の文章構成なので、好きな所から読んで下さい。

本記事の文章構成
  • 第0部:時系列データとseglearnの概要説明
  • 第1部:時系列データと機械学習 -入門編-
  • 第2部:時系列データと機械学習 -実践編-
  • 第3部:おまけ -本ブログのサポートについて-

※時系列データに機械学習を適用するときに便利なライブラリ seglearn をフル活用しました

時系列データとseglearnについて

実践の前に時系列データと seglearn について簡単な説明をしておきます。

時系列データの扱い方

時系列データとは?どんな前処理をするのか?などについては、以下の記事で説明しました。

【機械学習】時系列データの前処理 -ラグ特徴量作成-
時系列データの前処理 -ラグ特徴量作成-
【機械学習】時系列データの前処理 -ラグ特徴量作成-こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでも機械学習で色々やってます。 ...

なので上記の記事を読んでから本記事を読むことをオススメします。

本記事のメインは『時系列データの前処理から学習・推論までをハンズオン形式で学べるチュートリアル』です。

seglearnとは

seglearnについて、公式では以下のように説明しています。

This project is an sklearn extension for machine learning time series or sequences. It provides an integrated pipeline for segmentation, feature extraction, feature processing, and a final estimator compatible with sklearn model evaluation and parameter optimization tools. Seglearn provides a flexible approach to multivariate time series and contextual data for classification, regression, and forecasting problems. Support and examples are provided for learning time series with classical machine learning and deep learning models.

引用元:seglearn公式

翻訳サービスの DeepL を使って日本語にしたものが以下です。

DeepLによる翻訳

このプロジェクトは、時系列や系列を機械学習するためのsklearnの拡張機能です。これは、セグメンテーション、特徴抽出、特徴処理、およびsklearnモデル評価およびパラメータ最適化ツールと互換性のある最終推定器のための統合されたパイプラインを提供します。Seglearnは、分類、回帰、予測問題のための多変量時系列や文脈データへの柔軟なアプローチを提供します。古典的な機械学習や深層学習モデルを用いた時系列学習のためのサポートと例が提供されています。

DeepLすごい!さらに自分の言葉でコンパクトに言い換えると…

seglearnとは 時系列データのセグメンテーションから特徴抽出、学習までのパイプライン化が柔軟かつ簡単に実現できるsklearnの拡張機能 です。

入門!時系列データと機械学習 -seglearnチュートリアル-

seglearn の基本的な使い方を交えて『時系列データと機械学習 -入門編-』を説明します。

インストール

まずは、以下のコマンドで seglearn をインストールします(2020/03/29時点 ver 1.1.1)

pip install -U seglearn

以降からソースコードを書いていきます。

時系列データ作成

まずは適当な時系列データを作成します。

時系列データ

セグメンテーション

ここでいうセグメンテーションとは、以下のようにデータを区分けするという意味です。

時系列データのセグメンテーション

seglearnを活用すれば、以下のコードで簡単にセグメンテーションを実現できます。

  • セグメントテーションしたいデータをリスト化(コードp4参照)
  • 区分けする幅(width)は任意に変更できる(コードp7参照)

セグメンテーション(オーバーラップあり)

下図のようにオーバーラップを考慮してセグメンテーションしたいときもあります。

時系列データのセグメンテーション(オーバーラップあり)

そんなときは、以下のコードを使います。

  • オーバーラップ(overlap)の範囲を任意に変更できる(コードp2参照)
  • オーバーラップの範囲は0~1で設定
  • overlap=0.5とすると1つ前のデータを50%オーバーラップ

XとYをペアでセグメントテーション

教師あり学習でデータ:Xを分類をするときは、ラベル:Y(教師データ)が必要です。

セグメンテーションしたデータ:Xに対し、後からラベル付けしても良いのですが、既にラベル付けが完了しているデータセットも存在します。

ラベルを考慮した時系列データのセグメンテーション

上図のように4点のデータをセグメンテーションした場合、ラベル:yも4点から1点にする必要があります。

タスク次第ですが、seglearではlast/middle/meanのどれかをラベルに設定します。

過去データ(ラグ特徴量)が現時点のデータに影響することが既知なら、y_func = last とすれば良いと思います。

  • y_funcを任意に変更できる(コードp8参照)
  • y_func = lastと設定するタスクが多いと思う

【前知識】特徴量抽出の基本

説明の都合上、以降からは ある運動時の加速度データ を対象とします(下図参照)。

時系列データ

「どんな運動時のデータなのか?」については分からないと思いますが、前半と後半で明らかに違う運動をしていることは分かると思います。

ここで重要なのは「データのどの部分に着目して前半と後半を区別(クラス分け)したか?」です。

どの部分と聞かれても…
見れば明らかだし…

…と思った人いますか?

はやぶさ
はやぶさ
確かに見れば明らかなんだけど、言語化できないとアルゴリズム(機械学習含む)に落とし込むのが難しいよ
はやぶさ
はやぶさ
フクロウの”くるる”ちゃん@kururu_owl は分かるかな?
くるる
くるる
振幅と周波数と平均値(水準)に着目したよ♪

正解!くるるちゃんのように着目したパラメータを言語化できれば、そのパラメータを学習に使う特徴量とすればOKです。

実践!時系列データの特徴量抽出

seglearn の feature_functions を活用すれば、簡単に時系列データの特徴量を抽出できます。

例えば、セグメンテーションしたデータから最小値/最大値/平均値/標準偏差を抽出する場合、以下のようなパイプラインを作成します。

seglearnで時系列データのパイプライン作成

以下のコードでパイプラインにデータを流し込めば、時系列データのセグメンテーションから特徴量(最小値/最大値/平均値/標準偏差)抽出まで実現できます。

出力Xには特徴量, Yにはラベルが格納されます。以下のコードでセグメンテーションしたデータ(n番目)の特徴量とラベルを確認できます。

X[n] = [min, max, mean, std]
Y[n] = label  # 二値分類なら ”0” or ”1” など

実践!時系列データの特徴量抽出 -デフォルト編-

時系列データから、どんな特徴量を抽出するかで悩むときは、デフォルト設定がオススメです。

実践!時系列データの特徴量抽出 -all_features編-

all_features を使えば、より細かい特徴量を抽出することができます。

学習もパイプラインに組み込む

パイプラインに sklearn の機械学習アルゴリズムを組み込むこともできます。

以下のコードは 線形判別分析(LDA:Linear Discriminant Analysis) を組み込んだ例です。

フローは以下の通りです。

  1. 入力データ:xsをセグメンテーション
  2. 特徴量抽出(デフォルト設定)
  3. fitで学習(LDA採用)

推論

以下のコードでパイプラインにデータを流し込めば、推論結果を得ることができます。

出力Yがtransformしたラベル(y_func=lastを採用), y_pが推論結果です。

以上までが『時系列データと機械学習 -入門編-』でした。

(入門編 完)

スポンサーリンク

実践!時系列データと機械学習 -自前データ分類-

入門編で説明した内容を踏まえ、自前の時系列データを機械学習で分類してみます。

まずは以下の記事を参考に筋トレ時の加速度データを収集してください。

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

※腹筋 ⇒ 背筋をnセットやること

筋トレ(データ収集)が終わったら、今度は手を動かしてソースコードを書きましょう(*・ω・)ノ♪

Jupyter Notebookで動作確認しました

Import

まずはimportから

データ取得と可視化

以下のコードで筋トレ時の加速度データ(時系列データ)を取得します。

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

時系列データ

上図は1セットしか筋トレできなかった私のデータです(入門編でも使った図です)

ラベル付け

腹筋データには”0”, 背筋データには”1”をラベル付けします。1セットしか筋トレしてない人は、以下のコードでラベル付けできます。

連続でnセット筋トレした人はエクセルなどを使って手作業でラベル付けするか、ソースコードを自作してみて下さい。

データセット作成

入門編を参考にデータを変換後、データをtrain用とtest用に分割します。

testデータについて、以下の注意点があります。

  • 腹筋・背筋の両データが含まれていることを確認してください
  • 1セットしか筋トレしていない人は、testデータに背筋データしか含まれていない可能性があります

連続で筋トレが困難な人は、1セット目のデータをtrainデータとし、少し休んで2セット目のデータをtestデータとすると良いですよ(無理なく楽しく勉強しましょう)

パイプライン作成

以下のパイプラインを作成します。

学習とスコア確認

以下のコードで学習とスコア確認をします。

くるる
くるる
高み(ベストスコア)を目指すよー♪
はやぶさ
はやぶさ
ファイト―‼

参考までに私のベストスコアは以下でした。

score of test data: 0.9666666666666667

※筋トレ1セット目がtrainデータ、2セット目がtestデータです

推論

以下のコードで入力データに対する推論結果を得られます。

モデルの保存と読込み

以下のコードでモデル(パイプライン含む)の保存と読込みができます。

モデルを生成しておけば、次回からは学習せずにいきなり推論から実行できます。

ロードしたモデルで推論

本番を想定して、学習にも評価にも未使用なデータ(3セット目の筋トレデータ)に対し、ロードしたモデルによる分類をしてみます。

以上で『時系列データと機械学習 -実践編-』も終了です。

(実践編 完)

まとめ -時系列データと機械学習-

筋トレからプログラミングまでお疲れ様でした。

大変だったと思うけど本記事で『時系列データと機械学習』を楽しく学んでくれたら嬉しいです。

くるる
くるる
めっちゃ楽しかった~♪

くるるちゃんと同じ感想の人が沢山いると嬉しいです。

(本編 完)

おまけ -本ブログのサポートについて-

本記事の内容なら有料でも良い気がしたけど、無料公開にして多くの人に読んでもらうことを優先しました(無料でも手は抜かず、むしろ多くの手間と時間をかけて書き上げました)。

くるる
くるる
無料公開ありがとう!大変勉強になりました

フクロウの”くるる”が丁寧にお辞儀してる姿がすごく可愛い。

もし本記事が参考になり、ブログ『はやぶさの技術ノート』をサポートしたいという人がいれば、以下の方法でサポートして頂けると嬉しいです!

本ブログのサポート方法
  • 本ブログの記事をSNS(Twitterやfacebookなど)でシェア
  • ブログをやっている人ならリンクを張ってシェア
  • 本ブログで紹介した本などを購入
  •  LINEスタンプ 購入
  • 【くるるの野望ショップ】でフクロウグッズ購入

私のプロフィールにも書いていますが、学生さんや勉強したい人の”学び”を支援したいと考えています。

ブログ『はやぶさの技術ノート』では本記事も含め、多くのチュートリアル記事を無料で公開しています。SNSなどで友達にも教えてあげてほしいです!

また応援メッセージなどを頂けると、次も良い記事書きたいな!というモチベーションに繋がります。Twitterなどで気軽にコメントして頂けると嬉しいです。

くるる
くるる
よろしくお願いします
はやぶさ
はやぶさ
よろしくお願いします

(完)

PICK UP BOOKS

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