DEV/AI

[머신러닝] 데이터 전 처리하기

LIMVO 2021. 12. 1. 21:03

 

[출처] 2021 NIPA AI 온라인 교육

 

데이터 분석 및 전처리 단계 : 수집한 데이터를 분석하고 머신러닝에 사용할 형태로 변환시키는 단계

크롤링이나 DB 데이터를 통해 수집된 데이터를 머신러닝에 학습시키기 위해서는 데이터 전 처리 과정이 필요하다.

 

데이터 전 처리는 크게 3가지 역할을 한다.

  1. 머신러닝의 입력 형태로 데이터 변환 (피처 엔지니어링)
  2. 결측값 및 이상치를 처리하여 데이터 정제
  3. 학습용 및 평가용 데이터 분리

1. 데이터 변환

실제 학습에 사용되는 데이터 셋은 이미지, 자연어, 범주형, 시계열 등 다양한 데이터 형태를 가지고 있다.

대부분의 머신러닝 모델은 숫자 데이터를 입력으로 받으며, 대부분의 원본 데이터는 머신러닝 모델이 학습할 수 없는 형태로 되어있다.

따라서 학습에 사용할 데이터는 머신러닝 모델이 학습할 수 있는 수치형 자료로 변환이 필요하다.

 

[출처] 2021 NIPA AI 온라인 교육

 

2. 데이터 정제

결측값은 값이 측정되지 않은 것으로 일반적인 머신러닝의 입력값으로 사용할 수 없다.

Null, None, NaN 등의 결측값을 처리하는 방법은 다음과 같다.

  • 결측값이 존재하는 샘플 삭제
  • 결측값이 많이 존재하는 변수 삭제
  • 결측값을 다른 값으로 대체

이상치가 존재하면 모델의 성능 저하를 유발할 수 있다.

이상치는 일반적으로 전 처리 과정에서 제거하며, 이상치를 판단하는 기준이 중요하다.

이상치인지 판단하는 방법은 다음과 같다

  • 통계지표(카이제곱 검정, IQR 지표 등)를 사용하여 판단
  • 데이터 분포를 보고 직접 판단
  • 머신러닝 기법을 사용하여 이상치 분류

3. 데이터 분리

데이터 분리는 머신러닝 모델의 성능을 평가하기 위해서 필요하다.

학습에 사용된 데이터로 평가할 수 없기 때문에 초기 데이터 셋에서 일정 비율로 학습용, 평가용 데이터를 분리한다.

일반적으로 7 : 3 ~ 8 : 2 로 학습용 : 평가용 데이터를 분리함.

 

※ 지도학습의 경우에는 입력 값인 Feature 데이터와 예측 대상인 Label 데이터로 분리하여 저장함.

 


파이썬 데이터 전처리 흐름

 

1. 데이터 불러오기

import numpy as np 
import pandas as pd 
#데이터 시각화 라이브러리
import matplotlib.pyplot as plt
import seaborn as sns

#dataframe 형태로 읽어오기
data=pd.read_csv("data.csv", encoding='euc-kr')

#상위 5개 데이터
data.head()

#데이터 타입
data.dtypes

#데이터 column 이름
data.columns.values

#dataframe 모양 (행, 열)
data.shape

#dataframe 정보 요약
data.info()

# 수치형 변수의 데이터 정보 요약
data.describe()

head(N), tail(N) 함수를 통해 상위 N개, 하위 N개 데이터 확인이 가능함.

info 함수의 출력 값으로 Column, Non-Null Count, Dtype 정보를 알 수 있음.

Non-Null Count의 값이 0인 변수는 데이터 정제 단계에서 삭제

 

2. 데이터 정제

 

  • 결측값 처리
#각 열의 빈 데이터 개수 확인
data[[column1,...]].isna().sum()

#모든 열의 빈 데이터 개수 확인
data.isna().sum()

#drop 함수를 통한 값이 없는 변수 삭제
corona_del = corona.drop(columns = [column1, ... ])

#결측값 정보 출력
data.isnull().sum()

#해당 변수의 결측값만 삭제
data = data[~data[column].isnull()]

#모든 변수의 결측값 삭제
data = data.dropna()

값이 없는 변수 삭제

변수에 결측값이 존재하는 샘플 삭제

 

  • 중복값 제거
#중복값 확인
data[data.duplicated(keep=False)]

#제거 전 df 길이
print(len(df))

#중복값 제거
data = data.drop_duplicates()

#제거 후 df 길이
print(len(df))

 

  • 이상치 제거
#소수점을 갖는 이상치 처리
data = data[data[column]-np.floor(data[column]) == 0][column]

#정제된 dataframe 정보
corona_del.info()

소수점을 가지는 이상치 삭제 (소수점인 데이터를 이상치라고 판단)

 

 

3. 데이터 분리

from sklearn.model_selection import train_test_split

#예측해야하는 label 데이터를 제외한 feature 데이터
X = data.drop(columns=[label 데이터])

#예측해야하는 label 데이터
y = data[label 데이터]


# sklearn의 train_test_split으로 쉽게 분리 가능
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

sklearn에서 제공하는 train_test_split을 통해 쉽게 훈련용, 테스트용 데이터 분리 가능