아가개발자/머신러닝

데이터 전처리와 최적화2 - 데이터 변환/데이터 정제/데이터 통합/데이터 불균형

율쟝 2020. 9. 15. 21:48

데이터 변환(Data Transformation) 

- 데이터가 가진 특성들을 비교하여 데이터 패턴을 찾을 때, 특성 간 스케일 차이가 심하면 패턴을 찾는데 문제가 발생하기 때문에 변환이 필요함 (정규화, 로그, 평균값 계산 등을 이용하여 데이터를 구간 화 하는 작업)

  • 표준화 (Standardization): 데이터 특성이 Bell Shape 분포를 보이거나, 이상치 (노이즈 등)가 있을 때 유용 
  • 정규화 (Normalization): 정규화가 표준화보다 대체로 유용

 

데이터 정제(Data Cleaning) 

- 없는 데이터를 채우고, 잡음 데이터 제거, 모순 데이터 교정을 하는 작업 

  • 결측 데이터 채우기
from numpy import *
import numpy as np

x_miss = np.array([[1,2,3,None], [5, np. NAN, 7,8],[None, 10,11,12], [13,np.nan,15,16]])
x_miss

"""
array([[1, 2, 3, None],
       [5, nan, 7, 8],
       [None, 10, 11, 12],
       [13, nan, 15, 16]], dtype=object)
"""
from sklearn.impute import SimpleImputer
im = SimpleImputer(strategy='mean') # mean = 평균 / median = 중위수 / most frequent value = 최빈수
				    # dropna(), fillna() = 결측 데이터 0으로 채우기 
im.fit(x_miss)

 

데이터 통합(Data Integration) 

- 여러 개의 데이터 파일을 하나로 합치는 과정 

import pandas as pd
df1 = pd.read_csv("train.csv", engine = 'python')
df2 = pd.read_csv("store.csv",engine ='python')
df = pd.merge(df1,df2,on='Store') # Store를 기준으로 병합

 

데이터 불균형(Data Imbalance)

- 특정 클래스의 관측치가 다른 클래스에 비해 매우 낮게 나타나는 데이터 불균형 현상을 해소하기 위한 기법

 

# 데이터 생성

from collections import Counter
from sklearn.datasets import make_classification

X, y = make_classification(n_classes = 3, weights=[0.03, 0.07, 0.9], n_features=2, n_informative = 2, n_redundant=0,
                           n_clusters_per_class=1, n_samples=200, random_state = 10)
                           
# matplotlib로 그래프 그리기 

import matplotlib.pyplot as plt
plt.scatter(X[:,0], X[:,1], marker='o', c=y,
            s=100, edgecolor="k", linewidth = 1)
plt.xlabel("$X_1$")
plt.ylabel("$X_2$")

 

 

  • 과소 표집(Undersampling)
#NearMiss사용 

from imblearn.under_sampling import NearMiss

undersample = NearMiss(version = 3, n_neighbors_ver3 = 3)
X_Under, y_Under = undersample.fit_resample(X, y)
 

 

  • 과대 표집(Oversampling) 
from imblearn.over_sampling import SMOTE, ADASYN

#SMOTE 방법론 

sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X,y)


#ADASYN 방법론

ada = ADASYN(random_state=0)
X_syn, y_syn = ada.fit_resample(X,y)