본문 바로가기
scikit-learn

[scikit-learn] 특성 선택 기법 비교: VarianceThreshold, SelectKBest, RFE, SelectFromModel

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

1. 서론

머신러닝 모델의 성능을 높이고, 해석 가능성을 높이며, 과적합을 방지하기 위해 꼭 필요한 과정이 바로 특성 선택(Feature Selection)입니다. 특성 선택은 모델에 불필요한 피처를 제거함으로써 학습 속도를 높이고, 모델을 단순화하며 예측 성능 향상에도 기여할 수 있습니다.

이번 글에서는 scikit-learn에서 제공하는 대표적인 특성 선택 기법 4가지를 비교합니다. VarianceThreshold, SelectKBest, RFE, SelectFromModel 각각의 동작 원리와 예제를 통해 어떤 상황에서 어떤 방법을 쓰면 좋은지 살펴보겠습니다.

2. 주요 기법 소개

2-1. VarianceThreshold

VarianceThreshold는 가장 간단한 특성 선택 기법 중 하나로, 분산이 일정 임계값(threshold) 이하인 특성을 제거합니다. 분산이 낮다는 것은 데이터가 거의 동일한 값을 가지고 있다는 의미이며, 이런 특성은 모델의 예측에 기여하지 않을 가능성이 높습니다.

from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
import pandas as pd

# 데이터 로드
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names)

# 분산 임계값 0.1로 설정
selector = VarianceThreshold(threshold=0.1)
X_selected = selector.fit_transform(X)

print("선택된 특성 수:", X_selected.shape[1])

위 예제에서는 Iris 데이터셋에 대해 분산이 0.1 이하인 특성을 제거했습니다. VarianceThreshold는 간단하지만 효과적인 전처리 단계로, 특히 피처 수가 많은 경우 불필요한 정보를 줄이는 데 유용합니다.

실전 팁: 이 방법은 **타겟 변수와의 관계를 고려하지 않고** 순수하게 피처의 분산만 기준으로 판단합니다. 따라서 모델 기반 피처 선택 전에 사용하면 좋습니다.

2-2. SelectKBest

SelectKBest는 각 피처의 통계적 중요도를 평가하여 상위 K개의 피처를 선택하는 방식입니다. 회귀 문제에는 f_regression이나 mutual_info_regression, 분류 문제에는 chi2 또는 f_classif 등의 scoring function을 사용합니다.

from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.datasets import load_iris
import pandas as pd

# 데이터 로드
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names

# 상위 2개의 피처 선택
selector = SelectKBest(score_func=f_classif, k=2)
X_selected = selector.fit_transform(X, y)

# 선택된 피처 이름 출력
selected_features = pd.Series(selector.get_support(), index=feature_names)
print("선택된 피처:", selected_features[selected_features].index.tolist())

위 예제에서는 Iris 데이터셋에서 분류 문제에 적합한 f_classif를 활용해 가장 영향력이 큰 2개의 피처를 선택했습니다. get_support()를 활용하면 선택된 피처의 이름을 쉽게 확인할 수 있습니다.

실전 팁: scoring function은 데이터 타입과 문제 유형에 따라 선택해야 하며, 회귀에서는 f_regression, mutual_info_regression 등을, 분류에서는 chi2, f_classif 등을 사용하세요.

2-3. RFE (Recursive Feature Elimination)

RFE는 모델 기반의 재귀적 피처 제거 방법으로, 모든 피처를 사용해 모델을 학습한 후 중요도가 낮은 피처를 하나씩 제거해가며 최적의 피처 subset을 찾는 방식입니다. 반복적으로 학습하며 피처를 줄이기 때문에 연산은 다소 무겁지만 성능 향상에 효과적입니다.

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
import pandas as pd

# 데이터 로드
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names

# RFE 적용 (2개 피처 선택)
estimator = LogisticRegression(max_iter=1000)
rfe = RFE(estimator, n_features_to_select=2)
X_selected = rfe.fit_transform(X, y)

# 선택된 피처 이름 출력
selected = pd.Series(rfe.support_, index=feature_names)
print("선택된 피처:", selected[selected].index.tolist())

위 예제는 로지스틱 회귀 모델을 기반으로, RFE를 통해 상위 2개의 피처만 선택한 예시입니다. RFE는 모델이 제공하는 coef_ 또는 feature_importances_를 기반으로 작동합니다.

실전 팁: RFE는 정확히 몇 개의 피처를 남길지 알고 있을 때 유용하며, RFECV를 사용하면 교차검증을 통해 자동으로 최적 피처 수를 찾을 수도 있습니다.

2-4. SelectFromModel

SelectFromModel은 학습된 모델의 중요도 기반으로 피처를 선택하는 방법입니다. 모델이 계산한 coef_ 또는 feature_importances_ 값을 기준으로 임계값(threshold) 이상인 피처만 유지합니다. 일반적으로 트리 기반 모델 또는 선형 모델과 함께 자주 사용됩니다.

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso
from sklearn.datasets import load_boston
import pandas as pd

# 데이터 로드 (boston은 deprecated, 대체로 California 사용 권장)
from sklearn.datasets import fetch_california_housing
X, y = fetch_california_housing(return_X_y=True)

# 모델 학습 후 피처 선택
model = Lasso(alpha=0.1)
selector = SelectFromModel(model)
X_selected = selector.fit_transform(X, y)

print("선택된 피처 수:", X_selected.shape[1])

위 예제에서는 Lasso 모델을 사용해 불필요한 피처의 계수를 0으로 만든 후, 의미 있는 피처만 선택했습니다. 트리 기반 모델의 경우 RandomForestfeature_importances_도 기준으로 활용할 수 있습니다.

실전 팁: SelectFromModel은 특히 고차원 데이터에서 유용하며, threshold 값을 직접 지정하거나 자동으로 평균값을 기준으로 선택할 수 있습니다. 정규화가 적용된 모델과 함께 사용하는 것이 일반적입니다.

3. 결론

이번 글에서는 머신러닝에서 자주 사용하는 4가지 특성 선택 기법을 비교해보았습니다. VarianceThreshold는 분산 기준으로 불필요한 피처를 제거하는 가장 간단한 방법이며, SelectKBest는 통계적 점수를 기준으로 피처를 선택합니다. RFE는 모델 성능 기반으로 반복적으로 피처를 제거하며, SelectFromModel은 학습된 모델의 중요도 정보를 활용해 피처를 선택하는 기법입니다.

각 기법은 선택 기준과 상황에 따라 적절히 활용되어야 하며, 단일 방식보다는 복합적으로 사용하는 것이 더 좋은 결과를 낼 수 있습니다. 특히 모델 기반의 피처 선택은 예측 성능 향상에 직결될 수 있으므로 적극 활용해보시기 바랍니다.

다음 분석 단계에서 불필요한 피처를 걸러내고, 모델 학습 시간을 줄이며, 해석력과 성능 모두를 높이고 싶다면 이들 기법을 실전에 적용해보세요.