在建模前转换响应变量

R 中的监督学习:回归

Nina Zumel and John Mount

Win-Vector, LLC

货币数据的对数变换

  • 金额数据:对数正态分布
  • 长尾,动态范围大(60–700K)
R 中的监督学习:回归

对数正态分布

  • 均值 > 中位数(约 50K vs 39K)
  • 以均值为预测会高估典型值
R 中的监督学习:回归

回到正态分布

对正态分布而言:

  • 均值 = 中位数(此处:4.53 vs 4.59)
  • 动态范围更合理(1.8–5.8)
R 中的监督学习:回归

流程

  1. 对结果取对数并拟合模型
     model <- lm(log(y) ~ x, data = train)
    
R 中的监督学习:回归

流程

  1. 对结果取对数并拟合模型
     model <- lm(log(y) ~ x, data = train)
    
  2. 在对数空间中做预测
     logpred <- predict(model, data = test)
    
R 中的监督学习:回归

流程

  1. 对结果取对数并拟合模型
     model <- lm(log(y) ~ x, data = train)
    
  2. 在对数空间中做预测
     logpred <- predict(model, data = test)
    
  3. 将预测值变换回原空间
     pred <- exp(logpred)
    
R 中的监督学习:回归

预测对数变换的结果:乘法误差

$log(a) + log(b) = log(ab)$

$log(a) - log(b) = log(a/b)$

  • 乘法误差:$pred/y$
  • 相对误差:$(pred - y)/y = \frac{pred}{y} - 1$

降低乘法误差可降低相对误差。

R 中的监督学习:回归

均方根相对误差

RMS 相对误差 = $\sqrt{ \overline{ (\frac{pred-y}{y})^2 }}$

  • 预测对数结果可降低 RMS 相对误差
  • 但模型的 RMSE 往往更大
R 中的监督学习:回归

示例:直接建模 Income

modIncome <- lm(Income ~ AFQT + Educ, data = train)
  • AFQT:调查前25年的能力测试得分
  • Educ:至调查时的受教育年限
  • Income:调查时的收入
R 中的监督学习:回归

模型表现

test %>% 
+     mutate(pred = predict(modIncome, newdata = test),
+            err = pred - Income) %>%
+     summarize(rmse = sqrt(mean(err^2)),
+               rms.relerr = sqrt(mean((err/Income)^2))) 
RMSE RMS 相对误差
36,819.39 3.295189
R 中的监督学习:回归

建模 log(Income)

modLogIncome <- lm(log(Income) ~ AFQT + Educ, data = train)
R 中的监督学习:回归

模型表现

test %>% 
+     mutate(predlog = predict(modLogIncome, newdata = test), 
+            pred = exp(predlog), 
+            err = pred - Income) %>%
+     summarize(rmse = sqrt(mean(err^2)),
+               rms.relerr = sqrt(mean((err/Income)^2)))
RMSE RMS 相对误差
38,906.61 2.276865
R 中的监督学习:回归

误差对比

log(Income) 模型:RMS 相对误差更小,RMSE 更大

模型 RMSE RMS 相对误差
基于 Income 36,819.39 3.295189
基于 log(Income) 38,906.61 2.276865
R 中的监督学习:回归

让我们来练习!

R 中的监督学习:回归

Preparing Video For Download...