티스토리 뷰
모델은 문자 데이터를 인식하지 못하므로, 숫자 데이터로 바꿔주는 라벨링을 해야 한다.
레이블 인코딩
범주형 데이터를 숫자로 일대일 매핑해주는 인코딩 방식
https://www.kaggle.com/werooring/ch5-categorical-data-encoding
from sklearn.preprocessing import LabelEncoder # 레이블 인코더
fruits = ['사과', '블루베리', '바나나', '귤', '블루베리', '바나나', '바나나', '사과']
# 레이블 인코더 생성
label_encoder = LabelEncoder()
# 레이블 인코딩 적용
fruits_label_encoded = label_encoder.fit_transform(fruits)
print('레이블 인코딩 적용 후 데이터:', fruits_label_encoded)
레이블 인코딩 적용 후 데이터: [3 2 1 0 2 1 1 3]
레이블 인코딩은 간단하지만 단점이 있다.
명목형 데이터를 레이블 인코딩하면 모델 성능 하락.
머신러닝 모델이 서로 가까운 숫자를 비슷한 데이터라고 판단하기 때문
이 문제를 원-핫 인코딩으로 해결한다.
원-핫 인코딩
여러 값 중 하나만 활성화 하는 인코딩
1. 피처의 교유값 개수를 구한다.
2. 피처의 고유값 개수만큼 열을 추가
3. 각 고유값에 해당하는 열에 1을 포시하고 나머지 열에는 0을 표시
한마디로 각 고유값이 1이고, 나머지는 0인 열들을 가로로 이어붙인다.
그러나 원-핫 인코딩도 열 개수가 지나치게 많아진다는 단점이 있어 모델 훈련속도가 느려질 수 있다.
따라서 고윳값이 상당히 많다면
1. 비슷한 고윳값끼리 그룹화
2. 빈도가 낮은 고윳값을 기타(etc)로 처리하기
3. 다른 인코딩 적용하기 - 타깃 인코딩, 프리퀀시 인코딩 등
고윳값 개수가 많아도 데이터 크기가 그렇게 크지 않다면 그냥 원-핫 적용
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
fruits = ['사과', '블루베리', '바나나', '귤', '블루베리', '바나나', '바나나', '사과']
# 레이블 인코더, 원-핫 인코더 생성
label_encoder = LabelEncoder()
onehot_encoder = OneHotEncoder()
# 레이블 인코딩 적용(문자 데이터 -> 숫자 데이터) ①
fruits_label_encoded = label_encoder.fit_transform(fruits)
# 원-핫 인코딩 적용 ②
fruits_onehot_encoded = onehot_encoder.fit_transform(fruits_label_encoded.reshape(-1, 1))
print('원-핫 인코딩 적용 후 데이터:\n', fruits_onehot_encoded.toarray()) # ③
원-핫 인코딩 적용 후 데이터:
[[0. 0. 0. 1.]
[0. 0. 1. 0.]
[0. 1. 0. 0.]
[1. 0. 0. 0.]
[0. 0. 1. 0.]
[0. 1. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 0. 1.]]
레이블 인코딩 후에 원핫 인코딩 적용
reshape 메소드
배열 형상 바꿀 때 사용
fruits_label_encoded
array([3, 2, 1, 0, 2, 1, 1, 3])
fruits_label_encoded.reshape(4, 2)
array([[3, 2],
[1, 0],
[2, 1],
[1, 3]])
fruits_label_encoded.reshape(-1, 1)
array([[3],
[2],
[1],
[0],
[2],
[1],
[1],
[3]])
-1,1은 원본 데이터와 나머지 형상을 참고해서 최종 형상을 적절히 바꿔준다.
reshape (3,-1) 같은 걸 호출하면 오류가 난다. (왜냐하면 원본 데이터가 8개가 3으로 나눠지지 않기 때문)
reshape(-1,4)는 2,4 형상, reshape(4,-1)이면 4,2 형상
원 핫 인코딩의 코드는 CSR 행렬로 돌려준다.
.toarray()는 CSR 형태의 행렬을 일반 배열로 바꿔주는 역할
pandas의 get_dummies() 함수를 사용하면 숫자형으로 바꾸지 않고도 바로 원-핫 인코딩이 된다.
출저 : 머신러닝 문제해결 전략 / 골든래빗 저