Data Preprocessing (데이터 전처리)
1. 결측값 (NaN, Null 값) 허용 X
2. 문자열 값 (카테고리형 / 텍스트 형) 입력값으로 허용 X
-> 숫자형으로 변환 인코딩
feature vectorization
Data Encoding
1. Label Encoding
: 카테고리 피처 -> 코드형 숫자값으로 변환
* 숫자 값은 크고 작음에 대한 특성이 작용해 일부 머신러닝 알고리즘에는 예측 성능이 떨 어질 수도 있음
레이블 인코딩은 선형 회귀와 같은 ML 알고리즘에서는 X, 트리 계열 ML 알고리즘은 괜찮음
from sklearn.preprocessing import LabelEncoder
items = ['사과', '포도', '복숭아', '딸기']
encoder = LabelEncoder( )
encoder.fit(items)
labels = encoder.transform(items)
2. One-Hot Encoding
: 피처 값의 유형에 따라 새로운 피처를 추가해 고유값에 해당하는 칼럼에만 1 표시, 나머지 칼럼에는 0
해당 고유값에 매칭되는 피처만 1, 나머지는 0
* 주의점 1) One Hot Encoder 로 변환하기 전 모든 문자열 값은 숫자형 값으로 변환되어야
2) 입력값으로 2차원 데이터가 필요
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items = ['사과', '포도', '복숭아', '딸기']
encoder = LabelEncoder( ) # 숫자 값으로 변환을 위해 LabelEncoder 로 변환
encoder.fit(items)
labels = encoder.transform(items)
labes = labels.reshpae(-1, 1) # 2차원 데이터로 변환
oh_encoder = OneHotEncoder( )
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print(oh_labels.toarray( )) # 원-핫 인코딩 디이터
print(oh_labels.shape) # 원-핫 인코딩 데이터 차원
# get_dummies( ) API를 이용하면 문자열 카테고리 값을 숫자 형으로 변환할 필요 없이 바로 변환 가능
import pandas as pd
df = pd.dataframe({'items' : ['사과', '포도', '복숭아', '딸기']})
pd.get_dummies(df)
Feature Scaling (피처 스케일링)
: 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업
# Standardization (표준화)
: 데이터의 피처 평균이 0이고, 분산이 1인 가우시안 정규 분포를 가진 값으로 변환
* StandardScaler : 개별 피처를 평균이 0, 분산이 1인 값으로 변환
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris( )
iris_data = iris.data
iris_df = pd.DataFrame(data = iris_data, columns = iris.feature_names) # iris 데이터 DataFrame 으로 변환
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler( ) # StandardScaler 객체 생성
scaler.fit(iris_df) # StandardSclaer 로 데이터 세트 변환
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
iris_df_sclaed = pd.DataFrame(data = iris_scaled, columns = iris.feature_names)
# transform( ) 스케일 변환된 데이터 세트가 NumPy ndarray 로 반환돼 DataFrame 로 변환
# Normalization (정규화)
: 서로 다른 피처의 크기를 통일하기 위해 크기를 변환 (개별 데이터의 크기를 모두 똑같은 단위로 변경)
* 사이킷런의 Normalizer 모듈은 선형대수에서의 정규화 개념을 적용, 개별 벡터의 크기를 맞추기 위해 변환, 개별 벡터를 모든 피처 벡터의 크기로 나누기
* MinMaxScaler : 데이터 값을 0과 1사이의 범위 값으로 변환 (음수 값이 있으면 -1 ~ 1 값으로 변환)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler( ) # MinMaxScaler 객체 생성
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df) # MinMaxScaler 로 데이터 세트 변환
iris_df_scaled = pd.DataFrame(data = iris_scaled, columns = iris.feature_names)
# transform( ) 스케일 변환된 데이터 세트가 NumPy ndarray 로 반환돼 DataFrame 로 변환
* fit( ) : 데이터 변환을 위한 기준 정보 설정 (데이터 세트의 최댓값/최솟값 설정 등)
* transform( ) : 설정된 정보를 이용해 데이터를 변환
* fit_transform( ) : fit( ) 과 transform( ) 을 순차적으로 수행하는 메소드 (테스트 데이터에서는 절대 사용해서는 안됨)
* 주의점 : scaler 객체를 이용해 학습 데이터 세트로 fit( ), transform( ) 적용하면 테스트 데이터 세트로는 다시 fit( ) 을 수행하지 않고 학습 데이터 세트로 fit( ) 을 수행한 결과를 이용해 transform( ) 변환을 적용해야 함. 학습 데이터로 fit( ) 이 적용된 스케일링 기준 정보를 그대로 테스트 데이터에 적용해야하며, 그렇지 않고 테스트 데이터로 다시 새로운 스케일링 기준 정보를 만들게 되면 학습 데이터와 테스트 데이터의 스케일링 기준 정보가 서로 달라지기 때문에 올바른 예측 결과를 도출하기 어려움
1. 가능하다면 전체 데이터의 스케일링 변환을 적용한 뒤 학습과 테스트 데이터로 분리
2. 불가능하다면 테스트 데이터 변환시에는 fit( ) 이나 fit_transform( ) 을 적용하지 않고 학습 데이터로 이미 fit( ) 된 Scaler 객체를 이용해 transform( ) 으로 변환
[스배데] 4주차 복습
전처리 중요성 - Distribution
Standardization
Standard Scaler
Normalization - 데이터의 분포를 맞춤
Re-identification