명목형(Nominal) 변수
명목형(Nominal) 변수는 서로 비교 가능한 등급이나 순서, 크기의 의미가 없는 독립적인 범주들로 구성됩니다.
예컨대, 혈액형(A, B, AB, O)이나 '전자제품', '가구', '의류'와 같은 생산 항목들이 이에 해당합니다.
이러한 변수들은 서로 간의 상위나 하위 관계를 가지지 않습니다.
활용 데이터 : 중고차 가격 예측을 위한 데이터셋
import pandas as pd
train_used_car = pd.read_csv("train_used_car.csv")
test_used_car = pd.read_csv("test_used_car.csv")
display(train_used_car)
display(test_used_car)
1. 원 핫 인코딩 (One-Hot Encoding)
원 핫 인코딩은 범주형 데이터를 기계학습을 위해서 해당 범주에 속하는 경우 1로 속하지 않을 경우 0으로 변환하는 과정입니다.
1.1 train 데이터셋을 원 핫 인코딩
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
train_ex1 = train_used_car.copy()
encoder = OneHotEncoder(sparse_output = False)
train_encoded = encoder.fit_transform(train_ex1[['Brand','Model']])
encoded_columns = encoder.get_feature_names_out(['Brand', 'Model'])
train_encoded_df = pd.DataFrame(train_encoded, columns=encoded_columns)
train_ex1 = pd.concat([train_ex1, train_encoded_df], axis=1).drop(['Brand', 'Model'], axis=1)
display(encoded_columns)
display(train_ex1.head())
1.2 test 데이터셋에 원 핫 인코딩 적용
test_ex1 = test_used_car.copy()
try :
test_encoded = encoder.transform(test_ex1[['Brand', 'Model']])
test_encoded_df = pd.DataFrame(test_encoded, columns=encoded_columns)
test_ex1 = pd.concat([test_ex1, test_encoded_df], axis=1).drop(['Brand', 'Model'], axis=1)
test_ex1
except Exception as e:
print(f"Error : {e}")
- 오류 발생 이유: 테스트 데이터셋의 'Brand' 컬럼에 'Chevrolet'이라는 학습 데이터셋에는 존재하지 않는 새로운 범주가 있기 때문에 발생했습니다
- 해결방법 : OneHotEncoder 클래스의 handle_unknown='ignore' 옵션을 활용합니다. 이 설정은 학습 데이터셋에 존재하지 않는 새로운 범주를 만나더라도 오류 없이 처리하도록 도와줍니다.
※ handle_unknown = 'ignore' 옵션 적용
train_ex2 = train_used_car.copy()
encoder_ex2 = OneHotEncoder(sparse_output = False, handle_unknown ='ignore' )
train_encoded_ex2 = encoder_ex2.fit_transform(train_ex2[['Brand','Model']])
# Convert the encoded features into a DataFrame
encoded_columns_ex2 = encoder_ex2.get_feature_names_out(['Brand', 'Model'])
train_encoded_df2 = pd.DataFrame(train_encoded_ex2, columns=encoded_columns_ex2)
train_ex2 = pd.concat([train_ex2, train_encoded_df2], axis=1).drop(['Brand', 'Model'], axis=1)
test_ex2 = test_used_car.copy()
try :
test_encoded_ex2 = encoder_ex2.transform(test_ex2[['Brand', 'Model']])
test_encoded_df2 = pd.DataFrame(test_encoded_ex2, columns=encoded_columns_ex2)
test_ex2 = pd.concat([test_ex2, test_encoded_df2], axis=1).drop(['Brand', 'Model'], axis=1)
display(test_ex2)
except Exception as e:
print(f"Error : {e}")
※ handle_unknown = 'ignore' 옵션
- 장점 : 훈련 데이터에 없는 새로운 범주가 테스트 데이터셋에 나타났을때 유용하다. 모델이 새로운 범주에 대해 오류를 발생시키지 않고, 안정적으로 작동할 수 있도록 해줍니다.
- 단점 : 모델이 새로운 범주에 대해 학습하지 못합니다. 모델의 예측정확도에 영향을 줄 수 있으며, 중요한 범주가 무시될 위험이 있습니다.
2.바이너리 인코딩(Binary Encoding)
바이너리 인코딩은 각 범주를 레이블 인코딩으로 변환한 후, 이진수로 표현하여 범주의 수에 비례하지 않는 고정된 길이의 열을 생성합니다.
이는 차원의 증가를 상당히 제한하며, 동시에 각 범주를 효율적으로 표현할 수 있게 합니다.
활용 데이터 : 인구소득 예측을 위한 데이터셋
train_income = pd.read_csv("train_income_simple.csv")
display(train_income.head())
display(f"'occupation' 컬럼의 고유값 : {train_income['occupation'].unique()}")
display(f"'race' 컬럼의 고유값 : {train_income['race'].unique()}")
display(f"'education' 컬럼의 고유값 : {train_income['education'].unique()}")
2.1 train 데이터셋의 Occupation 컬럼을 바이너리 인코딩
category_encoders 라이브러리의 BinaryEncoder 클래스는 이러한 바이너리 인코딩 과정을 간편하게 수행할 수 있게 해줍니다.
이 라이브러리는 각 범주를 자동으로 레이블 인코딩하고, 이를 이진수 형태로 변환하여 새로운 열을 생성합니다.
import category_encoders as ce
train_ex5 = train_income.copy()
train_ex5['occupation'].fillna('Unknown', inplace=True)
# Creating a BinaryEncoder instance
encoder_ex5 = ce.BinaryEncoder(cols=['occupation'])
# Fitting and transforming the 'occupation' column
train_encoded_ex5 = encoder_ex5.fit_transform(train_ex5['occupation'])
encoded_columns_ex5 = train_encoded_ex5.columns
# Creating a DataFrame from the binary encoded data
train_encoded_df5 = pd.DataFrame(train_encoded_ex5, columns=encoded_columns_ex5)
train_ex5 = pd.concat([train_ex5, train_encoded_df5], axis=1).drop(['occupation'], axis=1)
display(encoded_columns_ex5)
display(train_ex5.head())
3. 결론
범주형 변수의 인코딩은 데이터 전처리에서 중요한 단계입니다.
특히 많은 범주를 가진 명목형 변수의 경우, 매우 신중하게 고유 카테고리의 영향도 및 분석 과정이 매우 중요합니다.
- 범주의 간소화: 데이터 탐색과 도메인 전문 지식을 활용하여 유사한 범주를 통합하고, 빈도가 낮은 범주를 병합하는 접근법은 범주의 수를 효과적으로 줄일 수 있습니다. 이러한 방법은 단순히 모델의 복잡성을 감소시키는 것을 넘어, 인코딩 기법 자체가 미치는 영향보다 더 큰 향상을 모델 성능에 가져올 수 있습니다.
- 바이너리 인코딩 적용: 간소화된 범주 구조를 가진 후에는 바이너리 인코딩 방식을 적용하는 것이 권장됩니다. 바이너리 인코딩은 다수의 범주를 가진 변수에 대해 원-핫 인코딩에 비해 더 메모리 효율적이며, 이진 수 조합을 통해 각 범주를 표현함으로써 생성되는 새로운 변수의 수를 최소화합니다.
- 고급 인코딩 기법 고려: 타깃 인코딩(Target Encoding)과 같은 고급 인코딩 기법도 주목해야 합니다. 이러한 기법은 종속 변수(타깃)와의 관계를 기반으로 각 범주를 인코딩합니다.
'머신러닝 > 머신러닝: 입문 개념' 카테고리의 다른 글
분류(Classification) (3) | 2024.11.30 |
---|---|
회귀분석 (0) | 2024.11.29 |
로지스틱 회귀분석 (0) | 2024.11.28 |
순서형(Ordinal) 변수 인코딩 (1) | 2024.11.26 |
범주형(Categorical) 변수 (0) | 2024.11.26 |