출처: 「머신 러닝 교과서: 파이토치 편」 4.2절 (https://www.gilbut.co.kr/book/view?bookcode=BN003929 )
, 방송대 데이터과학개론 강의 1강
범주형 데이터
범주형 데이터는 순서가 있는 데이터와 없는 데이터로 나뉜다. (순서형, 명목형)
- 순서형 데이터 : 정교한 계량화는 어려우나 순서를 지정할 수 있는 데이터
* 예시: 학력 데이터, 리커트 척도, 옷의 사이즈
* 인접 범주 간의 크기 비교가 정확한 간격으로 이루어질 수는 없음
- 명목형 데이터 : 순서 없이 특성을 지닌 데이터
* 예시: 우편번호, 성별, 인종, 교과목 코드 등
순서형 데이터 : 순서가 있는 특성 매핑 함수
방법1
순서를 바꿔주는 매핑함수를 만들어야 한다.
예를 들어 옷 사이즈의 경우 M, L, XL이 있다고 한다면
size_mapping = {
'XL':3,
'L':2,
'M':1
}
df['size'] = df['size'].map(size_mapping)
이렇게 한다면 size열에 XL, L 이렇게 문자열로 되어있는 값들이 매핑이 되어 숫자로 바뀐다.
정수 값을 다시 문자열로 바꾸고 싶다면 거꾸로 매핑하는 딕셔너리를 정의한 후 map 함수를 이용하면 된다.
inv_size_mapping = {v: k for k, v in size_mapping.items()} # comprehension
df['size'].map(inv_size_mapping)
방법2
M, L, XL 값을 가진 클래스를 두 개의 새로운 특성 'x>M' 과 'x>L' 로 나눌 수 있다.
값은 0과 1로 이루어서 아닐경우 0, 맞을 경우 1로 값을 나타낼 수 있다.
클래스(명목형) 레이블 인코딩 : 원-핫 인코딩
많은 ML 라이브러리는 클래스 레이블이 정수로 인코딩되어서 전달되길 원한다.
클래스 레이블은 순서가 없다. 특정 문자열 레이블에 할당한 정수는 아무런 의미가 없다.
LabelEncoder 클래스를 사용하면 편리하다.
fit_transform 메서드는 fit 메서드 + transform 메서드이다.
from sklearn.preprocessing import LabelEncoder
class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
print(y)
# array([1, 0, 1])
# 정수 클래스 레이블을 문자열로 되돌리기: inverse_transform
class_le.inverse_transform(y)
# array(['class2', 'class1', 'class2'], dtype=object)
LabelEncoder 대신 OrdinalEncoder과 ColumnTransformer를 이용하면 여러 개의 열을 한번에 정수로 변환할 수 있다.
=> 예제 165p
LabelEncoder 클래스를 이용해서 숫자로 바꾼다면 명목형은 순서가 없는 데이터임에도 불구하고 분류 모델은 숫자가 큰 것을 크다고 가정할 것이다.
이 문제를 해결하기 위한 방법으론 원-핫 인코딩이 통상적이다.
from sklearn.preprocessing import OneHotEncoder
...
원-핫 인코딩으로 더미 변수를 만드는 편리한 방법으론 판다쓰 get_dummies를 사용하는 것이다.
DataFrame에 적용하면 문자열 열만 변환하고 나머지 열은 변환하지 않는다.
columns 매개변수를 사용해 변환하는 특성을 지정해줄 수도 있다.
pd.get_dummies(df)
pd.get_dummies(df, columns=['size'])
pd.get_dummies(df, drop_first=True) # 첫번째 열 삭제
원-핫 인코딩된 데이터셋을 사용할 때는 다중 공선성 문제를 주의해야 한다.
변수 간의 상관관계를 감소하려면 원-핫 인코딩된 배열 중에서 특성 열 하나를 삭제하면 된다.
하나의 열을 삭제하더라도 다른 값들이 다 0이면 삭제한 열이 1이였던 것을 알 수 있다.
명목형 데이터를 인코딩하는 다른 방법: 이진 인코딩, 빈도 인코딩
=> 인코딩 방식을 추가적인 하이퍼파라미터로 고려할 수 있음
'책' 카테고리의 다른 글
코어 자바스크립트 (0) | 2022.09.01 |
---|---|
비전공자를 위한 이해할 수 있는 IT 지식 (0) | 2022.06.05 |