はじめに
時系列データには、季節性や周期性といったパターンが隠れていることがよくあります.
たとえば、天候データでは一年を通じた季節変動が顕著に現れますが、単純に日付を数値としてモデルに入力しても、実際の季節の「近さ」は正しく表現されません.そこで、本記事では sin/cos変換 を利用して周期性を捉える特徴量の作り方を解説します.
なぜ周期性を考慮するのか
時系列データで「日付」をそのまま数値(例:1,2,3,…)で扱うと、線形的な変化しか捉えられない.
たとえば、1月1日(day=1)と12月31日(day=365)は遠く離れているように扱われ、実際の季節的な近さが表現できません...
これに対して、周期変換を行うと、1年という周期性をうまく反映させることができます.
具体的には、sinとcosに変換することで、1月1日と12月31日が平面上で近い位置にマッピングされ、季節ごとのパターンをより適切に学習させることができます.
Sin/Cos変換の基本
周期変換の基本的な考え方は、周期𝑇の関数として与えられた値𝑥をという2つの値に変換することです.
たとえば、1年を365日と仮定して、日付(day)列を周期変換するコードは以下のようになります.
$$
\sin\left(\frac{2\pi x}{T}\right), \quad \cos\left(\frac{2\pi x}{T}\right)
$$
#サンプルデータ(1~365日)
df = pd.DataFrame({'day': range(1, 366)})
#1年周期 (365日) での周期変換
df['day_sin'] = np.sin(2 * np.pi * df['day'] / 365)
df['day_cos'] = np.cos(2 * np.pi * df['day'] / 365)
df.head()
df.tail(5)
結果
day | day_sin | day_cos | |
---|---|---|---|
0 | 1 | 0.017213 | 0.999852 |
1 | 2 | 0.034422 | 0.999407 |
2 | 3 | 0.051620 | 0.998667 |
3 | 4 | 0.068802 | 0.997630 |
4 | 5 | 0.085965 | 0.996298 |
... | ... | ... | ... |
360 | 361 | -0.071815 | 0.997428 |
361 | 362 | -0.054624 | 0.998514 |
362 | 363 | -0.037431 | 0.999204 |
363 | 364 | -0.020237 | 0.999597 |
364 | 365 | -0.003041 | 0.999692 |
この変換により、
1月1日と12月31日が平面上で近くなり、季節の連続性が反映されます.
特徴量として加えることで、モデルは非線形な周期パターンを学習できるようになります.
まとめ
周期変換による特徴量エンジニアリングは、時系列データの持つ周期性を効果的にモデルに反映させる強力な手法です.
この記事で紹介したsin/cos変換を利用した手法をデータセットに試し、モデルの精度向上に役立ててみてください!!!