다중 선형 회귀 모델(Multiple Linear Regression)
※ 단순 선형 회귀를 모른다면? (아래 클릭 시 링크로 이동)
단순 선형 회귀 모델(Simple Linear Regression Model)
다중 선형 회귀가 뭐지?
단순 선형 회귀와 다중 선형 회귀
선형 회귀의 가장 단순한 예제는 한 개의 스칼라 독립 변수 x와 한 개의 스칼라 의존 변수 y의 관계일 것이다. 이를 단순 선형 회귀라 부른다. 여기에서 독립 변수를 여러 개로 확장한 것이 다중 선형 회귀이다.실세계의 거의 대부분의 문제는 여러 개의 독립 변수를 포함하며, 선형 회귀라 함은 보통 다중 선형 회귀를 일컫는다. 하지만 이러한 경우에도 여전히 응답 변수 y는 한 개의 스칼라 변수이다. 다변량 선형 회귀는 응답 변수 y가 벡터인 경우를 의미한다. 이러한 경우를 일반 선형 회귀라 부른다. 다중 선형 회귀와 다변량 선형 회귀는 다른 의미이므로, 혼동하지 않도록 주의해야 한다.
- 위키백과 (선형 회귀 中)
영향을 받은 결과와 영향을 준 요인의 개수를 '결과 : 요인'이라고 표현하면 단순 선형 회귀는 1:1이고 다중 선형 회귀는 1:N이다.
여기서 이 결과가 종속 변수(또는 타겟)이고, 요인을 독립 변수(특성)라고 한다.
선형 회귀에서의 가정이나 최소제곱법을 이용하여 결과값을 구하는 등의 특징은 단순 선형 회귀와 공유한다.
다만 다중 선형 회귀에서는 특성의 개수가 2개 이상이므로 다중공선성(Multicollinearity)$^*$$^1$을 주의해야 한다.
다중 선형 회귀는 어떻게 하는거지?
기본적인 원리는 단순 선형 회귀와 비슷하다.
다만 차이점이라면 특성의 개수가 2개 이상이므로 회귀 방정식(단순 선형 회귀에서는 직선을 나타내는 식)에 차이가 있다.
단순 선형 회귀에서의 회귀 방정식은 $$y=β_0+β_1x$$ 이고, 다중 선형 회귀에서의 회귀 방정식은 $$y=β_0+β_1x_1+β_2x_2+ ... +β_nx_n$$ 이다.
(자세한 계산 과정은 하단 참고 자료의 링크로)
scikit-learn을 활용한 다중 선형 회귀
- 데이터 불러오기 & 훈련/테스트 데이터 나누기
# 예시 데이터 불러오기 (House Sales in King County, USA)
import pandas as pd
df = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/kc_house_data/kc_house_data.csv')
df.date = pd.to_datetime(df.date) # 날짜 형식으로 변환
df.head()
id | date | price | bedrooms | bathrooms | sqft_living | sqft_lot | floors | waterfront | view | condition | grade | sqft_above | sqft_basement | yr_built | yr_renovated | zipcode | lat | long | sqft_living15 | sqft_lot15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 7129300520 | 2014-10-13 | 221900.0 | 3 | 1.00 | 1180 | 5650 | 1.0 | 0 | 0 | 3 | 7 | 1180 | 0 | 1955 | 0 | 98178 | 47.5112 | -122.257 | 1340 | 5650 |
1 | 6414100192 | 2014-12-09 | 538000.0 | 3 | 2.25 | 2570 | 7242 | 2.0 | 0 | 0 | 3 | 7 | 2170 | 400 | 1951 | 1991 | 98125 | 47.7210 | -122.319 | 1690 | 7639 |
2 | 5631500400 | 2015-02-25 | 180000.0 | 2 | 1.00 | 770 | 10000 | 1.0 | 0 | 0 | 3 | 6 | 770 | 0 | 1933 | 0 | 98028 | 47.7379 | -122.233 | 2720 | 8062 |
3 | 2487200875 | 2014-12-09 | 604000.0 | 4 | 3.00 | 1960 | 5000 | 1.0 | 0 | 0 | 5 | 7 | 1050 | 910 | 1965 | 0 | 98136 | 47.5208 | -122.393 | 1360 | 5000 |
4 | 1954400510 | 2015-02-18 | 510000.0 | 3 | 2.00 | 1680 | 8080 | 1.0 | 0 | 0 | 3 | 8 | 1680 | 0 | 1987 | 0 | 98074 | 47.6168 | -122.045 | 1800 | 7503 |
# 2015-01-01을 기준으로 훈련/테스트 데이터 분리
train = df[df.date < '2015-01-01']
test = df[df.date >= '2015-01-01']
- 타겟 및 기준 모델 설정
# 타겟 설정
target = 'price'
y_train = train[target]
y_test = test[target]
# price 평균값으로 예측(기준모델)
predict = y_train.mean()
predict
539181.4284152258
# 기준모델로 훈련 에러(MAE) 계산
from sklearn.metrics import mean_absolute_error
y_pred = [predict] * len(y_train)
mae = mean_absolute_error(y_train, y_pred)
print(f'훈련 에러: {mae:.2f}')
훈련 에러: 233570.83
# 테스트 에러(MAE)
y_pred = [predict] * len(y_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'테스트 에러: {mae:.2f}')
테스트 에러: 233990.69
- 다중 선형 회귀 모델 만들기
# 다중모델 학습을 위한 특성
features = ['bathrooms', 'sqft_living']
X_train = train[features]
X_test = test[features]
# 모델 fit
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_train)
mae = mean_absolute_error(y_train, y_pred)
print(f'훈련 에러: {mae:.2f}')
훈련 에러: 170777.34
# 테스트 데이터에 적용
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'테스트 에러: {mae:.2f}')
테스트 에러: 179252.53
- 절편과 회귀계수 확인
# 절편(intercept)과 계수들(coefficients)
model.intercept_, model.coef_
(-50243.56279640319, array([-5158.92591411, 286.13753555]))
∵ 특성이 2개이기 때문에 회귀 계수도 2개
## 회귀식
b0 = model.intercept_
b1, b2 = model.coef_
print(f'y = {b0:.0f} + {b1:.0f}x\u2081 + {b2:.0f}x\u2082')
y = -50244 + -5159$x_1$ + 286$x_2$
- 훈련/테스트 데이터에 대한 평가 지표 결과 확인
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
def evaluate(features, model, train, test):
y_train = train[target]
y_test = test[target]
X_train = train[features]
X_test = test[features]
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
mse = mean_squared_error(y_train, y_pred_train)
rmse = mse ** 0.5
mae = mean_absolute_error(y_train, y_pred_train)
r2 = r2_score(y_train, y_pred_train)
mse_t = mean_squared_error(y_test, y_pred_test)
rmse_t = mse_t ** 0.5
mae_t = mean_absolute_error(y_test, y_pred_test)
r2_t = r2_score(y_test, y_pred_test)
display(pd.DataFrame([['MSE', mse, mse_t],['RMSE', rmse, rmse_t],['MAE', mae, mae_t],['R2', r2, r2_t]], columns=['Metric', 'Score(Training)', 'Score(Test)']))
evaluate(features, model, train, test)
Metric | Score(Training) | Score(Test) | |
---|---|---|---|
0 | MSE | 6.709905e+10 | 7.108399e+10 |
1 | RMSE | 2.590348e+05 | 2.666158e+05 |
2 | MAE | 1.707773e+05 | 1.792525e+05 |
3 | R2 | 5.076086e-01 | 4.599930e-01 |
∗1 다중공선성(Multicollinearity)이란?
다중공선성(多重共線性)문제(Multicollinearity)는 통계학의 회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 문제이다. 독립변수들간에 정확한 선형관계가 존재하는 완전공선성의 경우와 독립변수들간에 높은 선형관계가 존재하는 다중공선성으로 구분하기도 한다. 이는 회귀분석의 전제 가정을 위배하는 것이므로 적절한 회귀분석을 위해 해결해야 하는 문제가 된다.
- 위키백과
특성(독립 변수)들끼리 강한 상관 관계가 있는 경우를 의미한다.
만약 이를 배제하지 않고 분석에 그대로 사용하게 되면 결과가 왜곡될 위험이 크다.
<참고 자료>
[통계 이론] 선형 회귀 : 다중 회귀 분석
머신러닝 - 다중선형회귀(Multiple Linear Regression)
'Machine Learning > Linear Models' 카테고리의 다른 글
[ML] 릿지 회귀(Ridge Regression) (0) | 2021.11.01 |
---|---|
[ML] 회귀 모델 평가 지표(Evaluation Metrics for Regression Models) (0) | 2021.10.22 |
[ML] 단순 선형 회귀 모델(Simple Linear Regression Model) (0) | 2021.10.18 |