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


158

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

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

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


5
함수를 바로 작성했습니다. 함수가 작성하기 간단하다면 라이브러리에 없을 것입니다. 모듈이라는 디렉터를 만들고 유용한 기능을 추가하여 경로에 추가하는 것이 좋습니다.
Ryan Saxe

14
@RyanSaxe 동의하지 않습니다. 라이브러리 함수를 직접 구현하는 것보다 라이브러리 함수를 호출하는 것이 훨씬 더 안심입니다. 예를 들어, 나는 실수 .sum().mean()처음 대신 썼습니다 . 또한이 함수가 너무 많이 사용되어 라이브러리 함수로 사용할 수없는 이유를 알 수 있다고 생각합니다.
siamii 2016 년

1
@siamii : 100 %, 나는 이런 종류의 기능이 scipy가 아닌 이유를 추측하고 있음을 이해합니다. 만약 내가 그것을 찾을 수없는 것
Ryan Saxe

1
경우이를 시도하고 작동하지 않았다 사람들 predictionstargets유형의 예입니다 int16제곱 힘 오버 플로우 (제공 부정적인 번호). 따라서과 같이 사각형을 사용하기 전에 .astype('int')또는 이 필요할 수 있습니다 . .astype('double')np.sqrt(((predictions - targets).astype('double') ** 2).mean())
John

sklearn에서 이것을 사용하는 또 다른 이점은 sklearn 구현에 어레이가 동일한 모양을 유지하고 가중치 매개 변수를 포함하고 다차원 배열과 다른 '어레이 좋아'을 처리하는 추가 보일러 플레이트 코드가 많이 있다는 것입니다. 이 모든 것을하는 것은 이것을 훨씬 더 복잡한 문제로
David Waterworth

답변:


214

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

3
mean_squared_errorin은 sklearn.metrics이제 추가 매개 변수를 지원합니다 squared.- "True가 MSE 값을 반환하면 False가 RMSE 값을 반환하는 경우"
Daddy32

132

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에는 속하지 않은 특이 치 데이터 포인트에 대한 내성이 없습니다.

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


3
예, 간단한 기능입니다. 그러나 일상적으로 필요한 경우 올바른 솔루션을 사용하여 매번 다시 구현할 필요가 없도록 올바른 솔루션을 사용하십시오. )
논리 x 2

:이 봐 가질 수 있다면 에릭 - leschinski @, 나는 감사하겠습니다 stackoverflow.com/questions/45173451/...
DESTA Haileselassie Hagos

1
사람들이 멀티 기가 바이트 크기의 라이브러리를 요구하고 지적하는 것은이 세대의 신호입니다. 3 ~ 20 분의 네트워크 다운로드가 필요하고 CPU 전체 기울기 설치가 필요합니다. 실제로 필요한 것은 400 바이트에 맞는 약 3 줄의 코드입니다. 한 줄의 코드로 압축 할 수있는 작업 (약 90 자)에 대해 라이브러리를 요청하는 경우 99.9999 인 50GB 크기의 설치로 3, 10, 곧 50GB 크기의 사용자를 남용 할 수있는 라이센스를 부여합니다. 부풀림 %. 이것은 로켓 수술이 아닙니다. 1978 년에 740hz 프로세서로 제작 된 태양열 계산기는 RMSE를 수행 할 수 있습니다.
Eric

22

아마도 더 빠를까요? :

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

18

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)

2
이것은 새로운 기능이며 이것을 사용하면 가장 좋습니다.
Ravi G

9

누군가 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.

참고 문헌 :


4

사실, 나는 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

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


3

또는 단순히 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)제곱 기능으로 인해 유의하십시오 .


3

SKLearn에서 직접 RMSE 기능을 찾을 수 없습니다. 그러나 수동으로 sqrt를 수행하는 대신 sklearn을 사용하는 또 다른 표준 방법이 있습니다. Sklearn의 mean_squared_error 자체에는 기본값이 true 인 "squared"라는 매개 변수가 포함되어 있습니다. false로 설정하면 동일한 함수가 MSE 대신 RMSE를 반환합니다.

# code changes implemented by Esha Prakash
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred , squared=False)

0

다음은 두 다각형 파일 형식 사이의 RMSE를 계산하는 예제 코드입니다 PLY. ml_metricslib와 다음을 모두 사용 합니다 np.linalg.norm.

import sys
import SimpleITK as sitk
from pyntcloud import PyntCloud as pc
import numpy as np
from ml_metrics import rmse

if len(sys.argv) < 3 or sys.argv[1] == "-h" or sys.argv[1] == "--help":
    print("Usage: compute-rmse.py <input1.ply> <input2.ply>")
    sys.exit(1)

def verify_rmse(a, b):
    n = len(a)
    return np.linalg.norm(np.array(b) - np.array(a)) / np.sqrt(n)

def compare(a, b):
    m = pc.from_file(a).points
    n = pc.from_file(b).points
    m = [ tuple(m.x), tuple(m.y), tuple(m.z) ]; m = m[0]
    n = [ tuple(n.x), tuple(n.y), tuple(n.z) ]; n = n[0]
    v1, v2 = verify_rmse(m, n), rmse(m,n)
    print(v1, v2)

compare(sys.argv[1], sys.argv[2])

-1
  1. 아니요, 머신 러닝을위한 Scikit Learn 라이브러리 가 있으며 Python 언어를 사용하여 쉽게 사용할 수 있습니다. 그것은 아래 링크를 공유하는 평균 제곱 오류에 대한 기능을 가지고 있습니다 :

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html

  1. 함수는 아래와 같이 mean_squared_error로 이름이 지정됩니다. 여기서 y_true는 데이터 튜플의 실제 클래스 값이고 y_pred는 사용중인 기계 학습 알고리즘에 의해 예측 된 예측 값입니다.

mean_squared_error (y_true, y_pred)

  1. 파이썬을 사용하여 sqrt 함수를 사용하여 RMSE를 얻으려면 수정해야합니다.이 프로세스는 다음 링크에 설명되어 있습니다 : https://www.codeastar.com/regression-model-rmsd/

따라서 최종 코드는 다음과 같습니다.

sklearn.metrics에서 가져 오기 math import sqrt에서 mean_squared_error

RMSD = sqrt (평균 _ 제곱 _ 오류 (검정 _y, 예측))

인쇄 (RMSD)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.