55 votos

¿Son tiras sobreajuste de los datos?

Mi problema: hace poco conocí a un estadístico que me informó de que los splines son sólo útiles para la exploración de datos y son objeto de sobreajuste, por lo tanto no es útil en la predicción. Prefería explorar con simple polinomios... Como yo soy un gran fan de splines, y esto va en contra de mi intuición estoy interesado en averiguar la validez de estos argumentos son, y si hay un gran grupo de anti-spline-activistas por ahí?

Antecedentes: intento seguir Frank Harrell, la Regresión de la Modelización de Estrategias (1), cuando puedo crear mis propios modelos. Él sostiene que la restricción de splines cúbicos son una herramienta válida para la exploración de las variables continuas. También sostiene que los polinomios son buenos en el modelado de ciertas relaciones, tales como umbrales, logarítmica (2). Para la prueba de la linealidad del modelo sugiere una prueba de ANOVA para la spline:

$H_0: \beta_2 = \beta_3 = ... = \beta_{k-1} = 0 $

He buscado en google para el sobreajuste con estrías pero no se ha encontrado que mucho más útil (aparte de las advertencias generales acerca de no usar demasiados nudos). En este foro parece ser que hay una preferencia por la spline modelado, Kolassa, Harrell, gung.

He encontrado una entrada de blog acerca de polinomios, el diablo de sobreajuste que habla acerca de la predicción de polinomios. El post termina con estos comentarios:

En cierta medida, los ejemplos que aquí se presentan están engañando - polinomio la regresión es conocido por ser altamente no-robusto. Mucho mejor en la práctica es el uso de splines en lugar de polinomios.

Ahora, esto me llevó a comprobar cómo splines que iba a realizar con el ejemplo:

library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70

set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))

plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)

legend("top", fill=c("orange", "red","darkblue"), 
       legend=c("Poly", "Natural splines", "RCS - ols"))

Da la siguiente imagen: A comparison of splines and polynomials

En conclusión, no he encontrado mucho de lo que me convencerían de reconsiderar splines, ¿qué me estoy perdiendo?

  1. F. E. Harrell, modelos de Regresión de Estrategias: Con Aplicaciones a Modelos Lineales de Regresión Logística y Análisis de Supervivencia, tapa Blanda reimpresión de tapa dura 1ª ed. 2001. Springer, 2010.
  2. F. E. Harrell, K. L. Lee, y B. G. Pollock, "Modelos de Regresión en los Estudios Clínicos: la Determinación de las Relaciones Entre los Predictores y la Respuesta," JNCI J Natl Cancer Inst, vol. 80, no. 15, pp 1198-1202, Oct. 1988.

Actualización

El comentario me hizo pensar en lo que sucede dentro de los datos útil sino por la incomodidad de las curvas. En la mayoría de las situaciones no voy fuera del límite de datos, como el ejemplo de arriba indica. No estoy seguro de que este califica como la predicción...

De todos modos aquí está un ejemplo en donde puedo crear un más complejo que no puede ser traducido en un polinomio. Dado que la mayoría de las observaciones se encuentran en el centro de los datos que he intentado simular que así:

library(rms)
cmplx_line <-  1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] + 
    dnorm(6*(1:length(center)-length(center)/2)/length(center))*10

ds <- data.frame(cmplx_line, x=1:200)

days <- 1:140/2

set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) & 
                         sample >= min(ds$x)]
sample_ds <- ds[sample, ]

sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)

plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)

nd <- data.frame(x=ds$x)
    lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)

legend("bottomright", fill=c("black", "orange","lightblue"), 
       legend=c("True line", "Poly", "RCS - ols"), inset=.05)

Esto le da la siguiente trama:

A more complex non-polynomial line plot

Actualización 2

Desde este post he publicado un artículo en el que se ve en la no-linealidad de edad en un gran conjunto de datos. El suplemento compara los diferentes métodos y he escrito un post en el blog sobre ella.

22voto

Peter Puntos 658

El sobreajuste viene a partir de lo que es demasiado grande la clase de modelos. Esto se hace un poco complicado con los modelos con parámetros continuos (como splines y polinomios), pero si discretizar los parámetros en un cierto número de valores distintos, vas a ver que al aumentar el número de nudos/coeficientes de aumentar el número de modelos disponibles de forma exponencial. Para cada conjunto de datos no es un spline y un polinomio que ajusta con precisión, siempre que se deje suficiente coeficientes/nudos. Puede ser que una spline con tres nudos overfits más de un polinomio con tres coeficientes, pero eso no es una comparación justa.

Si usted tiene un bajo número de parámetros, y un gran conjunto de datos, puede ser razonablemente seguro que no eres el sobreajuste. Si quieres probar un mayor número de parámetros que usted puede intentar cruzar la validación dentro de su conjunto de pruebas para encontrar el mejor número, o puede utilizar un criterio como la Longitud Mínima Descripción.

EDIT: Como se pide en los comentarios, un ejemplo de cómo se aplican MDL. Primero usted tiene que lidiar con el hecho de que sus datos es continuo, por lo que no puede ser representado en un número finito de código. Por el bien de la simplicidad, vamos a segmentar el espacio de datos en las cajas de lado $\epsilon$ y en lugar de describir los puntos de datos, vamos a describir los cuadros que los datos cae en. Esto significa que tenemos que perder algo de precisión, pero podemos hacer que $\epsilon$ arbitrariamente pequeño, así que no importa mucho.

Ahora, la tarea es describir el conjunto de datos como sucinctly como sea posible con la ayuda de algunos polinomio. Primero describimos el polinomio. Si es un n-ésimo polinomio de orden, sólo tenemos que almacenar (n+1) coeficientes. De nuevo, tenemos que discretizar estos valores. Después de que tenemos que guardar primero el valor de $$ n de prefijo libre de codificación (por lo que hay que saber cuándo parar de leer) y, a continuación, el $n+1$ valores de los parámetros. Con esta información de un receptor de nuestro código podría restaurar el polinomio. A continuación, añadimos el resto de la información necesaria para almacenar el conjunto de datos. Para cada punto de datos le damos el valor de x y, a continuación, cómo muchos de los cuadros de arriba o abajo del punto de datos se encuentra fuera de la polinomio. Ambos valores se almacena en prefijo libre de codificación, de modo que valores cortos que requieren de pocos bits, y no vamos a necesitar delimitadores entre los puntos. (Se puede acortar el código para los valores de x por sólo almacenar los incrementos entre los valores)

El punto fundamental aquí es el compromiso. Si he de elegir un polinomiales de orden (como f(x) = 3.4), entonces el modelo es muy simple, a la tienda, pero para los valores de y, estoy esencialmente de almacenamiento de la distancia a la media. Más coeficientes me dan un mejor ajuste polinomial (y por lo tanto más corto códigos para los valores de y), pero tengo que pasar más bits que describen el modelo. El modelo que le da el menor código de sus datos es la mejor opción por el criterio MDL.

(Tenga en cuenta que este es conocido como 'crudo MDL', y hay algunas mejoras que puedes hacer para resolver diversos problemas técnicos).

21voto

Dinre Puntos 256

Los estadísticos han estado discutiendo acerca del polinomio de ajuste para las edades, y en mi experiencia, se trata de lo siguiente:

Estrías son, básicamente, una serie de diferentes ecuaciones puestas juntas, que tiende a aumentar la precisión de los valores interpolados en el costo de la capacidad de proyectar fuera del rango de datos. Esto está bien si usted sabe que sus datos es puro y proveniente de una fuente constante y si usted está tratando de describir la probabilidad de los diferentes valores de' presencia dentro de su rango de valores. Sin embargo, no solemos aprender mucho acerca de las bases teóricas de conducción de nuestros datos, ya que una nueva spline se inicia cuando el cable viejo deja de describir con exactitud los datos. Esto hace que la predicción de los valores fuera de nuestros datos casi sin valor.

Ahora, estrías no son los únicos en este respecto. Funciones polinómicas, en realidad sufren el mismo problema si sólo estamos ajuste de los datos y no el uso de un marco teórico para la elección de las variables. Aquellos que han formado la teoría de la conducción de las variables que permiten variar y por cuánto va a ser más confiado de una compleja función polinómica de la capacidad para extrapolar las predicciones fuera de los datos.

Muchos estadísticos, sin embargo, trabajar con los datos sin la ayuda de un pre-establecido el marco teórico, y esto hace que algunas personas hacia la simple polinomios. Que razón que un menos flexible que se ajusta a los datos es más probable para predecir con precisión los valores fuera de los datos, debido a que la función es menos probable que se deje llevar por las anomalías en los datos. Aunque he tenido conversaciones con personas que prefieren lo simple polinomios, nunca he tenido la sensación de ser un anti-spline grupo. Se siente más como un simple polinomios hacer algunos estadísticos se sienta más cómodo para evitar el sobreajuste.

Descargo de responsabilidad

Personalmente, yo no tienden a utilizar splines o simple polinomios con la mayoría de mis datos, porque yo trabajo en un campo con muchos pre-establecido marcos teóricos. También, he observado la recogida de los datos y puede obtener un buen agarre en lo que fue la conducción de los resultados. En ese caso, estoy construyendo más de un algoritmo lógico y probar el algoritmo de fitness, en lugar de pruebas de la aptitud de una función polinómica. Usted puede añadir este grano de sal a mi respuesta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X