본문 바로가기

Machine Learning Models/Classic

Feature Selection - BORUTA (2)

반응형

이전 포스트

[Machine Learning/Data Analysis] - Feature Selection - BORUTA (1)


지난 포스트에서 feature selection 방법 중 하나인 BORUTA 알고리즘에 대해 살펴봤습니다. BORUTA는 본래 R 패키지로 개발된 알고리즘이지만 파이썬에서도 BorutaPy 라는 패키지를 통해 사용할 수 있습니다.

BorutaPy

BorutaPy는 feature importance를 계산할 수 있는 Random forest, XGBoost 등의 모델과 함께 사용이 가능합니다. BorutaPy의 파라미터는 다음과 같습니다.

Parameter Description
estimator fit 함수를 통해 feature_importance_ 속성을 가진 모든 regressor/classifier의 객체가 포함됩니다.
n_estimators 앙상블 기법 기반 방법론의 의사결정나무 개수로 default는 1000입니다. 'auto'로 설정할 경우
데이터의 크기에 따라 자동으로 설정됩니다.
perc shadow features의 최대 feature importance를 100 으로 했을 때 임계치를 조절할 수 있습니다.
이 값이 낮아지면 false positive 한 feature들이 많아질 수 있으나 덜 relevant한 feature들은 
확실히 제거될 수 있습니다. 디폴트 값은 100입니다. (기존 알고리즘처럼 최대값) 
alpha Z-score 기반의 통계 검정시 사용할 귀무가설 기각 유의수준으로 디폴트 값은 0.05 입니다.
max_iter Iteration 반복 횟수 입니다.

 

BorutaPy는 다른 scikit-learn 모듈과 마찬가지로 fit과 transform 메소드를 지원합니다. fit 메소드 이후 다음과 같은 속성들을 지원합니다.

Attributes Description
n_features_ 선택된 feature들의 개수를 리턴합니다.
support_ 전체 feature들에서 선택된 feature만 골라내는 mask를 리턴합니다.
support_weak_ 버리기 애매한 feature (중간 영역 위치) 만 골라내는 mask를 리턴합니다.
ranking_ 각 feature마다 순서를 리턴합니다. 선택된 feature는 1, 애매한 feature는 2로 할당됩니다.
1, 2가 아닌 feature들은 제거됩니다.

 

Example

Boruta 논문에서 직접 사용된 가상 데이터인 Madalon 데이터를 가지고 실험을 진행해 보겠습니다. 데이터는 2000개이며 500개의 feature를 가지고 있습니다. 먼저 데이터를 불러오고,

def load_data():
    # URLS for dataset via UCI
    train_data_url='https://archive.ics.uci.edu/ml/machine-learning-databases/madelon/MADELON/madelon_train.data'
    train_label_url='https://archive.ics.uci.edu/ml/machine-learning-databases/madelon/MADELON/madelon_train.labels'

    X_data = pd.read_csv(train_data_url, sep=" ", header=None)
    y_data = pd.read_csv(train_label_url, sep=" ", header=None)
    data = X_data.loc[:, :499]
    data['target'] = y_data[0]
    return data
    
data = load_data()

y = data.pop('target')
X = data.copy().values

 

BorutaPy를 선언합니다. 이때 estimator로 RandomForestClassifier를 사용하며 max_depth는 너무 깊지 않은 10 미만으로 설정합니다.

rf = RandomForestClassifier(n_jobs=-1, class_weight=None, max_depth=7, random_state=0)
## Define Boruta feature selection method
feat_selector = BorutaPy(rf, n_estimators='auto', verbose=2, random_state=0)

feat_selector.fit(X, y)

선택된 feature 의 수는 19이고 ranking_ 속성을 통해 각 feature의 랭킹을 알 수 있습니다.

feat_selector.n_features_
feat_selector.ranking_

또한, BorutaPy는 scikit-learn api interface를 지원하므로 transform 메소드를 통해 원래 feature에서 선택된 feature만 필터링할 수 있습니다.

 

Discussion

BORUTA가 기존 feature selection 알고리즘과 가장 다른 점은 기존 feature selection 알고리즘은 feature를 무조건적으로 최소한으로 줄이는 minimal optimal feature selection 으로 모델의 에러가 최소화되는 최소한의 feature subset을 구하는 것이라면 BORUTA는 all-relevant feature selection 으로 타겟 변수와 해당 feature가 관련이 있는지 없는지만 검사합니다. 예를 들어 서로 관련이 있는 feature A,B가 둘 모두 타겟 변수에 연관이 있고 A가 더 큰 연관이 있다면, 기존 feature selection은 B를 삭제하지만 BORUTA는 둘 모두 중요한 feature로 선택하게 됩니다.

여기서 알 수 있는 부분은 BORUTA는 우리가 남기고자 하는 feature 개수를 선택할 수 없습니다. 알고리즘 특성 상 타겟 변수 설명에 있어 중요하냐/중요하지 않느냐 만 따지기 때문입니다. 또한 모델의 상관없이 사용할 수 있는 알고리즘이지만 feature를 복사하고 랜덤하게 섞고 importance 기반으로 계산하는 과정으로 동작 시간이 굉장히 오래 걸립니다. 또한, 결측된 값이 있을 때 BorutaPy를 동작시키기 전에 무조건 채워주어야 합니다.

 

참조

반응형