0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

周期性特徴量の作り方 ~Sin/Cos変換で季節性をモデルに組み込む~

Posted at

はじめに

時系列データには、季節性や周期性といったパターンが隠れていることがよくあります.
たとえば、天候データでは一年を通じた季節変動が顕著に現れますが、単純に日付を数値としてモデルに入力しても、実際の季節の「近さ」は正しく表現されません.そこで、本記事では 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変換を利用した手法をデータセットに試し、モデルの精度向上に役立ててみてください!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?