• 수치형(numerical) 데이터: 나이, 몸무게, 키
  • 범주형(categorical) 데이터: 혈액형, 성별

많은 머신 러닝 알고리즘은 인풋 데이터, 즉 입력 변수의 값이 수치형 데이터여야 합니다. 저희가 배운 선형 회귀도 손실 함수를 구하고, 경사 하강법을 적용하려면 인풋 데이터가 수치형 데이터여야겠죠? 그럼 범주형 데이터가 있을 때는 어떻게 해야 할까요?

범주형 데이터를 수치형 데이터로 바꿔 주면 됩니다. 어떻게 바꿔 주는 게 좋을까요? 가장 먼저 떠오르는 방법은 1, 2, 3… 과 같은 자연수를 각 카테고리에 지정해 주는 건데요, 예를 들어 A형은 1, AB형은 2, B형은 3, O형은 4. 이런 식으로 데이터를 변환하는 거죠. 이제 혈액형은 숫자 값을 가지게 되니까 입력 변수로 쓸 수 있겠죠?

하지만 이렇게 데이터를 바꿔 주면 혈액형에 크고 작다는 개념이 생깁니다. 예를 들어 ‘A형은 1이니까 가장 작고, O형은 4니까 가장 크고, AB형, B형은 그 사이다’라는 관계가 생기는 거죠. 머신 러닝 알고리즘은 이런 엉뚱한 관계도 학습하기 때문에 오히려 예측에 방해가 될 수 있습니다.

그래서 범주형 데이터를 수치형 데이터로 바꿀 때는 이 방법을 사용하지 않고, One-hot encoding이라는 방법을 사용합니다.

One-hot encoding은 각 카테고리를 하나의 새로운 열로 만들어 주는 방법입니다. 예를 들어 혈액형이라는 열에는 A형, AB형, B형, O형 네 카테고리가 있으니까 이걸 4개의 새로운 열로 만들어 주는 방법입니다.

그다음엔 주어진 데이터가 어떤 혈액형인지에 따라 새로운 열들의 값을 0 또는 1로 채워 줍니다. 처음 데이터 행은 B형이니까 B형 열을 1로, 그리고 나머지 열을 0으로 설정해 주고, 다음 데이터 행은 O형이니까 O형 열을 1로, 나머지 열을 0으로 설정해 주는 거죠. 이제 이 열들은 0과 1, 두 값만 가지기 때문에 범주형 데이터에게 크고 작은 관계가 생기는 것을 막을 수 있는 겁니다.

결론적으로 one-hot encoding을 하면 범주형 데이터에게 크고 작음의 엉뚱한 관계가 생기는 걸 방지하면서도 수치형 데이터로 바꿔 줄 수 있는 거죠.

반응형

+ Recent posts