使用带有 log(target) 的模型进行预测时,我是否必须对预测函数进行任何更改?

When predicting using model with log(target) do I have to make any changes to predict function?

我有一个目标变量向左倾斜的数据集。当我绘制此变量对数的直方图时,它是一个漂亮的、看起来很正常的分布。所以我认为我应该对它进行日志转换?

我在下面的 my_model 中试过了。但是当我通过查看平均绝对误差对其进行评估时,我发现它在非对数转换版本中表现不佳。

my_model <- lm(target ~ ,var1+var2+var3, data=ptrain)
my_model_log <- lm(log(target) ~ ,var1+var2+var3, data=ptrain)

my_predictions <- predict(my_model_log, interval="prediction", newdata=test_submission)

my_predictions 使用日志模型时性能较低。

这是预期的吗?是否有一个参数我应该添加到 predict() 以告诉它目标在进行预测之前已经转换了蜜蜂日志?

如果您 predict(),它将 return 估计 l​​og(目标)。如果您想要对目标进行估计,则需要对预测应用逆变换 exp()。预测区间可能具有有趣的特性。

这实际上是一个统计问题,不是真正的编程...

有两个独立且可能相互冲突的问题:

  • 你的数据看起来正常吗? (你的看起来更像对数正态)
  • 你的解释变量作为加法还是乘法效果更好? (在你的情况下添加剂可能更好)

例如创建具有对数正态扰动的附加数据:

x1 <- runif(1000)
x2 <- runif(1000)
y <- 10*x1 + 10*x2 + rlnorm(1000, mean=0, sd=1)
dat <- data.frame(y, x1, x2)

该模型是可加的 (y = x1 + x2) 因此您可能只想使用 lm(y~ ...)。但它也有非正常的干扰,所以你可能 想要运行lm(log(y)~ ...)

测试模型:

日志版本

m <- lm(log(y)~x1 + x2, data=dat)
mean(abs(dat$y - exp(predict(m) + 0.208^2/2)))
[1] 1.579968

非日志版本

m <- lm(y~x1 + x2, data=dat)
mean(abs(dat$y - predict(m)))
[1] 1.198665

似乎在非对数模型中表现更好,尽管有错误 干扰,因为它得到 结构正确。

注意我预测日志版本为 exp(predict(m) + sigma^2/2) 因为 $E exp(X) = exp(mu + sigma^2)$ 其中 $X \sim N(0, sigma^2)$。 (这个 不过这里变化不大。)