[sklearn] 데이터 전처리 - 데이터 인코딩

|


사이킷런의 머신러닝 알고리즘은 문자열 값을 입력으로 허용하지 않는다. 그래서 이 문자열을 숫자형으로 변환해야하는데 이때 문자열 피처는 일반적으로 카테고리형과 텍스트형을 의미한다. 카테고리형 피처는 코드 값으로 표현될 수 있으며 텍스트형 피처는 피처 벡터화 등의 기법으로 벡터화하거나 불필요하다면 삭제하는게 좋다.

데이터 인코딩

머신러닝을 위한 대표적인 인코딩 방식은 Label encoding과 One-hot encoding이 있다.

Label Encoding

사이킷런에는 LabelEncoder 클래스가 구현되어 있다. LabelEncoder 객체 생성 후 fit( )과 transform( )을 호출해 레이블 인코딩을 수행한다.

image


지금은 데이터가 작아서 문자열 값이 어떤 숫자 값으로 인코딩 됐는지 직관적으로 알 수 있지만 데이터가 많은 경우에는 이를 알지 못한다. 이 경우에는 LabelEncoder 객체의 classes_ 속성값으로 확인하면 된다. 이 classes_ 속성은 0번부터 순서대로 변호나된 인코딩 값에 대한 원본값을 가지고 있다. 즉, 1이 냉장고임을 알 수 있다는 것이다. 이를 다시 디코딩하기 위해서는 inverse_transform( ) 을 적용하면 된다.

image


레이블 인코딩은 간단하게 문자열 값을 숫자형 카테고리 값으로 변환한다. 그러나 일괄적인 숫자값으로의 변환이 예측성능을 떨어트리는 원인이 될 수 있다. 이는 할당받은 카테고리 별 숫자 값의 크고 작음에 대한 특성이 작용하기 때문이다. 냉장고 1 이 믹서 2보다 작은 값을 가지므로 믹서가 냉장고보다 특정 ML알고리즘에서 가중치가 더 부여되거나 더 중요하게 인식할 가능성이 발생한다. 이러한 특성때문에 레이블 인코딩은 선형회귀와 같은 ML 알고리즘에서는 적용하지 않아야한다. 트리 계열의 ML 알고리즘은 숫자의 이러한 특성을 반영하지 않으므로 레이블 인코딩을 사용해도 된다.


One-hot Encoding

원-핫 인코딩은 레이블 인코딩의 이러한 문제점을 해결하기 위한 인코딩 방식이다. 원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가하고 고유 값에 해당하는 칼럼에만 1을 표시, 나머지는 다 0을 표시하는 방식이다. 즉, 행 형태로 되어 있는 피처의 고유값을 열 형태로 차원을 변환한 뒤, 고유 값에 해당하는 칼럼에만 2을 표시하고 나머지 칼럼에는 0을 표시한다.

image

위의 그림과 같이 여러개의 속성 중 단 한 개의 속성만 1로 표시하기 때문에 One-hot encoding이라고 한다.

원-핫 인코딩은 사이킷런에 OneHotEncoder 클래스로 쉽게 변환이 가능하다. 조금 주의할 점이 있는데 첫 번째는 OneHotEncoder로 변환하기 전에 모든 문자열 값이 숫자형 값으로 변환돼야 하며, 두 번째는 입력 값으로 2차원 데이터가 필요하다는 점이다. 즉, LabelEncoder를 거쳐서 바꾸는게 용이하다.

image


pandas에는 원-핫 인코딩을 더 쉽게 지원하는 API가 있다. get_dummies( )이다. 사이킷런과 다르게 문자열 카테고리를 숫자 형으로 변환할 필요없이 바로 적용이 가능하다.

image

Comments