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 데이터프레임으로 변환


실습으로 배우기

데이터 정보

  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] 으로 표현한다면 벡터의 크기를 조금이지만 줄일 수 있습니다.


다중 공선성(Multicollinearity) 해결


# 다중 공선성 문제 해결하기
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


개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다 :)

댓글남기기