포켓몬과 여행하는 특징량 엔지니어링-카테고리 변수편-

기계 학습에서 카테고리 데이터 등 문자열 데이터는 수치 데이터로 고치지 않으면 기계 학습 모델에 넣을 수 없습니다. 또한 숫자 데이터에서도 순서 척도가 아닌 데이터는 범주형 변수로 취급해야 합니다. 이 기사에서는 카테고리 변수를 기계가 이해할 수 있는 형태로 고치는 방법을 소개합니다.

이번은 포켓몬과 여행하는 특징량 엔지니어링-수치편- 의 때와 같이 포켓몬 데이터 세트 를 이용합니다.

라이브러리 로드


import pandas as pd
from sklearn.feature_extraction import FeatureHasher

데이터 로드


df = pd.read_csv('./data/121_280_bundle_archive.zip')
df.head()

데이터


#
이름
Type 1
Type 2
Total
HP
공격
Defense
Sp. Atk
Sp. Def
속도
Generation
Legendary


1
Bulbasaur
Grass
Poison
318
45
49
49
65
65
45
1
거짓

2
Ivysaur
Grass
Poison
405
60
62
63
80
80
60
1
거짓

3
Venusaur
Grass
Poison
525
80
82
83
100
100
80
1
거짓

3
VenusaurMega Venusaur
Grass
Poison
625
80
100
123
122
120
80
1
거짓

4
Charmander
Fire
NaN
309
39
52
43
60
50
65
1
거짓


더미 인코딩



더미 인코딩은 특징량 엔지니어링에서 카테고리 변수를 다룰 때 가장 인기 & 자주 등장하는 방법입니다. 각 카테고리 변수를 0, 1 비트로 표현합니다. 카테고리 값을 해당하는 부분의 비트는 1이 되고 해당되지 않는 부분의 비트는 0이 됩니다.


pandas에는 더미 인코딩을 쉽게 함수가 있습니다. 코드를 살펴 보겠습니다.
# One-hot Encoding
gdm = pd.get_dummies(df['Type 1'])
gdm = pd.concat([df['Name'], gdm], axis=1)

Bulbasaur(후시기다네)의 Grass(풀) 타입에 해당하는 비트가 1로 되어 있는 것을 확인할 수 있습니다.


이름
버그
다크
드래곤
Electric
Fairy
Fighting
Fire
Flying
고스트
Grass
그라운드
Ice
Normal
Poison
Psychic

Steel
Water


Bulbasaur
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0

Ivysaur
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0

Venusaur
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0

VenusaurMega Venusaur
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0

Charmander
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0


라벨 인코딩



더미 인코딩은 0, 1의 비트로 표현하고 있습니다만, 라벨 인코딩은 정수로 표현합니다.


특징량 해싱



특징량 해싱과 지금까지의 변환의 차이점은 특징량 해싱은 변환 후 카테고리 수가 적다는 것입니다. 해시 함수라고 하는 마법의 함수를 이용하는 것으로, 입력된 특징수를 줄이는 이미지 해 주시면 문제 없습니다. 어떤 공부도 이미지로 기억하는 편이 머리에 들어가기 쉬우니까요.



코드를 살펴 보겠습니다. sklearn에는 FeatureHasher 모듈이 있으므로 이것을 사용합시다. 포켓몬의 타입을 특징량 해싱으로 5개로 짜 갑니다.

「이런 건 어떤 때에 쓰는 거야!」라고 생각할지도 모르겠네요. 일반적으로 카테고리 변수가 너무 많을 때 사용한다는 것을 기억하십시오.
fh = FeatureHasher(n_features=5, input_type='string')
hash_table = pd.DataFrame(fh.transform(df['Type 1']).todense())

변환 후의 특징량


0
1
2
3
4


2
0
0
0
-1

2
0
0
0
-1

2
0
0
0
-1

2
0
0
0
-1

1
-1
0
-1
1


사이고에게



이러한 방법은 어떤 시점에서 어떤 것을 선택하면 좋을까요? 하나의 대답으로서 분석용 계산기의 스펙에 따라 방법을 구분하는 것이 있습니다. 더미 인코딩이나 레이블 인코딩은 간단하지만 카테고리 변수가 너무 많으면 메모리 오류가 발생할 수 있습니다. 그 때는 특징량을 압축하는 특징량 해싱을 검토해도 좋을지도 모릅니다.

그러나 최근에는 높은 사양 계산기가 무료에서 사용할 수 있게 되었으며, Kaggle에서 많이 사용되고 있는 결정 트리 모델인 GBDT는 라벨 인코딩을 처리할 수 있습니다. 특징량 해싱의 차례는 거기까지 크지 않다고 생각됩니다.

좋은 웹페이지 즐겨찾기