[인사이드 머신러닝] 단순회귀모델: 회귀계수의 추정
회귀란 무엇인가?[1]
사전적으로 회귀(Regression)란 말은 '다시 원래 자리로 돌아간다'는 뜻으로 이를 통계 분석에 처음 사용한 사람은 영국의 우생학자 Galton으로 알려져있다. 그는 완두콩 실험을 통해 부모콩의 무게를 축으로 하고 자식콩의 무게를 축으로 산점도(scatter plot)를 그려 두 세대 간의 관계를 살펴보았다. 그는 부모콩의 무게가 무거울수록 자식콩의 무게도 무거워지는 경향이 있기는 하지만 그 경향이 기울기가 1보다 작아서 자식의 무게는 부모콩의 평균 무게로 돌아가려는 경향이 있다는 사실을 발견하고 이를 회귀라 표현하였다. 즉, 부모의 무게와는 무관하게 자식들의 무게는 대체적으로 평균을 중심으로 분포한다는 것이다. Galton의 연구실 동료 Karl Pearson은 이를 계량적으로 처음 분석하여 발표하였다.
20세기 초에는 회귀분석이란 용어가 세대 간의 회귀관계를 나타내는 분석으로 사용되었으나 차츰 세월이 흐르면서 변수들 간의 함수관계를 데이터로부터 분석하는 통계적 방법을 회귀분석이라고 이해하게 되었으며, 오늘날에도 이 용어들이 그대로 사용되고 있다.
설명변수와 반응변수
회귀분석은 매우 광범위하게 활용된다. 간단한 예로 다음과 같은 문제를 들 수 있다.
- 국민소득과 자동차 보유대수 간의 관계
- 자동차사고 발생건수와 병원의 입원 환자수의 관계
위 예시에서 국민소득과 자동차사고 발생건수와 같이 다른 변수에 영향을 주는 변수를 독립변수(independent variable) 또는 설명변수(explanatory variable)이라 부른다. 반면, 자동차사고 발생건수와 병원의 입원 환자수와 같이 독립변수에 의해 결정되는 변수들을 종속변수(dependent variable) 또는 반응변수(response variable)이라고 부른다. 즉,
- 설명변수(explanatory variable)=독립변수(independent variable)
- 반응변수(response variable)=종속변수(dependent variable)
회귀분석을 설명변수와 반응변수에 대하여 정의하자면, 회귀분석은 설명변수와 반응변수 간의 함수관계를 규명하는 통계적 분석방법이다. 참고로 앞으로 회귀모델을 다루는 포스트에서는 위 용어들을 혼재하여 사용할 것이다.
단순회귀모델
모델의 정의
[그림 1] 단순회귀모델의 예시 (빨간색은 regression line을 의미)
[그림 1]과 같이 설명변수 와 반응변수 의 관계가 직선의 형태를 가지는 경우 우리는 두 변수간의 적합모델을 다음과 같이 쓸 수 있다 [1]. (그림에서 파란색 원이 데이터이다.)
여기서
- : 번째 반응변수 값
- : 번째 설명변수 값
- : 절편 회귀계수
- : 기울기 회귀계수
- : 번째 측정된 의 오차 성분
- , ,
식 (1)과 같은 모델을 단순선형회귀모델(simple linear regression model)이라 부른다. 단순(simple)이라는 말의 의미는 다음과 같다.
- 모델이 회귀계수()에 대하여 선형
- 모델이 독립변수()에 대하여 선형
- 독립변수가 하나
식 (1)로부터 우리는 단순회귀모델에서 다음과 같은 사실을 알 수 있다.
- 가 random variable이므로 도 random variable
- 주어진 에서의 의 기대값은 와 같다. 따라서 와 같이 나타낼 수 있다.
- (의 분산이 와 무관)
- 오차 항들은 서로 독립이라고 가정한다. 따라서 반응변수 와 도 서로 독립이다.
회귀선의 추정
개의 샘플이 주어졌다고 하자. 우리의 목표는 개의 샘플을 이용하여 이를 대표하는 직선의 기울기 과 절편 를 추정하는 것이다. 이때 회귀직선은 의 추정할 때 발생하는 오차들을 가장 작게 하는 것이 좋을 것이다. 그러나 모든 샘플에 대한 오차를 최소화할 수는 없기 때문에 오차의 크기를 전체적으로 작게하는 방법을 선택하여야 한다. 이를 위해, 식 (1)을 참고하여 오차제곱합(Sum of Squared Error: SSE)를 다음과 같이 나타낼 수 있다.
올바른 회귀직선을 찾는다는 것은 SSE를 최소화한다는 것이므로 아래와 같이 SSE를 와 에 대하여 편미분하고, 0이 되는 값을 찾는다. 먼저 에 대한 미분을 살펴보자.
따라서
위 식으로부터 구하기 위해서는 을 먼저 구해야 함을 알 수 있다. 을 구하기 위해 에 대한 SSE의 미분 값이 0이 되는 경우를 살펴보자.
식 (4)에 식 (3)의 결과를 대입 후 식을 정리하면 다음과 같다.
따라서
식 (6)의 첫 번째 줄은 식 (5)의 두 번째 줄로부터 유도된 결과이고, 식 (6)의 두 번째 줄은
식 (5)의 첫 번째 줄로부터 유도된 결과이다. 그리고 식 (6)의 두 번째 줄에서 와 는 모두 으로 수식의 유도를 위해 추가된 dummy 항들이다. 결과적으로 회귀 직선의 기울기 은 와 의 공분산과 의 분산으로부터 추정된다.
식의 표현을 보다 간결하게 하기 위하여 분산과 공분산에 자유도를 곱한 값을 아래와 같이 나타내자.
식 (7)을 식 (6)에 대입하면
식 (3)과 식 (8)과 같이 SSE를 최소화하는 회귀계수를 추정하는 방법을 최소제곱추정(least square estimation, LSE)이라고 부르며, LSE를 통해 얻어진 추정치를 최소제곱 추정량(LS estimate)라고 부른다. 본 절의 결론은 단순회귀모델의 회귀계수는 LSE를 통해 구한다는 것이다.
상관계수는 이다(variance와 covariance 계산시 사용되는 자유도는 나누면 없어진다). 따라서 상관계수 을 알면 기울기 추정치 을 아래와 같이 다시 쓸 수 있다.
Residual의 성질
Residual은 에서 측정된 와 추정된 의 차로 정의된다. 즉,
와 같이 나타낼 수 있으며, 회귀계수가 LSE를 통해 추정되었다면 다음과 같은 흥미로운 성질이 성립한다.
-
Residual의 합은 0이다. 즉,
-
Residual의 제곱 합, ,은 항상 최소가 된다. 이는 LSE가 최소화하는 목적함수가 SSE이므로 자명하다.
-
이므로 관찰값 와 추정값 의 합은 같다. 즉,
-
와 의 가중합은 항상 0이다. 즉,
-
위와 같은 성질을 orthogonal priciple이라 한다. Orthgonal principle의 의미는 [그림 2]와 같다. 우리는 벡터 를 추정하고 싶지만 는 의 선형결합으로 이루어지므로 가 span하는 공간에만 존재할 수 있다. 그러나 는 항상 residual에 의해 가 span하는 공간 외부에 존재하게 되고, 우리가 할 수 있는 최선의 선택은 가 최대한 와 비슷해지도록 하는 것이다. 그리고 최대한 비슷해지도록 한다는 것은 [그림 2]와 같이 가 존재할 수 있는 공간상에서 에 최대한 가까운 을 결정하는 것이므로 결국 와 는 항상 직교하게 된다.
[그림 2] Orthogonal Principle
-
Orthogonal principle에 의해 와 의 가중합도 항상 0이다. 즉,
-
점 ()는 항상 적합된 회귀직선상에 존재한다.
- 적합된 회귀모델은 아래의 식 (15)와 같이 나타낼 수 있다. 식 (15)에 를 대입하면, 가 된다. 따라서 점 ()는 항상 적합된 회귀직선상에 존재한다.
파이썬 예제
- 파이썬에서 선형회귀모델을 실습하기 위해서는 sklearn.linear_model 패키지 아래 LinearRegression 클래스를 사용한다.
- LinearRegression 클래스를 lr로 객체화하고, fit() 메서드로 와 을 추정한다.
- 추정된 와 값은 각각 lr객체의 'coef_'와 'intercept_' 속성에 저장되어 있다.
# generage regression dataset
from sklearn.datasets import make_regression
x, y = make_regression(n_samples=100, n_features=1, n_targets=1, bias=2, noise=10, random_state=42)
# train medel (least sqaure estimation)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x, y)
# prediction
x_predict = 1.2
y_predict = lr.predict([[x_predict]])
# plot the result
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(x, y, s=10, marker = 'o', c='blue')
plt.plot([np.min(x), np.max(x)], [np.min(x)*lr.coef_+lr.intercept_, np.max(x)*lr.coef_+lr.intercept_], c='red')
plt.scatter(x_predict, y_predict, marker = 's', c='orange')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
# generage regression dataset
from sklearn.datasets import make_regression
x, y = make_regression(n_samples=100, n_features=1, n_targets=1, bias=2, noise=10, random_state=42)
# train medel (least sqaure estimation)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x, y)
# prediction
x_predict = 1.2
y_predict = lr.predict([[x_predict]])
# plot the result
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(x, y, s=10, marker = 'o', c='blue')
plt.plot([np.min(x), np.max(x)], [np.min(x)*lr.coef_+lr.intercept_, np.max(x)*lr.coef_+lr.intercept_], c='red')
plt.scatter(x_predict, y_predict, marker = 's', c='orange')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
[그림 3] 예제 코드 결과 그림
적합도 평가
앞에서 구한 회귀직선이 관측치들을 얼마나 잘 대표하는지 어떻게 정량적으로 평가할 수 있을까?
이에 대한 내용들을 다음 포스트에서 살펴보자.
참고자료
[1] 김성수, 강명욱, 강위창, "회귀모형," 한국방송통신대학교출판문화원, 2016.
[2] 박해선, 혼자 공부하는 머신러닝+딥러닝, 한빛미디어, 2020.
Author And Source
이 문제에 관하여([인사이드 머신러닝] 단순회귀모델: 회귀계수의 추정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cleansky/인사이드-머신러닝-회귀분석-단순회귀모저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)