Interpretacja prawdopodobieństwa częstych wyrażeń prawdopodobieństwa, wartości p itp. Dla modelu LASSO i regresji krokowej nie jest poprawna.
Te wyrażenia przeceniają prawdopodobieństwo. Np. 95% przedział ufności dla jakiegoś parametru ma powiedzieć, że masz 95% prawdopodobieństwo, że metoda spowoduje interwał z prawdziwą zmienną modelu w tym przedziale.
Jednak dopasowane modele nie wynikają z typowej pojedynczej hipotezy, a zamiast tego wybieramy wiśnie (wybieramy spośród wielu możliwych alternatywnych modeli), gdy przeprowadzamy regresję krokową lub regresję LASSO.
Ocena poprawności parametrów modelu nie ma większego sensu (szczególnie gdy prawdopodobne jest, że model nie jest poprawny).
(XTX)−1
X
Przykład: poniższy wykres przedstawiający wyniki modelu zabawki dla pewnego sygnału, który jest sumą liniową 10 krzywych Gaussa (może to na przykład przypominać analizę chemiczną, w której sygnał dla widma jest uważany za sumę liniową kilka elementów). Sygnał 10 krzywych jest wyposażony w model 100 elementów (krzywe Gaussa z inną średnią) przy użyciu LASSO. Sygnał jest dobrze oszacowany (porównaj czerwoną i czarną krzywą, które są dość blisko). Ale rzeczywiste podstawowe współczynniki nie są dobrze oszacowane i mogą być całkowicie błędne (porównaj czerwone i czarne paski z kropkami, które nie są takie same). Zobacz także ostatnie 10 współczynników:
91 91 92 93 94 95 96 97 98 99 100
true model 0 0 0 0 0 0 0 142.8 0 0 0
fitted 0 0 0 0 0 0 129.7 6.9 0 0 0
Model LASSO wybiera współczynniki, które są bardzo przybliżone, ale z perspektywy samych współczynników oznacza to duży błąd, gdy szacuje się, że współczynnik, który powinien być niezerowy, wynosi zero, a sąsiedni współczynnik, który powinien wynosić zero, jest szacowany na niezerowa. Wszelkie przedziały ufności dla współczynników miałyby bardzo niewielki sens.
Mocowanie LASSO
Stopniowe dopasowanie
Dla porównania tę samą krzywą można wyposażyć w algorytm krokowy prowadzący do obrazu poniżej. (z podobnymi problemami, że współczynniki są bliskie, ale nie pasują)
Nawet jeśli weźmiesz pod uwagę dokładność krzywej (a nie parametry, które w poprzednim punkcie wyjaśniono, że nie ma to sensu), musisz poradzić sobie z nadmiernym dopasowaniem. Kiedy wykonujesz procedurę dopasowania z LASSO, korzystasz z danych treningowych (aby dopasować modele o różnych parametrach) i danych testowych / walidacyjnych (aby dostroić / znaleźć najlepszy parametr), ale powinieneś również użyć trzeciego oddzielnego zestawu danych testowych / walidacyjnych w celu ustalenia wydajności danych.
Wartość p lub coś podobnego nie zadziała, ponieważ pracujesz nad tuningowanym modelem, który jest wybieraniem wiśni i różni się (znacznie większy stopień swobody) od zwykłej metody dopasowania liniowego.
cierpisz na te same problemy, co regresja krokowa?
R2
Pomyślałem, że głównym powodem zastosowania LASSO zamiast regresji krokowej jest to, że LASSO pozwala na mniej chciwy wybór parametrów, na który mniejszy wpływ ma multikolinarność. (więcej różnic między LASSO i krokowym: Przewaga LASSO nad wyborem do przodu / eliminacją do tyłu pod względem błędu prognozy walidacji krzyżowej modelu )
Kod przykładowego obrazu
# settings
library(glmnet)
n <- 10^2 # number of regressors/vectors
m <- 2 # multiplier for number of datapoints
nel <- 10 # number of elements in the model
set.seed(1)
sig <- 4
t <- seq(0,n,length.out=m*n)
# vectors
X <- sapply(1:n, FUN <- function(x) dnorm(t,x,sig))
# some random function with nel elements, with Poisson noise added
par <- sample(1:n,nel)
coef <- rep(0,n)
coef[par] <- rnorm(nel,10,5)^2
Y <- rpois(n*m,X %*% coef)
# LASSO cross validation
fit <- cv.glmnet(X,Y, lower.limits=0, intercept=FALSE,
alpha=1, nfolds=5, lambda=exp(seq(-4,4,0.1)))
plot(fit$lambda, fit$cvm,log="xy")
plot(fit)
Yfit <- (X %*% coef(fit)[-1])
# non negative least squares
# (uses a stepwise algorithm or should be equivalent to stepwise)
fit2<-nnls(X,Y)
# plotting
par(mgp=c(0.3,0.0,0), mar=c(2,4.1,0.2,2.1))
layout(matrix(1:2,2),heights=c(1,0.55))
plot(t,Y,pch=21,col=rgb(0,0,0,0.3),bg=rgb(0,0,0,0.3),cex=0.7,
xaxt = "n", yaxt = "n",
ylab="", xlab = "",bty="n")
#lines(t,Yfit,col=2,lwd=2) # fitted mean
lines(t,X %*% coef,lwd=2) # true mean
lines(t,X %*% coef(fit2), col=3,lwd=2) # 2nd fit
# add coefficients in the plot
for (i in 1:n) {
if (coef[i] > 0) {
lines(c(i,i),c(0,coef[i])*dnorm(0,0,sig))
points(i,coef[i]*dnorm(0,0,sig), pch=21, col=1,bg="white",cex=1)
}
if (coef(fit)[i+1] > 0) {
# lines(c(i,i),c(0,coef(fit)[i+1])*dnorm(0,0,sig),col=2)
# points(i,coef(fit)[i+1]*dnorm(0,0,sig), pch=21, col=2,bg="white",cex=1)
}
if (coef(fit2)[i+1] > 0) {
lines(c(i,i),c(0,coef(fit2)[i+1])*dnorm(0,0,sig),col=3)
points(i,coef(fit2)[i+1]*dnorm(0,0,sig), pch=21, col=3,bg="white",cex=1)
}
}
#Arrows(85,23,85-6,23+10,-0.2,col=1,cex=0.5,arr.length=0.1)
#Arrows(86.5,33,86.5-6,33+10,-0.2,col=2,cex=0.5,arr.length=0.1)
#text(85-6,23+10,"true coefficient", pos=2, cex=0.7,col=1)
#text(86.5-6,33+10, "fitted coefficient", pos=2, cex=0.7,col=2)
text(0,50, "signal versus position\n true mean (black), fitted with nnls (green)", cex=1,col=1,pos=4, font=2)
plot(-100,-100,pch=21,col=1,bg="white",cex=0.7,type="l",lwd=2,
xaxt = "n", yaxt = "n",
ylab="", xlab = "",
ylim=c(0,max(coef(fit)))*dnorm(0,0,sig),xlim=c(0,n),bty="n")
#lines(t,X %*% coef,lwd=2,col=2)
for (i in 1:n) {
if (coef[i] > 0) {
lines(t,X[,i]*coef[i],lty=1)
}
if (coef(fit)[i+1] > 0) {
# lines(t,X[,i]*coef(fit)[i+1],col=2,lty=1)
}
if (coef(fit2)[i+1] > 0) {
lines(t,X[,i]*coef(fit2)[i+1],col=3,lty=1)
}
}
text(0,33, "illustration of seperate components/curves", cex=1,col=1,pos=4, font=2)