我在做一个预测模型,有一些时间特征,比如像月份和礼拜几,还有小时该怎么处理?
比方说,对于小时来说,0表示这个数据记录时间在0点到1点之间,20表示记录在20到21点之间。我是该用OneHotEncode把它转化为categorical变量呢,还是就把它当做正常的数值变量?用OneHotEncoder的话,我就损失了时间的连续性;用数值变量的话,明明23点和0点只差一个小时,但是在数值上却是相差最大的。
类似的,礼拜几,日期,分钟,都有这样的困扰出现。有什么好方法吗?
1个回答
我们可以不用OneHotEncoding,可以用极坐标来表示周期的变量。
我就拿小时举例吧,其他的都可以以此类推。
因为时间变量都是有周期性的,所以可以联想到极坐标(想象一下钟表)。不过为了表达原本时间上的连续性以及头尾的相接性,我们需要把原来的数据从一维变成两维的。比如原来是$h$,现在就转化$(\cos\frac{2\pi h}{24}, \sin\frac{2\pi h}{24})$。
比如原来的小时变量的数据位
H
0
1
17
23
就被转化为两个变量
H_cos H_sin
1.000 0.000
0.966 0.259
-0.259 -0.966
0.966 -0.259
这样我们就保证了时间的连续性和头尾相接性。
如果是分钟,就转化为$(\cos\frac{2\pi m}{60}, \sin\frac{2\pi m}{60})$.
如果是月份,就转化为$(\cos\frac{2\pi Mon}{12}, \sin\frac{2\pi Mon}{12})$.
机智的处理方法!
-
Steven0612
2017-04-11 02:24