도순씨의 코딩일지

딥러닝 :: 선형회귀, 최소 제곱법, 평균 제곱근 오차 본문

𝐂𝐎𝐌𝐏𝐔𝐓𝐄𝐑 𝐒𝐂𝐈𝐄𝐍𝐂𝐄/𝐃𝐄𝐄𝐏 𝐋𝐄𝐀𝐑𝐍𝐈𝐍𝐆

딥러닝 :: 선형회귀, 최소 제곱법, 평균 제곱근 오차

도순씨 2020. 8. 4. 23:58

선형회귀란, 독립 변수 x와 이 독립 변수에 따라서 종속적으로 변하는 y의 움직임을 예측하고 설명하는 작업을 말한다.

그 중에서 최소 제곱법을 활용하여 최적의 기울기와 y절편을 찾을 수 있다. 선형회귀는 다음과 같이 정의될 수 있다.

이것을 코드로 구현해보면 다음과 같다.

 

@ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
 
# x와 y 값
= [2468]
= [81939197]
 
# x와 y의 평균값
mx = np.mean(x)
my = np.mean(y)
print("x의 평균값: ", mx)
print("y의 평균값: ", my)
 
# 기울기 공식의 분모
divisor = sum([(mx - i) ** 2 for i in x])
 
# 기울기 공식의 분자
def top(x, mx, y, my):
    d = 0
    for i in range(len(x)):
        d += (x[i] - mx) * (y[i]-my)
    return d
dividend = top(x, mx, y, my)
 
print("분모: ", divisor)
print("분자: ", dividend)
 
# 기울기와 y 절편 구하기
= dividend / divisor
= my - (mx * a)
 
# 출력으로 확인
print("기울기 a = ", a)
print("y 절편 b = ", b)
cs

 

@ 실행 결과

1
2
3
4
5
6
x의 평균값:  5.0
y의 평균값:  90.5
분모:  20.0
분자:  46.0
기울기 a =  2.3
y 절편 b =  79.0
cs

 

하지만 이 식은 너무 단순하기 때문에 오차가 클 수도 있다는 단점이 있다. 그러므로 오차를 평가하는 방법이 필요하다.

 

오차를 평가하는 방법 중 가장 많이 사용되는 방법은 평균 제곱근 오차이다. 조금씩 수정해나가는 방법이다.

조금씩 변화를 주고 이 변화가 긍정적이라면 오차가 최소가 될 때까지 이 과정을 반복하는 방법이다.

 

오차 = 실제 값 - 예측 값으로 계산된다. 이 값을 모두 더해 데이터의 수로 나누면 평균 제곱 오차가 된다. 

평균 제곱근 오차의 코드는 다음과 같다.

 

@ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
 
# 기울기 a와 y절편 b
ab = [376]
 
# x와 y의 데이터 값
data = [[281], [493], [691], [897]]
= [i[0for i in data]
= [i[1for i in data]
 
# y = ax+b에 a와 b 값을 대입하여 결과를 출력하는 함수
def predict(x):
    return ab[0* x + ab[1]
 
# RMSE 함수
def rmse(p, a):
    return np.sqrt(((p - a) ** 2).mean())
 
# RMSE 함수를 각 y 값에 대입하여 최종 값을 구하는 함수
def rmse_val(predict_result, y):
    return rmse(np.array(predict_result), np.array(y))
 
# 예측 값이 들어갈 빈 리스트
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])))
 
# 최종 RMSE 출력
print("rmse 최종값: " + str(rmse_val(predict_result, y)))
cs

@ 실행 결과

1
2
3
4
5
공부한 시간= 2.000000, 실제 점수 = 81.000000, 예측 점수 = 82
공부한 시간= 4.000000, 실제 점수 = 93.000000, 예측 점수 = 88
공부한 시간= 6.000000, 실제 점수 = 91.000000, 예측 점수 = 94
공부한 시간= 8.000000, 실제 점수 = 97.000000, 예측 점수 = 100
rmse 최종값: 3.3166247903554
cs

 

실행 결과를 통해 오차가 약 3.32라는 것을 알 수 있다.

 

* 출처

조태호, 모두의 딥러닝(2017), 길벗

Comments