AI & Data/Machine Learning

[머신러닝] 사이킷런(Scikit - Learn) 라이브러리 part 2 : 데이터 전처리, 교차검증

테드리 2024. 3. 4. 21:29

데이터 전처리(Preprocessing)

데이터 전처리란 데이터 분석을 위해 수집한 데이터를 분석이 적합한 형태가 되도록 가공하는 작업을 의미한다. 데이터 전처리를 통해 불필요한 데이터를 제거하고, 결측치나 이상치를 처리하는 작업을 진행하고, 여러 전처리 기법들을 통해 데이터를 가공하여 데이터의 질을 향상할 수 있다. 

 

만약 데이터 전처리가 제대로 이루어지지 않는다면 부정확한 분석 결과가 나올 수 있기 때문에 데이터 전처리 과정은 데이터 분석을 하는 데에 빠져서는 안 되는 매우 중요한 과정이다. 

 

데이터 전처리 기법

데이터 전처리 기법은 여러 가지가 존재하지만 그중 사이킷런에서 사용되는 가장 대표적인 몇 가지 방법을 소개하겠다.

기법인 크게 Encoding 방법과  Scaling 방법으로 나눌 수 있다.

 

Encoding

1. Label Encoding

 

Label Encoding은 Encoding 방법 중 하나로, 문자형 데이터를 숫자 값으로 변환하는 데이터이다. 문자형 데이터를 숫자형 데이터로 변환해야 하는 이유는 머신러닝 알고리즘을 사용할 때, input 데이터로 숫자형 데이터만 입력받을 수 있기 때문이다.

출처: https://www.mygreatlearning.com/blog/label-encoding-in-python/

 

Label Encoder를 사용하게 되면, 위 그림과 같이 문자형 데이터의 값들에 각각의 고유한 인덱스 번호가 부여된다. 보통 따로 인덱스 지정을 해주지 않으면 알파벳 순서(혹은 가나다 순서) 대로 0부터 인덱스 값이 주어진다.

 

<Code: Label Encoder 사용법>

from sklearn.preprocessing import LabelEncoder	#반드시 import 해주기

encoder = LabelEncoder()	#객체 생성
encoder.fit_transform("data")   #데이터가 있다고 가정

encoder.classes_   #각각의 class들이 어떤 고유 인덱스 번호를 부여 받았는지 볼 수 있다.
encoder.inverse_transform()   #Encoding된 데이터를 다시 원래 class로 되돌린다.

 

 

2. One-Hot Encoding 

 

One Hot Encoding은 범주형 데이터를 전처리할 때, 해당 범주에 속하면 1을, 그렇지 않으면 0을 부여하는 방식이다. 이때 각 카테고리(혹은 범주)는 데이터 프레임에 새로운 칼럼으로 추가된다.

 

출처:&nbsp;https://towardsdatascience.com/building-a-one-hot-encoding-layer-with-tensorflow-f907d686bf39

 

위 그림을 예시로 살펴보면, 'color'라는 칼럼의 각 요소들 'red', 'blue', 'green'이 각각 새로운 칼럼으로 추가되었고, 해당 레코드가 그 칼럼에 속하면 1을, 속하지 않으면 0을 반환했음을 볼 수 있다. 즉, 1번째 레코드는 'red'에 속하므로 'red'에는 1이, 나머지 'blue', 'green'에는 0이 부여되었음을 확인할 수 있다.

 

<Code: One-Hot Encoder 사용법>

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder()
encoder.fit_transform

## pd.get_dummies() 메서드를 사용해서도 one-hot encoding을 수행할 수 있다

 

Scaling 

Scaling이란 서로 다른 변수의 범위 값을 일정한 수준으로 맞춰주는 작업을 의미한다. 예를 들어, 나이의 경우 일반적으로 범위가 0부터 100까지의 스케일을 갖지만,  소득의 경우, 스케일이 10만, 100만까지도 가능하기 때문에 이러한 스케일의 범위를 통일해 주는 작업이 필요하다. 만약 스케일을 통일해주지 않으면 예시처럼 스케일 차이가 너무 크게 날 경우, 결과가 왜곡되어 나타날 수 있고, 계산 속도가 느려지는 문제가 발생할 수 있다.

 

1. Standardization

 

Standard Scaling은 표준화로도 불리는 방법으로, 데이터들의 형태가 표준정규분포를 띄도록 스케일링 해주는 것이다. 표준정규분포는 평균이 0이고 분산이 1인 분포를 의미한다.  

 

$$ Z = \frac{x - \mu }{\sigma } \;\;\;\;\; (\mu: 모평균, \; \sigma = 모표준편차)$$

 

<Code: Standard Scaling 사용법>

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

 

수행 후에는 데이터의 모든 값들이 평균이 0, 표준편차가 1인 형태로 변환된다.

 

2. Normalization (Min-Max)

 

정규화라고도 불리는 Normalization 기법은 수치형 데이터의 범위의 차이를 왜곡되지 않게 바꿔주는 것이다.  여러 가지 정규화 기법이 있지만 비교적 널리 알려진 Min-Max Scaling 방법을 소개하고자 한다. 

 

Min-Max Scaling 방법은 데이터들의 범위를 0과 1사이로 축소시키는 방법인데, 최댓값에는 1을, 최솟값에는 0이 부여된다.

 

$$ X = \frac{x - min(x)} {max(x) - min(x)} $$

 

<Code: Min-Max Scaling 사용법>

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)

 

 

교차검증(Cross Validation)

교차검증이란 데이터를 여러 부분으로 나누고, 각 부분을 훈련과 테스트 용도로 번갈아 사용하여 모델을 평가하는 방법을 의미한다.

1. 교차검증의 목적

모델의 성능을 개선시키기 위해 성능을 사전에 판단할 수 있는 지표가 필요하다. 이 역할을 하는 것이 훈련 셋에서 분류해 낸 검증 셋이다. 그러나 만약 검증 데이터 셋이 고정되어 있다면, 해당 모델의 정확도는 그 검정 데이터에 더 적합할 뿐, 전체 데이터에 적합한지는 판단할 수 없다. 따라서 여러 세트로 구성된 학습데이터와 검증데이터를 학습 및 평가시키는 것이 교차검증이다.

 

2. K - Fold 교차검증

 

전체 데이터를 비슷한 크기의 집합 $K$개로 나누고, $K$번 만큼 각 폴드 셋에 학습과 검증을 반복적으로 수행하는 방법

  1. 학습 데이터를 K개의 폴드로 나눈다
  2. 첫 번째 폴드를 검증데이터로 두고 나머지 데이터를 학습시킨 후 검증데이터로 평가를 수행한다
  3. 검증데이터를 달리하면서 2. 를 K번 반복한다
  4. K번 진행된 결괏값을 평균 내어 교차검증 최종 결과를 도출한다.

 

3. Stratified K-Fold

만약 데이터가 불균형한 label 분포를 가진다면..

 

K-Fold 교차검증에서 랜덤 하게 데이터를 고르다 보니 검증 데이터 셋 별 학습되는 정확도가 달라진다. 따라서 원본 데이터와 유사한 분포를 학습/검증 셋에서도 유지하는 것이 중요하다.

Solution: Stratified K-Fold, 레이블 데이터를 추가로 입력받아 원본 데이터의 레이블 분포를 고려한 뒤, 이 분포와 동일하게 학습/검정 셋을 분리한다.

 

 

참고 문헌

파이썬 머신러닝 완벽 가이드" target="_blank" rel="noopener" data-mce-href="http://파이썬 머신러닝 완벽 가이드">http://파이썬 머신러닝 완벽 가이드

 

파이썬 머신러닝 완벽 가이드 - 예스24

자세한 이론 설명과 파이썬 실습을 통해 머신러닝을 완벽하게 배울 수 있다!『파이썬 머신러닝 완벽 가이드』는 이론 위주의 머신러닝 책에서 탈피해, 다양한 실전 예제를 직접 구현해 보면서

www.yes24.com