【问题标题】:R regularize coefficients in regressionR 正则化回归中的系数
【发布时间】:2011-12-03 16:42:12
【问题描述】:

我正在尝试使用线性回归来找出 3 个模型的最佳权重来预测结果。所以有 3 个变量 (x1, x2, x3) 是因变量 y 的预测。我的问题是,如何在系数总和为 1 的约束条件下运行回归。例如:

这很好:

y = .2(x1) + .4(x2) + .4(x3) 

自从.2 + .4 + .4 = 1

这不好:

y = 1.2(x1) + .4(x2) + .3(x3)

自从1.2 + .4 + .3 > 1

如果可能,我希望在 R 中执行此操作。谢谢。让我知道是否需要将其移至统计数据区域(“交叉验证”)。

编辑:

问题是将每一行分类为 1 或 0。y 是来自训练集的实际值(0 或 1),x1 是来自 kNN 模型的预测值,x2 来自 randomForest,x3 来自gbm模型。我试图为每个模型获得最佳权重,因此每个系数

y/Actual value       knnPred      RfPred     gbmPred
      0                .1111       .0546       .03325
      1                .7778       .6245       .60985
      0                .3354       .1293       .33255
      0                .2235       .9987       .10393
      1                .9888       .6753       .88933
     ...                 ...         ...         ...

衡量成功的标准是 AUC。所以我试图设置系数以最大化 AUC,同时确保它们总和为 1。

【问题讨论】:

  • 这就是你要做的:构建一个小例子,列出你正在使用的包和创建你看到的输出的代码,然后有人可以提供建议。
  • mgcv 包提供了一个函数pcls()(惩罚约束最小二乘拟合),它允许为参数指定线性等式不等式约束。您需要将模型设置在比例如略低的级别。 lm(),但它给你带来的力量可能值得你付出额外的麻烦。

标签: r regression


【解决方案1】:

很可能会有其他人分享的更好方法,但您正在寻找两个参数,这样

b1 * x1 + b2 * x2 + (1 - b1 - b2) * x3

接近y。为此,我会编写一个错误函数来最小化

minimizeMe <- function(b, x, y) {  ## Calculates MSE
    mean((b[1] * x[, 1] + b[2] * x[, 2] + (1 - sum(b)) * x[, 3] - y) ^ 2)
}

扔给optim

fit <- optim(par = c(.2, .4), fn = minimizeMe, x = cbind(x1, x2, x3), y = y)

【讨论】:

    【解决方案2】:

    没有要测试的数据:

    mod1 <- lm(y ~ 0+x1+x2+x3, data=dat)
    mod2 <- lm(y/I(sum(coef(mod1))) ~ 0+x1+x2+x3, data=dat)
    

    现在我想多了,跳过 mod2,只是:

    coef(mod1)/sum(coef(mod1))
    

    【讨论】:

    • 这很酷 Dwin,但可能有必要将系数限制在 0 和 1 之间。我想。
    • 取决于要解决的问题,但从未说明过。
    • 抱歉没有提供相关细节,我在上面做了一些更新。
    【解决方案3】:

    round(knnPred)round(gbmPred) 显示的五行给出了完美的预测,因此是否需要多个预测器存在一些问题。

    无论如何,要解决如下所述的给定问题,将给出总和为 1 的非负系数(可能由于计算机算术造成的微小差异除外)。 a 是因变量,b 是自变量矩阵。 cd 定义等式约束(系数总和为 1),ef 定义不等式约束(系数非负)。

    library(lsei)
    a <- cbind(x1, x2, x3)
    b <- y
    c <- matrix(c(1, 1, 1), 1)
    d <- 1
    e <- diag(3)
    f <- c(0, 0, 0)
    lsei(a, b, c, d, e, f)
    

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 2020-10-18
      • 1970-01-01
      • 2020-10-11
      • 2013-10-09
      • 2013-05-17
      • 2017-11-24
      • 2016-03-31
      • 1970-01-01
      相关资源
      最近更新 更多