개발학습일지

[AI] 머신러닝 문자열 데이터를 숫자로 바꾸는 방법_Label Encoding, One Hot Encoding 본문

AI/Machine Learning

[AI] 머신러닝 문자열 데이터를 숫자로 바꾸는 방법_Label Encoding, One Hot Encoding

처카푸 2024. 4. 12. 17:45

데이터를 확인하여,  숫자가 아닌 데이터 중에서 카테고리로 판단되는 데이터는 숫자로 바꿔줄 수 있다.

문자열 컬럼의 유니크 갯수를 확인한다
문자열의 갯수가 2개 이면 , 0과 1로만 바꿔도 되니까, 이때는 '레이블 인코딩'만 사용하면 된다
하지만, 문자열의 갯수가 3개 이상이면, '원 핫 인코딩'을 사용하여, 0과 1로 표현가능하도록 변경한다
* 컴퓨터에서는 0과 1이 가장 이상적인 숫자이다

 

기초데이터  : 원본 데이터를  X , y 값으로 분리한 상태

X                              
>>>                           
        Country	Age	    Salary	          
    0	France	44.0	72000.0	
    1	Spain	27.0	48000.0	
    2	Germany	30.0	54000.0	
    3	Spain	38.0	61000.0
    5	France	35.0	58000.0	
    7	France	48.0	79000.0	
    8	Germany	50.0	83000.0
    9	France	37.0	67000.0
y
>>>
    0     No
    1    Yes
    2     No
    3     No
    5    Yes
    7    Yes
    8     No
    9    Yes
    Name: Purchased, dtype: object

 

문자열 컬럼의 유니크 갯수 확인

- nunique() 와 unique() 를 사용해서 확인한다

- 유니크한 데이터를 sorted() 를 사용해 알파벳 순으로 확인한다

X['Country'].nunique()
# 3
sorted(X['Country'].unique()) # sorted() 를 사용해 알파벳 순으로 확인한다
# ['France', 'Germany', 'Spain']

 

레이블 인코딩, 원핫인코딩 사용하기 위한 임폴트

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

 

레이블 인코딩 label enxoding

- 숫자가 커지면 컴퓨터 학습이 어려워짐으로 유니크한 데이터 값이 2가지 경우일때만 사용한다

encoder = LabelEncoder()
y = encoder.fit_transform( y )
y
# array([0, 1, 0, 0, 1, 1, 0, 1])

 

원핫인코딩 one hot encoding

- ColumnTransformer( [ ( 'encoder', OneHotEncoder() , [*] ) ] , remainder= 'passthrough' ) 사용

- * 부분은 X에 들어있는 원핫인코딩 하고 싶은 컬럼의 인덱스를 작성

- 예를 들어서, 원핫인코딩 하고 싶은 컬럼이, 첫번쨰랑 세번째 컬럼이다  하면, [0,2] 작성하면 된다

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]])