본문 바로가기
AI 빅데이터/후려치는 데이터분석과 AI 알고리즘

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

by 마고커 2021. 1. 11.


머신러닝을 수행하는데 가장 오랜 시간을 쓰는 것은 어처구니 없게도 데이터 준비다.

 

<출처:Source: https://www.forbes.com/sites/gilpress/2016/03/23/data-preparation-most-time-consuming-least-enjoyable-data-science-task-survey-says/>

 

데이터를 EDA하면서 주요한 Feature를 Selection해 학습하게 되는데 그것만으로 충분하지 않은 경우가 있다. 데이터가 한쪽으로 치우쳤거나 Missing Value가 많은 경우가 그러한데, 이를 어느 정도 바로 잡아주는 것을 Feature Engineering이라고 한다. 아래 블로그는 기본적으로 많이 쓰이는 7가지의 Feature Engineering 기법을 소개한다.

 

 

7 Feature Engineering Techniques | Feature Engineering for ML

Feature enginnering techniques are a must know for machine learning professionals. Here are 7 such feature engineering techniques.

www.analyticsvidhya.com

 

1. Imputation (산입)

 

데이터 중에 Missing Value가 있다면 가장 쉽게는 해당 Row를 날려버리는 방법이 있다. 하지만, 그런식으로 날리다보면 데이터량이 줄어드는 문제점 뿐 아니라 다른 Column에는 충분한 정보량이 있음에도 이용할 기회를 놓치게 된다. 

 

  • Numerical Imputation: 숫자 칼럼에서는 Default 값으로 어울릴만한 숫자를 채워둔다
  • Categorical Imputation: 가장 빈번히 나타나는 값으로 채워둔다
  • Random Imputation: Random하게 채워둔다.

 

위 방법을 블로그에서는 소개하고 있지만, 시간이 오래 걸릴지라도 (KNN 등으로) 다른 칼럼의 데이터와의 유사도를 갖고 빈 데이터를 채워 넣는 것이 합리적이다.

 

2. 예외값 처리하기 (Handling Outliers)

 

예외값들 때문에 학습이 왜곡되는 경우가 종종있다. 이를 제거하는 데는 아래의 방법들이 사용된다.

 

  • 표준편차에서 예외적으로 나타내는 값들을 삭제
  • 특정 Percent외에 있는 값들을 삭제 (상위 5%, 하위 5% 등)

 

3. Bin으로 묶기 (Binning)

 

통계에서 Bin이라 하면 히스토그램의 하나의 막대 정도를 나타내는데, '통' 정도로 이해하면 될듯하다. 근처의 값들을 하나의 범주로 묶게 되면 좀 더 Robust한 모델을 얻을 수 있다. 물론 이에 따라 주요 정보를 잃을 수도 있어서 얼만큼을 하나의 Bin으로 묶을지 주의해야 한다.

 

 

4. 로그 변형 (Log Transform)

 

왜도(Skewnesss)와 첨도(Kurtosis)가 높은 데이터로는 상관성을 파악하기 어려울 수 있다. 이를 테면, 나이와 재산의 관계를 볼 때, 나이는 1~100까지의 범주를 갖지만, 재산은 0원에서 수조원까지 아주 넓게 분포할 수 있다. 게다가 특정 영역에 (이를테면 1억원) 치우쳐 있다면, 그 외의 값들은 왜곡되어 해석될 가능성이 높다. 이런 데이터를 정규분포에 맞게 변형 시켜주는 것이 Log-Transform이다. 아래 타이타닉 데이터의 예제를 보자. 

 

<출처: https://hong-yp-ml-records.tistory.com/28>

 

요금데이터인데 왼쪽으로 많이 치우쳐 있으므로 이를 정규화할 필요가 있다.

 

df_train["Log_Fare"] = np.log1p(df_train["Fare"]) 
f, ax = plt.subplots(figsize = (10, 6)) 
sns.distplot(df_train["Log_Fare"]) 

 

<출처: https://hong-yp-ml-records.tistory.com/28>

 

Probplot으로 검증해봐도 차이를 볼 수 있다.

 

<출처: https://hong-yp-ml-records.tistory.com/28>

 

5. One Hot Encoding

 

텍스트로 된 범주형 데이터를 학습에 이용하기 위해서는 숫자 타입으로 변형이 필요하다. 하지만, 단순히 순서를 부여하게 되면 때로는 순서를 넘어 크기로 인식할 수 있다. 이를 테면, 서울(1), 부산(2), 대전(3)으로 범주화하면 대전이 서울보다는 2보다 큰 무엇인가로 오해할 가능성이 생기는 것이다. 이를 방지하기 위해 각각의 데이터를 하나의 컬럼으로 만들고, 해당값이 있는 지를 0과 1로 표현하는 것을 one-hot encoding 이라고 한다.

 

<출처: https://stackoverflow.com/questions/34104422/one-hot-dummy-encoding-of-categorical-data-in-excel>

 

6. 그룹 연산 (Grouping Operation)

 

모든 행들 각각이 하나의 사건 혹은 의미를 담는다면 분석이 용이해진다. 이런 데이터를 'Tidy' 하다고 말하는데, 현실에서는 tidy 데이터가 아닌 경우가 많다. 이를 테면, 여행사의 DB라 한다면 한 사용자가 여러번의 Transaction을 일으킬 수도 있고, 공장의 센서데이터는 의미 없는 유사한 데이터를 지속적으로 발생시키기도 한다. 이런 데이터를 필요에 따라 묶어서 분석하는 것이 그룹 연산이다.

 

범주형 데이터는 액셀의 Pivot과 같이 만들어 사용할 수 있다. User 칼럼에 동일한 사용자가 여러번 나타나므로 City를 각각의 열로 만들어 테이블을 변형시켜 사용하기도 한다. (One-hot encoding과 유사하지만 0/1 대신 의미가 있으므로 aggregate된 숫자를 사용했다)

 

<출처: https://towardsdatascience.com/feature-engineering-for-machine-learning-3a5e293a5114>

 

숫자형 데이터는 Feature가 의미하는 바에 따라, id별로 합계를 하거나 평균을 내어 새로운 칼럼을 만들어 기존 테이블에 붙여 사용한다.

 

7. Scaling

 

위의 Log-Transform과 유사한 부분이 있지만, 아래의 기법들은 서로 다른 범위의 데이터들을 같은 범위로 묶어 학습을 용이하게 해준다.

아래 블로그에 잘 설명되어 있다. hleecaster.com/ml-normalization-concept/

 

Min-Max 정규화: 이용할 데이터의 범위를 0~1로 만들어준다. 다만, 데이터 분포도 변하지 않고 표준 편차가 줄어들어 outlier의 영향이 커질 수 있으므로 이를 미리 제거해 주어야 한다.

z-score 정규화: Outlier를 효과적으로 제거해 주지만, 정확히 동일한 척도로 데이터를 만들어주진 않는다.

 

실제 작업을 하다보면 특정 두 데이터를 붙이는 것이 좋기도 하고, 교호 작용이 있는 컬럼은 없애야 하기도 하고 여러가지들을 해야하지만, 위의 7가지는 기본으로 생각해 둘 필요가 있다.

 



댓글