본문 바로가기
Python/MachineLearning

Regression - Data Preprocessing (2) 문자열의 데이터처리( Label Encoding, One Hot Encoding)

by 하니__ 2024. 4. 13.

 

2024.04.12 - [MachineLearning] - Regression - Data Preprocessing (1) - Nan처리, X와y의 데이터 분류

 

3. 문자열을 데이터로 처리

 

 

 

위에서 봤듯이 국적과 구매여부의 문자열은 컴퓨터가 이해하기 어려워한다

 

그러니

 

컴퓨터가 이해하기 쉬운 숫자로 변환시켜줘야 한다

 

레이블 인코딩과 원 핫 인코딩

 

컴퓨터가 이해하기 어려운 문자열을

이해하기 쉬워하는 숫자로

변환시켜주면 되겠다 

 

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

 

임포트들을 먼저 해준뒤

그 중 레이블 인코딩은

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

 

'France' =>0
'Germany' =>1
'Spain' =>2

이렇게 해주면 데이터상의 국적이 3개이기때문에

0 1 2 로 나뉘게 된다 하지만

 

컴퓨터의 경우 3가지 숫자보다 2가지 숫자쪽이 좀더 이해가 쉽고 오류가 덜 나기때문에

 

다른 방법을 사용하기로 한다

 

그 전에

 

 

sorted(y.unique())
y = encoder.fit_transform(y)
y
array([0, 1, 0, 0, 1, 1, 0, 1])

 

 

구매 여부는

0,1 로 두개로 나뉠수 있기 때문에 해주도록 하자

 

여기서

encoder는 scikit learn의 labelencoder를 변수로 만든것이고

 

fit_transform(  )의

 

fit은 데이터에 맞추다 즉 훈련, 학습의 의미가 되겠다

이어 transform은 변환시키는것

(   )파라미터는 그 안에 집어넣은 것을 실행하라는 의미가 되겠다

 

 

즉,

레이블 인코더를 통하여 

데이터를 입력 받은것을

변환시키고 그것을 학습하는 것이라고 볼 수 있겠다

 

One Hot Encoding

 

원 핫 인코딩은

 

 

하나의 콜럼에서

 

중복된 데이터값의 갯수(nunique의 값 숫자) 만큼의 콜럼으로 늘어나며

 

맨 앞으로 오게된다

 

알파벳순으로 숫자가 정해지며

'France'   'Germany'   'Spain' 순서로

     0                0               1     스페인

     0                1               0     독일

     1                0               0    프랑스

 

이런 방식이다

 

 

ct = ColumnTransformer( [  ( 'encoder' , OneHotEncoder() , [0] )  ] , remainder= 'passthrough' )
 
X = ct.fit_transform(X)
 
X
 
array([[1.0e+00, 0.0e+00, 0.0e+00, 4.4e+01, 7.2e+04],
       [0.0e+00, 0.0e+00, 1.0e+00, 2.7e+01, 4.8e+04],
       [0.0e+00, 1.0e+00, 0.0e+00, 3.0e+01, 5.4e+04],
       [0.0e+00, 0.0e+00, 1.0e+00, 3.8e+01, 6.1e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 3.5e+01, 5.8e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 4.8e+01, 7.9e+04],
       [0.0e+00, 1.0e+00, 0.0e+00, 5.0e+01, 8.3e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 3.7e+01, 6.7e+04]])

 

 

 

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

 

에서 

 

remainder= 'passthrough'는

앞의 튜플에서 정의되지 않은 모든것들을 그냥 통과 시킨다는 의미

 

 

[0]이 들어간 이유는
X에 들어있는 원 핫 인코딩 하고 싶은 컬럼의 인덱스
예를 들어, 원핫인코딩 하고 싶은 컬럼이 첫번째, 세번째 컬럼이면 => [0,2]라고 적어주면 되겠다

 

 

 

Regression - Data Preprocessing (3) - StandardScaler(), MinMaxScaler(), train_test_split()

4. 데이터 표준화 - 피쳐스케일링 앞의 데이터를 무시하고도 나이의 최소값~최대값은 아무리 좋게 봐줘도 0~150을 넘길수가 없는 반면 연봉의 최소값~최대값의 크기는 데이터의 수치로만해도 40k~9

hani08.tistory.com