独家 | 时间信息编码为机器学习模型特征的三种方法(附链接)

80e2cde36db57682695950185d4935bf.png

作者:Eryk Lewinson
翻译:张睿毅
校对:张睿毅


本文约4200字,建议阅读10分钟本文我们主要使用非常知名的Python包,以及依赖于一个相对不为人知的scikit-lego包。

标签:数据帧, 精选, 机器学习, Python, 技术演练

e12cb86fe03066c4efbb160601585e93.png

设置和数据

在本文中,我们主要使用非常知名的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");

4f24d56d57f1dcb015c023283cf15a9d.png

图 1:生成的时间序列。

然后,我们创建一个新的 DataFrame,在其中存储生成的时间序列。此数据帧将用于比较使用不同特征工程方法的模型性能。

results_df = y.to_frame()
results_df.columns = ["actuals "]

创建与时间相关的要素

在本节中,我们将介绍生成时间相关特征的三种老练方法。

在我们深入研究之前,我们应该定义一个评估框架。我们的模拟数据包含四年的观察结果。我们将使用生成的前 3 年的数据作为训练集,并将在第4年进行评估。我们将使用平均绝对误差 (MAE) 作为评估指标。

下面我们定义一个变量,该变量将用于分割两个集合:

TRAIN_END = 3 * 365

方法1:虚拟变量

我们从您很可能已经熟悉的东西开始,至少在某种程度上是这样。对时间相关信息进行编码的最简单方法是使用虚拟变量(也称为单热编码)。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值