ML

유의미한 변수 선택하는 방법 (RFE, RFECV)

young_3060 2024. 4. 2. 13:21
728x90

 

머신러닝 데이터를 다루다 보면 너무 많은 변수들을 다룰 때가 있다.

이 변수들을 전부 머신러닝에 학습시킨다면 오히려 예측에 혼선을 주는 변수가 있을 수도 있고, 학습속도 또한 느려질 것이다.

따라서 타겟 예측에 유의미하게 사용될 수 있는 변수들을 선택해줘야할 것이다.

 

하지만, 당최 변수들을 쳐다봐도 이 변수가 예측에 유의미할까를 판단하는 것은 쉽지않은 것 같다.

이때 변수의 중요도를 보고 선택하는 방법을 사용한다

 

변수의 중요도를 보는 방법은 여러가지이지만, 이번 포스팅에서는 RFE와 REFCV에 대해 알아보고자 한다.

 

RFE (Recursive Feature Elimination)

: 변수 선택 방법으로, 원하는 개수의 변수들이 남을 때까지 학습을 반복하며 유의미하지 않은 변수들을 제거해 나가는 Backward 방식이다. (하나하나 제거해감)

변수 선택을 위해 사용할 알고리즘을 선택하면 모든 입력 변수를 사용하여 모델을 학습시키고, 변수들의 변수 중요도를 계산한다.

이후 변수 중요도가 낮은 변수들을 제거하는 방식으로 지정 개수만큼 남을 때까지 반복한다.

 

 

 

RFECV (Recursive Feature Elimination with Cross Validation)

: 남길 변수의 개수를 사용자가 지정해줘야하는 RFE의 단점을 해결하기 위해 고안되었다.

RFE와 마찬가지로 낮은 중요도를 갖는 변수를 제거하며 학습하는데, 그럴때마다 k-fold 등의 Cross Validationd을 활용하여 성능을 계산한다.

이렇게 도출된 각 feature 개수별 성능을 평균 내어 가장 높은 성능을 가지는 feature 개수에 해당하는 feature들을 최종 feature selection 결과로 사용한다.

 

 

밑에는 내가 RFECV를 이용해서 feature selection을 진행한 코드 예제이다. RFE 코드도 크게 다르지 않으니 구글에 검색해서 참고하면 좋을 듯 하다.

아래 예제는 RandomForestClassifier를 이용하였으나, 다른 모델도 이용가능하고 pipeline을 만들어 여러모델을 이용하는 방법도 있다.

(Pipeline 이용하기 참고 -> https://gist.github.com/finlytics-hub/ca6c4a3e5c9b87001027a937717fc61b)

# 8가지 중 유의미한 변수 선택
from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


X = train.drop('is_converted', axis=1)
y = train['is_converted']

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


# RFECV를 위한 설정
estimator = RandomForestClassifier(n_estimators=100, random_state=42)
cv = StratifiedKFold(n_splits=5)

# RFECV 실행
selector = RFECV(estimator, step=1, cv=cv, scoring='accuracy')
selector = selector.fit(X_train, y_train)

# 선택된 피처 확인
selected_features = X_train.columns[selector.support_]

# 선택된 피처와 최적의 피처 개수 출력
selected_features, selector.n_features_

 

 

 

[참고]

https://process-mining.tistory.com/138

 

728x90