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