상세 컨텐츠

본문 제목

실전 머신러닝 개발: 자주 쓰였던 Feature Engineering 기법 5가지

머신러닝/함수, 라이브러리

by byoelcardi 2025. 4. 20. 12:23

본문

머신러닝 성능의 70%는 Feature Engineering에서 결정된다는 말, 들어보셨나요?

지금이야 LLM 튜닝쪽으로 모든 포커스가 맞춰져 있었지만 원래는 Feature Engineering도 상당히 중요한 기법이였습니다.

 

LLM(예: GPT, BERT, LLaMA)은 대규모 텍스트 데이터를 입력 그대로 학습하며,
내부적으로 어마어마한 수의 파라미터를 통해 텍스트에서 유의미한 "feature"를 스스로 학습합니다.
즉, 사람이 의도적으로 feature를 가공해줄 필요가 거의 없습니다.

예를 들어:

  • 전통 ML: 날짜 → 요일/주말 여부/월 등으로 분리
  • LLM: 그냥 '2024-04-18'이라는 토큰 자체에서 의미를 뽑음

그럼에도 불구하고! 일부 상황에선 여전히 Feature Engineering이 중요합니다. 모델 성능이 기대만큼 나오지 않을 때, 하이퍼파라미터를 바꾸기 전에 먼저 데이터를 의심해보는 게 정답일 수 있습니다.

이번 글에서는 실무에서 특히 자주 쓰이고, 실제 성능 향상에도 큰 도움을 주는 Feature Engineering 기법 5가지를 소개합니다. 예제 코드는 Python(pandas+scikit-learn) 기반으로 제공합니다.

 

1. Missing Value 처리

결측치는 모델의 성능을 떨어뜨리는 주요 원인입니다. 대충 평균으로 채우기보다는, 상황에 따라 전략을 구분해야 합니다.

# 평균, 중앙값, 최빈값 채우기
df['age'] = df['age'].fillna(df['age'].median())

# 새로운 카테고리 추가
df['job'] = df['job'].fillna('Unknown')

 

2. Log 변환으로 분포 정규화

수치형 피처가 오른쪽으로 치우친(skewed) 경우, 로그 변환은 큰 효과를 줍니다. Log변환은 outlier의 영향력을 줄여줍니다. log는 값이 커질수록 변화량이 줄어들기 때문입니다.

import numpy as np

df['income_log'] = np.log1p(df['income'])  # log(1 + x)

 

3. Interaction Features (교호작용)

두 개 이상의 변수 간의 관계를 표현하기 위해 새롭게 생성한 피처를 말합니다.

예를 들어:

  • income(소득)과 age(나이)가 각각 모델에 주어졌다고 가정해보죠.
  • 이 두 값의 단순 입력보다,
    income_per_age = income / age
    income_x_age = income * age
    같은 feature를 추가하면 모델은 이 둘의 조합에서 오는 영향력을 더 잘 학습할 수 있습니다.

두 feature의 곱이나 차 등을 새로 만들면 비선형 관계를 포착할 수 있습니다.

df['income_per_family'] = df['income'] / (df['num_family'] + 1)
df['age_income_product'] = df['age'] * df['income']

 

4. Target Encoding (범주형 인코딩)

범주형 변수(category)를 해당 범주에 대한 타겟값의 평균 등 통계값으로 인코딩하는 방식입니다.

카테고리 피처가 많을 때, 단순 one-hot encoding보다는 target encoding이 더 효율적일 수 있습니다. 주의 사항으로는 학습/검증 데이터 분리 전에 하면 데이터 누수(leakage) 발생할 수 있습니다.

df = pd.DataFrame({
    'job': ['engineer', 'teacher', 'engineer', 'lawyer', 'teacher'],
    'income': [3000, 2500, 3200, 5000, 2600]
})

# 1. job별 평균 소득 계산
job_mean = df.groupby('job')['income'].mean()

# 2. 매핑
df['job_encoded'] = df['job'].map(job_mean)

관련글 더보기