[python] 파이썬에서 RMSE (Root Mean Square Error)에 대한 라이브러리 함수가 있습니까?

다음과 같이 제곱 평균 제곱 오류 함수를 구현할 수 있다는 것을 알고 있습니다.

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

이 rmse 함수가 scipy 또는 scikit-learn의 어딘가에 라이브러리에서 구현되어 있다면 무엇을 찾고 있습니까?



답변

sklearn.metrics갖는 mean_squared_error기능. RMSE는 그것이 반환하는 것의 제곱근입니다.

from sklearn.metrics import mean_squared_error
from math import sqrt

rms = sqrt(mean_squared_error(y_actual, y_predicted))


답변

RMSE 란 무엇입니까? MSE, RMD 또는 RMS라고도합니다. 어떤 문제가 해결됩니까?

RMSE : (루트 평균 제곱 오차), MSE : (평균 제곱 오차) RMD (루트 평균 제곱 편차) 및 RMS : (루트 평균 제곱 오차)를 이해 한 경우 라이브러리를 요청하여이를 계산하지 않아도됩니다. . 이러한 모든 측정 항목은 최대 2 인치 길이의 한 줄의 Python 코드입니다. rmse, mse, rmd 및 rms의 세 가지 메트릭은 기본적으로 개념적으로 동일합니다.

RMSE는 질문에 대한 답 : “평균 숫자가에 얼마나 유사한, list1list2?”. 두 목록의 크기가 같아야합니다. “어떤 주어진 두 요소 사이의 노이즈를 씻어 내고, 수집 된 데이터의 크기를 씻어 내고, 시간이 지남에 따라 변화하는 단일 숫자 느낌을 얻고 싶습니다.”

RMSE에 대한 직감 및 ELI5 :

다트 판에 다트 던지기를 배우고 있다고 상상해보십시오. 매일 1 시간 동안 연습합니다. 나아지고 있는지, 악화되고 있는지 파악하고 싶습니다. 따라서 매일 10 번의 던지기를하고 불즈 아이와 다트의 거리를 측정하십시오.

당신은 그 숫자의 목록을 만듭니다 list1. 1 일의 거리와 list20을 모두 포함하는 사이의 제곱 평균 오차를 사용하십시오 . 둘째 날과 둘째 날에도 똑같이하십시오. 당신이 얻을 것은 시간이 지남에 따라 희망적으로 감소하는 단일 숫자입니다. RMSE 번호가 0이면 매번 불시를칩니다. rmse 번호가 올라가면 악화되고 있습니다.

파이썬에서 근 평균 제곱 오차를 계산하는 예 :

import numpy as np
d = [0.000, 0.166, 0.333]   #ideal target distances, these can be all zeros.
p = [0.000, 0.254, 0.998]   #your performance goes here

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))

어떤 지문 :

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

수학적 표기법 :

근 평균 제곱 편차 설명

글리프 범례 : n 던지기 수를 나타내는 양의 정수입니다. isum을 열거하는 양의 정수 카운터를 나타냅니다. 위의 예에서 모든 0을 포함 d하는 이상적인 거리를 나타냅니다 list2. p성능을 의미 list1위의 예에서. 위첨자 2는 숫자 제곱을 나타냅니다. d i 는의 i 번째 인덱스입니다 d. p i 는의 i 번째 인덱스입니다 p.

rmse는 작은 단계로 수행되므로 이해할 수 있습니다.

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 ^

RMSE의 모든 단계는 어떻게 작동합니까?

한 숫자를 다른 숫자에서 빼면 그들 사이의 거리가됩니다.

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

여러 번 자체를 곱하면 음수는 음수이므로 양수는 항상 양수입니다.

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

그것들을 모두 합한 다음 기다리십시오. 그러면 많은 요소를 가진 배열은 작은 배열보다 큰 오류를 가지므로 요소 수로 평균화하십시오.

그러나 우리는 그것들을 모두 제곱하여 긍정적으로 만듭니다. 제곱근으로 피해를 되 돌리십시오!

그러면 평균적으로 list1의 모든 값과 list2의 해당 요소 값 사이의 거리를 나타내는 단일 숫자가 남습니다.

RMSE 값이 시간이 지남에 따라 내려 가면 분산 이 감소 하기 때문에 행복 합니다.

RMSE는 가장 정확한 라인 피팅 전략이 아니며 총 최소 제곱은 다음과 같습니다.

근 평균 제곱 오차는 점과 선 사이의 수직 거리를 측정하므로 데이터가 바나나 모양, 바닥 근처에서 평평하고 위쪽 근처에서 가파른 경우 RMSE는 높은 지점까지 거리가 멀지 만 실제로 거리가 동일 할 때 낮은 점. 이로 인해 선이 낮은 지점보다 높은 지점에 더 가깝게 기울어집니다.

이것이 문제인 경우 총 최소 제곱 방법 으로이 문제를 해결합니다 :
https://mubaris.com/posts/linear-regression

이 RMSE 기능을 손상시킬 수있는 문제점이 있습니다.

입력 목록에 널이나 무한대가 있으면 출력 rmse 값이 의미가 없습니다. 목록에서 null / 결 측값 / 무한도를 처리하는 세 가지 전략이 있습니다. 해당 구성 요소를 무시하고, 제로화하거나 모든 시간 단계에 최적의 추측 또는 균일 한 랜덤 노이즈를 추가하십시오. 각 치료법에는 데이터의 의미에 따라 장단점이 있습니다. 일반적으로 결 측값이있는 구성 요소를 무시하는 것이 바람직하지만 RMSE를 0으로 편향시켜 실제로 성능이 향상되지 않았을 때 성능이 향상되었다고 생각합니다. 결 측값이 많은 경우 최상의 추측에 임의 노이즈를 추가하는 것이 좋습니다.

RMSE 출력의 상대 정확성을 보장하려면 입력에서 모든 널 / 무한을 제거해야합니다.

RMSE에는 속하지 않은 특이 치 데이터 포인트에 대한 내성이 없습니다.

제곱 평균 오차 제곱은 올바른 모든 데이터에 의존하며 모두 동일하게 계산됩니다. 이것은 왼쪽 필드에서 빠져 나가는 하나의 빗나간 점이 전체 계산을 완전히 망칠 것이라는 의미입니다. 특정 임계 값 이후 특이 치 데이터 포인트를 처리하고 막대한 영향을 무시하려면 특이 치 기각 임계 값을 구성하는 강력한 추정량을 참조하십시오.


답변

아마도 더 빠를까요? :

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


답변

scikit-learn 0.22.0 mean_squared_error()에서는 인수 squared=False를 전달 하여 RMSE를 반환 할 수 있습니다 .

from sklearn.metrics import mean_squared_error

mean_squared_error(y_actual, y_predicted, squared=False)


답변

누군가 2019 년 에이 스레드를 찾은 경우 ml_metricsKaggle의 커널에 사전 설치없이 사용할 수 있는 라이브러리 가 있으며 매우 가볍고 액세스 pypi할 수 있습니다 (쉽고 빠르게 설치할 수 있음 pip install ml_metrics).

from ml_metrics import rmse
rmse(actual=[0, 1, 2], predicted=[1, 10, 5])
# 5.507570547286102

sklearn와 같이 사용할 수없는 다른 흥미로운 통계는 거의 없습니다 mapk.

참고 문헌 :


답변

사실, 나는 statsmodels의 유틸리티 함수로 많은 것을 썼습니다.

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


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

대부분 하나 또는 두 개의 라이너와 많은 입력 검사가 아니며 주로 배열을 비교할 때 일부 통계를 쉽게 얻도록 고안되었습니다. 그러나 축 인수에 대한 단위 테스트가 있습니다. 때때로 실수가 잘못되기 때문입니다.


답변

또는 단순히 NumPy 함수 만 사용하면됩니다.

def rmse(y, y_pred):
    return np.sqrt(np.mean(np.square(y - y_pred)))

어디:

  • y는 내 목표 야
  • y_pred는 나의 예측입니다

rmse(y, y_pred)==rmse(y_pred, y)제곱 기능으로 인해 유의하십시오 .