logo

[머신러닝] 데이터 전처리

 

누락된 데이터 처리

데이터 분석과 머신러닝 프로젝트에서 누락된 데이터 또는 결측치는 매우 일반적인 문제이며, 이를 적절히 처리하는 것은 모델의 성능에 큰 영향을 미칩니다. 아래는 결측치를 처리하는 몇 가지 방법에 대한 자세한 설명과 예시입니다.

 

결측치 삭제

행 삭제

결측치가 포함된 행을 완전히 삭제하는 방법입니다. 이 방법은 결측치가 상대적으로 적고, 삭제된 데이터가 분석 결과에 큰 영향을 미치지 않을 때 유용할 수 있습니다. 하지만, 너무 많은 행을 삭제하면 분석에 필요한 정보가 상실되어 모델의 정확도가 떨어질 수 있습니다.

import pandas as pd

# 데이터 프레임 생성
df = pd.DataFrame({
    'A': [1, 2, None, 4],
    'B': [5, None, 7, 8],
    'C': [9, 10, 11, 12]
})

# 결측치가 포함된 행 삭제
df.dropna(inplace=True)
열 삭제

결측치가 포함된 열을 완전히 삭제하는 방법입니다. 데이터 중에는 결측치의 비율이 높아, 해당 열을 분석에 사용하기 어려운 경우가 있습니다. 그러나 중요한 정보를 포함하고 있는 열을 삭제하면, 모델의 성능에 부정적인 영향을 미칠 수 있습니다.

# 결측치가 포함된 열 삭제
df.dropna(axis=1, inplace=True)
 

결측치 대체

평균, 중앙값, 최빈값 대체

결측치를 해당 열의 평균값, 중앙값 또는 최빈값으로 대체하는 방법입니다. 수치형 데이터에는 평균값이나 중앙값 대체를, 범주형 데이터에는 최빈값 대체를 사용할 수 있습니다. 이 방법은 데이터의 전반적인 분포를 크게 바꾸지 않으면서 결측치를 처리할 수 있는 장점이 있습니다.

# 평균값으로 결측치 대체
df['A'].fillna(value=df['A'].mean(), inplace=True)

# 중앙값으로 결측치 대체
df['B'].fillna(value=df['B'].median(), inplace=True)
예측 모델 사용

결측치가 있는 변수를 종속 변수로 하여 다른 변수들로부터 값을 예측하는 모델을 만들어 결측치를 대체할 수 있습니다. 이 방법은 결측치의 패턴이 무작위가 아닌 경우, 즉 다른 변수들과 관련이 있는 경우에 유용할 수 있습니다.

다중 대입 방법

결측치를 여러 번 반복해서 대체하는 방법으로, 각 반복마다 무작위 오차를 추가하여 여러 개의 완전한 데이터 세트를 생성합니다. 마지막에는 여러 결과를 종합하여 결측치를 대체합니다. 이 방법은 결측치 처리의 불확실성을 줄이는 데 도움이 될 수 있습니다.

 

결측치 표시

결측치를 처리하는 또 다른 방법은 누락된 값을 나타내는 별도의 카테고리나 수치를 할당하는 것입니다. 예를 들어, 나이가 누락된 사람들을 위해 '나이 미상'이라는 새로운 카테고리를 만들거나, 수치형 변수에는 특정 값을 할당하여 결측치를 명시적으로 표시할 수 있습니다.

# 누락된 값을 -1로 표시
df.fillna(value=-1, inplace=True)

결측치 처리 방법을 선택할 때는 항상 데이터의 특성과 분석 목적을 고려해야 합니다. 어떠한 방법도 모든 상황에 최적이라고 할 수 없으며, 경우에 따라 여러 방법을 결합하여 사용하는 것이 최선의 결과를 가져올 수 있습니다.


범주형 데이터 처리는 기계 학습 모델을 훈련시키기 전에 매우 중요한 단계입니다. 범주형 데이터를 모델이 이해할 수 있는 형태로 변환하지 않으면, 모델의 성능이 크게 떨어질 수 있습니다. 여기에는 주로 세 가지 주요 방법이 사용됩니다: 레이블 인코딩, 원-핫 인코딩, 그리고 임베딩입니다.

 

레이블 인코딩

레이블 인코딩(label encoding)은 각 범주를 고유한 정수로 변환하는 가장 간단한 방법입니다. 예를 들어, '빨강', '노랑', '파랑'과 같은 색상 범주가 있다면, '빨강'=1, '노랑'=2, '파랑'=3과 같이 매핑됩니다. 이 방법의 주요 단점은 변환된 숫자가 수학적인 의미를 가지게 되어, 모델이 잘못된 가정을 할 수 있다는 점입니다. 예를 들어, '파랑' > '노랑' > '빨강'처럼 순서가 있다고 착각할 수 있습니다.

Python 예시
from sklearn.preprocessing import LabelEncoder

# 범주형 데이터
categories = ['red', 'yellow', 'blue', 'red']

# 레이블 인코더 생성 및 적합
encoder = LabelEncoder()
integer_encoded = encoder.fit_transform(categories)
print(integer_encoded)
 

원-핫 인코딩

원-핫 인코딩(one-hot encoding)은 각 범주를 이진 특성으로 변환하여 처리하는 방법입니다. 이 방법은 각 범주를 대응되는 위치에 1, 나머지는 0으로 표시하는 방식으로, 길이가 N인 벡터에서 하나의 원소만 1이고 나머지는 0인 벡터로 변환하는 방식입니다. 이는 레이블 인코딩의 한계를 극복하여 모델이 범주 간 수치적 크기를 오해하는 것을 방지합니다.

Python 예시
from sklearn.preprocessing import OneHotEncoder
import numpy as np

# 범주형 데이터를 numpy 배열로 변환
categories = np.array(['red', 'yellow', 'blue', 'red']).reshape(-1, 1)

# 원-핫 인코더 생성 및 적합
encoder = OneHotEncoder(sparse=False)
onehot_encoded = encoder.fit_transform(categories)
print(onehot_encoded)
 

임베딩

임베딩(embedding)은 고차원의 범주형 데이터를 저차원의 연속형 벡터로 변환하는 기법입니다. 이는 주로 딥러닝에서 사용되며, 범주형 변수를 더 밀집된 형태의 벡터로 매핑하는데 사용됩니다. 임베딩은 각 범주 사이의 관계를 학습할 수 있어 더 복잡한 패턴을 감지하는 데 유용합니다. 예를 들어, 단어 임베딩에서 '왕'(king)과 '남자'(man) 사이의 관계와 '여왕'(queen)과 '여자'(woman) 사이의 관계를 학습할 수 있습니다.

임베딩은 일반적으로 딥러닝 모델의 일부로 구성되며, 특히 자연어 처리(NLP) 분야에서 널리 사용됩니다. TensorFlow, PyTorch 등의 딥러닝 프레임워크에서는 임베딩 레이어(embedding layer)를 사용하여 이 과정을 간편하게 구현할 수 있습니다.

범주형 데이터를 처리하는 방법을 선택할 때에는 데이터의 특성과 모델의 유형을 고려해야 합니다. 간단한 모델의 경우 레이블 인코딩이나 원-핫 인코딩을 사용할 수 있지만, 복잡한 모델에서는 임베딩이 더 높은 성능을 발휘할 수 있습니다.

Previous
모델 평가 지표