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