MLOps 부트캠프 by 한경+토스뱅크/Machine Learning

범주형 데이터를 수치형 데이터로 바꿔주는 One-hot Encoding

나니니 2024. 8. 22. 22:46

머신러닝에는 사용되는 데이터터는 아래와 같이 크게 두 종료가 있다. 

많은 머신 러닝 알고리즘은 인풋 데이터, 즉 입력 변수의 값이 수치형 데이터여야 한다. 

예를 들면 선형 회귀도 손실 함수를 구하고 경사 하강법을 적용하려면 인풋 데이터가 수치형 데이터여야 한다. 

 

그렇다면 범주형 데이터가 있을 땐 어떻게 해야 할까?

 

범주형 데이터를 -> 수치형 데이터로 바뚸 주면 된다. 

그러나 위 이미지처럼 범주에 숫자를 입력하게 된다면 머신러닝 알고리즘은 'A형은 1이니까 가장 작고, O형은 4니까 가장 크고, AB형, B형은 그 사이에 존재한다'라는 관계로 인식하게 되어 오히려 예측에 방해가 된다. 

 

그러므로 범주형 데이터를 수치형 데이터로 바꿔줄 때는 One-hot encoding 방법을 사용한다. 

One-hot encoding이란 각 카테고리를 하나의 새로운 열로 만들어 주는 방법이다. 

One-hot encoding

예를 들어 위의 이미지와 같이 혈액형이라는 열에는 A, AB, B, O형 의 각 카테고리가 있으니 이를 4개의 열로 새롭게 만들어주는 방법이다. 

각 열에서 해당하는 카테고리에만 '1'을 입력하고 해당하지 않는 카테고리에는 '0'을 입력하게 되면 0과 1의 두 값만 가지기 때문에 크고 작은 관계가 생기는 것을 막을 수 있다.

즉, One-hot encoding을 하면 범주형 데이터에 크고 작음의 엉뚱한 관계가 생기는 걸 방지하면서 동시에 수치형 데이터로 바꿔 줄 수 있다. 

예제

이번 과제에서는 성별 데이터를 사용할 건데요. pandas 라이브러리의 read_csv() 메소드를 써서 사용할 데이터를 pandas dataframe으로 받아 옵니다.


데이터를 살펴보면 각 행은 한 명의 사람을 나타냅니다. 'Gender' 열을 살펴보면 성별 데이터가 있고요, 나머지 열들은 각 사람이 가장 좋아하는 색, 음악 장르, 주류, 음료가 저장돼 있습니다. 일단 목표 변수로 사용할 성별 열을 제외한 새로운 dataframe을 만들어 줄게요.
input_data = gender_df.drop(['Gender'], axis=1)
이렇게 하면 이제 변수 input_data에는 입력 변수 데이터만 저장됩니다.

이번 과제에서 저희는 입력 변수 전체를 One-hot Encoding 하고 싶은데요. pandas 라이브러리의 get_dummies() 메소드를 사용해서 주어진 입력 변수 데이터 전체 열을 One-hot Encoding 해 보세요. (One-hot Encoding 한 데이터는 변수 X에 저장하세요!)

import pandas as pd

GENDER_FILE_PATH = './datasets/gender.csv'

gender_df = pd.read_csv(GENDER_FILE_PATH)
input_data = gender_df.drop(['Gender'], axis=1)

X = pd.get_dummies(input_data)

X.head()