Python/Sklearn

[Sklearn] 파이썬 feature selection 함수 RFE, RFECV 예제

jimmy_AI 2022. 9. 24. 21:03
반응형

Python scikit-learn RFE, RFECV

파이썬에서 RFE와 RFECV 함수를 사용하여 feature selection을

진행하는 예제를 다루어보도록 하겠습니다.

 

 

데이터셋 로드 및 전처리

우선, 이번 글에서는 사이킷런에서 제공하는 유방암 분류 예측 데이터셋을 사용하겠습니다.

총 30가지 종류의 feature가 있으며, target 정보는 0과 1(악성 / 양성)의 이진 분류입니다.

 

우선, 데이터셋을 데이터프레임으로 불러오는 코드는 다음와 같습니다.

import pandas as pd
from sklearn import datasets

# 유방암 데이터셋 로드
data = datasets.load_breast_cancer()
df = pd.DataFrame(data.data, columns = data.feature_names)

# 1이면 양성 종양, 0이면 악성 종양 라벨 컬럼 지정
df['target'] = data.target

 

이후, 학습 및 검증을 위하여 학습용과 테스트용 데이터셋으로 분리하겠습니다.

여기서는 일단 30가지 feature를 전부 후보 feature로 간주하였습니다.

from sklearn.model_selection import train_test_split

# train, test 셋 분리
X = df.iloc[:, :-1] # target column을 제외한 모든 column을 후보 feature로 간주
y = df['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 37)

 

 

RFE 함수 사용 예제

RFE는 모델 성능에 가장 도움이 되지 않는 1가지 feature씩 순서대로 제거하여

원하는 feature 개수인 n개가 남을때까지 수행하는 방법입니다.

 

따라서, 여기서는 고를 feature 개수인 n을 지정해야 하며,

n_features_to_select 인자에 지정해주시면 됩니다.

 

한 step마다 제거할 feature 개수도 step 인자에 지정이 가능합니다.

 

학습시킬 모델을 지정한 뒤, RFE로 feature selection을 진행하는 예시 코드는 다음과 같습니다.

(로지스틱 회귀 모델 및 10개의 feature 선별, 한 step에 1개씩 제거하는 상황을 가정했습니다.)

import warnings
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE

warnings.filterwarnings(action='ignore') # 경고 메시지 제거

estimator = LogisticRegression() # 학습시킬 모델 지정
selector = RFE(estimator, n_features_to_select=10, step=1) # 고를 feature 수 및 한 step에 제거할 featrue 개수 지정
selector = selector.fit(X_train, y_train) # feature selection 진행

 

반응형

 

각 feature의 선별 여부는 다음과 같이 support_ 속성으로 조회가 가능합니다.

selector.support_

# 출력 결과
array([ True, False, False, False, False, False,  True,  True, False,
       False, False,  True,  True, False, False, False, False, False,
       False, False, False, False,  True, False,  True,  True,  True,
        True, False, False])

 

이를 이용하여, 선별된 feature의 목록을 다음과 같이 받아올 수 있습니다.

selected_columns = X_train.columns[selector.support_]

selected_columns

# 출력 결과
Index(['mean radius', 'mean concavity', 'mean concave points', 'texture error',
       'perimeter error', 'worst perimeter', 'worst smoothness',
       'worst compactness', 'worst concavity', 'worst concave points'],
      dtype='object')

 

 

RFECV 함수 사용 예제

RFECV는 RFE와는 다르게 처음에 선별할 feature의 개수 n을 정해두는 것이 아니라

각 feature 개수에서 k-fold cross validation을 수행하며 높은 성능을 보이는

feature 개수를 자동으로 탐색해주는 방법입니다.

 

즉, 여기서는 선별 feature 개수인 n을 지정하는 인자가 필요없으며,

대신 cross validation에서 그룹 개수인 k를 지정하는 cv 인자 등이 있습니다.

 

RFECV를 이용한 feature selection 예시 코드는 아래와 같습니다.

from sklearn.feature_selection import RFECV

estimator = LogisticRegression() # 학습시킬 모델 지정
selector = RFECV(estimator, step=1, cv = 5) # 한 step에 제거할 featrue 개수 및 cross validation fold 수 지정
selector = selector.fit(X_train, y_train) # feature selection 진행

 

이후, 각 feature의 선별 여부 및 선별된 feature들의 목록을

RFE 때와 비슷한 방법으로 조회할 수 있습니다.

### 각 feature의 선별 여부 조회 ###
selector.support_

# 출력 결과
array([ True,  True, False, False,  True,  True,  True,  True,  True,
       False, False,  True,  True,  True, False,  True,  True, False,
       False, False, False,  True,  True, False,  True,  True,  True,
        True, False,  True])

### 선별된 feature들의 목록 조회 ###
selected_columns = X_train.columns[selector.support_]

selected_columns

# 출력 결과
Index(['mean radius', 'mean texture', 'mean smoothness', 'mean compactness',
       'mean concavity', 'mean concave points', 'mean symmetry',
       'texture error', 'perimeter error', 'area error', 'compactness error',
       'concavity error', 'worst texture', 'worst perimeter',
       'worst smoothness', 'worst compactness', 'worst concavity',
       'worst concave points', 'worst fractal dimension'],
      dtype='object')