본문 바로가기
개발/Python

선형회귀모형의 변수 선택 (후진제거법, 전진선택법)

by 피로물든딸기 2025. 8. 14.
반응형

전체 링크

변수선택법

필터 방법 (Filter Methods)

- 데이터의 통계적 특성을 이용해 변수의 중요도를 미리 평가한 뒤 선택하는 방법.

- 변수 간의 상호작용을 고려하기 어려움.

  • 상관계수 (Correlation) : 종속 변수와의 상관관계가 큰 변수 선택
  • 카이제곱 검정 (Chi-square test) : 범주형 독립변수와 범주형 종속변수의 독립성 확인
  • ANOVA / F-test : 범주형 독립변수와 연속형 종속변수의 관련성 확인
  • 정보 이득 (Information Gain), 엔트로피, Gini Index
  • 분산 기준 (Variance Threshold) : 분산이 작은 변수 제거

 

래퍼 방법 (Wrapper Methods)

- 실제로 모델을 학습시키고 성능 기준으로 변수를 선택하는 방법.

- 필터 방법보다 연산량이 많음.

- 변수 간의 상호작용을 고려

  • 전진 선택법 (Forward Selection)
    • 아무 변수도 없는 상태에서 시작해서, 성능이 개선되지 않을 때까지 변수를 선택
  • 후진 제거법 (Backward Elimination)
    •  많은 독립변수(feature) 중에서 불필요한 변수를 제거해서 모델을 단순화하는 방법
    •  모든 변수를 포함해서 학습하고, 특정 성능 지표(AIC, BIC 등)를 기준으로 가장 기여도가 낮은 변수를 제거
  • 단계적 선택법 (Stepwise Selection) : 전진 + 후진을 혼합 (변수 추가/제거 반복)
  • Best Subset Selection : 가능한 모든 변수 조합 비교 (계산량 많음)

 

임베디드 방법 (Embedded Methods)

- 모델 학습 과정에서 변수 선택이 동시에 이루어지는 방법.

  • Lasso 회귀 (L1 정규화) : 중요하지 않은 변수 계수를 0으로 만듦 → 변수 선택 효과
  • Ridge 회귀 (L2 정규화) : 변수 선택보다는 계수 축소(regularization)에 유용
  • Elastic Net : L1 + L2 혼합 → 변수 선택과 안정성 동시에 확보
  • 의사결정나무 기반 중요도 (Random Forest, XGBoost feature importance)

 

차원 축소 기반 방법

- 직접적으로 "변수 선택"은 아니지만, 변수 수를 줄이는 데 활용됨. (변수 축소 효과)

  • PCA (주성분 분석) : 기존 변수들을 선형 결합해 새로운 변수 생성
  • LDA (선형판별분석) : 클래스 분리를 잘하는 축으로 차원 축소
  • t-SNE, UMAP : 비선형 차원 축소

후진제거법

다음과 같이 15개의 독립변수에서 절편을 제외하여 학습하면서 불필요한 변수를 제거해보자. (대상 지표 : AIC)

import pandas as pd
import numpy as np

np.random.seed(1234)

# 100행 × 15개 독립변수 생성
X = pd.DataFrame(
    np.random.randn(100, 15),
    columns=[f'X{i+1}' for i in range(15)]
)

# 3의 배수 컬럼 선택
cols_3_multiple = [col for col in X.columns if int(col[1:]) % 3 == 0]

# 랜덤 가중치 생성
weights = np.random.uniform(1, 5, size=len(cols_3_multiple))

# 선형 결합으로 y 생성
y = X[cols_3_multiple].dot(weights) + np.random.randn(100) * 0.5  # 약간의 노이즈 추가

# DataFrame 결합
df = X.copy()
df['y'] = y

df


독립변수를 cols에 저장하고 join을 이용해 수식을 만든다.

cols = df.columns.tolist()
cols.remove('y')

X = " + ".join(cols)
X

 

statsmodelsols를 이용해서 선형모델을 만들 수 있다. 

절편을 제외하기 위해 수식에 " + 0 "을 추가하였다.

from statsmodels.formula.api import ols

# 절편 제외 + 0
model = ols(f"y ~ {X} + 0", df).fit()
model.aic

 

이제 후진제거법을 실행하면 된다.

 

후진제거법은 변수를 제거하는 방법이기 때문에 많아야 전체 독립변수의 개수만큼만 실행할 수 있다.

변수를 하나씩 제거하면서 aic를 계산하고, 이때 가장 작은 aic와 모든 변수로 학습한 aic를 비교한다.

더 작은 aic가 존재한다면 그 값을 갱신해나가면서 aic가 더 이상 작아지지 않을 때 까지 반복하면 된다.

아래 코드를 실행하고 last_col을 출력하면 후진제거법에 의해 남아있는 변수만 출력된다. 

step = len(cols) # 후진제거법 최대 횟수 = 전체 독립변수의 개수
target = cols.copy() # 대상 독립변수
start_aic = model.aic # 기준이 되는 aic
for _ in range(step):
    list_aic = []    
    for col in target: 
        selected = [i for i in target if i is not col] # 하나의 변수를 제외하고
        X = " + ".join(selected) 
        model = ols(f"y ~ {X} + 0", df).fit() # 다시 모델을 만들어서
        list_aic.append(model.aic) # aic를 계산
        
    min_aic = min(list_aic) # aic 중 가장 작은 값
    min_col = target[np.array(list_aic).argmin()] # aic를 가장 작게 만든 독립변수
          
    last_col = target.copy() # 최종 target 변수를 확인하기 위한 변수
    
    if start_aic <= min_aic : break # 현재까지 최소의 aic와 비교
        
    print(start_aic, min_aic, " deleted :", min_col)
        
    target.remove(min_col) # 대상 독립변수에서 삭제
    start_aic = min_aic # aic 갱신
    
last_col


전진선택법

위의 데이터에 대해 전진선택법으로 colB까지 변수를 선택했다고 가정하자.

colA에서 aic를 기준으로 4개의 변수를 더 선택하라.

colA = ['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7']
colB = ['X8', 'X9', 'X10', 'X11', 'X12', 'X13', 'X14', 'X15']

대상 변수에서 하나씩 검토하는 것은 후진제거법과 같다.

다만 전진선택법은 aic를 작게 만드는 변수를 추가하도록 코드를 수정하였다.

from statsmodels.formula.api import ols

for _ in range(4): # 변수 선택 4번
    aic = []
    for col in colA: # colA에서
        cols = [col] + colB # colB에 변수 하나를 추가
        X = " + ".join(cols)
        
        model = ols(f"y ~ {X} + 0", df).fit() # 모델 학습
        
        aic.append(model.aic)
         
    selected = colA[np.array(aic).argmin()] # aic를 가장 작게 만드는 변수 선택
    colA.remove(selected) # colA에서 제거
    colB = [selected] + colB # colB에 추가
    
    print(colB)


AIC vs BIC

- 값이 작을수록 좋은 모델로 판단

- 최대우도값을 이용해서 점수 계산

- BIC는 데이터의 개수 (n)에 의한 패널티 증가가 존재

AIC

- 정확도와 간명성 사이의 상충을 조절하려는 방법, 많은 독립 변수를 갖는 모형에 패널티

- 데이터에 더 잘 맞추는 모델을 선호, 모델 예측 성능 중요 (조금 더 유연하게 변수 포함, 보편화)

 

BIC

- 불필요하게 복잡하지 않은 모델을 선호, 모델 분석 중요 (변수를 더 과감히 줄임)

- AIC보다 더 강한 패널티를 부여, 독립변수의 개수 x log(관측치의 개수)의 패널티를 부여

 

* 모형선택의 일치성 

- 통계 모델을 선택하는 절차가 샘플 수가 무한히 커질 때(true 모델을) 정확히 찾아낼 확률이 1로 수렴하는 성질

- AIC : 작은 샘플에서는 좋은 성능, 하지만 일치성은 보장되지 않음. → 과적합 경향

- BIC : 일치성 → 표본 수 ↑ 진짜 모형 선택 확률 → BIC는 데이터가 많아질수록 진짜 모형을 선택할 확률이 1로 수렴


그 외 RIC, CIC, DIC가 존재

 

RIC (Risk Inflation Criterion)

- 회귀모형에서 불필요한 변수 포함 시 위험(risk) 증가를 조정

- 변수 선택 시, 포함되는 변수 수가 늘어날수록 예측오차가 증가하는 것을 벌점(penalty)으로 반영

- 큰 표본에서는 일치성(consistency)을 갖도록 설계 가능

- 주로 고차원 회귀(high-dimensional regression)에서 변수 선택에 사용

- AIC보다 변수 선택에 더 보수적

- 과적합(overfitting) 방지에 도움

 

CIC (Criterion for Information Complexity)

- 모델의 예측 정확도복잡도를 동시에 고려

- 모델의 자유도(free parameters)와 정보 손실을 동시에 고려

- AIC처럼 예측 오차를 최소화하면서, 모델의 복잡도를 반영하여 과적합 방지

- 통계 모델뿐 아니라, 정보이론 기반 모형 선택에 적합

- 상대적으로 복잡한 모형 선택 기준

- 샘플이 작아도 어느 정도 안정적

 

DIC (Deviance Information Criterion)

- 베이지안 모델 선택(Bayesian Model Selection)

- DIC = 평균 deviance + penalty for effective number of parameters

- deviance = -2 * log-likelihood

- 모형 적합도 측정 → deviance 평균

- 모형 복잡도 측정 → effective number of parameters

- MCMC 기반 Bayesian 모델에서 주로 사용

- 값이 작을수록 좋은 모델

- 일반적인 AIC/BIC와 달리 Bayesian posterior 분포를 사용

- 복잡한 hierarchical 모델에도 적용 가능

반응형

댓글