Data Science/Machine Running

[ML] OrdinalEncoder, LabelEncoder,OneHotEncoder의 차이

눈곱만큼도모름 2023. 6. 24. 22:42
728x90
반응형

ㅇ OrdinalEncoder와 labelEncoder의 해당 colums의 값을 sklearn에서 계산 가능한 숫자로 치환

ㅇ OneHotEncoder의 경우 새로운 column의 경우 해당 column의 값이

  A, B, C로 구성되어 있을 경우 3개의 column을 새로 만들어 해당 값에 bool값을 배당.

아래 성별의 column이 2번~3번째 열로 구성되어 추가된다.(기존열을 drop 해줄 필요가 있다.)

성별 성별_남 성별_여
1 0
0 1
0 1

 

o  OrdinalEncoder와 labelEncoder는 별 차이 없어 보이지만 크게 2가지 특징을 가지고 있다.

 

- OrdinalEncoder - 2D 배열 형태의 범주형 변수를 인코딩.(특정 순수가 있으면 순서대로)

- labelEncoder     -1D 배열 형태의 범주형 변수를 인코딩. (순서에 상관없이)

 

 labelEncoder의 경우 등장한 순서대로 번호가 지정되는 반면,

 OrdinalEncoder의 경우 값의 특징을 살피고 순서대로 번호가 정해진다.

가령 column에 [C, V, D]의 값이 있다면 [1,3,2]의 순서로 값이 주어진다.

 

배열에 관해서 이야기해보자면

1D 배열의 경우 1D처럼 보이지만

DataFrame으로 만들어 1D-arrary의 데이터 값만 가진 경우 실질적으로는 DataFrame 때문에

2D-arrary의 값을 가질 수 있기에  Error를 볼 수 있다.

DataFrame와 pandas Seies로 만든 data를 적용해 가면서 테스트할 것을 권한다.

 

 

 

OrdinalEncoder

from sklearn.preprocessing import OrdinalEncoder

ordinal_encoder=OrdinalEncoder()
data1_o=ordinal_encoder.fit_transform(data)

df_encoded = pd.DataFrame(data=data1_o, index=index, columns=columns)

---------------------

OrdinalEncoder: 2D 배열 형태의 범주형 변수를 인코딩.(특정 순수가 있으면 순서대로)
LabelEncoder: 1D 배열 형태의 범주형 변수를 인코딩. (순서에 상관없이)

data_1 = np.array([['A','F','C'], ['D','C','B'], ['B','B','B']])
index = ['1', '2', '3']
columns = ['c1', 'c2', 'c3']

data=pd.DataFrame(data=data_1, index=index, columns=columns)


ordinal_encoder=OrdinalEncoder()
data1_o=ordinal_encoder.fit_transform(data)

>>>>
data1_o

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

행 별로 작동해서 각 컬럼에 같은 b가 있더라도 값이 달라질 수 있음.
OrdinalEncoder를 라이브러리 없이 직접 지정한 예

order = {"male" : 0, "female" : 1}
data4.c1=data4.c1.map(order)

--------------
data_4 = np.array([['male','male','male'], ['female','female','female'], ['female','male','female']])
index = ['1', '2', '3']
columns = ['c1', 'c2', 'c3']

data4=pd.DataFrame(data=data_4, index=index, columns=columns)

order = {"male" : 0, "female" : 1}
data4.c1=data4.c1.map(order)

 

labelEncoder 

from sklearn.preprocessing import LabelEncoder

le=LabelEncoder()
data1_le=le.fit_transform(se)

df_encoded = pd.DataFrame(data=data1_le, index=index, columns=columns)

라벨을 직접지정하고자 할때는 이 박스의 맨 아래 코드 참조
-----------------

OrdinalEncoder: 2D 배열 형태의 범주형 변수를 인코딩.(특정 순수가 있으면 순서대로)
LabelEncoder: 1D 배열 형태의 범주형 변수를 인코딩. (순서에 상관없이)

data1 = ["A", "B", "c", "D", "E"]
se = pd.Series(data1)
se.index =['a','b','c','d','e']
se.index.name = "NO."
se.name = "alphabet"

se=pd.DataFrame(data=data1)

le=LabelEncoder()
data1_le=le.fit_transform(se)

df_encoded = pd.DataFrame(data=data1_le, index=index, columns=columns)

----------------
le = LabelEncoder()
input_classes =['versicolor','virginica']
le.fit(input_classes)
y_le = le.transform(y)

 

OneHotEncoder

from sklearn.preprocessing import OneHotEncoder

encoder_oh = OneHotEncoder()
data_encoded = encoder_oh.fit_transform(data)

data_encoded_df = pd.DataFrame(data_encoded.toarray(), index=index, columns=encoder.get_feature_names(columns))
파이썬 라이브러리 import 없이 하는 one_hot_encording


a = pd.get_dummies(data4[['c3']], prefix=['dum_'])
data = data4.join(a)
data.drop('c3',axis=1)

-------------------
data_4 = np.array([['male','male','male'], ['female','female','female'], ['female','male','female']])
index = ['1', '2', '3']
columns = ['c1', 'c2', 'c3']

data4=pd.DataFrame(data=data_4, index=index, columns=columns)

a = pd.get_dummies(data4[['c3']], prefix=['dum_'])
data = data4.join(a)

data.drop('c3',axis=1)

 

 

728x90
반응형

'Data Science > Machine Running' 카테고리의 다른 글

[ML] Cross Entropy  (1) 2023.12.18
[ML] Model evaluation metrics  (0) 2023.07.19
[ML] A comparison between Scalers  (0) 2023.07.12