라벨 인코딩(Label Encoding)이란? AI 정답 클래스를 숫자 코드로 바꾸는 방법
TL;DR
라벨 인코딩(Label Encoding)은 분류 문제의 정답 클래스 이름을 0부터 시작하는 정수 코드로 바꾸는 작업입니다. 스팸·정상을 1·0으로, 고양이·개·새를 0·1·2로 대응시키는 식입니다. scikit-learn의 LabelEncoder는 입력 특징 X가 아니라 예측 대상 y를 위한 도구입니다. 코드 숫자 자체에 순위 의미가 생기는 것은 아니며, 학습·평가·배포에서 같은 클래스 표를 보존하고 모델 예측을 원래 이름으로 되돌려야 합니다.
핵심 3줄 요약
- 핵심 1
정답 이름을 정수 ID로 바꿉니다. 분류 모델과 손실 함수가 다루기 쉬운 형태로 y를 정리합니다. - 핵심 2
입력 특징 인코딩과 다릅니다. scikit-learn의 LabelEncoder는 X가 아니라 예측 대상 y에 사용합니다. - 핵심 3
코드표와 역변환을 함께 보관합니다. 예측된 0·1·2를 원래 클래스 이름으로 정확히 되돌려야 합니다.
이 글에서 다룰 내용
- 라벨 인코딩의 한 문장 정의
- 문의 분류 예시로 이해하는 클래스 코드표
- 분류 모델과 손실 함수에서 필요한 이유
- 클래스 목록을 학습하고 예측을 역변환하는 순서
- 순서형·원-핫·타깃·라벨 이진화와의 차이
- 학습·평가·배포 전에 확인할 체크리스트
- 코드 순서 변경·새 클래스·다중 라벨의 주의점
라벨 인코딩을 한 문장으로 정의하면 무엇인가요?
라벨 인코딩은 분류 데이터의 예측 대상 y에 있는 클래스 이름을 서로 다른 정수 코드로 대응시키고, 필요할 때 그 코드를 원래 이름으로 되돌리는 변환입니다.
scikit-learn의 LabelEncoder 문서는 target label을 0부터 클래스 수에서 1을 뺀 값까지로 인코딩한다고 설명합니다. 클래스가 세 개라면 보통 0·1·2를 사용합니다. classes_에는 각 코드와 연결된 원래 클래스가 저장됩니다.
여기서 라벨은 모델이 맞혀야 할 정답을 뜻합니다. 표 데이터의 도시명이나 상품군처럼 입력 X에 있는 범주형 특징을 정수로 바꾸는 작업과는 목적이 다릅니다. scikit-learn은 입력 특징에는 OrdinalEncoder나 OneHotEncoder를 쓰도록 역할을 나눕니다.
한 줄 정리: 라벨 인코딩은 정답 클래스의 이름표를 모델이 다룰 정수 ID로 바꾸고, 예측 뒤에는 다시 이름표로 복원하는 작업입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 고객 문의를 배송·결제·환불 세 클래스로 분류하는 모델을 만든다고 가정해 보겠습니다. 학습 데이터의 정답 열에는 세 문자열이 반복해서 들어 있습니다.
- 결제 → 코드 0
- 배송 → 코드 1
- 환불 → 코드 2
모델을 학습할 때 정답은 결제·배송·환불이라는 문자열 대신 0·1·2로 전달됩니다. 모델이 새 문의를 코드 2로 예측했다면 서비스 화면에는 코드 2를 그대로 보여 주지 않고 저장된 코드표를 이용해 환불로 되돌립니다.
코드 2가 코드 1보다 더 크거나 중요한 클래스를 뜻하지는 않습니다. 세 숫자는 서로 다른 정답을 식별하는 ID입니다. 코드의 배열 순서는 도구가 정한 클래스 정렬 규칙에 따라 달라질 수 있으므로 실제 classes_ 값을 확인해야 합니다.
쉬운 예시: 라벨 인코딩은 사물함 번호를 붙이는 일과 비슷합니다. 2번 사물함이 1번보다 더 높은 등급이라는 뜻은 아닙니다.
왜 AI 모델에서 라벨 인코딩이 중요한가요?
문자열 정답을 일관된 숫자로 전달합니다
분류 모델과 학습 코드는 정답 클래스를 정수 인덱스로 받는 경우가 많습니다. 라벨 인코딩은 사람이 읽기 쉬운 클래스 이름과 모델이 계산에 쓰는 숫자 사이에 고정된 대응표를 만듭니다. 같은 정답은 학습 데이터 어디에서나 같은 코드가 됩니다.
TensorFlow의 SparseCategoricalCrossentropy 문서는 두 개 이상 클래스가 있을 때 정수 라벨을 기대한다고 안내합니다. 원-핫 형태의 정답을 쓸 때는 CategoricalCrossentropy를 사용합니다. 손실 함수가 요구하는 정답 형식을 먼저 확인해야 하는 이유입니다.
클래스 수와 출력 위치를 연결합니다
다중 클래스 모델은 보통 클래스마다 하나의 출력 점수나 확률을 만듭니다. 코드 0은 출력의 첫 자리, 코드 1은 둘째 자리처럼 연결됩니다. 클래스 표가 세 개라면 모델 출력의 마지막 차원도 대체로 세 클래스와 맞아야 합니다.
라벨 코드와 출력 위치가 어긋나면 계산은 끝나도 뜻이 뒤바뀔 수 있습니다. 학습 때 결제=0이었는데 서비스가 0을 배송으로 읽으면 정확한 예측도 잘못 표시됩니다. 코드표는 단순한 전처리 정보가 아니라 모델 인터페이스의 일부입니다.
예측 결과를 사람이 읽는 이름으로 복원합니다
LabelEncoder의 inverse_transform은 정수 코드를 원래 라벨로 되돌립니다. 평가표, 혼동 행렬, API 응답과 운영 대시보드에는 사람이 이해할 클래스명을 써야 하므로 역변환이 필요합니다.
정수만 저장하면 나중에 코드 0이 무엇을 뜻했는지 알기 어렵습니다. 인코더 객체나 명시적인 클래스 목록을 모델 버전과 함께 보관하면 재학습과 롤백 때도 같은 해석을 유지할 수 있습니다.
핵심 인사이트: 라벨 인코딩의 핵심은 숫자로 바꾸는 동작보다 클래스와 코드의 대응을 학습부터 표시까지 끊기지 않게 유지하는 데 있습니다.
라벨 인코딩은 어떻게 작동하나요?
1. 예측 대상 y의 클래스 목록을 확인합니다
먼저 정답 열에서 가능한 클래스와 표기 방식을 확인합니다. 환불·환불요청·환불 요청처럼 같은 뜻이 여러 표기로 섞였으면 인코딩 전에 정리합니다. 빈 문자열이나 결측값을 정상 클래스처럼 포함할지도 따로 결정합니다.
2. 훈련 라벨로 코드표를 학습합니다
인코더는 훈련 y의 고유한 라벨을 모아 classes_를 만들고 각 클래스에 정수 코드를 대응시킵니다. scikit-learn 예시에서는 amsterdam·paris·tokyo 같은 문자열이 0·1·2 코드에 연결됩니다. 자동 정렬 결과를 추측하지 말고 저장된 목록을 확인합니다.
3. 학습·검증 라벨을 같은 표로 변환합니다
훈련 y와 검증 y는 하나의 코드표를 사용합니다. 검증 세트에서 인코더를 새로 맞추면 일부 클래스가 없을 때 코드 번호가 달라질 수 있습니다. 모델과 평가가 같은 클래스 순서를 보도록 훈련에서 확정한 인코더만 적용합니다.
4. 모델 출력과 클래스 위치를 맞춥니다
분류기의 출력 클래스 수, 손실 함수가 기대하는 정답 형태와 코드 범위를 확인합니다. 정수 클래스 ID를 받는 손실 함수와 원-핫 배열을 받는 손실 함수는 입력 모양이 다릅니다. 이진 분류도 모델에 따라 0·1 한 열이나 두 클래스 출력처럼 표현이 달라질 수 있습니다.
5. 예측 코드를 원래 라벨로 역변환합니다
모델이 선택한 클래스 인덱스를 inverse_transform으로 원래 이름에 연결합니다. 확률 배열을 반환한다면 가장 큰 점수의 위치를 고른 뒤 같은 클래스 목록으로 이름을 찾습니다. 확률 열 이름도 classes_ 순서대로 붙여야 합니다.
배포할 때는 모델 파일과 라벨 인코더, 클래스 목록, 버전을 한 묶음으로 관리합니다. 새 버전에서 클래스가 추가되거나 이름이 바뀌면 출력 차원과 API 계약도 함께 바뀌는지 확인합니다.
한 줄 정리: 훈련 y에서 코드표를 만들고 모든 평가에 재사용한 뒤, 모델 출력 위치를 같은 표로 원래 클래스명에 연결합니다.
라벨 인코딩과 헷갈리는 용어는 무엇이 다른가요?
순서형 인코딩과 라벨 인코딩의 차이
OrdinalEncoder는 입력 X의 범주형 특징을 특징별 정수 열로 바꿉니다. LabelEncoder는 예측 대상 y의 클래스 이름을 정수 코드로 바꿉니다. 둘 다 0부터 시작하는 숫자를 만들 수 있지만 변환하는 데이터의 역할이 다릅니다.
원-핫 인코딩과 라벨 인코딩의 차이
OneHotEncoder는 입력 범주마다 별도 이진 열을 만듭니다. 라벨 인코딩은 한 사례의 정답을 정수 하나로 나타냅니다. scikit-learn 문서는 y 라벨을 원-핫 형태로 바꿀 때 OneHotEncoder가 아니라 LabelBinarizer를 사용하도록 안내합니다.
라벨 이진화와 라벨 인코딩의 차이
LabelBinarizer는 다중 클래스 라벨을 일대다 방식의 0·1 표시로 바꿉니다. 클래스가 네 개라면 정답 하나가 길이 네 개인 표시가 될 수 있습니다. LabelEncoder는 같은 정답을 0부터 3 사이 정수 하나로 표현합니다.
타깃 인코딩과 라벨 인코딩의 차이
타깃 인코딩은 입력 X의 범주를 그 범주에서 관찰된 정답 평균이나 조건부 확률로 바꾸는 지도 전처리입니다. 라벨 인코딩은 y의 클래스 이름에 식별 코드를 붙일 뿐 범주별 정답 통계를 계산하지 않습니다.
문자열 조회와 라벨 인코딩의 차이
Keras의 StringLookup은 문자열을 어휘표의 정수 인덱스로 바꾸고 미지 값용 OOV 인덱스를 둘 수 있습니다. 입력 특징이나 토큰 전처리에 쓸 수 있는 범용 조회 층입니다. LabelEncoder는 scikit-learn에서 감독학습의 y를 정규화하는 용도로 범위가 더 분명합니다.
비교 정리: 라벨 인코딩은 y의 클래스 ID, 순서형·원-핫 인코딩은 X의 범주 표현, 라벨 이진화는 y의 0·1 표시, 타깃 인코딩은 X에 넣는 정답 통계입니다.
실전에서는 어디에 쓰이나요?
텍스트·이미지 분류의 정답 준비
뉴스 주제, 고객 문의 유형, 이미지 속 동물처럼 이름으로 된 정답을 모델 학습용 정수로 바꿉니다. 데이터셋 파일에는 사람이 읽을 라벨과 숫자 ID를 함께 기록하면 오류를 확인하기 쉽습니다.
손실 함수의 입력 형식 맞추기
정수 클래스 ID를 받는 희소 범주형 교차엔트로피를 사용할 때 라벨 인코딩 결과를 전달합니다. 원-핫 정답을 요구하는 설정이라면 라벨 이진화나 해당 프레임워크의 변환을 사용합니다. 손실 함수 이름만 보고 형식을 추측하지 않습니다.
평가표와 API 응답의 클래스 복원
혼동 행렬의 행과 열, 클래스별 정밀도·재현율, 예측 API의 label 필드를 원래 이름으로 표시할 때 씁니다. 내부 코드는 정수여도 사용자와 운영자는 배송·결제·환불처럼 의미가 드러나는 이름을 봐야 합니다.
모델 버전 사이의 클래스 계약 관리
새 클래스가 추가되거나 기존 이름이 합쳐질 때 코드표가 바뀔 수 있습니다. 모델 레지스트리나 배포 기록에 클래스 목록을 남기면 이전 버전과 새 버전의 출력 의미를 비교하고 안전하게 롤백할 수 있습니다.
실전 팁: 모델 산출물에 classes_ 목록이나 별도 labels.json을 포함하고, 예측 API의 클래스 순서와 같은지 자동 테스트하세요.
라벨 인코딩을 적용할 때 어떤 순서로 확인하나요?
1. y와 X를 먼저 구분합니다
바꾸려는 열이 모델이 맞힐 정답 y인지, 모델이 참고할 입력 X인지 확인합니다. LabelEncoder를 여러 입력 열에 반복 적용하는 방식은 scikit-learn의 권장 역할과 다릅니다. 입력 범주는 전용 특징 인코더를 고릅니다.
2. 클래스 표기를 정리합니다
대소문자, 앞뒤 공백, 오탈자와 동의어를 확인합니다. 환불과 환불 요청을 다른 클래스라고 정의한 것이 아니라면 먼저 통합합니다. 라벨 품질이 나쁜 상태에서는 정확한 인코딩도 잘못된 정답을 그대로 보존합니다.
3. 코드표와 클래스 수를 고정합니다
훈련 데이터에서 확정한 클래스 목록과 코드 범위를 저장합니다. 모델 출력의 클래스 수가 목록 길이와 같은지, 각 출력 위치가 같은 클래스를 가리키는지 작은 샘플로 시험합니다.
4. 새 클래스와 누락 클래스를 시험합니다
운영에서 훈련에 없던 라벨이 들어오면 기존 LabelEncoder의 transform은 처리하지 못할 수 있습니다. 이는 예측 입력의 미지 범주와 다른 문제입니다. 데이터 계약 위반으로 차단할지, 새 모델 버전으로 클래스를 추가할지 절차를 정합니다.
5. 역변환과 지표 표시를 확인합니다
예측 코드 몇 개를 원래 이름으로 되돌리고, 혼동 행렬과 클래스별 지표의 라벨 순서를 확인합니다. API 응답, 저장 데이터와 화면이 같은 코드표를 쓰는지도 배포 전 테스트합니다.
한 줄 정리: 정답 열을 확인하고 표기를 정리한 뒤 코드표·출력 위치·새 클래스 정책·역변환을 차례로 시험합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, LabelEncoder를 입력 X의 범주형 열에 그대로 쓰지 않습니다. scikit-learn은 이 도구를 target y용으로 명시합니다. 입력 특징에는 OrdinalEncoder·OneHotEncoder 같은 전용 도구를 사용합니다.
둘째, 코드 숫자에 순위 의미를 붙이지 않습니다. 고양이=0, 개=1, 새=2는 클래스 ID일 뿐입니다. 2가 0보다 더 크거나 두 배 중요하다는 뜻이 아닙니다.
셋째, 학습과 평가에서 인코더를 따로 맞추지 않습니다. 한 세트에 특정 클래스가 없으면 자동 코드 순서가 달라질 수 있습니다. 훈련에서 저장한 코드표를 검증·테스트·배포에 재사용합니다.
넷째, 새 클래스를 임의의 기존 코드에 넣지 않습니다. 처음 보는 정답은 분류 체계가 바뀌었다는 신호일 수 있습니다. 데이터 오류인지 실제 신규 클래스인지 확인하고 모델 출력 구조까지 함께 갱신합니다.
다섯째, 다중 라벨 문제와 단일 클래스 문제를 구분합니다. 한 사례가 여러 라벨을 동시에 가질 수 있다면 정수 하나로는 충분하지 않습니다. MultiLabelBinarizer 같은 다중 라벨 표현과 맞는 모델을 사용합니다.
주의: 코드표가 바뀌면 같은 숫자의 의미도 바뀝니다. 모델 파일만 배포하지 말고 라벨 목록과 역변환 규칙을 같은 버전으로 묶으세요.
자주 묻는 질문
Q1. 라벨 인코딩과 레이블 인코딩은 같은 말인가요?
네. 영어 Label Encoding을 한글로 적는 방식이 다를 뿐 같은 개념을 가리킵니다. 이 글에서는 국내 AI 문서에서 자주 보이는 라벨 인코딩이라는 표현을 사용합니다.
Q2. 라벨 코드는 반드시 0부터 시작해야 하나요?
모든 시스템이 반드시 그렇지는 않지만 scikit-learn의 LabelEncoder는 0부터 클래스 수에서 1을 뺀 값까지로 정규화합니다. 사용하는 모델과 손실 함수가 기대하는 코드 범위를 확인하세요.
Q3. LabelEncoder로 상품군이나 지역 열을 바꿔도 되나요?
scikit-learn에서는 권장하지 않습니다. LabelEncoder는 y를 위한 도구입니다. 입력 X의 범주형 특징에는 OrdinalEncoder, OneHotEncoder나 모델의 자체 범주 처리를 사용합니다.
Q4. 예측 코드 2를 원래 클래스명으로 어떻게 바꾸나요?
학습 때 저장한 LabelEncoder의 inverse_transform을 사용하거나 동일한 클래스 목록에서 세 번째 항목을 조회합니다. 모델 출력과 목록의 순서가 같은지 먼저 확인해야 합니다.
Q5. 운영 중 새 클래스가 생기면 자동으로 번호를 추가하면 되나요?
기존 모델의 출력 차원과 클래스 의미가 고정돼 있으므로 단순히 번호만 추가하면 안 됩니다. 라벨 체계를 검토하고 새 클래스를 포함해 학습·평가한 모델 버전을 별도로 배포해야 합니다.
출처
마무리
라벨 인코딩은 분류 문제의 정답 클래스 이름을 0부터 시작하는 정수 코드로 바꾸는 작업입니다. scikit-learn의 LabelEncoder는 입력 특징 X가 아니라 예측 대상 y에 쓰며, 저장된 클래스 목록으로 예측 코드를 원래 이름에 연결합니다.
초보자라면 세 가지만 기억하면 충분합니다. 코드 숫자는 순위가 아닌 식별자이고, 훈련에서 만든 코드표를 평가와 배포에도 그대로 쓰며, 모델 출력 뒤에는 반드시 원래 클래스명으로 역변환하세요. 새 클래스가 생겼다면 기존 코드표에 몰래 끼워 넣지 말고 라벨 체계와 모델 버전을 함께 갱신해야 합니다.
