0) 和 2) 移动平均模型。假设我们得到的只是以下时间序列数据
time y
1: 0 -12.070657
2: 1 4.658008
3: 2 14.604409
4: 3 -17.835538
5: 4 11.751944
...
看起来像这样:

就这个玩具示例而言,它本质上是罪(时间)+ 干扰(您可以在下面找到 R 代码)。这个奇怪的移动平均线或最简单的时间序列模型是什么意思?我谈论将 y 的过去值添加为新列。让我们来k=3例如,那么每次t我们增加yt−1,yt−2,yt−3作为新列:
time y y_past_1 y_past_2 y_past_3
1: 0 -12.070657 NA NA NA
2: 1 4.658008 -12.070657 NA NA
3: 2 14.604409 4.658008 -12.070657 NA
4: 3 -17.835538 14.604409 4.658008 -12.070657
5: 4 11.751944 -17.835538 14.604409 4.658008
6: 5 14.331069 11.751944 -17.835538 14.604409
考虑t=3. 为了这,t−1=2和y_past_1(y 在当前时间点之前的值t=3) 是值yt−1=y2=14.604409. 类似地,t−2=1和y_past_2(y 在当前两个时间步长之前的值t=3) 是yt−2=y1=4.658008.
现在人们首先要做的是计算一个(线性)模型y作为目标变量,`y_past_1, ..., y_past_k$ 作为输入特征。这些也称为“滞后”变量,因为它们与目标变量相同,只是时间分量有一点滞后。
现在让我们计算一个线性模型。我得到的基本上是
y ~ 0.4320*y_past_1 + 0.2457*y_past_2 + y_past_3*0.2361 + 0.3070

咦,怎么可能我们计算了一个线性模型,结果却不是线性的呢?发生这种情况是因为函数time -> y_time不是线性的,即线性模型应用于“非线性值对”,(y_past_1, y_past_2, y_past_3)但仍然将它们线性相加。
这就是我所说的简单时间序列模型的意思:将某个变量的过去作为预测新状态的输入。
注意:我们没有讨论K. 这个参数作为一个平滑因子,即在时间序列方面,它决定了预测将是一个所谓的高通滤波器(K 小,不过滤掉突然的运动,即高频,K 大,那么预测如下sin 函数更平滑,不会被目标变量的突然移动“愚弄”:
K=1:

K=10
:)
1)我的意思是以下。假设我们考虑产品 PIZZA。我们有两个用户,A 和 B。在去年,我们向每个用户发送了 20 封披萨的广告电子邮件。用户 A 确实响应了 15 次购买比萨饼,而用户 B 完全没有响应。现在让我们说,在当天我们再次看到用户 A 和用户 B,并且我们有向他们发送广告电子邮件的触发器。我们遍历我们所有的产品,然后我们得到了产品披萨。我们应该向 A 发送披萨广告吗?乙呢?[当然我们应该向 A 发送电子邮件,因为它的回复率很高,但我们可能不应该向 B 发送披萨广告,因为显然他/她根本不喜欢我们的披萨或披萨广告,或者有其他原因不回复]。以这种方式在每个时间点t我们应该包括过去t−1,...,t−K对于每个请求和每个用户。这意味着我们没有每个用户的“单一过去”,而是训练,但对于训练集中的每个请求,我们都有一个新的唯一“过去”......如上例所示:对于每个t,y_past_1有一个独特的价值,即yt−1. 但是,在您的示例中,我们不简单地采用yt−1,...,yt−K考虑到但它的一些功能是这样的:
对于用户给出的每个请求u每周t我们迭代每一个产品p并且对于每个产品p我们回去K=52周并检查我们发送用户的频率u产品的广告电子邮件p(数字sent),我们计算频率u收到电子邮件(数字)后一周内购买广告产品做出了积极响应positiveResponses,然后我们计算affinity = positiveResponses/sent并将其包含在当前请求的列中。通过这种方式,模型应该提出这样的规则,例如“如果对这个产品的亲和力很高,那么我应该为这个产品发送广告”。
从这个意义上说:您不使用过去每周的列,而是使用返回 52 周的每个产品。
3)您似乎担心模型无法找出某个规则,例如“只有当 X列和Y 列的值很高时才预测 TRUE,否则预测 FALSE”。但是,无论您从“复杂性第一联盟”中选择哪种模型(即,除了像神经网络这样的线性模型、像随机森林这样的树增强方法、梯度增强、像 SVM 这样的几何方法......)这些模型都可以计算如果只有数据告诉他们这样做(可证明!!!),则可以排除任意复杂的区域。例如:对于只有一个隐藏层的 NN(!),这 [我相信] 是著名的 Stone Weierstrass 定理(https://en.wikipedia.org/wiki/Stone%E2%80%93Weierstrass_theorem,只有一个隐藏层的 NN层形成代数)。
示例:支持向量机。将您的网络浏览器导航到https://www.csie.ntu.edu.tw/~cjlin/libsvm/。向下滚动到 java 小程序并放置两组不同的彩色点,然后稍微调整一下超参数 C 和 ga,您将看到如下结果:

这意味着即使(更复杂!)像您上面制定的规则最终也会被模型捕获。这就是我不会担心太多的原因。
编辑:R代码:
library(data.table)
set.seed(1234)
dt = data.table(time = 0:250)
dt = dt[, y := sin(time/100*2*pi)*30 + rnorm(dt[, .N], mean=0, sd = 10)]
plot(dt$time, dt$y, type="l")
lag = function(x, k, fillUp = NA) {
if (length(x) > k) {
fillUpVector = x[1:k]
fillUpVector[1:k] = fillUp
return(c(fillUpVector, head(x, length(x)-k)))
} else {
if (length(x) > 0) {
x[1:length(x)] = fillUp
return(x)
} else {
return(x)
}
}
}
K = 3
for (k in 1:K) {
eval(parse(text=paste0("dt = dt[, y_past_", k, " := lag(y, k)]")))
}
train = copy(dt)
train = train[K:dt[, .N]]
train = train[, time := NULL]
model = lm(y ~ ., data = train)
pred = predict.lm(object = model, newdata = train, se.fit = F)
train = train[, PREDICTION := pred]
plot(dt$time, dt$y, type="l")
train = train[, time := K:dt[, .N]]
lines(train$time, train$PREDICTION, col="red", lwd=2)
问候,
固件