답변:
데이터 세트에 범주 기능 (예 : 색상)이 있다고 가정합니다. 샘플은 빨간색, 노란색 또는 파란색 일 수 있습니다. 이 인수를 ML 알고리즘에 전달하려면 먼저 문자열 대신 숫자를 갖도록 인코딩해야합니다.
이러한 작업을 수행하는 가장 쉬운 방법은 다음과 같은 위치에 매핑을 만드는 것입니다.
빨간색-> 1
노란색-> 2
파란색-> 3
각 문자열을 매핑 된 값으로 바꿉니다.
그러나 숫자를 처리 할 때 파랑> 노랑 (3> 2이기 때문에) 또는 빨강 + 노랑 = 파랑 (1 + 2 = 3이기 때문에)으로 생각할 수있는 것처럼 ML 모델에서 원하지 않는 부작용을 일으킬 수 있습니다. 모델은 이러한 데이터가 범주 형이고 정수로 매핑되었음을 알 방법이 없습니다.
이 문제에 대한 해결책은 N 개의 새로운 기능 을 생성하는 원핫 인코딩입니다 . 여기서 N 은 원래 기능의 고유 한 값의 수입니다. 우리의 시험에서 N 은 3과 같습니다. 왜냐하면 우리는 3 개의 고유 한 색 (빨강, 노랑, 파랑)을 가지고 있기 때문입니다.
이러한 각 기능은 이진이며 이러한 고유 한 값 중 하나 에 해당 합니다. 이 예에서 첫 번째 기능은 샘플이 빨간색인지 아닌지를 알려주는 이진 기능이며, 두 번째는 노란색과 세 번째는 동일합니다.
이러한 변환의 예는 다음과 같습니다.
이 접근 방식은 데이터 집합의 차원을 증가시키기 때문에 많은 고유 값을 취하는 기능이있는 경우, 위에서 제시 한 것과 같이 더 희소 한 인코딩을 사용하고자 할 수 있습니다.
depth : 하나의 핫 차원의 깊이를 정의하는 스칼라.
지수 : 지수 텐서.
이 예제는 tensorflow 설명서에 나와 있습니다.
1. 인덱스와 깊이 만 지정 (on_value의 기본값은 1, off_value는 0)
indices = [0, 1, 2]
depth = 3
tf.one_hot(indices, depth) # output: [3 x 3]
# [[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]]
지수 = [0, 2, -1, 1] 깊이 = 3 tf.one_hot (표시, 깊이, on_value = 5.0, off_value = 0.0, axis = -1) ## 출력 : [4 x 3] # [[5.0, 0.0, 0.0], # one_hot (0) # [0.0, 0.0, 5.0], # one_hot (2) # [0.0, 0.0, 0.0], # one_hot (-1) # [0.0, 5.0, 0.0]] # one_hot (1)