[모두의 딥러닝] 4. 평균 제곱 오차(Mean Square Error, MSE)

평균 제곱 오차(Mean Square Error, MSE)

- 실제 데이터와 예측 데이터 차이(=오차)의 제곱에 대해 평균을 취한 것

- 입력 값이 여러 개인 경우, 가설을 세우고 값이 조건에 충족하는지 판단해서 조금씩 수정해 나가면서 오차가 최소가 될 때까지 반복하는 방법 사용

- 값을 조금씩 수정해 나가는 과정에서 오차를 평가하는 방법이 평균 제곱 오차

- 평균 제곱 오차에서 구한 값을 바탕으로 오차 최소화되는 값 구해야 함

 

 

  • 계산법

1. 각 데이터에서 오차를 구한다

2. 각 오차 값을 제곱한 후, 모두 더한다(부호가 있으면 정확한 오차 구하기 힘드므로 제곱 사용)

3. 오차의 제곱 합을 원소의 총 개수로 나눈다

오차의 합을 n(원소의 총 개수)로 나눈 것

 

  • 예제에 적용

1. y = 3x + 76이라는 직선의 방정식을 가설로 세웠을 때, 오차는

공부한 시간 2 4 6 8
성적 81 93 91 97
예측 값 82 88 94 100
오차(실제 값 - 예측 값) 1 -5 3 3

 

2. 각 오차의 값을 제곱한 후, 모두 더하면

1 + 25 + 9 + 9 = 44

 

3. 오차의 제곱합을 원소의 총 개수로 나누면

1/4 * 44 = 11

 

 

 

평균 제곱 오차 - 파이썬 코드로 구현

1. 환경 및 데이터 준비

# 넘파이 라이브러리 불러오기
import numpy as np

# 가상의 기울기 a와 y절편 b를 정하기
fake_a=3
fake_b=76

# 공부 시간 x와 성적 y의 넘파이 배열을 만듦
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])

 

2. 예측 값 구하기

# y=ax + b에 가상의 a,b 값을 대입한 결과를 출력하는 함수 생성
def predict(x):
    return fake_a * x + fake_b

# 예측 값이 들어갈 빈 리스트를 만듦
predict_result = []

# 모든 x값을 한 번씩 대입하여 predict_result 리스트를 완성
for i in range(len(x)):
    predict_result.append(predict(x[i]))
    print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))

 

3. 평균 제곱 오차 구하기

# 평균 제곱 오차 함수를 각 y값에 대입하여 최종 값을 구하는 함수
n=len(x)  
def mse(y, y_pred):
    return (1/n) * sum((y - y_pred)**2)

# 평균 제곱 오차 값을 출력
print("평균 제곱 오차: " + str(mse(y,predict_result)))
평균 제곱 오차: 11.0

 

 

 

 

'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고