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$.
- Correlación de Pearson al cuadrado entre la característica y el resultado
- Correlación de Pearson al cuadrado entre el resultado y las predicciones
- Proporción de varianza explicada
- 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