1. 서론
머신러닝 모델의 성능을 높이기 위해서는 적절한 특성 선택이 필수입니다. 특히 특성이 너무 많으면 과적합 위험이 커지고 학습 시간도 늘어나기 때문에, 핵심적인 피처만 선택하는 것이 중요합니다. 그중에서도 RFE
와 RFECV
는 재귀적으로 피처를 제거하며 최적의 조합을 찾아주는 방법으로 널리 사용됩니다.
이번 글에서는 Recursive Feature Elimination (RFE)
와 RFECV
의 개념과 차이점, 사용법을 실제 예제와 함께 비교해보겠습니다.
2. RFE 개념 및 사용법
RFE (Recursive Feature Elimination)
는 전체 특성에서 시작해, 가장 중요도가 낮은 특성을 하나씩 제거하며 반복적으로 모델을 학습하는 방식입니다. 사전에 몇 개의 특성을 남길 것인지 지정해야 하며, 사용되는 모델은 특성 중요도를 제공할 수 있어야 합니다 (coef_
또는 feature_importances_
속성 보유).
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
# 데이터 준비
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 모델 및 RFE 정의
estimator = LogisticRegression(max_iter=1000)
rfe = RFE(estimator=estimator, n_features_to_select=2)
rfe.fit(X_train, y_train)
# 선택된 피처 확인
selected = pd.Series(rfe.support_, index=feature_names)
print("선택된 피처:", selected[selected].index.tolist())
RFE는 단순하고 직관적인 방식으로 특성을 제거하지만, 몇 개의 피처를 남길지 미리 알아야 한다는 점이 단점일 수 있습니다.
실전 팁: RFE는 피처 수가 많을 때 계산 비용이 커질 수 있으며, 최종 남길 피처 수를 실험적으로 결정해야 합니다. 빠르게 결과를 확인하고 싶을 때 유용한 도구입니다.
3. RFECV 개념 및 사용법
RFECV
는 RFE
의 확장 버전으로, 교차 검증을 통해 최적의 피처 수를 자동으로 선택해주는 도구입니다. 피처 수를 사전에 설정할 필요 없이, 모델 성능이 가장 좋은 시점에서의 피처 조합을 찾아냅니다. 특히 테스트 데이터에 대한 일반화 성능을 고려할 수 있다는 점에서 더 신뢰성 높은 특성 선택이 가능합니다.
from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
# 모델 및 RFECV 정의
estimator = LogisticRegression(max_iter=1000)
cv = StratifiedKFold(5)
rfecv = RFECV(estimator=estimator, step=1, cv=cv, scoring='accuracy')
rfecv.fit(X_train, y_train)
# 선택된 피처 확인
selected = pd.Series(rfecv.support_, index=feature_names)
print("선택된 피처:", selected[selected].index.tolist())
print("최적의 피처 개수:", rfecv.n_features_)
RFECV는 내부적으로 RFE를 반복 실행하며, 교차검증 점수를 기반으로 최적의 피처 개수를 결정합니다. 피처 수를 자동으로 선택해주므로 실무에서 매우 유용합니다.
실전 팁: 데이터가 작거나 계산 시간이 충분할 때는 RFECV
를 사용하는 것이 더 안정적인 결과를 제공합니다. 특히 테스트 데이터에 대한 일반화 성능을 중요시하는 프로젝트에서 추천되는 접근입니다.
4. 실전 예제 비교
이번에는 동일한 데이터셋과 모델(Logistic Regression)을 사용하여 RFE
와 RFECV
의 특성 선택 결과를 비교해보겠습니다. 어떤 피처가 선택되는지, 최적의 피처 수는 얼마인지 확인할 수 있습니다.
# RFE 결과
rfe = RFE(estimator=estimator, n_features_to_select=2)
rfe.fit(X_train, y_train)
rfe_selected = pd.Series(rfe.support_, index=feature_names)
print("RFE 선택 피처:", rfe_selected[rfe_selected].index.tolist())
# RFECV 결과
rfecv = RFECV(estimator=estimator, step=1, cv=cv, scoring='accuracy')
rfecv.fit(X_train, y_train)
rfecv_selected = pd.Series(rfecv.support_, index=feature_names)
print("RFECV 선택 피처:", rfecv_selected[rfecv_selected].index.tolist())
print("RFECV 최적 피처 수:", rfecv.n_features_)
RFE는 미리 지정한 개수만큼 피처를 선택하지만, RFECV는 교차검증을 통해 최적 개수를 찾아냅니다. 따라서 RFECV가 실전에서는 더욱 유연하고 성능이 높은 특성 선택 방법이 될 수 있습니다.
실전 팁: 결과가 다를 경우 두 방법의 선택 결과를 비교 분석해보고, 전체 모델 성능을 기준으로 최종 선택을 결정하는 것이 좋습니다.
5. 결론
이번 글에서는 특성 선택을 위한 두 가지 대표적인 재귀적 방법인 RFE
와 RFECV
를 비교해보았습니다. 두 방법 모두 중요하지 않은 피처를 제거하며 모델 성능을 최적화하는 데에 도움이 되며, 사용하는 모델의 특성 중요도 기반으로 작동합니다.
RFE
는 간단하고 빠르게 실행할 수 있는 반면, RFECV
는 교차검증을 통해 최적 피처 수를 자동으로 결정해주는 장점이 있어 실무에서는 더 안정적인 선택이 될 수 있습니다.
데이터와 문제의 특성에 따라 두 방법 중 하나를 선택하거나, 비교 실험을 통해 최종 모델 성능을 기준으로 판단하는 전략을 추천합니다.
'scikit-learn' 카테고리의 다른 글
[scikit-learn] Permutation Importance로 특성 중요도 평가하기 (1) | 2025.05.07 |
---|---|
[scikit-learn] SelectFromModel로 특성 선택 자동화하기 (0) | 2025.05.06 |
[scikit-learn] SelectKBest scoring 함수, f_regression vs mutual_info_regression (0) | 2025.04.28 |
[scikit-learn] 특성 선택 기법 비교: VarianceThreshold, SelectKBest, RFE, SelectFromModel (0) | 2025.04.24 |
[scikit-learn] 회귀(Regression) 모델 실전 비교 (1) | 2025.04.23 |