본문 바로가기
동굴 속 정보

피처엔지니어의 정형 데이터 뽀개기

by 도시형닌자 2020. 6. 9.

[ 정형 데이터 ]

정형(Structured)이란?

사전적 의미로 몸을 가지런히 한다. 라는 의미이다.

데이터 베이스에 존재하는 데이터를 정형 데이터라고 한다.

각 컬럼별로 나뉘어져 존재하는 데이터로 값을 확인하기에 불편하지 않다.

즉 데이터가 가지런이 존재한다.

 

비정형(Unstructured)이란?

일정한 형식이 정해지지 않을 것을 말한다.

대표적으로 이미지, 음파, 자연어 라고 볼 수 있다.

 

 

 

 

 

[ 카테고리 데이터 다루기 ]

내가 이 글에서 다루는 데이터는 정형 데이터이다.

정형 데이터는 필연적으로 카테고리 데이터(Categorical Data)와 만나게 된다.

카테고리 데이터를 다루는 인코딩 방법은 4가지 정도로 볼 수 있다..

그 중 One Hot Embedding과 Entity Embedding이 유용하게 사용된다.

 

  • Label Encoding
    • 아무런 의미없이 INT 형으로 0,1,2,3.... 이라는 값을 붙여서 나눈다.
    • 예를 들어 월요일은 1, 화요일은 2, 수요일은 3... 등 을 말한다.
    • 정말 예측률이 낮아지는 인코딩으로 사용을 지양한다.
  • One Hot Encoding
    • 설문지같이 거짓 정보가 많은 데이터(노이즈가 많은)에 효과가 좋다.
    • One Hot Encoding은 분류를 몇개로 나눌지 정한다.
    • 7개면 0 0 0 0 0 0 0 라는 형식이 된다.(index 0~6)
    • 예를 들어, 라면이 0이면 1 0 0 0 0 0 0 이 된다.
    • 예를 들어, 김밥이 1이면 0 1 0 0 0 0 0 이 된다.
  • Entity Embedding
    • 유사한 데이터를 비슷한 값으로 구성하게 해주는 임베딩 방법이다.
    • 카테고리 데이터를 One Hot Encoding으로 변환해서 Entity Embeding을 한다.
    • Embdding하면 X,Y,Z 값을 가지게 된다.
    • 실제 X,Y,Z를 tsne 같은 걸로 클러스터링하면 라벨끼리 묶인다.
  • Target Mean Encoding
    • 특정 값의 중간 값을 가지고 카테고리를 나눈다.
    • 예를 들어, 구간을 정해서 0~10의 중간값은 0 이 된다.
    • 예를 들어, 구간을 정해서 11~20의 중간값은 1 이 된다.
    • K-Fold(크로스 밸리데이션) 할때 사용할 수 있다.
    • Mean 외는 Frequency가 있다.

 

 

 

 

[ 데이터 정규화 ]

 

데이터의 분포를 정규분포에 가깝게 만들기 위해서 데이터를 정규화한다.

정규분포에 가깝게 만드는 이유는 단순히 이런 분포가 학습이 더 잘되기 때문이다.

 

정규분포가 왜 학습이 잘되는지는 가만히 생각해보면 알 수 있다.

가운데를 기준으로 평범한 사람이라고 하고

왼쪽은 멍청한 사람, 오른쪽을 똑똑한 사람이라고 해보자

정말 멍청한 사람도 점점 적어지고 정말 똑똑한 사람도 점점 적어진다.

이러한 현상은 현실과 비슷하다.

 

데이터를 현실과 가깝게 하는 것!

그것이 데이터를 학습시킬때 좋은 성과를 가져다 준다.

 

데이터를 정규화하는 방법 중에서 많이 사용하는 것이 두가지 있다.

log1p와 sqrt이다. 이 중에 log1p의 사용 빈도가 더 많다.

 

log1p를 사용해서 데이터를 정규화 했을때

아래와 같은 모양으로 정규화 된다면, 학습에서 좋은 결과를 예측해 볼 수 있다.

 

 

 

 

 

[ 크로스 밸리데이션 ]

피쳐 엔지니어링을 통해서 데이터를 가공했다면

다음으로 집중해야 하는 항목이 바로 크로스 밸리데이션(Cross Validation)이다.

어떻게 어떠한 비중으로 크로스 밸리데이션을 하는지에 따라 프로젝트의 성패가 나뉜다.

 

가장 중요한건 Training Data에도 있는 데이터가 Test Data에도 있어야 한다.

만약 없다고 한다면, 최대한 비슷하게 데이터를 구성해야 한다.

 

Training Data 학습 후, Test Data에서 예측을 할때,

Test Data에 존재하는 Training Data에 없는 데이터가 존재한다면,

Test Data의 예측률이 낮아질 수 밖에 없다.

 

K-Fold는 기본적으로 5개로 진행한다.

물론 자원이 많을 경우, 더 많이 해도 상관없다.

하지만 거대 시스템이 아니고 노트북에서는 5개도 충분하다.

 

K-Fold에서 Target Mean Encoding을 진행할 때는

Split1에서  Fold1을 제외하고 Fold2 ~ fold5까지 Mean을 진행하고 Fold1을 예측한다.

즉 1을 밸리데이션 2, 3, 4, 5는 트래이닝을 한다는 말이다.

 

Split2에서는 Fold2을 제외하고

Fold1, Fold3, Fold4, Fold5로 Mean을 진행하고 Fold2을 예측한다.

즉 2를 밸리데이션 1, 3, 4, 5는 트래이닝을 한다는 말이다.

 

Split5까지 위와 같은 방법으로 진행한다.

 

데이터는 random_state으로 데이터를 나누는데,

값은 항상 같은 값으로 고정하여 나중 실험에서도 같은 성과가 나도록 해야한다.

그리고 데이터가 편향되지 않도록 그냥 K-Fold가 아닌 Stratified KFold를 사용하는 것이 좋다.

Stratified KFold를 사용할 경우 라벨이 균일적으로 들어가게 된다.

 

마지막으로 OOF(Out of Fold)이다.

1개의 Split에서 나온 에러값(예를들어, RMSE)은 나머지 Split에서 나온 에러값과 비슷해야 한다.

그렇지 않다면 Fold가 잘못 나누어진 것으로 데이터를 재분배해야 한다.

 

OOF 전체 에러를 모아서 cumpute_remse를 통해 평가할 수 있다.

방법 : rmse = compute_rmse(oof_predictions, y_train)

 

참고로 에러값 RMSE는 실제 값과 예측값이 같으면 0이고

실제값과 예측값이 다를 수록 많은 패널티로 인해 값이 커진다.

Train의 RMSE가 Valid의 RMSE의 값보다 너무 작으면 오버피팅되고 있는 것이다.

이때 컬럼을 그룹화할 경우 해결되는 경우가 많다.

 

 

 

이제 피쳐셀렉션(Feature Selection)을 알아보자