如何在机器学习数据预处理中处理日期变量
How to handle date variable in machine learning data pre-processing
我有一个数据集,其中包含格式为 26-09-2017 15:29:32 的交易时间戳等变量。我需要找到销售的可能相关性和预测(比如在逻辑回归中)。我的问题是:
- 如何处理日期格式?我可以将它转换为一个数字吗(就像 excel 自动转换一样)?我应该把它分成更多的变量,比如日、月、年、小时、分钟、秒吗?还有其他可能的建议吗?
- 如果我想每年添加不同的周数怎么办?我应该添加像 342017(2017 年第 34 周)这样的变量吗?
- 我可以为季度问题 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考虑,参考下图。
我们可以使用以下转换来做到这一点:
我有一个数据集,其中包含格式为 26-09-2017 15:29:32 的交易时间戳等变量。我需要找到销售的可能相关性和预测(比如在逻辑回归中)。我的问题是:
- 如何处理日期格式?我可以将它转换为一个数字吗(就像 excel 自动转换一样)?我应该把它分成更多的变量,比如日、月、年、小时、分钟、秒吗?还有其他可能的建议吗?
- 如果我想每年添加不同的周数怎么办?我应该添加像 342017(2017 年第 34 周)这样的变量吗?
- 我可以为季度问题 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考虑,参考下图。
我们可以使用以下转换来做到这一点: