데이터 분석 및 전처리 단계 : 수집한 데이터를 분석하고 머신러닝에 사용할 형태로 변환시키는 단계
크롤링이나 DB 데이터를 통해 수집된 데이터를 머신러닝에 학습시키기 위해서는 데이터 전 처리 과정이 필요하다.
데이터 전 처리는 크게 3가지 역할을 한다.
- 머신러닝의 입력 형태로 데이터 변환 (피처 엔지니어링)
- 결측값 및 이상치를 처리하여 데이터 정제
- 학습용 및 평가용 데이터 분리
1. 데이터 변환
실제 학습에 사용되는 데이터 셋은 이미지, 자연어, 범주형, 시계열 등 다양한 데이터 형태를 가지고 있다.
대부분의 머신러닝 모델은 숫자 데이터를 입력으로 받으며, 대부분의 원본 데이터는 머신러닝 모델이 학습할 수 없는 형태로 되어있다.
따라서 학습에 사용할 데이터는 머신러닝 모델이 학습할 수 있는 수치형 자료로 변환이 필요하다.
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을 통해 쉽게 훈련용, 테스트용 데이터 분리 가능
'DEV > AI' 카테고리의 다른 글
[머신러닝] 퍼셉트론 (인공신경망, 딥러닝) (0) | 2021.12.13 |
---|