지난 시간에는 나누어져 있는 데이터를 특정 ID를 기준으로 결합하는 것에 대해 알아보았습니다.
사실 책의 순서로 따지면 분할 파트가 있지만 이 부분은 머신러닝에서 다루는 게 더 나은 것 같아 제외했습니다.
이번 시간에는 데이터를 생성하는 방법에 대해 알아보겠습니다.
생성
머신러닝에서 모델으로 예측을 할 때 학습 데이터가 불균형하면 예측 정확도가 떨어지는 경우가 많습니다.
데이터 불균형이란 어느 분류에 속하는 데이터 수가 다른 분류에 속하는 데이터에 비해 매우 적은 상태를 의미합니다.
이러한 데이터 불균형을 대처하는 방법은 크게 두 가지가 있다고 합니다.
※ 더 다양한 방법이 있을 수 있지만 책의 내용을 기준으로 얘기해 보도록 하겠습니다.
첫 번째는 머신러닝 모델을 만들 때 가중치를 부여하는 것입니다.
원본 데이터를 변경하지 않고 적은 데이터에 가중치를 올려 불균형한 데이터로 학습시킬 수 있습니다.
만약 데이터가 9:1로 나누어져 있다면 전체 train loss도 편중되어 있을 것입니다.
그럼 모델은 9에 해당하는 부분에 맞춰진 모델이 될 것입니다.
따라서 loss에 가중치를 취함으로써 적은 부분의 경향도 민감하게 반응할 수 있도록 맞춰주는 방식입니다.
두 번째는 데이터를 변경하여 불균형한 상태를 해소하는 방법입니다.
이는 크게 세 종류로 나눌 수 있습니다.
- 적은 데이터를 늘리는 오버샘플링
- 많은 데이터를 줄이는 언더샘플링
- 두 가지 방법을 모두 사용
언더 샘플링
언더 샘플링은 오버샘플링과 비교해 상대적으로 쉬운 작업입니다.
왜냐하면 데이터를 생성하는 것이 아닌 선택하는 방법이기 때문입니다.
하지만 언더 샘플링은 데이터를 걸러서 정보량을 적게 만드는 방법이기 때문에 되도록 사용하지 않는 편이 좋다.
이는 이전에 알려드렸던 '추출' 부분을 통해서 구현할 수 있습니다.
오버 샘플링
오버 샘플링은 원본 데이터에서 새로운 데이터를 생성합니다.
그중 하나는 랜덤 샘플링으로 원래 데이터 수보다 많은 데이터를 추출하는 것입니다.
하지만 이는 완전히 똑같은 데이터가 생성되기 때문에 over fitting이 발생할 수 있습니다.
이러한 문제를 해결하기 위해 만들어진 여러 기법 중 SMOTE(Sytthetic Minority Over Sampling Technique)가 있습니다.
SMOTE는 오버샘플링을 할 때 원본 데이터를 기반으로 새로운 데이터를 생성하는 방법입니다.
SMOTE로 생성된 데이터는 원본 데이터와 같은 특성을 유지하면서 약간의 노이즈를 더한 데이터를 의미하기 때문에 원본 데이터를 복사하는 것보다 좀 더 자연스러운 값을 가지게 됩니다.
하지만 SMOTE는 샘플링 원본 데이터끼리의 직선상 값을 샘플링하는 방법입니다.
즉, 차원 수가 큰 경우에는 편중된 샘플링이 되기 쉽습니다.
이런 경우에는 언더 샘플링과 배깅을 조합하여 예측 모델을 구축하는 것이 안정적입니다.
from imblearn.over_sampling import SMOTE
sm = SMOTE(sampling_strategy = "auto", k_neighbors = 5, random_state = 71) # ratio: 불균형 데이터에서 적은 열의 데이터를 많은 열의 몇할 까지 늘릴건지 설정 auto: 동일하게
balance_data, balance_target = sm.fit_resample(production_df[["length", "thickness"]],
production_df["fault_flg"])
이번 시간에는 데이터의 balance를 맞추기 위한 방법들에 대해 알아보았습니다.
힘들게 데이터를 수집하였지만 막상 분포를 확인해 보니 편향된 분포를 띄는 경우가 종종 있습니다.
이런 경우에 언더 샘플링 혹은 오버 샘플링을 이용해 모델을 구축하면 더 나은 예측을 할 수 있을 것으로 예상됩니다.
다음 시간에는 데이터 구조 전처리의 마지막 파트인 '전개'에 대해서 얘기해 보도록 하겠습니다.
포스팅 내용 중 다른 생각이 있는 분 혹은 수정해야 할 부분이 있으시면 댓글을 통해 그 의견을 나눠보면 너무 좋을 것 같습니다.
※ 본 포스팅의 내용은 데이터 전처리 대전을 참고하였습니다.
'Data preprocessing' 카테고리의 다른 글
[데이터 전처리#6] 데이터 구조 전처리 - 전개 (0) | 2023.07.10 |
---|---|
[데이터 전처리#4] 데이터 구조 전처리 - 결합 (0) | 2023.07.04 |
[데이터 전처리#3] 데이터 구조 전처리 - 집약 (0) | 2023.07.04 |
[데이터 전처리#2] 데이터 구조 전처리 - 추출 (0) | 2023.07.02 |
[데이터 전처리#1] 데이터 전처리 개요 (0) | 2023.06.29 |