在机器学习中编码日期时间的最佳实践

机器算法验证 机器学习 分类 特征工程
2022-03-25 13:10:53

我正在研究一个 Kaggle 问题(这个问题前段时间解决了,但是为了自学/练习而这样做),其中输出明显受到年份和月份的影响。在此处输入图像描述

原始日期时间数据提供年/月/日/小时信息,我觉得年和月可能是唯一必要的数据。因此,我目前已经修改了该功能,使数据仅由年和月表示(例如 2016 年 3 月将是 201603),并针对由年/月对组成的修改时间变量绘制每个结果。

正如您在此处看到的,第一个结果有一些轻微的季节性波动,而第三个和第四个结果有明显的季节性趋势。另一方面,第二个结果在 2015 年 5 月 (201505) 之后急剧下降。

对于我的模型预测,我想以某种有意义的方式将时间作为变量合并。这里最好的方法是什么?我可以假设数据中最早的时间段等于 1 并每月增加 1 并将变量视为名义类别变量吗?或者是其他东西?

谢谢

2个回答

您希望保留输入的周期性。一种方法是将日期时间变量分成四个变量:年、月、日和小时。然后,将这些(年份除外)变量中的每一个分解为两部分。

您为这三个变量(即月、日、小时)中的每一个创建一个正弦和余弦面,这将保留这样一个事实,即 24 小时比 21 小时更接近 0 小时,并且 12 月更接近月份1 到第 10 个月。

一个快速的谷歌搜索给了我一些关于如何做到这一点的链接:

我知道我留下了评论,但在这里明确的是Feature-Engine 的 CylicalTransformer.

import pandas as pd
from sklearn.model_selection import train_test_split

from feature_engine.creation import CyclicalTransformer

df = pd.DataFrame({
    'day': [6, 7, 5, 3, 1, 2, 4],
    'months': [3, 7, 9, 12, 4, 6, 12],
    })

cyclical = CyclicalTransformer(variables=None, drop_original=True)

X = cyclical.fit_transform(df)

print(X.head())

>>    
      day_sin         day_cos          months_sin     months_cos
1    -0.78183         0.62349             1.0             0.0
2         0.0             1.0            -0.5        -0.86603
3    -0.97493       -0.222521            -1.0            -0.0
4     0.43388       -0.900969             0.0             1.0
5     0.78183         0.62349         0.86603            -0.5
6     0.97493       -0.222521             0.0            -1.0
7    -0.43388       -0.900969             0.0             1.0