본문 바로가기

Python-머신러닝

Nan 처리, 문자열 처리(레이블/원핫 인코딩): LabelEncoder,OneHotEncoder, ColumnTransformer

반응형
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('data/Data.csv')

 

ㄴ 이 데이터로 내가 뭘 할건데?

ㄴ 위 데이터로 우리 쇼핑몰에서 물건을 살 것 같냐, 못살것 같냐라는 구매여부 인공지능을 만들면 될 것 같다. 

 

Nan 처리

ㄴ 학습을 시킬 때, 바로 Nan이 있으면 바로 에러가 나온다.

ㄴ 문제를 확인하면, NaN 있는지 확인해야한다.

ㄴ 우선적으로 Nan을 처리해야한다.  

처리방법은: 삭제하거나, 다른 것으로 채우거나.

 

X, Y 데이터 분리: 즉 학습할 변수와 레이블링 변수로 분리

내가 예측하려고 하는 컬럼은 Purchased 컬럼, 그럼 이걸 y, 

나머지는 x인데, 그리고, 필요없는 컬럼은 제외한다.

 

X = df.loc[ : , 'Country':'Salary' ]
y = df['Purchased']

1차원이라서 소문자로 쓴다. y 

 

문자열 처리

ㄴ 컴퓨터는 숫자로 처리한다.

ㄴ 문자열 같은 경우, 컴퓨터는 못 읽는다. 숫자가 아닌 데이터 중에서, 카테고리로 판단되는 데이터는, 고로 숫자로 바꿔줘야한다.  

ㄴ 먼저 몇개인지 파악 필요

 

 

- 먼저, 해당 컬럼이 카테고리컬(분류를 할 수 있는) 데이터인지 확인한다.

- 카테고리컬 데이터이면, 데이터를 먼저 정렬한다.

 

 

- 정렬한 후의 문자열을, 앞에서부터 0으로 숫자를 하나씩 매겨준다.

 France: 0

 Germany: 1

 Spain :2

 위처럼 설정하는 건 어떨까

 

문자열 처리1: Lable Encoding (레이블 인코딩) 

ㄴ 카테고리컬 데이터도 사람들이 학습을 시켜봤더니, 레이블 인코딩이 3개 이상이면, 학습이 잘 안된다. 

ㄴ 2개까진 잘됨

카테고리컬 데이터가 2개일 때는 레이블 인코딩으로 한다.

 


from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.compose import ColumnTransformer

ㄴ preprocessing 전처리: 학습시키기 전에 처리함.

 

레이블 인코딩 하는 방법

1. 변수 먼저 만들기 = 메모리에 만들기

2. 변환 시킴, 그러면 대체되어 저장이 된다. 

 ex)

encoder = LabelEncoder()
X['Country']== encoder.fit_transform(X['Country'])

 

ex)

encoder_y = LabelEncoder()
y = encoder_y.fit_transform(y)

ㄴ fit: 유니크한 것부터 찾아라

 

 

문자열 처리2: OneHot Encoding (원핫 인코딩) 

France Germany Spain
1 0 0
0 0 1
0 1 0
0 0 1
1 0 0

…등등…

 

- 위 같은 처리방법이 원핫 인코딩이라고 함.

- 첫번째 데이터에 핫이 하나 들어있다. 두번째~다섯번째도, 오직 0과 1로 처리한다. 

 

- 사람들은 카테고리컬 데이터가 3개 이상일 때는, 레이블 인코딩으로 학습시키면, 학습이 잘 되지 않는 다는 것을 알아냈다.

 

- 따라서, 3개 이상의 카테고리컬 데이터는, 

- One-Hot Encoding(원 핫 인코딩)을 이용해야, 성능이 좋아진다.

 

원핫 인코딩 하는 방법:

ct = ColumnTransformer([('encoder',OneHotEncoder(),[0])],
                       remainder= 'passthrough')

ㄴ 첫번째 파라미터는 리스트, 두번째는 remainder = 

 

- [0] 이라고 쓴 이유는?

ㄴ X에서 원핫인코딩할 컬럼이 컴퓨터가 매기는 인덱스로 0이기 떄문에 

ㄴ 즉, 원핫 인코딩할 컬럼의 인덱스를 써주면, 변환시켜준다. 

 

- 만약 원핫 인코딩할 컬럼이 2개면, 해당 컬럼의 인덱스를 리스트안에 [0,2] 이런식으로 적어주면 된다.

- 결과는, 원핫 인코딩한 컬럼이 행렬의 맨 왼쪽에 나온다. 

 

 

- CPU가 X를 인코더, 원핫인코더하고, 대괄호 0, 내가 준 행렬의 첫번째 컬럼만 원핫인코딩 해달라는 뜻

- remainder='passsthrough'는 나머지 컬럼은 그냥 원래있는 값 그대로 통과시켜라 라는 뜻

- 먼저 고유의 값을 찾아낸다음, 그만큼의 컬럼 수로 늘어난다 (3개로 늘어난다.)

 

- [1.0e+00, 0.0e+00, 0.0e+00, 4.4e+01, 7.2e+04],

ㄴ 1.0e+00 -> 1이라는 뜻

ㄴ 머신러닝은 플롯으로 처리한다.

ㄴ 뒤에는 건들지 말라고 했으니, 뒤의 컬럼의 값은 그대로 놔둔다.

 

Feature Scaling

(자세한 설명은 ‘노멀라이징/Feature Scaling’글 참고)

 

- 피쳐 스케일링도, X 따로 ,y 따로 한다.

- StandardScaler(), MinMaxScaler() 둘 다 사용하면 안된다. 

ㄴ 둘 중에 하나를 사용하라, 성능은 크게 차이가 없다.

 

m_scaler = MinMaxScaler()
X = m_scaler.fit_transform(X)
X

 

 

- y도 피쳐스케일링을 해야하는데, 

이미, 0과 1로만 데이터가 구성되어 있으면, 피처스케일링을 할 필요가 없다. 

ㄴ 따라서 y는 그냥 냅두면 된다. 

 

반응형