[파이썬] 데이터 변형 | 원핫인코딩

2020. 4. 4. 14:08노트/Python : 프로그래밍

 

머신러닝을 하기 위해서 전처리 작업을 할때, 컴퓨터 알고리즘이 읽을 수 있는 범주형 데이터로 바꿔주는 작업이 필요하다. 이를 원핫인코딩이라고 한다. 

 

import seaborn as sns
tip=sns.load_dataset("tips")
tip.head()

원데이터를 확인해보면 'sex' colomn의 경우 Female과 Male로 되어있다. 이러면 알고리즘이 해당 데이터를 읽지 못한다. 그래서 숫자로 바꿔주어야 한다. 

 

# 원핫 인코딩 Female -> 0 , Male -> 1  
from sklearn.preprocessing import LabelEncoder

def genToInt(data):
    data['sex']=LabelEncoder().fit(['Female','Male']).transform(data['sex'])
    return data

원데이터를 복사해서 대입하는 습관을 들이자! 그래야 나중에 잘못되었을 때 엎어쳐서 다시 작업할 수 있다.

* 원본은 건드리지 말것 * 

tipsCopy=genToInt(tip)
tipsCopy.head()

'sex' column의 data가 0과 1로 변환된 것을 확인할 수 있다. 

 

 

여러가지 배열을 한꺼번에 원핫인코딩하는 예제를 확인해보자. 

# 원핫인코더 
from sklearn.preprocessing import OneHotEncoder

           #[성별,연령,학점]
data = np.array([[0,0,0],
                [0,1,1],
                [0,2,2],
                [1,0,3],
                [1,1,4]])
data

성별, 연령, 학점으로 이산화된 배열 데이터이다. 

ohe = OneHotEncoder()
ohe.fit(data)

ohe.transform(data).toarray()

>>>
array([[1., 0., 1., 0., 0., 1., 0., 0., 0., 0.],
       [1., 0., 0., 1., 0., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 1., 0., 0., 1., 0., 0.],
       [0., 1., 1., 0., 0., 0., 0., 0., 1., 0.],
       [0., 1., 0., 1., 0., 0., 0., 0., 0., 1.]])

OneHotEncoder 클래스로 데이터를 fitting 해주면 위과 같이 변환된다. 

 

ohe.active_features_
#[남,여,20,30,40,a,b,c,d,e]
>>>
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)

ohe.n_values_
#범주 갯수
>>>
array([2, 3, 5])

ohe.feature_indices_
# 성별 : 0이상 2미만, 
# 연령 : 2이상 5미만,
# 학점 : 5이상 10미만 
>>>
array([ 0,  2,  5, 10], dtype=int32)

위와 같이 원핫인코더 객체의 범주 특징을 확인할 수 있다. 

 

# 예시
data2=np.array([[1,2,3]]) # 여성, 40대, d학점
ohe.transform(data2).toarray()

>>>
array([[0., 1., 0., 0., 1., 0., 0., 0., 1., 0.]])

 

결론: 원핫인코딩은 알고리즘이 읽을 수 있는 0,1 데이터로 변환하는 것을 의미한다.

이를 위해서는 사전에 데이터가 이산화가 되어있어야 한다. 

 

이산화 과정 참고 

2020/04/14 - [스킬/Python : 프로그래밍] - [파이썬] 데이터변형 | 이항변수화 , 이산화