무효 클릭 IP 추적 중...
머신러닝,딥러닝/파이썬, 넘파이 구현

[파이썬 구현] one-hot encoding 구현(with 파이썬 문법)

꼬예 2021. 7. 6.

모델을 돌리기 위해선 아래와 같은 문자로 된 데이터를 만나면, 숫자로 변경해줘야 합니다.

왜냐하면 기계는 글자를 모르기 때문이죠.

 

하지만 문자를 숫자로 바꾸면 또다른 문제가 발생하는데요.

0 ,1, 2 3 은 단순히 동물들을 구분하기 위한 숫자이지만 더 큰숫자가 모델에 더 큰 영향력을 끼치는 부작용이 발생하게 됩니다.

 

이러한 문제를 해결하기 위한 것이 one-hot encoding 인데요.

실제로 해당 되는 부분을 1로 표시하고 아닐 경우에는 모두 0으로 표시하는 형태입니다.

이번 포스팅에서는 오로지 파이썬 문법을 통해서 해당 코드를 구현 해보도록 하겠습니다.

 

파이썬 코드 구현

우선 위 그림과 같은 형태를 만들기 위해선 모두 0으로 채워 주는 작업을 해야합니다. 

 

labels 라는 리스트에  동물들을 우선 담습니다. 이때 리스트에 담는 형태이다보니 가로로 뉘어져 있지만 실제 데이터상에는 row로 쌓인 형태라고 상상 하시면 이해가 쉬우실겁니다. 또한 무작위로 넣은 값이다보니 중복도 있으니 참고바랍니다..

labels = ['dog', 'cat', 'dolphin', 'tiger', 'dolphin', 'tiger'] #


n_label = len(labels) # 동물들의 수(for loop를 몇번 돌지 구하기 위함)
n_class = 4 # 동물의 종류

one_hot_mat = list() # one_hot_maxtrix 리스트
for _ in range(n_label): # 리스트에 담긴 수만큼 반복
    one_hot_vec = list() 
    for _ in range(n_class):
        one_hot_vec.append(0)  # 동물의 종류 만큼 반복문을 돌면서 0 으로 채움
    one_hot_mat.append(one_hot_vec) # 0으로 채워진 one_hot_vec을 one_hot_mat에 쌓음

print(one_hot_mat)

코드를 자세히 보시면 이해가 되실텐데요 크게 두개의 for loop으로 구성되어 있습니다.

n_class 갯수만큼 도는 for loop은 column 방향으로 0을 하나씩 채우는 형태입니다.

n_label 갯수만큼 도는 for loop은 위에서 담은 0 벡터를 row 방향으로 다시 쌓는, 즉 행렬을 만드는 코드라고 보시면 됩니다.

 

output 을 보시면 실제로 0으로 이루어진 0 벡터가 만들어진 것을 확인할 수 있습니다.

 

output :

 

 

다음으로 할것은 이 0으로 만들어진 행렬의 원소들중 몇몇은 1로 바꿔줘야 합니다.

for label_idx, label in enumerate(labels):

    one_hot_vec = one_hot_mat[label_idx]
    if label == 'dolphin' : one_hot_vec[0] =1
    elif label == 'cat': one_hot_vec[1] = 1
    elif label == 'dog': one_hot_vec[2] = 1
    elif label == 'tiger' : one_hot_vec[3] = 1

for one_hot_vec in one_hot_mat:
    print(one_hot_vec)

이번에는 labels를 기준으로 for loop 을 도는데  enumerate 함수를 이용해 index 값도 같이 뽑아냅니다.

그 후 index를 위에서 만든 one_hot_mat에 적용시켜 벡터 형태로 만든 후, 

label 이 어떤 동물과 일치하는지에 따라, 인덱스를 적용시켜 1를 넣습니다.

 

output :

 

 

 

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글