모델링을 진행할 때 범주형 변수를 그대로 넣으면 모델이 인식하지 못하고 에러를 발생시킨다. 이에 따라 범주형 변수를 수치형 변수로 인코딩하는 과정이 필요하다.
명목형(Nominal)
각 범주 간 순위가 없는 변수로 성별(남, 여), 국적(한국, 미국, 중국), 혈액형(A, B, O, AB) 등이 이에 속한다.
순서형(Ordinal)
각 범주 간 순위가 존재하는 변수이다. 단, 순위 사이 등간성이 존재한다는 보장은 없다. 학력(초졸, 중졸, 고졸, 대졸), 크기(소, 중, 대), 성적(A, B, C, D, F) 등이 속한다.
한 컬럼(변수) 내에 존재할 수 있는 n개의 특성값을 각각 0 ~ n-1 의 연속적 수치 데이터로 변환시켜주는 방법
# 예시 코드
from sklearn.preprocessing import LabelEncoder
import pandas as pd
# 데이터 프레임 생성
data = pd.DataFrame({'Color': ['red', 'blue', 'green', 'yellow'],
'Size': ['small', 'medium', 'large', 'medium'],
'Shape': ['circle', 'square', 'triangle', 'circle']})
# LabelEncoder 객체 생성
encoder = LabelEncoder()
# 데이터 프레임의 각 열에 대해 Label Encoding 수행
encoded_data = data.apply(encoder.fit_transform)
# 변환된 결과 출력
encoded_data
- 실행 결과
(인코딩 전)
(인코딩 후)
한 컬럼(변수) 내에 존재할 수 있는 n개의 특성값들을 각각 n개의 비트 벡터로 표현하는 방식 (그만큼 차원 수는 증가)
# 예시 코드
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# 범주형 변수를 포함한 데이터 프레임 생성
data = pd.DataFrame({'Color': ['red', 'blue', 'green'],
'Size': ['small', 'medium', 'large'],
'Shape': ['circle', 'square', 'triangle']})
# OneHotEncoder 객체 생성
encoder = OneHotEncoder()
# 범주형 변수 선택 (여기에서는 모든 열을 선택하도록 함)
categories = data[['Color', 'Size', 'Shape']]
# One-Hot Encoding 수행
encoded_categories = encoder.fit_transform(categories)
# 희소 행렬인 One-Hot Encoding 결과를 데이터 프레임으로 변환
encoded_data = pd.DataFrame(encoded_categories.toarray(), columns=encoder.get_feature_names_out(categories.columns))
# 변환된 결과 출력
encoded_data
- 실행 결과
(인코딩 전)
(인코딩 후)
Color 변수는 Color_blue, Color_green, Color_red로, Size 변수는 Size_large, Size_medium, Size_small로, Shape 변수는 Shape_circle, Shape_square, Shape_triangle로 각각 차원이 증가한 것을 확인할 수 있다.
Label Encoding과 같이 한 컬럼(변수) 내에 존재할 수 있는 n개의 특성값을 각각 0 ~ n-1 의 연속적 수치 데이터로 변환시켜주는 방법이나 차이점은 순차성 정보를 유지한다.
# 예시 코드
from sklearn.preprocessing import OrdinalEncoder
import pandas as pd
# 데이터 프레임 생성
data = pd.DataFrame({'Size': ['small', 'medium', 'large', 'medium'],
'Temperature': ['cold', 'hot', 'warm', 'hot']})
# 변수의 범주 순서를 정의
size_order = ['small', 'medium', 'large']
temperature_order = ['cold', 'warm', 'hot']
# OrdinalEncoder 객체 생성
encoder = OrdinalEncoder(categories=[size_order, temperature_order])
# 데이터 프레임에 대해 Ordinal Encoding 수행
encoded_data = encoder.fit_transform(data)
# 변환된 결과 출력
encoded_df = pd.DataFrame(encoded_data, columns=data.columns)
encoded_df
- 실행 결과
(인코딩 전)
(인코딩 후)
범주형 변수를 이진 코드(Binary Code)로 변환하는 방법
# 예시 코드
import pandas as pd
import category_encoders as ce
# 데이터 프레임 생성
data = pd.DataFrame({'Color': ['red', 'blue', 'green', 'yellow']})
# BinaryEncoder 객체 생성
encoder = ce.BinaryEncoder(cols=['Color'])
# 데이터 프레임에 대해 Binary Encoding 수행
encoded_data = encoder.fit_transform(data)
# 변환된 결과 출력
print(encoded_data)
- 실행 결과
(인코딩 전)
(인코딩 후)
One Hot Encoding이었다면 4차원으로 증가했을 컬럼 수가 3차원으로 비교적 적게 증가한 것을 확인할 수 있다.
Reference