使用带有 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 估计 log(目标)。如果您想要对目标进行估计,则需要对预测应用逆变换 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)$。 (这个
不过这里变化不大。)
我有一个目标变量向左倾斜的数据集。当我绘制此变量对数的直方图时,它是一个漂亮的、看起来很正常的分布。所以我认为我应该对它进行日志转换?
我在下面的 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 估计 log(目标)。如果您想要对目标进行估计,则需要对预测应用逆变换 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)$。 (这个
不过这里变化不大。)