ランナーの疲労検知のための時間系列分類 – チュートリアル

ランナーの疲労検知のための時間系列分類 - チュートリアルの手法によるステップバイステップガイド

ランナーのウェアラブルセンサーデータによる参加者間および参加者内分類のステップバイステップの操作説明

作者の画像

ウェアラブルセンサーから収集されたランニングデータは、ランナーのパフォーマンスや全体的なテクニックについての洞察を提供することができます。これらのセンサーから得られるデータは、通常、時間系列の性質を持っています。このチュートリアルでは、ランニングデータセットに対してタイムシリーズ分類手法を使用した疲労検出タスクが実行されます。このチュートリアルでは、時系列データは時系列から特徴量を抽出するのではなく、生の形式で使用されます。これにより、データに追加の次元が生じ、従ってデータを伝統的なベクトル形式で使用する従来の機械学習アルゴリズムはうまく機能しません。したがって、特定の時系列アルゴリズムを使用する必要があります。

データには、通常の状態と疲労状態のランナーからのモーションキャプチャーデータが含まれています。このデータは、アイルランドのダブリン大学で慣性測定ユニット(IMU)を使用して収集されました。このチュートリアルで使用するデータは、https://zenodo.org/records/7997851で見つけることができます。このデータは、’疲労’と’非疲労’の間を予測しようとする2値分類タスクを提示しています。このチュートリアルでは、専用のPythonパッケージScikit-learn(Python上の機械学習ツールキット)とsktime(時系列のための専用ライブラリ)を使用します。

データセットには複数のデータチャンネルが含まれています。ここでは、シンプルさのために問題を単変量問題としてモデル化し、データのチャンネルのうち一つだけを使用します。加速度信号の大きさを選択します。これは最もパフォーマンスの良い信号です[1, 2]。大きさ信号は、各方向成分の二乗和の平方根です。

データ収集と処理に関する詳細な情報は、次の論文に記載されています[1, 2]。

要約すると、このチュートリアルでは以下のことが行われます:

  • ウェアラブルセンサーから収集されたデータに最新の時系列分類技術を使用して時系列分類タスクが行われます。
  • ランナーの疲労検出において、参加者間モデル(グローバル化)と参加者内モデル(個別化)の使用方法の比較を行います。

分類タスクのセットアップ

まず、分析に必要なデータを読み込む必要があります。この評価では、「Accel_mag_all.csv」からデータを使用します。データをロードするためにpandasを使用します。このファイルがhttps://10.5281/zenodo.7997850からダウンロードされていることを確認してください。

import pandas as pdfilename = "Accel_mag_all.csv"data = pd.read_csv(filename, header = None)

分析を開始する前に、sktimeおよびsklearnパッケージからいくつかの関数が必要なため、以下のコードでそれらをロードします:

from sktime.transformations.panel.rocket import Rocketfrom sklearn.pipeline import make_pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import RidgeClassifierCV, LogisticRegression, LogisticRegressionCVfrom sklearn.model_selection import LeaveOneGroupOut

次に、ラベルと参加者番号を分離します。ここから、データは配列によって表されます。

import numpy as npX = data.iloc[:,2:].valuesy =  data[1].valuesparticipant_no =  data[0].values

このタスクでは、Rocket変換とRidge回帰分類器を使用します。Rocketは時系列分類のための最新の技術です[3]。Rocketは、ランダムな畳み込みカーネルを生成し、これらを時系列に沿って畳み込んでフィーチャーマップを生成することで機能します。フィーチャーマップに対してRidge分類器などの単純な線形分類器を使用します。Rocketを使用してデータを最初に変換し、特徴量を標準化し、最後にRidge分類器を使用して分類を行うパイプラインを作成できます。

rocket_pipeline_ridge = make_pipeline(    Rocket(random_state=0),     StandardScaler(),     RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)))

グローバル化された分類

複数の参加者からのデータがある場合、すべてのデータを一緒に使用すると、個々のデータがトレーニングセットとテストセットの両方に表示される可能性があります。この問題を回避するために、通常は一人を除いた場合の分析(LOSO)が行われます。つまり、モデルは一人を除いたすべての参加者でトレーニングされ、除外した参加者でテストされます。これは、モデルが参加者間で一般化できる能力をテストするための方法です。

logo = LeaveOneGroupOut()logo.get_n_splits(X, y, participant_no)Rocket_score_glob = []for i, (train_index, test_index) in enumerate(logo.split(X, y, participant_no)):    rocket_pipeline_ridge.fit(X[train_index], y[train_index])    Rocket_score = rocket_pipeline_ridge.score(X[test_index],y[test_index])    Rocket_score_glob = np.append(Rocket_score_glob, Rocket_score)

上記の結果の要約を出力します:

print("全体モデルの結果")print(f"平均精度:{np.mean(Rocket_score_glob)}")print(f"標準偏差:{np.std(Rocket_score_glob)}")print(f"最小精度:{np.min(Rocket_score_glob)}")print(f"最大精度:{np.max(Rocket_score_glob)}")

上記のコードの出力結果は次のとおりです:

全体モデルの結果平均精度:0.5919805636306338標準偏差:0.10360659996594646最小精度:0.4709480122324159最大精度:0.8283582089552238

このLOSO分析の精度は、いくつかのデータセットではランダムな推測と同じくらい悪い結果となっています。これは、一つの参加者のデータが他の参加者に一般化できないことを示しています。個人のセンシングデータを扱う場合、運動のテクニックや全体的な生理学は個人によって異なるため、この問題はよく発生します。さらに、このアプリケーションでは、疲労への適応方法も個人ごとに異なる可能性があります。モデルの性能を個別化して改善できるかどうかを見てみましょう。

個別化された分類

個別化モデルを構築する場合、予測は個々のデータに基づいて行われます。時系列データをトレーニングセットとテストセットに分割する際には、データがシャッフルされないようにする必要があります。これには、各クラスを個別のトレーニングセットとテストセットに分割し、トレーニングセットとテストセットの各クラスの比率を保持しながらデータの時系列性を保持する方法を使用します。ランにおける最初の2/3のデータを使用してモデルをトレーニングし、ランの最後の1/3に予測を行います。

Rocket_score_pers = []for i, (train_index, test_index) in enumerate(logo.split(X, y, participant_no)):        #print(f"Participant: {participant_no[test_index][0]}")    label = y[test_index]    X_S = X[test_index]        # 各クラスのインデックスを特定    class_0_indices = np.where(label == 'NF')[0]    class_1_indices = np.where(label == 'F')[0]        # インデックスを使用して各クラスをトレーニングセットとテストセットに分割    class_0_split_index = int(0.66 * len(class_0_indices))    class_1_split_index = int(0.66 * len(class_1_indices))    X_train = np.concatenate((X_S[class_0_indices[:class_0_split_index]], X_S[class_1_indices[:class_1_split_index]]), axis=0)    y_train = np.concatenate((label[class_0_indices[:class_0_split_index]], label[class_1_indices[:class_1_split_index]]), axis=0)        X_test = np.concatenate((X_S[class_0_indices[class_0_split_index:]],X_S[class_1_indices[class_1_split_index:]]), axis=0)    y_test = np.concatenate((label[class_0_indices[class_0_split_index:]], label[class_1_indices[class_1_split_index:]]), axis=0)        rocket_pipeline_ridge.fit(X_train, y_train)    Rocket_score_pers = np.append(Rocket_score_pers, rocket_pipeline_ridge.score(X_test,y_test))

上記の結果の要約を前と同じように出力します:

print("パーソナライズされたモデルの結果")print(f"平均正解率:{np.mean(Rocket_score_pers)}")print(f"標準偏差:{np.std(Rocket_score_pers)}")print(f"最小正解率:{np.min(Rocket_score_pers)}")print(f"最大正解率:{np.max(Rocket_score_pers)}")

上記のコードの出力:

パーソナライズされたモデルの結果
平均正解率:0.9517626092184379
標準偏差:0.07750979452994386
最小正解率:0.7037037037037037
最大正解率:1.0

モデルをパーソナライズすることにより、性能が劇的に向上します。したがって、このアプリケーションでは、他の人に一般化することに困難があることが明確です。

結論

ウェアラブルセンサーからの時系列データに分類を行うために、最先端の技術であるRocketを使用しました。この分析では、このドメインではモデルをパーソナライズすることが、より性能の良い分類モデルにつながることを示しました。

各参加者ごとのグローバル分類とパーソナライズ分類による正解率の比較

上記の図は、パーソナライズされたモデルを使用した場合の性能の大幅な向上を示しており、多くの参加者では性能がほぼ倍増します。個々の人の生理学的な違いや走行技術の違いが、この結果に貢献している可能性があります。ユーザーの観点からは、グローバルモデルとパーソナライズモデルの両方に利点があり、アプリケーションによって異なります。例えば、個々のユーザーの運動技術を監視する必要がある臨床設定では、パーソナライズモデルが有用です。ただし、正確な予測のためには、単一の個人から十分なデータを収集することは難しいため、多くのアプリケーションではグローバルモデルが理想的です。

このチュートリアルで示されたコードは、以下のGitHubで入手できます:https://github.com/bahavathyk/TSC_for_Fatigue_Detection

参考文献:

[1] B. Kathirgamanathan, T. Nguyen, G. Ifrim, B. Caulfield, P. Cunningham. Explaining Fatigue in Runners using Time Series Analysis on Wearable Sensor Data, XKDD 2023: 5th International Workshop on eXplainable Knowledge Discovery in Data Mining, ECML PKDD, 2023, http://xkdd2023.isti.cnr.it/papers/223.pdf

[2] B. Kathirgamanathan, B. Caulfield and P. Cunningham, “Towards Globalised Models for Exercise Classification using Inertial Measurement Units,” 2023 IEEE 19th International Conference on Body Sensor Networks (BSN), Boston, MA, USA, 2023, pp. 1–4, doi: 10.1109/BSN58485.2023.10331612.

[3] A. Dempster, F. Petitjean, and G. I.Webb. ROCKET: exceptionally fast and accurate time series classification using random convolutional kernels. Data Mining and Knowledge Discovery, 34(5):1454–1495, 2020.

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more