将诸如月份和小时之类的功能编码为分类或数字?


23

在机器学习模型中将诸如月份和小时之类的特征编码为因子或数字更好吗?

一方面,我认为数字编码可能是合理的,因为时间是向前发展的过程(第五个月紧随其后的是第六个月),但另一方面,我认为由于周期性的原因,分类编码可能更合理年和天(第12个月后跟着第一个月)。

是否有通用的解决方案或约定?


在RF模型中定义一天中的小时(1到24)变量时,我遇到了同样的问题。如果我将变量转换为分类变量,则VarImp函数会显示每小时的重要性值,并且看起来非常混乱。我只是想知道是否有必要将“一天中的一小时”类型的数字变量转换为分类变量?
Mahmudur Ra​​hman

Answers:


19

您是否考虑过添加时间变量的(正弦,余弦)转换?这样可以确保例如0和23小时彼此接近,从而允许变量的周期性出现。

更多信息


有点问题,因为如果我这样做:sin(pi * X / 24)其中X在[0,23]中,我们在6 am和6 pm的评估结果与sin(pi * 6/24)== sin (pi * 18/24)。但是这些时间完全不同
Eran Moshe

可以这样循环:sin(pi * X / 12)。谢谢Eran:]
Eran Moshe

@EranMoshe fyi在上面链接的文章中使用的是2 * pi,因此将是sin(2 * pi * X / 12)-他们在评论中对此做了一些解释
tsando

它的(2 * pi X / 24)是(pi X / 12):]如您所见,我一直在为完全相同的问题而苦苦挣扎,作者是blog.davidkaleko.com/feature-engineering-cyclical-features.html挣扎着。在评论中,您可以看到“ Mariel G”正按照我逐渐意识到的纠正他:pi * X / 12会在一天中的整个小时中流通。我还要了解的是,您必须考虑其中的正负因素来定义一个真正的24小时周期!(您需要一个真实的圆,而不仅仅是一个周期性函数)
Eran Moshe

@EranMoshe啊是的,如果您想花几个小时做,那么它可以减少到piX / 12,但是如果您想做几个月,那么它将是2piX / 12,即pi / 6。因此,一般来说是2piX /期
tsando

9

答案取决于您要表示的时间特征与目标变量之间的关系。

如果将时间编码为数字,则对模型施加某些限制。对于线性回归模型,时间的影响现在是单调的,目标将随时间增加或减少。对于决策树,彼此接近的时间值将被分组在一起。

将时间编码为分类可以使模型具有更大的灵活性,但是在某些情况下,模型可能没有足够的数据来学习。一种可能有用的技术是将时间值一起分组为一定数量的集合,并将该集合用作分类属性。

一些示例分组:

  • 对于一个月,根据使用情况将其分为几个季度或季节。例如:1月-3月,4月-6月等。
  • 对于一天中的某个时段,请按时段分组:早上,晚上等,
  • 对于一周中的某天,分组为工作日和周末。

如果有足够的数据,上述每种方法也可以直接用作分类属性。此外,还可以通过数据分析发现分组,以补充基于领域知识的方法。


4

我建议使用数字功能。使用分类功能本质上意味着您不会将两个类别之间的距离视为相关的(例如,类别1和类别3一样接近类别2)。数小时或数月绝对不是这种情况。

但是,您提出的问题是,您希望以12和1接近11的方式表示小时和月份。为了实现这一点,我建议按照注释中的建议进行操作并使用在使用小时/月作为数值特征之前,使用正弦/余弦函数。


3

这取决于您使用的算法。

如果您使用的是诸如随机森林之类的基于树的算法,则只需传递此问题即可。分类编码对于基于树的算法不是必需的。

对于其他算法,例如神经网络,我建议尝试两种方法(连续和分类)。在不同情况下效果会有所不同。


它取决于基于树的实现。诸如scikit-learn和xgboost之类的广泛使用的软件包无法识别分类变量。您应该对它们进行一次热编码。
里卡多·克鲁兹

从这篇文章:趋向于datadata.com/…,您不应将任何热点用于基于决策树的任何事情,这几乎是我很难找到的方法。
阿什利

1

由于您拥有的所有数据均定义明确,因此建议您使用分类编码,该编码也更易于应用。


1

重新表述@raghu提供的答案。类别特征和数字特征之间的主要区别是数字的大小是否可比较,即2019年大于2018年,还是12月(12)比3月(3)大?并不是的。尽管这些数字具有顺序顺序,但它们的大小不可比。因此,转换为分类值可能更有意义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.