Goal
-
선형 회귀분석의 개념과 목표를 이해한다.
-
선형 회귀분석의 오차함수(Cost Function)을 이해한다.
-
선형 회귀분석의 경사하강식을 학습한다.
본 포스팅의 목적을 Python으로 기본적인 선형 회귀분석을 구현하는 것이기 때문에 P값 등의 통계학적 개념은 배제하고, 선형 회귀분석의 직접 구현만을 목표로 포스팅을 작성하였다.
선형회귀분석이란?
위키피디아의 정의에 의하면, 선형 회귀분석은
종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법이다. 한 개의 설명 변수에 기반한 경우에는 단순 선형 회귀, 둘 이상의 설명 변수에 기반한 경우에는 다중 선형 회귀라고 한다.
즉 위의 데이터에서 붉은 선을 그은 것과 같이 데이터로 가지고 있는 독립변수와 결과값인 종속 변수 사이의 관계를 선형 또는 비선형의 모델로 나타내는 것이 선형 회귀분석을 학습시키는 것이다.
선형 회귀분석을 사용하는 이유
만약 위와 같은 데이터를 가지고 있을 때, 면적이 1700m^2이면서 가격이 30,000$인 집이 비싼지 판단하기 위해서 선형 회귀분석을 사용할 수 있다. 아래의 붉은 선형회귀 모델을 훈련시켰을 때, 회귀모델에 1700 을 대입하면, 약 31K가 나옵니다. 따라서 30,000$는 적당한 가격임을 알 수 있습니다.
이와 같이 선형 회귀분석의 목표는 훈련 데이터를 대표하는 모델을 훈련시켜서, 새로운 데이터 혹은 미래의 데이터의 독립 변수가 주어졌을 때, 목적 변수의 값을 추측하는 것입니다.
선형 회귀분석 모델의 목표
선형 회귀분석으로 훈련된 모델은 데이터를 잘 대표해야 합니다. 모델을 통해 예측된 값과 실제 데이터의 차이가 적을수록 잘 훈련된 모델이라고 할 수 있을것입니다.
위 사진에서 초록 선은 비교적 데이터를 잘 나타내고 있지만, 붉은 선은 잘 나타내고 있지 못합니다. 실제 데이터의 위치와 모델이 예측한 값과의 거리를 관찰하면, 붉은 선이 훨씬 큰 것을 관찰할 수 있습니다.
머신러닝에서 모델이 예측한 값은, 가설을 의미하는 hypothesis를 줄인, h(x)를 사용합니다. h(X)는 X가 주어졌을 때, 모델이 예측하는 값을 나타내는 함수입니다. 선형 회귀분석에서 h(x)=ax+b입니다. 그리고 선형 회귀분석의 목표는 예측값 h(x)와 실제 목적 변수 y간의 오차를 최소화하는 a, b를 찾는 것입니다.
선형 회귀분석의 오차 함수(Cost Function)
현재 선형 회귀분석 모델을 평가하는 오차 함수는 자신의 모델이 얼마나 틀렸는지, 즉 예측값이 실제 값과 얼마의 오차를 내고 있는지를 나타내는 함수입니다. 오차 함수는 위 그림에서와 같이 |h(x)-y|가 아니라, (h(x)-y)^2의 제곱 오차로 나타내어진다. 즉 아래 사진의 노란 사각형의 넓이가 각 데이터마다 더해지는 오차입니다. 이를 선형 회귀분석의 제곱오차라고 합니다. 선형 회귀분석의 목표는 오차함수를 최소화하는 가중치 θ(a, b)를 찾는 것입니다.
X와 y가 아래와 같은 벡터이고, X의 i번째 요소를 X(i) 라고할 때, 오차함수 J(θ)는 다음과 같다.
h(x)는 우리의 가설이기 때문에, ax+b가 우리가 예측할 값이다. 물론 a, b는 훈련시켜야 하는 변수이다.
오차 함수를 그대로 읽으면, 모든 데이터에 대해 예측값과 실제값의 제곱오차를 더해 준다고 할 수 있습니다.
오차 함수 앞의 1/2m은 이터의 갯수로 나누어주는 부분인데, 데이터의 평균을 구하는 이유는 아래의 문제 떄문입니다.
첫번째와 두번째 사진에서 두번째 보다는 첫번째 사진의 가중치(a, b)가 많이 변해야 합니다. 즉 오차 함수가 첫번째에서 커야 하지만, 데이터의 갯수로 나누지 않으면, 두번째 사진에서 오차의 합이 더 클 것입니다. 또한 학습이 완료된 후 모델의 성능을 평가할 때도, 데이터의 갯수로 나누면, 데이터 하나에서 모델이 어느 정도 잘못 예측하는지를 알 수 있습니다.
경사 하강법(Gradient Descent)로 모델 훈련 시키기
경사 하강법에 대한 자료는 이곳
경사 하강법을 통해 오차함수를 최적화하기 위해서는 오차함수를 미분한 도함수를 구해야 합니다. 또한 우리가 최적화해야하는 오차함수의 인수는 a, b 두개 이므로 두 인수에 대한 편미분을 해야 합니다. 편미분을 간단히 말하자면 a에 대해 미분할 때는 b를 상수로, b에 대해 미분할 때는 a를 상수로 보고 미분하는 것입니다.
위의 오차함수를 미분한 과정은 다음과 같습니다.
h(x)에 ax+b를 대입하고 제곱을 전개했습니다.
전개한 이후 a에 대해 편미분한 값은 위와 같습니다.
전개한 이후 b에 대해 편미분한 값은 위와 같습니다.
편미분을 통해 오차함수에서 a, b의 기울기를 구했으니 이제 경사하강법을 통해 python으로 단순선형회귀분석을 구현할 수 있을 것입니다.
궁금한 것이나 질문은 댓글로 물어주시면 감사하겠습니다.
'Machine Learning Algorithm > Linear Regression(선형 회귀)' 카테고리의 다른 글
[ML][Python] 선형 회귀분석(Linear Regression) 직접 구현하기(2) 단순선형 회귀분석 Python 구현 (0) | 2019.07.04 |
---|