作者:Eryk Lewinson
翻译:张睿毅校对:张睿毅
本文约4200字,建议阅读10分钟本文我们主要使用非常知名的Python包,以及依赖于一个相对不为人知的scikit-lego包。
标签:数据帧, 精选, 机器学习, Python, 技术演练
设置和数据在本文中,我们主要使用非常知名的Python包,以及依赖于一个相对不为人知的scikit-lego包,这是一个包含许多有用功能的库,这些功能正在扩展scikit-learn的功能。我们导入所需的库,如下所示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import date
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import FunctionTransformer
from sklearn.metrics import mean_absolute_error
from sklego.preprocessing import RepeatingBasisFunction
为了简单起见,我们使用自生成数据。在此示例中,我们使用人工时间序列。我们首先创建一个空的数据帧,其索引跨越四个日历年(我们使用pd.date_range)。然后,我们创建两列:
- day_nr – 表示时间流逝的数字索引
- day_of_year – 一年中的第一天
最后,我们必须创建时间序列本身。为此,我们将两条变换的正弦曲线和一些随机噪声结合起来。用于生成数据的代码基于scikit-lego文档中包含的代码。
# 避免重复
np.random.seed(42)
# 生成日期的数据格式
range_of_dates = pd.date_range(start="2017-01-01",
End="2020-12-30")
X = pd.DataFrame(index=range_of_dates)
# 创建日期数据的序列
X["day_nr"] = range(len(X))
X["day_of_year"] = X.index.day_of_year
# 生成目标成分
signal_1 = 3 4 * np.sin(X["day_nr"] / 365 * 2 * np.pi)
signal_2 = 3 * np.sin(X["day_nr"] / 365 * 4 * np.pi 365/2)
noise = np.random.normal(0, 0.85, len(X))
# 合并获取目标序列
y = signal_1 signal_2 noise
# 画图
y.plot(figsize=(16,4), title="Generated time series");
图 1:生成的时间序列。
然后,我们创建一个新的 DataFrame,在其中存储生成的时间序列。此数据帧将用于比较使用不同特征工程方法的模型性能。
results_df = y.to_frame()
results_df.columns = ["actuals "]
创建与时间相关的要素
在本节中,我们将介绍生成时间相关特征的三种老练方法。
在我们深入研究之前,我们应该定义一个评估框架。我们的模拟数据包含四年的观察结果。我们将使用生成的前 3 年的数据作为训练集,并将在第4年进行评估。我们将使用平均绝对误差 (MAE) 作为评估指标。
下面我们定义一个变量,该变量将用于分割两个集合:
TRAIN_END = 3 * 365
方法1:虚拟变量
我们从您很可能已经熟悉的东西开始,至少在某种程度上是这样。对时间相关信息进行编码的最简单方法是使用虚拟变量(也称为单热编码)。
让我们看一个示例。
X_1 = pd.DataFrame(
data=pd.get_dummies(X.index.month, drop_first=True, prefix="month")
)
在下面,您可以看到我们操作的输出。