빈도 인코딩(Frequency Encoding)이란? AI 범주를 출현 비율로 바꾸는 방법
TL;DR
빈도 인코딩(Frequency Encoding)은 범주형 특징의 각 범주를 훈련 데이터에서 나타난 횟수나 비율로 바꾸는 전처리입니다. 상품 A가 전체 100건 중 40건이면 A를 0.4로 바꾸는 식입니다. 범주가 많아도 열 하나를 유지하고 정답값을 사용하지 않지만, 출현량이 같은 서로 다른 범주는 같은 숫자가 됩니다. 훈련 데이터에서 변환표를 만들고 미지 범주·결측값·분포 변화에 대한 규칙을 정한 뒤 다른 인코딩과 성능을 비교해야 합니다.
핵심 3줄 요약
- 핵심 1
범주를 출현량으로 바꿉니다. 횟수를 쓰면 카운트 인코딩, 전체에서 차지한 비율을 쓰면 빈도 인코딩이라고 구분하기도 합니다. - 핵심 2
범주가 많아도 열 하나를 유지합니다. 원-핫 인코딩처럼 범주마다 새 열을 만들지 않아 데이터 폭을 줄이기 쉽습니다. - 핵심 3
같은 빈도와 새 범주를 점검합니다. 서로 다른 범주가 같은 숫자로 합쳐질 수 있고 서비스 데이터의 출현 비율은 바뀔 수 있습니다.
이 글에서 다룰 내용
- 빈도 인코딩의 한 문장 정의
- 문의 유형 예시로 이해하는 출현 횟수와 비율
- 범주가 많은 데이터에서 열 하나를 유지하는 이유
- 훈련 데이터에서 변환표를 만들고 적용하는 순서
- 카운트·원-핫·순서형·타깃·특징 해싱과의 차이
- 모델 학습과 배포 전에 확인할 체크리스트
- 같은 빈도 충돌·미지 범주·분포 변화의 주의점
빈도 인코딩을 한 문장으로 정의하면 무엇인가요?
빈도 인코딩은 범주형 특징의 각 범주를 훈련 데이터에서 관찰된 출현 횟수 또는 전체 행에서 차지하는 비율로 치환하는 데이터 전처리입니다.
Feature-engine의 CountFrequencyEncoder 문서는 count 방식은 범주별 관측 횟수를, frequency 방식은 범주별 관측 비율을 사용한다고 설명합니다. 예를 들어 색상 열의 파랑이 100행 중 40행에 있다면 파랑을 40 또는 0.4로 바꿉니다.
이 글에서는 출현 비율을 쓰는 방식을 빈도 인코딩, 원시 횟수를 쓰는 방식을 카운트 인코딩이라고 구분합니다. 다만 일부 도구와 문서에서는 두 방식을 함께 count 또는 frequency encoding이라는 묶음으로 다룹니다. 실제 구현에서는 normalize 같은 설정이 켜졌는지 확인해야 합니다.
한 줄 정리: 빈도 인코딩은 범주 이름을 그 범주가 훈련 데이터에서 얼마나 자주 나타났는지를 나타내는 숫자로 바꿉니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 고객 문의 10건으로 처리 시간 예측 모델을 만든다고 가정해 보겠습니다. 문의 유형은 결제 5건, 배송 3건, 환불 2건입니다.
- 결제 5건 → 카운트 5, 빈도 0.5
- 배송 3건 → 카운트 3, 빈도 0.3
- 환불 2건 → 카운트 2, 빈도 0.2
원본 열에서 결제라는 문자열이 있던 모든 자리는 0.5로 바뀝니다. 배송은 0.3, 환불은 0.2가 됩니다. 범주가 세 개여도 결과 열은 하나입니다. 모델은 문의 유형의 이름 대신 훈련 데이터에서의 출현 비율을 입력으로 받습니다.
여기에 교환 문의도 2건 있었다면 환불과 교환이 모두 0.2가 됩니다. 두 범주는 이름과 의미가 다르지만 인코딩 결과만 보면 구분할 수 없습니다. 이를 충돌이라고 부르며, 빈도 인코딩을 고를 때 반드시 확인해야 하는 한계입니다.
쉬운 예시: 자주 나온 범주에 큰 숫자를 주는 방식이므로 출현량 자체가 예측에 도움이 되는 상황인지 먼저 생각해야 합니다.
왜 AI 데이터에서 빈도 인코딩이 중요한가요?
범주가 많아도 열 수를 늘리지 않습니다
원-핫 인코딩은 범주마다 별도 이진 열을 만듭니다. 상품 코드나 지역 코드처럼 범주가 수천 개라면 데이터 폭이 크게 늘어날 수 있습니다. 빈도 인코딩은 한 범주형 특징을 한 숫자 열로 유지하므로 입력 차원을 간결하게 관리하기 쉽습니다.
Feature-engine 문서는 카운트와 빈도 인코딩이 원-핫·특징 해싱·바이너리 인코딩과 달리 한 범주형 변수에서 한 숫자 특징을 만든다고 설명합니다. 다만 열 수가 적다는 사실만으로 정보가 더 잘 보존된다는 뜻은 아닙니다.
정답값 없이 입력 분포만 사용합니다
빈도 인코딩은 예측 대상 y를 보지 않고 입력 X의 범주별 출현량만 계산합니다. 타깃 인코딩은 정답 평균이나 조건부 확률을 쓰지만 빈도 인코딩은 쓰지 않습니다. 타깃값을 직접 섞어서 생기는 누수는 없지만, 변환표는 훈련 데이터에서만 학습해야 합니다.
검증·테스트 데이터까지 합쳐 빈도를 계산하면 평가에 쓰일 데이터 분포를 미리 본 셈이 됩니다. 데이터 분할을 먼저 고정하고 훈련 데이터의 변환표를 저장한 뒤 나머지 데이터에 그대로 적용해야 비교가 공정합니다.
출현량 자체를 하나의 신호로 시험할 수 있습니다
상품이 얼마나 자주 등장했는지, 특정 장비 유형이 기록에 얼마나 많이 남았는지처럼 출현량이 업무 의미를 가질 때 후보 특징으로 시험할 수 있습니다. 예를 들어 자주 판매된 상품이라는 정보가 수요 예측에 보조 신호가 될 수 있습니다.
반대로 수집 시스템의 편향 때문에 자주 기록된 범주라면 큰 빈도값이 현실의 중요도를 뜻하지 않습니다. 빈도가 어떤 과정에서 만들어졌는지 확인하고 동일한 데이터 분할에서 원-핫·순서형·타깃 인코딩 또는 모델의 자체 범주 처리와 검증 성능을 비교해야 합니다.
핵심 인사이트: 빈도 인코딩의 장점은 범주 수와 관계없이 열 하나를 유지하는 데 있습니다. 대가로 범주의 고유한 이름과 같은 빈도 사이의 차이를 잃을 수 있습니다.
빈도 인코딩은 어떻게 작동하나요?
1. 범주형 특징과 데이터 분할을 정합니다
먼저 문자열이나 범주형 자료형으로 된 입력 열을 고릅니다. 그다음 훈련·검증·테스트 데이터를 나눕니다. 빈도표를 만들기 전에 분할을 끝내야 검증과 테스트 데이터의 분포가 전처리 학습에 섞이지 않습니다.
2. 훈련 데이터에서 범주별 횟수를 셉니다
훈련 열의 고유한 범주마다 행 수를 계산합니다. pandas의 value_counts는 고유값별 개수를 반환하며, normalize를 True로 두면 전체에서 차지하는 상대 빈도를 반환합니다. 결측값을 셀지 제외할지도 설정에 따라 달라지므로 규칙을 고정합니다.
3. 횟수 또는 비율 변환표를 만듭니다
카운트 방식이라면 범주와 원시 횟수를 연결하고, 빈도 방식이라면 범주별 횟수를 기준 행 수로 나눈 비율을 연결합니다. 표본이 1,000건일 때 200번 나온 범주의 빈도는 0.2입니다. 이 변환표는 전처리 객체와 함께 저장합니다.
4. 같은 변환표로 다른 데이터를 바꿉니다
검증·테스트·실제 서비스 데이터에서는 빈도를 다시 계산하지 않습니다. 훈련 때 만든 변환표를 적용해 같은 범주가 언제나 같은 숫자로 들어가게 합니다. 전처리기와 모델을 하나의 파이프라인이나 버전으로 묶으면 배포 환경의 변환 차이를 줄일 수 있습니다.
5. 미지 범주와 결측값 정책을 적용합니다
훈련에 없던 새 범주는 변환표에 값이 없습니다. Feature-engine은 설정에 따라 오류를 내거나 NaN으로 남기거나 0으로 인코딩할 수 있다고 안내합니다. Category Encoders의 CountEncoder도 미지 범주와 결측값 처리 옵션을 제공합니다.
새 범주를 0으로 바꾸면 훈련에서 한 번도 나타나지 않았다는 의미를 담을 수 있지만, 결측값이나 다른 특수값과 겹치지 않는지 확인해야 합니다. 미지 범주 발생률이 높아지면 데이터 분포 변화나 범주 사전 갱신이 필요한 신호일 수 있습니다.
한 줄 정리: 분할을 먼저 고정하고 훈련 데이터에서 빈도표를 만든 뒤, 같은 표와 예외 규칙을 검증·추론에 적용합니다.
빈도 인코딩과 헷갈리는 용어는 무엇이 다른가요?
카운트 인코딩과 빈도 인코딩의 차이
카운트 인코딩은 범주의 원시 출현 횟수를 사용합니다. 빈도 인코딩은 그 횟수를 전체 기준 행 수로 나눈 비율을 사용합니다. 같은 분포라도 데이터가 1,000행에서 10,000행으로 늘면 카운트는 열 배가 되지만 비율은 비슷하게 유지될 수 있습니다.
원-핫 인코딩과 빈도 인코딩의 차이
scikit-learn의 OneHotEncoder는 범주마다 하나의 이진 열을 만듭니다. 서로 다른 범주를 별도 위치에 보존하지만 범주 수가 많으면 열도 늘어납니다. 빈도 인코딩은 한 열만 남기지만 같은 출현량을 가진 범주가 같은 숫자로 합쳐질 수 있습니다.
순서형 인코딩과 빈도 인코딩의 차이
순서형 인코딩은 범주마다 0부터 시작하는 고유 정수 코드를 대응시킵니다. 코드표가 고유하므로 출현량이 같아도 범주는 구분됩니다. 빈도 인코딩의 숫자는 코드 번호가 아니라 훈련 데이터에서 관찰된 횟수나 비율입니다.
타깃 인코딩과 빈도 인코딩의 차이
scikit-learn의 TargetEncoder는 범주별 정답 평균과 전체 정답 평균을 섞은 값을 사용하며 훈련 데이터 변환에 교차 적합을 적용합니다. 빈도 인코딩은 정답을 사용하지 않습니다. 그래서 두 숫자가 담는 의미와 누수 위험, 예외 처리 방식이 다릅니다.
특징 해싱과 빈도 인코딩의 차이
특징 해싱은 해시 함수로 범주를 미리 정한 벡터 칸에 배치합니다. 범주가 늘어도 출력 차원을 고정하지만 여러 열을 만들 수 있고 해시 충돌이 생깁니다. 빈도 인코딩은 한 숫자 열을 유지하며 출현량이 같은 범주끼리 충돌합니다.
비교 정리: 카운트는 횟수, 빈도는 비율, 원-핫은 범주별 이진 열, 순서형은 고유 정수 코드, 타깃은 정답 통계, 특징 해싱은 해시 칸을 사용합니다.
실전에서는 어디에 쓰이나요?
범주가 많은 표 데이터의 베이스라인
상품 ID, 우편번호, 판매처, 장비 유형처럼 범주 수가 많은 열에서 빠른 비교 기준을 만들 때 쓸 수 있습니다. 원-핫 인코딩으로 열이 지나치게 넓어지는지 확인하고 빈도 인코딩과 모델의 자체 범주 처리 성능을 같은 조건에서 비교합니다.
출현량이 업무 의미를 갖는 예측
상품 노출 횟수나 문의 유형의 발생 비중처럼 많이 나타난다는 사실이 예측과 관련 있을 때 후보 특징으로 시험합니다. 하지만 인코딩된 숫자가 인기나 중요도를 자동으로 증명하지는 않습니다. 수집 기간과 표본 구성에 따라 빈도가 달라질 수 있습니다.
간결한 전처리 파이프라인
한 범주형 열을 한 숫자 열로 유지하므로 기존 열 이름과 데이터 폭을 관리하기 쉽습니다. 변환표, 기준 표본 수, 결측값 처리, 미지 범주 값을 전처리 객체에 저장해 모델과 함께 배포해야 합니다.
분포 변화 모니터링
서비스 데이터에서 범주별 출현 비율을 다시 집계하면 훈련 시점과 현재 입력의 차이를 살펴볼 수 있습니다. 다만 모델 입력값을 실시간 빈도로 계속 바꾸는 것과 모니터링 통계를 따로 계산하는 것은 구분해야 합니다. 모델에는 학습된 변환표를 적용하고 변화는 별도 지표로 관찰합니다.
실전 팁: 빈도 인코딩을 쓴 모델에는 변환표뿐 아니라 표를 계산한 데이터 기간과 행 수를 함께 기록하세요. 값이 만들어진 배경을 나중에 확인하기 쉽습니다.
빈도 인코딩을 적용할 때 어떤 순서로 확인하나요?
1. 출현량이 유효한 신호인지 확인합니다
범주가 자주 등장한 이유가 업무 현상인지 수집 편향인지 살펴봅니다. 중복 로그나 특정 채널의 과다 수집 때문에 빈도가 커졌다면 인코딩 전에 집계 단위와 중복 기준부터 고쳐야 합니다.
2. 데이터 분할과 계산 기간을 고정합니다
훈련·검증·테스트를 먼저 나누고 훈련 구간에서만 횟수와 비율을 계산합니다. 시계열 데이터라면 미래 기간의 출현량이 과거 훈련 입력에 들어가지 않도록 시간 순서도 지킵니다.
3. 카운트와 빈도 중 하나를 명시합니다
원시 횟수와 상대 비율은 데이터 크기가 바뀔 때 다르게 움직입니다. 라이브러리의 encoding_method 또는 normalize 설정을 확인하고, 저장된 변환표의 값이 횟수인지 비율인지 이름과 문서에 남깁니다.
4. 충돌·결측값·미지 범주를 시험합니다
같은 빈도를 가진 서로 다른 범주가 몇 쌍인지 확인합니다. 결측값과 훈련에 없던 범주를 각각 넣어 오류, NaN, 0 가운데 어떤 값이 나오는지 시험하고 모델이 해당 값을 받을 수 있는지도 확인합니다.
5. 대안과 운영 지표를 비교합니다
원-핫·순서형·타깃 인코딩, 특징 해싱, 모델의 자체 범주 처리를 같은 데이터 분할과 평가 지표로 비교합니다. 검증 성능만 보지 말고 메모리, 추론 오류, 미지 범주 발생률, 시간에 따른 빈도 변화를 함께 기록합니다.
한 줄 정리: 출현량의 의미를 확인하고 분할과 계산 방식을 고정한 뒤, 충돌과 예외를 시험하고 대안과 비교합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 같은 빈도가 같은 범주라는 뜻은 아닙니다. 환불과 교환이 각각 20번 나왔다면 둘 다 같은 숫자로 바뀝니다. 범주의 고유한 차이가 중요한 업무라면 원-핫이나 다른 인코딩을 비교합니다.
둘째, 검증·테스트 데이터로 변환표를 다시 만들지 않습니다. 평가할 데이터의 분포가 전처리에 들어가면 실제 배포 상황보다 유리한 결과가 나올 수 있습니다. 훈련에서 만든 표만 재사용합니다.
셋째, 빈도를 중요도나 인과관계로 해석하지 않습니다. 많이 기록된 범주는 수집 장치나 업무 절차 때문에 자주 보였을 수 있습니다. 빈도값은 관찰된 출현량일 뿐입니다.
넷째, 미지 범주와 결측값을 같은 뜻으로 취급하지 않습니다. 새 범주가 생긴 상태와 값이 비어 있는 상태는 다릅니다. 별도 처리 규칙과 모니터링 지표를 둡니다.
다섯째, 서비스 분포가 바뀌는지 확인합니다. 훈련 때 0.4였던 범주가 현재 데이터에서 0.05로 줄었다면 저장된 입력값과 현실의 빈도 사이가 벌어집니다. 재학습 기준과 변환표 버전을 함께 관리합니다.
주의: 빈도 인코딩은 간단하지만 범주 정보를 압축합니다. 충돌률, 미지 범주 비율, 기간별 분포 변화를 보지 않으면 조용히 성능이 흔들릴 수 있습니다.
자주 묻는 질문
Q1. 빈도 인코딩과 카운트 인코딩은 같은 말인가요?
같은 계열의 방법입니다. 카운트 인코딩은 범주별 원시 횟수를, 빈도 인코딩은 전체에서 차지하는 비율을 쓰는 것으로 구분할 수 있습니다. 도구에 따라 normalize 설정으로 두 방식을 전환합니다.
Q2. 빈도 인코딩은 정답 라벨을 사용하나요?
아닙니다. 입력 특징 X의 범주별 출현량만 사용하고 예측 대상 y는 사용하지 않습니다. 다만 평가 데이터 분포가 섞이지 않도록 변환표는 훈련 데이터에서만 만들어야 합니다.
Q3. 범주가 두 개뿐이어도 사용할 수 있나요?
사용할 수는 있지만 두 범주의 빈도는 서로 보완 관계가 있어 정보가 제한적일 수 있습니다. 원-핫 또는 이진 표현과 같은 조건에서 검증 성능과 해석 편의성을 비교하세요.
Q4. 처음 보는 범주는 어떤 값으로 바꾸나요?
라이브러리와 설정에 따라 오류, NaN, 0 가운데 하나가 될 수 있습니다. 훈련 범주 코드와 겹치지 않는 정책을 정하고 모델이 그 값을 처리하는지 미리 시험해야 합니다.
Q5. 빈도 인코딩을 하면 범주 순서가 생기나요?
숫자의 크기는 출현량 순서를 나타내지만 범주의 자연스러운 등급이나 거리를 뜻하지는 않습니다. 자주 나온 범주가 더 크거나 더 중요한 범주라는 해석은 별도 근거가 필요합니다.
출처
- Feature-engine, CountFrequencyEncoder API Reference
- Feature-engine, CountFrequencyEncoder User Guide
- Category Encoders, CountEncoder Documentation
- Dataiku DSS, Categorical Variables Documentation
- scikit-learn, OneHotEncoder API Reference
- scikit-learn, TargetEncoder API Reference
- pandas, Series.value_counts API Reference
마무리
빈도 인코딩은 범주형 값을 훈련 데이터에서 관찰된 출현 횟수나 비율로 바꾸는 전처리입니다. 범주가 많아도 열 하나를 유지하고 정답값을 사용하지 않는다는 점이 특징입니다.
초보자라면 세 가지만 기억하면 충분합니다. 데이터 분할 뒤 훈련 구간에서만 변환표를 만들고, 같은 빈도를 가진 범주의 충돌을 확인하며, 미지 범주와 결측값 규칙을 미리 시험하세요. 출현량이 실제 예측에 도움이 되는지는 원-핫·순서형·타깃 인코딩이나 모델의 자체 범주 처리와 같은 조건에서 비교해야 합니다.
