이득:
- 도메인 지식으로 의미 있는 파생 특성을 생성하고 적절한 방법(원-핫, 레이블, 대상)으로 범주형 범주를 인코딩하는 능력
- 모델 유형(표준화, 정규화)에 따라 수치 변수를 확장하고 불필요하거나 불완전한 확장을 방지하는 기능
- 훈련/테스트 분할 후 및 훈련에서만 모든 변환을 학습하여 기능 누출을 방지하는 기능
머신러닝에는 "응용 머신러닝은 본질적으로 기능 엔지니어링이다"라는 옛말이 있습니다. 모델의 성공은 어떤 알고리즘을 선택하느냐가 아니라 모델에 어떤 입력을 제공하느냐에 따라 결정되는 경우가 많기 때문입니다. 기능 엔지니어링은 모델이 학습할 수 있는 원시 데이터에서 의미 있는 신호를 생성하는 기술입니다. 인공지능은 이 단계에서 풍부한 아이디어의 원천입니다. "이 데이터에서 어떤 기능을 생성할 수 있는지"라고 물으면 수십 가지 제안 사항이 나열됩니다. 그러나 이러한 제안 중 일부는 가치가 있을 수 있고 일부는 쓸모가 없을 수 있으며 일부는 위험할 수 있습니다(유출). 그것을 정리하는 것이 당신의 임무입니다.
특성 엔지니어링이 필요한 이유
원시 데이터가 최상의 형태로 모델에 제공되는 경우는 거의 없습니다. '생년월일' 열 자체는 의미가 없지만, 여기서 생성되는 '나이' 값은 강력한 신호입니다. "주문 타임스탬프"에서 "요일", "낮/밤", "휴일인지" 등의 속성을 추출할 수 있습니다. 두 개의 열을 결합하여 비율("부채/소득 비율")을 생성할 수 있습니다. 여기서 기능 엔지니어링은 도메인 지식을 수학적 신호로 변환합니다. 이것이 바로 인간의 지능이 가장 많이 요구되는 단계인 이유이다.
범주형 변수를 숫자로 변환: 코딩
모델은 일반적으로 텍스트가 아닌 숫자로 작동합니다. 도시, 색상, 제품 유형 등의 범주형 변수를 숫자로 변환하는 것을 인코딩이라고 합니다. 세 가지 일반적인 방법:
원-핫 인코딩: 각 범주에 대해 값이 0/1인 별도의 열을 엽니다. "도시"의 경우 이스탄불, 앙카라, 이즈미르 열이 형성됩니다. 고객이 이스탄불 출신인 경우 해당 열만 1이 됩니다. 범주 수가 적을 때 이상적입니다. 범주가 너무 많으면 수백 개의 열이 생성됩니다(이를 "크기 폭발"이라고 함).
라벨 인코딩: 각 카테고리에 번호를 부여합니다(이스탄불=0, 앙카라=1). 간단하지만 실수로 모델에 시퀀스(예: 앙카라 > 이스탄불)를 가르칠 수 있습니다. 따라서 순서가 지정되지 않은 카테고리에서는 주의해서 사용됩니다.
대상 인코딩: 각 범주를 해당 범주에 있는 대상 변수의 평균으로 대체합니다. 이는 매우 강력하지만 누출의 가장 위험한 원인입니다. 테스트 데이터의 대상을 고려하면 모델은 미래를 볼 수 있습니다. 이는 훈련 데이터에서만 신중하게(교차 검증 내에서) 계산되어야 합니다.
스케일링: 큰 숫자가 모델을 압도하지 않습니다.
일부 모델(거리 기반 모델, 선형 모델, 신경망)은 변수 규모에 민감합니다. '소득'(0~500,000)과 '연령'(0~100)이 같은 패턴에 속한다면 단순히 소득이 크다는 이유만으로 지배적일 수 있다. 스케일링을 하면 이 문제가 해결됩니다. 두 가지 일반적인 방법: 표준화(각 값을 "평균에서 얼마나 많은 표준 편차"로 변환) 및 정규화(최소-최대 정규화 - 값을 0-1 범위로 압축). 트리 기반 모델(의사결정 트리, 랜덤 포레스트)은 규모에 민감하지 않으며 규모 조정이 필요하지 않습니다.
주의: 스케일링 및 코딩 매개변수(평균, 표준 편차, 범주-평균 매핑)는 훈련 데이터에서만 계산해야 하며, 테스트 데이터에도 동일하게 적용해야 합니다. 테스트 데이터를 포함하는 것은 누출이며 모델이 실제보다 더 좋아 보이게 만듭니다.
기능 엔지니어링 누출의 핵심
기능 생성은 데이터 유출이 가장 자주 발생하는 곳입니다. 두 가지 일반적인 실수: 시간 누출 — 미래 정보("지난 30일 평균"을 계산할 때 예측일 이후의 날짜 포함)를 포함하는 기능을 생성합니다. 통계 유출 — 학습/테스트 분할 전 모든 데이터에서 특징(스케일링 평균, 대상 인코딩 값)을 계산합니다. 규칙: 훈련/테스트 분할을 먼저 수행한 후 훈련 데이터에서만 각 변환을 학습합니다. 이를 정기적으로 수행하는 가장 안전한 방법은 단일 체인의 모든 변환을 수집하고 분할 후 적용하는 구조인 파이프라인을 사용하는 것입니다.
방법
무엇을 위해
누출 위험
참고
원-핫 인코딩
카테고리가 거의 없는 변수
낮음
다양한 카테고리로 규모 확장
라벨 코딩
정렬된 카테고리
낮음
순서가 잘못되어 잘못된 순서를 가르칩니다.
대상 인코딩
다중 카테고리, 강력한 신호
매우 높다
교육부터, 이력서까지
표준화
선형/거리 모델
중간
매개변수는 교육에만 의존함
시간 창 기능
시계열
높다
미래를 더하다
세 개의 미니 케이스
사례 1 - 귀중한 재산. 신용 팀은 원시 "월 소득" 및 "월별 부채 지불" 열에서 "부채 소득 비율" 기능을 생성했습니다. 이 단일 파생 기능은 모델 정확도를 71%에서 79%로 높였습니다. 실제로 위험을 결정하는 것은 절대 소득이 아니라 비율이었기 때문입니다. 교훈: 도메인 지식에 의해 생성된 비율은 강력한 신호입니다.
사례 2 - 대상 인코딩 누출. 한 팀은 "우편번호"를 대상 인코딩(해당 지역의 평균 이탈률)을 사용하여 숫자로 변환했지만 분할되기 전에 모든 데이터에서 변환했습니다. 모델은 테스트 세트에서 94%를 제공했지만 생산에서는 68%로 떨어졌습니다. 6주간의 노력이 낭비되었습니다. 교훈: 목표 코딩은 훈련 내에서만 신중하게 수행됩니다.
사례 3 - 스케일링 망각. 한 분석가는 확장 없이 거리 기반 모델에 수익(0~400,000)과 고객 연령(18~75세)을 입력했습니다. 이 모델은 거의 전적으로 소득만을 고려하여 연령 효과를 무너뜨렸습니다. 스케일링이 추가되면서 세분화가 의미 있게 되었습니다. 교훈: 거리/선형 모델에서는 스케일링이 무시되지 않습니다.
복사 가능한 템플릿 4개
1) 기능 아이디어 생성(제거는 귀하에게 달려 있음):
귀하의 역할: 기능 엔지니어링 보조자. 내 df 열: 출생_날짜, 주문_시간(타임스탬프), 소득_tl, 부채_tl, 도시, 제품_범주. 대상: "대출금이 상환됩니까?"(0/1). 이 열에서 생성할 수 있는 15가지 기능을 제안하세요. 각각에 대해 누출 위험(낮음/보통/높음)을 지정합니다. 미래의 정보가 포함된 항목을 명확하게 표시하세요.
2) 보안 코딩(분할 후):
"city"와 "product_category"를 원-핫 인코딩하는 코드를 작성합니다. 중요: 훈련 데이터에만 인코딩을 맞춘 다음 테스트 데이터를 변환합니다(sklearn OneHotEncoder 사용). 교육에서 보이지 않는 카테고리(handle_unknown)를 어떻게 처리하는지 설명하세요.
3) 파이프라인을 통한 누출 없는 변환:
sklearn 파이프라인 설정: StandardScaler를 숫자 열에 적용하고 OneHotEncoder를 범주형 열에 적용하고 끝에 분류자를 추가합니다. 모든 변환은 학습/테스트 분할 후에 학습을 통해서만 학습되도록 보장합니다. 코드와 누출이 없는 이유를 설명하세요.
4) 시간 창 기능(누출 제어):
각 고객에 대해 '지난 30일 동안의 주문 수' 속성을 생성하지만 예측일 이후의 데이터는 절대 포함하지 마세요. 코드가 미래를 내다보지 않는다는 점을 한 줄씩 설명하세요. 참조 날짜 열을 제공하겠습니다.
약한 프롬프트 / 강한 프롬프트
약한 프롬프트:
이 데이터에 좋은 속성을 추가하세요.
"좋음"은 정의되지 않고 목표가 불분명하며 누출 제어가 없습니다. AI는 누출 가능성이 있는 무작위 기능을 생성합니다.
강력한 프롬프트:
귀하의 역할: 기능 엔지니어. 목표: "30일 후 이탈"(0/1), 예상 참조 날짜: save_date. df.Task에 트랜잭션 내역이 있습니다: 8개의 특성을 생성하고, EACH에 대해 "예측 시 이 정보가 있습니까?"라는 질문에 답합니다. 시간 창 기능에서 참조 날짜 뒤에 날짜를 추가합니다. 학습/테스트 섹션 이후에 실행될 파이프라인 호환 방식으로 코드를 작성합니다.
여기에서는 처음부터 목표, 기준 시간, 누출 제어를 정의합니다.
일반적인 실수
- 나누기 전 모든 데이터의 변환을 학습합니다. 스케일링/인코딩 매개변수에 테스트 데이터가 표시되면 누출이 발생합니다.
- 타겟 코딩을 부주의하게 사용했습니다. 가장 강력하지만 누출이 가장 많은 방법입니다. 훈련을 통해 교차 검증을 통해 말이죠.
- 시간 창 기능으로 미래를 추가합니다. 예측일 이후에 "지난 30일" 계산이 입력되면 모델은 미래를 봅니다.
- 트리 모델의 불필요한 스케일링과 선형 모델의 불완전한 스케일링. 확장 결정은 모델 유형에 따라 이루어집니다.
- AI의 모든 기능 제안을 의심 없이 추가합니다. 제안에는 쓸모없고 누출되는 기능이 포함될 수 있습니다.
팁: 생성하는 각 기능에 대해 하나의 질문을 적어보세요. "예측 당시 가지고 있는 정보를 사용하여 이 값을 계산할 수 있습니까?" 대답이 명확하게 "예"가 아닌 경우 해당 기능을 사용하지 마십시오. 이 단일 규율은 대부분의 기능 관련 누출을 제거합니다.
요약하면
기능 엔지니어링은 원시 데이터에서 의미 있는 신호를 생성하는 기술이며 종종 알고리즘보다 모델의 성공을 더 결정합니다. 범주형 인코딩(원-핫, 레이블, 대상), 수치 스케일링(표준화, 정규화) 및 도메인 지식을 사용한 파생 기능 생성이 기본 도구입니다. 하지만 이 단계는 유출의 핵심이기도 합니다. 모든 변환은 훈련/테스트 분할 후에 훈련 데이터에서만 학습되어야 합니다. AI는 많은 아이디어를 창출합니다. 가치 있는 것과 위험한 것을 구별하는 것은 인간의 판단이다.
응용과제
목표 변수를 선택하고 보유한 열에서 최소 5개의 파생 특성을 디자인합니다. 각각에 대해 "예측 시점에 제가 가능합니까?"라는 질문에 서면으로 답변하고 "누출 위험이 높음"을 하나 이상 제거합니다. 그런 다음 파티션 후에 구현될 파이프라인의 보안 기능을 코딩합니다.
체크리스트
- [ ] 학습/테스트 분할 후 모든 변환을 적용했습니까?
- [ ] 훈련을 통해 스케일링/인코딩 매개변수만 배웠나요?
- [ ] 각 기능에 대한 "예측 시점에 보유하고 있습니까?"라는 질문에 답했습니까?
- [ ] 타겟 코딩과 같은 고위험 방법에 특별히 주의를 기울였는가?
- [ ] 모델 유형(트리/선형)에 맞게 크기를 조정하기로 결정했습니까?