ㅇ 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)
'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 |