딥러닝은 데이터 기반의 학습이 이뤄지기 때문에 데이터가 어떻게 구성되고 있는지(값의 분포 등등)에 따라
딥러닝이 학습하는 파라미터가 올바르게 업데이트가 되지 못하고 모델의 성능이 달라지기도 한다.
뿐만 아니라, 적절히 전처리 된 데이터는 데이터 분석에도 좋은 결과를 나타낸다.
이를 통해 데이터가 보여주는 숨은 의미가 무엇인지 잘 파악할 수 있다.
즉, 데이터에 의해 딥러닝의 성능이 떨어지는 경우와 데이터 분석 결과의 신뢰도가 낮아지는 경우를 막기 위해 데이터 전처리를 사용한다!
또한 전처리에는 다양한 기법이 존재한다. 각 기법마다 적용해야하는 데이터 유형이나, 기준이 다 다르기 때문에
하나하나 포스팅할 예정이다.
1. 결측치 / 중복 / 이상치 데이터
2. 표준화(standardizaiton)
3. 정규화(normalization)
4. 원-핫 인코딩 (one-hot encoding)
5. 등등..
따라서 이번 포스팅에서는 첫번째 데이터 유형인 결측치 / 중복 / 이상치 데이터를 전처리하는 방법에 대해 간단히 소개하려한다.
- 결측치 / 중복 / 이상치 데이터
딥러닝 / 머신러닝을 처음 공부하기 시작하면 kaggle이나 dacon에서 제공하는 데이터로 실습을 해본 경험이 있을 것이다.
가~끔 이쁜 데이터셋은 전처리를 별로 안해줘도 되지만 대부분의 데이터 셋 + 현실 데이터 셋은 절.대. 그렇지 않다.
이러한 데이터 셋이 가지고 있는 가장 기본적이면서 포괄적인 문제는 바로 결측, 중복, 이상치 데이터에 관한 문제이다.
결측, 중복, 이상치 데이터는 차례대로
구성요소이나 그 값이 없는 것 / 값이 겹치는 것 / 눈에 띄게 크거나 작은 값(튀는 값)을 갖는 데이터를 의미한다.
하나하나 그림으로 살펴보자.
- 결측치 / 중복 데이터
그림1을 보면 device에 N/A라고 적혀있는 것이 결측치에 해당한다. 즉, 어떤 디바이스로 사용했는지 모른다는 의미이다.
만약 device와 os를 가지고 transaction을 예상하는 모델을 만든다고 한다면,
이 결측치가 모델 학습에 입력으로 사용되면 분명 안 좋은 결과를 초래할 것은 당연하다.
중복 데이터도 마찬가지이다. 똑같은 값들이 중복되어 있으므로 모델 학습이 불안정해진다.
결측치, 중복 데이터를 전처리하는 방법의 핵심은 제거해주거나 대체할 값을 넣어주는 것이다.
결측치 코드를 전처리 하는 방법에 대한 코드는 다음과 같다.
# 데이터 출처: https://d3s0tskafalll9.cloudfront.net/media/documents/trade.csv
import os
csv_path = os.getenv('HOME') + 'trade.csv가 포함된 디렉토리 경로'
trad = pd.read_csv(csv_path)
#--결측 데이터 전처리 --
# colomn별 결측치 개수
len(trade)-trade.count(Nan)
#'기타사항' column이 모두 결측치 -> 삭제
trade = trade.drop('기타사항', axis=1)
# isnull() => 결측치가 하나라도 있는지 series로 출력
trade.isnull()
#하나라도 isnull == true 인 데이터만 출력
trade[trade.isnull().any(axis = 1)]
#DataFrame의 dropna는 결측치를 삭제해 주는 메서드.
#subset 옵션으로 특정 컬럼들을 선택.
#how 옵션으로 선택한 컬럼 전부가 결측치인 행을 삭제하겠다는 의미로 'all'을 선택('any': 하나라도 결측치인 경우)
#inplace 옵션으로 해당 DataFrame 내부에 바로 적용.
trade.dropna(how='all', subset=['수출건수', '수출금액', '수입건수', '수입금액', '무역수지'], inplace=True)
# -- 중복 데이터 전처리 --
#dataframe 내 중복 여부를 불리언으로 반환.
#이를 응용하면 중복 데이터만 볼 수 있다.
trade[trade.duplicated()]
# 해당 인덱스 삭제하기
#id가 중복된 경우 나중에 들어온 값만 남기는 코드
trade.drop_duplicates(subset='id',keep='last', inplace=True)
- 이상치
앞서 언급한 것과 같이 이상치는 튀는 값을 말한다. 즉 너무 작거나 큰 값을 가지는 데이터들을 의미한다.
그렇다면 그 이상(outlier)라는 것은 무엇을 척도로하는게 좋을까?
기본적으로 판단의 척도를 알기 위해서는 data를 스케일링하여 범위를 통일시키는 것이 필요하다.
데이터 스케일링의 가장 기본적인 2가지 방법은 다음과 같다.
1. min-max scaling
2. standardization
1. min-max scaling을 하면 결국 거의 대부분의 값은 0에 가깝고, 이상치만 1에 가까운 값을 가질 것이다.(혹은 그 반대일 수도 있다.)
따라서 몇 개의 이상치 때문에 대부분의 값의 차이가 무의미해지기 때문에,
극단적인 값이 생기는 경우를 제외하면 고려할 만한 scaling 기법이다.
2. standardizaion는 극단적인 경우를 고려할 때 평균과 표준편차를 이용하기 때문에
이상치가 극단적인지를 판단할 수 있게하여 사용하기 비교적 용이하다. 즉, 이상치에 더욱 민감하다는 의미와 일맥 상통 한다.
이렇게 극단적인지를 판단할 수 있는 수치를 z-score라고 한다.
z-score가 특정 기준을 넘어가면 해당 데이터를 이상치라고 판단할 수 있는 근거가 되는 것이다!
그럼 이상치 데이터를 파악했다면 어떻게 하면 될까?
1. 가장 간단한 방법으로 이상치를 삭제할 수 있다. 이상치를 원래 데이터에서 삭제하고, 이상치끼리 따로 분석하는 방안도 있다.
2. 이상치를 다른 값으로 대체할 수 있다. 데이터가 적으면 이상치를 삭제하기보다 다른 값으로 대체하는 것이 나을 수 있다. 예를 들어 최댓값, 최솟값을 설정해 데이터의 범위를 제한할 수 있다.
3. 혹은 결측치와 마찬가지로 다른 데이터를 활용하여 예측 모델을 만들어 예측값을 활용할 수도 있다.
4. 아니면 binning을 통해 수치형 데이터를 범주형으로 바꿀 수도 있다.
데이터 프레임에서 이상치를 판단하는 코드는 다음과 같다.
# z-score가 z보다 높으면 이상치로 판단하고 해당 인덱스를 추출.
def outlier(df, col, z):
return df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index
3. z-score이외에도 이상치인지 파악하는 방법 중 하나는 사분위 범위수를 이용하는 것이다. (IQR)
IQR=Q3−Q1
즉, IQR은 제 3사분위수에서 제 1사분위 값을 뺀 값으로 데이터의 중간 50%의 범위라고 생각하면 된다.
Q1 - 1.5 * IQR보다 왼쪽에 있거나, Q3 + 1.5 * IQR 보다 오른쪽에 있는 경우 우리는 이상치라고 판단한다.
'인공지능 > ML-DL 기초' 카테고리의 다른 글
Inductive bias란? (2) | 2024.05.28 |
---|---|
모델의 평가 방식: Evaluation Metric (0) | 2024.03.13 |
Regularization(모델의 규제, 정칙화)에 대한 이해 (3) | 2023.12.23 |
활성화 함수에 대한 이해 (3) | 2023.12.01 |
딥러닝의 전반적인 학습 과정 (1) | 2023.10.17 |