이번 글에서는 사이킷런의 주요 모듈 중에 데이터 전처리 관련된 모듈을 자세히 살펴보자.
머신러닝에서 데이터 전처리는 굉장히 중요한 과정이며, 머신러닝은 데이터에 굉장히 의존적이기 때문에 잘못된 데이터를 이용하여 학습하면 성능도 좋지 못한 결과를 낼 수 밖에 없다.
Garbage in, garbage out
머신러닝 알고리즘은 문자열 데이터 속성을 입력 받지 않으며 모든 데이터는 숫자형으로 표현되어야
한다.
문자형 카테고리형 속성은 모두 숫자값으로 변환/인코딩 되어야 한다.
인코딩 방식에는 레이블(Label) 인코딩 방식과 원 핫(One Hot) 인코딩
방식이 있다.
먼저 레이블(Label) 인코딩 방식은 아래와 같다.
문자열로 되어 있는 상품 분류를 레이블 인코딩을 진행하였다.
아래 코드로 보자.
from sklearn.preprocessing import LabelEncoder
items = ['TV', '냉장고', '전자렌지', '컴퓨터', '선풍기', '선풍기', '믹서', '믹서']
# LabelEncoder를 객체로 생성 후, fit(), transform() 으로 Label 인코딩 수행
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
# labels = encoder.fit_transform(items) # fit, transform 한번에 사용 가능
print('인코딩 변환값: ', labels)
print('인코딩 클래스: ', encoder.classes_)
print('디코딩 원본 값: ', encoder.inverse_transform([4,5,2,0,1,1,3,3]))
# Output
인코딩 변환값: [0 1 4 5 3 3 2 2]
인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자렌지' '컴퓨터']
디코딩 원본 값: ['전자렌지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']
해당 방식은 모델에서 주의할 점이 있다.
인코딩한 숫자 값은 크기를 구분하지 않고 인코딩 하였는데, 알고리즘에 따라
인코딩된 숫자 크기 값을 잘못 해석하는 경우가 발생한다.
이런 방식을 해결 하기 위해서 원 핫 인코딩
을 사용할 수 있다.
아래 코드로 보자.
판다스에서 제공하는 get_dummies(DataFrame)을 이용하면, 간편하게
원 핫 인코딩을 진행할 수 있다.
import pandas as pd
#from sklearn.preprocessing import OneHotEncoder
df = pd.DataFrame({'item': ['TV', '냉장고', '전자렌지', '컴퓨터', '선풍기', '선풍기', '믹서', '믹서']})
one_df = pd.get_dummies(df)
one_df
Output
스케일링이란 데이터 전처리 과정 중 하나이며, feature들 마다 데이터값의 범위가 다 제각각이기 때문에 범위 차이가 클 경우 데이터를 갖고 모델을 학습할 때 0으로 수렴하거나 무한으로 발산할 수 있다.
따라서 스케일링을 통해 모든 피처들의 데이터 분포나 범위를 동일하게 조정해 줄 수 있다.
사이킷런은 스케일링을 지원하는 많은 함수들을 제공하며, 대표적인 함수는 아래와 같다.
스케일링을 무조건 한다고 성능이 좋아지는 것은 아니지만, 선형 계열(Linear Regression, SVM 등) 알고리즘은
스케일링에 영향을 받을 수 있기 때문에 해주는 것이 좋다.
단, 트리 계열 알고리즘은 스케일링에 큰 영향을 받지 않는다.
Referrence