머신 러닝의 개념 중 지도학습(Supervised Learning)에 대하여 정리한 적이 있다.
그 중 머신러닝의 선형 회귀(Linear Regression)의 개념을 정리해보자.
회귀 분석(Regression Analysis)
먼저 회귀 분석이란 무엇인까?
회귀의 사전적인 의미는 "다시 예전의 상태로 돌아감" 을 의미한다.
이 용어는 영국의 유전학자 Francis Galton 이라는 분이 유전의 법칙을 연구하다 나온 것에 기인하게 되는데 대략적인 연구내용을 살펴보자면 부모와 자녀의 키 사이의 관계를 연구하면서 나오게 된 연구의 결과로 자녀의 키가 아버지 그리고 어머니 키의 평균을 조사하여 표로 나타낸 결과 결국 자녀의 키는 엄청 크거나 작은 것이 아닌 그 세대의 평균으로 돌아가려는 경향이 있다는 것을 발견하였다. 그래서 Galton은 이를 회귀 분석이라 하게 되었다.
Regression
자! 이제 선형 회귀(Linear Regression)에 대해 알아보자.
일단 간단하게 요약하자면 데이터를 가장 잘 대변하는 직선의 방정식을 찾는 것 이라고 할 수 있다.
위의 그림에서 파란색 점은 데이터를 의미한다. 데이터가 이렇게 분포되어 있을 때 데이터 전체를 가장 잘 대변하도록 직선을 긋는다면 해당 직선은 어떤 모습이 될까? 라는 것이 Linear Regression의 핵심이다.
직선의 방정식은 y = ax + b로 표현이 가능한데, 여기서 a는 기울기, b는 y절편을 의미한다.
따라서 요약하면 Linear Regression은 이 데이터들을 가장 잘 대변하는 직선의 방정식의 기울기와 y절편.
즉, y = ax + b의 a 값과 b 값을 구하는 과정이라고 할 수 있다.
선형 회귀를 잘 표현하는 예시를 통해 이해를 해보도록 하자.
위의 데이터에서 왼쪽은 학습 시간, 오른쪽은 시험 점수를 의미한다. 일반적으로 공부한 시간이 길수록 점수가 높게 나오게 된다. 즉, 어떠한 값들이 선형적인 증가 혹은 감소 관계에 있을 때 이 관계를 해석하는 것이 Regression이다.
위의 데이터에서 예측하는 스코어의 유효 범위는 0~100점 사이이다.
위의 데이터 즉, Training dataset을 가지고 학습(트레이닝)을 시키게 되면 이에 해당하는 회귀 모델(Regression Model)의 기반인 어떤 모델이 만들어지게 된다.
위와 같이 3개의 학습 데이터가 있을 때 우리는 이 데이터를 통해서 Linear 모델을 찾게 된다.
즉, 데이터의 분포가 하나의 선 안에 표현될 수 있을 때와 같은 최적의 모델을 찾는다.
그리고 학습한 이 데이터의 모델이 맞을 것이라고 일단 가정하는 것이며 이 선을 찾아서 나타내는 것이 학습을 하는 것이라고 볼 수 있다.
밑의 그림은 해당 데이터를 가장 잘 나타낼 수 있다고 판단되는 직선들을 가정한 것이다.
Hypothesis (Linear)
이제 위 3개의 점을 대변하는 직선의 방정식을 생각해보자.
이것이 우리의 가설(Hypothesis)이다. 해당 선이 이 데이터를 가장 잘 대변하고 있다고 가정을 한다. 이 직선은 기울기와 절편으로 표현을 할 수 있는데 이전 설명에서 ax + b라고 설명을 했지만 이제부턴 W, b로 표현하겠다.
사실 표현을 바꿔도 의미하는 바는 같다.
여기서 H(x)가 우리가 가정한 가설(Hypothesis)을 의미하고 W(Weight)의 값 그리고 b(bias) 의 수치에 따라 선의 모양이 달라지게 된다.
Which hypothesis is better?
우리의 가설은 과연 얼마나 데이터를 잘 대변하고 있을까??
위의 세개의 직선 중 데이터를 가장 잘 대변하는 직선은 파란 직선이라고 할 수 있다. 그렇다면 파란 직선이 데이터를 가장 잘 대변하도록 H(x) = Wx + b의 Weight, bias는 어떻게 정할 수 있을까?
Cost Function
우리는 Weight, bias를 정의하기 위해서 이제는 비용(Cost)을 생각해 볼 수가 있다.
위의 그림에서 H(x) - y 은 (우리의 가설) - (실제 데이터) 라고 할 수 있고 해당 차이가 빨간 선으로 표현된 부분이다.
그렇다면 빨간 색 선으로 표현된 값들의 합. 즉, 빨간 색 선들의 총합이 작으면 작을 수록 해당 점선이 데이터를 잘 표현하고 있다고 말할 수 있을 것이다.
이렇게 (우리의 가설) - (실제 데이터) 의 값을 우리는 cost, lose 혹은 error라고 한다. 결론적으로 우리가 하려는 일은 이 cost, loss, error를 최소화하는 방법을 찾는 것이다!!
하지만 Cost의 값의 최소화에만 목적을 두면 문제가 발생할 우려가 있다. 왜냐하면 가설에서 y 값을 뺀 값이 어떤 부분은 양수지만 또 어떤 부분은 음수로 나타난다. 이처럼 양수, 음수로 나타난다면 이 빨간색 라인들의 합을 구하는 것이 무의미해 질 수도 있다.
How fit the line to our (training) data
이러한 문제를 방지하기 위해 우리는 이 H(x) - y의 값을 제곱해서 사용을 한다. 또한 이를 바탕으로 실제로 더 차이가 큰 값에는 더 큰 패널티를 줄 수 있도록 이러한 가중치를 자동적으로 부여할 수 있게 된다. 비용 함수(Cost Function)에 대한 식을 나타내면 아래와 같다.
일반적으로 m을 데이터의 개수라 하면 각각의 우리가 예측한 값 X와 실제 데이터 값 Y의 차이(이를 error라고 한다.) 를 제곱한 값의 전체 데이터 개수만큼의 결과 값을 더하여 다시 데이터의 개수만큼 크기로 나누어 평균을 구하게 되는 것이다.
Goal : Minimize cost
결과적으로, 이 회귀 분석(Linear Regression)을 통하여 그래프 상에서 선을 그렸을 때 W(가중치) 값과 미세하게 조절되는 b(바이어스)의 값을 찾아 가설과 실제 데이터의 차가 가장 작은 최소값을 찾는 것이 머신러닝에서의 선형 회귀(Linear Regression)의 학습이라고 볼 수있다.
이제 해당 개념을 바탕으로 텐서플로우 라이브러리를 활용하여 선형 회귀의 모델을 구현해보도록 하겠다.
Cost, Gradient descent, tf.GradientTape 에 대한 설명이 코드와 같이 명시되어 있으니 살펴보기 바란다.