본문으로 건너뛰기

045 선형 회귀 상세

키워드: 선형 회귀, lr

개요

선형 회귀(Linear Regression)는 가장 기본적이면서도 중요한 회귀 알고리즘입니다. 해석이 쉽고 기준선 모델로 자주 사용됩니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

선형 회귀 원리

y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

- β₀: 절편 (intercept)
- βᵢ: 회귀 계수 (coefficient)
- ε: 오차항

목표: 잔차 제곱합(RSS)을 최소화하는 계수 찾기

PyCaret에서 선형 회귀

from pycaret.regression import *
from pycaret.datasets import get_data

# 045 데이터 로드
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)

# 045 선형 회귀 모델 생성
lr = create_model('lr')

계수 해석

import pandas as pd
import numpy as np

# 045 계수 추출
feature_names = get_config('X_train').columns
coefficients = lr.coef_
intercept = lr.intercept_

# 045 DataFrame으로 정리
coef_df = pd.DataFrame({
'Feature': feature_names,
'Coefficient': coefficients
}).sort_values('Coefficient', key=abs, ascending=False)

print(f"절편: {intercept:.4f}")
print("\n회귀 계수:")
print(coef_df)

계수 해석 방법

# 045 예: rm (평균 방 개수) 계수가 3.5라면
# 045 → 방이 1개 늘어나면 가격이 $3,500 증가 (다른 변수 고정 시)

# 045 주의: 스케일링 여부에 따라 해석 달라짐
# 045 스케일링 전: 원래 단위 기준
# 045 스케일링 후: 표준편차 기준

선형 회귀 가정

1. 선형성

import matplotlib.pyplot as plt

# 045 특성과 타겟의 선형 관계 확인
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.ravel()

important_features = ['rm', 'lstat', 'ptratio', 'dis', 'nox', 'age']

for idx, feature in enumerate(important_features):
axes[idx].scatter(data[feature], data['medv'], alpha=0.5)
axes[idx].set_xlabel(feature)
axes[idx].set_ylabel('Price')

plt.tight_layout()
plt.savefig('linearity_check.png', dpi=150)

2. 독립성 (잔차의 독립성)

3. 등분산성

# 045 잔차 vs 예측값 플롯
predictions = predict_model(lr)
residuals = predictions['medv'] - predictions['prediction_label']

plt.figure(figsize=(10, 6))
plt.scatter(predictions['prediction_label'], residuals, alpha=0.5)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.title('Residuals vs Fitted')
plt.savefig('homoscedasticity_check.png', dpi=150)

# 045 패턴이 없으면 등분산성 만족

4. 정규성 (잔차의 정규성)

import scipy.stats as stats

plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)
residuals.hist(bins=30)
plt.title('Residual Distribution')

plt.subplot(1, 2, 2)
stats.probplot(residuals, plot=plt)
plt.title('Q-Q Plot')

plt.tight_layout()
plt.savefig('normality_check.png', dpi=150)

다중공선성 문제

from statsmodels.stats.outliers_influence import variance_inflation_factor

X = get_config('X_train')

# 045 VIF 계산
vif_data = pd.DataFrame()
vif_data['Feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print("VIF (다중공선성 지표):")
print(vif_data.sort_values('VIF', ascending=False))

# 045 VIF > 10이면 다중공선성 의심
# 045 해결: 변수 제거 또는 Ridge/Lasso 사용

스케일링 영향

from pycaret.regression import *
from pycaret.datasets import get_data

data = get_data('boston')

# 045 스케일링 없이
reg1 = setup(data, target='medv', normalize=False, session_id=42, verbose=False)
lr1 = create_model('lr', verbose=False)
coef1 = lr1.coef_

# 045 스케일링 적용
reg2 = setup(data, target='medv', normalize=True, session_id=42, verbose=False)
lr2 = create_model('lr', verbose=False)
coef2 = lr2.coef_

# 045 비교
comparison = pd.DataFrame({
'Feature': get_config('X_train').columns,
'Coef (No Scale)': coef1,
'Coef (Scaled)': coef2
})
print(comparison)

# 045 스케일링 후 계수: 표준화된 영향력 비교 가능

장단점

장점:

  • 해석이 매우 쉬움
  • 빠른 학습과 예측
  • 과적합에 강건 (단순한 모델)
  • 기준선 모델로 적합
  • 계수로 특성 영향력 파악

단점:

  • 비선형 관계 포착 불가
  • 이상치에 민감
  • 다중공선성에 영향받음
  • 가정 위반 시 성능 저하

언제 사용하나?

# 1. 기준선 모델로 시작
# 045 항상 선형 회귀부터 시도

# 2. 해석이 필수인 경우
# 045 계수로 비즈니스 인사이트 도출

# 3. 선형 관계가 예상되는 경우
# 045 물리적 법칙, 비례 관계

# 4. 빠른 예측이 필요한 경우
# 045 실시간 시스템

시각화

from pycaret.regression import *
from pycaret.datasets import get_data

data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)

lr = create_model('lr', verbose=False)

# 045 잔차 분석
plot_model(lr, plot='residuals')

# 045 예측 오차
plot_model(lr, plot='error')

# 045 계수 시각화
plot_model(lr, plot='parameter')

정리

  • 선형 회귀는 가장 기본적인 회귀 알고리즘
  • 계수로 특성의 영향력 해석 가능
  • 선형성, 등분산성, 정규성 가정 확인 필요
  • 다중공선성 문제 시 Ridge/Lasso 고려
  • 항상 기준선 모델로 먼저 시도

다음 글 예고

다음 글에서는 Ridge와 Lasso 회귀를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #045