こんにちは、ヒガシです。
先日私がAI系業務を行っていると、以下のような時系列データに遭遇しました。
途中まではなめらかなデータなんですが、途中で突然ノイズが乗ってくるというデータです。
なんとかこのノイズを除去したいと思い、FFT処理を試してみましたが、なかなか前半部分に影響をうけずに除去することできず・・・。
というわけで今回はこのデータからノイズをうまいこと除去できた方法を実際にプログラムを書きながらご紹介していこうと思います。
使用するデータのご紹介
先ほど紹介したデータは以下のような形でcsvファイルに保存されていることを想定して書いてきます。
要は1列目に時刻データ、4列目に取り扱いデータがあるcsvファイルです。
scipyを使ったノイズ除去方法
ノイズの除去方法は調べればいろいろ出てくると思いますが、今回はspicyというライブラリのsignal.savgol_filterという方法をご紹介したいと思います。
使い方は以下の通り。
import scipy.signal
smooth1=scipy.signal.savgol_filter(row_data, window, deg)
※smooth1がフィルター処理後の配列、row_dataが処理前の配列です。
また、windowはフィルタリングする際にどのくらいの区間のデータを 使用するか、degは使用するデータをつかって近似式を作るときの次数です。
windowの数値が大きいほどデータは滑らかになり、degが大きいほどノイズ成分が残りやすいです。どのような数値を設定すれば良いかはある程探索する必要がありますね。
scipyを使ったノイズ除去実演
それでは最初にご紹介したデータに対して、先ほど紹介したノイズ除去を適用してみようと思います。
以下がそのサンプルコードです。
#ライブラリ読み込み
import pandas as pd
import matplotlib.pyplot as plt
import scipy.signal
#データ読み込み
datafile='fft_data.csv'
data=pd.read_csv(datafile).values
row_data=data[:,3]
#フィルター処理開始
window=21
deg=3
smooth1=scipy.signal.savgol_filter(row_data, window, deg)
#グラフ作成
plt.plot(data[:,0], row_data)
plt.plot(data[:,0], smooth1)
plt.ylim(0,4)
plt.show()
スムージングしたいデータを変数row_dataに格納し、それを先ほどのscipy.signal.savgol_filterでスムージング化しています。
⇒スムージング後のデータはsmooth1という変数に格納されています。
こいつを実行すると以下のグラフが出力されました。
青がもとのデータ、オレンジがスムージング処理を行ったあとのデータです。
問題なくノイズ除去ができていますね。
おわりに
というわけで今回は時系列データからノイズを除去する方法をご紹介しました。
AIデータの前処理にぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント