본문 바로가기

Machine Learning

Categorical 변수

반응형
features의 종류
  • continuous feature
  • categorical feature (discrete feature)
위의 특성은 입력에 대한 정보로, 출력에서 classification과 regression 차이와 유사하다.

대부분의 현실에 존재하는 feature는 categorical feature인 경우가 대부분이다. 
가령, 소설책, 과학잡지, 역사책 등의 책 범주에선, 각 범주간에 중간값이 존재 하지 않으며, 순서도 정의 되지 않는다.

하지만, 데이터에서 feature들이 어떤 형태로 구성되었는가 보다 데이터를 어떻게 표현하는가가 머신러닝 모델의 성능에 주는 영향이 매우 크다.
특정 application에 가장 적합한 data representation을 찾는 것을 feature engineering
올바른 데이터 표현은 supervised learning 모델에서 parameter 선택보다 성능에 큰 영향을 준다.


Categorical 변수

1. 문자열로 표현된 Categorical Features


income이 50K이상이냐 50K미만이냐에 대한 두 클래스 classification 문제를 가정하자.
age나 hours-per-week와 달리 데이터내에 gender, education나 workclass등은 categorical features다.
categorical feature를 표현하기 위해 가장 널리쓰는 표현 방식은 One-hot-encoding이다. 달리 표현하면, One-out-of-N-encoding이다. 변수를 0 또는 1값을 가진 하나이상의 새로운 feature로 변환 하는 것이다.
가령, workclass feature에서 self Employed에 해당하는 data에 feature를 별도로 생성하여 해당하는 data는 1 나머지는 0으로 표현한다. 즉 N중의 1이라는 의미에서 one-out-of-N-encoding이라 하는 것이다.



적용

categorical 변수의 data 확인
분석에 앞서 column에 어떤 의미 있는 범주형 데이터가 있는지 확인할 필요가 있다. 가령 gender를 man, male등 같은 값을 달리 표현하여 잘못 데이터를 분석할 수 있을 위험이 있기 때문이기도 하다.

위의 메서드는 pandas에서 제공하는 Series(Data Frame의 열을 의미)에 있는 value_counts() 메서드 이다.

one-hot-encoding


taget value Separation
또한, 타깃 값인, income에 대한 열을 분리해줄 필요가 있다. supervised learning에서 간과하기 쉬운 실수이다.


주의사항 get_dummies(one-hot-enconding용) 사용전에 traing-set과 test-set의 확인
get_dummies를 이용할때, training-set과 test-set에 같은 data frame이라 가정하면, 쉽게 변환하여 사용할 수 있지만,
가령, test-set에 있는 feature내에 data가 traing-set에 존재 하지 않거나 그와 반대로, traing에 있는 것이 test에 없을 경우 문제가 발생한다. 전혀 다른 방식으로 encoding되어, 모델을 통한 예측 결과가 정말 좋지 않게 나오기 때문이다.

이런 문제를 해소하려면...(2가지 방법중 택1)
  1. 각각의 set에 존재하는 데이터 포인트를 모두 포함하는 DataFrame을 사용해 get_dummies를 호출
  2. 각각의 set에 get_dummies를 호출한후에 훈련 세트와 테스트 세트의 열 이름을 비교해서 같은 속성인지 확인




2. 숫자로 표현된 Categorical Features

앞서 본 문자열 특성은 범주형임을 명확하게 알려주지만, 숫자형 categorical features는 get_dummies는 연속형 특성으로 생각하여 one-hot-encoding이 이루어지지 않는다.
따라서, scikit-learn의 OneHotEncoder(get_dummies와 같지만, 숫자로된 categorical features에만 사용 가능)를 사용하거나, DataFrame에 숫자로된 열을 문자열로 변환하는 것이 그 방법이다.
아래는 문자열형으로 형변환을 통해 인코딩한 예이다. 


위의 첫번째 결과처럼 단순하게 숫자 특성에 대한 별도 처리가 없을 경우, get_dummies가 숫자 특성을 범주형 특성으로 처리하지 않는다.


반응형