티스토리 뷰

반응형

likethefirst.tistory.com/entry/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-Linear-Regression-Model-1

 

[Python] 선형회귀 (1) / 최소제곱법의 프로그래밍과 결과값 그래프로 나타내기

likethefirst.tistory.com/entry/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-Linear-Regression-Model-Basic 선형회귀 / Linear Regression Model / Basic 1. 선형회귀란 독립 변수 X와 X의 값에 따라 달라지는 종속..

likethefirst.tistory.com

 

 

지난 선형회귀 (1) 포스팅에서

기울기 a와 y절편 b를 예측하여

x 값에 따른 y 값을 추정해

그래프로 간단히 나타내 보았다.

 

이번 포스팅에서는

평균 오차 제곱(MSE)의 개념과

왜 필요한지 등

프로그래밍화 방법을 소개한다.

 

 

 

 

1. 평균 오차 제곱(MSE)이란?

추측값에 대해서 정확성을 알 수 있다.

말 그대로 오차의 제곱의 평균인 것이다.

 

아래와 같다고 가정해보자.

(1) 예측값 : 10, 실제값 : 5이면 오차는 5이다.

(2) 예측값 : 8, 실제값 : 5이면 오차는 3이다.

 

이 경우 오차가 작은 (2)의 경우가

더 정확히 추측했다고 보는 것이다.

 

그러므로 평균 오차 제곱은

그 값이 작을 수록 정확하다고 본다.

 

 

 공식 은 다음과 같다.

 

$ MSE = \frac{1}{n}\sum_{i=1}^n(\hat{Y}_{i}-Y_{i})^{2}$

 

 

 

 

 

2. 오차를 확인하는 과정, 왜 제곱의 합인가?

보통 그래프를 그려보고,

예측값과 실제값의 오차가

작아지는지를 확인하면서 값을 맞춰나간다.

 

평균 오차 제곱은 왜 제곱을 사용할까?

y_e(추정치), y(실제값)의 오차는

항상 양수가 아니다.

 

오차를 error라고 두면,

error = [1, -3, 2, 4, -4]인 경우

오차의 합은 1 + (-3) + 2 + 4 + (-4)이고,

이는 0이 되어 무의미한 판별 대상이 되는 것이다.

 

그러므로 이 오차들을 제곱한 합을 

총 개수로 나누어 정확도를 판단하는 척도로 이용한다.

 

 

 

 

 

3. 프로그래밍화 하기

 

 

3.1. 기울기 a와 y절편 b를 임의의 값으로 두기

 

1
fake_a_b = [379]
cs

 

 

  - 3.1. 설명  

a, b를 모른다고 생각하고

a = 3, b = 79로 가정하자.

 

 

 

 

3.2. 데이터셋 생성

 

1
2
3
data = [[2,81], [4,93], [6,91], [8,97]]
= [i[0for i in data]
= [i[1for i in data]
cs

 

 

  - 3.2. 설명  

data는 이전 포스팅의 값과 예제를

그대로 가져왔다.

 

= [i[0for i in data]는

data에 있는 [2,81]중 2,

[4,93] 중의 4처럼

첫 번째 값을 가져오고,

y는 두 번째 값을 가져온다.

 

 

x 2 4 6 8
y 81 93 91 97

 

x와 y를 print하면 이처럼 나온다.

 

 

 

 

 

3.3. 점수를 예측하고 리스트에 추가하기

 

1
2
3
4
5
6
7
8
predict_result = []
 
def predict(x):
    return fake_a_b[0* x + fake_a_b[1]
 
for i in range(len(x)):
    predict_result.append(predict(x[i]))
    print("공부 시간 = %.f, 실제 점수 = %.f, 예측 점수 = %.f" % (x[i], y[i], predict(x[i])))
cs

 

 

  - 3.3. 설명  

predict(x) 함수에서는
임의로 설정했던 a와 b의 값을 이용해
x를 매개변수로 받아
y의 값을 예측하여 return 한다.

fake-a_b[0]은 3이고, (a)
fake-a_b[1]은 79인 셈이다. (b)

 

그 예측값을 predict_result라는

리스트를 선언하여 비워두고,

x의 길이만큼 인덱스를 반복하여

for 문으로 예측 값을 얻고,

그것을 predict_result 리스트에

append(추가) 한다.

 

 

  - 3.3 결과  는 다음과 같다.

 

 

 

예측 점수는 

y = 3x + 79에 맞게 나온

y의 추정치이다.

 

 

예측 점수만 따로 출력한 결과이다.

print("predict(x[%d]) : %f" % (i, predict(x[i])))

코드를 for문에 추가하여

결과를 확인할 수 있다.

 

 

 

 

 

 

4. MSE 구하기

 

1
2
3
4
5
def mse_val(predict_result, y):
    return mse(np.array(predict_result), np.array(y))
 
def mse(y_hat, y):
    return ((y_hat - y) ** 2).mean()
cs

 

 

  - 4. 설명  

mse_val 함수에

예측 y값과 y값을 전달하여

np.array의 형식으로 변환하고,

이를 mse 함수의 매개변수로 전달한다.

 

mse 함수에서는 

이 두 매개변수를 받아

((y_hat - y) ** 2).mean()인

평균 오차 제곱을 구한다.

 

 

 

 

 

★ 5. 코드를 합하여 결과 출력하기

 

5.1. a = 3, b = 79로 가정

 

  - 5.1. 결과  

 

 

  - 5.1.  설명  

3.3. 에서 설정한

a = 3, b = 79에 따른

mse 최종값은 23.0이 출력되었다.

x = 8일 때 예측 성적이 103으로 초과되었다.

오차가 많이 발생하였음을 추측할 수 있다.

 

mse가 작은 값일 수록

정확도가 높다고 판단한다고 하였으니,

a와 b를 조정하여보자.

 

a와 b를 이전 포스팅 선형회귀 (1) 에서

가장 오차가 적도록 구해봤던

a = 2.3, b = 79로 조정한다.

 

 

 

 

5.2. 최적의 값인 a = 2.3, b = 79로 가정

 

  - 5.2. 결과  

 

 

  - 5.2.  설명  

mse 최종값이 약 8.3으로 줄었고,

실제 점수와 예측 점수를 비교했을 때

오차가 줄었다는 것을 확인할 수 있다.

 

 

 

  - 5.2.  그래프  

 

청색 점 : 예측 값

적색 점 : 실제 값

 

 

 

 

 

  - 마무리  

이번 포스팅에서는

평균 제곱 오차(MSE)를 구하는 방법과

a, b를 가변적으로 가정한 후의

MSE의 최종값 변화를 알 수 있었다.

 

결론적으로 MSE 값이 작을 수록

예측 값과 실제 값의 오차가 작아진다는 것

쌍방향으로 성립 가능하다는 것을 알았다.

반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요