Sé que podría implementar una función de error cuadrático medio así:
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?
python
scikit-learn
scipy
siamii
fuente
fuente
.sum()
lugar de.mean()
primero por error. Además, supongo que esta función se usa tanto que no veo ninguna razón por la que no debería estar disponible como función de biblioteca.predictions
ytargets
son, por ejemplo, de tipo,int16
el cuadrado podría desbordarse (dando números negativos). Por lo tanto, es posible que necesite un.astype('int')
o.astype('double')
antes de usar el cuadrado, comonp.sqrt(((predictions - targets).astype('double') ** 2).mean())
.Respuestas:
sklearn.metrics
Tiene unamean_squared_error
función. El RMSE es solo la raíz cuadrada de lo que devuelve.fuente
mean_squared_error
ensklearn.metrics
ahora soporta parámetro adicional:squared
- "Si devuelve True MSE valor, si se devuelve False valor RMSE."¿Qué es el RMSE? También conocido como MSE, RMD o RMS. ¿Qué problema soluciona?
Si comprende RMSE: (error cuadrático medio cuadrático), MSE: (error cuadrático medio) RMD (desviación cuadrática media cuadrática) y RMS: (cuadrático medio cuadrático), entonces solicitar una biblioteca para calcular esto es una ingeniería innecesaria . Todas estas métricas son una sola línea de código de Python con un máximo de 2 pulgadas de largo. Las tres métricas rmse, mse, rmd y rms son, en su núcleo, conceptualmente idénticas.
RMSE responde a la pregunta: "¿Qué tan similares, en promedio, son los números en
list1
alist2
?". 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 recopilados y obtener una sensación única de cambio en el tiempo".Intuición y ELI5 para RMSE:
Imagina que estás aprendiendo a lanzar dardos a un tablero de dardos. Todos los días practicas durante una hora. Desea saber si está mejorando o empeorando. Entonces, cada día haces 10 tiros y mides la distancia entre la diana y donde golpeó tu dardo.
Haces una lista de esos números
list1
. Use el error cuadrático medio entre las distancias en el día 1 y quelist2
contenga todos los ceros. Haga lo mismo en el segundo y enésimo día. Lo que obtendrá es un número único que, con suerte, disminuirá con el tiempo. Cuando su número RMSE es cero, siempre le da a la diana. Si el número rmse aumenta, empeora.Ejemplo al calcular el error cuadrático medio en python:
Que imprime:
La notación matemática:
Leyenda de glifo:
n
es un entero positivo completo que representa el número de lanzamientos.i
representa un contador entero positivo completo que enumera la suma.d
representa las distancias ideales, quelist2
contienen todos los ceros en el ejemplo anterior.p
significa rendimiento, ellist1
en el ejemplo anterior. superíndice 2 significa numérico al cuadrado. d i es el i- ésimo índice ded
. p i es el i- ésimo índice dep
.La respuesta se realiza en pequeños pasos para que se pueda entender:
Cómo funciona cada paso de RMSE:
Restar un número de otro te da la distancia entre ellos.
Si multiplica cualquier número por sí mismo, el resultado siempre es positivo porque negativo por negativo es positivo:
Súmelos todos, pero espere, entonces una matriz con muchos elementos tendría un error mayor que una matriz pequeña, así que promítelos por la cantidad de elementos.
Pero espera, los cuadramos todos antes para forzarlos a ser positivos. Deshacer 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 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 de la raíz mide la distancia vertical entre el punto y la línea, por lo que si sus datos tienen forma de plátano, plano cerca de la parte inferior y empinado cerca de la parte superior, el RMSE informará 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 esto es un problema, el método de mínimos cuadrados totales arregla esto: https://mubaris.com/posts/linear-regression
Gotchas que pueden romper esta función RMSE:
Si hay valores nulos o infinitos en cualquiera de las listas de entrada, entonces el valor de salida rmse no tendrá sentido. Hay tres estrategias para lidiar con nulos / valores perdidos / infinitos en cualquiera de las listas: ignore ese componente, ajústelo a cero o agregue una mejor suposición o un ruido aleatorio uniforme a todos los pasos de tiempo. Cada remedio tiene sus ventajas y desventajas, según lo que signifiquen sus datos. En general, se prefiere ignorar cualquier componente con un valor perdido, pero esto sesga 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 aproximació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
La raíz cuadrática del error cuadrático medio se basa en que todos los datos son correctos y todos se cuentan como iguales. Eso significa que un punto perdido en el campo izquierdo arruinará totalmente todo el cálculo. Para manejar puntos de datos atípicos y descartar su tremenda influencia después de cierto umbral, vea Estimadores robustos que incorporan un umbral para el descarte de valores atípicos.
fuente
¿Esto es probablemente más rápido ?:
fuente
En scikit-learn 0.22.0 puede pasar
mean_squared_error()
el argumentosquared=False
para devolver el RMSE.fuente
En caso de que alguien encuentre este hilo en 2019, hay una biblioteca llamada
ml_metrics
que está disponible sin preinstalación en los núcleos de Kaggle, bastante liviana y accesiblepypi
(se puede instalar fácil y rápidamente conpip install ml_metrics
):Tiene algunas otras métricas interesantes que no están disponibles en
sklearn
, comomapk
.Referencias
fuente
En realidad, escribí un montón de esos como funciones de utilidad para statsmodels
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 revestimientos y poca verificación de entrada, y principalmente destinados a obtener fácilmente algunas estadísticas al comparar matrices. Pero tienen pruebas unitarias para los argumentos del eje, porque ahí es donde a veces cometo errores descuidados.
fuente
O simplemente usando solo las funciones NumPy:
Dónde:
Tenga en cuenta que
rmse(y, y_pred)==rmse(y_pred, y)
debido a la función cuadrada.fuente
No puede encontrar la función RMSE directamente en SKLearn. Pero, en lugar de hacer sqrt manualmente, hay otra forma estándar de usar sklearn. Aparentemente, el propio mean_squared_error de Sklearn contiene un parámetro llamado "cuadrado" con el valor predeterminado como verdadero. Si lo configuramos como falso, la misma función devolverá RMSE en lugar de MSE.
fuente
Aquí hay un código de ejemplo que calcula el RMSE entre dos formatos de archivo de polígono
PLY
. Utiliza tanto laml_metrics
lib como lanp.linalg.norm
:fuente
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error (y_true, y_pred)
Entonces, el código final sería algo como:
de sklearn.metrics import mean_squared_error de math import sqrt
RMSD = sqrt (mean_squared_error (testing_y, predicción))
imprimir (RMSD)
fuente