머신러닝 성능의 70%는 Feature Engineering에서 결정된다는 말, 들어보셨나요?
지금이야 LLM 튜닝쪽으로 모든 포커스가 맞춰져 있었지만 원래는 Feature Engineering도 상당히 중요한 기법이였습니다.
LLM(예: GPT, BERT, LLaMA)은 대규모 텍스트 데이터를 입력 그대로 학습하며,
내부적으로 어마어마한 수의 파라미터를 통해 텍스트에서 유의미한 "feature"를 스스로 학습합니다.
즉, 사람이 의도적으로 feature를 가공해줄 필요가 거의 없습니다.
예를 들어:
그럼에도 불구하고! 일부 상황에선 여전히 Feature Engineering이 중요합니다. 모델 성능이 기대만큼 나오지 않을 때, 하이퍼파라미터를 바꾸기 전에 먼저 데이터를 의심해보는 게 정답일 수 있습니다.
이번 글에서는 실무에서 특히 자주 쓰이고, 실제 성능 향상에도 큰 도움을 주는 Feature Engineering 기법 5가지를 소개합니다. 예제 코드는 Python(pandas+scikit-learn) 기반으로 제공합니다.
결측치는 모델의 성능을 떨어뜨리는 주요 원인입니다. 대충 평균으로 채우기보다는, 상황에 따라 전략을 구분해야 합니다.
# 평균, 중앙값, 최빈값 채우기
df['age'] = df['age'].fillna(df['age'].median())
# 새로운 카테고리 추가
df['job'] = df['job'].fillna('Unknown')
수치형 피처가 오른쪽으로 치우친(skewed) 경우, 로그 변환은 큰 효과를 줍니다. Log변환은 outlier의 영향력을 줄여줍니다. log는 값이 커질수록 변화량이 줄어들기 때문입니다.
import numpy as np
df['income_log'] = np.log1p(df['income']) # log(1 + x)
두 개 이상의 변수 간의 관계를 표현하기 위해 새롭게 생성한 피처를 말합니다.
예를 들어:
두 feature의 곱이나 차 등을 새로 만들면 비선형 관계를 포착할 수 있습니다.
df['income_per_family'] = df['income'] / (df['num_family'] + 1)
df['age_income_product'] = df['age'] * df['income']
범주형 변수(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)
쉘 스크립트에서 아나콘다 설정하기 (0) | 2025.04.25 |
---|---|
huggingface에 자신의 데이터셋 push하기 (0) | 2023.08.29 |
[Python] 워드 파일에서 텍스트만 뽑아내기 (0) | 2023.08.22 |
python 만으로 날짜 네이밍 폴더 자동화 하기 (0) | 2023.08.10 |
[Python] pdf파일 합치기 (0) | 2023.08.09 |