콘텐츠로 이동

특성 선택 (Feature Selection)

난이도: 중급
선수 지식: 특성 공학
관련 문서: 차원 축소 | 정규화 이론 | 데이터 누수

핵심 요약: 100개 특성 중 진짜 중요한 10개만 골라 모델을 더 좋게 만든다. 불필요한 특성은 노이즈일 뿐 — 줄이면 오히려 성능이 오른다.

  • 특성 선택(Feature Selection): 전체 특성 중 모델에 가장 유용한 부분 집합만 골라내는 과정. 특성 공학이 “만드는 것”이라면, 특성 선택은 “골라내는 것”.
  • 필터 방법(Filter): 상관계수 등 통계적 기준으로 빠르게 특성을 걸러내는 방법. 모델과 독립적이라 속도가 빠르다.
  • 임베디드 방법(Embedded): Lasso, 트리 모델처럼 학습 과정에서 자동으로 중요한 특성을 선택하는 방법.
  • SHAP: 게임 이론의 Shapley value에 기반한 특성 중요도 측정 방법. 각 특성이 예측에 얼마나 기여했는지를 이론적으로 가장 정확하게 계산한다.

상황: 고객 이탈 예측, 원래 특성 50개.

단계특성 수정확도학습 시간
전체 사용50개84%120초
상관분석 필터 (r < 0.05 제거)30개86%75초
Lasso(L1) 임베디드12개89%30초
SHAP 기반 최종 선별8개91%18초

특성을 50개에서 8개로 줄였더니, 정확도는 84%→91%로 올랐고, 학습 시간은 약 1/7(120초 → 18초)로 줄었다. 불필요한 특성이 노이즈로 작용했기 때문이다.

특성 선택(Feature Selection)은 모델 학습에 가장 유용한 특성의 부분 집합을 선별하는 과정이다. 불필요한 특성은 노이즈를 추가하고, 차원의 저주(curse of dimensionality)를 유발하며, 과적합을 촉진하고, 학습 시간을 늘린다. 특성 선택은 필터(Filter), 래퍼(Wrapper), 임베디드(Embedded) 세 가지 접근법으로 나뉜다.

비유: 특성 선택은 이사 갈 때 짐 줄이기다. 모든 물건을 다 챙기면 새 집이 발 디딜 틈 없이 좁아지고, 정작 필요한 것을 찾는 데 시간이 더 걸린다. 안 쓰는 물건(무관한 특성)과 똑같은 물건 두 개(상관이 높은 특성)를 버리면, 짐은 줄고 생활은 오히려 편해진다.


특성 선택의 역사는 Ronald Fisher가 1936년에 발표한 판별 분석(Discriminant Analysis)까지 거슬러 올라간다. Fisher는 붓꽃(Iris) 데이터에서 4개의 측정값 중 어떤 것이 종(species)을 구분하는 데 가장 유용한지를 분석했으며, 이것이 사실상 최초의 체계적 특성 선택이었다.

이후 수십 년간 통계학에서 변수 선택(variable selection) 연구가 이어졌고, 1996년 Tibshirani가 Lasso(L1 정규화)를 발표하면서 모델 학습과 특성 선택을 동시에 수행하는 임베디드 방법의 시대가 열렸다. 2001년에는 Breiman의 Random Forest가 특성 중요도(feature importance)를 자연스럽게 제공하는 도구로 널리 사용되기 시작했다.

가장 최근의 도약은 2017년 Lundberg와 Lee가 발표한 SHAP(SHapley Additive exPlanations)이다. 게임 이론의 Shapley value를 ML 해석에 적용한 SHAP은 특성 중요도를 이론적으로 가장 견고하게 측정할 수 있는 방법을 제공하며, 특성 선택과 모델 해석 가능성(Explainability)을 동시에 달성하는 현대적 접근의 핵심이 되었다.


모델에 독립적으로, 통계적 관계만을 기반으로 특성을 평가한다.

기법적합한 데이터측정 대상
분산 임계값모든 데이터분산이 낮은 특성 제거
상관계수 (Pearson)수치형선형 관계 강도
Chi-Square Test범주형특성-타겟 독립성
Mutual Information모든 데이터비선형 관계 포함 정보량
ANOVA F-test수치-범주형클래스 간 평균 차이

장점: 빠르고, 모델에 독립적
단점: 특성 간 상호작용을 무시, 중복 특성 제거 어려움

모델 성능을 직접 평가하여 최적 특성 부분 집합을 탐색한다.

기법방향설명
Forward Selection추가빈 집합에서 시작, 최적 특성을 하나씩 추가
Backward Elimination제거전체에서 시작, 가장 불필요한 특성을 하나씩 제거
RFE (Recursive Feature Elimination)제거모델의 특성 중요도를 기반으로 재귀적 제거

장점: 모델 성능을 직접 최적화
단점: 매우 느림 (특성 수에 비례하는 모델 학습 횟수)

모델 학습 과정에서 특성 선택이 자동으로 이루어진다.

minwyXw22+λw1\min_w \|y - Xw\|_2^2 + \lambda \|w\|_1

L1 페널티가 일부 가중치를 정확히 0으로 만들어, 자동으로 특성을 선택한다.

  • Gini Importance (MDI): 분할 시 불순도 감소 기여도
  • 장점: 빠르고 직관적
  • 주의: 고카디널리티 특성에 편향

L1 + L2를 결합하여 그룹화된 특성도 선택할 수 있다.

minwyXw22+λ1w1+λ2w22\min_w \|y - Xw\|_2^2 + \lambda_1 \|w\|_1 + \lambda_2 \|w\|_2^2

4. 특성 중요도 점수 (Importance Scores)

섹션 제목: “4. 특성 중요도 점수 (Importance Scores)”
방법원리신뢰도주의점
Permutation Importance특성을 무작위 섞었을 때 성능 하락 정도높음상관된 특성 간 중요도 분산
SHAP Feature ImportanceShapley value 기반 기여도매우 높음계산 비용 높음
MDI (Mean Decrease Impurity)트리의 분할 불순도 감소중간고카디널리티 편향
Drop-Column Importance특성 제거 후 재학습 성능 비교높음매우 느림

Permutation Importance의 한계: 두 특성이 강하게 상관되어 있으면, 하나를 섞어도 다른 하나가 정보를 보존하여 중요도가 과소 평가될 수 있다.

SHAP (SHapley Additive exPlanations): 게임 이론의 Shapley value에 기반한 가장 이론적으로 견고한 방법이다. 지역적(local) 설명과 전역적(global) 중요도를 모두 제공한다.


특성 50개짜리 데이터를 3단계로 줄여 보자.

단계방법남은 특성
시작50개
1단계분산이 0에 가까운 열 제거46개
2단계상관계수 r>0.95\lvert r \rvert > 0.95인 쌍에서 하나씩 제거38개
3단계SHAP 중요도 상위 8개만 선택8개

850=0.16    특성의84%를버렸다\frac{8}{50} = 0.16 \;\rightarrow\; 특성의 84\%를 버렸다

핵심은 순서다. 1·2단계는 모델 없이 데이터만 보고 거르는 필터(filter) 방식이라 빠르고 안전하다. 3단계는 모델을 학습해야 하는 임베디드(embedded) 방식이라 비싸다.

50개에 바로 SHAP를 돌리는 것보다, 먼저 38개로 줄이고 돌리는 편이 계산량이 적다. 그리고 2단계를 건너뛰면 서로 거의 같은 두 특성이 중요도를 나눠 가져 둘 다 낮게 평가되는 함정에 빠진다.

특성 선택 워크플로우 다이어그램

특성FilterWrapperEmbedded
속도매우 빠름매우 느림중간
모델 의존성독립의존의존
상호작용 고려아니오부분적
과적합 위험낮음높음중간
구현 용이성쉬움복잡쉬움

상황추천 방법
특성 수십 개, 빠른 결과 필요Embedded (Lasso, Tree)
특성 수백~수천 개Filter → Embedded 순차
최고 성능 필요, 시간 충분Wrapper (RFE)
해석 가능성 중요SHAP + Permutation Importance
고카디널리티 범주형Mutual Information, Target Encoding
딥러닝보통 불필요 (모델이 자동 선택)

유전체학: 20,000개 유전자에서 50개로 줄여 암 진단 정확도를 높이다

섹션 제목: “유전체학: 20,000개 유전자에서 50개로 줄여 암 진단 정확도를 높이다”

유전체학(genomics) 분야에서 마이크로어레이(microarray) 데이터는 전형적인 “p >> n” 문제를 보인다 — 특성(유전자) 수가 20,000개 이상인 반면 샘플(환자) 수는 수십~수백 명에 불과하다. 한 연구팀이 유방암 진단 모델을 구축할 때 다음과 같은 결과를 얻었다:

  • 전체 20,000개 유전자 사용: 차원의 저주로 인해 교차 검증 정확도가 72%에 그쳤다. 모델이 노이즈에 과적합되었다
  • 분산 필터 + Mutual Information으로 500개 선별: 정확도가 85%로 상승했다
  • Lasso(L1) + Recursive Feature Elimination으로 50개 선별: 정확도가 93%에 도달했다. 50개 유전자는 기존 생물학 연구에서 암과 관련이 알려진 유전자들과 높은 일치율을 보였다

이 사례는 특성을 줄이는 것이 오히려 성능을 높일 수 있다는 직관에 반하는 현상을 잘 보여준다. 불필요한 특성은 노이즈와 차원의 저주를 유발하므로, 정보가 풍부한 소수의 특성만 남기는 것이 과적합을 방지하고 일반화 성능을 높이는 핵심 전략이다.


import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
rng = np.random.default_rng(0)
X, y = make_classification(n_samples=3000, n_features=20, n_informative=6,
n_redundant=0, random_state=0)
# 일부러 '거의 같은 열'과 '순수 잡음 열'을 섞어 50개로 만든다
dup = X[:, :10] + rng.normal(0, 0.01, (len(X), 10)) # 복제본 10개
noise = rng.normal(0, 1, (len(X), 20)) # 잡음 20개
X = np.c_[X, dup, noise]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=.3, random_state=0)
score = lambda A, B: RandomForestClassifier(n_estimators=100, random_state=0).fit(A, ytr).score(B, yte)
print(f"시작 : {X.shape[1]}개, 테스트 정확도 {score(Xtr, Xte):.3f}")
corr = np.corrcoef(Xtr, rowvar=False)
drop = sorted({j for i in range(len(corr)) for j in range(i+1, len(corr)) if abs(corr[i,j]) > 0.95})
keep = [i for i in range(X.shape[1]) if i not in drop]
print(f"고상관(>0.95) 제거: {len(keep)}개, 테스트 정확도 {score(Xtr[:,keep], Xte[:,keep]):.3f}")
imp = RandomForestClassifier(n_estimators=100, random_state=0).fit(Xtr[:,keep], ytr).feature_importances_
top = [keep[i] for i in np.argsort(imp)[-6:]]
print(f"중요도 상위 6개 : {len(top)}개, 테스트 정확도 {score(Xtr[:,top], Xte[:,top]):.3f}")
# 실행 결과:
# 시작 : 50개, 테스트 정확도 0.878
# 고상관(>0.95) 제거: 40개, 테스트 정확도 0.878
# 중요도 상위 6개 : 6개, 테스트 정확도 0.916

특성을 50개에서 6개로 줄였는데 테스트 정확도는 오히려 0.878에서 0.916으로 올랐다. 무관한 특성이 잡음으로 작용하고 있었다는 뜻이다. 특성 선택은 속도만 아니라 성능을 위한 작업이기도 하다.


  1. 전체 데이터에서 특성 선택: 특성 선택도 데이터 누수의 원인이 된다. 학습 데이터에서만 선택하고, 동일한 특성 집합을 테스트에 적용해야 한다.

  2. 상관관계가 높은 특성을 무조건 제거: 높은 상관관계가 항상 중복을 의미하지는 않는다. 두 특성이 타겟에 대해 다른 정보를 제공할 수 있다.

  3. MDI (Gini Importance)만 의존: 고카디널리티 특성에 편향된다. Permutation Importance나 SHAP을 교차 검증해야 한다.

  4. 특성 선택이 항상 성능을 개선한다: 정보가 풍부한 특성을 제거하면 오히려 성능이 하락한다. 반드시 검증으로 확인해야 한다.

  5. 한 번에 최종 결정: 특성 선택은 반복적 과정이다. 모델을 바꾸면 최적 특성 집합도 달라질 수 있다.


1. 필터·래퍼·임베디드 방식의 차이는?

정답 보기

필터는 모델 없이 통계만으로(상관, 카이제곱) 빠르게 거른다. 래퍼는 모델을 반복 학습해 고르므로 정확하지만 비싸다. 임베디드는 학습 과정에서 자동으로 선택한다(Lasso, 트리 중요도).

2. 상관이 매우 높은 두 특성을 모두 남기면 어떤 문제가 생기는가?

정답 보기

선형 모델에서는 계수가 불안정해지고(다중공선성), 트리 기반 중요도에서는 두 특성이 중요도를 나눠 가져 둘 다 낮게 평가된다.

3. 특성을 줄였는데 성능이 오히려 오르는 이유는?

정답 보기

무관한 특성이 잡음으로 작용해 모델을 헷갈리게 하고 과적합을 유발하고 있었기 때문이다. 특성 선택은 속도만이 아니라 성능을 위한 작업이기도 하다.