본문 바로가기
데이터분석과 AI/데이터분석과 AI 문법(Python)

Label Encoidng 시 ValueError: y contains previously unseen labels:가 발생할 때

by 우공80 2023. 6. 8.
728x90

label encoding 학습데이터와 테스트데이터 범주가 다를 때

 

Label Encoding 시 "ValueError: y contains previously unseen labels:"가 발생할 때가 있습니다.

학습데이터에 fit을 하고, 테스트데이터에 transform을 했을 때, 테스트데이터에 학습데이터에 없는 범주값이 존재할 때 발생합니다. 

 

초보자 분들의 경우에는 학습데이터와 테스트데이터 모두 fit_transform을 하는 경우가 있기도 하고, 

학습데이터와 테스트 데이터를 합쳐서 fit 하고, 학습데이터와 테스트 데이터를 transform 해주기도 하지만, 원칙적으로 학습데이터와 테스트 데이터는 독립적이어야 하므로 실무적으로 권장되는 방법은 아닙니다.(Data Leakage 문제가 생기며, 대회 등에서는 탈락 사유가 됩니다.)

 

LabelEncoder.classes_를 이용하여 범주를 추가하는 방법을 알아보겠습니다.

 

 

1. 학습데이터와 테스트데이터에 모두 fit_transform을 하는 경우 (이렇게 하면 생기는 문제)

from sklearn.preprocessing import LabelEncoder

# Training data
train_data = ["Red", "Green", "Blue"]

# Test data
test_data = ["Red","Green","Yello"]

# Initialize the label encoder
label_encoder = LabelEncoder()

# Fit and transform the training data
train_encoded = label_encoder.fit_transform(train_data)

# Transform the test data
test_encoded = label_encoder.fit_transform(test_data)

print("Training data:")
for color, encoded in zip(train_data, train_encoded):
    print(f"Color: {color}, Encoded value: {encoded}")

print("\nTest data:")
for color, encoded in zip(test_data, test_encoded):
    print(f"Color: {color}, Encoded value: {encoded}")

Output: 같은 값인데, 다른 정수 값으로 인코딩이 될 수 있습니다.

Training data:
Color: Red, Encoded value: 2
Color: Green, Encoded value: 1
Color: Blue, Encoded value: 0

Test data:
Color: Red, Encoded value: 1
Color: Green, Encoded value: 0
Color: Yello, Encoded value: 2


2. 학습데이터만으로 fit을 하고, 테스트 데이터의 범주를 LabelEncoder.classess_에 추가하는 방법

from sklearn.preprocessing import LabelEncoder

# Training data
train_data = ["Red", "Green", "Blue"]

# Test data
test_data = ["Red","Green","Yello"]

# Initialize the label encoder
label_encoder = LabelEncoder()

# Fit and transform the training data
train_encoded = label_encoder.fit_transform(train_data)

# Transform the test data
for label in test_data: #실제 데이터라면 np.unique(test_data[column]) 등으로 수정 필요
    if label not in label_encoder.classes_:
        label_encoder.classes_ = np.append(label_encoder.classes_,label)

        print(label_encoder.classes_)

test_encoded = label_encoder.transform(test_data)

print("Training data:")
for color, encoded in zip(train_data, train_encoded):
    print(f"Color: {color}, Encoded value: {encoded}")

print("\nTest data:")
for color, encoded in zip(test_data, test_encoded):
    print(f"Color: {color}, Encoded value: {encoded}")

Output: 동일한 값은 동일한 정수 값으로 인코딩 된 것을 볼 수 있습니다.

Training data:
Color: Red, Encoded value: 2
Color: Green, Encoded value: 1
Color: Blue, Encoded value: 0

Test data:
Color: Red, Encoded value: 2
Color: Green, Encoded value: 1
Color: Yello, Encoded value: 3

 

728x90

댓글