순서형 인코딩(Ordinal Encoding)이란? AI 범주를 순서 있는 숫자로 바꾸는 방법
TL;DR
순서형 인코딩(Ordinal Encoding)은 범주형 특징의 각 범주를 한 열의 정수 코드로 바꾸는 전처리입니다. 낮음·보통·높음처럼 실제 순서가 있다면 그 순서를 코드에 담을 수 있습니다. 하지만 서울·부산·대전처럼 순서가 없는 범주에 0·1·2를 붙이면 일부 모델이 존재하지 않는 크기와 간격으로 해석할 수 있습니다. 훈련 데이터에서 코드표를 정하고, 미지 범주와 결측값 처리, 모델의 범주형 입력 지원 여부를 함께 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
범주 하나를 정수 하나로 바꿉니다. 한 범주형 특징이 보통 한 개의 숫자 열로 유지됩니다. - 핵심 2
코드 순서와 실제 의미를 구분해야 합니다. 낮음·보통·높음에는 순서가 있지만 도시명에는 자연스러운 순서가 없습니다. - 핵심 3
코드표를 훈련과 추론에서 같게 씁니다. 처음 보는 범주, 결측값, 모델의 범주 처리 방식을 미리 정해야 합니다.
이 글에서 다룰 내용
- 순서형 인코딩의 한 문장 정의
- 고객 등급 예시로 이해하는 정수 코드
- 범주를 한 열로 유지하는 이유와 한계
- 코드표를 학습하고 새 데이터에 적용하는 순서
- 원-핫·라벨·타깃·빈도 인코딩과의 차이
- 모델 선택과 배포 전 확인할 체크리스트
- 미지 범주·결측값·임의 순서의 주의점
순서형 인코딩을 한 문장으로 정의하면 무엇인가요?
순서형 인코딩은 범주형 특징의 범주마다 정수 코드를 대응시켜, 한 범주형 열을 한 숫자 열로 바꾸는 데이터 전처리입니다.
scikit-learn의 OrdinalEncoder는 문자열이나 정수로 된 범주형 특징을 특징별로 0부터 범주 수에서 1을 뺀 값까지의 정수로 바꿉니다. 한 특징에 범주가 다섯 개라면 결과도 한 열이며, 그 열에는 보통 0부터 4까지의 코드가 들어갑니다.
이름에 순서형이 들어가지만 자동으로 만든 코드가 언제나 현실의 순서를 뜻하지는 않습니다. 도구가 범주를 자동 발견하면 정렬 규칙에 따라 번호를 배정할 수 있습니다. 낮음·보통·높음처럼 의미 순서가 분명하다면 사용자가 범주 순서를 직접 지정해야 합니다.
한 줄 정리: 순서형 인코딩은 범주 이름을 정수 코드로 바꾸지만, 코드의 크기가 실제 의미의 크기인지는 별도로 판단해야 합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 고객 문의의 긴급도를 예측한다고 가정해 보겠습니다. 원본 데이터의 긴급도 열에는 낮음, 보통, 높음이라는 세 범주가 들어 있습니다.
- 낮음 → 0
- 보통 → 1
- 높음 → 2
이 경우 0보다 1이 높고 1보다 2가 높다는 코드 관계가 실제 긴급도 순서와 맞습니다. 모델은 문자열 대신 숫자를 입력받고, 데이터 열도 하나만 씁니다.
같은 방법을 도시 열에 적용해 서울=0, 부산=1, 대전=2로 정했다면 이야기가 달라집니다. 부산이 서울보다 크고 대전과 부산의 거리가 같다는 의미는 없습니다. 번호는 단순 식별 코드일 뿐인데 선형 모델이나 거리 기반 모델은 숫자의 크기와 간격을 계산에 반영할 수 있습니다.
쉬운 예시: 영화 관람 등급처럼 순서가 있는 범주와 제품 색상처럼 순서가 없는 범주를 먼저 나누면 잘못된 숫자 관계를 줄일 수 있습니다.
왜 AI 데이터에서 순서형 인코딩이 중요한가요?
범주형 값을 모델이 받을 숫자로 바꿉니다
많은 머신러닝 알고리즘은 문자열을 그대로 계산하지 못합니다. 순서형 인코딩은 각 범주를 짧은 정수로 바꿔 수치 배열이나 전처리 파이프라인에 넣을 수 있게 합니다. scikit-learn의 OrdinalEncoder는 여러 입력 특징을 특징별 코드표로 변환합니다.
코드표는 번역 사전과 비슷합니다. 훈련 때 보통을 1로 정했다면 검증과 실제 서비스에서도 보통은 1이어야 합니다. 실행마다 번호가 바뀌면 같은 입력이 다른 뜻으로 처리됩니다.
범주가 많아도 열 수를 늘리지 않습니다
원-핫 인코딩은 범주마다 별도 열을 만듭니다. 범주가 1,000개라면 최대 1,000개 안팎의 열이 생길 수 있습니다. 순서형 인코딩은 한 특징을 한 열로 유지하므로 메모리와 데이터 폭을 줄이기 쉽습니다.
열이 적다는 이유만으로 더 좋은 표현이 되는 것은 아닙니다. 임의로 붙인 숫자에 모델이 거짓 순서나 거리를 학습하면 차원이 줄어든 이점보다 표현 오류가 커질 수 있습니다.
일부 트리 모델의 범주형 입력을 준비합니다
LightGBM은 범주형 특징을 정수 코드로 받아 범주 분할을 찾을 수 있습니다. 이때 정수의 절대 크기를 연속 숫자처럼 쓰기보다 범주 식별자로 다룹니다. XGBoost도 범주형 자료형과 설정을 지정하면 원-핫 또는 범주 집합 분할을 사용할 수 있습니다.
중요한 점은 정수로 바꾸는 단계와 모델에 범주형 특징임을 알려 주는 단계가 다르다는 사실입니다. 코드를 만들고도 모델이 그 열을 일반 숫자로 읽으면 결과가 달라집니다.
핵심 인사이트: 순서형 인코딩의 장점은 짧은 코드표에 있습니다. 그 코드가 순위인지 단순 식별자인지는 데이터 의미와 모델 설정이 결정합니다.
순서형 인코딩은 어떻게 작동하나요?
1. 범주형 특징과 의미 순서를 확인합니다
먼저 열마다 가능한 범주를 확인합니다. 만족도처럼 자연스러운 순서가 있는지, 국가명처럼 서로 다른 이름만 있는지 구분합니다. 순서가 있다면 업무 정의에 맞춰 가장 낮은 범주부터 가장 높은 범주까지 목록을 작성합니다.
2. 훈련 데이터에서 범주 목록을 학습합니다
전처리기는 훈련 데이터에서 특징별 범주 목록을 만들고 각 범주에 코드를 대응시킵니다. categories를 자동으로 찾을 수도 있고, 사용자가 목록을 직접 줄 수도 있습니다. 실제 순서를 보존하려면 직접 지정한 목록이 더 명확합니다.
3. 같은 코드표로 검증·테스트 데이터를 바꿉니다
검증 데이터와 테스트 데이터에서는 새 코드표를 다시 만들지 않습니다. 훈련 때 저장한 코드표를 그대로 적용해야 합니다. 전처리기와 모델을 하나의 파이프라인으로 묶으면 학습·추론 간 변환 차이를 줄일 수 있습니다.
4. 미지 범주와 결측값 코드를 분리합니다
서비스에는 훈련 때 없던 새 상품군이나 지역이 들어올 수 있습니다. scikit-learn OrdinalEncoder는 기본적으로 미지 범주에서 오류를 내지만, handle_unknown을 설정하면 별도의 unknown_value로 바꿀 수 있습니다. 결측값도 encoded_missing_value로 따로 지정할 수 있습니다.
미지 범주 코드와 기존 범주 코드는 겹치지 않아야 합니다. 결측값과 미지 범주를 같은 코드로 묶을지 나눌지도 모델과 업무 의미에 맞춰 정합니다.
5. 모델이 코드를 어떻게 해석하는지 확인합니다
선형 회귀, 로지스틱 회귀, KNN처럼 숫자 크기와 거리를 직접 쓰는 모델은 0·1·2의 간격을 실제 관계로 받아들일 수 있습니다. 순서와 간격이 타당하지 않다면 원-핫 인코딩이나 다른 표현을 비교해야 합니다.
트리 모델도 모두 같은 방식은 아닙니다. 일반 숫자 특징으로 받는지, 범주형 특징을 자체 지원하는지, 정수 코드의 순서를 사용하는지 문서를 확인해야 합니다.
한 줄 정리: 코드표 학습, 같은 표의 재사용, 미지 범주 처리, 모델 해석 확인까지가 하나의 순서형 인코딩 과정입니다.
순서형 인코딩과 헷갈리는 용어는 무엇이 다른가요?
원-핫 인코딩과 순서형 인코딩의 차이
원-핫 인코딩은 범주마다 0과 1로 된 별도 열을 만듭니다. 범주 사이의 크기 관계를 직접 만들지 않지만 범주가 많으면 열 수가 크게 늘어납니다. 순서형 인코딩은 한 열의 정수 코드로 유지하므로 데이터 폭은 작지만 숫자 순서가 모델에 영향을 줄 수 있습니다.
라벨 인코딩과 순서형 인코딩의 차이
scikit-learn에서 LabelEncoder는 예측 대상인 y의 클래스 이름을 0부터 시작하는 값으로 바꾸는 도구입니다. 입력 특징 X를 바꾸는 용도가 아닙니다. 입력의 범주형 열을 바꾸려면 OrdinalEncoder를 사용합니다. 일상적으로 라벨 인코딩이라는 말을 넓게 쓰더라도 라이브러리 클래스의 역할은 구분해야 합니다.
타깃 인코딩과 순서형 인코딩의 차이
타깃 인코딩은 범주를 해당 범주의 정답 평균이나 조건부 확률로 바꿉니다. 정답 y를 사용하므로 데이터 누수와 과적합을 막는 교차 적합과 평활화가 중요합니다. 순서형 인코딩은 정답을 보지 않고 범주와 코드의 대응만 정합니다.
빈도 인코딩과 순서형 인코딩의 차이
빈도 인코딩은 범주가 훈련 데이터에 나타난 횟수나 비율로 값을 바꿉니다. 두 범주의 빈도가 같으면 같은 숫자가 될 수 있습니다. 순서형 인코딩은 범주마다 고유 코드를 주므로 출현 빈도가 같아도 다른 코드로 남습니다.
범주형 자료형과 순서형 인코딩의 차이
pandas의 category 자료형은 가능한 범주와 순서 여부를 데이터에 기록합니다. 내부에 정수 코드를 두지만 숫자 연산을 위한 일반 정수 열과 같지는 않습니다. 순서형 인코딩은 그 범주를 모델 입력용 숫자 배열로 변환하는 전처리입니다.
비교 정리: 원-핫은 열을 나누고, 순서형은 고유 정수 코드를 쓰며, 타깃은 정답 통계를 쓰고, 빈도는 출현량을 씁니다. LabelEncoder는 scikit-learn에서 y를 위한 도구입니다.
실전에서는 어디에 쓰이나요?
설문·등급처럼 자연스러운 순서가 있는 특징
매우 불만족·불만족·보통·만족·매우 만족, 초급·중급·고급, 소형·중형·대형처럼 업무상 순서가 합의된 범주에 잘 맞습니다. 단, 단계 사이 차이가 똑같다고 볼 수 있는지는 모델에 따라 다시 확인합니다.
트리 기반 모델의 간단한 전처리
의사결정나무와 부스팅 모델에 범주를 정수로 전달할 때 사용합니다. 모델이 정수를 연속값으로 자르는지, 범주 집합으로 나누는지에 따라 의미가 달라집니다. LightGBM이나 XGBoost의 자체 범주 지원을 쓴다면 자료형과 관련 설정도 함께 저장합니다.
범주가 많은 표 데이터의 베이스라인
상품 코드, 지점, 장비 유형처럼 범주 수가 많은 열에서 빠른 비교 기준을 만들 때 쓸 수 있습니다. 원-핫 인코딩, 타깃 인코딩, 모델의 자체 범주 처리 결과와 같은 데이터 분할에서 비교해야 합니다.
일관된 학습·추론 파이프라인
코드표를 전처리 객체에 저장해 학습 서버와 예측 서버가 같은 변환을 쓰게 합니다. 모델 파일만 배포하고 인코더를 빼먹으면 새 요청의 범주 코드가 달라질 수 있으므로 둘을 하나의 배포 단위로 관리합니다.
실전 팁: 순서형 인코딩을 선택했다면 코드표, 범주 순서, 미지 범주 값, 결측값, 모델의 범주형 설정을 모델 버전과 함께 기록하세요.
순서형 인코딩을 적용할 때 어떤 순서로 확인하나요?
1. 열의 범주가 정말 순서형인지 확인합니다
업무 담당자와 데이터 정의서를 보고 범주 사이에 합의된 순서가 있는지 확인합니다. 단순히 문자열이 정렬된다는 이유로 순서형이라고 판단하지 않습니다.
2. 데이터 분할을 먼저 고정합니다
훈련·검증·테스트 데이터를 먼저 나누고 인코더는 훈련 데이터에만 맞춥니다. 검증과 테스트에는 학습된 코드표를 적용합니다. 이 순서를 파이프라인에 넣으면 전처리 재현성이 높아집니다.
3. 범주 순서와 코드표를 명시합니다
낮음·보통·높음이 0·1·2로 대응되는지 확인하고 코드표를 버전 관리합니다. 자동 정렬을 쓴다면 문자열 정렬이 업무 순서와 일치하는지 반드시 봅니다.
4. 미지 범주와 결측값을 시험합니다
훈련에 없던 범주 한 개와 결측값 한 개를 넣어 변환 결과를 확인합니다. 오류를 낼지, 별도 코드나 NaN으로 바꿀지 정하고 모델이 그 값을 처리하는지도 시험합니다.
5. 다른 인코딩과 같은 조건에서 비교합니다
원-핫, 순서형, 모델의 자체 범주 처리 방식을 같은 데이터 분할과 평가 지표로 비교합니다. 열 수와 메모리뿐 아니라 검증 성능, 추론 오류, 새 범주 발생률도 함께 봅니다.
한 줄 정리: 범주 의미를 확인한 뒤 데이터를 나누고, 코드표와 예외 규칙을 고정한 다음 대안을 비교합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 임의 번호를 실제 순위로 착각하지 않습니다. 빨강=0, 파랑=1, 초록=2는 색상의 크기나 거리를 뜻하지 않습니다. 숫자 관계를 쓰는 모델이라면 잘못된 패턴이 생길 수 있습니다.
둘째, 자동 정렬을 업무 순서로 믿지 않습니다. 문자열의 사전식 순서와 현실의 등급 순서는 다를 수 있습니다. 순서가 중요하면 categories 목록을 직접 지정합니다.
셋째, 훈련과 추론의 코드표를 따로 만들지 않습니다. 같은 범주가 환경마다 다른 번호로 바뀌면 모델 입력의 의미가 깨집니다. 인코더를 모델과 함께 저장하고 배포합니다.
넷째, 미지 범주와 결측값을 구분합니다. 새 범주가 들어왔다는 사실과 값이 비어 있다는 사실은 다른 상태입니다. 별도 코드, NaN, 오류 중 어떤 정책을 쓸지 정합니다.
다섯째, 정수 코드를 만들었다고 범주 처리가 끝난 것은 아닙니다. 모델이 코드를 일반 숫자로 보는지 범주 식별자로 보는지 확인합니다. 자체 범주 지원 모델은 필요한 자료형과 옵션을 함께 설정합니다.
주의: 열 수가 적고 변환이 간단해도 데이터 의미가 틀리면 좋은 인코딩이 아닙니다. 범주의 순서와 모델의 숫자 해석을 함께 검증하세요.
자주 묻는 질문
Q1. 순서형 인코딩과 서수 인코딩은 같은 말인가요?
네. 영어 Ordinal Encoding을 순서형 인코딩 또는 서수 인코딩이라고 부릅니다. 이 글에서는 국내 머신러닝 문서에서 자주 쓰는 순서형 인코딩이라는 표현을 사용합니다.
Q2. 범주가 순서형이면 항상 0부터 시작해야 하나요?
반드시 그렇지는 않지만 0부터 연속된 정수를 쓰면 코드표를 관리하기 쉽습니다. 더 중요한 것은 코드의 순서가 실제 범주 순서와 일치하고 학습·추론에서 같게 유지되는지입니다.
Q3. 순서가 없는 범주에도 OrdinalEncoder를 써도 되나요?
변환 자체는 가능합니다. 다만 모델이 정수의 크기와 간격을 실제 관계로 해석할 수 있습니다. 원-핫 인코딩이나 자체 범주 지원 모델과 검증 성능을 비교해야 합니다.
Q4. 처음 보는 범주가 들어오면 어떻게 하나요?
기본 설정에서는 오류가 날 수 있습니다. 별도의 미지 범주 값을 정하거나 NaN으로 처리하고, 그 값이 기존 범주 코드와 겹치지 않는지와 모델이 받을 수 있는지를 확인합니다.
Q5. LabelEncoder로 입력 특징을 바꿔도 되나요?
scikit-learn의 LabelEncoder는 예측 대상 y를 위한 도구입니다. 여러 입력 특징 X에는 OrdinalEncoder나 OneHotEncoder처럼 입력 특징용 변환기를 사용합니다.
출처
마무리
순서형 인코딩은 범주형 값을 한 열의 정수 코드로 바꾸는 전처리입니다. 범주가 많아도 열 수를 크게 늘리지 않고, 낮음·보통·높음처럼 실제 순서가 있는 정보를 간결하게 표현합니다.
초보자라면 세 가지만 기억하면 충분합니다. 코드 번호와 현실의 순서를 구분하고, 훈련에서 만든 코드표를 추론에도 그대로 쓰며, 미지 범주와 결측값 정책을 미리 시험하세요. 마지막으로 모델이 정수를 연속값으로 읽는지 범주 식별자로 읽는지 확인해야 안전하게 적용할 수 있습니다.
