如何使用L1损失函数在R中训练(逻辑?)回归?


11

我可以在R使用中训练逻辑回归

glm(y ~ x, family=binomial(logit)))

但是,IIUC可以优化对数可能性。

有没有办法使用线性()损失函数(在这种情况下与总变化距离相同)来训练模型?大号1个

即,给定一个数值向量和一个位(逻辑)向量,我想构造一个单调(实际上是增加的)函数,使得被最小化。XÿF|FX-ÿ|

也可以看看


想要的东西不存在,直率地说,这没有多大意义。我们可以讨论替代方案,但是您需要更彻底地陈述您要做什么。您为什么要拟合L1损失的逻辑模型?
user603 2014年

@ user603:因为我想用评价我的模型TVD
SDS

您似乎在谈论将逻辑曲线拟合到数据,而不是拟合二项分布的数据-这是一种非线性回归形式,而是使用而不是L 2范数。事实上,损失函数Σ | f x y | 建议最大值不为1(如果是这种情况,则表示二项式GLM具有误导性)。另一方面,如果确实将其限制为0-1,则损失函数没有意义。你能提供你的实际情况的细节吗?L1L2|f(x)y|1个
Glen_b-恢复莫妮卡

请注意,该帮助要求您不要将同一问题交叉发布到多个站点,而是选择一个站点。如果您以后对最好的站点改变了主意,请标记它以引起管理员注意并要求将其移动。
Glen_b-恢复莫妮卡2014年

@Glen_b:我认为“位(逻辑)向量y”确实暗示了0/1响应。
sds

Answers:


21

您不想要做的事情并不存在,因为缺少更好的单词,它在数学上是有缺陷的。

但是首先,我将强调为什么我认为您提出问题的前提是正确的。然后,我将尝试解释为什么我认为您从中得出的结论基于对逻辑模型的误解,最后,我将提出另一种方法。

我将表示您在p维空间( x的第一项)中的n个观测值(粗体字母表示矢量){XX一世ÿ一世}一世=1个ññp是1)p<Ñ ÿ [01]˚F XXX一世p<ñÿ一世[01个] x的单调函数FXX一世=FXX一世ββ,像逻辑曲线那样说来修正想法。为方便起见,我将只是假设 ñ足够比较大的 pXX一世ββñp

您是正确的,如果您打算使用TVD作为评估拟合模型的标准,那么可以合理地期望您的拟合在所有可能的候选数据中对同一标准进行优化。因此

ββ=精氨酸ββ[Rp||ÿÿ-FXX一世ββ||1个

问题是误差项 以及如果我们强制 E ϵϵ一世=ÿ一世-FXX一世ββ(我们只是希望我们的模型是渐近无偏的),则 ϵ i必须异方差的。这是因为 y 只能取两个值0和1。因此,给定 xËϵϵ=0ϵ一世 ÿ一世 ϵ i也只能取两个值:1f xXX一世ϵ一世 ÿ = 1,这与发生概率 ˚F X1个-FXX一世ββÿ一世=1个,以及 - ˚F XFXX一世ββ ÿ = 1,这与发生概率 1 - ˚F X-FXX一世ββÿ一世=1个1个-FXX一世ββ

这些考虑因素共同暗示:

var(ϵϵ)=E(ϵϵ2)=(1f(xxββ))2f(xxββ)+(f(xxββ))2(1f(xxββ))=(1f(xxββ))f(xxββ)=E(yy|xx)E(1yy|xx)

因此不是恒定的而是凹的抛物线形,并且在 x时最大化var(ϵϵ)使得 E y | xxxE(y|xx).5

残差的这种固有的异方差具有后果。它暗示着,当最小化损失函数时,您会渐进地使样本的一部分过重。也就是说,拟合的βl1完全不适合数据,而仅适合聚集在 x周围的部分ββ使得 E yxx。也就是说,这些是样本中信息最少的数据点:它们对应于噪声分量最大的那些观测值。因此,您的适合度被拉向 βE(yy|xx).5ββ=ββ:f(xxββ).5,例如由无关。

从上面的论述可以清楚地看出,一种解决方案是放弃无偏性的要求。一种偏向估计量的流行方法(附加了一些贝叶斯解释)是包括收缩项。如果我们重新缩放响应:

yi+=2(yi.5),1in

f(xxββ)g(xx,[c,γγ])=xx[c,γγ]cp1γγ||γγ||2

[Cγγ]=精氨酸[[Cγγ][Rp一世=1个ñ最大值01个-ÿ一世+XX一世[[Cγγ]+1个2||γγ||2

请注意,在这个新的(也是凸的)优化问题中,对正确分类的观测值的惩罚为0,并且随着线性增长XX[[Cγ]1个[Cγγ]ββ[Cγγ]


希望我能给您25分以上:-)
SDS 2014年

@sds; 谢谢:这是一个很大的问题:)我将在白天返回并填写详细信息,纠正一些错字。
user603 2014年

8

我不确定为什么您要对限制在0和1之间的值使用L1损失。根据您的目标,您可能需要考虑类似于铰链损失的事情,这类似于一个方向上的L1损失和平坦的损失。在另一个。

无论如何,下面的代码应该可以满足您的要求。注意,最佳响应基本上是一个阶跃函数。

set.seed(1)

# Fake data
x = seq(-1, 1, length = 100)
y = rbinom(100, plogis(x), size = 1) # plogis is the logistic function

# L1 loss
loss = function(y, yhat){
  sum(abs(y - yhat))
}

# Function to estimate loss associated with a given slope & intercept
fn = function(par){
  a = par[1]
  b = par[2]
  loss(y = y, yhat = plogis(a + b * x))
}

# Find the optimal parameters
par = optim(
  par = c(a = 0, b = 0),
  fn = fn
)$par

# Plot the results
plot(y ~ x)
curve(plogis(par[1] + par[2] * x), add = TRUE, n = 1000)

0

您可以使用glmnet软件包来安装L1,L2模型。它不仅限于逻辑回归,还包括它。

这是小插图:http : //web.stanford.edu/~hastie/glmnet/glmnet_alpha.html

还有一个网络研讨会:https : //www.youtube.com/watch? v = BU2gjoLPfDc

Liblinear很好,但是我发现glmnet更容易上手。Glmnet包含执行交叉验证并根据不同的度量标准(例如AUC)为您选择正则化参数的函数。

关于理论,我将阅读有关套索(L1正则化)的tibshiarini论文以及统计学习元素中的这一章。 http://statweb.stanford.edu/~tibs/lasso/lasso.pdf

关于对数丢失,仅用于评估模型。这不是模型拟合的损失函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.