머신러닝

머신러닝 기초 – 데이터 전처리(Data Preprocessing) 베스트 프랙티스

move84 2025. 2. 20. 23:36
반응형

데이터 전처리(Data Preprocessing)는 머신러닝 모델의 성능을 결정짓는 중요한 단계다. 데이터가 정리되지 않은 상태에서 학습하면 모델이 오작동하거나 성능이 저하될 수 있다. 이번 글에서는 머신러닝에서 데이터 전처리를 수행하는 최적의 방법(베스트 프랙티스)을 소개한다.


🔍 데이터 전처리란?

데이터 전처리(Data Preprocessing)는 원본 데이터를 분석 가능하도록 정리하고 변환하는 과정이다. 이 과정에는 결측값 처리, 이상치 탐지, 데이터 스케일링, 특성 선택(feature selection), 인코딩 등이 포함된다.

🏆 데이터 전처리가 중요한 이유

  • 데이터 품질 향상 → 노이즈 제거 및 데이터 정리
  • 모델 성능 향상 → 불필요한 정보 제거, 데이터 균형 맞추기
  • 학습 속도 증가 → 차원 축소 및 최적화 수행
  • 일반화 능력 개선 → 과적합(overfitting) 방지

📌 데이터 전처리 베스트 프랙티스

1️⃣ 데이터 탐색 및 이해

데이터를 분석하기 전에 반드시 데이터의 분포와 특성을 파악해야 한다. 주요 탐색 방법은 다음과 같다.

✅ 데이터 정보 확인

import pandas as pd

df = pd.read_csv("data.csv")  # 데이터 불러오기

print(df.info())  # 데이터 타입 및 결측값 확인
print(df.describe())  # 기초 통계량 출력
print(df.head())  # 데이터 미리보기

✅ 데이터 시각화

import matplotlib.pyplot as plt
import seaborn as sns

# 히스토그램으로 데이터 분포 확인
df.hist(figsize=(10, 6))
plt.show()

# 상관관계 히트맵
sns.heatmap(df.corr(), annot=True, cmap="coolwarm")
plt.show()

2️⃣ 결측값(Missing Values) 처리

결측값이 포함된 데이터는 모델 성능을 저하시킬 수 있으므로 반드시 처리해야 한다.

✅ 결측값 확인

print(df.isnull().sum())  # 결측값 개수 확인

✅ 결측값 처리 방법

  • 삭제(Removal): 결측값이 많지 않을 경우 해당 행 또는 열 삭제
  • 대체(Imputation): 평균, 중앙값, 최빈값 등으로 채우기
  • 예측(Prediction): 머신러닝 모델을 활용하여 결측값 보정

🔹 결측값을 평균값으로 채우기

df.fillna(df.mean(), inplace=True)

🔹 결측값을 중앙값으로 채우기

df.fillna(df.median(), inplace=True)

🔹 특정 열의 결측값을 최빈값으로 채우기

df['column_name'].fillna(df['column_name'].mode()[0], inplace=True)

3️⃣ 이상치(Outliers) 탐지 및 처리

이상치는 데이터 분포를 왜곡할 수 있으므로 적절히 처리해야 한다.

✅ 이상치 탐지 방법

  • Z-Score
  • IQR(사분위 범위)
  • 머신러닝 기법 (Isolation Forest, DBSCAN)

🔹 IQR을 활용한 이상치 탐지 및 제거

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1

# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 제거
df_cleaned = df[~((df < lower_bound) | (df > upper_bound)).any(axis=1)]

4️⃣ 데이터 스케일링(Data Scaling)

특정 머신러닝 알고리즘(예: KNN, SVM, 신경망)은 데이터 스케일이 다를 경우 성능이 저하될 수 있다. 따라서 데이터를 정규화(Normalization)하거나 표준화(Standardization)하는 것이 중요하다.

✅ 스케일링 방법

  • 표준화(Standardization, Z-score scaling)

    • 평균이 0, 표준편차가 1이 되도록 변환
    • X_scaled = (X - mean) / std
    • SVM, KNN, PCA에 유용
  • 정규화(Normalization, Min-Max scaling)

    • 데이터를 [0, 1] 범위로 변환
    • X_scaled = (X - X_min) / (X_max - X_min)
    • 딥러닝, 신경망에 적합

🔹 StandardScaler (표준화) 적용

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

🔹 MinMaxScaler (정규화) 적용

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)

5️⃣ 범주형 데이터(Categorical Data) 인코딩

머신러닝 모델은 문자형 데이터를 직접 처리할 수 없기 때문에 숫자로 변환해야 한다.

✅ 범주형 데이터 인코딩 방법

  • 레이블 인코딩(Label Encoding)
    • 각 카테고리를 숫자로 변환 (순서가 있는 데이터에 적합)
  • 원-핫 인코딩(One-Hot Encoding)
    • 이진 벡터로 변환 (순서가 없는 범주형 변수에 적합)

🔹 레이블 인코딩(Label Encoding)

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
df['category'] = encoder.fit_transform(df['category'])

🔹 원-핫 인코딩(One-Hot Encoding)

df_encoded = pd.get_dummies(df, columns=['category'])

6️⃣ 데이터 분할 (Train/Test Split)

모델의 성능을 검증하기 위해 데이터를 훈련 세트(Train)와 테스트 세트(Test)로 분리해야 한다.

🔹 80:20 비율로 데이터 분할

from sklearn.model_selection import train_test_split

X = df.drop('target', axis=1)  # 독립 변수
y = df['target']  # 종속 변수

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

🏁 정리

단계 주요 작업 방법
데이터 탐색 데이터 이해 .info(), .describe(), 시각화
결측값 처리 결측 데이터 제거 또는 대체 평균, 중앙값, 최빈값 대체
이상치 탐지 데이터 분포 확인 Z-Score, IQR, 머신러닝 기법
데이터 스케일링 데이터 정규화 또는 표준화 StandardScaler, MinMaxScaler
범주형 데이터 변환 숫자로 변환 LabelEncoder, OneHotEncoder
데이터 분할 훈련/테스트 데이터 나누기 train_test_split()

🔑 키워드

  • 데이터 전처리
  • 결측값 처리
  • 이상치 탐지
  • 데이터 스케일링
반응형