¿Existe una función de biblioteca para el error cuadrático medio (RMSE) en python?

Sé que podría implementar una función de error cuadrático medio como esta:

def rmse(predictions, targets): return np.sqrt(((predictions - targets) ** 2).mean()) 

¿Qué estoy buscando si esta función rmse se implementa en una biblioteca en algún lugar, tal vez en scipy o scikit-learn?

sklearn.metrics tiene una función mean_squared_error . El RMSE es solo la raíz cuadrada de lo que devuelve.

 from sklearn.metrics import mean_squared_error from math import sqrt rms = sqrt(mean_squared_error(y_actual, y_predicted)) 

¿Qué es RMSE? También conocido como MSE o RMS. ¿Qué problema soluciona?

Si entiendes RMSE: (Error cuadrático medio), MSE: (Error cuadrático medio) y RMS: (Raíz medio cuadrático), pedir una biblioteca para calcularlo es innecesario. Todas estas métricas son una sola línea de código de python con una longitud máxima de 2 pulgadas. Las tres métricas rmse, mse y rms son todas conceptualmente idénticas.

RMSE responde a la pregunta: “¿Qué tan similares, en promedio, son los números en la lista1 a la lista2?”. Las dos listas deben ser del mismo tamaño. Quiero “eliminar el ruido entre cualquiera de los dos elementos dados, eliminar el tamaño de los datos recostackdos y obtener un número único de cambios con el tiempo”.

Intuición y ELI5 para RMSE:

Imagina que estás aprendiendo a lanzar dardos en un tablero de dardos. Todos los días practicas durante una hora. Quiere saber si está mejorando o empeorando. Así que todos los días haces 10 lanzamientos y mides la distancia entre la diana y donde golpea tu dardo.

Haces una lista de esos números. Use el error cuadrático medio entre las distancias del día 1 y una lista que contenga todos los ceros. Haz lo mismo en el segundo y noveno día. Lo que obtendrás es un solo número que se espera que disminuya con el tiempo. Cuando su número de RMSE es cero, golpea bullseyes cada vez. Si el número aumenta, estás empeorando.

Ejemplo en el cálculo del error cuadrático medio en python:

 import numpy as np d = [0.000, 0.166, 0.333] p = [0.000, 0.254, 0.998] print("d is: " + str(["%.8f" % elem for elem in d])) print("p is: " + str(["%.8f" % elem for elem in p])) def rmse(predictions, targets): return np.sqrt(((predictions - targets) ** 2).mean()) rmse_val = rmse(np.array(d), np.array(p)) print("rms error is: " + str(rmse_val)) 

Que imprime:

 d is: ['0.00000000', '0.16600000', '0.33300000'] p is: ['0.00000000', '0.25400000', '0.99800000'] rms error between lists d and p is: 0.387284994115 

La notación matemática:

introduzca la descripción de la imagen aquí

El rmse se realiza en pequeños pasos para que se pueda entender:

 def rmse(predictions, targets): differences = predictions - targets #the DIFFERENCEs. differences_squared = differences ** 2 #the SQUAREs of ^ mean_of_differences_squared = differences_squared.mean() #the MEAN of ^ rmse_val = np.sqrt(mean_of_differences_squared) #ROOT of ^ return rmse_val #get the ^ 

¿Cómo funciona cada paso de RMSE?

Restar un número de otro te da la distancia entre ellos.

 8 - 5 = 3 #distance between 8 and 5 is 3 -20 - 10 = -30 #distance between -20 and 10 is +30 

Si multiplicas cualquier número multiplicado por sí mismo, el resultado siempre es positivo porque negativo por negativo es positivo:

 3*3 = 9 = positive -30*-30 = 900 = positive 

Súmalos a todos, pero espera, entonces una matriz con muchos elementos tendrá un error mayor que una matriz pequeña, por lo que debes promediarlos por el número de elementos.

Pero espera, los cuadramos antes para forzarlos a ser positivos. ¡Deshaz el daño con una raíz cuadrada!

Eso te deja con un solo número que representa, en promedio, la distancia entre cada valor de list1 a su valor de elemento correspondiente de list2.

Si el valor de RMSE disminuye con el tiempo, estamos contentos porque la varianza está disminuyendo.

RMSE no es la estrategia de ajuste de línea más precisa, los mínimos cuadrados totales son:

El error cuadrático medio mide la distancia vertical entre el punto y la línea, por lo que si sus datos tienen la forma de un plátano, planos cerca del fondo e inclinados cerca de la parte superior, el RMSE informará sobre distancias mayores a puntos altos, pero distancias cortas a Puntos bajos cuando en realidad las distancias son equivalentes. Esto provoca un sesgo donde la línea prefiere estar más cerca de los puntos altos que bajos.

Si este es un problema, el método de mínimos cuadrados totales soluciona esto: https://mubaris.com/2017-09-28/linear-regression-from-scratch

Gotchas que pueden romper esta función RMSE:

Si hay nulos o infinito en cualquiera de las listas de entrada, entonces el valor rmse de salida no tendrá sentido. Hay tres estrategias para lidiar con valores nulos / valores perdidos / infinitos en cualquiera de las listas: ignorar ese componente, borrar o agregar una mejor estimación o un ruido aleatorio uniforme a todos los pasos de tiempo. Cada remedio tiene sus pros y sus contras según lo que signifiquen sus datos. En general, se prefiere ignorar cualquier componente con un valor faltante, pero esto desvía el RMSE hacia cero, lo que hace pensar que el rendimiento ha mejorado cuando realmente no lo ha hecho. Se podría preferir agregar ruido aleatorio en una mejor estimación si faltan muchos valores.

Para garantizar la corrección relativa de la salida RMSE, debe eliminar todos los nulos / infinitos de la entrada.

RMSE tiene tolerancia cero para los puntos de datos atípicos que no pertenecen

Los cuadrados de error cuadrático medio se basan en que todos los datos son correctos y todos se cuentan como iguales. Eso significa que un punto perdido que está lejos en el campo izquierdo arruinará totalmente todo el cálculo. Para manejar los puntos de datos atípicos y descartar su tremenda influencia después de un cierto umbral, vea Estimadores robustos que crean un umbral para el despido de los valores atípicos.

Esto es probablemente más rápido ?:

 n = len(predictions) rmse = np.linalg.norm(predictions - targets) / np.sqrt(n) 

En realidad, escribí un montón de ellos como funciones de utilidad para los modelos de estadísticas.

http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures

y http://statsmodels.sourceforge.net/devel/generated/statsmodels.tools.eval_measures.rmse.html#statsmodels.tools.eval_measures.rmse

Principalmente uno o dos trazadores de líneas y no mucho control de entrada, y principalmente destinado a obtener fácilmente algunas estadísticas cuando se comparan matrices. Pero tienen pruebas unitarias para los argumentos del eje, porque ahí es donde a veces cometo errores descuidados.