J'ai des observations de caractéristiques numériques V1
à travers V12
prise pour une variable cible Wavelength
. Je voudrais calculer le RMSE entre les colonnes Vx
. Le format des données est ci-dessous.
Chaque variable "Vx" est mesurée à un intervalle de 5 minutes. Je voudrais calculer le RMSE entre les observations de toutes les variables Vx, comment faire?
Ceci est un lien que j'ai trouvé, mais je ne sais pas comment obtenir y_pred: https://www.kaggle.com/wiki/RootMeanSquaredError
Pour le lien fourni ci-dessous, je ne pense pas avoir les valeurs prévues: http://heuristically.wordpress.com/2013/07/12/calculate-rmse-and-mae-in-r-and -sas /
La fonction ci-dessous vous donnera le RMSE:
RMSE = function(m, o){
sqrt(mean((m - o)^2))
}
m
correspond aux valeurs du modèle (ajustées), o
correspond aux valeurs observées (vraies).
Voir mon autre 97+ réponse canonique votée pour faire RMSE en Python: https://stackoverflow.com/a/37861832/445131 Ci-dessous je l'explique en termes de code R.
RMSE: (Root Squared Error), MSE: (Mean Squared Error) et RMS: (Root Mean Squared) sont tous des astuces mathématiques pour avoir une idée du changement dans le temps entre deux listes de nombres.
RMSE fournit un numéro unique qui répond à la question: "Dans quelle mesure, en moyenne, les numéros de list1 à list2 sont-ils similaires?". Les deux listes doivent avoir la même taille. Je veux "éliminer le bruit entre deux éléments donnés, éliminer la taille des données collectées et obtenir une sensation numérique unique pour le changement au fil du temps".
Imaginez que vous apprenez à lancer des fléchettes sur un jeu de fléchettes. Chaque jour, vous pratiquez pendant une heure. Vous voulez savoir si votre état s'améliore ou s'aggrave. Donc, chaque jour, vous effectuez 10 lancers et mesurez la distance entre la bulle et l'endroit où votre fléchette a frappé.
Vous faites une liste de ces chiffres. Utilisez l'erreur quadratique moyenne entre les distances au jour 1 et une liste contenant tous les zéros. Faites de même les 2ème et nème jours. Vous obtiendrez un numéro unique qui, espérons-le, diminuera avec le temps. Lorsque votre numéro RMSE est nul, vous frappez des bullseyes à chaque fois. Si le nombre augmente, votre situation empire.
cat("Inputs are:\n")
d = c(0.000, 0.166, 0.333)
p = c(0.000, 0.254, 0.998)
cat("d is: ", toString(d), "\n")
cat("p is: ", toString(p), "\n")
rmse = function(predictions, targets){
cat("===RMSE readout of intermediate steps:===\n")
cat("the errors: (predictions - targets) is: ",
toString(predictions - targets), '\n')
cat("the squares: (predictions - targets) ** 2 is: ",
toString((predictions - targets) ** 2), '\n')
cat("the means: (mean((predictions - targets) ** 2)) is: ",
toString(mean((predictions - targets) ** 2)), '\n')
cat("the square root: (sqrt(mean((predictions - targets) ** 2))) is: ",
toString(sqrt(mean((predictions - targets) ** 2))), '\n')
return(sqrt(mean((predictions - targets) ** 2)))
}
cat("final answer rmse: ", rmse(d, p), "\n")
Qui imprime:
Inputs are:
d is: 0, 0.166, 0.333
p is: 0, 0.254, 0.998
===RMSE Explanation of steps:===
the errors: (predictions - targets) is: 0, -0.088, -0.665
the squares: (predictions - targets) ** 2 is: 0, 0.007744, 0.442225
the means: (mean((predictions - targets) ** 2)) is: 0.149989666666667
the square root: (sqrt(mean((predictions - targets) ** 2))) is: 0.387284994115014
final answer rmse: 0.387285
L'erreur quadratique moyenne mesure la distance verticale entre le point et la ligne, donc si vos données ont la forme d'une banane, plates près du bas et raides près du haut, alors le RMSE signalera des distances plus grandes aux points hauts, mais des distances courtes à points bas alors qu'en fait les distances sont équivalentes. Cela provoque un biais où la ligne préfère être plus proche des points hauts que bas.
Si c'est un problème, la méthode des moindres carrés au total corrige ceci: https://mubaris.com/posts/linear-regression/
S'il y a des valeurs nulles ou infinies dans l'une ou l'autre liste d'entrée, alors la valeur rmse de sortie ne va pas avoir de sens. Il existe trois stratégies pour gérer les valeurs nulles/manquantes/infinis dans l'une ou l'autre liste: ignorer ce composant, le mettre à zéro ou ajouter une meilleure estimation ou un bruit aléatoire uniforme à tous les pas de temps. Chaque remède a ses avantages et ses inconvénients en fonction de la signification de vos données. En général, il est préférable d'ignorer tout composant avec une valeur manquante, mais cela biaise le RMSE vers zéro, ce qui vous fait penser que les performances se sont améliorées alors qu'elles ne l'ont pas vraiment. Ajouter du bruit aléatoire sur une meilleure estimation pourrait être préféré s'il y a beaucoup de valeurs manquantes.
Afin de garantir l'exactitude relative de la sortie RMSE, vous devez éliminer tous les null/infinis de l'entrée.
Les carrés d'erreur quadratiques moyens reposent sur le fait que toutes les données sont correctes et que toutes sont comptées comme égales. Cela signifie qu'un point errant qui se situe dans le champ de gauche va complètement ruiner tout le calcul. Pour gérer les points de données aberrants et ignorer leur énorme influence après un certain seuil, voir Estimateurs robustes qui intègrent un seuil de rejet des valeurs aberrantes.
Pour votre aide, viens d'écrire ces fonctions:
#Fit a model
fit <- lm(Fertility ~ . , data = swiss)
# Function for Root Mean Squared Error
RMSE <- function(error) { sqrt(mean(error^2)) }
RMSE(fit$residuals)
# If you want, say, MAE, you can do the following:
# Function for Mean Absolute Error
mae <- function(error) { mean(abs(error)) }
mae(fit$residuals)
J'espère que ça aide.
Vous pouvez soit écrire votre propre fonction, soit utiliser le package hydroGOF, qui a également une fonction RMSE. http://www.rforge.net/doc/packages/hydroGOF/rmse.html
En ce qui concerne votre y_pred, vous avez d'abord besoin d'un modèle qui les a produits, sinon pourquoi voudriez-vous calculer RMSE?