데이터 전처리 (Preprocessing)
머신러닝은 데이터의 영향을 받는다.
쓰레기 값이 들어가면 쓰레기 같은 결과가 나온다.
- 데이터 클린징
- 결손값 처리 (Null/NaN 처리) : 결손값이 없어야 한다.
- 데이터 인코딩 (레이블, 원핫인코딩) : 머신러닝 알고리즘은 숫자형 값만 받아드린다.
- 데이터 스케일링 : 정규화, 표준화 등 ex) 신장,몸무게 맞춰줄 때
- 이상치 제거 : 택도 없는 값 제거해주는 것
- Feature 선택, 추출 및 가공 : 어떤 Feature들만 선택하면 훨씬 예측 성능이 좋을 수 있다.
1. 레이블 인코딩(Label encoding)
문자열로 들어간 코드 값을 숫자형으로 매핑하는 것
상품 분류가 [TV, 냉장고, 전자렌지] 이렇게 되어있을 때, [0,1,2] 이런식으로 바꿔준다.
from sklearn.preprocessing import LabelEncoder
items=['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서']
# LabelEncoder를 객체로 생성한 후 , fit( ) 과 transform( ) 으로 label 인코딩 수행.
encoder = LabelEncoder()
encoder.fit(items) # fit : transform 수행전에 와꾸를 맞춤
labels = encoder.transform(items) # transform : 실제로 값을 변환한다.
print('인코딩 변환값:',labels)
>>
인코딩 변환값: [0 1 4 5 3 3 2 2]
print('인코딩 클래스:',encoder.classes_) # 0:TV, 1:냉장고
>>
인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자렌지' '컴퓨터']
print('디코딩 원본 값:',encoder.inverse_transform([4, 5, 2, 0, 1, 1, 3, 3]))
>>
디코딩 원본 값: ['전자렌지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']
그러나 의도하지 않았는데 크고 작은 관계성이 생기면서, 알고리즘이 원치 않은 방향으로 갈 수가 있다.
냉장고가 1인데 전자렌지가 4가 되면서 뭔가 이상해질 수 있다.
그래서 나온게 원핫 인코딩이다.
2. 원핫 인코딩(One-Hot encoding)
값들에 대해서 새로운 차원, 새로운 피쳐를 추가한다.
차원이 증가된다.
다만 사이킷런의 원핫인코더는 살짝 번잡하다.
왜냐면 숫자값 변환을 스스로 못하기 때문에 레이블인코더로 숫자값으로 먼저 변환해야 한다.
그 후, 레이블인코더로 나온 값을, 2차원 데이터로 변환을 해야 한다.
그 다음에 원핫인코더를 적용한다.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items=['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서']
# 먼저 숫자값으로 변환을 위해 LabelEncoder로 변환합니다.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items) # label은 1차원이다.
# 2차원 데이터로 변환합니다.
labels = labels.reshape(-1,1)
# 원-핫 인코딩을 적용합니다.
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)
원-핫 인코딩은 피쳐 값의 유형에 따라 새로운 피쳐를 추가해, 고유 값에 해당하는 컬럼에만 1을 표시하고, 나머지 컬럼에는 0을 표시하는 방식이다.
T = 0, 냉장고 = 1, 전자렌지 = 4, 컴퓨터 = 5, 선풍기 = 3, 믹서 = 2
를 원핫 인코딩하면 다음과 같은 결과가 나온다.
2.1. OneHotEncoder() 쓰는 순서
- 숫자 값으로 변환 : LabelEncoder()
- .fit()
- .transform()
- 2차원 데이터로 변환 : .reshape(-1,1)
- 원핫 인코딩 적용 : OneHotEncoder()
- .fit()
- .transform()
3. get_dummies()
판다스에서 쉽게 원핫인코딩을 할 수 있는 방법이 있다.
그게 바로 get_dummies 이다.
import pandas as pd
df = pd.DataFrame({'item':['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서'] })
df # 고유값이 만들어진다.
이렇게 각각의 고유값에 대한 컬럼이 있다.
총 6개의 고유값이 있다.
pd.get_dummies(df) # 각 고유값 별로 컬럼이 추가가 된다
이렇게 원핫인코딩을 할 수 있다.
'💡 AI > ML' 카테고리의 다른 글
ML - 타이타닉 생존자 예측 (0) | 2021.09.15 |
---|---|
ML - 정규화 (0) | 2021.09.15 |
ML - 교차 검증 (0) | 2021.08.26 |
ML - 예측 프로세스 (0) | 2021.08.25 |
ML - pandas 기본 (0) | 2021.08.24 |