top of page

3.2 데이터 전처리 심화

키워드 : 특성 선택, 피처 선택, 피처 추출, 특성 추출, 피처 엔지니어링, 특성 엔지니어링, 데이터 전처리, 결측값, 이상치, 원핫인코딩, 레이블 인코딩, 스케일링, 표준화, 정규화, 머신러닝, 딥러닝, AI, 파이썬, 데이터 분석, 데이터 시각화, EDA, 데이터 수집, 데이터 모델링

01. 깊이 있는 데이터 전처리의 필요성

Da_ta-006.png

데이터 분석, 프로그래밍 업계에서 매우 유명한 말이 있습니다. 바로 “GIGO : Garbage In Garbage Out”인데요. 직역하면 “쓰레기를 넣으면 쓰레기가 나온다”라는 뜻으로, 아무리 좋은 모델이라도 좋지 못한 데이터를 넣으면 결과물 또한 절대 좋을 수 없다는 뜻입니다.

그만큼 데이터 분석에 있어서 잘 정리된 데이터는 중요합니다. 아무리 최신의 성능 좋은 모델링 기법이나 좋은 툴을 사용한다고 하더라도 충분한 양의 잘 정리된 데이터가 전제되지 않는 한, 절대 좋은 데이터 분석 결과물을 만들어 낼 수 없습니다. 특히 실무에서 만나게 되는 데이터는 정돈되지 않은 비정형 데이터인 경우가 대부분이므로 앞선 포스팅에서 살펴본 기본적인 전처리 기법 외에도 상황에 맞는 추가적인 전처리 작업이 필요합니다. 그 중 대표적인 기법 몇가지를 소개하면 다음과 같습니다.

 

02. Feature Selection (특성 선택)

Feature Selection은 모델을 구축하기 위해 가장 중요한 특성(변수 또는 열)을 선택하는 프로세스입니다. 불필요한 특성을 제거하거나 관련성이 낮은 특성을 걸러내어 모델의 복잡성을 줄이고 성능을 향상시킬 수 있습니다. 모든 특성이 중요한 경우도 있으므로 무조건적인 제거 보다는 상황에 따른 판단이 필요합니다. 특성 선택은 과적합(overfitting)을 방지하고 모델의 해석력(Interpretability)을 향상시킬 수 있지만, 선택된 특성만으로 모델의 전체 성능이 제한될 수도 있습니다. 코드로 예시를 보여드리겠습니다.

from sklearn.datasets import load_iris

from sklearn.feature_selection import SelectKBest, f_classif

# 데이터 불러오기

data = load_iris()

X, y = data.data, data.target

 

# 특성 선택

k = 2 # 선택할 특성의 개수

selector = SelectKBest(score_func=f_classif, k=k)

X_new = selector.fit_transform(X, y)

 

# 선택된 특성 확인

selected_features = selector.get_support(indices=True)

print("Selected feature indices:", selected_features)

위 코드에서는 SelectKBest 클래스를 이용하여 Anova F-value를 기준으로 주어진 수(k)만큼 최상의 특성을 선택하였습니다. 이는 특성을 선택하는 여러가지 방법 중 하나이며, 그 외에도 여러가지 방법과 기준이 존재합니다. 그 중 대표적인 몇가지 방법과 기준을 소개해드리겠습니다.

먼저 Feature Selection을 수행할 때 사용하는 다양한 방법과 기준은 다음과 같습니다:

a. Filter Methods (필터 방법):

특성과 타겟 간의 통계적 관계를 기반으로 특성을 선택합니다. 별도의 모델을 만들 필요 없이 특성을 선택하는 것이 장점입니다. 상관 계수, 분산 분석(ANOVA), 카이제곱 검정 등을 사용하여 특성을 선택합니다.

 

b. Wrapper Methods (래퍼 방법):

실제 모델을 사용하여 특성을 평가하고 선택합니다. 특성 선택을 모델의 성능 향상으로 연결할 수 있습니다. 재귀적 특성 제거(RFE), 순차 후진 선택(SBS) 등이 있습니다.

 

c. Embedded Methods (임베디드 방법):

모델 훈련 과정에서 특성 선택이 내장되어 있습니다. 모델 자체가 가중치를 통해 특성의 중요도를 학습합니다. LASSO (L1 규제), 결정 트리 기반 특성 중요도 등이 있습니다.

다음으로 Feature Selection 기준은 다음과 같이 정의될 수 있습니다:

a. 통계 기반 기준:

특성과 타겟 사이의 통계적 관계를 측정하여 선택합니다. 예를 들어, 상관 계수, 분산 분석, 카이제곱 검정 등을 사용할 수 있습니다.

b. 모델 기반 기준:

모델을 통해 특성의 중요도를 추정하여 선택합니다. 특히 임베디드 방법과 관련이 있습니다. 예를 들어, 결정 트리, 랜덤 포레스트, LASSO 등을 사용합니다.

c. 반복적 기준:

래퍼 방법에서 사용되며, 초기 모델을 만든 후 특성을 하나씩 추가하거나 제거하며 성능을 평가합니다. 최적의 특성 집합을 찾습니다.

이러한 방법과 기준을 조합하여 데이터와 문제에 가장 적합한 Feature Selection 전략을 선택할 수 있습니다. 주어진 데이터의 특성과 모델 목표에 따라 선택된 특성들이 어떤 영향을 미칠지를 고려하여 결정하는 것이 중요합니다.

03. Feature Extraction (특성 추출)

Feature Extraction은 원래의 데이터로부터 새로운 특성을 생성하거나 변환하여 데이터를 더 간결하고 의미 있는 형태로 변환하는 과정입니다. 고차원의 데이터를 낮은 차원으로 변환하거나, 노이즈를 제거하고 중요한 정보를 보존하면서 데이터를 압축하는 등의 목적으로 사용됩니다.

Feature Extraction은 데이터의 복잡성을 줄이고 모델의 성능을 개선할 수 있지만, 일부 정보의 손실이 발생할 수 있습니다. 또한, 도메인 지식을 활용하여 특성을 설계하거나 다양한 변환 기법을 사용하여 효과적인 Feature Extraction을 수행하는 것이 바람직합니다. 코드로 예시를 보여드리겠습니다.

import numpy as np

from sklearn.decomposition import PCA

 

# 랜덤 데이터 생성

np.random.seed(0)

X = np.random.rand(100, 3)

 

# PCA 모델 생성 및 적용

pca = PCA(n_components=2)

X_new = pca.fit_transform(X)

 

# 결과 확인

print("원본 데이터 차원:", X.shape)

print("축소된 데이터 차원:", X_new.shape)

위 코드에서는 데이터를 낮은 차원으로 변환하는 대표적인 Feature Extraction 기법인 주성분 분석(Principal Component Analysis, PCA)를 사용하여 원래 3차원 데이터를 2차원으로 축소했습니다. PCA는 데이터의 주성분을 추출하여 차원을 줄이는데, n_components 매개변수를 통해 축소할 차원의 수를 지정할 수 있습니다.
 

PCA 외 다양한 특성 추출 기법들 중 몇가지를 추가로 설명 드리겠습니다.
 

a. 자동 인코더 (Autoencoder):

입력 데이터를 저차원으로 압축하고 복원하여 중요한 특성을 추출하는 신경망 기반 비지도 학습 알고리즘입니다.
 

b. t-SNE (t-Distributed Stochastic Neighbor Embedding):

고차원 데이터를 저차원으로 매핑하여 데이터 간의 관계를 시각화하는 비선형 차원 축소 기법입니다.
 

c. LDA (Latent Dirichlet Allocation):

토픽 모델링을 통해 주제를 추출하는 알고리즘으로, 문서의 주제 구조를 파악하는 데 사용됩니다.

이러한 특성 추출 기법은 데이터의 복잡성을 낮추거나 의미 있는 정보를 추출하는 데 활용되며, 각 기법은 다양한 분야에서 활용될 수 있습니다. 사용 전에 각 기법의 특징과 설정을 이해하고 데이터와 목표에 따라 적절한 특성 추출 방법을 선택하고 조정해야 합니다.

04. Feature Engineering (특성 엔지니어링)

Feature Engineering은 기존의 원시 데이터를 더 유용하고 효과적인 형태로 변환하거나 새로운 특성을 생성하여 모델의 성능을 향상시키는 프로세스입니다. 데이터의 도메인 지식과 창의성을 활용하여 특성을 조작하고 선택함으로써 모델의 예측 능력을 개선합니다.

Feature Engineering은 모델의 성능에 큰 영향을 미치며, 특성이 모델에 주는 영향을 이해하고 적절한 변환을 선택하는 것이 중요합니다. 너무 복잡하거나 불필요한 특성을 생성하면 모델의 과적합을 유발할 수 있습니다. 코드로 예시를 보여드리겠습니다.

import pandas as pd

from sklearn.preprocessing import OneHotEncoder

 

# 더미 데이터 생성

data = {'color': ['Red', 'Green', 'Blue', 'Red', 'Green']}

df = pd.DataFrame(data)

 

# 원-핫 인코딩

encoder = OneHotEncoder()

encoded_features = encoder.fit_transform(df[['color']]).toarray()

 

# 결과 확인

encoded_df = pd.DataFrame(encoded_features, columns=encoder.get_feature_names_out(['color']))

print(encoded_df)

위 코드에서 OneHotEncoder는 범주형 변수인 'color'를 원-핫 인코딩하여 새로운 특성으로 변환합니다. 이를 통해 각 범주가 이진 특성으로 표현되어 모델에 입력할 수 있게 됩니다.

특성 엔지니어링은 데이터의 종류와 문제에 따라 아래와 같은 다양한 방법을 사용할 수 있습니다.

a. 수치 데이터의 스케일 조정:

데이터의 범위를 조정하여 모델이 공평하게 특성을 고려하도록 돕는 것입니다. 정규화(0~1 범위), 표준화(평균 0, 표준편차 1 조정) 방법을 사용합니다.

 

b. 시계열 데이터의 시간 관련 특성 추출:

시간에 따른 변화를 모델에 반영하기 위해 시간 관련 정보를 추출하는 것입니다. 날짜, 시간, 요일 등 추출 및 이동 평균, 지수 가중 이동 평균과 같은 시계열 특성을 생성합니다.

 

c. 텍스트 데이터의 단어 임베딩:

텍스트를 모델이 이해할 수 있는 형태로 변환하여 처리하기 위한 것입니다. 단어를 수치형 벡터로 변환하여 단어 간 의미 관계를 나타냅니다.

05. Feature Extraction와 Feature Engineering의 차이

여기까지 알고 나면 ‘그럼 Feature Extraction와 Feature Engineering은 같은건가? 차이가 있나?’라는 의문이 드실 수 있습니다. 간략히 말씀드리자면 Feature Extraction과 Feature Engineering은 둘 다 데이터의 특성을 변환하거나 새로운 특성을 생성하는 과정이지만, 주로 그 목적과 방식에서 차이가 있습니다.

더욱 정확히 이해하기 위해 각각의 목적과 방식에 따른 차이를 살펴보겠습니다.

 

Feature Extraction (특성 추출):

  • 목적: 고차원의 데이터를 낮은 차원으로 축소하거나, 데이터의 주요 정보를 보존하면서 데이터를 변환하는 것이 목적입니다.

  • 방식: 기존의 특성을 조합하거나 변환하여 새로운 저차원 특성을 생성합니다. 주로 수학적 기법이 사용되며, 주성분 분석(PCA), t-SNE 등이 여기에 해당합니다.

  • 예시: 이미지 데이터의 주요 특징을 추출하기 위해 컨볼루션 신경망의 중간층을 활용하여 특성을 추출하는 것.

 

Feature Engineering (특성 엔지니어링):

  • 목적: 기존의 특성을 변환하거나 새로운 특성을 생성하여 모델의 성능을 향상시키는 것이 목적입니다.

  • 방식: 도메인 지식을 활용하여 특성을 선택, 변환 또는 생성합니다. 주로 데이터의 의미와 관련된 특성을 찾는 것이 중요합니다.

  • 예시: 텍스트 데이터에서 단어 임베딩을 사용하여 단어를 수치형 벡터로 변환하거나, 시계열 데이터에서 날짜와 시간을 추출하여 시간 관련 특성을 생성하는 것.

 

요약하자면 Feature Extraction은 주로 데이터 차원을 축소하거나 데이터의 중요 정보를 추출하는 것에 초점을 두고 있으며, Feature Engineering은 데이터의 의미를 파악하여 모델 성능을 개선하기 위해 특성을 선택, 변환 또는 생성하는 것에 중점을 둡니다. 두 기법 모두 데이터를 더 효과적으로 활용하기 위한 목적으로 사용된다는 점은 같습니다.

bottom of page