[Python] Pandas를 활용해 원-핫 인코딩(One-Hot Encoding) 하기
Pandas에서 제공하는 pd.get_dummies() 함수로 원-핫 인코딩 하기
더미로 인코딩 하기
👉 기본 구조 : pd.get_dummies()
주요 파라미터
data
: array-like, Series, DataFrame- 인코딩 할 데이터
prefix
: str, (기본값 : ‘_’)- DataFrame 컬럼 이름을 추가할 문자열
- DataFrame에서
get_dummies
호출할 때, 컬럼 수와 동일한 길이의 list 전달 - 또는
prefix
는 컬럼명을 덥두사에 매핑하는 dictionary
prefix_sep
: str, (기본값 : ‘_’)- 접두사를 추가하는 경우, 사용할 구분 기호/구분자
- 또는
prefix
와 같이 목록이나 사전을 전달
dummy_na
: bool, (기본값 : False)- False NaN이 무시되는 경우 NaN을 나타내는 열 추가
- NaN에 대한 인코딩 값을 추가하고 싶을 때 사용
columns
: list-like, (기본값 None)- 인코딩할 DataFrame의 컬럼명
- 컬럼이 None 이면 object, string 또는 category dtype 이 있는 모든 컬럼이 변환됨
sparse
: bool, (기본값 : False)- 더미 인코딩된 컬럼이 지원되어야 하는지
SparseArray
(True) 또는 일반 Numpy 배열(False) 에 의해 지원되어야 하는지 여부
- 더미 인코딩된 컬럼이 지원되어야 하는지
drop_first
: bool, (기본값 : False)- 첫 번째 수준을 제거하여 k 범주 수준에서 k-1 더미를 가져올지 여부
dtype
: dtype, (기본 : np.unit8)- 새 열의 데이터 유형
- 단일 dtype만 허용
👉 Return : 데이터 프레임 형태로 dummy-coded data 를 반환합니다.
👉 Series.str.get_dummies
: series를 더미 코드로 변환
👉 from_dummies()
: 더미 코드를 categorical 데이터프레임으로 변환
실습으로 배우기
데이터 정보
- Dataset : Kaggle 타이타닉 - train.csv
- 👉 데이터 보러가기
Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
PassengerId | ||||||||||||
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S | |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th… | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | |
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. | 3101282 | 7.9250 | NaN | S |
4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S | |
5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
범주형을 수치형으로 바꾸기
# 여러 범주형 변수 중, 유일값(unique)이 적은 성별과 Embarked 컬럼만 원-핫 인코딩
pd.get_dummies(data=train[["Sex", "Embarked"]]
, columns=["Sex", "Embarked"]).head()
Sex_female | Sex_male | Embarked_C | Embarked_Q | Embarked_S | |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 | 0 |
2 | 1 | 0 | 0 | 0 | 1 |
3 | 1 | 0 | 0 | 0 | 1 |
4 | 0 | 1 | 0 | 0 | 1 |
결측치 경우 포함하기
# 각 컬럼에 대해 결측치 값도 인코딩 영역에 포함시켜줌
pd.get_dummies(data=train[["Sex", "Embarked"]]
, columns=["Sex", "Embarked"], dummy_na=True).head()
Sex_female | Sex_male | Sex_nan | Embarked_C | Embarked_Q | Embarked_S | Embarked_nan | |
---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
2 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
3 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
4 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
생성되는 컬럼 수 줄이기
get_dummies
로 원-핫 인코딩을 하면 unique(유일값) 크기만큼 컬럼이 생깁니다.- 만약, 과일이라는 컬럼에 사과, 바나나, 딸기 가 있다면 [1, 0, 0], [0, 1, 0], [0, 1, 1] 로 인코딩됩니다.
- 과일 컬럼에 대해 [1, 0], [0, 1], [0, 0] 으로 표현한다면 벡터의 크기를 조금이지만 줄일 수 있습니다.
# 다중 공선성 문제 해결하기
pd.get_dummies(data=train[["Sex", "Embarked"]]
, columns=["Embarked"], drop_first=True).head()
Sex_male | Embarked_Q | Embarked_S | |
---|---|---|---|
0 | 1 | 0 | 1 |
1 | 0 | 0 | 0 |
2 | 0 | 0 | 1 |
3 | 0 | 0 | 1 |
4 | 1 | 0 | 1 |
정리
pandas 의
get_dummies
메서드로 범주형 변수를 수치형 변수로 변경할 수 있습니다.
다중 공선성을 해결하기 위해drop_first=True
를 사용해 보았습니다.
범주형 변수를 수치형 변수로 변경할 때, 순서가 무의미한 데이터라면 원-핫 인코딩을 사용하는게 좋습니다.
원-핫 인코딩 방법으론 pandas의get_dummies
함수가 가장 좋은 방법이라고 생각합니다.
Reference
- [Pandas 공식문서] pandas.get_dummies
- [Wikidocs - 딥 러닝을 이용한 자연어 처리 입문] 08) 원-핫 인코딩(One-Hot Encoding)
- [Jone] 데이터 전처리 : 레이블 인코딩과 원핫 인코딩 -[티스토리 - Hongfluenza] 인코딩(Encoding)이란? : ASCII, URL, HTML, Base64, MS Script 인코딩
- [티스토리 by Data_Pistachio] Machine Learning - Label Encoding (라벨 인코딩)
개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다 :)
댓글남기기