循環的特徴量(Cyclical Features)

循環的特徴量(Cyclical Features)とは?

循環的特徴量(Cyclical Features)とは時系列データにおける周期性を持つ特徴量のことを指します。これは、データが一定の周期で繰り返されるパターンを持つ場合に重要です。代表的な例としては、1年の中で繰り返される季節(春夏秋冬)や、1週間の中で繰り返される曜日などがあります。

この記事では、周期性や季節性のパターンが明確に存在するデータを用意し、サイン・コサイン変換によって循環的なパターンを表現してみます。

データセットの用意

今回はKaggleにある、「Rain in Australia」データセットを用います。
オーストラリアにおける降水量データを含むデータセットで、主に気象データを使った分析や予測モデルの構築に利用されています。

環境はGoogle Corabです。
データをダウンロードして、読み込みます。

データの読み込み

import pandas as pd

data = pd.read_csv("./weatherAUS.csv")
data.head()

日付や、降水量、気温といったデータが確認できます。

日付をサイン・コサイン変換

Date列を日時型に変換し、それを基に年、月、日の情報を抽出します。
次に、月と日の情報を循環的特徴量としてエンコードします。循環的特徴量を生成するためにサインとコサインの変換を行います。

import numpy as np

data['Date']= pd.to_datetime(data["Date"])
data['year'] = data.Date.dt.year
data['month'] = data.Date.dt.month
data['day'] = data.Date.dt.day

def encode(data, col, max_val):
    data[col + '_sin'] = np.sin(2 * np.pi * data[col] / max_val)
    data[col + '_cos'] = np.cos(2 * np.pi * data[col] / max_val)

    return data

data = encode(data, 'month', 12)
data = encode(data, 'day', 31)

月と日について、循環的なパターンを可視化してみます。

import seaborn as sns

sns.scatterplot(x="month_sin", y="month_cos", data=data)

サイン・コサイン変換を使用することで、12月から1月への遷移が連続的で循環的なパターンとして表現されます。これにより、機械学習モデルは月の境界が連続していることを理解できるようになります。

sns.scatterplot(x="day_sin", y="day_cos", data=data)

また日についても、月末から月初への遷移が連続的に表現されます。