# 时间序列预测中交互项的综合指南

• 时间序列预测中的交互项
• 建模复杂关系时交互术语的好处
• 如何在模型中有效地实现交互术语

## 时间序列预测中的交互项

### 先决条件

``````import numpy as np
import pandas as pd

from sklearn.linear_model import LinearRegression

import seaborn as sns
import matplotlib.pyplot as plt
``````

### 数据集生成

• 10 年的日常数据
• 时间序列中存在的重复模式（季节性）
• 前 7 年呈下降趋势
• 过去 3 年无趋势
• 随机噪声，作为最后一步添加
``````# for reproducibility
np.random.seed(42)

# generate the DataFrame with dates
range_of_dates = pd.date_range(
start="2010-01-01",
end="2019-12-30"
)
df = pd.DataFrame(index=range_of_dates)

# create a sequence of day numbers
df["linear_trend"] = range(len(df))
df["trend"] = 0.004 * df["linear_trend"].values[::-1]
df.loc["2017-01-01":, "trend"] = 4

# generate the components of the target
signal_1 = 10 + 4 * np.sin(df["linear_trend"] / 365 * 2 * np.pi)
noise = np.random.normal(0, 0.85, len(df))

# combine them to get the target series
df["target"] = signal_1 + noise + df["trend"]

# plot
df["target"].plot(title="Generated time series");
``````

### 培训基准模

``````X = df[["linear_trend"]]
y = df[["target"]]

lm = LinearRegression()
lm.fit(X, y)

df["model_1"] = lm.predict(X)

df[["target", "model_1"]].plot(title="Linear trend");
``````

### 添加断点

``````df["after_2017_breakpoint"] = np.where(df.index >= pd.Timestamp('2017-01-01'), 1, 0)

X = df[["linear_trend", "after_2017_breakpoint"]]
y = df[["target"]]

lm = LinearRegression()
lm.fit(X, y)

df["model_2"] = lm.predict(X)

df[["target", "model_2"]].plot(title="Linear trend + breakpoint");
``````

• 拟合线显示垂直跳跃，该跳跃对应于新布尔特征的系数。
• 垂直跳跃恰好发生在功能激活的第一个日期（值为 1 而不是 0 ）。
• 在引入断点之前和之后，直线的斜率是相同的。
• 该模型试图通过在断点后的预测中添加固定的量来补偿不正确的斜率。

### 添加交互项

``````df["interaction_term"] = df["after_2017_breakpoint"] * df["linear_trend"]

X = df[["linear_trend", "after_2017_breakpoint", "interaction_term"]]
y = df[["target"]]

lm = LinearRegression()
lm.fit(X, y)

df["model_3"] = lm.predict(X)

df[["target", "model_3"]].plot(title="Linear trend + breakpoint + interaction term");
``````