가변수화

가변수화

가변수화에 대한 설명

pd.get_dummies()를 사용하면 가변수화를 할 수 있다.
가변수화에는 One-Hot-Encoding과 One-Cold-Encoding이 있다.
보통 가변수화라고 하면 One-Hot-Encoding을 뜻한다.
One-Hot-Encoding은 아래 이미지와 같은 작업을 말한다.

이미지 출처: https://www.kaggle.com/code/alexisbcook/categorical-variables/tutorial

위 이미지처럼 One-Hot-Encoding을 하면 값들이 컬럼으로 생성되고 해당되는 컬럼에 1이 표시되고 나머지 컬럼에는 0으로 표시된다.
cf) One-Cold-Encoding은 One-Hot-Encoding에서 0과 1을 뒤집으면 된다.


pd.get_dummies()에서 drop_first=True 속성을 주면 첫 컬럼을 제외하고 만들어진다.

이미지 출처: 위 이미지를 가공하여 해당 이미지를 만듦.

위 이미지에서 Yellow와 Green 모두 0인 경우는 Red인 값이라고 해석하면 된다.

가변수화는 언제하는가?

모델링을 하기 전에 범주형 데이터 들 중 숫자로 되어 있지 않은 변수들에 대해서 가변수화를 진행한다.

0과 1로만 구성된 숫자가 아닌 숫자로 된 범주형에 대해서도 가변수화를 진행한다.

  • 이 경우에는 반드시 가변수화를 진행할 필요는 없다.
  • ex) 설문조사에 대한 변수로써 1(매우 불만족) ~ 5(매우 만족)의 값을 갖고 있는 경우
    • 이 경우, 중요도가 동일한 수준으로 증가하는 의미를 갖는다고 판단되면 가변수화를 할 필요가 없다.

단, 가변수화 할 때와 안 할 때에는 성능 차이가 있을 것이다.
가변수화를 했을 때와 안 했을 때 성능을 확인해볼 필요가 있다.
가변수화를 하면 기존 열이 제거되고, 그 의미를 파악하기 힘들게 수 많은 변수들이 만들어진다.
이렇게 되면 이후에 변수들의 중요도를 설명하기가 어려워 질 수 도 있다.
★따라서 설명을 위한 것인지 성능을 위한 것인지 고민하여 결정한다.

가변수화의 함정(?)

x1에 해당하는 모든 범주의 종류가 train 셋에 존재해야한다.

그런데 train 데이터를 train과 validation 셋으로 분할했을 때, train 셋에 x1에 해당하는 모든 범주의 종류가 포함되지 않을 수도 있다.

이 경우 모델의 학습이 제대로 이루어지지 않는다.

따라서 이런 상황을 방지하기 위해, 변수의 데이터 타입을 category로 변경한다.

코드로 살펴보는 가변수화

x, y분리와 train, val, test 셋 분리는 되어있다고 가정하자.

  • 가변수화 하기 전에 범주형 변수들에 대해서 category로 데이터타입을 변경
    • 해당 작업은 데이터 분석(이해) 단계에서 진행
cat = {'Sex':['female', 'male'],
       'Embarked':['S', 'Q', 'C'],
       'Pclass':[1, 2, 3]}

for k, v in cat.items():
    x_train[k] = pd.Categorical(x_train[k], categories=v, ordered=False)
    
x_train.info()

  • pd.getdummies()로 가변수화
cat = {'Sex':['female', 'male'],
       'Embarked':['S', 'Q', 'C'],
       'Pclass':[1, 2, 3]}
       
x_train = pd.get_dummies(x_train, columns=cat.keys(), drop_first=True)
  • 확인
x_train.tail(2)

데이터 출처:https://www.kaggle.com/c/titanic

좋은 웹페이지 즐겨찾기