3. 데이터 전처리
- 이상치
이상치란 보통 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값을 말한다. 이상치를 확인하는 방법으로는 크게 Extreme Studentized Deviation(ESD)와 IQR(Inter Quantile Range)로 2가지가 있다.
이상치는 주관적인 값으로 데이터 삭제는 분석가가 결정한다. 이상치는 도메인과 비즈니스 맥락에 따라 기준이 달라지고 데이터 삭제 시 품질은 좋아질 수 있지만 정보 손실을 동반하므로 주의해야 한다.
# ESD를 이용한 처리
import numpy as np
mean = np.mean(data)
std = np.std(data)
upper_limit = mean + 3*std
lower_limit = mean - 3*std
-----------------------------------------------------------------------------------------------
# IQR을 이용한 처리(Box Plot)
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].qunatile(0.75)
IQR = Q3 - Q1
uppper_limit = Q3 + 1.5*IQR
lower_limit = Q1 - 1.5*IQR
- 결측치
1) 수치형 데이터 결측치
▷ 평균값 대치: 대표적인 대치 방법
▷ 중앙값 대치: 데이터에 이상치가 많아 평균값이 대표성이 없다면 중앙값을 이용
2) 범주형 데이터 결측치
▷ 최빈값 대치
구분 | 함수 | 설명 |
간단한 삭제 & 대치 | df.dropna(axis = 0) | 행 삭제 |
df.dropna(axis = 1) | 열 삭제 | |
Boolean Indexing | ||
df.fillna(value) | 특정 값으로 대치(평균, 중앙, 최빈값 | |
알고리즘 이용 | sklearn.impute.SimpleImputer | 평균, 중앙, 최빈값으로 대치 |
sklearn.impute.IterativeImputer | 다변량대치(회귀 대치) | |
sklearn.impute.KNNImputer | KNN 알고리즘을 이용한 대치 | |
SimpleImputer.statistics_ | 대치한 값 확인 가능 |
- 범주형 데이터 전처리: 인코딩 (Encoding)
머신러닝 모델은 숫자를 기반으로 학습하기 때문에 반드시 인코딩 과정이 필요하다. 인코딩이란 어떤 정보를 정해진 규칙에 따라 변환하는 것을 뜻한다.
1) 레이블 인코딩(Lable Encoding): 문자열 범주형 값을 고유한 숫자로 할당해 모델이 처리하기 쉬운 수치형으로 데이터를 변환하는 장점이 있지만 순서 간 크기에 의미가 부여되어 모델이 잘못 해석할 수 있다는 단점이 있음
구분 | 함수 & 패키지 | 설명 |
패키지 | sklearn.preprocessing.LabelEncoder | 인코딩 패키지 |
메소드 | fit | 데이터 학습 |
transform | 정수형 데이터로 변환 | |
fit_transform | fit과 transform을 연결하여 한번에 실행 | |
inverse_transform | 인코딩된 데이터를 원래 문자열로 변환 | |
속성 | classes_ | 인코더가 학습한 클래스(범주) |
2) 원 핫 인코딩 (One - Hot Encoding): 각 범주를 이진 형식으로 변환하는 기법으로 각 범주가 독립적으로 표현되어 순서가 중요도를 잘못 학습하는 것을 방지할 수 있는 장점이 있음. 하지만 범주 개수가 많을 경우 차원의 저주, 모델의 복잡도 증가, 과적합을 유발하는 단점이 있음
구분 | 함수 & 패키지 | 설명 |
패키지 |
pd.get_dummies | 더미 변수 |
sklearn.preprocessing.OneHotEncoder |
원 핫 인코딩 패키지 | |
메소드 | fit | 데이터 학습 |
transform | 정수형 데이터로 변환 | |
fit_transform | fit과 transform을 연결하여 한번에 실행 | |
inverse_transform | 인코딩된 데이터를 원래 문자열로 변환 | |
속성 |
categories | 인코더가 학습한 클래스(범주) |
get_feature_names_out() | 학습한 클래스 이름(리스트) |
- 수치형 데이터 전처리: 스케일링 (Scaling)
머신러닝 학습에 사용되는 데이터들은 서로 단위 값이 다르기 때문에 이를 보정하는 과정이 필요하다.
1) 표준화 (Standardization): 각 데이터에 평균을 배고 표준편차를 나누어 평균을 0 표준편차를 1로 조정하는 방법으로 이상치가 있거나 분표가 치우쳐저 있을 때, 모든 특성의 스케일을 동일하게 맞춰 많은 알고리즘에서 좋은 성능을 내는 장점이 있음. 하지만 표준화는 데이터의 최소 - 최대 값이 정해지지 않는다는 단점이 있음
구분 | 함수 & 패키지 | 설명 |
패키지 |
sklearn.preprocessing.StandardScaler | 스케일링 패키지 |
메소드 |
fit | 데이터학습(평균과 표준편차를 계산) |
transform | 데이터 스케일링 진행 | |
속성 |
mean_ | 데이터의 평균 값 |
scale_, var_ | 데이터의 표준 편차,분산 값 | |
n_features_in_ | fit 할 때 들어간 변수 개수 | |
feature_names_in_ | fit 할 때 들어간 변수 이름 | |
n_samples_seen_ | fit 할 때 들어간 데이터의 개수 |
2) 정규화 (Normalization): 데이터를 0과 1사이 값으로 조정해 모든 특성의 스케일을 동일하게 맞추고 최대 - 최소 범위가 명확하다는 장점이 있음. 하지만 이상치에 영향을 많이 받을 수 있다는 단점이 있음
구분 | 함수 & 패키지 | 설명 |
패키지 | sklearn.preprocessing.MinMaxScaler | 정규화 패키지 |
속성 | data_min_ | 원 데이터의 최소 값 |
data_max_ | 원 데이터의 최대 값 | |
data_range_ | 원 데이터의 최대-최소 범위 |
3) 로버스트 스케일링 (Robust Scaling): 중앙값과 IQR을 사용하여 스케일링해 이상치의 영향에 덜 민감하다는 장점이 있지만 표준화와 정규화에 비해 덜 사용된다는 단점이 있다.
구분 | 함수 & 패키지 | 설명 |
패키지 | sklearn.preprocessing.RobustScaler | 로버스트 스케일링 패키지 |
속성 | center_ | 훈련 데이터의 중앙값 |
'Today I Learned (TIL) > Python' 카테고리의 다른 글
[챌린지] 시계열 기반 머신러닝 모델과 MLops 적용기 - 1회차 (2) | 2024.09.25 |
---|---|
[TIL] 머신러닝의 심화 - 데이터분석 프로세스(3) (0) | 2024.08.18 |
[TIL] 머신러닝의 심화 - 데이터분석 프로세스(1) (0) | 2024.08.16 |
[TIL] 머신러닝의 기초 - 분류분석(로지스틱회귀) (0) | 2024.08.14 |
[TIL] 머신러닝의 기초 - 회귀분석(선형회귀 2) (0) | 2024.08.13 |