今回の課題
Kaggleで時系列データ分析についてインプットをしていたところ、
ラグ特徴量という特徴量が出てきた。
使い所について、イマイチ理解ができなかったため、勉強することにした。
ラグ特徴量とは
今の時間の特徴だけに注目せずに、過去や未来の特徴を用いて、
現在のデータの特徴量を増やす方法。
ラグ特徴量を用いることで、機械学習モデルの予測精度を向上できる可能性がある。
(ラグ特徴量を追加するので、重回帰分析になる。)
過去のデータを特徴量として使い、機械学習モデルの予測精度を向上させたいときに使うことができる。
※参考:【機械学習】時系列データの前処理 -ラグ特徴量作成-
コード
1)関数を用意しておく
#指定したカラム、指定した単位でgroupbyして集計してデータフレームで返す関数
def grouped(df, key, freq, col):
# Grouperは、時系列をGroupbyするためのもの。key:groupbyするカラム。freq:集計する単位。
df_grouped = df.groupby([pd.Grouper(key=key, freq=freq)]).agg(mean = (col, 'mean'))
df_grouped = df_grouped.reset_index()
return df_grouped
# ラグ特徴量を追加するための関数
def add_lag(df, freq, col, lag):
df_grouped = grouped(df, key, freq, col)
name = 'Lag_' + str(lag)
df_grouped['Lag'] = df_grouped['mean'].shift(lag)
return df_grouped
※参考:【Python】pandas.Grouperで時系列データを楽々groupby!
2)Weeklyのラグ特徴量
# add_lag関数を呼び出して、ラグ特徴量を追加する
df_grouped_train_w_lag1 = add_lag(train_df, 'date', 'W', 'sales', 1)
df_grouped_train_m_lag1 = add_lag(train_df, 'date', 'M', 'sales', 1)
df_grouped_train_w_lag1.head()
3)ラグ特徴量を使って回帰モデルを可視化する
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(30,20))
axes[0].plot('Lag', 'mean', data=df_grouped_train_w_lag1, color='0.75', linestyle=(0, (1, 10)))
axes[0].set_title("Sales (grouped by week)", fontsize=20)
axes[0] = sns.regplot(x='Lag',
y='mean',
data=df_grouped_train_w_lag1,
scatter_kws=dict(color='0.75'),
ax = axes[0])
axes[1].plot('Lag', 'mean', data=df_grouped_train_m_lag1, color='0.75', linestyle=(0, (1, 10)))
axes[1].set_title("Sales (grouped by month)", fontsize=20)
axes[1] = sns.regplot(x='Lag',
y='mean',
data=df_grouped_train_m_lag1,
scatter_kws=dict(color='0.75'),
line_kws={"color": "red"},
ax = axes[1])
plt.show()
※seaborn.regplot
メソッドは、
2次元のデータと線形回帰モデルの結果を重ねてプロットする。
(2次元データは説明変数が複数あるので、回帰分析の種類は重回帰分析になる。)