오답노트

[ML] 선형(선형 회귀, 로지스틱 회귀) 모델 변수 선택법 본문

Python/ML

[ML] 선형(선형 회귀, 로지스틱 회귀) 모델 변수 선택법

권멋져 2022. 8. 24. 22:33

AIC (아카이케 통계량)

AIC = - 모델적합도 + 변수의 개수

 

AIC는 위와 같은 식으로 표현할 수 있다.

모델 적합도가 높을 수록 아카이케 통계량이 낮아진다.

즉 아카이케 통계량이 낮을 수록 모델이 적합하다는 뜻이다.

또, 변수의 개수가 많을 수록 아카이케 통계량은 증가하는데 변수의 개수가 많다고 무조건 좋은 모델은 아니라는 뜻이다.

 

전진 선택법 (후진 소거법)

feature 마다 모델을 생성하고, 각각 feature를 하나씩 늘려가며 AIC 통계량을 측정한다.

그중 AIC 통계량이 가장 낮은 모델을 선정하는 것이다.

 

후진 소거법은 반대로 feature를 모두 사용한 모델부터 feature를 하나씩 줄여가며 AIC 통계량을 측정하고 그 중 가장 AIC가 가장 낮은 모델을 선정한다.

 

# 아래 함수는 로지스틱 회귀를 위한 전진선택법 함수 입니다.
import statsmodels.api as sm

def forward_stepwise_logistic(x_train, y_train):

    # 변수목록, 선택된 변수 목록, 단계별 모델과 AIC 저장소 정의
    features = list(x_train)
    selected = []
    step_df = pd.DataFrame({ 'step':[], 'feature':[],'aic':[]})

    # 
    for s in range(0, len(features)) :
        result =  { 'step':[], 'feature':[],'aic':[]}

        # 변수 목록에서 변수 한개씩 뽑아서 모델에 추가
        for f in features :
            vars = selected + [f]
            x_tr = x_train[vars]
            model = sm.Logit(y_train, x_tr).fit()
            result['step'].append(s+1)
            result['feature'].append(vars)
            result['aic'].append(model.aic)
        
        # 모델별 aic 집계
        temp = pd.DataFrame(result).sort_values('aic').reset_index(drop = True)

        # 만약 이전 aic보다 새로운 aic 가 크다면 멈추기
        if step_df['aic'].min() < temp['aic'].min() :
            break
        step_df = pd.concat([step_df, temp], axis = 0).reset_index(drop = True)

        # 선택된 변수 제거
        v = temp.loc[0,'feature'][s]
        features.remove(v)

        selected.append(v)
    
    # 선택된 변수와 step_df 결과 반환
    return selected, step_df

'Python > ML' 카테고리의 다른 글

[ML] k-fold Cross Validation  (0) 2022.08.25
[ML] HyperParameter Tuning  (0) 2022.08.24
[ML] SVM - SVC  (0) 2022.08.24
[ML] SVM (Support Vector Machine)  (0) 2022.08.24
[ML] Decision Tree - plot_tree  (0) 2022.08.24