가장 훌륭한 예측선 (선형 회귀)

TaeHyun Lee·2023년 3월 13일
0

AI 공부

목록 보기
3/17
post-thumbnail

딥러닝의 이해

딥러닝은 자그마한 통계의 결과들이 무수히 얽히고설켜 이루어지는 복잡한 연산의 결정체입니다. 딥러닝을 이해하려면 이것의 가장 말단에서 이루어지는 기본적인 두 가지 계산 원리를 알아야 합니다. 선형회귀로지스틱 회귀입니다.

선형 회귀의 정의

여기에 두 문장이 있습니다.

"학생들의 중간고사 성적이 다 다르다."
"학생들의 중간고사 성적이 [----] 에 따라 다 다르다."

두번째 문장에서는 [----]로 인해 결과가 변할 여지가 있습니다. 그리고 여기서 [----]에 들어가는 내용을 '정보'라고 합니다. 머신러닝과 딥러닝은 이 '정보'가 필요합니다. 정보가 있으면 학생들의 성적을 예측하는 방정식을 만들 수 있습니다.

성적을 변하게 하는 정보를 'x'라고 하고 그에 따라 변하는 값을 'y'라고 했을 때 'x'는 독립 변수라고 합니다. 그리고 'y'는 종속 변수라고 합니다.

선형 회귀란 독립 변수 x를 이용해 종속 변수 y의 움직임을 예측하고 설명하는 작업을 의미합니다.
이때 x가 하나뿐이어서 이것만으로 설명이 힘들 때는 여러개의 변수를 준비할 수도 있습니다. 이렇게 하나의 x값으로 y값을 설명할 수 있다면 단순 선형 회귀(simple linear regression)라고 합니다. 또한, x값이 여러개 필요하다면 다중 선형 회귀(multiple linear regression)라고 합니다.

가장 훌륭한 예측선이란?

X = {2, 4, 6, 8}
Y = {81, 93, 91, 97}

위와 같은 데이터를 좌표 평면에 나타내고, 주어진 점들의 특징을 담은 선은 직선이므로 다음과 같은 식으로 나타낼 수 있습니다.

y = ax + b

위의 데이터는 학생들의 시간에 따른 시험 성적입니다. 그리고 좌표평면의 점을 이용해서 선을 그리고 그 선의 기울기를 얻는다면, 학생이 공부한 시간만 알아도 시험 성적을 예측할 수 있는 것입니다. 딥러닝을 포함한 머신러닝의 예측은 이와 크게 다르지 않습니다. 따라서 선형 회귀를 이해하는 것이 딥러닝을 이해하는 데 중요한 첫걸음입니다.

최소 제곱법

이제 우리의 목표인 가장 정확한 선을 긋기 위해서는 선의 기울기 a와 y절편 b를 알아햐 합니다. 이때 이 값을 찾는 공식이 최소 제곱법(method of least squares)입니다.

최소 제곱법은 x의 편차를 제곱해서 합한 값을 분모에 두고, x와 y의 편차를 곱해서 합한 값을 분자로 두면 기울기가 나온다는 의미입니다. 위 학생들의 데이터를 대입해 보겠습니다.

공부한 시간(x) 평균: (2 + 4 + 6 + 8) / 4 = 5
성적(y) 평균: (81 + 93 + 91 + 97) / 4 = 90.5

그리고 이를 위의 식에 대입해보면 2.3이라는 값이 나옵니다. 이 기울기 값을 이용해서 x의 값을 대입하면 y의 값을 예측할 수 있다는 것입니다.

파이썬 코딩으로 확인하는 최소 제곱법

x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])
# 공부한 시간에 따른 성적을 각각 x, y배열로 만들었습니다.

mx = np.mean(x)
my = np.mean(y)
# mx와 my변수에는 각 변수들의 평균값을 넣습니다.

divisor = sum([(i-mx)**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)
# 변수 d에 x의 편차와 y의 편차를 곱해서 차례로 더해줍니다.

a = dividend / divisor
# 위 코드에서 구한 분모와 분자를 계산해 기울기 a를 구해줍니다.

b = my - (mx*a)
# 그리고 y절편을 구하는 공식을 사용해서 b를 구합니다.

평균 제곱 오차

위에서 배운 최소제곱법을 이용하면 기울기 a와 y절편 b를 편리하게 구했습니다. 하지만 이 공식만으론 입력데이터가 여러개인 상황에서 값을 도출해낼 수 없습니다. 그래서 선을 계속 그리면서 어떤 선이 더 좋은지 확인합니다. 확인을 위해서 선들의 오차를 평가하는 방법이 필요한데, 이 방법이 평균 제곱 오차(Mean Square Error, MSE)입니다.

좌표평면에 그린 점들을 지나는 선의 y값을 x값이 같은 점의 y값에서 빼줍니다. 그리서 그 값들을 모두 더하면 오차값이 나옵니다. 기울기가 다른 여러개의 선을 그리고 이 오차값을 비교하면 어떤 선이 더 좋은 선인지 알 수 있습니다.

평균 제곱 오차는 위에서 구한 오차값들의 평균을 구한 것입니다.

파이썬 코딩으로 확인하는 평균 제곱 오차

fake_a = 3
fake_b = 76

def predict(x):
	return fake_a * x + fake_b
# 임의로 정한 기울기 값 a 와 y 절편값 b를 각각 3, 76이라 하겠습니다.

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])))
# 모든 x값을 predict 함수에 대입해 예측 값 리스트를 채워줍니다.

n = len(x)
def mse(y, y_pred):
	return (1/n) * sum((y - y_pred) ** 2)
# 평균 제곱 오차를 구하는 함수를 만들어 줍니다.

공부시간=2, 실제점수=81, 예측점수=82
공부시간=4, 실제점수=93, 예측점수=88
공부시간=6, 실제점수=91, 예측점수=94
공부시간=8, 실제점수=97, 예측점수=100

이렇게 총 오차는 약 11이라는 것을 알게 되었습니다. 다음 장에서는 오차를 줄이는 방법에 대해 알아보겠습니다.

profile
서커스형 개발자

0개의 댓글