NumPy에서 인덱스 배열을 원핫 인코딩 배열로 변환하는 방법
NumPy에서 인덱스 배열을 원핫 인코딩 배열로 변환하는 방법
머신러닝 분야에서, 특히 분류 문제에서는 카테고리형 변수를 다루기 위해 종종 원핫 인코딩(one-hot encoding)을 사용합니다. 원핫 인코딩은 각 카테고리에 대해 새로운 열을 만들고, 해당 카테고리에 속하는 경우 1, 그렇지 않으면 0으로 표현하는 방식입니다.
NumPy는 Python에서 다차원 배열을 다루기 위한 강력한 라이브러리입니다. NumPy를 사용하면 인덱스 배열을 쉽게 원핫 인코딩 배열로 변환할 수 있습니다.
방법
NumPy에서 인덱스 배열을 원핫 인코딩 배열로 변환하는 방법은 두 가지가 있습니다.
np.eye 함수 사용
np.eye
함수는 대각선에 1이고 나머지는 0인 단위 행렬을 생성합니다. 이 함수를 사용하여 원핫 인코딩 배열을 쉽게 만들 수 있습니다.
import numpy as np
# 인덱스 배열
indices = np.array([1, 2, 0])
# 카테고리 개수
num_classes = 3
# 원핫 인코딩 배열
one_hot_encoded_array = np.eye(num_classes)[indices]
print(one_hot_encoded_array)
# 출력
[[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
np.take
함수는 배열에서 특정 인덱스에 해당하는 값을 추출합니다. 이 함수를 사용하여 원핫 인코딩 배열을 만들 수 있습니다.
import numpy as np
# 인덱스 배열
indices = np.array([1, 2, 0])
# 카테고리 개수
num_classes = 3
# 원핫 인코딩 배열
one_hot_encoded_array = np.take(np.eye(num_classes), indices, axis=0)
print(one_hot_encoded_array)
# 출력
[[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
예제 코드
import numpy as np
# 인덱스 배열
indices = np.array([1, 2, 0])
# 카테고리 개수
num_classes = 3
# 방법 1: np.eye 함수 사용
one_hot_encoded_array_eye = np.eye(num_classes)[indices]
# 방법 2: np.take 함수 사용
one_hot_encoded_array_take = np.take(np.eye(num_classes), indices, axis=0)
# 출력 비교
print("방법 1:", one_hot_encoded_array_eye)
print("방법 2:", one_hot_encoded_array_take)
방법 1: [[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
방법 2: [[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
설명
위 코드는 두 가지 방법 모두 동일한 결과를 출력하는 것을 확인할 수 있습니다.
- 방법 1은
np.eye
함수를 사용하여 3x3 단위 행렬을 만들고,indices
배열에 해당하는 행을 선택합니다.
두 방법 모두 장단점이 있습니다.
- 방법 1은 코드가 간결하지만, 메모리 사용량이 더 많습니다.
- 방법 2는 메모리 사용량이 적지만, 코드가 더 복잡합니다.
대체 방법
for 루프 사용
import numpy as np
# 인덱스 배열
indices = np.array([1, 2, 0])
# 카테고리 개수
num_classes = 3
# 원핫 인코딩 배열
one_hot_encoded_array = np.zeros((len(indices), num_classes))
for i, index in enumerate(indices):
one_hot_encoded_array[i][index] = 1
print(one_hot_encoded_array)
# 출력
[[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
Pandas 사용
import pandas as pd
# 인덱스 배열
indices = pd.Series([1, 2, 0])
# 카테고리 개수
num_classes = 3
# 원핫 인코딩 배열
one_hot_encoded_array = pd.get_dummies(indices, columns=list(range(num_classes)))
print(one_hot_encoded_array)
# 출력
0 1 2
0 0 1 0
1 0 0 1
2 1 0 0
scikit-learn 사용
from sklearn.preprocessing import OneHotEncoder
# 인덱스 배열
indices = np.array([1, 2, 0])
# 카테고리 개수
num_classes = 3
# OneHotEncoder 객체 생성
one_hot_encoder = OneHotEncoder(categories='auto')
# 원핫 인코딩 배열
one_hot_encoded_array = one_hot_encoder.fit_transform(indices.reshape(-1, 1))
print(one_hot_encoded_array)
# 출력
[[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
python numpy machine-learning