神经网络中日特征的优化构建

机器算法验证 机器学习 神经网络 特征工程
2022-01-23 17:19:29

在处理回归问题时,我开始考虑“一周中的一天”特征的表示。我想知道哪种方法效果更好:

  • 一个特点;星期一的值为 1/7;2/7 星期二...
  • 7 个特征: (1, 0, 0, 0, 0, 0, 0) 表示星期一;(0, 1, 0, 0, 0, 0, 0) 星期二...

由于网络配置差异,很难衡量它。(我认为隐藏节点的数量应该反映另外六个特征。)

所有特征的数量约为 20。我使用简单的反向传播来学习普通的前馈神经网络。

1个回答

对于像星期几这样的分类变量,您的第二种表示形式更为传统。

这也称为创建虚拟变量,是一种广泛使用的分类变量编码方法。如果您使用 1-7 编码,您是在告诉模型第 4 天和第 5 天非常相似,而第 1 天和第 7 天非常不同。事实上,第 1 天和第 7 天与第 4 天和第 5 天一样相似。同样的逻辑适用于一个月中的几天的 0-30 编码。

一个月中的一天有点棘手,因为虽然每个星期都有相同的 7 天,但并非每个月都有相同的 30 天:有些月份有 31 天,有些月份有 28 天。由于周和月都是周期性的,您可以使用傅立叶变换将它们转换为平滑线性变量。

例如(使用 R,我选择的编程语言):

day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

原始 vs 罪恶 vs 余弦

(我将正弦/余弦变量缩放为 0/30,而不是 -1/1,因此图表看起来更好)

如您所见,虽然原始的“月份变量”在每个月末跳回零,但正弦和余弦变换进行了平滑过渡,让模型知道一个月末的天数类似于下月初的几天。

您可以添加其余的傅立叶项,如下所示:

for(i in 1:3){
  s = sin((2*pi)/30*day_of_month + 30 * i/4)
  c = cos((2*pi)/30*day_of_month + 30 * i/4)
  lines(15*s+15 ~ day_of_year, col='blue')
  lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

完成转换

每对正弦/余弦波组成一个圆圈:

m <- lapply(1:4, function(i){
  as.matrix(
    data.frame(
    s = sin((2*pi)/30*day_of_month + 30 * i/4),
    c = cos((2*pi)/30*day_of_month + 30 * i/4)
    )
  )
})
m <- do.call(cbind, m)
pairs(m)

圆圈 这个页面对如何操作正弦波和余弦波有一个非常方便的解释。