Wiem, że mógłbym zaimplementować funkcję błędu średniej kwadratowej w następujący sposób:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
Czego szukam, jeśli ta funkcja rmse jest zaimplementowana gdzieś w bibliotece, być może w scipy lub scikit-learn?
python
scikit-learn
scipy
siamii
źródło
źródło
.sum()
zamiast.mean()
pierwszego przez pomyłkę napisałem . Ponadto przypuszczam, że ta funkcja jest używana tak często, że nie widzę powodu, dla którego nie miałaby być dostępna jako funkcja biblioteczna.predictions
itargets
są na przykład typu,int16
kwadrat może się przepełnić (dając liczby ujemne). Więc możesz potrzebować.astype('int')
lub.astype('double')
przed użyciem kwadratu, na przykładnp.sqrt(((predictions - targets).astype('double') ** 2).mean())
.Odpowiedzi:
sklearn.metrics
mamean_squared_error
funkcję. Wartość RMSE to po prostu pierwiastek kwadratowy z tego, co zwraca.źródło
mean_squared_error
insklearn.metrics
obsługuje teraz dodatkowy parametr:squared
- "Jeśli True zwraca wartość MSE, jeśli False zwraca wartość RMSE."Co to jest RMSE? Znany również jako MSE, RMD lub RMS. Jaki problem rozwiązuje?
Jeśli rozumiesz RMSE: (błąd średniokwadratowy), MSE: (błąd średniokwadratowy) RMD (odchylenie średniej kwadratowej) i RMS: (średnia kwadratowa), to prośba o bibliotekę do obliczenia tego za Ciebie jest niepotrzebnym przeprojektowaniem . Wszystkie te wskaźniki to pojedynczy wiersz kodu Pythona o długości maksymalnie 2 cali. Trzy metryki rmse, mse, rmd i rms są w swej istocie koncepcyjnie identyczne.
RMSE odpowiada na pytanie: „Jak podobne są średnio liczby
list1
dolist2
?”. Obie listy muszą mieć ten sam rozmiar. Chcę „zmyć szum pomiędzy dowolnymi dwoma danymi elementami, zmyć rozmiar zebranych danych i uzyskać odczucie zmiany pojedynczej liczby w czasie”.Intuicja i ELI5 dla RMSE:
Wyobraź sobie, że uczysz się rzucać lotkami w tarczę do rzutek. Codziennie ćwiczysz przez godzinę. Chcesz dowiedzieć się, czy czujesz się lepiej, czy gorzej. Więc każdego dnia wykonujesz 10 rzutów i mierzysz odległość między tarczą a miejscem, w którym uderzyła twoja strzałka.
Robisz listę tych numerów
list1
. Użyj średniego kwadratu błędu między odległościami w dniu 1 i alist2
zawierającym wszystkie zera. Zrób to samo w drugi i n-ty dzień. Otrzymasz pojedynczą liczbę, która, miejmy nadzieję, maleje z czasem. Kiedy Twój numer RMSE wynosi zero, za każdym razem trafiasz w dziesiątkę. Jeśli liczba rmse wzrośnie, sytuacja się pogarsza.Przykład obliczenia średniej kwadratowej błędu w Pythonie:
Które wydruki:
Notacja matematyczna:
Glyph Legend:
n
to cała dodatnia liczba całkowita reprezentująca liczbę rzutów.i
reprezentuje cały dodatni licznik całkowity, który wylicza sumę.d
oznacza idealne odległości,list2
zawierające wszystkie zera w powyższym przykładzie.p
oznacza wydajność,list1
w powyższym przykładzie. indeks górny 2 oznacza numeryczny kwadrat. d i jest i- tym indeksemd
. p i jest i- tym indeksemp
.Rmse wykonano małymi krokami, aby można było je zrozumieć:
Jak działa każdy krok RMSE:
Odejmowanie jednej liczby od drugiej daje odległość między nimi.
Jeśli pomnożymy dowolną liczbę razy siebie, wynik jest zawsze dodatni, ponieważ ujemny razy ujemny jest dodatni:
Dodaj je wszystkie, ale poczekaj, wtedy tablica z wieloma elementami miałaby większy błąd niż mała tablica, więc uśrednij je przez liczbę elementów.
Ale poczekaj, wyrównaliśmy je wszystkie wcześniej, aby wymusić na nich pozytywne wyniki. Cofnij szkody za pomocą pierwiastka kwadratowego!
To daje ci pojedynczą liczbę, która średnio reprezentuje odległość między każdą wartością z listy list1 a odpowiadającą jej wartością elementu list2.
Jeśli wartość RMSE spada w czasie, jesteśmy zadowoleni, ponieważ zmniejsza się wariancja .
RMSE nie jest najdokładniejszą strategią dopasowania linii, całkowita metoda najmniejszych kwadratów to:
Podstawowy błąd średniokwadratowy mierzy odległość w pionie między punktem a linią, więc jeśli dane mają kształt banana, płaskiego u dołu i stromego u góry, wówczas RMSE zgłosi większe odległości do punktów wysoko, ale małe odległości do punkty niskie, podczas gdy w rzeczywistości odległości są równoważne. Powoduje to pochylenie, w którym linia woli być bliżej punktów wyższych niż niskich.
Jeśli jest to problem, metoda całkowitej najmniejszych kwadratów rozwiązuje ten problem: https://mubaris.com/posts/linear-regression
Błędy, które mogą złamać tę funkcję RMSE:
Jeśli na którejś z list wejściowych znajdują się wartości null lub nieskończoność, wyjściowa wartość rmse nie będzie miała sensu. Istnieją trzy strategie radzenia sobie z zerami / brakującymi wartościami / nieskończonościami na każdej z list: Zignoruj ten składnik, wyzeruj go lub dodaj najlepsze przypuszczenie lub jednolity losowy szum do wszystkich kroków czasowych. Każdy środek zaradczy ma swoje wady i zalety w zależności od tego, co oznaczają Twoje dane. Ogólnie rzecz biorąc, preferowane jest ignorowanie dowolnego komponentu z brakującą wartością, ale powoduje to odchylenie RMSE w kierunku zera, co sprawia, że myślisz, że wydajność poprawiła się, gdy tak naprawdę nie jest. Dodanie losowego szumu na podstawie najlepszego przypuszczenia może być preferowane, jeśli brakuje wielu wartości.
Aby zagwarantować względną poprawność danych wyjściowych RMSE, należy wyeliminować wszystkie wartości null / nieskończoności z danych wejściowych.
RMSE ma zerową tolerancję dla odstających punktów danych, które nie należą
Średnia kwadratowa kwadratów błędu polega na tym, że wszystkie dane są prawidłowe i wszystkie są liczone jako równe. Oznacza to, że jeden zbłąkany punkt w lewym polu całkowicie zrujnuje całe obliczenia. Aby poradzić sobie z punktami danych odstających i odrzucić ich ogromny wpływ po pewnym progu, zobacz Solidne estymatory, które tworzą próg odrzucania wartości odstających.
źródło
To jest prawdopodobnie szybsze ?:
źródło
W scikit-learn 0.22.0 możesz przekazać
mean_squared_error()
argumentsquared=False
zwracający wartość RMSE.źródło
Na wypadek, gdyby ktoś znalazł ten wątek w 2019 roku, istnieje biblioteka o nazwie,
ml_metrics
która jest dostępna bez wstępnej instalacji w jądrach Kaggle, dość uproszczona i dostępna przezpypi
(można ją łatwo i szybko zainstalować za pomocąpip install ml_metrics
):Zawiera kilka innych interesujących wskaźników, które nie są dostępne w
sklearn
, takich jakmapk
.Bibliografia:
źródło
Właściwie to napisałem kilka z nich jako funkcje narzędziowe dla modeli stat
http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures
i http://statsmodels.sourceforge.net/devel/generated/statsmodels.tools.eval_measures.rmse.html#statsmodels.tools.eval_measures.rmse
Przeważnie jeden lub dwa linery i niezbyt dużo sprawdzania danych wejściowych, głównie przeznaczone do łatwego uzyskiwania niektórych statystyk podczas porównywania tablic. Ale mają testy jednostkowe dla argumentów osi, ponieważ tam czasami popełniam niechlujne błędy.
źródło
Lub po prostu używając tylko funkcji NumPy:
Gdzie:
Zauważ, że
rmse(y, y_pred)==rmse(y_pred, y)
ze względu na funkcję square.źródło
Nie można znaleźć funkcji RMSE bezpośrednio w SKLearn. Ale zamiast ręcznie wykonywać sqrt, istnieje inny standardowy sposób użycia sklearn. Najwyraźniej sam błąd mean_squared_error w Sklearnie zawiera parametr o nazwie „do kwadratu” z domyślną wartością true. Jeśli ustawimy go na false, ta sama funkcja zwróci RMSE zamiast MSE.
źródło
Oto przykładowy kod, który oblicza RMSE między dwoma formatami plików wielokątów
PLY
. Wykorzystuje zarównoml_metrics
bibliotekę, jak inp.linalg.norm
:źródło
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error (y_true, y_pred)
Tak więc końcowy kod wyglądałby tak:
from sklearn.metrics import mean_squared_error from math import sqrt
RMSD = sqrt (mean_squared_error (testowanie_y, przewidywanie))
drukuj (RMSD)
źródło