15 votos

¿Cómo motivar la definición de $R^2$ en `sklearn.metrics.r2_score`?

TLDR: ¿Qué motiva la definición de $R^2$ en la función de Python sklearn.metrics.r2_score?

DETALLES

El paquete de aprendizaje automático de Python sklearn implementa un $R^2$ usando la siguiente fórmula.

$$ R^2=1-\left(\dfrac{ \overset{N}{\underset{i=1}{\sum}}\left( y_i-\hat y_i \right)^2 }{ \overset{N}{\underset{i=1}{\sum}}\left( y_i-\bar y \right)^2 }\right) $$

Esto está bien para evaluaciones dentro de la muestra de $R^2$, pero cuando se trata de evaluaciones fuera de la muestra, la definición parece no estar justificada y carecer de significado.

En la regresión lineal simple (dentro de la muestra), hay múltiples definiciones equivalentes de $R^2$.

  1. Correlación de Pearson al cuadrado entre la característica y el resultado
  2. Correlación de Pearson al cuadrado entre el resultado y las predicciones
  3. Proporción de varianza explicada
  4. Comparación de la pérdida cuadrada incurrida por el modelo con la pérdida cuadrada incurrida por un modelo de línea base solo con intercepto que siempre predice la media de la muestra, $\bar y$

(Puede haber más, y tal vez sea yo solo pensando en estos cuatro lo que me impide ver qué significa esta función de Python).

En modelos de regresión con múltiples características, la definición 1 no tiene sentido, por lo que no es una opción para una generalización de $R^2$ a evaluaciones fuera de la muestra en situaciones complicadas que probablemente tengan múltiples características.

Fuera de la muestra, elevar al cuadrado la correlación no tiene en cuenta el sesgo de predicción. Por ejemplo, $y=(1,2,3)$ está perfectamente correlacionado con $\hat y=(11,12,13)$, sin embargo, $\hat y$ está compuesto por predicciones terribles de $y$. Mientras que este tipo de sesgo no puede ocurrir dentro de la muestra en la regresión lineal por mínimos cuadrados ordinarios, fuera de la muestra, todo está en juego (y eso sin ni siquiera mencionar lo que podría salir mal en modelos de regresión más sofisticados como vectores de soporte o redes neuronales). En consecuencia, la definición 2 queda descartada como una generalización de $R^2$ a evaluaciones fuera de la muestra.

Excepto en situaciones especiales, los métodos habituales para calcular $R^2$ no corresponden a la proporción de varianza explicada, y si retorcemos la definición para forzarla, generalmente perdemos la conexión con la pérdida cuadrada que buscamos minimizar. Por lo tanto, la definición 3 no parece ser una buena opción para una generalización de $R^2$.

Finalmente, la definición 4 tiene sentido. Tenemos algún tipo de modelo base (predecir ingenuamente $\bar y$ cada vez, siempre usando la media marginal como nuestra suposición de la media condicional) y comparamos nuestras predicciones con las predicciones hechas por ese modelo base. Para hacer una analogía con lanzar una moneda, si alguien adivina qué lado caerá hacia arriba y acierta menos de la mitad del tiempo, esa persona es un mal pronosticador. Si aciertan más de la mitad del tiempo, al menos están mejorando un poco la ingenua estrategia de "Vaya, no sé cómo caerá, así que supondré que siempre caerá cara (o cruz, o alternaré entre ambos) y acertaré aproximadamente la mitad del tiempo".

(Hablando claramente, ¿por qué pagarle mucho dinero a un científico de datos o estadístico para predecir medias condicionales cuando podrías hacerlo mejor solo prediciendo un número cada vez que puedas calcular con AVERAGE(A:A) en Excel?)

Dentro de la muestra, estoy totalmente de acuerdo con la función de Python. Fuera de la muestra, tengo un problema. En la fórmula de $R^2$ arriba, la implementación de Python utiliza el $\bar y$ de los datos dados. Es decir, si ingresas un $y$ fuera de la muestra y las predicciones correspondientes $\hat y$, la función utiliza el $\bar y$ fuera de la muestra en el denominador.

Esto corresponde a comparar tu modelo con un modelo que predice la media fuera de la muestra cada vez. Sin embargo, no podemos acceder a ese modelo, ya que requeriría conocer los verdaderos valores fuera de la muestra.

PREGUNTA: ¿Qué motiva esta definición que se usa en sklearn?

Un argumento sobre la facilidad de uso no me parece legítimo (incluso si es por eso que la función se define de esta manera), porque lo siguiente es aún más fácil de implementar.

def r2_score():
    return(0.5)
    # o return(np.random.uniform(0, 1, 1))

Aunque este es un ejemplo extremo, la función no proporciona información útil sobre el modelo de regresión. En consecuencia, hacer que una función sea fácil de usar a expensas de devolver información poco útil parece un diseño deficiente o una función que no deberíamos usar.

EDICIÓN

He referido a esta pregunta tantas veces y nunca noté hasta ahora que nunca escribí explícitamente cuáles son las nociones en competencia de $R^2$ fuera de la muestra. ¡Eso termina ahora!

$$ R^2_{\text{fuera de la muestra, Dave}}= 1-\left(\dfrac{ \overset{N}{\underset{i=1}{\sum}}\left( y_i-\hat y_i \right)^2 }{ \overset{N}{\underset{i=1}{\sum}}\left( y_i-\bar y_{\text{dentro de la muestra}} \right)^2 }\right) $$$$ R^2_{\text{fuera de la muestra, scikit-learn}}= 1-\left(\dfrac{ \overset{N}{\underset{i=1}{\sum}}\left( y_i-\hat y_i \right)^2 }{ \overset{N}{\underset{i=1}{\sum}}\left( y_i-\bar y_{\text{fuera de la muestra}} \right)^2 }\right) $$

EDICIÓN 2

Mi cálculo preferido ahora tiene una referencia en la literatura (Hawinkel, Waegeman & Maere (2023)) que explica su superioridad sobre la utilizada por sklearn. ¡Uno de los autores parece ser un contribuyente de Cross Validated también!

REFERENCIA

Stijn Hawinkel, Willem Waegeman & Steven Maere (2023) $R^2$ fuera de la muestra: estimación e inferencia, The American Statistician, DOI: 10.1080/00031305.2023.2216252

9voto

Dipstick Puntos 4869
  1. Correlación al cuadrado entre la característica y el resultado

Ese sería el caso si tienes una sola característica y el modelo es de regresión lineal.

  1. Correlación al cuadrado entre el resultado y las predicciones

Igual que arriba, pero también se cumplirá si hay más características.

  1. Proporción de varianza explicada

Nos dice la proporción de la varianza explicada, pero solo para la regresión lineal.

  1. Comparación de la pérdida cuadrada incurrida por el modelo con la pérdida cuadrada incurrida

Nuevamente, para regresión lineal usando la fórmula de Scikit-learn es equivalente a como podemos descomponer el error cuadrado a TSS = ESS + RSS y obtener la formulación equivalente.

Entonces, en cierto sentido, todas las formulaciones son iguales, solo tienen grados variables de generalidad.

En cuanto al cálculo de $R^2$ en el conjunto de pruebas, puedes verificar este hilo y si buscas a través de CrossValidated.com y los problemas de GitHub de Scikit-learn, puedes encontrar muchas discusiones considerando la elección controvertida de Scikit-learn del promedio del conjunto de pruebas en el denominador. Como puedes aprender de esta discusión, uno de los problemas al usar el promedio del conjunto de entrenamiento para el conjunto de pruebas $R^2$ es la API, donde las métricas generalmente están definidas como metric(y_true, y_pred) y la misma interfaz se puede usar independientemente de si es el conjunto de entrenamiento o de pruebas. También significaría que durante el tiempo de evaluación necesitarías acceso a los datos de entrenamiento, lo cual puede no ser posible en algunas configuraciones donde hay una división clara de los datos entre el tiempo de entrenamiento y el tiempo de validación.

Observa también que $R^2$ proviene de la estadística, donde usualmente estamos interesados en métricas dentro de la muestra, por lo que las derivaciones también considerarían el $R^2$ del conjunto de entrenamiento.

3voto

user164061 Puntos 281
  1. Comparación de la pérdida cuadrada incurrida por el modelo con la pérdida cuadrada incurrida por un modelo base

La comparación de la pérdida parece ser muy similar al valor pseudo-$R^2$ por ejemplo.

$$R^2_{pseudo} = 1 - \frac{D_{null} - D_{model}}{D_{null}}$$

Pero con la devianza o pérdida igual a la suma de los residuos al cuadrado y el modelo nulo siendo la media, se convierte en lo mismo que el $R^2$ regular.

En la muestra, estoy totalmente de acuerdo con la función de Python. Fuera de la muestra, tengo un problema. En la fórmula de $R^2$ anterior, la implementación de Python utiliza el $\hat{y}$ de los datos dados.

Posiblemente el problema se derive del uso de $R^2$ como medida de bondad del ajuste. Pero el valor de $R^2$ no es una medida de bondad del ajuste. El valor no indica directamente si su modelo es bueno o no; Un ajuste perfecto de la media de la distribución condicional no necesita coincidir con un $R^2=1$. En cambio, es una estadística descriptiva que indica cuán grande es la varianza en el ruido/aleatoriedad en relación con la varianza en la parte determinista. Vemos esto de una manera alternativa para calcular $R^2$

$$R^2 = \frac{SS_{model}}{SS_{model}+SS_{residuals}}$$

donde $SS_{model} = \sum (\hat{y} - \bar{\hat{y}})^2$ y $SS_{residuals} = \sum (y - \hat{y})^2$ y $\bar{\hat{y}}$ es la media de los valores modelados.

Esta forma de calcular $R^2$ será equivalente al 'otro $R^2$' si tiene un modelo lineal con una intersección. Pero será ligeramente diferente en otras situaciones, por ejemplo, no hay casos de valores negativos como en la pregunta ¿Por qué es negativo R^2 en mi modelo de regresión lineal múltiple en Python?.

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