본문 바로가기
Machine Learning

성능 향상 (변수 선택)

by Nowkeeh Ahc

 변수 선택 (Feature Selection)이란 머신러닝 모형이 최적의 성능을 보이도록 유의미한 독립변수들을 선별하는 과정이다. 변수 선택은 일변량 통계기반의 선택, 모형기반의 선택, 그리고 반복적 선택 방법 등을 통해 수행한다.

 

1) 일변량 통계기반 선택

 일변량 통계기반 변수 선택은 독립변수와 종속변수 간의 통계적 관계가 존재하는지 일변량 통계량에 기초하여 판단하고 유의미한 독립변수들을 선별하는 방법이다. 모형으로 예측하려는 주제가 분류 문제일 경우는 카이스퀘어(x2) 값을, 수치 예측 문제에는 피어슨 상관계수(r)와 같은 일변량 통계량을 사용하고, p값에 기초하여 높은 p값을 갖는 변수들을 순차적으로 제거하면서 최적의 변수를 선택하게 된다. 

 Scikit-Learn 라이브러리에서 주로 사용하는 일변량 통계기반 변수 선택 기능은 SelectKBest( ) 함수나 SelectPrecentile( ) 함수를 주로 사용하는데, 각각 사용자가 지정한 변수 개수나 비율만큼 적절한 변수를 선택하게 된다. 다음 코드는 SelectKBest( ) 함수를 이용하여 내가 가지고 있는 샘플 데이터 세트에서 이진 분류기에 사용할 변수를 선택하는 코드이다.

#1. 모듈 및 함수 불러오기
from sklearn.feature_selection import SelectKBest, chi2

#2. 변수 지정(독립변수/종속변수)
X = df.drop(['A', 'B'], axis=1)
Y = df['B']

#3. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

#4. 일변량 통계기반 변수 선택
feat_selector = SelectKBest(chi2)
feat_selector.fit(X_train, Y_train)

#5. 선택된 변수 출력
feat_scores = pd.DataFrame()
feat_scores[‘Chi-squared stats’] = feat_selector.scores_
feat_scores[‘P Value’] = feat_selector.pvalues_
feat_scores[‘Support’] = feat_selector.get_support()
feat_scores[‘Attribute’] = X_train.columns
feat_scores[feat_scores[‘Support’] == True]

 

2) 모형기반 선택 

 모형기반의 변수 선택 방법은 지도학습 머신러닝 모형을 이용하여 변수의 중요도를 평가하고, 이를 기반으로 가장 중요한 변수들을 선택하는 방법이다. 변수를 선별하는데 사용하는 지도학습 모형은 최종적으로 문제 해결에 사용할 지도학습 모형과 동일하지 않아도 되지만, 변수 선택을 위한 모형은 각 변수의 중요도를 측정할 수 있어야 한다. 가령, 의사결정나무 모형은 각 변수의 중요도가 담겨 있는 feature_importances_ 속성을 제공하므로 모형기반의 변수 선택 기법으로 자주 사용된다. 한편, 일변량 통계기반 선택에서는 변수들 간의 상호작용을 고려하지 않지만, 모형기반 변수 선택에서는 모든 변수 간의 상호작용을 반영할 수 있다. 

 아래를 통해 랜덤 포레스트 (Random Forest) 모형을 이용하여 이진 분류기를 위한 모형기반 변수 선택을 진행해보자. 랜덤 포레스트는 의사결정나무를 여러 개 생성하여 평균을 낸 값을 사용하는 앙상블 기법 중 하나이다. 랜덤 포레스트에 대한 자세한 내용은 추후에 다뤄보도록 하겠다.

#1. 모듈 및 함수 불러오기
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier

#2. 모형기반 변수 선택
feat_selector = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=0), threshold=’median’)
feat_selector.fit(X_train, Y_train)

#3. 선택된 변수 출력
feat_scores = pd.DataFrame()
feat_scores[‘Attribute’] = X_train.columns
feat_scores[‘Support’] = feat_selector.get_support()
feat_scores[feat_scores[‘Support’] == True]

 

3) 반복적 변수 선택

 반복적 변수 선택 방법은 어떤 종료 조건을 달성할 때까지 변수를 하나씩 제거하거나 추가하는 방법이다. 가장 많이 활용되는 반복적 변수 선택 방법은 재귀적 변수 제거 기법 (Reculsive Feature Elimination, RFE)으로, 모든 변수를 이용해 모형을 만든 후 변수의 중요도가 가장 낮은 변수부터 차례대로 제거해나가는 방법이다. 최종적으로 남게 되는 변수의 개수는 사용자가 직접 선택할 수 있다. RFE 함수 역시 상기 모형기반 변수 선택 기법에서와 마찬가지로 모형을 선택하기 위한 지도학습 모형을 선정해야 하는데 이때 가장 많이 활용하는 모형이 랜덤 포레스트다. 재귀적 변수 제거 기능은 sklearn.feature_selection 모듈의 RFE( ) 함수에 구현되어 있다.

#1. 모듈 및 함수 불러오기
from sklearn.feature_selection import RFE
import numpy as np

#2. 반복적 변수 선택
select = RFE(RandomForestClassifier(n_estimators = 100, random_state = 0))
select.fit(X_train, Y_train)

#3. 선택된 변수 출력
features_bool = np.array(select.get_support())
features = np.array(X.columns)
result = features[features_bool]
print(result)

This post was written based on what I read and studied the book below.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747

댓글