🐍 Python

범주형 데이터를 숫자로 변환하는 방법: One-Hot Encoding 완벽 가이드

itstory(Booho) 2025. 2. 9. 14:00
728x90

2025.02.09 - [🐍 Python] - LabelEncoder란? 머신러닝에서 범주형 데이터를 숫자로 변환하는 방법

 

LabelEncoder란? 머신러닝에서 범주형 데이터를 숫자로 변환하는 방법

🔹 1. LabelEncoder란?LabelEncoder는 범주형(카테고리형) 데이터를 숫자로 변환하는 기법입니다.머신러닝 모델은 문자열 데이터를 직접 이해할 수 없기 때문에, 문자 데이터를 숫자로 변환해야 합니다

boohoday.com

One-Hot Encoding(원-핫 인코딩)은 머신러닝에서 범주형 데이터를 숫자로 변환하는 필수적인 방법입니다.
LabelEncoder와 어떤 차이가 있을까? 언제 One-Hot Encoding을 써야 할까?
이 글에서 초보자도 쉽게 이해할 수 있도록 개념부터 실습 코드까지 완벽 정리해드립니다!

🔹 1. One-Hot Encoding이란?

One-Hot Encoding(원-핫 인코딩)은 범주형 데이터를 머신러닝 모델이 이해할 수 있도록 변환하는 기법입니다.
각 카테고리를 새로운 컬럼(열)으로 변환하고, 해당하는 값만 1, 나머지는 0으로 표시합니다.
숫자의 크기(순서)가 의미가 없도록 변환하여, 모델이 데이터를 올바르게 학습하도록 합니다.


📌 예제: One-Hot Encoding이 필요한 이유

예를 들어, 스타벅스 음료의 카테고리가 있다고 가정해 봅시다.

이 데이터를 LabelEncoder를 사용하면 다음과 같이 변환됩니다.

Label Encoding 적용 전   Label Encoding 적용 후
Beverage_Category Beverage_Category
Coffee 0 (Coffee)
Tea 1 (Tea)
Smoothie 2 (Smoothie)
Coffee 0 (Coffee)
Smoothie 2 (Smoothie)

 

🚨 문제점:

  • 모델이 Tea(1)가 Coffee(0)보다 크다고 잘못 이해할 수도 있음 ❌
  • 즉, 순서가 없는 범주형 데이터에는 LabelEncoder를 사용하면 안 됨!

해결책: One-Hot Encoding!
각 카테고리를 별도의 열(Column)로 변환하여 숫자의 크기에 의미가 없도록 만든다.

📌 One-Hot Encoding 적용 후

Coffee Tea Smoothie
1 0 0
0 1 0
0 0 1
1 0 0
0 0 1

🔥 이제 머신러닝 모델이 "범주형 데이터 간의 순서가 없다"는 것을 올바르게 이해할 수 있음!


🔹 2. One-Hot Encoding 적용 방법 (Python 코드 예제)

✅ 1️⃣ pandas.get_dummies() 사용 (가장 간단한 방법)

import pandas as pd

# 샘플 데이터프레임 생성
df = pd.DataFrame({"Beverage_Category": ["Coffee", "Tea", "Smoothie", "Coffee", "Smoothie"]})

# One-Hot Encoding 적용
df_encoded = pd.get_dummies(df, columns=["Beverage_Category"])

# 결과 출력
print(df_encoded)

📌 출력 결과

   Beverage_Category_Coffee  Beverage_Category_Tea  Beverage_Category_Smoothie
0                        1                      0                           0
1                        0                      1                           0
2                        0                      0                           1
3                        1                      0                           0
4                        0                      0                           1

pandas.get_dummies()를 사용하면 간단하게 변환 가능!
각 카테고리가 새로운 열(Column)로 변환되고, 해당 값이면 1, 아니면 0으로 표시!

728x90

✅ 2️⃣ OneHotEncoder (Scikit-learn 사용)

pandas.get_dummies()보다 더 정교한 머신러닝 전처리를 원한다면, OneHotEncoder를 사용합니다.

from sklearn.preprocessing import OneHotEncoder

# 데이터 준비
df = pd.DataFrame({"Beverage_Category": ["Coffee", "Tea", "Smoothie", "Coffee", "Smoothie"]})

# OneHotEncoder 객체 생성
encoder = OneHotEncoder(sparse=False)  # sparse=False 설정하면 배열 형태로 반환

# 변환 실행
encoded_array = encoder.fit_transform(df[["Beverage_Category"]])

# 결과를 데이터프레임으로 변환
df_encoded = pd.DataFrame(encoded_array, columns=encoder.get_feature_names_out(["Beverage_Category"]))

print(df_encoded)

📌 출력 결과

   Beverage_Category_Coffee  Beverage_Category_Tea  Beverage_Category_Smoothie
0                        1                      0                           0
1                        0                      1                           0
2                        0                      0                           1
3                        1                      0                           0
4                        0                      0                           1

OneHotEncoder는 get_feature_names_out()을 사용해 자동으로 컬럼 이름을 생성함!
sparse=False를 설정하면 NumPy 배열이 아닌 일반적인 DataFrame 형식으로 변환 가능!


🔹 3. LabelEncoder vs One-Hot Encoding 차이점

비교 항목 LabelEncoder OneHotEncoder
변환 방식 각 값을 숫자로 매핑 (0, 1, 2, ...) 각 값을 별도의 열(Column)로 변환
데이터 형태 순서가 없는 범주형 데이터 순서가 없는 범주형 데이터 (더 안전)
특징 숫자로 변환되지만, 모델이 크기(순서)로 오해할 수 있음 숫자의 크기 개념이 없음 (순서가 중요하지 않음)
예제 "Coffee" → 0, "Tea" → 1, "Smoothie" → 2 "Coffee" → [1,0,0], "Tea" → [0,1,0], "Smoothie" → [0,0,1]
사용 추천 이진(2개) 데이터에 적합 (예: Yes/No) 3개 이상 범주형 데이터에 적합

 

즉, 순서가 없는 범주형 데이터는 One-Hot Encoding이 더 안전하고 일반적으로 사용됩니다!


✅ 결론: One-Hot Encoding을 이렇게 활용하자!

LabelEncoder는 숫자의 크기가 의미가 있을 때만 사용 (이진 분류용)
One-Hot Encoding은 숫자 크기의 의미가 없는 다중 클래스 데이터에 사용
pandas.get_dummies()를 사용하면 쉽게 변환 가능
OneHotEncoder를 사용하면 Scikit-learn에서 모델과 함께 쉽게 활용 가능

728x90