AI/Machine Learning

[Machine Learning] 선형 회귀 (Linear Regression)

byunghyun23 2022. 9. 28. 16:59

회귀 분석은 머신러닝에서 기본이 되는 방법입니다.

회귀란 '한바퀴를 돌아 제자리로 돌아가다'라는 뜻으로, 머신러닝에서 회귀는 모델이 제시하는 추세선으로 데이터를 예측한다는 이야기입니다.

쉽게 말해서, 예측해야 하는 값이 범주형이 아닌 연속형(실숫값)일 경우 모델을 회귀 모델이라고 합니다.

 

회귀 분석은 여러 종류가 있습니다. 그 중 가장 간단한 방법인 선형 회귀 분석(Linear Regression)에 대하여 알아보겠습니다.

먼저 선형 관계란 두 데이터의 관계를 직선식으로 표현할 수 있다는 말입니다.

오직 1개의 피처 x와 예측하려는 타겟 데이터 y가 선형 관계가 존재할 때, 단일 선형 회귀라고 부르고 이를 수식화하면 다음과 같습니다.

선형 관계는 직선의 방정식으로 보면 됩니다. 즉, 데이터 x가 주어지면 x에 가중치 W를 곱하고 y 절편 b를 더하면 타겟 데이터 y를 예측할 수 있습니다.

위 그림의 빨간색 원을 데이터라고 할 때, 하늘색 선(직선과의 거리)의 길이를 짧게 만들도록 하는 W와 b를 찾는 것이 선형 회귀 분석입니다.

 

위 예시처럼 피처 개수가 1개가 아닌 p개의 피처를 가진 데이터라고 한다면 다중 선형 회귀라고 부르고 이를 수식화하면 다음과 같습니다.

가중치 W의 추정은 최소 제곱법을 사용합니다.

 

사이킷런의 LinearRegression 클래스를 사용해보겠습니다.

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

raw_boston = datasets.load_boston()

X = raw_boston.data
y = raw_boston.target
# X.shape, y.shape: (506, 13) (506,)

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
# X_train.shape, X_test.shape, y_train.shape, y_test.shape: (379, 13) (127, 13) (379,) (127,)

std_scaler = StandardScaler()
X_train = std_scaler.fit_transform(X_train)
X_test = std_scaler.transform(X_test)

lr = LinearRegression()
lr.fit(X_train, y_train)

print(lr.coef_)
# [-1.07145146  1.34036243  0.26298069  0.66554537 -2.49842551  1.97524314
#   0.19516605 -3.14274974  2.66736136 -1.80685572 -2.13034748  0.56172933
#  -4.03223518]
print(lr.intercept_)
# 22.344591029023768

pred_lr = lr.predict(X_test)

mse = mean_squared_error(y_test, pred_lr)
# 21.89776539604949

coef_는 추정된 회귀 계수를 의미합니다. 훈련 데이터 X_train의 shape가 (379, 13)으로 13개의 피처를 가지고 있었기 때문에 13개의 값이 추정됩니다.

추가로 intercept_는 추정된 상수항을 의미합니다.

 

predict() 함수를 호출하면 추정된 회귀 계수 w와 상수항 b, 그리고 입력 데이터 x를 이용하여 예측값 y를 반환합니다.

모델 평가는 여러 가지 방법이 있지만 위 코드에서는 MSE만 사용하였습니다.