1. 데이터 전처리

- 특정 분석에 적합하게 데이터를 가공하는 작업

 

- 완결성: 필수로 기입되어 있어야 하는 데이터는 모두 입력되어야 한다.

- 유일성: 동일한 데이터가 불필요하게 중복되어 있으면 안된다.

- 통일성: 데이터가 모두 동일한 형식으로 입력되어야 한다.

 

2. 주의해야 하는 점

- 잡음 Noise: 측정 과정에서 무작위로 발생하여 측정값의 에러를 발생시키는 것. 이상치와 달리 예측하기 어려움

- 아티펙트 Digital Artifact: 어떤 기술적인 요인으로 인해 반복적으로 발생하는 왜곡이나 에러

- 정밀도 Precision: 동일한 대상을 반복적으로 측정했을 때, 각 결과의 친밀성을 나타내는 것. 측정 결과의 표준편차로 표현 가능

- 편향 bias: 측정 장비에 포함된 시스템적인 변동 (ex. 영점 조절이 되지 않은 체중계)

- 정확도 Accuracy: 평향에 영향 받음. 유효 숫자의 사용에 있어서 중요함

- 이상치 Outlier: 대부분의 데이터와 다른 특성을 보이너가, 특정 속성의 값이 다른 개체들과 달리 유별난 값을 가지는 데이터. 잡음과 다름

- 결측치 Missing Value: 값이 표기되지 않은 값

- 모순, 불일치 Inconsistent Value: 동일한 개체에 대한 측정 데이터가 다르게 나타나는 경우

- 중복 Duplicated data: 중복된 데이터 사이에 속성의 차이나, 값의 불일치가 발생하면 문제가 됨

 

3. 전처리 순서

1) 데이터 수집: 분석이나 학습에 필요한 데이터를 수집하는 작업

- 데이터 분석 및 모델 생성의 첫 과정

- 목적에 맞는 정보 수집을 위해 문제 정의 필요

 

2) 데이터 정제: 비어있는 데이터나 잡음, 모순된 데이터를 정합성이 맞도록 교정하는 작업

- 데이터를 활용할 수 있도록 만드는 과정

- 컴퓨터가 읽을 수 없는 요소의 제거 및 숫자나 날짜 등의 형식에 대해 일관성 유지

- 누락값, 불일치 값, 오류 값 수정

 

3) 데이터 통합: 여러 개의 데이터 베이스, 데이터 집합 또는 파일을 통합하는 작업

- 서로 다른 데이터 세트가 호환이 가능하도록 통합

- 같은 객체, 같은 단위나 좌표로 통합

 

4) 데이터 축소: 샘플링, 차원 축소, 특징 선택 및 추출을 통해 데이터 크기를 줄이는 작업

- 대용량 데이터에 대한 복잡한 데이터 분석은 실행하기 어렵거나 불가능한 경우가 많음

 

5) 데이터 변환: 데이터를 정규화, 이산화 또는 집계를 통해 변환하는 작업

 

4. 데이터 전처리 기법

- 집계 Aggregation

- 샘플링 Sampling

- 차원 축소 Dimensionality Reduction

- 특징 선택 Feature Subset Selection

- 특징 생성 Feature Creation

- 이산화와 이진화 Discretization and Binarization

- 속성 변화 Attribute Transformation

 

5. 전처리 전 데이터 확인

- shape: 데이터 크기 출력

- head(): 데이터 상위 5개 행 출력

- tail(): 데이터 하위 5개 행 출력

- info(): 데이터 전반적인 정보 제공 (행/열 크기, 컬럼명, 컬럼을 구성하는 값의 자료형 등)

- describe(): 데이터 컬럼별 요약 통계량 제공

 

6. 결측치 처리

- NA : 값이 표기되지 않은 값. 결측치

- 제거, 대치, 예측모델로 처리

 

1) 전체 결측치 확인

df.isnull()
pd.isnull(df)

# 결측치일 때 true 반환
# isnull -> notnull : 결측치일 때 false 반환

 

2) 인덱싱 후 결측치 개수 확인하기

df['col'].isnull()

 

3) 결측치 만들기

df.ix[[row1, row2], ['col']] = None

 

4) 전체 결측치 개수 확인

df.isnull().sum()
df.isnull().value_counts()
df.isnull().sum(1)

 

5-1) 결측치 제거

- dropna() : 판다스에서 누락 데이터를 제거하는 함수

- 목록삭제 : 결측치가 있는 행/열은 전부 삭제

df = df.dropna()           # default, 행 제거
df = df.dropna(axis = 1)   # 열 제거

 

- 단일값 삭제 : 행/열 자체가 결측치일 때, 혹은 조건부 삭제

df = df.dropna(how = 'all')   
df = df.dropna(thresh = 1)     

df = df.dropna(subset=['col1', 'col2', 'col3'], how = 'all')  # 모두 결측치일 때 해당 행 삭제
df = df.dropna(subset=['col1', 'col2', 'col3'], thresh = 2)   # 특정 열에 2개 초과의 결측치가 있을 때 해당 행 삭제

 

5-2) 대치

- 단순 대치: 중앙값, 최빈값, 0, 분위수, 주변값, 예측값 등으로 결측치 대치

- 다중 대치: 단순 대치법을 여러번! (대치 - 분석 - 결합)

 

- 판다스에서 결측치 대치하는 함수들

fillna()

# 전체 결측치를 특정 단일값으로 대치
df.fillna(0)  

# 특정 열에 결측치가 있을 경우 다른 값으로 대치
df['col'] = df['col'].fillna(0)
df['col'] = df['col'].fillna(df['col'].mean())

# 결측치 바로 이후 행 값으로 채우기
df.fillna(method='bfill')

# 결측치 바로 이전 행 값으로 채우기
df.fillna(method='pad')
replace()

# 결측치 값 0으로 채우기
df.replace(to_replace = np.nan, value = 0)
interpolate()

# 인덱스를 무시하고, 값을 선형적으로 같은 간격으로 처리
df.interpolate(method = 'linear', limit_direction = 'forward')

 

5-3) 예측 모델

- 결측값을 제외한 데이터로부터 모델을 훈련하고 추정값을 계산하고 결측치 대체

- K-NN, 가중 K-NN, 로지스틱 회귀, SVM, 랜덤 포레스트 방식 등

 

7. 중복 데이터 처리

- 중복은 언제든지 발생할 수 있지만, 중복 데이터 사이에 속성의 차이나 값의 불일치가 발생한 경우, 처리해야 함

- 두 개체를 합치거나 응용에 적합한 속성을 가진 데이터를 선택하는 등

# 중복 데이터 확인
df.duplicated(['col'])

# 중복 데이터 삭제
drop_duplicates()

# 해당 열의 첫 행을 기준으로 중복 여부 판단 후, 중복되는 나머지 행 삭제
drop_duplicated(['col'])

df.drop_duplicates(keep = )
    subset = None           # default, 특정 열 지정 X, 모든 열에 대해 작업 수행
    keep = 'first'          # 가장 처음에 나온 데이터만 남김
    keep = 'last'           # 가장 마지막에 나온 데이터만 남김
    keep = False            # 중복된 어떤 데이터도 남기지 않음

 

8. 불균형 데이터 처리

- 분류를 목적으로 하는 데이터 셋에 클래스 라벨의 비율이 불균형한 경우

- 각 클래스에 속한 데이터 개수 차이가 큰 데이터

- 정상 범주의 관측치 수와 이상 범주의 관측치 수가 현저히 차이나는 데이터

- 이상 데이터를 정확히 찾아내지 못할 수 있음

 

8-1) Under Sampling

- 다수 범주의 데이터를 소수 범주의 데이터 수에 맞게 줄이는 샘플링 방식

- Random Undersampling, Tomek's Link, CNN

 

8-2) Over Sampling

- 소수 범주의 데이터를 다수 범주의 데이터 수에 맞게 늘리는 샘플링 방식

- Random Oversampling

- ADASYN, SMOTE

 

9. 이상치 탐지 기법

1) z-score

- z = (x - μ) / σ

- 변수가 정규분포 따른다고 가정, 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지 나타냄

- z-score가 임계치보다 크거나 작은 관측치를 이상치라고 규정

- 임계치 조정함으로써 기준 조정

def z_score_outlier(df, col, thres = 3):
    z_score = (df[col] - df[col].mean()) / df[col].std()
    return df[(z_score > thres) | (z_score < -thres)]

 

2) IQR

- IQR = Q3 - Q1

- Q3 + 1.5*IQR 이상이거나, Q1 - 1.5*IQR 이하인 경우 이상치라고 규정

- 1.5 대신 다른 값 이용해 기준 조정 가능

def IQR_outlier(df, col, scale = 1.5):
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_limit = Q1 - scale * IQR
    upper_limit = Q3 + scale * IQR
    
    return df[(df[col] > upper_limit) | df[col] < lower_limit)]

 

3) DBSCAN

- 밀도 기반 군집화 알고리즘

- 하이퍼 파라미터: eps(반경, default=0.5), min_samples(core point가 되기 위한 최소한의 이웃 수, default=5)

# 이상치 탐지
from sklearn.cluster import DBSCAN

model = DBSCAN(eps = .3, min_samples = 10)
pred = model.fit_predict(abalone)

# 이상치 개수
(pred == -1).sum()

 

10. 레이블 인코딩

- 문자열 카테고리 피처를 코드형 숫자 값으로 변환하는 것

# pandas
df.factorize()

# scikit-learn
LabelEncoder()
encoder.fit_transform() # 학습, 변환 한번에

 

11. 원핫 인코딩

- 피처값의 유형에 따라 새로운 피처를 생성해 고유값에 해당하는 컬럼에만 1 표시, 나머지 컬럼에는 0을 표시하는 방식

- 숫자의 크기 차이를 만드는 레이블 인코딩의 단점 보완

 

12. Feature Scaling

- 서로 다른 변수 값의 범위를 일정한 수준으로 맞추는 작업

- 변수 값의 범위 또는 단위가 달라서 발생 가능한 문제 예방

- 머신러닝 모델이 특정 데이터의 bias 갖는 것 방지

 

1) 표준화 Standardization

- 서로 다른 범위의 변수들을 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환

- ScandardScaler()

 

2) 정규화 Normalization

- 변수값들을 모두 0과 1 사이의 값으로 변환하는 방식

- MinMaxScaler()

'ML & DL' 카테고리의 다른 글

[BITAmin] 선형 회귀  (0) 2023.01.23
[BITAmin] K-최근접 이웃 알고리즘  (2) 2023.01.23

+ Recent posts