Ich weiß, dass ich eine quadratische Fehlerfunktion wie folgt implementieren könnte:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
Was suche ich, wenn diese rmse-Funktion irgendwo in einer Bibliothek implementiert ist, vielleicht in scipy oder scikit-learn?
python
scikit-learn
scipy
siamii
quelle
quelle
.sum()
statt.mean()
zuerst geschrieben. Außerdem wird diese Funktion vermutlich so oft verwendet, dass ich keinen Grund sehe, warum sie nicht als Bibliotheksfunktion verfügbar sein sollte.predictions
undtargets
zum Beispiel vom Typ,int16
könnte das Quadrat überlaufen (negative Zahlen geben). Möglicherweise benötigen Sie ein.astype('int')
oder.astype('double')
vor der Verwendung des Quadrats, znp.sqrt(((predictions - targets).astype('double') ** 2).mean())
.Antworten:
sklearn.metrics
hat einemean_squared_error
Funktion. Der RMSE ist nur die Quadratwurzel dessen, was er zurückgibt.quelle
mean_squared_error
insklearn.metrics
unterstützt jetzt zusätzliche Parameter:squared
- "Wenn True den MSE-Wert zurückgibt, gibt False den RMSE-Wert zurück."Was ist RMSE? Auch als MSE, RMD oder RMS bekannt. Welches Problem löst es?
Wenn Sie RMSE: (mittlerer quadratischer Fehler), MSE: (mittlerer quadratischer Fehler) RMD (mittlere quadratische Abweichung) und RMS: (quadratischer Mittelwert) verstehen, ist es unnötig, nach einer Bibliothek zu fragen, um dies für Sie zu berechnen . Alle diese Metriken sind eine einzelne Zeile Python-Code, die höchstens 5 cm lang ist. Die drei Metriken rmse, mse, rmd und rms sind im Kern konzeptionell identisch.
RMSE beantwortet die Frage: „Wie ähnlich ist , im Durchschnitt sind die Zahlen in
list1
zulist2
?“. Die beiden Listen müssen gleich groß sein. Ich möchte "das Rauschen zwischen zwei beliebigen Elementen auswaschen, die Größe der gesammelten Daten auswaschen und ein Gefühl für eine Veränderung im Laufe der Zeit mit einer einzigen Zahl bekommen".Intuition und ELI5 für RMSE:
Stellen Sie sich vor, Sie lernen, Pfeile auf eine Dartscheibe zu werfen. Jeden Tag üben Sie eine Stunde lang. Sie möchten herausfinden, ob es Ihnen besser oder schlechter geht. Sie machen also jeden Tag 10 Würfe und messen den Abstand zwischen dem Bullauge und der Stelle, an der Ihr Pfeil getroffen hat.
Sie erstellen eine Liste dieser Nummern
list1
. Verwenden Sie den quadratischen Mittelwertfehler zwischen den Abständen am Tag 1 und alist2
, der alle Nullen enthält. Machen Sie dasselbe am 2. und n. Tag. Was Sie erhalten, ist eine einzelne Zahl, die hoffentlich mit der Zeit abnimmt. Wenn Ihre RMSE-Nummer Null ist, schlagen Sie jedes Mal Bullseyes. Wenn die rmse-Nummer steigt, werden Sie schlechter.Beispiel für die Berechnung des quadratischen Mittelwertfehlers in Python:
Welche Drucke:
Die mathematische Notation:
Glyphenlegende:
n
ist eine ganz positive ganze Zahl, die die Anzahl der Würfe darstellt.i
stellt einen ganzen positiven Ganzzahlzähler dar, der die Summe auflistet.d
steht für die idealen Abstände, dielist2
im obigen Beispiel alle Nullen enthalten.p
steht für Leistung, dielist1
im obigen Beispiel steht. hochgestellt 2 steht für numerisches Quadrat. d i ist der i- te Index vond
. p i ist der i- te Index vonp
.Die rmse erfolgt in kleinen Schritten, damit es verstanden werden kann:
Wie funktioniert jeder Schritt von RMSE:
Wenn Sie eine Zahl von einer anderen subtrahieren, erhalten Sie den Abstand zwischen ihnen.
Wenn Sie eine beliebige Anzahl selbst multiplizieren, ist das Ergebnis immer positiv, da negativ mal negativ positiv ist:
Addieren Sie sie alle, aber warten Sie, dann würde ein Array mit vielen Elementen einen größeren Fehler aufweisen als ein kleines Array. Mitteln Sie sie also nach der Anzahl der Elemente.
Aber warte, wir haben sie alle früher quadriert, um sie positiv zu erzwingen. Machen Sie den Schaden mit einer Quadratwurzel rückgängig!
Sie erhalten also eine einzelne Zahl, die im Durchschnitt den Abstand zwischen jedem Wert von list1 und dem entsprechenden Elementwert von list2 darstellt.
Wenn der RMSE-Wert mit der Zeit sinkt, freuen wir uns, dass die Varianz abnimmt.
RMSE ist nicht die genaueste Strategie zur Linienanpassung. Die kleinsten Quadrate sind:
Der quadratische Mittelwertfehler misst den vertikalen Abstand zwischen dem Punkt und der Linie. Wenn Ihre Daten also wie eine Banane geformt sind, flach in der Nähe des Bodens und steil in der Nähe des oberen Bereichs, meldet der RMSE größere Abstände zu hohen Punkten, aber kurze Abstände zu Punkte niedrig, wenn tatsächlich die Abstände gleich sind. Dies führt zu einem Versatz, bei dem die Linie lieber näher an hohen als an niedrigen Punkten liegt.
Wenn dies ein Problem ist, behebt die Methode der kleinsten Quadrate dies: https://mubaris.com/posts/linear-regression
Fallstricke, die diese RMSE-Funktion unterbrechen können:
Wenn eine der Eingabelisten Nullen oder Unendlichkeiten enthält, ist der rmse-Ausgabewert nicht sinnvoll. Es gibt drei Strategien, um mit Nullen / fehlenden Werten / Unendlichkeiten in beiden Listen umzugehen: Ignorieren Sie diese Komponente, setzen Sie sie auf Null oder fügen Sie allen Zeitschritten eine bestmögliche Schätzung oder ein einheitliches zufälliges Rauschen hinzu. Jedes Mittel hat seine Vor- und Nachteile, je nachdem, was Ihre Daten bedeuten. Im Allgemeinen wird das Ignorieren von Komponenten mit einem fehlenden Wert bevorzugt. Dies führt jedoch dazu, dass der RMSE gegen Null geht, sodass Sie glauben, dass sich die Leistung verbessert hat, wenn dies nicht der Fall ist. Das Hinzufügen von zufälligem Rauschen nach bestem Wissen könnte bevorzugt werden, wenn viele Werte fehlen.
Um die relative Korrektheit der RMSE-Ausgabe zu gewährleisten, müssen Sie alle Nullen / Unendlichkeiten aus der Eingabe entfernen.
RMSE hat keine Toleranz für Ausreißerdatenpunkte, die nicht dazu gehören
Fehlerquadrate des quadratischen Mittelwerts hängen davon ab, dass alle Daten richtig sind und alle als gleich gezählt werden. Das bedeutet, dass ein Streupunkt, der weit draußen im linken Feld liegt, die gesamte Berechnung völlig ruinieren wird. Informationen zum Umgang mit Ausreißerdatenpunkten und zum Entlassen ihres enormen Einflusses nach einem bestimmten Schwellenwert finden Sie unter Robuste Schätzer, die einen Schwellenwert für das Entlassen von Ausreißern festlegen.
quelle
Das ist wahrscheinlich schneller?:
quelle
In scikit-learn 0.22.0 können Sie
mean_squared_error()
das Argument übergebensquared=False
, um den RMSE zurückzugeben.quelle
Nur für den Fall, dass jemand diesen Thread im Jahr 2019 findet, gibt es eine Bibliothek namens,
ml_metrics
die ohne Vorinstallation in Kaggles Kerneln verfügbar ist, ziemlich leichtgewichtig und zugänglich überpypi
(sie kann einfach und schnell mit installiert werdenpip install ml_metrics
):Es gibt nur wenige andere interessante Metriken, die nicht verfügbar sind
sklearn
, wie zmapk
.Verweise:
quelle
Eigentlich habe ich einige davon als Dienstprogrammfunktionen für Statistikmodelle geschrieben
http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures
und http://statsmodels.sourceforge.net/devel/generated/statsmodels.tools.eval_measures.rmse.html#statsmodels.tools.eval_measures.rmse
Meistens ein oder zwei Liner und nicht viel Eingabeprüfung, und hauptsächlich dazu gedacht, beim Vergleich von Arrays leicht Statistiken zu erhalten. Aber sie haben Unit-Tests für die Achsenargumente, weil ich dort manchmal schlampige Fehler mache.
quelle
Oder indem Sie einfach nur NumPy-Funktionen verwenden:
Wo:
Beachten Sie dies
rmse(y, y_pred)==rmse(y_pred, y)
aufgrund der quadratischen Funktion.quelle
Sie können die RMSE-Funktion nicht direkt in SKLearn finden. Anstatt sqrt manuell auszuführen, gibt es eine andere Standardmethode für die Verwendung von sklearn. Anscheinend enthält Sklearns mean_squared_error selbst einen Parameter namens "squared" mit dem Standardwert true. Wenn wir ihn auf false setzen, gibt dieselbe Funktion RMSE anstelle von MSE zurück.
quelle
Hier ist ein Beispielcode, der den RMSE zwischen zwei Polygondateiformaten berechnet
PLY
. Es verwendet sowohl dieml_metrics
lib als auch dienp.linalg.norm
:quelle
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error (y_true, y_pred)
Der endgültige Code wäre also ungefähr so:
aus sklearn.metrics importiere mean_squared_error aus math importiere sqrt
RMSD = sqrt (mean_squared_error (testing_y, Vorhersage))
Drucken (RMSD)
quelle