009 setup() 전처리 옵션 - 인코딩
키워드: 인코딩, 범주형
개요
머신러닝 알고리즘은 대부분 수치형 데이터만 처리할 수 있습니다. 따라서 '남성/여성', '서울/부산/대구' 같은 범주형 변수는 수치로 변환해야 합니다. 이 과정을 **인코딩(Encoding)**이라고 합니다. 이 글에서는 PyCaret에서 제공하는 다양한 인코딩 옵션을 알아보겠습니다.
실습 환경
- Python 버전: 3.11 권장
- Python 3.11은 2027년 말까지 지원되며, PyCaret 호환 최신 버전입니다.
- 필요 패키지:
pycaret[full]>=3.0, pandas, matplotlib
pip install pycaret[full]>=3.0 pandas matplotlib
Google Colab 사용 불가 Google Colab은 2025년 8월부터 Python 3.12만 지원하여 PyCaret(3.8~3.11) 실습이 불가능합니다. 로컬 환경이나 Docker를 사용해 주세요.
인코딩이 필요한 이유
from pycaret.datasets import get_data
data = get_data('titanic')
# 009 범주형 변수 확인
print("범주형 변수:")
print(data.select_dtypes(include=['object']).columns.tolist())
# 009 Sex 컬럼 예시
print("\nSex 컬럼 값:")
print(data['Sex'].value_counts())
출력:
범주형 변수:
['Name', 'Sex', 'Ticket', 'Cabin', 'Embarked']
Sex 컬럼 값:
male 577
female 314
'male', 'female' 같은 문자열은 모델이 직접 처리할 수 없으므로 수치로 변환해야 합니다.
PyCaret 기본 인코딩
setup() 함수는 기본적으로 One-Hot Encoding을 사용합니다:
from pycaret.classification import *
clf = setup(
data=data,
target='Survived',
ignore_features=['PassengerId', 'Name', 'Ticket', 'Cabin'],
session_id=42
)
# 009 인코딩 결과 확인
print(clf.X_train.columns.tolist())
One-Hot Encoding 결과:
['Pclass', 'Age', 'SibSp', 'Parch', 'Fare', 'Sex_male', 'Embarked_Q', 'Embarked_S']
Sex→Sex_male(female이 기준, male일 때 1)Embarked→Embarked_Q,Embarked_S(C가 기준)
인코딩 방법 비교
1. One-Hot Encoding (기본값)
각 카테고리마다 새로운 이진 컬럼 생성
원본: 인코딩 후:
Embarked Embarked_Q Embarked_S
C 0 0
Q 1 0
S 0 1
장점: 순서가 없는 범주형에 적합 단점: 카테고리가 많으면 차원이 급증
2. Ordinal Encoding
각 카테고리에 순서대로 숫자 부여
원본: 인코딩 후:
Size Size_encoded
Small 0
Medium 1
Large 2
장점: 차원 증가 없음, 순서가 있는 범주에 적합 단점: 순서가 없는 범주에는 부적절
3. Target Encoding
각 카테고리를 타겟의 평균값으로 대체
원본: 인코딩 후:
Sex Sex_encoded
male 0.19 (남성 생존율)
female 0.74 (여성 생존율)
장점: 타겟과의 관계 보존 단점: 과적합 위험
categorical_encoding 파라미터
PyCaret 3.x에서는 categorical_encoding 대신 전처리 파이프라인을 통해 인코딩을 제어합니다:
from pycaret.classification import *
# 009 기본 설정 (One-Hot Encoding)
clf = setup(
data=data,
target='Survived',
ignore_features=['PassengerId', 'Name', 'Ticket', 'Cabin'],
session_id=42
)
고카디널리티 처리
카테고리가 많은 변수(고카디널리티)는 자동으로 처리됩니다:
clf = setup(
data=data,
target='Survived',
ignore_features=['PassengerId', 'Name', 'Ticket', 'Cabin'],
max_encoding_ohe=10, # 10개 이하 카테고리만 One-Hot
session_id=42
)
max_encoding_ohe: 이 값 이하의 카테고리를 가진 변수만 One-Hot Encoding 적용
순서형 변수 처리: ordinal_features
순서가 있는 범주형 변수는 ordinal_features로 지정합니다:
# 009 예시 데이터 생성
import pandas as pd
sample_data = pd.DataFrame({
'education': ['High School', 'Bachelor', 'Master', 'PhD', 'Bachelor', 'Master'],
'income': [30000, 50000, 70000, 90000, 55000, 75000],
'target': [0, 1, 1, 1, 1, 1]
})
# 009 순서형 인코딩 지정
clf = setup(
data=sample_data,
target='target',
ordinal_features={
'education': ['High School', 'Bachelor', 'Master', 'PhD'] # 순서 지정
},
session_id=42
)
# 009 결과 확인
print(clf.X_train)
출력:
education income
0 0 30000
1 1 50000
2 2 70000
3 3 90000
'High School'=0, 'Bachelor'=1, 'Master'=2, 'PhD'=3으로 인코딩
실전 예제: 인코딩 전략 비교
from pycaret.classification import *
from pycaret.datasets import get_data
# 009 데이터 로드
data = get_data('titanic')
# 009 기본 인코딩 (One-Hot)
clf1 = setup(
data=data,
target='Survived',
ignore_features=['PassengerId', 'Name', 'Ticket', 'Cabin'],
session_id=42,
verbose=False
)
print(f"인코딩 후 특성 수: {clf1.X_train.shape[1]}")
print(f"특성 목록: {clf1.X_train.columns.tolist()}")
# 009 모델 학습
model1 = create_model('rf', verbose=False)
results1 = pull()
print(f"\nAccuracy: {results1['Accuracy'].mean():.4f}")
출력:
인코딩 후 특성 수: 8
특성 목록: ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare', 'Sex_male', 'Embarked_Q', 'Embarked_S']
Accuracy: 0.8127
고카디널리티 변수 처리
카테고리가 매우 많은 변수는 특별한 처리가 필요합니다:
1. ignore_features로 제외
clf = setup(
data=data,
target='Survived',
ignore_features=['PassengerId', 'Name', 'Ticket', 'Cabin'], # 고카디널리티 제외
session_id=42
)
2. 그룹화 후 사용
# 009 티켓 앞글자만 추출하여 새 특성 생성
data['Ticket_prefix'] = data['Ticket'].str.split().str[0]
data['Ticket_prefix'] = data['Ticket_prefix'].apply(
lambda x: x if x.isalpha() else 'NUM'
)
print(data['Ticket_prefix'].value_counts())
3. 빈도 기반 인코딩 (수동)
# 009 빈도 인코딩 (자주 나오는 카테고리 = 높은 숫자)
freq_map = data['Embarked'].value_counts().to_dict()
data['Embarked_freq'] = data['Embarked'].map(freq_map)
print(data[['Embarked', 'Embarked_freq']].head(10))
인코딩 선택 가이드
| 변수 특성 | 권장 인코딩 |
|---|---|
| 순서 없음, 카테고리 적음 (≤10) | One-Hot Encoding (기본) |
| 순서 있음 (학력, 등급 등) | ordinal_features 지정 |
| 카테고리 많음 (>10) | 그룹화 후 인코딩 |
| 이진 변수 (2개 카테고리) | One-Hot (자동 처리) |
인코딩 시 주의사항
1. 더미 변수 함정 (Dummy Variable Trap)
One-Hot Encoding 시 첫 번째 카테고리를 제외합니다 (기준 카테고리):
Embarked: C, Q, S
인코딩 후: Embarked_Q, Embarked_S (C가 기준)
PyCaret은 자동으로 처리합니다.
2. 새로운 카테고리 처리
학습 데이터에 없던 카테고리가 예측 시 나타나면 오류가 발생할 수 있습니다:
# 009 학습 데이터: Embarked = ['C', 'Q', 'S']
# 009 새 데이터: Embarked = ['X'] # 새로운 값!
# 009 해결: handle_unknown 옵션 (PyCaret이 내부적으로 처리)
3. 범주형으로 인식되지 않는 경우
숫자로 된 범주형(예: Pclass=1,2,3)은 명시적으로 지정:
clf = setup(
data=data,
target='Survived',
categorical_features=['Pclass'], # 숫자지만 범주형
session_id=42
)
정리
- 머신러닝 모델은 수치형 데이터만 처리하므로 범주형 변수는 인코딩이 필수입니다.
- PyCaret은 기본적으로 One-Hot Encoding을 적용합니다.
- 순서가 있는 범주형은
ordinal_features로 지정합니다. - 고카디널리티 변수는 그룹화하거나 제외를 고려하세요.
max_encoding_ohe로 One-Hot Encoding 적용 기준을 조절할 수 있습니다.
다음 글 예고
다음 글에서는 setup() 전처리 옵션 - 스케일링에 대해 알아보겠습니다. 수치형 변수의 크기를 조정하여 모델 성능을 향상시키는 방법을 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #009