사이킷런은 자료형을 입력값으로 허용하지 않음
따라서, 숫자형으로 다 변환을 해줘야함 -> 인코딩 진행
카테고리 피처를 코드형 숫자 값으로 변환
LabelEncoder 클래스로 구현
from sklearn.preprocessing import LabelEncoder
items=['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '믹서', '믹서']
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print(labels)
[0 1 4 5 3 2 2]
print(encoder.classes_)
['TV' '냉장고' '믹서' '선풍기' '전자레인지' '컴퓨터']
classes_ 속성값으로 확인
print(encoder.inverse_transform([4,5,2,0,1,3]))
['전자레인지' '컴퓨터' '믹서' 'TV' '냉장고' '선풍기']
inverse_transtorm() 으로 인코딩 된 값을 다시 디코딩 할 수 있음
‼️ 다만, 예측 성능이 떨어지는 경우가 있음
숫자 값의 경우 크고 작음의 특성이 작용해서 냉장고: 1, 믹서기: 2일 경우 믹서기가 특징이 있어서 2(더 큰 값)이 된것이 아닌데 더 중요하게 인식될 수도 있음
피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시, 나머지 칼럼에는 0 표시

입력값으로 2차원 데이터가 필요
OneHotEncoder를 이용해 변환한 값이 희소 행렬 형태이므로 다시 toarray() 메서드를 이용해 밀집 행렬로 변환
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items = ['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '믹서', '믹서']
#Step1: 모든 문자를 숫자형으로 변환합니다.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
#Step2: 2차원 데이터로 변환합니다.
labels = labels.reshape(-1, 1) #2차원 데이터
#Step3: One-Hot Encoding 적용합니다.
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print(oh_labels.toarray()) #밀집 행렬로 변환
print(oh_labels.shape)
[[1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0. 0.]
[0. 0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0. 0.]]
(7, 6)
import pandas as pd
items = ['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '믹서', '믹서']
df = pd.DataFrame({'item':items})
print(pd.get_dummies(df))
get_dummies() 를 이용해서 원-핫 인코딩을 더 쉽게 하는 api
문자열값을 숫자형으로 변환할 필요 없이 바로 변환할 수 있음
평균이 0, 분산이 1인 가우시안 정규 분포를 가진 값으로 변환

개발 데이터의 크기를 모두 똑같은 단위로 변경
모두 최소0~최대1의 값들로 변경해주는 것

사이킷런 전처리에서 제공하는 Normalizer모듈과 일반적인 정규화는 차이가 있음
그냥 통칭해서 생각해도 무방
표준화를 쉽게 지원하기 위한 클래스
개별 피처를 평균이 0, 분산이 1인 값으로 변환
SVM , Linear Regression, Logistic Regression데이터가 가우시안 분포를 갖고 있다고 가정하고 구현됨
따라서 사전에 표준화를 적용하는 것은 예측 성능 향상에 중요한 요소