머신러닝

[데이터 분석] Feature Engineering

CocoJamjam 2023. 4. 19. 11:07
728x90
반응형

머신러닝을 수행하는 데 있어 가장 오랜 시간이 필요한 부분은 데이터 준비이다.

데이터를 EDA(탐색적 자료분석)하면서 중요한 Feature를 Selection 하여 학습하게 되는데 단순히 그것만으로는 부족하다.

왜냐하면 데이터가 한쪽으로 치우쳤거나 Missing Value(결측치)가 많을 수 있기 때문이다.

이를 어느 정도 바로 잡아주는 것을 [ Feature Engineering ]이라고 한다.

 

 

Feature Engineering 이란?

  • 머신러닝 알고리즘이 잘 작동할 수 있도록 데이터 테이블의 컬럼(특징)을 생성하거나 선택하는 작업
    • Target 변수를 가장 잘 표현할 수 있도록 데이터를 가공해야 하고, 해당 도메인에 대한 지식이 필요하다.
  • 모델 성능에 미치는 영향이 크기 때문에 머신러닝 응용에 있어 가장 중요한 단계
  • 전문성과 시간, 비용이 많이 드는 작업 

Featur Engineering의 의의

1. You can isolate and highlight key information, which helps your algorithms “focus” on what’s important.

  - 주요 정보를 분리하고 강조하여 알고리즘이 이 중요한 정보에 '집중'할 수 있도록 도와준다.

2. You can bring in your own domain of expertise.

  - 자신만의 도메인을 도입할 수 있다.

3. Most importantly, once you understand the “vocabulary” of feature engineering, you can bring in other people’s domain expertise!

  - 가장 중요한 것은 Featur Engineering의 "어휘"를 이해하면 다른 사람의 도메인 전문 지식을 활용할 수 있다

 

Feature Engineearing의 핵심질문

1. What are the essential properties of the problem we’re trying to solve?

  - 해결하려고 하는 문제의 필수 속성은 무엇인가?

2. How do those properties interact with each other?

  - 이 속성들이 어떻게 상호 작용하는가?

3. How will those properties interact with the inherent strengths and limitations of our model?

  - 이 속성이 모델의 고유 강점과 한계에 어떻게 상호 작용할 것인가?

4. How can we augment our dataset so as to enhance the predictive performance of the AI?

  - AI의 예측 성능을 향상시키기 위해서는 Dataset을 어떻게 보완할 수 있는가?

 

  • 머신러닝은 입력되는 데이터에 따라 그 성능이 크게 좌우된다.
    • 가장 이상적인 데이터는 양과 질. 즉, 충분한 양과 정확한 정보만을 포함하는 경우이다
    • 하지만 대부분의 데이터는 이상적이지 않기 때문에 Feature Engineearing가 필요하다.
  • 충분한 양의 데이터를 수집하여 Learnig 단계로 넘어가기 전에 Feature에 대한 확인 과정을 거쳐야 한다.
    • 어떤 Feature를 사용할지 / 걸러낼지 를 확인하는 과정
    • 이 과정을 Feature Selection(특징선택) or Feature Extraction(특징 추출)이라고 한다.
  • 통계 회귀분석에서 독립변수의 개수가 많다고 해서 종속변수에 대한 설명력이 무조건 높지 않은 것처럼 데이터에서 Feature의 종류가 많다고 해서 정확도가 높지 않다.
    • 따라서 Feature를 적절히 Selection 하고 변환시켜야 한다.

Feature Engineearing의 방법

1.Imputation (추론)

  • Missing Values(결측치)는 데이터 수집에 있어 발생하는 가장 일반적인 문제중 하나이다.
  • 일부 알고리즘들은 Missing Values(결측치)를 포함한 행을 삭제해버리거나, 오류를 발생시킨다.

  (1) 해결책

  • Missing Values(결측치)를 포함한 row나 column을 전부 삭제
    • 데이터의 양이 줄어들 뿐 아니라 다른 column에 있는 유의미한 정보까지 삭제해 버리는 일이 발생할 수 있음.
    • 삭제에 대한 최적의 임계값은 없지만 70%를 예시 값으로 사용하고 이 임계값보다 높은 값을 가진 결측값이 있는 행과 열을 삭제해 볼 수 있다.
  • Numerical Imputation : 숫자형 데이터
    • 숫자 칼럼에서는 Default 값으로 어울릴만한 숫자로 대체 (평균, 중앙값, 최빈값 등)
    • 기본값을 고려해야함. (ex. 1과 NA만 있는 경우 NA는 0으로 대체)
    • 평균값은 이상값에 민감할 수 있음
    • 각 상황에 따라 합리적으로 선택
  • Categorical Imputation : 범주형 데이터
    • 대체로 최빈값 선택
    • 균일하게 분포되어 있거나 최빈값이 여러개 또는 차이가 크지 않을 때에는 '기타' 와 같은 새로운 범주를 대입
  • Random Imputation: 무작위 값으로 대체
  • 시간이 오래걸리더라도 다른 column과의 유사도를 가지도록 처리하는 것이 합리적이다.

2.Handling Outliers (이상값 처리)

  • 이상치는 일반적인 패턴을 따르지 않는 데이터이므로 머신러닝의 학습이 왜곡되는 경우가 발생한다.
  • 이상값은 시각화(Boxplot, Histogram, Scatter 등)을 통해 쉽게 확인할 수 있음.
    • 표준편차를 사용한 이상값 확인 : 어떠한 값과 평균과의 편차(거리)가 [ x*표준편차 ] 보다 크면 이상값으로 간주. (x는 일반적으로 2~4사이의 값)
    • 백분위수를 사용한 이상값 확인 : 특정 비율(상위/하위 5%)을 넘어가는 값 처리 
  • Outlier의 수가 많지 않거나, 하나의 열/행 에 많은 Outlier가 있다면 완전히 삭제하는 것이 좋다.
  • 상한 설정을 이용하면 데이터의 양을 유지할 수 있고 최종 모델 성능이 더 좋을 수 있으나 분포에 영향을 미칠 수 있다.

3.Binning (구간화)

Binning illustration of numerical data

  • 범주형 / 숫자형 데이터 모두에 적용 가능
#Numerical Binning Example
Value      Bin       
0-30   ->  Low       
31-70  ->  Mid       
71-100 ->  High

#Categorical Binning Example
Value      Bin       
Spain  ->  Europe      
Italy  ->  Europe       
Chile  ->  South America
Brazil ->  South America
  • Binning은 과적합을 방지하고 모델을 더 견고하게 만들 수 있지만, 주요 정보를 잃을 수 있다.
  • Binning Process의 핵심을 성능과 과적합 사이의 균형이다.
    • 데이터 정규화에 신경써야한다.
    • 숫자 데이터의 경우 명백한 과적합 사례를 제외하고는 Binning이 모델 성능에 악영향을 줄 수있다.
    • 범주형 데이터의 경우 빈도가 낮은 값들을 하나의 일반 범주로 할당하면 모델의 견고성을 향상시킨다. (ex. 데이터의 크기가 100,000개 일때, 개수가 100보다 작은 레이블을 '기타' 같은 새 범주로 통합)

4.Log Transform (로그 변환)

 로그 변환은 Feature Engineering에서 가장 일반적으로 사용되는 수학적 변환 중 하나이다.

대부분의 통계적 추론이나 모델 생성 기법에서는 변수들이 정규분포를 따른다는 가정을 시작으로 한다.

왜냐하면 왜도(Skewnesss)와 첨도(Kurtosis)가 높은 데이터로는 상관성을 파악하기 어려울 수 있다. 

특정 범위에 치우쳐져 있을 경우 그 외의 값들이 왜곡되어 해석될 가능성이 높기 때문이다.

 

아래는 Kaggle의 타이타닉 데이터를 통한 예제이다.

# Seaborn 시각화 그래프 : 히스토그램
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

# SalePrice에 대한 분포 히스토그램
fig, ax = plt.subplots(figsize = (10, 6))
sns.histplot(train['SalePrice'], color = 'b', stat = 'probability', kde = True)
ax.axvline(mu, color = 'r', linestyle = '--')
ax.text(mu + 10000, 0.10, 'Mean of SalePrice', color = 'r')

plt.show()

# 로그변환
import numpy as np 

train['SalePrice'] = np.log1p(train['SalePrice']) 
(mu, sigma) = norm.fit(train['SalePrice'])

# 로그변환한 분포 히스토그램
fig, ax = plt.subplots(figsize=(10, 6))
sns.histplot(train["SalePrice"], color = "b", stat = "probability", kde = True)
ax.axvline(mu, color="r", linestyle="--")
ax.text(mu + 0.05, 0.105, "Mean of SalePrice", color="r")

plt.show()

from scipy import stats

fig = plt.figure(figsize = (15,10))

fig.add_subplot(1,2,1)
res = stats.probplot(train['SalePrice'], plot=plt)

fig.add_subplot(1,2,2)
res = stats.probplot(train['Log_SalePrice'], plot=plt)

5.One-Hot Encoding

One-Hot Encoding은 머신러닝에서 가장 일반적인 인코딩 방범 중 하나이다.

문자형식의 범주형 데이터를 숫자형식으로 변경하여 정보의 손실없이 범주형 데이터를 그룹화 할 수 있다.

하지만, 단순히 숫자로 범주화를 한다면 문자들 사이에 크기/순위가 설정되버리는 오류가 발생 할 수 있다.

따라서 위와 같이 각각의 데이터를 하나의 Column으로 만들고 표현하고 싶은 단어의 Index에 1의 값, 다른 Index에는 0을 부여하는 방식으로 표현하는 것을 One-Hot Encoding이라 한다.

 

6.Grouping Operations (그룹 연산)

대부분의 머신러닝 알고리즘에서 오든 인스턴스들은 Dataset에서 row(행)으로 표시되며 각 column(열)은 인스턴스의 다른 특징을 보인다. 이러한 데이터를 [ 'Tidy' ] 라고 한다.

즉, Tidy는 모든 행들이 각각 하나의 의미를 담는다면 분석이 용이해진다.

  • 범주형 Column의 그룹화 (Categorical Column Grouping)
    • 가장 빈도가 높은 레이블을 선택 : 일반적으로 람다 함수 사용
    • 피벗 테이블 생성 : One-Hot과 유사하지만 열 사이의 값에 대해 aggregate한 수 사용, 병합하려는 경우 좋은 옵션
    • One-Hot Encoding 적용 후 기능별로 그룹화 : 모든 데이터를 보존

Pivot 테이블

  • 숫자형 Column의 그룹화 ( Numerical Column Grouping)
    • Feature가 의미하는 바에 따라 합계 및 평균을 사용하여 새로운 column으로 그룹화

 

 

7.Feature Split (Feature 분할)

  • Feature에서 머신러닝 알고리즘이 이해하기 편하도록 일부분만 추출하여 새로운 Feature 생성
  • Binnig이 가능해짐
  • 잠재적 정보를 발견하여 모델 성능 개선의 여지가 있음.

예를 들어 이름에서 성만 추출하거나. 주소지에서 도/시 내용만 추출 하는 것.

 

8.Scaling

데이터의 Feature들 사이에 Scale(범위)들이 심하게 차이가 나는 경우 모델 성능에 안좋은 영향을 미치게 된다.

Scaling은 이런 문제점을 해결하기 위해 동일한 정도의 Scale을 갖도록 도와주는 작업이다.

  • Normalization (정규화 (또는 Min-Max 정규화))
    • 정규화는 0 ~1 사이의 고정된 범위에서 모든 값의 배율을 조정한다.
    • 분포를 변경하지 않으며 표준편차가 감소하기 때문에 이상값의 영향이 증가한다.
    • 정규화하기 전에 Outlier(이상값)을 처리하는 것이 좋다.
  • Standardization (표준화 또는 Z-score 표준화)
    • 표준편차를 고려하면서 값의 크기를 조정
    • Feature의 표준편차가 다르면 범위도 다를 수 있음.
    • 이상값의 영향은 줄일 수 있다.

9.Extracting Date (날짜 추출)

날짜 열은 그 형식이 다양하기 때문에 알고리즘에서 무시되거나 무의미 해 질수있다.

'01-01-2023' 같은 형식으로 단순화 되어 있다면, 알고리즘이 값 사이의 서수관계를 구축하기 어렵다.

 

따라서 날짜에 대한 Feature를 Year, Month, Day, Weekday 등의 형식을 통해 각기 다른 column으로 추출하는 것이 좋다.

 

Feature Engineearing에 대한 생각

어떠한 데이터에 대해 머신러닝 알고리즘을 수행하기 위해서는 데이터에 대한 적절한 가공 및 전처리가 필요하다.

우리가 데이터에 대해 이 글에서 설명한 Feature Engineearing를 잘 수행해 내기 위해서는 그 데이터의 분야에 대한 도메인 지식이 필요하다.

항상 도메인에 대한 다양한 경험과 지식을 습득하는 것이 Feature Engineearing을 효과적으로 해낼 수 있는 첫걸음이라 생각한다. 

 

 

참고자료

https://towardsdatascience.com/feature-engineering-for-machine-learning-3a5e293a5114#3abe

 

Fundamental Techniques of Feature Engineering for Machine Learning

All required methods for comprehensive data preprocessing with Pandas examples.

towardsdatascience.com

https://magoker.tistory.com/118

 

[데이터분석] Feature Engineering 7가지 팁

머신러닝을 수행하는데 가장 오랜 시간을 쓰는 것은 어처구니 없게도 데이터 준비다. 데이터를 EDA하면서 주요한 Feature를 Selection해 학습하게 되는데 그것만으로 충분하지 않은 경우가 있다. 데

magoker.tistory.com

 

728x90
반응형