🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

데이터 전처리 기초 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 2. · 13 Views

데이터 전처리 기초 완벽 가이드

머신러닝 모델의 성능을 좌우하는 데이터 전처리의 핵심 기법들을 다룹니다. 결측치 처리부터 인코딩까지, 실무에서 반드시 알아야 할 전처리 테크닉을 초급자도 이해할 수 있도록 쉽게 설명합니다.


목차

  1. 데이터_전처리의_중요성
  2. 결측치_처리하기
  3. 이상치_탐지_및_처리
  4. 데이터_정규화
  5. 데이터_표준화
  6. 범주형_데이터_인코딩

1. 데이터 전처리의 중요성

김개발 씨는 첫 머신러닝 프로젝트에 설레는 마음으로 임했습니다. 인터넷에서 배운 대로 데이터를 모델에 넣었는데, 결과가 엉망이었습니다.

분명히 좋은 알고리즘을 썼는데 왜 이런 걸까요?

데이터 전처리는 원본 데이터를 머신러닝 모델이 학습하기 좋은 형태로 가공하는 과정입니다. 마치 요리사가 재료를 손질하는 것과 같습니다.

아무리 좋은 레시피가 있어도 재료 손질이 엉망이면 맛있는 요리가 나올 수 없듯이, 데이터 전처리 없이는 좋은 모델을 만들 수 없습니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np

# 원본 데이터 확인
df = pd.read_csv('customer_data.csv')

# 데이터 기본 정보 확인
print(df.info())  # 데이터 타입과 결측치 확인
print(df.describe())  # 통계 요약 정보

# 결측치 비율 확인
missing_ratio = df.isnull().sum() / len(df) * 100
print(f"결측치 비율:\n{missing_ratio}")

# 중복 데이터 확인
duplicates = df.duplicated().sum()
print(f"중복 행 개수: {duplicates}")

김개발 씨는 입사 첫 해에 고객 이탈 예측 모델을 만드는 프로젝트를 맡았습니다. 유튜브와 블로그에서 본 대로 RandomForest 모델을 적용했는데, 정확도가 겨우 50% 수준이었습니다.

동전 던지기보다 나을 게 없는 결과였습니다. 선배 개발자 박시니어 씨가 김개발 씨의 코드를 살펴보았습니다.

"모델 코드는 괜찮은데, 데이터 전처리를 건너뛰었네요. 여기가 문제예요." 그렇다면 데이터 전처리란 정확히 무엇일까요?

쉽게 비유하자면, 데이터 전처리는 요리 전 재료 손질과 같습니다. 최고급 한우를 샀더라도 핏물을 빼지 않고 요리하면 비린내가 납니다.

야채도 씻지 않고 썰면 흙이 섞여 들어갑니다. 아무리 좋은 레시피와 조리 기술이 있어도, 재료 손질이 엉망이면 맛있는 요리가 나올 수 없습니다.

머신러닝도 마찬가지입니다. 현실 세계의 데이터는 대부분 지저분합니다.

어떤 고객은 나이 정보를 입력하지 않았고, 어떤 데이터는 오타로 인해 나이가 999살로 기록되어 있습니다. 성별은 어디서는 M/F로, 어디서는 남/여로, 또 어디서는 1/2로 표현되어 있습니다.

이런 데이터를 그대로 모델에 넣으면 어떻게 될까요? 모델은 혼란에 빠집니다.

결측치가 있으면 아예 학습이 안 되기도 하고, 이상한 값들 때문에 엉뚱한 패턴을 학습하기도 합니다. 결국 쓸모없는 예측을 내놓게 됩니다.

실제로 데이터 과학자들은 전체 프로젝트 시간의 70-80%를 데이터 전처리에 사용합니다. 모델을 만들고 튜닝하는 시간보다 훨씬 많은 시간을 데이터 정리에 쏟는 것입니다.

그만큼 중요하다는 뜻입니다. 위 코드를 살펴보면, 가장 먼저 해야 할 일은 데이터의 현재 상태를 파악하는 것입니다.

info() 메서드로 각 컬럼의 데이터 타입과 결측치 개수를 확인합니다. describe()로 숫자형 데이터의 통계 요약을 봅니다.

결측치 비율을 계산하는 것도 중요합니다. 결측치가 5% 미만이면 삭제해도 괜찮지만, 30%가 넘는다면 다른 전략이 필요합니다.

중복 데이터도 확인해야 합니다. 같은 고객 정보가 여러 번 들어가 있다면 모델이 편향될 수 있습니다.

박시니어 씨는 설명을 마치며 말했습니다. "전처리는 지루하지만, 이 과정을 얼마나 꼼꼼히 하느냐가 모델 성능을 결정해요.

데이터를 이해하는 시간을 아끼면 안 됩니다." 김개발 씨는 고개를 끄덕였습니다. 이제 데이터부터 제대로 살펴봐야겠다고 마음먹었습니다.

실전 팁

💡 - 모델링 전에 반드시 df.info()와 df.describe()로 데이터 상태를 확인하세요

  • 결측치, 이상치, 중복 데이터를 체크하는 것을 습관화하세요

2. 결측치 처리하기

김개발 씨가 데이터를 살펴보니 곳곳에 빈 칸이 보였습니다. 어떤 고객은 나이 정보가 없고, 어떤 고객은 연봉 정보가 비어 있었습니다.

이 빈 칸들을 어떻게 처리해야 할까요?

결측치는 데이터에서 값이 누락된 부분을 말합니다. 마치 퍼즐 조각이 몇 개 빠진 것과 같습니다.

결측치를 그대로 두면 대부분의 머신러닝 알고리즘이 제대로 작동하지 않으므로, 삭제하거나 적절한 값으로 채워넣어야 합니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np

# 결측치 확인
print(df.isnull().sum())

# 방법 1: 결측치가 있는 행 삭제
df_dropped = df.dropna()

# 방법 2: 평균값으로 채우기 (수치형 데이터)
df['age'].fillna(df['age'].mean(), inplace=True)

# 방법 3: 최빈값으로 채우기 (범주형 데이터)
df['gender'].fillna(df['gender'].mode()[0], inplace=True)

# 방법 4: 앞/뒤 값으로 채우기 (시계열 데이터)
df['temperature'].fillna(method='ffill', inplace=True)

김개발 씨는 고객 데이터를 열어보고 한숨을 쉬었습니다. 1만 건의 데이터 중에서 나이 정보가 비어 있는 경우가 500건, 연봉 정보가 없는 경우가 800건이나 되었습니다.

"이 빈 칸들은 어떻게 해야 하죠?" 김개발 씨가 물었습니다. 박시니어 씨가 대답했습니다.

"그게 바로 결측치 문제야. 현실 데이터에서는 피할 수 없는 문제지." 결측치가 생기는 이유는 다양합니다.

고객이 설문 항목을 건너뛰었을 수도 있고, 시스템 오류로 데이터가 저장되지 않았을 수도 있습니다. 센서가 고장나서 측정값이 기록되지 않은 경우도 있습니다.

결측치를 처리하는 첫 번째 방법은 삭제입니다. 결측치가 있는 행을 통째로 지워버리는 것입니다.

가장 간단하지만, 데이터가 많이 줄어들 수 있다는 단점이 있습니다. 결측치 비율이 5% 미만일 때 주로 사용합니다.

두 번째 방법은 평균값 대체입니다. 나이 정보가 비어 있다면, 다른 사람들의 나이 평균으로 채워넣는 것입니다.

수치형 데이터에 적합한 방법입니다. 다만 이상치가 많으면 평균이 왜곡될 수 있으므로, 그럴 때는 중앙값을 사용하는 것이 좋습니다.

세 번째 방법은 최빈값 대체입니다. 성별처럼 범주형 데이터의 경우, 가장 많이 나타나는 값으로 채웁니다.

남성이 60%, 여성이 40%라면 결측치를 남성으로 채우는 식입니다. 네 번째 방법은 전후 값 대체입니다.

시계열 데이터에서 주로 사용합니다. 오늘 온도가 기록되지 않았다면, 어제 온도로 채우는 것입니다.

ffill은 앞의 값으로, bfill은 뒤의 값으로 채웁니다. 어떤 방법을 선택해야 할까요?

정답은 없습니다. 데이터의 특성과 결측 비율, 그리고 비즈니스 맥락을 고려해서 결정해야 합니다.

예를 들어 의료 데이터에서 환자의 혈압 정보가 없다면, 단순히 평균으로 채우는 것은 위험할 수 있습니다. 이런 경우에는 해당 행을 삭제하거나, 별도의 범주로 표시하는 것이 나을 수 있습니다.

박시니어 씨가 조언했습니다. "결측치를 무조건 채우려고 하지 마세요.

왜 결측이 발생했는지, 결측 자체가 의미 있는 정보인지 먼저 생각해보세요." 김개발 씨는 자신의 데이터를 다시 살펴보았습니다. 연봉 정보가 비어 있는 고객들은 대부분 학생이었습니다.

연봉이 없는 게 당연한 것이었습니다. 이런 경우 0으로 채우거나, 별도의 표시를 하는 것이 맞겠다고 생각했습니다.

실전 팁

💡 - 결측치를 처리하기 전에 왜 결측이 발생했는지 먼저 파악하세요

  • 수치형은 평균/중앙값, 범주형은 최빈값으로 채우는 것이 일반적입니다

3. 이상치 탐지 및 처리

김개발 씨가 고객 나이 데이터를 분석하던 중 이상한 값을 발견했습니다. 한 고객의 나이가 999살로 기록되어 있었습니다.

또 다른 고객은 -5살이었습니다. 이런 말도 안 되는 값들은 어떻게 처리해야 할까요?

이상치는 다른 데이터와 동떨어진 극단적인 값을 말합니다. 마치 줄 서 있는 사람들 사이에 거인 하나가 끼어 있는 것과 같습니다.

이상치는 모델 학습을 방해하므로, 탐지하고 적절히 처리해야 합니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np

# IQR 방법으로 이상치 탐지
Q1 = df['salary'].quantile(0.25)
Q3 = df['salary'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 확인
outliers = df[(df['salary'] < lower_bound) | (df['salary'] > upper_bound)]
print(f"이상치 개수: {len(outliers)}")

# 이상치 제거
df_clean = df[(df['salary'] >= lower_bound) & (df['salary'] <= upper_bound)]

# 이상치를 경계값으로 대체 (Capping)
df['salary'] = df['salary'].clip(lower=lower_bound, upper=upper_bound)

김개발 씨는 연봉 데이터의 평균을 계산해보았습니다. 무려 5억 원이 나왔습니다.

뭔가 이상했습니다. 데이터를 정렬해보니, 한 명의 연봉이 100억 원으로 기록되어 있었습니다.

입력 오류였습니다. 이처럼 이상치는 데이터 분석과 모델 학습에 큰 영향을 미칩니다.

평균이 왜곡되고, 모델이 극단적인 값에 맞춰 학습하면서 일반적인 패턴을 놓치게 됩니다. 이상치를 찾는 가장 대표적인 방법이 IQR 방법입니다.

IQR은 사분위 범위로, 데이터를 크기 순으로 정렬했을 때 25% 지점과 75% 지점 사이의 거리입니다. 마치 학급 시험 점수를 생각해보세요.

반 학생들의 점수를 줄 세웠을 때, 아래에서 25번째 학생 점수가 60점이고 75번째 학생 점수가 80점이라면 IQR은 20점입니다. 이 범위에서 너무 벗어난 점수, 예를 들어 0점이나 100점은 이상치로 볼 수 있습니다.

구체적으로, Q1 - 1.5 x IQR보다 작거나 Q3 + 1.5 x IQR보다 큰 값을 이상치로 판단합니다. 이 1.5라는 숫자는 통계적으로 검증된 기준입니다.

이상치를 발견했다면 어떻게 처리해야 할까요? 첫 번째 방법은 제거입니다.

이상치가 명백한 오류라면 삭제하는 것이 좋습니다. 나이가 999살인 경우가 그렇습니다.

두 번째 방법은 대체입니다. 이상치를 경계값으로 바꾸는 것입니다.

연봉이 100억 원으로 기록되어 있다면, 상한선인 2억 원으로 대체하는 식입니다. 이를 Capping 또는 Winsorizing이라고 합니다.

세 번째 방법은 그대로 두기입니다. 이상치가 실제로 존재하는 값이라면 무작정 제거하면 안 됩니다.

예를 들어 부자 고객 분석에서 재산이 1000억 원인 사람은 이상치가 아니라 분석 대상입니다. 박시니어 씨가 말했습니다.

"이상치 처리에서 가장 중요한 건 도메인 지식이에요. 의료 데이터에서 맥박이 200이면 이상치일 수도 있지만, 격렬한 운동 직후라면 실제 값일 수 있어요." 김개발 씨는 자신의 데이터를 다시 확인했습니다.

나이 999살은 분명한 오류이므로 삭제했고, 연봉 10억 원 이상인 값들은 실제 고액 연봉자일 수 있으므로 별도로 확인하기로 했습니다.

실전 팁

💡 - IQR 방법 외에도 Z-score, 시각화(박스플롯)를 활용해 이상치를 탐지하세요

  • 이상치가 오류인지 실제 값인지 반드시 확인 후 처리하세요

4. 데이터 정규화

김개발 씨가 고객 데이터로 모델을 만들었는데, 이상하게도 나이 변수는 거의 무시되고 연봉 변수만 영향을 주는 것 같았습니다. 나이는 0100 사이인데 연봉은 010억 원 사이였습니다.

스케일 차이가 문제였을까요?

정규화는 서로 다른 스케일의 데이터를 0과 1 사이로 통일시키는 과정입니다. 마치 미터와 킬로미터를 같은 단위로 맞추는 것과 같습니다.

이를 통해 모든 특성이 공평하게 모델 학습에 기여할 수 있습니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 원본 데이터
print("원본 데이터:")
print(df[['age', 'salary']].describe())

# Min-Max 정규화 적용
scaler = MinMaxScaler()
df_normalized = df.copy()
df_normalized[['age', 'salary']] = scaler.fit_transform(df[['age', 'salary']])

print("\n정규화 후:")
print(df_normalized[['age', 'salary']].describe())

# 수식으로 직접 계산하기
# normalized = (x - min) / (max - min)
df['age_normalized'] = (df['age'] - df['age'].min()) / (df['age'].max() - df['age'].min())

김개발 씨는 고객의 나이와 연봉을 사용해서 이탈 예측 모델을 만들었습니다. 그런데 모델이 연봉에만 집중하고 나이는 거의 무시하는 것 같았습니다.

박시니어 씨가 설명했습니다. "나이는 2560 사이의 값인데, 연봉은 3000만5억 원 사이잖아요.

숫자 크기가 천지 차이예요. 모델 입장에서는 큰 숫자가 더 중요해 보이는 거죠." 이 문제를 해결하는 것이 바로 정규화입니다.

쉽게 비유하자면, 사과와 수박의 무게를 비교한다고 생각해보세요. 사과는 그램 단위로 재고 수박은 킬로그램 단위로 재면 비교가 어렵습니다.

둘 다 같은 단위로 맞춰야 공정한 비교가 가능합니다. Min-Max 정규화는 모든 값을 0과 1 사이로 변환합니다.

가장 작은 값은 0이 되고, 가장 큰 값은 1이 됩니다. 그 사이의 값들은 비례해서 변환됩니다.

수식은 간단합니다. (현재값 - 최소값) / (최대값 - 최소값)입니다.

예를 들어 나이가 25세에서 65세 사이라면, 25세는 0, 65세는 1이 됩니다. 45세는 (45-25)/(65-25) = 0.5가 됩니다.

연봉도 마찬가지로 0과 1 사이 값으로 변환됩니다. 이제 나이와 연봉이 같은 스케일이 되었으므로, 모델이 두 특성을 공평하게 고려할 수 있습니다.

sklearn의 MinMaxScaler를 사용하면 이 과정을 쉽게 수행할 수 있습니다. fit_transform 메서드 하나로 정규화가 완료됩니다.

정규화가 특히 중요한 알고리즘들이 있습니다. KNN, SVM, 신경망 등 거리 기반 알고리즘은 스케일에 민감합니다.

반면 의사결정트리랜덤포레스트는 스케일에 영향을 받지 않습니다. 주의할 점도 있습니다.

정규화는 최소값과 최대값을 기준으로 하기 때문에, 이상치가 있으면 대부분의 값이 0에 가깝게 몰릴 수 있습니다. 이상치 처리를 먼저 해야 하는 이유입니다.

또한 학습 데이터의 최소값과 최대값을 기억해두었다가 테스트 데이터에도 같은 기준으로 적용해야 합니다. 그래서 scaler 객체를 저장해두는 것이 중요합니다.

김개발 씨는 정규화를 적용한 후 모델을 다시 학습시켰습니다. 나이 변수도 제대로 영향력을 발휘하기 시작했고, 모델 성능이 눈에 띄게 좋아졌습니다.

실전 팁

💡 - 거리 기반 알고리즘(KNN, SVM, 신경망)에는 반드시 정규화를 적용하세요

  • 학습 데이터로 fit한 scaler를 저장해두고 테스트 데이터에도 같은 기준을 적용하세요

5. 데이터 표준화

김개발 씨는 정규화와 표준화가 헷갈렸습니다. 둘 다 스케일을 맞추는 건데, 뭐가 다른 걸까요?

언제 정규화를 쓰고 언제 표준화를 써야 하는 걸까요?

표준화는 데이터의 평균을 0, 표준편차를 1로 변환하는 과정입니다. 마치 학생들의 시험 점수를 표준점수로 바꾸는 것과 같습니다.

정규화와 달리 이상치의 영향을 덜 받으며, 데이터의 분포를 정규분포에 가깝게 만들어줍니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

# 원본 데이터 통계
print("원본 데이터:")
print(f"평균: {df['salary'].mean():.2f}, 표준편차: {df['salary'].std():.2f}")

# 표준화 적용
scaler = StandardScaler()
df_standardized = df.copy()
df_standardized[['age', 'salary']] = scaler.fit_transform(df[['age', 'salary']])

print("\n표준화 후:")
print(f"평균: {df_standardized['salary'].mean():.2f}, 표준편차: {df_standardized['salary'].std():.2f}")

# 수식으로 직접 계산하기
# z = (x - mean) / std
df['salary_standardized'] = (df['salary'] - df['salary'].mean()) / df['salary'].std()

김개발 씨가 혼란스러운 표정으로 물었습니다. "정규화랑 표준화, 둘 다 스케일 맞추는 건데 뭐가 다른 거죠?" 박시니어 씨가 종이를 꺼내 설명하기 시작했습니다.

"정규화는 모든 값을 0과 1 사이로 맞추는 거고, 표준화는 평균을 0, 표준편차를 1로 맞추는 거예요." 표준화는 학교에서 배우는 표준점수와 같은 개념입니다. 시험 점수를 예로 들어보겠습니다.

반 평균이 70점이고 표준편차가 10점일 때, 80점을 받은 학생의 표준점수는 (80-70)/10 = 1입니다. 평균보다 표준편차 1만큼 높다는 뜻입니다.

수식은 (현재값 - 평균) / 표준편차입니다. 이를 Z-score라고도 부릅니다.

표준화를 하면 데이터의 평균은 0이 되고, 표준편차는 1이 됩니다. 값의 범위는 정해져 있지 않습니다.

대부분의 값은 -3에서 3 사이에 분포하지만, 이상치가 있으면 그 범위를 벗어날 수 있습니다. 그렇다면 언제 정규화를 쓰고 언제 표준화를 쓸까요?

정규화는 값을 특정 범위로 제한해야 할 때 유용합니다. 예를 들어 이미지 픽셀값을 0~1 사이로 맞출 때 사용합니다.

하지만 이상치가 있으면 대부분의 값이 좁은 범위에 몰리는 문제가 있습니다. 표준화는 이상치가 있어도 상대적으로 덜 영향을 받습니다.

또한 많은 머신러닝 알고리즘이 데이터가 정규분포를 따른다고 가정하는데, 표준화가 이 가정에 더 잘 맞습니다. 선형 회귀, 로지스틱 회귀, PCA 등에서 표준화를 권장합니다.

sklearn의 StandardScaler를 사용하면 간단히 표준화를 적용할 수 있습니다. fit_transform으로 학습과 변환을 동시에 하고, 나중에 테스트 데이터에는 transform만 적용합니다.

실무에서는 어떻게 선택할까요? 일반적인 가이드라인은 이렇습니다.

데이터에 이상치가 있다면 표준화를, 특정 범위가 필요하다면 정규화를 사용합니다. 확실하지 않다면 둘 다 시도해보고 모델 성능을 비교하는 것도 좋은 방법입니다.

김개발 씨는 이해가 되었습니다. "정규화는 범위를 0~1로, 표준화는 분포를 평균 0, 표준편차 1로 맞추는 거군요.

목적에 따라 선택하면 되겠네요."

실전 팁

💡 - 이상치가 있으면 표준화가 더 안정적입니다

  • 정규분포를 가정하는 알고리즘(선형 회귀, PCA 등)에는 표준화를 적용하세요

6. 범주형 데이터 인코딩

김개발 씨가 고객 데이터를 모델에 넣으려는데 오류가 발생했습니다. 성별 컬럼에 남자, 여자라는 문자열이 들어 있었기 때문입니다.

머신러닝 모델은 숫자만 이해할 수 있는데, 이런 문자 데이터는 어떻게 처리해야 할까요?

인코딩은 문자로 된 범주형 데이터를 숫자로 변환하는 과정입니다. 마치 컴퓨터에게 사과=1, 바나나=2, 오렌지=3이라고 알려주는 것과 같습니다.

대표적으로 레이블 인코딩과 원-핫 인코딩 두 가지 방법이 있습니다.

다음 코드를 살펴봅시다.

import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

# 레이블 인코딩: 각 범주에 숫자 부여
le = LabelEncoder()
df['gender_encoded'] = le.fit_transform(df['gender'])
# 여자 -> 0, 남자 -> 1

# 원-핫 인코딩: 각 범주를 별도의 컬럼으로
df_onehot = pd.get_dummies(df, columns=['city'])
# city_서울, city_부산, city_대구 컬럼 생성

# sklearn의 OneHotEncoder 사용
ohe = OneHotEncoder(sparse=False)
city_encoded = ohe.fit_transform(df[['city']])

# 원본 매핑 확인
print(f"레이블 매핑: {dict(zip(le.classes_, range(len(le.classes_))))}")

김개발 씨가 모델을 학습시키려는데 에러가 발생했습니다. "could not convert string to float: 남자"라는 메시지였습니다.

박시니어 씨가 설명했습니다. "머신러닝 모델은 숫자만 처리할 수 있어요.

성별이나 도시명 같은 문자 데이터는 숫자로 바꿔줘야 해요. 이걸 인코딩이라고 합니다." 가장 간단한 방법은 레이블 인코딩입니다.

각 범주에 숫자를 부여하는 것입니다. 남자는 0, 여자는 1처럼요.

아주 직관적이고 구현하기 쉽습니다. 하지만 레이블 인코딩에는 함정이 있습니다.

서울=0, 부산=1, 대구=2로 인코딩했다고 합시다. 모델 입장에서는 대구가 서울보다 2배 크다고 해석할 수 있습니다.

도시 사이에 이런 수치적 관계는 없는데 말이죠. 이 문제를 해결하는 것이 원-핫 인코딩입니다.

각 범주를 별도의 컬럼으로 만들고, 해당하는 컬럼에만 1을 표시합니다. 예를 들어 서울에 사는 고객은 city_서울=1, city_부산=0, city_대구=0이 됩니다.

부산에 사는 고객은 city_서울=0, city_부산=1, city_대구=0이 됩니다. 이렇게 하면 도시 간에 수치적 대소 관계가 생기지 않습니다.

pandas의 get_dummies 함수를 사용하면 원-핫 인코딩을 쉽게 적용할 수 있습니다. 한 줄의 코드로 모든 범주형 컬럼을 변환할 수 있어서 매우 편리합니다.

그렇다면 언제 어떤 인코딩을 써야 할까요? 범주에 순서가 있으면 레이블 인코딩을 사용합니다.

예를 들어 학력(고졸, 대졸, 석사, 박사)은 순서가 있으므로 1, 2, 3, 4로 인코딩해도 괜찮습니다. 등급(브론즈, 실버, 골드, 플래티넘)도 마찬가지입니다.

순서가 없으면 원-핫 인코딩을 사용합니다. 도시, 색상, 브랜드 등은 서로 대등한 관계이므로 원-핫 인코딩이 적합합니다.

원-핫 인코딩의 단점도 있습니다. 범주가 많으면 컬럼 수가 급격히 늘어납니다.

도시가 100개라면 100개의 새 컬럼이 생깁니다. 이를 차원의 저주라고 하는데, 모델 학습이 어려워질 수 있습니다.

박시니어 씨가 조언했습니다. "범주가 너무 많으면 빈도가 낮은 범주들을 기타로 묶거나, 타겟 인코딩 같은 고급 기법을 고려해보세요." 김개발 씨는 성별은 레이블 인코딩을, 거주 도시는 원-핫 인코딩을 적용했습니다.

이제 모든 데이터가 숫자로 변환되었고, 모델 학습이 정상적으로 진행되었습니다.

실전 팁

💡 - 순서가 있는 범주는 레이블 인코딩, 없으면 원-핫 인코딩을 사용하세요

  • 범주가 너무 많으면 빈도가 낮은 값들을 기타로 묶어 차원을 줄이세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#DataPreprocessing#MachineLearning#Pandas#Scikit-learn#Machine Learning,Python

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.