데이터 전처리 (Preprocessing)

머신러닝은 데이터의 영향을 받는다.

쓰레기 값이 들어가면 쓰레기 같은 결과가 나온다.

 

  1. 데이터 클린징
  2. 결손값 처리 (Null/NaN 처리) : 결손값이 없어야 한다.
  3. 데이터 인코딩 (레이블, 원핫인코딩) : 머신러닝 알고리즘은 숫자형 값만 받아드린다.
  4. 데이터 스케일링 : 정규화, 표준화 등 ex) 신장,몸무게 맞춰줄 때
  5. 이상치 제거 : 택도 없는 값 제거해주는 것
  6. 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() 쓰는 순서

  1. 숫자 값으로 변환 : LabelEncoder()
    1. .fit()
    2. .transform()
  2. 2차원 데이터로 변환 : .reshape(-1,1)
  3. 원핫 인코딩 적용 : OneHotEncoder()
    1. .fit()
    2. .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
복사했습니다!