728x90
반응형
One-Hot Encoding 과 Label Encoding 비교



One-Hot Encoding
- 숫자의 차이가 모델에 영향을 미치는 선형 계열 모델(로지스틱회귀, SVM, 신경망)에서 범주형 데이터 변환시 라벨 인코딩 보다 원핫 인코딩을 사용한다.
- 두 가지 방법
1) Pandas get_dummies 방법
- pd.get_dummies(df, columns = [ '컬럼명1','컬럼명2'])
문자열 컬럼은 삭제되고, 인코딩된 컬럼이 끝에 대체되어 붙는다.


- get_dummies() 의 경우, 문자열 데이터는 자동으로 전부다 인코딩이 이루어 진다. 숫자형으로 되어 있는 범주형을 인코딩하려면(ex married 0,1) 따로 지정을 해줘야 한다.
- get_dummies 함수는 우리가 원하는 범주를 제외시켜주는 기능이 없습니다. 따라서 우리가 원하는 범주를 제외하기 위해서는 함수를 따로 만들어 줘야 합니다. 꽁냥님이 만들어 주는 함수
def get_dummy(df,columns,base_value=None):
'''
df : 데이터프레임
columns : 가변수로 변환할 칼럼들
base_value : {가변수로 변환할 칼럼명 : 제외시킬 범주}
'''
for c in columns:
num_level = len(set(df[c])) ## 유니크한 원소의 개수
uniq_element = sorted(list(set(df[c])))[1:] ## 정렬했을 때 첫 번째 범주를 제외
if base_value: ## 제외시킬 범주가 있을 경우 해당 범주를 제외
if c in base_value.keys():
assert base_value[c] in list(set(df[c])), f'{base_value[c]} is not contained in {c}'
uniq_element = sorted(list(set(df[c])-{base_value[c]}))
data = dict()
for i in range(num_level-1):
dummy_data = []
val = uniq_element[i]
for d in df[c]: ## 해당 범주인 경우만 1 나머지는 0
if d == val:
dummy_data.append(1)
else:
dummy_data.append(0)
col_name = c+'_'+str(val) ## 갸변수의 칼럼명 지정
data[col_name] = dummy_data
temp_df = pd.DataFrame(data)
df = pd.concat([df,temp_df],axis=1) ## 가변수 칼럼을 원 데이터 뒤에 결합
return df.drop(columns=columns) ## 원 범주 칼럼은 제외
https://zephyrus1111.tistory.com/91
- 숫자 값을 가지는 범주형 데이터일 경우
2) sklearn 원핫인코딩 방법
Label Encoding
- 컬럼수가 늘어나지 않고 그대로 있음
- 0,1,2,3,4 숫자로 레이블이 달려서 인코딩 됨
- tree 계열의 모델에서 사용하면 좋음
- 선형 모델에서는 사용하면 안 좋음
| 모델별 인코딩 방법
| Decision tree 모델에서 더미와 원 핫 인 코딩이 안 좋은 이유, 바이너리를 사용해야 하는 이유
Binary encoding, Nominal encoding, Ordinal encoding 설명
https://wyatt37.tistory.com/11
| 기본적인 get_dummies() 형태와 어느 VALUE 값 까지를 원핫인코딩으로 할 건지
https://zephyrus1111.tistory.com/91
| 원핫인코딩과 더미 차이 >>K-1 설명 (K는 열 안에 있는 값의 종류)
원-핫 인코딩 에는 약간의 중복성이 있습니다. Sex One-Hot 인코딩에서 사람은 남성 또는 여성입니다. 따라서 이 두 개의 더미 코딩 된 변수 중 하나만 예측 자로 사용하면됩니다. 더 일반적으로 필요한 더미 코딩 된 변수의 수는 가능한 값의 수인 K-1. 통계에서는 이를 더미 인코딩 변수 또는 더미 변수 라고 합니다 .
따라서 DataFrame에서 실제 더미 인코딩을 생성하려면 다음을 전달해야합니다. drop_first=True
pd.get_dummies(df.Sex, drop_first=True)
728x90
반응형
'Machine Learning & Data Analytics' 카테고리의 다른 글
predict_proba & predict in sklearn LogisticRegression (0) | 2022.04.02 |
---|---|
github 데이터 파일 jupyter notebook으로 불러오기 (0) | 2022.03.27 |
What is data mining(데이터 마이닝)? (0) | 2022.02.18 |
[Jupiter Notebook] 기본적으로 자주 사용되는 마크다운 사용법 (0) | 2022.02.18 |
Data encoding (2. One-hot Encoding) (0) | 2022.02.17 |