타깃 인코딩(Target Encoding)이란? AI 범주를 정답 통계로 바꾸는 방법
TL;DR
타깃 인코딩(Target Encoding)은 상품군이나 지역 같은 범주를 해당 범주에서 관찰된 정답의 평균 또는 조건부 확률로 바꾸는 지도 전처리입니다. 범주가 많아도 범주마다 수천 개의 열을 만들지 않고 정답과 관련된 수치로 압축할 수 있습니다. 하지만 변환값을 계산할 때 현재 행이나 검증·테스트 데이터의 정답이 섞이면 데이터 누수와 과적합이 생기므로, 교차 적합과 평활화, 미지 범주 처리 규칙을 먼저 정해야 합니다.
핵심 3줄 요약
- 핵심 1
정답 통계를 이용합니다. 회귀에서는 범주별 평균, 이진 분류에서는 양성 비율 같은 값으로 범주를 바꿉니다. - 핵심 2
높은 카디널리티를 압축합니다. 범주 수가 많아도 입력 열을 범주 수만큼 늘리지 않습니다. - 핵심 3
누수 방지가 핵심입니다. 훈련 행을 다른 행의 통계로 인코딩하고 검증·테스트 정답은 계산에 넣지 않습니다.
이 글에서 다룰 내용
- 타깃 인코딩의 한 문장 정의
- 고객 문의 채널을 환불 비율로 바꾸는 쉬운 예시
- 범주가 많은 AI 데이터에서 중요한 이유
- 범주별 통계, 평활화, 교차 적합의 작동 순서
- 원-핫·순서형·빈도·CatBoost 방식과의 차이
- 실전 사용처와 적용 전 체크리스트
- 데이터 누수, 드문 범주, 분포 변화의 주의점
타깃 인코딩을 한 문장으로 정의하면 무엇인가요?
타깃 인코딩은 범주형 특징의 각 값을 그 범주에 속한 훈련 사례의 정답 통계로 치환하는 범주 인코딩 방법입니다.
scikit-learn의 TargetEncoder 문서는 각 범주를 그 범주의 평균 정답값을 축소한 추정치로 인코딩한다고 설명합니다. 회귀 정답이라면 범주별 평균을 사용할 수 있고 이진 분류라면 특정 클래스에 속할 비율을 수치로 쓸 수 있습니다. 다중 클래스에서는 클래스별 조건부 확률에 대응하는 여러 출력 특징이 생길 수 있습니다.
타깃 인코딩은 평균 인코딩(Mean Encoding), 가능도 인코딩(Likelihood Encoding), 임팩트 인코딩(Impact Encoding) 같은 이름과 가까운 맥락에서 쓰입니다. 구현마다 평활화 공식과 훈련 행을 계산하는 방식은 다를 수 있으므로 이름만 같다고 같은 결과가 나오는 것은 아닙니다.
한 줄 정리: 타깃 인코딩은 범주 이름을 그 범주와 정답 사이의 관계를 요약한 숫자로 바꾸는 방법입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 고객 문의 채널로 환불 문의 여부를 예측한다고 가정해 보겠습니다. 훈련 데이터 40건에서 이메일은 10건 중 4건, 채팅은 20건 중 6건, 전화는 10건 중 8건이 환불 문의였습니다.
- 이메일 → 환불 비율 0.40
- 채팅 → 환불 비율 0.30
- 전화 → 환불 비율 0.80
- 전체 데이터 → 환불 비율 0.45
단순 타깃 인코딩은 이메일을 0.40, 채팅을 0.30, 전화를 0.80으로 바꿉니다. 모델은 채널이라는 문자열 대신 이 숫자를 입력으로 받습니다. 범주가 세 개여도 출력 열 하나로 표현할 수 있다는 점이 원-핫 인코딩과 다릅니다.
문제는 사례가 한 건뿐인 새 채널입니다. 그 한 건의 정답이 환불이면 평균이 바로 1.00이 되어 우연을 강한 신호처럼 보일 수 있습니다. 그래서 사례 수가 적은 범주의 값은 전체 평균 0.45 쪽으로 당기는 평활화를 적용합니다.
쉬운 예시: 타깃 인코딩은 채널 이름표를 환불 비율표로 바꾸는 방식과 비슷합니다. 다만 표를 만들 때 예측할 행의 정답을 미리 보면 안 됩니다.
왜 AI 데이터에서 타깃 인코딩이 중요한가요?
범주가 많아도 열 수를 크게 늘리지 않습니다
상품 ID, 지역 코드, 직업명처럼 고유값이 많은 특징을 원-핫 인코딩하면 범주마다 열이 생깁니다. 타깃 인코딩은 보통 원래 범주형 특징 하나를 하나 또는 클래스 수에 대응하는 소수의 숫자 특징으로 바꿉니다. 높은 카디널리티를 다루는 선형 모델과 신경망 전처리에서 검토되는 이유입니다.
정답과 관련된 정보를 압축합니다
빈도만 세는 방식은 어떤 범주가 자주 나오는지는 알려 주지만 그 범주가 정답과 어떤 관계인지 직접 담지 않습니다. 타깃 인코딩은 범주별 평균이나 조건부 확률을 사용하므로 예측에 필요한 신호를 한 숫자에 담을 수 있습니다. 대신 정답을 사용한다는 사실 때문에 검증 설계가 더 엄격해야 합니다.
드문 범주의 불안정성을 조절할 수 있습니다
범주별 사례 수가 적으면 평균이 크게 흔들립니다. scikit-learn과 Category Encoders 문서는 범주 평균과 전체 평균을 섞는 평활화 방식을 제공합니다. 표본이 적은 범주는 전체 평균에 더 가깝게, 충분히 자주 나온 범주는 자체 평균에 더 가깝게 둘 수 있습니다.
핵심 인사이트: 타깃 인코딩의 장점은 범주를 짧은 숫자로 바꾸는 데만 있지 않습니다. 정답 신호를 압축하면서 드문 범주의 우연을 얼마나 억제할지 조절하는 데 있습니다.
타깃 인코딩은 어떻게 작동하나요?
1. 범주형 특징과 타깃을 정합니다
먼저 인코딩할 범주형 열과 예측할 정답 열을 고릅니다. 회귀라면 가격이나 수요 같은 연속값, 분류라면 환불 여부나 클래스 라벨이 타깃이 됩니다. 식별자처럼 거의 모든 행이 다른 열은 타깃 인코딩을 적용해도 행을 외우는 통로가 될 수 있으므로 필요성을 먼저 확인합니다.
2. 훈련 데이터에서 범주별 정답 통계를 구합니다
각 범주에 속한 훈련 행을 모아 정답 평균과 사례 수를 계산합니다. 이진 분류에서 정답을 0과 1로 나타내면 평균은 양성 클래스의 비율이 됩니다. 다중 클래스 처리 방식은 라이브러리에 따라 클래스마다 별도 인코딩을 만들 수 있습니다.
3. 범주 평균과 전체 평균을 평활화합니다
평활화는 범주 평균을 그대로 쓰지 않고 전체 정답 평균과 섞는 규제입니다. scikit-learn의 smooth 값이 커지면 전체 평균의 비중이 커집니다. Category Encoders도 최소 표본 수와 smoothing을 이용해 범주 사례 수에 따라 두 평균의 비중을 조절합니다.
4. 훈련 행은 교차 적합으로 변환합니다
scikit-learn의 fit_transform은 훈련 데이터를 여러 폴드로 나눕니다. 한 폴드를 인코딩할 때 나머지 폴드에서 배운 통계만 사용합니다. 현재 행의 정답과 같은 폴드의 정답을 직접 사용하지 않아, 훈련 데이터에만 지나치게 잘 맞는 값을 줄이는 방식입니다.
같은 인코더라도 전체 훈련 데이터로 fit한 뒤 그 훈련 데이터를 transform하면 교차 적합 결과와 같지 않습니다. scikit-learn 문서는 이런 사용이 데이터 누수를 만들 수 있어 훈련 데이터에는 fit_transform을 권장한다고 명시합니다.
5. 검증·테스트 데이터에는 훈련 통계만 적용합니다
검증과 테스트 행은 해당 데이터의 정답을 보지 않고 훈련 데이터에서 확정한 범주별 값을 적용합니다. 학습 때 없던 새 범주는 전체 타깃 평균이나 미지 범주용 기본값으로 처리할 수 있습니다. H2O 문서도 K-겹과 leave-one-out 같은 누수 방지 전략, 평활화와 잡음 설정을 별도로 제공합니다.
실전 팁: 타깃 인코더를 모델 파이프라인과 함께 두고 데이터 분할 안에서만 fit되도록 구성하세요. 전처리만 먼저 전체 데이터에 적용하면 뒤에서 교차 검증을 해도 누수가 남습니다.
타깃 인코딩과 헷갈리는 용어는 무엇이 다른가요?
원-핫 인코딩과 타깃 인코딩의 차이
원-핫 인코딩은 정답을 보지 않고 범주마다 독립된 0·1 열을 만듭니다. 범주의 뜻을 열 이름으로 보존하기 쉽지만 범주가 많으면 입력 차원이 커집니다. 타깃 인코딩은 정답 통계로 범주를 압축해 열 수를 줄이지만 누수와 과적합 관리가 필요합니다.
순서형 인코딩과 타깃 인코딩의 차이
순서형 인코딩은 낮음·보통·높음처럼 실제 순서가 있는 범주에 정해진 번호를 붙입니다. 타깃 인코딩의 숫자는 사람이 정한 순위가 아니라 훈련 데이터에서 계산한 정답 관계입니다. 숫자 크기가 생겼다는 점만 보고 두 방법을 같게 보면 안 됩니다.
빈도 인코딩과 타깃 인코딩의 차이
빈도 인코딩은 범주가 나타난 횟수나 비율로 값을 바꾸며 정답을 사용하지 않습니다. 타깃 인코딩은 범주에 속한 행의 정답 평균이나 조건부 확률을 사용합니다. 빈도 인코딩도 전체 데이터에서 먼저 계산하면 분할 정보가 섞일 수 있지만 타깃 인코딩은 정답까지 쓰므로 누수 위험이 더 직접적입니다.
임베딩과 타깃 인코딩의 차이
임베딩은 범주마다 여러 차원의 학습 가능한 벡터를 두고 모델의 손실을 줄이도록 함께 학습합니다. 타깃 인코딩은 모델 학습 전에 범주별 정답 통계를 계산해 하나 또는 소수의 수치 특징으로 바꿉니다. 임베딩은 더 풍부한 표현을 배울 수 있지만 데이터와 계산량이 더 필요할 수 있습니다.
CatBoost의 순서형 통계와 일반 타깃 인코딩의 차이
CatBoost는 무작위 순서에서 현재 객체보다 앞선 객체의 통계를 이용해 범주형 특징을 숫자로 바꾸는 방식을 설명합니다. 현재 객체의 정답을 계산에서 제외해 누수를 줄이려는 설계입니다. 타깃 통계를 쓴다는 공통점은 있지만 독립된 전처리기로 전체 범주 평균을 계산하는 단순 방식과 처리 순서가 다릅니다.
비교 정리: 원-핫은 독립된 0·1 열, 순서형은 정해진 순위, 빈도 인코딩은 등장량, 타깃 인코딩은 정답 통계, 임베딩은 학습된 벡터를 사용합니다.
실전에서는 어디에 쓰이나요?
상품·지역·직업처럼 범주가 많은 표 데이터
고유값이 수백 개에서 수만 개에 이르는 열을 선형 모델이나 일반적인 수치 입력 모델에 넣을 때 검토합니다. 원-핫 입력이 지나치게 넓어지는 상황에서 범주와 정답의 관계를 작은 수의 열로 줄일 수 있습니다.
클릭·구매·이탈 여부를 예측하는 이진 분류
매체, 채널, 상품군, 지역별 양성 비율을 계산해 입력 특징으로 사용할 수 있습니다. 광고 운영이 아니라도 고객 문의 분류, 구독 이탈 예측, 품질 이상 탐지처럼 0과 1의 정답을 가진 업무에 같은 원리가 적용됩니다.
가격·수요·처리 시간을 예측하는 회귀
지역이나 상품군별 평균 가격, 유형별 평균 처리 시간처럼 연속형 정답의 범주별 평균을 사용합니다. 평균 차이가 실제 범주 효과인지 표본 부족에서 생긴 우연인지 구분하려고 평활화와 교차 검증 결과를 함께 확인해야 합니다.
범주형 통계를 내부에서 처리하는 부스팅 모델
CatBoost처럼 범주형 특징을 받아 순서형 통계를 내부에서 만드는 모델도 있습니다. 이런 모델에 외부 타깃 인코딩을 무조건 겹쳐 적용하지 말고 모델의 기본 처리와 외부 인코더를 동일한 검증 조건에서 비교합니다.
실전 팁: 원-핫 인코딩이나 모델의 기본 범주 처리 방식을 베이스라인으로 남기세요. 타깃 인코딩은 검증 성능과 운영 안정성이 함께 좋아질 때 선택합니다.
타깃 인코딩을 적용할 때 어떤 순서로 확인하나요?
1. 데이터 분할을 먼저 고정합니다
훈련·검증·테스트 세트를 나눈 뒤 인코더를 맞춥니다. 같은 고객의 반복 기록은 그룹 단위로 나누고 시계열 데이터는 미래가 과거 통계에 들어가지 않게 시간 순서를 지킵니다.
2. 베이스라인 인코딩과 비교합니다
원-핫, 빈도 인코딩, 모델의 기본 범주 처리 결과를 같은 분할과 같은 지표에서 비교합니다. 타깃 인코딩의 점수만 단독으로 보면 누수 때문에 높아진 값인지 알아채기 어렵습니다.
3. 교차 적합 방식을 기록합니다
폴드 수, 그룹 분할 여부, 난수 시드와 셔플 조건을 남깁니다. 훈련 행마다 어느 데이터로 인코딩 값을 계산했는지 재현할 수 있어야 합니다.
4. 평활화와 미지 범주 규칙을 정합니다
범주별 최소 사례 수와 평활화 강도를 검증 데이터로 비교합니다. 새 범주, 결측값과 드문 범주를 전체 평균으로 바꿀지 별도 값으로 둘지도 학습과 서비스에서 같게 유지합니다.
5. 배포 뒤 범주 분포와 품질을 감시합니다
미지 범주 비율, 범주별 사례 수, 인코딩 값의 범위와 예측 품질을 함께 봅니다. 새 상품군이 늘거나 타깃 비율이 달라지면 오래된 통계가 현재 관계를 반영하지 못할 수 있습니다.
한 줄 정리: 분할을 먼저 고정하고 그 안에서 인코더를 학습한 뒤 베이스라인과 비교해야 타깃 인코딩의 실제 효과를 판단할 수 있습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 전체 데이터의 정답 평균을 미리 계산하지 않습니다. 검증과 테스트 정답이 인코딩 값에 들어가면 모델이 미래 정보를 본 것과 같습니다. 전처리도 훈련 분할 안에서만 맞춥니다.
둘째, 현재 행의 정답을 그대로 반영하지 않습니다. 특히 거의 고유한 ID는 각 행의 정답을 외우는 수치가 되기 쉽습니다. 교차 적합, leave-one-out 또는 순서형 통계를 사용하고 식별자 열은 제거 여부부터 검토합니다.
셋째, 드문 범주의 극단값을 믿지 않습니다. 사례 한두 건에서 나온 0이나 1은 안정된 확률이 아닙니다. 전체 평균과 섞는 평활화, 최소 사례 수와 드문 범주 묶기를 비교합니다.
넷째, 시간과 그룹 구조를 무시하지 않습니다. 같은 사용자의 기록이나 미래 시점의 정답으로 과거 행을 인코딩하면 일반 K-겹 방식도 누수가 될 수 있습니다. 실제 예측 시점에 사용할 수 있는 정보만 남깁니다.
다섯째, 민감한 집단 차이를 자동으로 정답 신호로 쓰지 않습니다. 지역이나 인구통계 범주의 평균 정답은 과거 데이터의 편향을 압축할 수 있습니다. 필요한 특징인지 검토하고 집단별 오류와 공정성 지표를 따로 확인합니다.
주의: 타깃 인코딩에서 가장 위험한 오류는 값의 범위가 아니라 계산 시점입니다. 예측할 때 알 수 없는 정답이 통계에 한 번이라도 섞이면 검증 점수를 신뢰하기 어렵습니다.
자주 묻는 질문
Q1. 타깃 인코딩과 타겟 인코딩은 같은 말인가요?
네. Target Encoding을 한글로 적을 때 타깃 인코딩과 타겟 인코딩을 모두 볼 수 있습니다. 이 글에서는 외래어 표기인 타깃 인코딩을 사용합니다.
Q2. 타깃 인코딩은 분류에만 쓰나요?
아닙니다. 이진 분류에서는 양성 비율, 다중 클래스에서는 클래스별 조건부 확률, 회귀에서는 범주별 연속 정답 평균을 사용할 수 있습니다. 지원 범위와 출력 열 수는 구현 문서를 확인해야 합니다.
Q3. 범주 평균을 한 번 계산해 훈련과 테스트에 쓰면 되나요?
테스트에는 훈련 데이터에서 배운 통계를 적용하면 되지만 훈련 행 자체를 같은 전체 훈련 평균으로 바꾸면 과적합 위험이 있습니다. 훈련 데이터는 교차 적합이나 leave-one-out 방식으로 변환하는 편이 안전합니다.
Q4. 처음 보는 범주는 어떤 값으로 바꾸나요?
전체 훈련 타깃 평균을 사용하는 구현이 많습니다. 결측값을 별도 범주로 볼지, 오류를 낼지, 전체 평균으로 둘지는 라이브러리 설정에 따라 다르므로 학습과 서비스에서 같은 규칙을 써야 합니다.
Q5. 타깃 인코딩을 쓰면 원-핫 인코딩보다 항상 좋은가요?
아닙니다. 범주가 적고 데이터가 충분하면 원-핫이 단순하고 해석하기 쉬울 수 있습니다. 타깃 인코딩은 높은 카디널리티에서 유용할 수 있지만 누수 방지와 평활화가 잘못되면 검증 점수만 높고 실제 성능은 낮아질 수 있습니다.
출처
마무리
타깃 인코딩은 범주형 값을 범주별 정답 평균이나 조건부 확률로 바꾸는 지도 전처리입니다. 범주 수가 많은 데이터를 작은 수의 특징으로 압축하고 정답과 관련된 신호를 담을 수 있지만 계산에 정답을 사용하는 만큼 데이터 누수와 과적합 위험도 큽니다.
처음 적용한다면 세 가지를 기억하세요. 데이터를 먼저 나누고 훈련 행은 교차 적합으로 바꾸며 드문 범주는 전체 평균 쪽으로 평활화합니다. 원-핫과 모델의 기본 범주 처리 결과를 같은 검증 조건에서 비교하면 타깃 인코딩이 실제 문제에 맞는지 더 정확히 판단할 수 있습니다.
