본문 바로가기
scikit-learn

[scikit-learn] RFE vs RFECV, 재귀적 특성 제거 방법 비교

by PredictLab | 데이터 예측 연구소 2025. 5. 5.

1. 서론

머신러닝 모델의 성능을 높이기 위해서는 적절한 특성 선택이 필수입니다. 특히 특성이 너무 많으면 과적합 위험이 커지고 학습 시간도 늘어나기 때문에, 핵심적인 피처만 선택하는 것이 중요합니다. 그중에서도 RFERFECV는 재귀적으로 피처를 제거하며 최적의 조합을 찾아주는 방법으로 널리 사용됩니다.

이번 글에서는 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 개념 및 사용법

RFECVRFE의 확장 버전으로, 교차 검증을 통해 최적의 피처 수를 자동으로 선택해주는 도구입니다. 피처 수를 사전에 설정할 필요 없이, 모델 성능이 가장 좋은 시점에서의 피처 조합을 찾아냅니다. 특히 테스트 데이터에 대한 일반화 성능을 고려할 수 있다는 점에서 더 신뢰성 높은 특성 선택이 가능합니다.

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)을 사용하여 RFERFECV의 특성 선택 결과를 비교해보겠습니다. 어떤 피처가 선택되는지, 최적의 피처 수는 얼마인지 확인할 수 있습니다.

# 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. 결론

이번 글에서는 특성 선택을 위한 두 가지 대표적인 재귀적 방법인 RFERFECV를 비교해보았습니다. 두 방법 모두 중요하지 않은 피처를 제거하며 모델 성능을 최적화하는 데에 도움이 되며, 사용하는 모델의 특성 중요도 기반으로 작동합니다.

RFE는 간단하고 빠르게 실행할 수 있는 반면, RFECV는 교차검증을 통해 최적 피처 수를 자동으로 결정해주는 장점이 있어 실무에서는 더 안정적인 선택이 될 수 있습니다.

데이터와 문제의 특성에 따라 두 방법 중 하나를 선택하거나, 비교 실험을 통해 최종 모델 성능을 기준으로 판단하는 전략을 추천합니다.