【问题标题】:How to handle date variable in machine learning data pre-processing如何在机器学习数据预处理中处理日期变量
【发布时间】:2018-03-07 19:40:45
【问题描述】:

我有一个数据集,其中包含交易的时间戳,格式为 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

【问题讨论】:

  • 这个问题非常广泛。 1)其次选择一种语言(R或Python)。 2)询问我们如何/最好的方式来处理您的数据不是这个网站的目的,这会引起太多的意见。 3) 要求一本书、工具、参考资料也是该网站的题外话。请查看这篇文章,了解什么适合 SO。 stackoverflow.com/help/on-topic
  • 感谢您的快速回复。问题对于机器学习问题非常具体,我问的是人们如何对待这类问题。标记 R 和 Python 的原因是因为可能有一些包可以帮助克服数据转换的障碍
  • 我理解你的问题,以及它在建模中的重要性。但这不是编程问题,即您没有代码、错误、不正确/意外/不一致的结果/输出。你甚至没有谈论你正在用你的预期输出/目标训练什么样的算法。如果您想讨论机器学习/建模的各种日期表示的优缺点,我建议Datascience Stackexchange
  • 其实我有。我说的是逻辑回归。事实上,我的第四个问题是题外话,我感谢你。不过,您对我的其余问题有什么贡献吗?例如如果我可以使用数字 42270 而不是 23/09/2015 00:00:00 会更好吗?我要添加另一个变量来显示吗?日期名称?
  • 首先,R 和 python 以人类可读的格式显示日期,但在内部将它们表示为从原始时间开始的秒或分钟或天(例如 1970-01-01)。您可以将日期列表示为星期几、季度 (1:4)、星期 (1:52)、主要假期的时间、上一次满月的时间、月份中的某一天、一年中的某一天 (1:365 ) 销售之间的时间、季节、从销售或促销开始的时间等等等等。真正的问题是你想如何解释你的模型变量?最后,R 和 python 有一些包可以让处理日期变得非常容易。

标签: python r machine-learning logistic-regression feature-selection


【解决方案1】:

一些随意的想法:

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

可能的功能建议包括:

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

这一切都取决于数据集,大多数都不适用。

一些链接:

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/

【讨论】:

  • @Charles 我目前正在尝试从一个动作事件开始的日子。但是,某些条目没有感兴趣的操作,或者该操作是第一次发生。我如何将其表示为功能?当然使用 0 意味着上一个动作和当前动作之间有 0 天,所以我不能那样使用它。
  • 这取决于您正在构建的模型。有些模型会接受 NULL 值,有些则不会。对于回归,您可能需要一个标志 - 请参阅:stats.stackexchange.com/questions/299663/…
【解决方案2】:

循环特征编码

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

实施

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.month
data = encode(data, 'day', 365)

逻辑

对循环数据进行编码的常用方法是使用正弦和余弦变换将数据转换为二维。将每个循环变量映射到一个圆圈上,使该变量的最小值出现在最大值旁边。我们使用 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

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2020-06-15
    • 2019-04-27
    • 2014-02-17
    • 2015-08-18
    • 2018-11-09
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多