세조목

머신러닝 - 전처리(인코딩, 스케일링)(24.02.01) 본문

데이터 분석 공부/머신러닝

머신러닝 - 전처리(인코딩, 스케일링)(24.02.01)

세조목 2024. 2. 1. 21:01

전처리(인코딩 & 스케일링)

인코딩이란 모델이 처리하기 쉬운 값으로 기존 값을 바꾸는 것을 의미한다.
 
범주형 데이터(Encoding)

  1. 레이블 인코딩(Label Encoding)
  2. One-Hot Encoding

수치형 데이터(Scaling)

  1. 표준화(Standardization)
  2. 정규화(Normalization)
  3. 로버스트 스케일링(Robus Scaling)

 


 

범주형 데이터(Encoding)

  1. 레이블 인코딩(Lable Encoding)
  2. One-Hot Encoding

 

1. 레이블 인코딩(Label Encoding)

 

먼저 레이블 인코딩이다.
레이블 인코딩은 간단하게 기존값을 '수치형'으로 변환시켜줘서
모델이 처리하기 쉽게 만들 수 있다.
다만 변경된 값의 순서간 크기에 의미가 부여되어 모델이 잘못
해석할 여지가 있다는 점이 단점이다.
 
사용하는 함수와 메서드는 아래와 같다.

함수
sklearn.preprocessing.LabelEncoder -
메서드
fit 데이터 학습
transform 정수형 데이터로 변환
fit_transform fit과 transform을 연결하여 한번에 실행
inverse_transform 인코딩된 데이터를 원래 문자열로 변환
속성
classes_ 인코더가 학습한 클래스(범주)

 
LabelEncoding 코드 작성 예시를 한 번 살펴보자

le = LabelEncoder()
le.fit(titanic_df[['Sex']]
titanic_df['Sex_le'] = le.transform(titanic_df['Sex'])

le라는 변수에 LabelEncoder 함수 기능을 넣어주고
fit 함수를 활용해서 타이타닉 테이블 中 'Sex' 컬럼에만 학습을 시켜준다.
그런다음 학습한 데이터들을 정수로 바꿔주면 되기대문에
transform 함수를 사용해준다. 
 

2. OneHot Encoding

 

OneHot Encoding이란 각 범주를 이진 형식으로 변화하는 기법을 의미한다.
예를들어 '빨강, 파랑, 초록'이 있다고 할 때 OneHot Encoding으로 인코딩을 진행하면
아래와 같이 인코딩된다.

빨강 ->  [1,0,0]
파랑 -> [0,1,0]
초록 -> [0, 0, 1]

 
각각의 범주(대괄호 안 값)가 독립적으로 표현되기때문에
순서가 중요도를 잘못 학습하는 것을 방지하므로 명목형 데이터에 권장된다.
여기서 범주는 대괄호 안에 들어가는 숫자의 개수로
만약 A라는 이름의 컬럼에 속성값이 A부터 Z까지 있다고 가정하면
범주는 총 26개 되는 것이다.
 
하지만 범주의 개수가 많을 경우 차원이 크게 증가하는 차원의 저주에 걸릴 가능성이 생기고,
모델의 복잡도가 증가하며, 과적합을 유발할 수 있다.

  •  과(대)적합 => 데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터는 제대로 예측(or 분류)하지 못하는 현상

사용하는 함수는 아래와 같다.

함수
pd.get_dummies -
sklearn.preprocessing.OneHotEncoder -
메서드
categoreis_ 인코더가 학습한 클래스(범주)
get_feature_names_out() 학습한 클래스 이름(리스트)
fit 데이터 학습
transform 정수형 데이터로 변환
fit_transform fit과 transform을 연결하여 한번에 실행
inverse_transform 인코딩된 데이터를 원래 문자열로 변환
속성
classes_ 인코더가 학습한 클래스(범주)

 
OneHot Encoding 코드 작성 예시를 한 번 살펴보자

oe = OneHotEncoder()
oe.fit(titanic_df[['Embarked']])
embarked_csr = oe.transform(titanic_df[['Embarked']])
embarked_csr_df = pd.DataFrame(embarked_csr.toarray(), columns = oe.get_feature_names_out())
  1. oe 변수에 OneHot Encoder 기능을 넣어주고
  2. 데이터를 학습시킨 후
  3. 기존 범주형 데이터를 정수 형태로 바꿔준다.
  4. OneHot Encoder의 경우 배열 형태로 바꿔줘야하므로 toarray() 함수를 활용함과 동시에 학습한 컬럼 이름을 지정해준다.

 
fit, transform, fit_transform 메서드를 사용할 때
인덱싱에 유의해야한다.
 

le.fit(titanic_df[['Sex']]

fit의 소괄호 안에 데이터프레임 형태 테이블의 특정 컬럼을 넣을 경우
꼭 대괄호를 두 번 넣어야하며
 

le.transform(titanic_df['Sex'])
oe.transform(titanic_df[['Embarked']])

LabelEncoding과 OneHot Encoding에서 transform 메서드를 사용할 때는
각각 transform 소괄호 안에 대괄호 한 번, 대괄호 두 번을 적어줘야한다.
 

수치형 데이터 전처리(Scaling)

  1. 표준화(Standardization)
  2. 정규화(Normalization)
  3. 로버스트 스케일링(Robus Scaling)

모델은 숫자를 기반으로 학습하기때문에
문자로 이루어져있는 범주형 자료들을 전처리(인코딩)해줄 필요가 있다.
그런데 수치형 데이터들은 이미 숫자로 이루어져 있는데 왜 전처리(스케일링)해야할까?
바로 '단위' 때문이다.

 

1. 표준화(Standardization)

 
표준화의 산식은
(각 데이터 - 평균) / 표준편차
로 기초통계의 Z-score를 구하는 산식과 동일하다.
 
표준화에서 사용하는 함수, 메서드, 그리고 속성은 아래와 같다.

함수
sklearn.preprocessing.StandardScaler -
메서드
fit 데이터 학습
transform 정수형 데이터로 변환
속성
mean_ 데이터의 평균 값
scale_, var_ 데이터의 표준편차, 분산 값
n_features_in_ fit 할 때 들어간 변수의 개수
feature_names_in_ fit 할 때 들어간 변수의 이름
n_samples_seen_ fit  할 때 들어간 데이터의 개수

 

표준화 산식을 보면 측정값에다 평균값을 빼준다.

평균값은 이상치의 영향을 많이 받을수밖에 없기때문에

평균값을 사용하는 Standardization 역시도 이상치의 영향을 받는다. 

표준화 했을때의 결과값은 아래 이미지에서와같이 정규분포를 따른다.

 

표준화의 사용 예시는 아래와 같다.

from sklearn.preprocessing import StandardScaler
sd_sc = StandardScaler()
titanic_df['Fare_sd_sc'] = sd_sc.fit_transform(titanic_df[['Fare']])

라이브러리를 불러와서
데이터를 학습시키고 변환시킨 후 새로운 컬럼에 그 값을 넣어준다.
그렇게 했을때의 결과값은 아래와 같다.

 
 

2. 정규화(Normalization) / Min-Max Scaler


정규화란 데이터를 0과 1 사이 값으로 조정하는 작업을 의미한다.
산식은 아래와 같다.
각 데이터 - 최소값 / 최대값 - 최소값
각각의 데이터에서 최소값을 뺀 값을 최대값에서 최소값을 빼준 값으로 나누어준다.
 
정규화에서 사용하는 함수, 메서드, 그리고 속성은 아래와 같다.

함수
sklearn.preprocessing.MinMaxScaler -
메서드
fit 데이터 학습
transform 정수형 데이터로 변환
속성
data_min_ 원 데이터의 최소값
data_max_ 원 데이터의 최대값
data_range_ 원 데이터의 최대-최소 범위

 
정규화는 모든 특성의 스케일을 동일하게 맞추고,
최대-최소 범위가 명확하다는 장점이 있는 반면에
 

결과값의 분포 예시인데

표준화와 Robust Scaler의 결과값이 정규분포를 따르는 것과 달리

Min-Max Scaler의 결과값은 기존 데이터의 분포 특성을 그대로 가져간다는 특징이 있다.

일반적으로 가장 많이 쓰는 Scailing 방식이다.
 
정규화의 사용 예시는 아래와 같다.

from sklearn.preprocessing import MinMaxScaler
mm_sc = MinMaxScaler()
titanic_df['Age_mean_mm_sc'] = mm_sc.fit_transform(titanic_df[['Age_mean']]

표준화와 마찬가지로 라이브러리를 불러와서
데이터를 학습시키고 변환시킨 후 새로운 컬럼에 넣어준다.
그렇게 했을때의 결과값은 아래와 같다.

 

3. Robust Scaler

Robust Scaler의 산식이다.

Q1은 전체 데이터의 25%를,

Q3은 전체 데이터의 75%를 의미한다.

Robust Scaler의 경우 평균값을 사용하지 않기때문에 이상치의 영향을 거의 받지 않는다.

결과값은 표준화와 마찬가지로 정규분포를 따른다.