728x90
반응형
데이터 전처리(data preprocessing)
- ML 알고리즘만큼 중요하다.
- 결손값, NaN, Null값은 허용되지 않는다. - 이 값을 고정된 다른 값으로 변환해야 한다.
- 문자열 값은 인코딩돼서 숫자 형으로 변환해야 한다.
- 문자열 피처는 일반적으로 카테고리형 피처와 텍스트형 피처를 의미한다.
- 텍스트형 피처는 피처 벡터회(feature vectoriztion)등의 기법으로 벡터화하거나 불필요한 피처라고 판단되면 삭제하는 것이 좋다.
데이터 인코딩
- 머신러닝을 위한 대표적인 인코딩 방식은 레이블 인코딩(label encoding)과 원-핫 인코딩(One Hot encoding)이 있다.
레이블 인코딩(Label encoding)
- 카테고리 피처를 코드형 숫자 값으로 변환하는 것
- 사이킷런은 LabelEncoder 클래스로 구현
- LabelEncoder를 객체로 생성한 후 fit()과 transform()을 호출해 레이블 인코딩을 수행한다.
# 레이블 인코딩 label encoding
from sklearn.preprocessing import LabelEncoder
items = ['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
# LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환 값 : ',labels)
# 인코딩 값 다시 디코딩
print('디코딩 원본값 : ', encoder.inverse_transform([0,1,4,5,3,3,2,2]))
원-핫 인코딩(One-Hot Encoding)
- 원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식이다.
- 행 행태로 돼 있는 피처의 고유 값을 열 행태로 차원을 변환한 뒤, 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시한다.
# 원-핫 인코딩 One-Hot encoding
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items = ['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
# 먼저 숫자 값으로 변환 위해 LabelEncoder로 변환
encoder = LabelEncoder()
encoder.fit(items)
lables = encoder.transform(items)
# 2차원 데이터로 변환
labels = labels.reshape(-1,1)
# 원-핫 인코딩을 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)
# 데이터 프레임으로 확인
import pandas as pd
df = pd.DataFrame({'item':['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})
pd.get_dummies(df)
- get_dummies() 활용시 숫자형 값으로 변환 없이도 바로 변환이 가능하다.
피처 스케일링과 정규화
- 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 피처 스케일링(feature scaling)이라고 한다.
- 대표적인 방법으로 표준화(Standardization)와 정규화(Normalization)가 있다.
- 표준화는 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미한다.
- 정규화는 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념
StandardScaler
- 표준화를 지원하기 위한 클래스
- 개별 피처를 평균이 0이고, 분산이 1인 값으로 변환해준다.
# StandardScaler 가 어떻게 데이터 값을 변환하는지 데이터 세트 확인
from sklearn.datasets import load_iris
import pandas as pd
# 붓꽃 데이터 세트를 로딩하고 DataFrame으로 변환
iris = load_iris()
iris_data = iris.data
iris_df =pd.DataFrame(data=iris_data, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df.mean())
print('\nfeature 들의 분산 값')
print(iris_df.var())
StandardScaler 이용해 각 피처 표준화
# StandardScaler 이용해 각 피처 표준화
from sklearn.preprocessing import StandardScaler
# StandardScaler 객체 생성
scaler = StandardScaler()
# StandardScaler로 데이터 세트 변환 fit(), transform() 호출
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
# transform() 스케일 변환 데이터 세트가 numpy ndarray로 반환돼 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\nfeature 들의 분산 값')
print(iris_df_scaled.var())
- 평균이 0에 아주 가까운 값
- 분산은 1에 아주 가까운 값으로 변환
MinMaxScaler
- 데이터값을 0과 1사이의 범위 값으로 변환(음수 값이 있으면 -1에서 1값으로 변환한다.)
- 데이터의 분포가 가우시안 분포가 아닐 경우 Min, Max Scale을 적용해 볼 수 있다.
# MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
# MinMaXsCALER 객체 생성
scaler = MinMaxScaler()
# MinMaxScaler로 데이터 세트 변환
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
# Numpy ndarray로 반환돼 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns = iris.feature_names)
print('feature 들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature 들의 최댓값')
print(iris_df_scaled.max())
학습 데이터와 테스트 데이터의 스케일링 변환 시 유의점
- 가능하다면 전체 데이터의 스케일링 변환을 적용한 뒤 학습과 테스트 데이터로 분리
- 1이 여의치 않다면 테스트 데이터 변환 시에는 fit()이나 fit_transform()을 적용하지 않고 학습 데이터로 이미 fit()된 Scaler 객체를 이용해 transform()으로 변환
728x90
반응형
최근댓글