ML/모두의 딥러닝

3장) 선형 회귀

busy맨 2023. 7. 6. 13:42

1. 선형 회귀(linear regression)

  • 종속 변수 y와 한 개 이상의 독립 변수 x와의 선형 상관 관계를 모델링하는 회귀분석 기법
    • 독립 변수 : 독립적으로 변할 수 있는 값 x, 정보 요소
    • 종속 변수 : 독립 변수에 따라 종속적으로 변하는 값 y
  • 하나의 x만 있을 때는 단순 선형 회귀(simple linear regression)
  • x가 여러개일 때는 다중 선형 회귀(multiple linear regression)

선형 회귀란 주어진 데이터에서 최적의 a값과 b값을 찾아내는 과정

2. 최소 제곱법

  • 회귀 분석에서 사용되는 표준 방식으로 기울기 a와 y절편 b를 구할 수 있음
  • 최소 제곱법은 단순 선형 회귀에서만 사용 가능
  • 기울기 a구하기

  • y절편 b 구하기

 

ex)

공부한 시간 2시간  4시간 6시간 8시간
성적 81점 93점 91점 97점

이 데이터를 최소 제곱법을 사용하면

a=2.3

b=79

 

따라서 직선의 방정식은

이 그래프에 x를 대입하면

공부한 시간 2 4 6 8
성적 81 93 91 97
예측 값 83.6 88.2 92.8 97.4

위의 직선이 바로 오차가 가장 적은 예측 직선이다.

 

import numpy as np

# x 값과 y값
x=[2, 4, 6, 8]
y=[81, 93, 91, 97]

# 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 절편 구하기
a = dividend / divisor
b = my - (mx*a)

# 출력으로 확인
print("기울기 a =", a)
print("y 절편 b =", b)

결과

3. 평균 제곱 오차(MSE)

최소 제곱법은 x가 하나일 때 사용

그러나 딥러닝은 대부분 입력값이 여러 개이므로 최소 제곱법으로는 한계 발생

→ 오차 평가 알고리즘을 사용하여 선을 수정

 

평균 제곱 오차(Mean Square Error)

  • 주어진 선의 오차를 평가하는 오차 평가 알고리즘
    • 오차 = 실제 값 - 예측값
  • 각 직선의 오차를 계산하고, 오차가 작은 쪽으로 바꾸는 알고리즘 필요
  • 직선의 기울기가 잘못될수록, 직선과 점들의 거리 합이 증가

기울기를 크게 잡았을 때
기울기를 작게 잡았을 때

선형 회귀란 임의의 직선을 그어 이에 대한 평균 제곱 오차를 구하고,
이 값을 가장 작게 만들어 주는 a와 b값을 찾아가는 과정

 

code) 

import numpy as np

#가상의 기울기 a와 y 절편 b
fake_a_b=[3,76]

# x 값과 y값
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]

# y=ax + b에 a,b 값 대입하여 결과를 출력하는 함수
def predict(x):
   return fake_a_b[0]*x + fake_a_b[1]

# MSE 함수
def mse(y, y_hat):
   return ((y - y_hat) ** 2).mean()

# MSE 함수를 각 y값에 대입하여 최종 값을 구하는 함수
def mse_val(y, predict_result):
   return mse(np.array(y), np.array(predict_result))

# 예측값이 들어갈 빈 리스트
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])))

# 최종 MSE 출력
print("MSE 최종값: " + str(mse_val(predict_result,y)))

결과