AI기초
[데이터 전처리]데이터 인코딩(레이블 /원핫 인코딩 )
AI독학
2024. 1. 7. 01:30
AI에서 문자형 데이터를 피처의 형대로 넣기 위해서는 인코딩이 필요하다.
그중 대표적인 인코딩 방식은 레이블 인코딩과 원-핫 인코딩이 있다.
1. 레이블 인코딩
레이블 인코딩은 카테고리 피처를 코드형 숫자 값으로 변환한다.
1
2
3
4
5
6
7
8
|
from sklearn.preprocessing import LabelEncoder
items = ['두부', '버섯','닭가슴살','우둔살','콩','현미','율무','견과류']
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print(labels)
|
cs |
결과물
[2 3 1 4 6 7 5 0]
가나다라순으로 정렬되어 인코딩 배정이 되었다.
1
2
|
print(encoder.classes_)
print(encoder.inverse_transform([1,3]))
|
cs |
결과물
['견과류' '닭가슴살' '두부' '버섯' '우둔살' '율무' '콩' '현미']
['닭가슴살' '버섯']
encoder.classes_를 사용 하면, 0부터 인코딩 클래스를 확인할 수 있다.
원래 문자 값을 확인 하고 싶을 때는 다음과 같이 encoder.inverse_transform([1,3])을 활용하면
입력한 번호의 원래 문자형으로 원복을 한다.
2. 원-핫 인코딩(One-Hot Encoding)
원-핫 인코딩은 피처 값의 종류가 증가 할때 마다. 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식이다. input shape의 컬럼 값이 늘어나는 것이다.
원핫인코딩을 하기 위해서는 레이블인코딩과 달리 가로세로가 길어진다. 2차원으로 만들어야 한다.
데이터를 2차원으로 만들어 주고 원핫 인코딩을 적용시키면 된다.
1
2
3
4
5
6
7
8
9
10
11
|
#2차원형식으로 필요하여, array형태로 변경
test = np.array(items)
#data 2차원으로 변경
test=test.reshape(-1,1)
print(test)
print()
o_encoder = OneHotEncoder()
o_encoder.fit(test)
o_labels = o_encoder.transform(test)
print(o_labels.toarray())
print(o_labels.shape)
|
cs |
결과물
[['두부']
['버섯']
['닭가슴살']
['우둔살']
['콩']
['현미']
['율무']
['견과류']]
[[0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0.]]
(8, 8)
데이터 테이블 형태로 만들어 매칭 해보겠다.
1
2
3
|
import pandas as pd
label_df = pd.DataFrame(data = o_labels.toarray(), columns = items)
display(label_df)
|
cs |
다음과 같이 데이터 프레임 형태로 만들어도 되지만, 판다스에 get_dummies()를 이용하는 방법도 있다.
1
2
3
4
|
import pandas as pd
label_df_new = pd.DataFrame(items, columns = ['item'])
display(label_df_new)
pd.get_dummies(label_df_new)
|
cs |
다음과 같이 결과가 나온다.
순서의 연관성이 있는 문자형은 레이블 인코딩이 괜찮고, 문자간의 연속성과 상관이 없다면 원 핫이 나을 것이다.