Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

데이터 전처리 본문

Programming/Machine Learning

데이터 전처리

2_34 2020. 9. 27. 15:33

데이터 전처리

 

데이터를 분석 및 처리에 적합한 형태로 만드는 과정

 

- 불완전 : 데이터가 비어 있는 경우, 값이 Null인 경우

- 잡음 : 에러 또는 잡음이 포함된 경우 (ex: 나이 -10살)

- 모순된 : 생년월일과 나이가 맞지 않는경우, 복사된 레코드의 불일치

 

 

1. 이상치 (Outlier)

 

1) 대부분의 데이터와 다른 특성을 보이거나 특정 속성의 값이 다른 개체들과 달리 유별난 값을 가지는 데이터

 

2) 잡음과는 다름

- 잡음 : 임의로 발생하는 예측하기 어려운 요인

- 이상치 : 적법한 하나의 데이터로서 그 자체가 중요한 분석의 목적이 될 수도 있음

 

3) 이상값 처리

데이터/샘플과 동떨어진 관측치로, 모델을 왜곡할 가능성이 있는 관측치이므로 처리해줌

Boxplot이나 Histogram 사용

두 개 변수 간 이상값을 찾기 위해서는 Scatter plot으로 확인

존재할 수 없는 값, 극단적인 값 제거

 

  •  중앙값(median) : 50%의 위치
  • 박스(box) : 25%(Q1)~ 75%(Q3) 까지의 값
  • 수염(whiskers) : 박스의 각 모서리로 부터 IQR의 1.5배 내에 있는 가장 멀리 떨어진 데이터 점까지 이어져 있는 것
  • 이상치(Outlier) : 수염보다 바깥쪽에 존재하는 데이터
  • IQR : Q3 - Q1의 값

import numpy as np
import pandas as pd

data = {'x1':[13,np.nan, 17,20,22,21,11,56,999,64], 
'x2':[9,555,17,11,np.nan,10,17,777,22,34], 
'y':[20,np.nan,30,27,np.nan,32,17,20,22,899]}

df = pd.DataFrame(data)

print(df)
import matplotlib.pyplot as plt

print(df_0)

green_diamond = dict(markerfacecolor='g', marker='o')
plt.boxplot(df_0['x1'], flierprops=green_diamond)
plt.title("data_box plot")
plt.show()

green_diamond = dict(markerfacecolor='g', marker='D')
plt.boxplot(df_0['x2'], vert=False, flierprops=green_diamond)
plt.title("data_box plot")
plt.show() 
data = [df_0['x1'], df_0['x2']]
green_diamond = dict(markerfacecolor='r', marker='s')
plt.boxplot(data, flierprops=green_diamond)
plt.title("multiple sample box plot")
plt.show()

 

 

2) 결측치 (Missing value)

 

Null 값

 

결측값 처리 : 모델의 정확성이 떨어질 수 있으므로 결측값을 삭제하거나 다른 값으로 대체함

import numpy as np
import pandas as pd

data = {'x1':[13,np.nan, 17,20,22,21,11,56,999,64], 
'x2':[9,555,17,11,np.nan,10,17,777,22,34], 
'y':[20,np.nan,30,27,np.nan,32,17,20,22,899]}

df = pd.DataFrame(data)

print(df)
# 결측값 0으로 대체

df_0 = df.fillna(0)
print(df_0)
# 결측값 뒤의 값으로 대체

df1 = df.fillna(method='bfill')
df2 = df.fillna(method='backfill')
print(df)
print(df1)
# 결측치 평균값으로 대체 mean = df.mean()
# 결측치 중앙값으로 대체 median = df.median()

a = df.fillna(df.mean())
b = df.where(pd.notnull(df), df.mean(), axis='columns')

print(a)
print(b.round(2))

 

3. 데이터 스케일링 (Data Scaling)

 

데이터의 값이 너무 크거나 혹은 작은 경우 모델 알고리즘 학습과정에서 0으로 수렴하거나 무한으로 발산하기 때문에 데이터 스케일링을 해줌

주로 StandardScaler > MinMaxScaler > RobustScaler 순으로 사용

 

1) StandardScaler

각 feature의 평균을 0, 분산을 1로 변경함

 

2) MinMaxScaler

모든 feature가 0과 1사이에 위치함

 

3) MaxAbsSCaler

절대값이 0~1사이에 매핑 되도록, 즉 -1~1사이로 재조정

 

4) RobustScaler

모든 특성들이 같은 크기를 갖는다는 점에서 StandardScaler와 비슷하지만 평균과 분산 대신 median과 quartile을 사용

이상치에 영향을 받지 않음

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import MaxAbsScaler
from sklearn.preprocessing import RobustScaler

scaler = StandardScaler()
scaler.fit(df_0)
X_train1 = scaler.transform(df_0)

scaler = MinMaxScaler()
scaler.fit(df_0)
X_train2 = scaler.transform(df_0)

scaler = MaxAbsScaler()
scaler.fit(df_0)
X_train3 = scaler.transform(df_0)

scaler = RobustScaler()
scaler.fit(df_0)
X_train4 = scaler.transform(df_0)

print(pd.DataFrame(X_train1, columns=["x1","x2","y"]))
print(pd.DataFrame(X_train2, columns=["x1","x2","y"]))
print(pd.DataFrame(X_train3, columns=["x1","x2","y"]))
print(pd.DataFrame(X_train4, columns=["x1","x2","y"]))

 

 

'Programming > Machine Learning' 카테고리의 다른 글

KNN 알고리즘  (0) 2020.09.27
모델 성능 평가 척도, ROC 커브  (0) 2020.09.27
로지스틱 회귀분석  (0) 2020.09.27
Sklearn과 선형회귀분석  (0) 2020.09.27
머신러닝 개요  (0) 2020.08.16
Comments