상세 컨텐츠

본문 제목

[데이터가 뛰어노는 AI 놀이터, 캐글] ch.3 특징 생성-3.5 범주형 변수 변환

외부활동/동아리

by lyricalh 2024. 4. 15. 01:44

본문

변수가 문자열로 나타날 때뿐만 아니라, 데이터상으로는 수치라 하더라도 값의 크기나 순서에 의미가 없을 때는 범주형 변수로 취급

범주형 변수를 변화 하기 전에 테스트 데이터에만 존재하는 범주가 있는지부터 확인하고,

만일 있다면 다음 방법 중 하나를 선택

  • 특별히 대응하지 않아도 영향이 적음을 확인
  • 최빈값이나 예측으로 보완
  • 변환할 때 해당 변환의 평균에 가까운 값 입력

3.5.1 원-핫 인코딩(one-hot encoding)

범주형 변수의 가장 대표적이고 전통적인 처리 방법

범주형 변수의 각 레벨에 대해 해당 레벨인지 여부를 나타내는 0과 1 두 값을 갖는 변수를 각각 생성

→ n개의 레벨을 갖는 범주형 변수에 원-핫 인코딩을 적용하면 두 값 (0,1)을 갖는 변수의 특징이 n개 만들어짐 (이들 두 값의 변수 :가변수)

pandas 모듈의 get_dummies 함수

사이킷런 preprocessing 모듈의 OneHotEncoder 클래스

결점 :특징의 개수가 범주형 변수의 레벨 개수에 따라 증가

→ 범주형 변수의 레벨이 너무 많을 땐?

  • 원-핫 인코딩 이외의 다른 인코딩 방법 검토
  • 임의의 구칙을 활용한 그룹화로 범주형 변수의 레벨 개수(종류) 줄이기
  • 빈도가 낮은 범주를 모두 ‘기타 범주’로 한데 모아 정리

다중공선성 문제

→ 가변수 n-1개 만듦

(다중공선성이란?

: 통계학의 회귀 분석에서(예측하려는 대상인 목적변수를 제외한) 설명변수 간에 강한 상관관계가 나타나는 문제. 해결 방법으로는 상관관계가 높은 하나 또는 일부의 변수를 제거하거나 PCA(주성분분석) 이용)

3.5.2 레이블 인코딩(label encoding)

(= 순서형 인코딩)

레벨을 정수로 변환

수치는 대부분 본질적인 의미가 없음

→ 결정트리모델에 기반을 둔 방법이 아닐 경우 레이블 인코딩으로 변화한 특징을 학습에 직접 이용하는 건 그다지 적절하지 않음

사이킷런의 LabelEncoder 클래스

3.5.3 특징 해싱(feature hashing)

원-핫 인코딩으로 변환 뒤 범주의 레벨 수와 같아지는 특징의 수를 줄이는 변환

변환 후의 특징 수를 먼저 정해두고, 해시함수를 이용하여 레벨 별로 플래그를 표시할 위치를 결정

경진 대회에서는 레벨의 수가 많아도 레이블 인코딩으로 변환한 뒤 GBDT로 학습함으로써 어느 정도 대응할 수 있으므로 이 방법은 그다지 널리 쓰이지는 않음

sckit-learn.feature_extraction 모듈의 FeatureHasher

3.5.4 프리퀀시 인코딩(frequency endoing)

출현 횟수 혹은 출현 빈도로 범주형 변수를 대체하는 방법

각 레벨의 출현 빈도와 목적변수 간에 관련성이 있을 때 유효

동률의 값이 발생할 때도 있으니 주의

수치형 변수 스케일링과 마찬가지로, 학습 데이터와 테스트 데이터를 따로따로 정의하여 변환해버리면 다른 의미의 변수가 되므로 주의

3.5.5 타깃 인코딩(target encoding)

목적변수를 이용하여 범주형 변수를 수치형 변수로 변환하는 방법

→ 목적변수의 데이터 정보 누출 우려

타깃 인코딩의 기법과 구현 (1)

학습 데이터를 “타깃 인코딩용 폴드”로 분할하고,

각 폴드마다 자신의 폴드 이외의 데이터로 계산하는 “아웃 오브 폴드” 방법으로

목적변수의 평균값 계산

(타깃 인코딩용 폴드 수는 4개에서 10개 정도가 좋음)

타깃 인코딩의 기법과 구현 (2)

교차 검증을 실시할 경우,

검증 데이터의 목적변수가 변수에 포함되지 않도록 하기 위해

각 폴드에서는 검증 데이터를 제외한 학습 데이터를 타깃 인코딩용 폴드로 분할

이 작업을 교차 검증의 폴드 수만큼 반복

목적변수의 평균 구하기

  • 회귀: 목적변수의 평균을 구함
  • 이진 분류: 양성=1, 음성=0으로 하여 평균
  • 다중 클래스 분류: 클래스 수만큼 이진 분류가 있다고 가정하고, 클래스 수만큼 타깃 인코딩에 의한 특징 만듦

(중앙값 취할 때도, 평가지표가 로그 변환으로 평가될 때는 로그 취하고 평균 계산)

타깃 인코딩과 데이터 정보 누출(1)

학습 데이터 전체에서 단순 타깃 인코딩을 할 경우,

→ 특정 레벨에 속하는 행 데이터가 1개뿐일 때, 해당 레벨의 타깃 인코딩 결과는 목적변수의 값 자체가 되어버림 →과적합

타깃 인코딩과 데이터 정보 누출(2)

리브-원-아웃(leave-one-out) 문제 (=폴드 수가 지나치게 늘어나도 문제)

  1. 변환할 행만 집계에 포함시키지 않지만 반대로 해당 행의 목적변수를 강하게 반영한 변환이 됨
  2. 결과가 명확하게 갈리는 현상
  3. +원래는 타깃 인코딩된 결과값이 1에 가까울수록 목적변수가 1이 될 확률이 높아지는 변환이지만, 관계성이 역전될 수도 있음

→ 폴드 수는 적당한게 좋음 (4~10)

그 밖이 타깃 인코딩

데이터 정보 누출 방지 위해 변환된 값에 노이즈를 더하는 방법

데이터 수가 적은 레벨이 극단적인 값을 취하지 않도록 데이터 전체의 평균값과 가중치를 부여

등등

3.5.6 임베딩(embedding)

(=분산 표현)

자연어 처리에서 단어나 범주형 변수와 같은 이산적인 표현을 실수 벡터로 변환하는 방법

레벨의 수가 많아 (원-핫 인코딩 등의 방법으로) 해당 변수가 지닌 정보를 모델에 충분히 학습시키기 어려울 땐?

→ 단어나 범주형 변수를 의미와 성질이 표현된 실수 벡터로 변환하면 편리함

자연어 처리에서 단어에 대한 학습이 이미 끝난 단어 임베딩 종류

word2Vec

GloVe

fastText

(각각 어떤 모델로 단어를 표현하는 벡터를 학습했는지가 다름)

임베딩을 이용한 학습

임베딩 계층의 가중치(각 단어나 범주형 변수를 어떤 실수 벡터로 변환할지)를

  • 내부에서 설정하는 경우,
    • 학습 전,
    • 신경망에서는 원-핫 인코딩을 하지 않아도 임베딩 계층에 범주형 변수를 부여하여 학습 가능
    • 학습한 후,
    • 모델이 학습한 범주형 변수의 각 레벨이 지니는 의미와 성질을 추출할 수 있음
  • 외부에서 설정하는 경우,
  • 자연어 처리 문제에서는 ‘학습이 끝난 임베딩’을 가중치로 부여함으로써 단어의 의미를 어느 정도 이해한 상태로 모델 학습을 시작

3.5.7 순서변수(ordinal variable)

측정 대상에 서열(순서)를 부여하는 변수

값의 간격은 무의미

결정 트리 기반 모델에서는,

본래 변수의 순서에만 의존하므로 서열을 그대로 정수로 치환해 수치형 변수로 다루면 됨

그 밖의 모델에서는,

수치형 변수라 볼 수도 있고, 순서 정보를 무시하고 범주형 변수로 도 볼 수 있음 →둘 다 사용

3.5.8 범주형 변숫값의 의미 추출

레벨이 의미를 지닐 때,

  • ABC-00123이나 XYZ-00200 →앞쪽의 영문3글자와 뒷쪽의 숫자 5글자로 분할
  • 숫자와 영문이 섞였을 때 → 숫자인지 아닌지를 특징으로 생성
  • 문자의 수가 서로 다를 때(ex AB, ACE, BCDE)→문자 수를 특징으로 생성

관련글 더보기