如何在机器学习数据预处理中处理日期变量

How to handle date variable in machine learning data pre-processing

我有一个数据集,其中包含格式为 26-09-2017 15:29:32 的交易时间戳等变量。我需要找到销售的可能相关性和预测(比如在逻辑回归中)。我的问题是:

  1. 如何处理日期格式?我可以将它转换为一个数字吗(就像 excel 自动转换一样)?我应该把它分成更多的变量,比如日、月、年、小时、分钟、秒吗?还有其他可能的建议吗?
  2. 如果我想每年添加不同的周数怎么办?我应该添加像 342017(2017 年第 34 周)这样的变量吗?
  3. 我可以为季度问题 2 做同样的事情吗?
#         Datetime               Gender        Purchase
1    23/09/2015 00:00:00           0             1
2    23/09/2015 01:00:00           1             0
3    25/09/2015 02:00:00           1             0
4    27/09/2015 03:00:00           1             1
5    28/09/2015 04:00:00           0             0

一些随意的想法:

日期是特征工程的良好来源,我认为没有一种方法可以在模型中使用日期。商业用户专业知识会很棒;是否有可以编码到数据中的观察到的趋势?

可能的功能建议包括:

  • 周末与工作日
  • 营业时间和时间
  • 季节
  • 一年中的第几周
  • beginning/end 个月(发薪日)
  • 季度
  • 天to/from一个动作事件(距离)
  • 数据缺失或不完整
  • 等等

所有这些都取决于数据集,大多数都不适用。

一些链接:

http://appliedpredictivemodeling.com/blog/2015/7/28/feature-engineering-versus-feature-extraction

https://www.salford-systems.com/blog/dan-steinberg/using-dates-in-data-mining-models

http://trevorstephens.com/kaggle-titanic-tutorial/r-part-4-feature-engineering/

循环特征编码

具有一组在循环中重复的唯一值的数据称为循环数据。与时间相关的特征本质上主要是循环的。例如,一年中的几个月、一周中的几天、几小时、几分钟等......这些特征有一组值,所有观察值都将仅来自这组值。在许多 ML 问题中,我们都会遇到这样的特征。事实证明,妥善处理这些特征有助于提高准确性。

实施

def encode(data, col, max_val):
    data[col + '_sin'] = np.sin(2 * np.pi * data[col]/max_val)
    data[col + '_cos'] = np.cos(2 * np.pi * data[col]/max_val)
    return data

data['month'] = data.datetime.dt.month
data = encode(data, 'month', 12)

data['day'] = data.datetime.dt.day
data = encode(data, 'day', 31)

逻辑

编码循环数据的常用方法是使用正弦和余弦变换将数据转换为二维。将每个循环变量映射到一个圆上,使该变量的最低值出现在最大值的旁边。我们使用 sin 和 cos 三角函数计算该点的 x 和 y 分量。

$x_{sin} = \sin(\frac{2 * \pi * x}{\max(x)})$

$x_{cos} = \cos(\frac{2 * \pi * x}{\max(x)})$

处理月份我们从0-11考虑,参考下图。

我们可以使用以下转换来做到这一点:

更多关于Feature Engineering Cyclic Features