본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

Leverage로서의 Feature Engineering

~30 min · features, engineering

Level 0Scout
0 XP0/48 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

좋은 표현이 모델 튜닝보다 큰 힘을 내

단순 기준선을 넘은 뒤에는 초매개변수 한 칸보다 현실의 구조를 담은 특성 하나가 더 큰 향상을 주는 경우가 많아. 원시 열을 무작정 늘리는 게 아니라 예측 시점에 알 수 있는 사건을 업무 의미에 맞게 요약하는 일이 특성 공학이야. 좋은 특성은 모델이 적은 자료로도 관계를 보기 쉽게 하고 설명도 선명하게 해.

시간 창 집계

예측 기준 시각 이전 7일, 30일, 90일의 횟수, 합계, 평균, 최댓값을 만들면 최근 행동과 장기 기준을 함께 볼 수 있어. 창의 끝은 예측 시각보다 앞이어야 하고 목표가 관찰되는 미래 구간과 겹치면 안 돼. 같은 사용자의 과거만 집계하도록 키와 시간 정렬을 시험해.

최근성과 빈도

마지막 행동 이후 지난 시간, 일정 기간의 행동 횟수, 행동 사이 평균 간격은 고객 활동의 리듬을 압축해. 한 번도 행동하지 않은 사례의 값을 0으로 둘지 별도 표시할지 정해야 해. 예측 시각과 시간대가 달라 음수가 생기지 않는지도 자동 검사해.

비율과 기준 대비 값

절대 지출보다 자신의 과거 평균 대비 최근 지출, 요금제 평균 대비 사용량 같은 비율이 규모 차이를 줄여줄 수 있어. 분모가 0이거나 아주 작을 때 값이 폭발하지 않도록 평활화와 결측 규칙을 정해. 집단 평균은 학습 자료에서만 계산하고 교차검증 폴드 안에 넣어 목표와 검증 분포가 새지 않게 해.

범주 상호작용

등급과 지역, 기기와 채널처럼 조합 자체가 사업 구간을 나타내면 두 범주를 합친 특성이 선형 모델에 상호작용을 보여줄 수 있어. 가능한 모든 조합을 만들면 희귀 범주가 폭발하므로 도메인 가설이 있는 쌍부터 시험해. 새 조합과 적은 표본을 ‘기타’로 처리할 기준도 필요해.

다른 객체의 요약

사용자만 보지 말고 사용자가 속한 조직, 상품, 지역의 과거 통계를 붙이면 맥락을 제공할 수 있어. 하지만 해당 행 자신과 미래 사건을 집계에 포함하면 목표 누출이 생겨. leave-one-out 계산과 시점 절단을 적용하고 새 조직에는 어떤 기본값을 쓸지 정해.

모든 특성에 시간 합법성 증명을 붙여

‘이 값은 예측 시각 T에 T 이전의 어떤 원천 사건으로 계산된다’는 한 문장을 각 특성에 적어. 생성 시각, 사용 가능 시각, 갱신 주기, 원천 테이블을 열 감사표에 남겨. 증명하기 어렵거나 제공 시스템에서 같은 계산을 못 하면 좋은 노트북 특성이 아니라 배포할 수 없는 누출 후보야.

같은 함수를 학습과 제공에서 써

특성 정의를 노트북 복붙으로 만들지 말고 시간 기준을 인자로 받는 순수한 변환이나 파이프라인 단계로 구현해. 작은 사건 기록에 대해 기대 집계를 단위시험하고, 과거 시점으로 되돌려 계산하는 point-in-time 정확성 시험을 둬. 오프라인과 온라인 결과를 표본 행에서 비교해야 해.

추가할 때마다 제거 시험도 해

새 특성 세트를 같은 교차검증에서 기준선과 비교하고 평균 향상과 흔들림, 계산 비용을 기록해. 중요도가 낮거나 유지 비용이 큰 특성은 빼도 성능이 유지되는지 시험해. 특성 수가 늘어나는 것 자체를 진전으로 착각하지 마. 설명 가능한 향상과 운영 가능한 계산이 함께 있어야 남길 가치가 있어.

Code

pandas로 만드는 시점 안전 이동 창·python
df = df.sort_values(["user_id", "event_time"])
df["tickets_30d"] = (
    df.groupby("user_id")
      .rolling("30D", on="event_time")["ticket_count"]
      .sum()
      .reset_index(level=0, drop=True)
)
비율과 최근성 특성·python
df["spend_vs_plan_avg"] = df["monthly_spend"] / df.groupby("plan_tier")["monthly_spend"].transform("median")
df["days_since_last_login"] = (df["prediction_time"] - df["last_login_at"]).dt.days

External links

Exercise

데이터셋에 시간 창 집계, 비율, 최근성 특성을 하나씩 추가해. 각 특성의 예측 시점 합법성을 원천과 절단 시각까지 한 문장으로 증명하고 같은 교차검증에서 향상과 계산 비용을 보고해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.