波形分類器を作る(第1回目)

# 目的(全体)
いろんな波形データの分類器のモデルを作る。

# 本記事の目的
まず何をしなきゃいけないか調べる。

# 対象のデータ
対象のデータとしては、たとえばこういうのでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/743e3b10-36cd-9a69-47d4-5cf65e187376.png)

こういうデータは比較的きれいなので分類するにもっていうのがあるかもしれません。

一方で、こういった異常なデータが混じるとわかりやすいのかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/6c59729c-c312-30f4-790a-1223848f2d0f.png)

こういうのは異常検知でよく使われると思います。

今回実装したい機能としてはあくまで分類器なので、上記のような異常検知とはちょっと違うアプローチが必要かと思います。また、時系列データの予測とかでもないので、なかなか要件に合うモデルがないのが難点です。

# モデルの作成に必要なこと
分類したい波形データをとりあえず集めることと、そのモデルを作りこみが必要かと思います。また、波形データから色んな指標で特徴量を抽出するアプローチが必要です。したがって、まずは特徴量抽出を軸に話をすすめていきたいと思います。

## 時系列データの特徴量について
時系列データの特徴量について主に次のようなものが考えられます。

- 移動平均線
- 周波数解析(フーリエ変換)
- ウェーブレット解析

## tsfreshでの特徴量
tsfreshでの特徴量を一覧にしました。（需要はないと思う・・・。）77個もあるんですね・・・。見てるだけで吐きそうです。

|特徴量名|詳細|
|---|---|
|abs_energy(x)|時系列の絶対エネルギーを返します。これは二乗値の合計です。|
|absolute_maximum(x)|時系列 x の絶対値の最大値を計算します。|
|absolute_sum_of_changes(x)|系列xの連続した変化の絶対値の合計を返します。|
|agg_autocorrelation(x, param)|時系列の自己相関に関する記述統計。|
|agg_linear_trend(x, param)|チャンクにわたって集計された時系列の値と、0 からチャンク数 - 1 までのシーケンスに対して線形最小二乗回帰を計算します。|
|approximate_entropy(x, m, r)|ベクトル化された近似エントロピー アルゴリズムを実装します。|
|ar_coefficient(x, param)|この機能計算機は、自己回帰 AR(k) プロセスの無条件最大尤度を適合します。|
|augmented_dickey_fuller(x, param)|時系列には単位根がありますか?|
|autocorrelation(x, lag)|指定されたラグの自己相関を式に従って計算する。|
|benford_correlation(x)|異常検出アプリケーションに有用である。|
|binned_entropy(x, max_bins)|まず、x の値を max_bins 個の等間隔のビンに分類します。|
|c3(x, lag)|C3統計を使用して時系列の非線形性を測定する|
|change_quantiles(x, ql, qh, isabs, f_agg)|まず、x の分布の分位数 ql と qh によって与えられる回廊を固定します。|
|cid_ce(x, normalize)|この関数計算機は時系列の複雑さ[1]を推定します（時系列が複雑になると、ピークや谷などが多くなります）。|
|count_above(x, t)|x 内の t より大きい値の割合を返します。|
|count_above_mean(x)|xの平均より大きいxの値の数を返します。|
|count_below(x, t)|x 内の t より小さい値の割合を返します。|
|count_below_mean(x)|xの平均より小さいxの値の数を返します。|
|cwt_coefficients(x, param)|次のように定義される「メキシカンハットウェーブレット」としても知られるリッカーウェーブレットの連続ウェーブレット変換を計算します。|
|energy_ratio_by_chunks(x, param)|N 個のチャンクのうちチャンク i の二乗和を、シリーズ全体の二乗和との比率として計算します。|
|fft_aggregated(x, param)|絶対フーリエ変換スペクトルのスペクトル重心 (平均)、分散、歪度、尖度を返します。|
|fft_coefficient(x, param)|高速フーリエ変換アルゴリズムによって実数入力の1次元離散フーリエ変換のフーリエ係数を計算します。|
|first_location_of_maximum(x)|x の最大値の最初の位置を返します。|
|first_location_of_minimum(x)|x の最小値の最初の位置を返します。|
|fourier_entropy(x, bins)|時系列のパワースペクトル密度のビン化されたエントロピーを計算します（ウェルチ法を使用）。|
|friedrich_coefficients(x, param)|ランジュバンモデルの決定論的ダイナミクスに適合した多項式h(x)の係数|
|has_duplicate(x)|x の値が複数回出現するかどうかをチェックします|
|has_duplicate_max(x)|xの最大値が複数回観測されるかどうかを確認します|
|has_duplicate_min(x)|xの最小値が複数回観測されるかどうかを確認します|
|index_mass_quantile(x, param)|時系列 x の相対インデックス i を計算します。ここで、x の質量の q% が i の左側にあります。|
|kurtosis(x)|x の尖度を返します (調整された Fisher-Pearson 標準化モーメント係数 G2 を使用して計算されます)。|
|large_standard_deviation(x, r)|時系列には大きな標準偏差がありますか?|
|last_location_of_maximum(x)|x の最大値の相対的な最後の位置を返します。|
|last_location_of_minimum(x)|x の最小値の最後の位置を返します。|
|lempel_ziv_complexity(x, bins)|Lempel-Ziv 圧縮アルゴリズムに基づいて複雑度の推定値を計算します。|
|length(x)|xの長さを返す|
|linear_trend(x, param)|時系列の値と、0 から時系列の長さから 1 を引いた値までのシーケンスに対する線形最小二乗回帰を計算します。|
|linear_trend_timewise(x, param)|時系列の値と、0 から時系列の長さから 1 を引いた値までのシーケンスに対する線形最小二乗回帰を計算します。|
|longest_strike_above_mean(x)|xの平均より大きいx内の最長連続部分列の長さを返します。|
|longest_strike_below_mean(x)|xの平均より小さいxの最長連続部分列の長さを返します。|
|matrix_profile(x, param)|1次元行列プロファイル[1]を計算し、Tukeyの5つの数値セットとその行列プロファイルの平均を返します。|
|max_langevin_fixed_point(x, r, m)|ランジュバンモデルの決定論的ダイナミクスに適合した多項式h(x)から推定されたダイナミクスの最大固定点:math:argmax_x {h(x)=0}`|
|maximum(x)|時系列 x の最高値を計算します。|
|mean(x)|xの平均を返します|
|mean_abs_change(x)|最初の差異の平均。|
|mean_change(x)|時系列の差異の平均。|
|mean_n_absolute_max(x, number_of_maxima)|時系列の n 個の絶対最大値の算術平均を計算します。|
|mean_second_derivative_central(x)|2次導関数の中心近似値の平均値を返します。|
|median(x)|xの中央値を返す|
|minimum(x)|時系列 x の最小値を計算します。|
|number_crossing_m(x, m)|x と m の交差数を計算します。|
|number_cwt_peaks(x, n)|x 内の異なるピークの数。|
|number_peaks(x, n)|時系列 x 内の少なくともサポート n のピークの数を計算します。|
|partial_autocorrelation(x, param)|指定されたラグにおける部分自己相関関数の値を計算します。|
|percentage_of_reoccurring_datapoints_to_all_datapoints(x)|一意でないデータ ポイントの割合を返します。|
|percentage_of_reoccurring_values_to_all_values(x)|時系列に複数回存在する値の割合を返します。|
|permutation_entropy(x, tau, dimension)|順列エントロピーを計算します。|
|quantile(x, q)|x の q 分位数を計算します。|
|query_similarity_count(x, param)|この機能計算機は、入力クエリ サブシーケンス パラメータを受け入れ、クエリ (Z 正規化ユークリッド距離) を時系列内のすべてのサブシーケンスと比較し、時系列内でクエリが見つかった回数 (事前定義された最大距離しきい値内) を返します。|
|range_count(x, min, max)|間隔[最小、最大)内の観測値をカウントします。|
|ratio_beyond_r_sigma(x, r)|x の平均から r * std(x) (つまり r 倍のシグマ) 以上離れた値の比率。|
|ratio_value_number_to_time_series_length(x)|時系列内のすべての値が 1 回だけ発生する場合は 1 を返し、そうでない場合は 1 未満の係数を返します。|
|root_mean_square(x)|時系列の二乗平均平方根 (rms) を返します。|
|sample_entropy(x)|x のサンプルエントロピーを計算して返します。|
|set_property(key, value)|このメソッドは関数のプロパティキーを値に設定するデコレータを返します。|
|skewness(x)|x のサンプル歪度を返します (調整された Fisher-Pearson 標準化モーメント係数 G1 を使用して計算されます)。|
|spkt_welch_density(x, param)|この機能計算機は、異なる周波数における時系列 x のクロスパワースペクトル密度を推定します。|
|standard_deviation(x)|xの標準偏差を返します|
|sum_of_reoccurring_data_points(x)|時系列に複数回存在するすべてのデータ ポイントの合計を返します。|
|sum_of_reoccurring_values(x)|時系列に複数回存在するすべての値の合計を返します。|
|sum_values(x)|時系列値の合計を計算します|
|symmetry_looking(x, param)|x の分布が対称的かどうかを表すブール変数。|
|time_reversal_asymmetry_statistic(x, lag)|時間反転非対称統計を返します。|
|value_count(x, value)|時系列 x 内の値の出現回数をカウントします。|
|variance(x)|xの分散を返す|
|variance_larger_than_standard_deviation(x)|分散は標準偏差よりも大きいですか?|
|variation_coefficient(x)|x の変動係数 (標準誤差 / 平均、平均の周りの変動の相対値を与える) を返します。|

注：翻訳はブラウザ標準ものを使いました。

# 所感
最近よく参考にしているサイトが消えるので、アーカイブしてます。

# REFERENCEs
https://www.salesanalytics.co.jp/category/software/sktime/

https://tsfresh.readthedocs.io/en/latest/text/list_of_features.html

https://qiita.com/yuki_edy/items/d978b3ff0f2e5024e669

https://qiita.com/takahashi-ry/items/e94e630a2088e8626c51

https://qiita.com/yuko1658/items/871df86f99a9134cc9ef

https://qiita.com/studio_haneya/items/b1757a68cd286a579d37

https://qiita.com/ParthenNucifera/items/e9efbb576efde965789e

# さいごに
お疲れ様でした！
次回(?)をお楽しみに！