본문 바로가기
AI/Machine-Learning

데이터 인코더(Label, OneHot)

by Wikinist 2023. 8. 29.

LabelEncoder

LabelEncoder는 주로 범주형 데이터를 숫자로 변환하는 데 사용되는 Scikit-Learn 라이브러리의 클래스입니다. 범주형 데이터는 문자열 또는 이산적인 값들로 이루어진 데이터로, 예를 들어 'Red', 'Green', 'Blue'와 같은 색상 레이블이나 'Cat', 'Dog', 'Fish'와 같은 동물 종류 등이 있습니다.

LabelEncoder는 각 범주를 고유한 정수로 매핑하여 변환합니다. 예를 들어, 위의 색상 레이블을 LabelEncoder를 사용하여 변환하면 'Red'는 0, 'Green'은 1, 'Blue'는 2와 같이 변환됩니다. 이는 알고리즘들이 숫자 데이터를 더 쉽게 처리하도록 도와줍니다. 하지만 이러한 변환은 순서나 관계를 나타내는 데 사용되지 않아야 하는 경우가 많습니다.

"하지만 이러한 변환은 순서나 관계를 나타내는 데 사용되지 않아야 하는 경우가 많습니다"라는 문장은 주로 범주형 데이터를 변환할 때의 주의사항을 나타내는 말입니다.

예를 들어, '낮음', '보통', '높음'과 같은 범주를 숫자로 변환할 때, LabelEncoder를 사용하면 '낮음'이 0, '보통'이 1, '높음'이 2로 변환될 수 있습니다. 하지만 이 경우에는 데이터 간의 순서나 관계가 의미있는 정보를 나타내는 것이 아닙니다. 순서나 관계가 없는 범주 간에 숫자 변환이 이루어진다면, 알고리즘이 그 숫자의 크기를 사용하여 잘못된 판단을 할 수 있습니다.

원-핫 인코딩은 이런 문제를 피할 수 있는 방법입니다. '낮음', '보통', '높음'을 원-핫 인코딩하면 각각의 범주가 별도의 열로 표현되며, 알고리즘은 이진 값에 의존하여 범주 간의 순서나 관계를 추론하지 않습니다. 이러한 점에서 원-핫 인코딩은 카테고리 간의 관계를 나타내지 않고 독립적인 정보를 유지하며 사용됩니다.


따라서, 범주형 데이터를 변환할 때 순서나 관계가 없는 경우에는 숫자 변환 대신 원-핫 인코딩을 고려하는 것이 좋습니다.

LabelEncoder 예시

from sklearn.preprocessing import LabelEncoder

# 범주형 데이터 샘플
categories = ['Red', 'Green', 'Blue', 'Green', 'Blue']

# LabelEncoder 객체 생성
label_encoder = LabelEncoder()

# LabelEncoder를 사용하여 변환
encoded_labels = label_encoder.fit_transform(categories)

print("Original Categories:", label_encoder.classes_)
print("Encoded Labels:", encoded_labels)

출력

Original Categories: ['Blue' 'Green' 'Red']
Encoded Labels: [2 1 0 1 0]

OneHotEncoder

OneHotEncoder는 주로 범주형 데이터를 원-핫 인코딩(one-hot encoding) 형식으로 변환하는 데 사용되는 클래스입니다. 원-핫 인코딩은 각 범주를 이진(0 또는 1) 값의 열로 변환하는 기술입니다. 이를 통해 알고리즘은 범주 간의 순서나 관계를 추론하지 않고 데이터를 처리할 수 있습니다.

예를 들어, 동물 종류에 대한 범주형 데이터를 원-핫 인코딩하면 'Cat', 'Dog', 'Fish'와 같은 종류는 각각 별도의 열로 나타내어지며 해당하는 종류에 해당하는 열만 1이고 나머지는 0으로 표시됩니다. 이렇게 함으로써 알고리즘은 각 동물의 종류를 독립적으로 다룰 수 있습니다.

간단히 말해서, LabelEncoder는 범주형 데이터를 숫자로 매핑하여 변환하고, OneHotEncoder는 범주형 데이터를 이진 형태로 원-핫 인코딩하여 변환합니다. 데이터에 따라 어떤 인코딩 방식이 더 적합한지를 고려하여 선택하면 됩니다.

OneHotEncoder 예시:

import numpy as np
from sklearn.preprocessing import OneHotEncoder

# 범주형 데이터 샘플
categories = ['Cat', 'Dog', 'Fish', 'Dog', 'Cat']

# LabelEncoder를 사용하여 범주를 숫자로 변환
label_encoder = LabelEncoder()
encoded_labels = label_encoder.fit_transform(categories)

# 2D 배열로 변환
encoded_labels = np.array(encoded_labels).reshape(-1, 1)

# OneHotEncoder 객체 생성
onehot_encoder = OneHotEncoder()

# OneHotEncoder를 사용하여 변환
onehot_encoded = onehot_encoder.fit_transform(encoded_labels)

print("Original Categories:", onehot_encoder.categories_)
print("Encoded Labels:", encoded_labels)
print("OneHot Encoded:", onehot_encoded.toarray())

출력:

Original Categories: [array([0, 1, 2], dtype=int64)]
Encoded Labels: [[0]
 [1]
 [2]
 [1]
 [0]]
OneHot Encoded: [[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.