Skip to main content

특성 공학 (Feature Engineering)

특성 공학(Feature Engineering)은 원본 데이터에서 모델이 패턴을 더 잘 학습할 수 있도록 새로운 특성을 생성하거나 기존 특성을 변환하는 과정입니다.

학습 목표

  • 수치형 변수에서 파생 특성을 생성할 수 있습니다.
  • 날짜/시간 데이터에서 유용한 특성을 추출할 수 있습니다.
  • 다항식 특성과 상호작용 특성을 만들 수 있습니다.
  • 도메인 지식 기반 특성 생성의 원리를 이해합니다.

왜 중요한가

좋은 특성은 간단한 모델로도 높은 성능을 달성하게 합니다. Kaggle 대회에서 상위 입상자들이 가장 많은 시간을 투자하는 영역이 특성 공학입니다.

핵심 개념

수치형 특성 변환

import pandas as pd
import numpy as np

df = pd.read_csv("data/housing.csv")

# 비율 특성 생성
df["price_per_sqft"] = df["price"] / df["sqft"]  # 단위 면적당 가격
df["room_ratio"] = df["bedrooms"] / df["total_rooms"]  # 방 비율

# 구간화 (Binning)
df["price_bin"] = pd.cut(
    df["price"],
    bins=[0, 200000, 500000, 1000000, np.inf],
    labels=["저가", "중가", "고가", "프리미엄"]
)

# 로그 변환 (오른쪽으로 치우친 분포 정규화)
df["price_log"] = np.log1p(df["price"])

# 제곱근 변환
df["sqft_sqrt"] = np.sqrt(df["sqft"])

날짜/시간 특성 추출

# 날짜 특성 분해
df["date"] = pd.to_datetime(df["date"])

df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day_of_week"] = df["date"].dt.dayofweek     # 0=월요일
df["is_weekend"] = df["day_of_week"].isin([5, 6]).astype(int)
df["quarter"] = df["date"].dt.quarter

# 주기적 특성 (순환 인코딩)
df["month_sin"] = np.sin(2 * np.pi * df["month"] / 12)
df["month_cos"] = np.cos(2 * np.pi * df["month"] / 12)

# 경과 시간
df["days_since_listed"] = (pd.Timestamp.now() - df["date"]).dt.days

다항식 및 상호작용 특성

from sklearn.preprocessing import PolynomialFeatures

# 2차 다항식 특성 생성
poly = PolynomialFeatures(degree=2, include_bias=False, interaction_only=False)
X_poly = poly.fit_transform(df[["sqft", "bedrooms"]])

# 생성된 특성 이름 확인
feature_names = poly.get_feature_names_out(["sqft", "bedrooms"])
print(f"원본: sqft, bedrooms")
print(f"생성: {feature_names}")
# ['sqft', 'bedrooms', 'sqft^2', 'sqft bedrooms', 'bedrooms^2']

# 수동 상호작용 특성 (도메인 지식 활용)
df["sqft_x_quality"] = df["sqft"] * df["quality_score"]

텍스트 기반 특성

# 텍스트 길이/단어 수
df["desc_length"] = df["description"].str.len()
df["word_count"] = df["description"].str.split().str.len()

# 특정 키워드 포함 여부
df["has_pool"] = df["description"].str.contains("pool", case=False).astype(int)
df["has_garage"] = df["description"].str.contains("garage", case=False).astype(int)

집계 특성 (Group-based)

# 그룹 통계 활용
neighborhood_stats = df.groupby("neighborhood")["price"].agg(
    ["mean", "median", "std", "count"]
).rename(columns={
    "mean": "nbr_price_mean",
    "median": "nbr_price_median",
    "std": "nbr_price_std",
    "count": "nbr_count"
})

df = df.merge(neighborhood_stats, on="neighborhood", how="left")

# 그룹 평균 대비 차이
df["price_vs_nbr"] = df["price"] - df["nbr_price_mean"]

AI/ML에서의 활용

특성 유형예시관련 알고리즘
다항식 특성면적^2, 면적 x 방수다항 회귀
로그 변환log(가격)모든 회귀 모델
구간화가격 등급(저/중/고)결정 트리 계열
집계 통계지역 평균 가격모든 모델
아닙니다. 불필요한 특성은 과적합을 유발하고 학습 시간을 증가시킵니다. 특성 공학 후에는 반드시 특성 선택을 수행하여 유용한 특성만 남겨야 합니다.
기본적인 수학적 변환(로그, 다항식, 비율)은 도메인 지식 없이도 적용할 수 있습니다. 그러나 가장 효과적인 특성은 해당 분야의 도메인 지식에서 나옵니다.

체크리스트

  • 비율, 차이, 집계 등 수치형 파생 특성을 생성할 수 있다
  • 날짜 데이터에서 유용한 특성을 추출할 수 있다
  • PolynomialFeatures로 다항식 특성을 만들 수 있다
  • 그룹 기반 집계 특성을 생성할 수 있다

다음 문서