1

我想在机器学习模型中使用一年中的某一天。由于一年中的这一天不是连续的(2019 年的第 365 天之后是 2020 年的第 1 天),我想按照这个链接执行循环(正弦或余弦)变换。

但是,在每一年中,新的转换变量都没有唯一值;例如,同一年的两个值为 0.5,请参见下图。我需要能够在模型训练和预测中使用一年中的某一天。对于正弦变换中的 0.5 值,它可以在 31.01.2019 或 31.05.2019 上,然后使用 0.5 值可能会使模型混淆。

是否可以使模型在同一年内区分 0.5 的两个值?

我正在使用 Maxent 软件对物种的分布进行建模。物种数据在 20 年内每天都是连续的。我需要模型来捕获当天或季节的信号,而无需将它们中的任何一个明确用作分类变量。

谢谢

正弦变换 余弦变换

编辑1 基于以下furcifer的评论。但是,我发现增量建模方法对我的应用程序没有用处。解决了后续天数一致的问题;例如 30.12.2018、31.12.2018 和 01.01.2019。但这与从某个参考日(重量 = 1)开始计算天数没有什么不同。2019 年同一日期的价值远高于 2014 年,这在生态上没有意义。我希望从所使用的日常环境条件(解释变量)中捕捉到年际变化。我需要在模型中使用天的原因是为了捕捉迁徙物种分布的季节性趋势,而没有明确使用月份或季节作为分类变量。为了预测今天合适的栖息地,

4

2 回答 2

1

这是一个常见问题,但我不确定是否有完美的解决方案。我要注意的一件事是,您可能希望使用日期变量对两件事进行建模:

  • 季节性影响
  • 与季节无关的趋势和自相关

对于季节性影响,循环变换有时用于线性模型,但我看不出 ML 模型的意义——如果有足够的数据,你会期望在边缘有一个很好的连接,那么问题是什么?我认为您链接到的帖子会分散注意力,或者至少它们没有正确解释循环转换为何以及何时有用。我只会使用 dYear 来模拟季节性影响。

但是,不连续性可能是建模趋势/自相关/非季节性或年份间常见的时间序列变化的问题。出于这个原因,我会在模型中添加一个绝对日期,所以使用

y = dYear + dAbsolute + otherPredictors

一个经过良好调整的 ML 模型应该能够完成剩下的工作,但需要注意的是,如果你有足够的数据。

于 2020-03-31T14:54:14.960 回答
0

根据您的需要,这可能不是正确的选择,我想到了两个选择。

  1. 增量建模

在这种情况下,日期以线性方式建模,例如 2018 年 12 月 12 日 < 2019 年 12 月 12 日。

为此,您只需要某种形式的转换函数,将日期转换为数值。

由于有许多日期需要转换为数字表示,所以首先要确保输出列表也具有与 Lukas 提到的相同的顺序。最简单的方法是为每个单位添加权重(weight_year > weight_month > weight_day)。

def date2num(date_time):
  d, m, y = date_time.split('-')
  num = int(d)*10 + int(m)*100 + int(y)*1000 # these weights can be anything as long as 
                                             # they are ordered
  return num

现在,对数值进行标准化很重要。

import numpy as np
date_features = []
for d in list(df['date_time']):
  date_features.append(date2num(d))
date_features = np.array(date_features)
date_features_normalized = (date_features - np.min(date_features))/(np.max(date_features) - np.min(date_features))
  1. 使用日、月、年作为单独的特征。因此,我们不考虑整个日期,而是进行隔离。动机是输出与特定日期、月份等之间可能存在某种关系。例如,输出可能在夏季(特定月份)或周末(特定日期)突然增加
于 2020-03-28T10:37:40.543 回答