콘텐츠로 이동

특성 공학 (Feature Engineering)

개요

특성 공학(Feature Engineering)은 원시 데이터를 모델이 학습하기 좋은 형태로 변환하는 과정이다. "쓰레기가 들어가면 쓰레기가 나온다(Garbage In, Garbage Out)"라는 격언처럼, 데이터의 품질과 표현 방식이 모델 성능의 상한을 결정한다. 딥러닝이 자동으로 특성을 학습하는 시대에도, 정형 데이터(tabular data)에서는 여전히 특성 공학이 핵심적인 역할을 한다.


핵심 개념

1. 범주형 변수 인코딩 (Encoding Categorical Variables)

인코딩 방법 설명 장점 단점
One-Hot 카테고리 수만큼 이진 벡터 순서 관계 없음, 직관적 고카디널리티 → 차원 폭발
Label Encoding 정수로 변환 단순, 메모리 효율 순서 관계 암시 (트리 모델에서는 OK)
Target Encoding 카테고리별 타겟 평균 고카디널리티 대응 과적합 위험 → smoothing 필요
Frequency Encoding 빈도로 대체 단순, 유용한 정보 다른 카테고리가 같은 빈도 가능
Binary/Hashing 이진/해시 변환 고카디널리티 대응 정보 손실 가능
Embedding 학습 가능한 밀집 벡터 의미적 관계 포착 신경망 필요

Target Encoding의 과적합 방지: - Smoothing: 전체 평균과의 가중 평균 사용 - Leave-One-Out: 자기 자신을 제외하고 평균 계산 - 반드시 교차 검증 fold 내에서 적용

2. 특성 스케일링 (Feature Scaling)

스케일링 방법 수식 결과 분포 이상치 강건성
Standard (Z-score) \(x' = \frac{x - \mu}{\sigma}\) 평균 0, 분산 1 낮음
Min-Max \(x' = \frac{x - x_{min}}{x_{max} - x_{min}}\) \([0, 1]\) 매우 낮음
Robust \(x' = \frac{x - \text{median}}{IQR}\) 중앙값 0 높음
Log Transform \(x' = \log(x + 1)\) 왜도 감소 중간

언제 필요한가: - 거리 기반 모델: KNN, SVM, 신경망 - 경사하강법 사용 모델: 로지스틱 회귀, 신경망

언제 불필요한가: - 트리 기반 모델: Decision Tree, Random Forest, XGBoost

핵심 규칙: 학습 데이터의 통계치(평균, 분산 등)로 테스트 데이터도 스케일링해야 한다. .fit()은 학습 데이터에만, .transform()은 학습/테스트 모두에 적용한다.

3. 특성 생성 (Feature Creation)

유형 예시 활용
Polynomial Features \(x_1 \times x_2\), \(x_1^2\) 비선형 관계 포착
날짜/시간 요일, 월, 시간, 공휴일 여부 시계열/이벤트 데이터
주기적 인코딩 \(\sin(2\pi h/24)\), \(\cos(2\pi h/24)\) 시간의 주기성 반영
텍스트 TF-IDF, BoW, 임베딩 NLP
집계 그룹별 평균, 최대, 카운트 관계형 데이터
Lag Features \(y_{t-1}\), \(y_{t-7}\) 시계열
도메인 지식 BMI = 체중/키², 구매빈도/가입기간 비즈니스 도메인

주기적 인코딩이 중요한 이유: "23시"와 "1시"는 숫자로는 22 차이지만 실제로는 2시간 차이이다. \(\sin\)/\(\cos\) 인코딩은 이런 주기적 근접성을 올바르게 표현한다.

4. 특성 상호작용 (Feature Interaction)

두 특성의 곱, 비율, 차이를 새로운 특성으로 생성한다.

  • : \(x_1 \times x_2\) → AND 관계 포착
  • 비율: \(x_1 / x_2\) → 상대적 크기
  • 차이: \(x_1 - x_2\) → 변화량

자동 탐색: Polynomial features, Factorization Machines


상세 내용

특성 공학 워크플로우

flowchart TD
    A["원시 데이터"] --> B["EDA<br>분포, 상관관계, 결측"]
    B --> C["데이터 타입 파악"]
    C --> D{"데이터 유형?"}

    D -->|수치형| E["스케일링<br>로그변환<br>이상치 처리"]
    D -->|범주형| F["인코딩<br>(One-Hot, Target 등)"]
    D -->|시간| G["날짜 분해<br>주기 인코딩<br>Lag features"]
    D -->|텍스트| H["TF-IDF<br>임베딩"]

    E --> I["특성 상호작용<br>도메인 지식 특성"]
    F --> I
    G --> I
    H --> I

    I --> J["특성 선택"]
    J --> K["모델 학습"]

실무에서의 특성 공학 팁

  1. 도메인 전문가와의 협업: 기술적 특성 생성보다 비즈니스 도메인 지식에서 나온 특성이 더 강력한 경우가 많다.

  2. 단계적 접근: 기본 특성으로 baseline → 특성 추가/변환 → 성능 비교를 반복한다.

  3. Kaggle 대회에서의 교훈: 상위 솔루션의 핵심은 종종 창의적인 특성 공학에 있다.


언제 사용하는가

상황 특성 공학 중요도
정형 데이터 + 트리 모델 매우 높음
정형 데이터 + 신경망 높음
이미지/텍스트 + 딥러닝 낮음 (모델이 자동 학습)
시계열 예측 매우 높음 (lag, 주기 특성)
추천 시스템 높음 (사용자/아이템 특성)

흔한 오해와 함정

  1. 테스트 데이터의 정보 유출: 스케일링, target encoding 등을 전체 데이터에 fit하면 데이터 누수가 발생한다. 반드시 학습 데이터에만 fit해야 한다.

  2. "특성이 많을수록 좋다": 무의미한 특성은 노이즈를 추가하고 차원의 저주(curse of dimensionality)를 유발한다. 특성 선택이 필요하다.

  3. Label Encoding을 비순서 범주형에 사용: 선형 모델이나 신경망에서 "서울=1, 부산=2, 대구=3"은 순서 관계를 암시한다. 트리 모델에서는 괜찮다.

  4. 로그 변환에서 0과 음수 무시: \(\log(0)\)은 정의되지 않는다. \(\log(x+1)\) 또는 음수에 대한 별도 처리가 필요하다.

  5. 특성 공학을 한 번에 끝내려 함: 반복적 과정이다. 모델 결과를 보고 오류를 분석하며 특성을 개선해야 한다.


다른 주제와의 연결