Recent Posts
Recent Comments
Link
Today
Total
12-30 00:21
관리 메뉴

Hippo's data

범주형 데이터 정제하기 - 범주형 인코딩(Categorical Encoding) 본문

ML(Machine Learning)

범주형 데이터 정제하기 - 범주형 인코딩(Categorical Encoding)

Hippo's data 2023. 12. 31. 21:49
728x90

오늘은 범주형 데이터를 정제하는 방법(범주형 인코딩)에 대해 알아보겠습니다!!!

 

범주형 데이터란 성별(남, 여) / 혈액형(A,B,O,AB형) 처럼 범주로 구분된 데이터를 의미하는데요 컴퓨터는 남자, 여자와 같은 범주값을 그대로 이해하지 못하므로 1, 0과 같은 수치형 데이터로 변경해줘야 합니다 

 

이렇듯 범주형 자료를 수치형자료로 변경하는 과정을 범주형인코딩(Categorical Encoding)이라고 하는데요

1.레이블인코딩 2. 원핫 인코딩 두가지 방법에 대해 알아보겠습니다

 

 

1. 레이블 인코딩(Lable Encoding)

범주 순서대로 각각 숫자를 부여하는 방식

 

서울 -> 0

광주 -> 1

대전 -> 2

부산 -> 3

 

# 단점)  의도하지 않은 순서값이 모델에 반영될 수 있음 -> 해결방안(원핫인코딩)

 

1) 판다스(pandas) 이용 

df['생성할 변수']  = pd.factorize(df['기준 변수'])[0]. reshape(-1, 1)

-> factorize는 결과로 tuple( , )을 반환하므로 arrary 형식로 변경 후 reshape하여 새로운 칼럼으로 만들어줘야함 

 

# reshape(-1, 1) -> -1 행은 알아서 추정해서 개수를 채우고 열은 1열로 반환해주라 

 

2) 사이킷런(sckit-learn) 이용 

사이킷런 패키지의 LablelEncoder 모듈을 이용하면 쉽게 라벨 인코딩을 할 수 있음

 

from sklearn.preprocessing import LabelEncoder 

-> 사이킷런의 LabelEncoder 모듈 불러오기 

 

le = LabelEncoder()

df['생성할 변수']  = le.fit_transform(df['기준 변수'])

 

# 레이블 인코딩이니까 Lable로 쓰면 오류납니다 / Label로 쓰세요

 

 2. 원핫 인코딩(OneHotEncoding)

한개 요소는 1 / 나머지는 0으로 만듦(한개만 True 나머지는 False)

-> 레이블 인코딩에서 의도하지 않은 순서값이 모델이 반영되는 단점 해결

 

               서울 광주 대전 부산 

서울변수    1     0      0       0

광주변수    0     1      0       0

대전변수    0     0      1       0

부산변수    0     0      0       1

 

1) 판다스(pandas) 이용 

 

판다스의 get_dummies 메소드 이용 

 

pd.get_dummies(df['기준 변수'])

-> 기준변수의 요소값 개수대로 변수가 생성됨 

 

df = pd.get_dummies(df, columns = ['기준 변수'])

-> 데이터 프레임에 원핫 인코딩된 칼럼을 바로 반영 

 

2) 사이킷런(sckit-learn) 이용 

 

from sklearn.preprocessing import OneHotEncoder

-> 사이킷런의 OneHotEncoder 모듈 불러오기 

 

oh = OneHotEncoder( )

encoder = oh.fit_transform(df['기준 변수'].values.reshape(-1,1)).toarray()

 

df1 = pd.DataFrame(encoder, 
                   columns=["새로운변수_" + str(oh.categories_[0][i]) for i in range(len(oh.categories_[0]))])

 

df = pd.concat([df, df1], axis = 1)

-> 사이킷런에서는 판다스 get_dummies 처럼 바로 데이터프레임에 반영하지 못하므로 따로 칼럼을 따로 만들어서 추가해줘야함 

 

 

 

 

728x90