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으로 만든 후, 의미 있는 피처만 선택했습니다. 트리 기반 모델의 경우 RandomForest
의 feature_importances_
도 기준으로 활용할 수 있습니다.
실전 팁: SelectFromModel
은 특히 고차원 데이터에서 유용하며, threshold
값을 직접 지정하거나 자동으로 평균값을 기준으로 선택할 수 있습니다. 정규화가 적용된 모델과 함께 사용하는 것이 일반적입니다.
3. 결론
이번 글에서는 머신러닝에서 자주 사용하는 4가지 특성 선택 기법을 비교해보았습니다. VarianceThreshold
는 분산 기준으로 불필요한 피처를 제거하는 가장 간단한 방법이며, SelectKBest
는 통계적 점수를 기준으로 피처를 선택합니다. RFE
는 모델 성능 기반으로 반복적으로 피처를 제거하며, SelectFromModel
은 학습된 모델의 중요도 정보를 활용해 피처를 선택하는 기법입니다.
각 기법은 선택 기준과 상황에 따라 적절히 활용되어야 하며, 단일 방식보다는 복합적으로 사용하는 것이 더 좋은 결과를 낼 수 있습니다. 특히 모델 기반의 피처 선택은 예측 성능 향상에 직결될 수 있으므로 적극 활용해보시기 바랍니다.
다음 분석 단계에서 불필요한 피처를 걸러내고, 모델 학습 시간을 줄이며, 해석력과 성능 모두를 높이고 싶다면 이들 기법을 실전에 적용해보세요.
'scikit-learn' 카테고리의 다른 글
[scikit-learn] SelectKBest scoring 함수, f_regression vs mutual_info_regression (0) | 2025.04.28 |
---|---|
[scikit-learn] 회귀(Regression) 모델 실전 비교 (1) | 2025.04.23 |
[scikit-learn] 분류(Classification) 모델 실전 비교 (0) | 2025.04.22 |
[scikit-learn] 파이프라인과 ColumnTransformer로 전처리 자동화하기 (0) | 2025.04.21 |
[scikit-learn] 모델 성능을 높이는 전처리 핵심 - 특성 선택(Feature Selection) (1) | 2025.04.18 |